heroes-of-nerevelon/lib/character.lua
Neckrat 0cf74b0eff update grid🤡🤡🤡:clown:
Co-authored-by: Ivan Yuriev <ivanyr44@gmail.com>
2025-08-08 02:12:48 +03:00

95 lines
2.7 KiB
Lua

local anim8 = require "lib/anim8"
require 'lib/vec3'
--- Скорость между кадрами в анимации
local ANIMATION_SPEED = 0.1
local characterId = 1
--- @class Character
--- @field id integer
--- @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
--- @field size 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.id = characterId
characterId = characterId + 1
char.position = Vec3({})
char.size = Vec3({ 1, 1 })
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
char = setmetatable(char, character)
Tree.level.characters[char.id] = 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 }