diff --git a/lib/character/behaviors/ai.lua b/lib/character/behaviors/ai.lua index b5e7b82..18f58fe 100644 --- a/lib/character/behaviors/ai.lua +++ b/lib/character/behaviors/ai.lua @@ -20,45 +20,56 @@ local function closestCharacter(char) return charTarget end +---@type {[Class]: fun(self): Task} возможно где-то здесь на объявлении типа сломается типизация +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) + + local task1 = spellB.spellbook[1]:cast(self.owner, self.target) + if task1 then + task1( + function() + -- здесь мы оказываемся после того, как сходили в первый раз + local newTarget = Vec3 { 1, 1 } + local task2 = spellB.spellbook[1]:cast(self.owner, newTarget) + if task2 then + -- дергаем функцию после завершения хода + task2(callback) + else + callback() + end + end + ) + else + callback() + end + end) + end + end, + ["dev_mage"] = function(self) + return function(callback) + print("etoh... bleh") + callback() + end + end +} + --- @class AIBehavior : Behavior --- @field target Vec3? local behavior = {} behavior.__index = behavior behavior.id = "ai" -function behavior.new() - return setmetatable({}, behavior) -end - ---- @return Task -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) - - local task1 = spellB.spellbook[1]:cast(self.owner, self.target) - if task1 then - task1( - function() - -- здесь мы оказываемся после того, как сходили в первый раз - local newTarget = Vec3 { 1, 1 } - local task2 = spellB.spellbook[1]:cast(self.owner, newTarget) - if task2 then - -- дергаем функцию после завершения хода - task2(callback) - else - callback() - end - end - ) - else - callback() - end - end) - end +--- @param class Class +function behavior.new(class) + return setmetatable({ + makeTurn = aiNature[class] + }, behavior) end return behavior