heroes-of-nerevelon/lib/character.lua
Neckrat 9c35fc2581 move character to lib
Co-authored-by: Ivan Yuriev <ivanyr44@gmail.com>
2025-08-03 22:06:45 +03:00

89 lines
2.6 KiB
Lua

local anim8 = require "lib/anim8"
require 'lib/vec3'
--- Скорость между кадрами в анимации
local ANIMATION_SPEED = 0.1
--- @class Character
--- @field name string
--- @field animationTable table<string, table>
--- @field state "idle"|"run"|"attack"|"hurt"
--- @field stats table<string, integer>
--- @field player table
--- @field skills table
--- @field class "warrior"|"mage"
--- @field position Vec3
local character = {}
character.__index = character
--- Создаёт персонажа, которым будет управлять или игрок или компьютер
--- @param name string
--- @param spriteDir table
--- @param level? integer
local function spawn(name, spriteDir, level)
local animationGrid = {}
-- n: name; i: image
for n, i in pairs(spriteDir) do
local aGrid = anim8.newGrid(96, 64, i:getWidth(), i:getHeight())
local tiles = '1-' .. math.ceil(i:getWidth() / 96)
animationGrid[n] = aGrid(tiles, 1)
end
local char = {
name = name,
animationTable = {}
}
char.position = Vec3({})
char.state = "idle"
char.animationTable.idle = anim8.newAnimation(animationGrid["idle"], ANIMATION_SPEED)
char.animationTable.run = anim8.newAnimation(animationGrid["run"], ANIMATION_SPEED)
char.animationTable.attack = anim8.newAnimation(animationGrid["attack"], ANIMATION_SPEED, function()
char.state = "idle"
end)
char.animationTable.hurt = anim8.newAnimation(animationGrid["hurt"], ANIMATION_SPEED, function()
char.state = "idle"
end)
char.stats = {}
--- @todo придумать формулу расчёта статов относительно уровня
char.stats.level = 1
char.stats.initiative = 10
char.stats.damage = 5
char.stats.defence = 0
char.stats.hp = 30
print(char)
char = setmetatable(char, character)
table.insert(Tree.level.characters, char)
return char
end
function character:update(dt)
if love.keyboard.isDown("r") then
self.state = "run"
end
if love.keyboard.isDown("i") then
self.state = "idle"
end
if love.keyboard.isDown("u") then
self.state = "attack"
end
if love.keyboard.isDown("h") then
self.state = "hurt"
end
self.animationTable[self.state]:update(dt)
end
function character:draw()
local ppm = Tree.level.camera.pixelsPerMeter
self.animationTable[self.state]:draw(Tree.assets.files.sprites.character[self.state], self.position.x,
self.position.y, nil, 1 / ppm, 1 / ppm, 38, 47)
end
return { spawn = spawn }