--- @alias State "idle"|"run"|"attack"|"hurt" --- @class Logic --- @field id Id --- @field mapLogic MapLogic --- @field state State 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) }, logic) end --- @param path Vec3 function logic:followPath(path) end --- @param target Vec3 function logic:runTo(target) self.state = "run" self.mapLogic.runTarget = target end function logic:update(dt) if self.state == "run" and self.mapLogic.runTarget then if self.mapLogic.position:floor() == self.mapLogic.runTarget:floor() then -- мы добежали до цели и сейчас в целевой клетке self.state = "idle" self.mapLogic.runTarget = nil else -- мы не добежали до цели local vel = (self.mapLogic.runTarget:subtract(self.mapLogic.position):normalize() --[[@as Vec3]] ):scale(1 * dt) -- бежим 2 условных метра в секунду self.mapLogic.position = self.mapLogic.position:add(vel) end end Tree.level.characterGrid:add(self.id) end return { new = new }