local utils = require "lib.utils.utils" --- @alias CharacterState "idle"|"run"|"attack"|"hurt" --- @class Logic --- @field owner Character --- @field mapLogic MapLogic --- @field state CharacterState local logic = {} logic.__index = logic --- @param id Id --- @param position? Vec3 --- @param size? Vec3 local function new(id, position, size) return setmetatable({ id = id, mapLogic = (require 'lib.character.map_logic').new(id, position, size), state = "idle" }, logic) end --- @param state CharacterState function logic:setState(state) self.state = state self.owner.graphics.animation:setState(state, (state ~= "idle" and state ~= "run") and function() self:setState("idle") end or nil) end --- @param path Deque function logic:followPath(path) if path:is_empty() then return end self:setState("run") self.mapLogic.path = path; ---@type Vec3 local nextCell = path:peek_front() self:runTo(nextCell) path:pop_front() end --- @param target Vec3 function logic:runTo(target) self.mapLogic.t0 = love.timer.getTime() self.mapLogic.runTarget = target local charPos = self.mapLogic.position if target.x < charPos.x then self.owner.graphics.animation.side = LEFT elseif target.x > charPos.x then self.owner.graphics.animation.side = RIGHT end end function logic:update(dt) if self.state == "run" and self.mapLogic.runTarget then local delta = love.timer.getTime() - self.mapLogic.t0 or love.timer.getTime() local fraction = delta / (0.5 * self.mapLogic.runTarget:subtract(self.mapLogic.position):length()) -- бежим одну клетку за 500 мс, по диагонали больше if fraction >= 1 then -- анимация перемещена завершена self.mapLogic.position = self.mapLogic.runTarget if not self.mapLogic.path:is_empty() then -- еще есть, куда бежать self:runTo(self.mapLogic.path:peek_front()) self.mapLogic.path:pop_front() else -- мы добежали до финальной цели self:setState("idle") self.mapLogic.runTarget = nil end else -- анимация перемещения не завершена self.mapLogic.displayedPosition = utils.lerp(self.mapLogic.position, self.mapLogic.runTarget, fraction) -- линейный интерполятор end end end return { new = new }