From db8db450d05222b81c5b16fe92cc411f3597cead Mon Sep 17 00:00:00 2001 From: neckrat Date: Sun, 12 Apr 2026 23:21:50 +0300 Subject: [PATCH] ai maketurn, but in table --- lib/character/behaviors/ai.lua | 77 +++++++++++++++++++--------------- main.lua | 2 +- 2 files changed, 45 insertions(+), 34 deletions(-) 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 diff --git a/main.lua b/main.lua index 25db8f6..1097aeb 100644 --- a/main.lua +++ b/main.lua @@ -54,7 +54,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") -- так мы вообще делать не должны, и он должен как-то подцеплять class из stats, но как я хз честно }, }