Compare commits

...

7 Commits

8 changed files with 104 additions and 12 deletions

View File

@ -1,17 +1,23 @@
--- @class StatsBehavior : Behavior --- @class StatsBehavior : Behavior
--- @field hp integer --- @field hp integer
--- @field mana integer --- @field mana integer
--- @field initiative integer
--- @field isInTurnOrder boolean
local behavior = {} local behavior = {}
behavior.__index = behavior behavior.__index = behavior
behavior.id = "stats" behavior.id = "stats"
--- @param hp? integer --- @param hp? integer
--- @param mana? integer --- @param mana? integer
function behavior.new(hp, mana) --- @param initiative? integer
return setmetatable({ --- @param isInTurnOrder? boolean
function behavior.new(hp, mana, initiative, isInTurnOrder)
return setmetatable({
hp = hp or 20, hp = hp or 20,
mana = mana or 10 mana = mana or 10,
}, behavior) initiative = initiative or 10,
isInTurnOrder = isInTurnOrder or true
}, behavior)
end end
return behavior return behavior

View File

@ -16,8 +16,8 @@ character.__index = character
--- @param spriteDir table --- @param spriteDir table
--- @param position? Vec3 --- @param position? Vec3
--- @param size? Vec3 --- @param size? Vec3
--- @param level? integer --- @param initiative? integer
local function spawn(name, spriteDir, position, size, level) local function spawn(name, spriteDir, position, size, initiative)
local char = {} local char = {}
char = setmetatable(char, character) char = setmetatable(char, character)
@ -28,13 +28,14 @@ local function spawn(name, spriteDir, position, size, level)
char:addBehavior { char:addBehavior {
Tree.behaviors.residentsleeper.new(), Tree.behaviors.residentsleeper.new(),
Tree.behaviors.stats.new(), Tree.behaviors.stats.new(nil, nil, initiative),
Tree.behaviors.map.new(position, size), Tree.behaviors.map.new(position, size),
Tree.behaviors.sprite.new(spriteDir), Tree.behaviors.sprite.new(spriteDir),
Tree.behaviors.spellcaster.new() Tree.behaviors.spellcaster.new()
} }
Tree.level.characters[char.id] = char Tree.level.characters[char.id] = char
Tree.level.turnOrder:updateOrder()
return char return char
end end

View File

@ -18,7 +18,9 @@ controls.keymap = {
cameraMoveDown = control("key", "s"), cameraMoveDown = control("key", "s"),
cameraMoveScroll = control("mouse", "3"), cameraMoveScroll = control("mouse", "3"),
fullMana = control("key", "m"), fullMana = control("key", "m"),
select = control("mouse", "1") select = control("mouse", "1"),
endTurnTest = control("key", "e"),
toggleTurns = control("key", "r"),
} }
local currentKeys = {} local currentKeys = {}

View File

@ -7,6 +7,7 @@ local utils = require "lib.utils.utils"
--- @field selector Selector --- @field selector Selector
--- @field camera Camera --- @field camera Camera
--- @field tileGrid TileGrid --- @field tileGrid TileGrid
--- @field turnOrder TurnOrder
local level = {} local level = {}
level.__index = level level.__index = level
@ -24,6 +25,7 @@ local function new(type, template)
tileGrid = (require "lib.level.grid.tile_grid").new(type, template, size), tileGrid = (require "lib.level.grid.tile_grid").new(type, template, size),
selector = (require "lib.level.selector").new(), selector = (require "lib.level.selector").new(),
camera = (require "lib.level.camera").new(), camera = (require "lib.level.camera").new(),
turnOrder = (require "lib.level.turn_order").new(),
}, level) }, level)
end end

View File

@ -25,12 +25,18 @@ function selector:update(dt)
local selectedId = Tree.level.characterGrid:get(Vec3 { mousePosition.x, mousePosition.y }) local selectedId = Tree.level.characterGrid:get(Vec3 { mousePosition.x, mousePosition.y })
if not self.id then if not self.id then
if selectedId ~= Tree.level.turnOrder.notWalked[1] and Tree.level.turnOrder.isTurnsEnabled then return end
return self:select(selectedId) return self:select(selectedId)
else else
local char = Tree.level.characters[self.id] local char = Tree.level.characters[self.id]
char:try(Tree.behaviors.spellcaster, function(b) char:try(Tree.behaviors.spellcaster, function(b)
if not b.cast then if not b.cast then
-- тут какая-то страшная дичь, я даже не уверен что оно работает
-- зато я точно уверен, что это надо было писать не так
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) self:select(selectedId)
return return
end end

62
lib/level/turn_order.lua Normal file
View File

@ -0,0 +1,62 @@
--- @class TurnOrder
--- @field walked integer[]
--- @field notWalked integer[]
--- @field isTurnsEnabled boolean
local turnOrder = {}
turnOrder.__index = turnOrder
local function new()
return setmetatable({
walked = {},
notWalked = {},
isTurnsEnabled = true
}, turnOrder)
end
function turnOrder:updateOrder()
local notWalked = {}
local 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
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!')
end
function turnOrder:next()
table.insert(self.walked, self.notWalked[1])
self.notWalked[1] = nil
local notWalked = {}
for i = 1, #self.notWalked do
notWalked[i] = self.notWalked[i + 1]
print(notWalked[i], i)
end
self.notWalked = notWalked
print('[Level]: Triggered next turn')
print('[Level]:', next(self.notWalked))
if #self.notWalked == 0 then
self:updateOrder()
self.walked = {}
end
end
function turnOrder:toggleTurns()
self.isTurnsEnabled = not self.isTurnsEnabled
end
return { new = new }

View File

@ -102,13 +102,13 @@ function attack:cast(caster, target)
return false return false
end end
caster:try(Tree.behaviors.stats, function (stats) caster:try(Tree.behaviors.stats, function(stats)
stats.mana = stats.mana - 2 stats.mana = stats.mana - 2
end) end)
--- @type Character --- @type Character
local targetCharacterId = Tree.level.characterGrid:get(target) local targetCharacterId = Tree.level.characterGrid:get(target)
if not targetCharacterId then return false end if not targetCharacterId or targetCharacterId == caster.id then return false end
local targetCharacter = Tree.level.characters[targetCharacterId] local targetCharacter = Tree.level.characters[targetCharacterId]
targetCharacter:try(Tree.behaviors.stats, function(stats) targetCharacter:try(Tree.behaviors.stats, function(stats)
stats.hp = stats.hp - 4 stats.hp = stats.hp - 4

View File

@ -11,7 +11,9 @@ end
function love.load() function love.load()
character.spawn("Foodor", Tree.assets.files.sprites.character) 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 }) love.window.setMode(1080, 720, { resizable = true, msaa = 4, vsync = true })
end end
@ -23,6 +25,17 @@ function love.update(dt)
Widgets:update(dt) -- логика UI-слоя должна отработать раньше всех, потому что нужно перехватить жесты и не пустить их дальше Widgets:update(dt) -- логика UI-слоя должна отработать раньше всех, потому что нужно перехватить жесты и не пустить их дальше
Tree.panning:update(dt) Tree.panning:update(dt)
Tree.level:update(dt) Tree.level:update(dt)
-- для тестов очереди ходов
-- удалить как только появится ui для людей
if Tree.controls:isJustPressed("endTurnTest") then
Tree.level.turnOrder:next()
end
if Tree.controls:isJustPressed("toggleTurns") then
print('toggle turns')
Tree.level.turnOrder:toggleTurns()
end
Tree.controls:cache() Tree.controls:cache()
local t2 = love.timer.getTime() local t2 = love.timer.getTime()