diff --git a/lib/character/behaviors/ai.lua b/lib/character/behaviors/ai.lua index 7c52624..7c21901 100644 --- a/lib/character/behaviors/ai.lua +++ b/lib/character/behaviors/ai.lua @@ -21,6 +21,39 @@ 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) + + 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 --- @field animationNode AnimationNode? --- @field target Vec3? @@ -28,31 +61,17 @@ local behavior = {} behavior.__index = behavior behavior.id = "ai" -function behavior.new() - return setmetatable({}, behavior) +--- @param class Class +function behavior.new(class) + return setmetatable({ + makeTurn = aiNature[class] + }, 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) + return function(callback) - 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 diff --git a/main.lua b/main.lua index b2f120c..d94157c 100644 --- a/main.lua +++ b/main.lua @@ -52,7 +52,7 @@ function love.load() Tree.behaviors.sprite.new(Tree.assets.files.sprites.character), Tree.behaviors.shadowcaster.new(), Tree.behaviors.spellcaster.new(), - Tree.behaviors.ai.new() + Tree.behaviors.ai.new("dev_warrior") }, }