From 8821cb4cf7eeafd30c01a2ebddcfccb1c334859d Mon Sep 17 00:00:00 2001 From: neckrat Date: Fri, 7 Nov 2025 09:25:21 +0300 Subject: [PATCH] try to add initiative --- lib/character/behaviors/stats.lua | 16 ++++++---- lib/character/character.lua | 6 ++-- lib/level/selector.lua | 9 ++++-- lib/level/turn_order.lua | 49 +++++++++++++++++++------------ main.lua | 2 +- 5 files changed, 52 insertions(+), 30 deletions(-) diff --git a/lib/character/behaviors/stats.lua b/lib/character/behaviors/stats.lua index a6161bd..965d290 100644 --- a/lib/character/behaviors/stats.lua +++ b/lib/character/behaviors/stats.lua @@ -1,17 +1,23 @@ --- @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) - return setmetatable({ +--- @param initiative? integer +--- @param isInTurnOrder? boolean +function behavior.new(hp, mana, initiative, isInTurnOrder) + return setmetatable({ hp = hp or 20, - mana = mana or 10 - }, behavior) + mana = mana or 10, + initiative = initiative or 10, + isInTurnOrder = isInTurnOrder or true + }, behavior) end -return behavior \ No newline at end of file +return behavior diff --git a/lib/character/character.lua b/lib/character/character.lua index 11ca80b..a11e069 100644 --- a/lib/character/character.lua +++ b/lib/character/character.lua @@ -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() diff --git a/lib/level/selector.lua b/lib/level/selector.lua index 3951998..b89946d 100644 --- a/lib/level/selector.lua +++ b/lib/level/selector.lua @@ -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 diff --git a/lib/level/turn_order.lua b/lib/level/turn_order.lua index eeeb95a..7ef3130 100644 --- a/lib/level/turn_order.lua +++ b/lib/level/turn_order.lua @@ -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 - count = count + 1 + 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 diff --git a/main.lua b/main.lua index fe01759..6fc77d0 100644 --- a/main.lua +++ b/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 })