turn-order #17
@ -1,16 +1,22 @@
|
||||
--- @class StatsBehavior : Behavior
|
||||
--- @field hp integer
|
||||
--- @field mana integer
|
||||
--- @field initiative integer
|
||||
--- @field isInTurnOrder boolean
|
||||
local behavior = {}
|
||||
behavior.__index = behavior
|
||||
behavior.id = "stats"
|
||||
|
||||
--- @param hp? integer
|
||||
--- @param mana? integer
|
||||
function behavior.new(hp, mana)
|
||||
--- @param initiative? integer
|
||||
--- @param isInTurnOrder? boolean
|
||||
function behavior.new(hp, mana, initiative, isInTurnOrder)
|
||||
return setmetatable({
|
||||
hp = hp or 20,
|
||||
mana = mana or 10
|
||||
mana = mana or 10,
|
||||
initiative = initiative or 10,
|
||||
isInTurnOrder = isInTurnOrder or true
|
||||
}, behavior)
|
||||
end
|
||||
|
||||
|
||||
@ -16,8 +16,8 @@ character.__index = character
|
||||
--- @param spriteDir table
|
||||
--- @param position? Vec3
|
||||
--- @param size? Vec3
|
||||
--- @param level? integer
|
||||
local function spawn(name, spriteDir, position, size, level)
|
||||
--- @param initiative? integer
|
||||
local function spawn(name, spriteDir, position, size, initiative)
|
||||
local char = {}
|
||||
|
||||
char = setmetatable(char, character)
|
||||
@ -28,7 +28,7 @@ local function spawn(name, spriteDir, position, size, level)
|
||||
|
||||
char:addBehavior {
|
||||
Tree.behaviors.residentsleeper.new(),
|
||||
Tree.behaviors.stats.new(),
|
||||
Tree.behaviors.stats.new(nil, nil, initiative),
|
||||
Tree.behaviors.map.new(position, size),
|
||||
Tree.behaviors.sprite.new(spriteDir),
|
||||
Tree.behaviors.spellcaster.new()
|
||||
|
||||
@ -25,15 +25,18 @@ function selector:update(dt)
|
||||
local selectedId = Tree.level.characterGrid:get(Vec3 { mousePosition.x, mousePosition.y })
|
||||
|
||||
if not self.id then
|
||||
print(selectedId, Tree.level.turnOrder.order[1])
|
||||
if selectedId ~= Tree.level.turnOrder.order[1] and Tree.level.turnOrder.isTurnsEnabled then return end
|
||||
if selectedId ~= Tree.level.turnOrder.notWalked[1] and Tree.level.turnOrder.isTurnsEnabled then return end
|
||||
return self:select(selectedId)
|
||||
else
|
||||
local char = Tree.level.characters[self.id]
|
||||
|
||||
char:try(Tree.behaviors.spellcaster, function(b)
|
||||
if not b.cast then
|
||||
if selectedId ~= Tree.level.turnOrder.order[1] and Tree.level.turnOrder.isTurnsEnabled then return end
|
||||
-- тут какая-то страшная дичь, я даже не уверен что оно работает
|
||||
-- зато я точно уверен, что это надо было писать не так
|
||||
if not selectedId then self:select(selectedId) end
|
||||
-- print(selectedId ~= next(Tree.level.turnOrder.notWalked), Tree.level.turnOrder.isTurnsEnabled)
|
||||
if selectedId ~= Tree.level.turnOrder.notWalked[1] and Tree.level.turnOrder.isTurnsEnabled then return end
|
||||
self:select(selectedId)
|
||||
return
|
||||
end
|
||||
|
||||
@ -1,44 +1,57 @@
|
||||
--- @class TurnOrder
|
||||
--- @field order Id[] возможно в будущем тут будет не айди персонажа, а айди фракции, в которой состоят несколько персонажей
|
||||
--- @field walked integer[]
|
||||
--- @field notWalked integer[]
|
||||
--- @field isTurnsEnabled boolean
|
||||
local turnOrder = {}
|
||||
turnOrder.__index = turnOrder
|
||||
|
||||
local function new()
|
||||
return setmetatable({
|
||||
order = {},
|
||||
walked = {},
|
||||
notWalked = {},
|
||||
isTurnsEnabled = true
|
||||
}, turnOrder)
|
||||
end
|
||||
|
||||
function turnOrder:updateOrder()
|
||||
local order = {}
|
||||
local notWalked = {}
|
||||
local count = 1
|
||||
for k, _ in ipairs(Tree.level.characters) do
|
||||
order[count] = k
|
||||
for id, char in ipairs(Tree.level.characters) do
|
||||
char:try(Tree.behaviors.stats, function(stats)
|
||||
notWalked[count] = id
|
||||
count = count + 1
|
||||
end)
|
||||
end
|
||||
self.order = order
|
||||
table.sort(notWalked, function(id_a, id_b)
|
||||
local res = Tree.level.characters[id_a]:try(Tree.behaviors.stats, function(astats)
|
||||
local res = Tree.level.characters[id_b]:try(Tree.behaviors.stats, function(bstats)
|
||||
return astats.initiative > bstats.initiative
|
||||
end)
|
||||
return res
|
||||
end)
|
||||
return res or false
|
||||
end)
|
||||
self.notWalked = notWalked
|
||||
|
||||
print('[Level]: Turn order has been updated!')
|
||||
for _, v in ipairs(self.order) do
|
||||
print('[Level]: id:', v)
|
||||
end
|
||||
end
|
||||
|
||||
function turnOrder:next()
|
||||
self.order[#self.order + 1] = self.order[1]
|
||||
self.order[1] = nil
|
||||
table.insert(self.walked, self.notWalked[1])
|
||||
self.notWalked[1] = nil
|
||||
|
||||
local order = {}
|
||||
for i = 1, #self.order do
|
||||
order[i] = self.order[i + 1]
|
||||
local notWalked = {}
|
||||
for i = 1, #self.notWalked do
|
||||
notWalked[i] = self.notWalked[i + 1]
|
||||
print(notWalked[i], i)
|
||||
end
|
||||
|
||||
self.order = order
|
||||
self.notWalked = notWalked
|
||||
print('[Level]: Triggered next turn')
|
||||
for _, v in ipairs(self.order) do
|
||||
print('[Level]: id:', v)
|
||||
print('[Level]:', next(self.notWalked))
|
||||
if #self.notWalked == 0 then
|
||||
self:updateOrder()
|
||||
self.walked = {}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
2
main.lua
2
main.lua
@ -11,7 +11,7 @@ end
|
||||
|
||||
function love.load()
|
||||
character.spawn("Foodor", Tree.assets.files.sprites.character)
|
||||
character.spawn("Baris", Tree.assets.files.sprites.character, Vec3 { 3, 3 })
|
||||
character.spawn("Baris", Tree.assets.files.sprites.character, Vec3 { 3, 3 }, nil, 12)
|
||||
character.spawn("Foodor Jr", Tree.assets.files.sprites.character, Vec3 { 0, 3 })
|
||||
character.spawn("Baris Jr", Tree.assets.files.sprites.character, Vec3 { 0, 6 })
|
||||
love.window.setMode(1080, 720, { resizable = true, msaa = 4, vsync = true })
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user