Compare commits

...

4 Commits

3 changed files with 46 additions and 29 deletions

View File

@ -21,6 +21,39 @@ local function closestCharacter(char)
return charTarget return charTarget
end end
---@type {[Class]: fun(self): Task<nil>} возможно где-то здесь на объявлении типа сломается типизация
local aiNature = {
["dev_warrior"] = function(self)
return function(callback) -- почему так, описано в Task
self.owner:try(Tree.behaviors.spellcaster, function(spellB)
local charTarget = closestCharacter(self.owner)
charTarget:try(Tree.behaviors.positioned, function(b)
self.target = Vec3 { b.position.x, b.position.y + 1 } --- @todo тут захардкожено + 1, но мы должны как-то хитро определять с какой стороны обойти
end)
spellB.spellbook[1]:cast(self.owner, self.target)(function()
-- здесь мы оказываемся после того, как сходили в первый раз
print("[AI]: finished move 1")
local newTarget = Vec3 { 1, 1 }
-- поэтому позиция персонажа для нового каста пересчитается динамически
spellB.spellbook[1]:cast(self.owner, newTarget)(function()
print("[AI]: finished move 2")
-- дергаем функцию после завершения хода
callback()
end)
end)
end)
end
end,
["dev_mage"] = function(self)
return function(callback)
print("etoh... bleh")
callback()
end
end
}
--- @class AIBehavior : Behavior --- @class AIBehavior : Behavior
--- @field animationNode AnimationNode? --- @field animationNode AnimationNode?
--- @field target Vec3? --- @field target Vec3?
@ -28,32 +61,11 @@ local behavior = {}
behavior.__index = behavior behavior.__index = behavior
behavior.id = "ai" behavior.id = "ai"
function behavior.new() --- @param class Class
return setmetatable({}, behavior) function behavior.new(class)
end return setmetatable({
makeTurn = aiNature[class]
--- @return Task<nil> }, behavior)
function behavior:makeTurn()
return function(callback) -- почему так, описано в Task
self.owner:try(Tree.behaviors.spellcaster, function(spellB)
local charTarget = closestCharacter(self.owner)
charTarget:try(Tree.behaviors.positioned, function(b)
self.target = Vec3 { b.position.x, b.position.y + 1 } --- @todo тут захардкожено + 1, но мы должны как-то хитро определять с какой стороны обойти
end)
spellB.spellbook[1]:cast(self.owner, self.target)(function()
-- здесь мы оказываемся после того, как сходили в первый раз
print("[AI]: finished move 1")
local newTarget = Vec3 { 1, 1 }
-- поэтому позиция персонажа для нового каста пересчитается динамически
spellB.spellbook[1]:cast(self.owner, newTarget)(function()
print("[AI]: finished move 2")
-- дергаем функцию после завершения хода
callback()
end)
end)
end)
end
end end
return behavior return behavior

View File

@ -1,7 +1,10 @@
--- @alias Class "dev_warrior"|"dev_mage"
--- @class StatsBehavior : Behavior --- @class StatsBehavior : Behavior
--- @field hp integer --- @field hp integer
--- @field mana integer --- @field mana integer
--- @field initiative integer --- @field initiative integer
--- @field class Class
--- @field isInTurnOrder boolean --- @field isInTurnOrder boolean
local behavior = {} local behavior = {}
behavior.__index = behavior behavior.__index = behavior
@ -10,13 +13,15 @@ behavior.id = "stats"
--- @param hp? integer --- @param hp? integer
--- @param mana? integer --- @param mana? integer
--- @param initiative? integer --- @param initiative? integer
--- @param class? Class
--- @param isInTurnOrder? boolean --- @param isInTurnOrder? boolean
function behavior.new(hp, mana, initiative, isInTurnOrder) function behavior.new(hp, mana, initiative, class, isInTurnOrder)
return setmetatable({ return setmetatable({
hp = hp or 20, hp = hp or 20,
mana = mana or 10, mana = mana or 10,
initiative = initiative or 10, initiative = initiative or 10,
isInTurnOrder = isInTurnOrder or true class = class or "dev_warrior",
isInTurnOrder = isInTurnOrder or true,
}, behavior) }, behavior)
end end

View File

@ -52,7 +52,7 @@ function love.load()
Tree.behaviors.sprite.new(Tree.assets.files.sprites.character), Tree.behaviors.sprite.new(Tree.assets.files.sprites.character),
Tree.behaviors.shadowcaster.new(), Tree.behaviors.shadowcaster.new(),
Tree.behaviors.spellcaster.new(), Tree.behaviors.spellcaster.new(),
Tree.behaviors.ai.new() Tree.behaviors.ai.new("dev_warrior")
}, },
} }