58 lines
1.8 KiB
Lua
58 lines
1.8 KiB
Lua
require 'lib.utils.vec3'
|
|
|
|
|
|
--- @alias Id integer
|
|
--- @type Id
|
|
local characterId = 1
|
|
|
|
--- @todo Композиция лучше наследования, но не до такой же степени! Надо отрефакторить и избавиться от сотни полей в таблице
|
|
--- @class Character
|
|
--- @field id Id
|
|
--- @field info Info
|
|
--- @field graphics Graphics
|
|
--- @field logic Logic
|
|
--- @field spellbook Spell[] собственный набор спеллов персонажа
|
|
--- @field cast Spell | nil ссылка на активный спелл из спеллбука
|
|
local character = {}
|
|
character.__index = character
|
|
|
|
--- Создаёт персонажа, которым будет управлять или игрок или компьютер
|
|
--- @param name string
|
|
--- @param template ClassTemplate
|
|
--- @param spriteDir table
|
|
--- @param position? Vec3
|
|
--- @param size? Vec3
|
|
--- @param level? integer
|
|
local function spawn(name, template, spriteDir, position, size, level)
|
|
local char = {}
|
|
|
|
char.id = characterId
|
|
characterId = characterId + 1
|
|
|
|
char.logic = (require 'lib.character.logic').new(char.id, position, size)
|
|
char.graphics = (require 'lib.character.graphics').new(char.id, spriteDir)
|
|
char.info = (require "lib/character/info").new(name, template, level)
|
|
|
|
char = setmetatable(char, character)
|
|
Tree.level.characters[char.id] = char
|
|
return char
|
|
end
|
|
|
|
--- @param path Deque
|
|
function character:followPath(path)
|
|
self.logic:followPath(path)
|
|
end
|
|
|
|
function character:update(dt)
|
|
self.logic:update(dt)
|
|
if self.cast then self.cast:update(self, dt) end
|
|
self.graphics:update(dt)
|
|
end
|
|
|
|
function character:draw()
|
|
self.graphics:draw()
|
|
if self.cast then self.cast:draw() end
|
|
end
|
|
|
|
return { spawn = spawn }
|