heroes-of-nerevelon/character.lua
Neckrat a5ad1b9870 add camera
Co-authored-by: Ivan Yuriev <ivanyr44@gmail.com>
2025-08-01 02:00:35 +03:00

91 lines
3.5 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local anim8 = require "lib/anim8"
require 'lib/vec3'
local CHARACTER_SIZE = 64
--- Для anim8, представляет из себя с какого по какого представлены спрайты для анимации
local ANIMATION_SIZE = '1-8'
--- Скорость между кадрами в анимации
local ANIMATION_SPEED = 0.1
-- Константы ниже представляют из себя номер строки (с единицы), в которой находится та или иная анимация
local IDLE_ROW = 1
local RUN_ROW = 2
local ATTACK_ROW = 3
--- @class Character
local Character = {}
Character.name = ""
---------- Animations -----
--- мы должны определиться со спрайтшитами и подобным, всё что здесь написано лишь пример
---
--- предполагается, что у всех будет одинаковое кол-во кадров в анимации и их скорость произведения
Character.animationTable = {
idle = {},
run = {},
attack = {}
-- etc etc
}
--- чтобы не обновлять все анимации одновременно, храним нужную анимацию здесь
---
--- когда нужно сменить анимацию с idle на run например, меняем именно это поле
Character.animation = Character.animationTable.idle
---------- Statistics -----
Character.stats = {}
--- TODO: придумать формулу расчёта статов относительно уровня
Character.stats.level = 1
Character.stats.initiative = 10
Character.stats.damage = 5
Character.stats.defence = 0
Character.stats.hp = 30
Character.player = {}
--- TODO: мнимая надежда на спеллмейкинг
---
--- правда я абсолютно хз, как он будет смотреться
--- в контексте рогалика, но посмотрим
---
--- мб это будет метаспеллмейкинг на овощах
Character.skills = {}
Character.class = ""
Character.position = Vec3({})
--- Обёртка над Character:Create
-- CreateCharacter = Character.create
-- ты клоун же
-- какого черта у тебя конструктор объекта принимает ссылку на объект
--
-- хз
-- ща я в душ
-- :clown:
--- Создаёт персонажа, которым будет управлять или игрок или компьютер
--- @param name string
--- @param imagePath string
--- @param level? integer
function CreateCharacter(name, imagePath, level) -- aka Character.create(self, name, imagePath, level)
-- TODO: добавить asset_loader, где все необходимые ассеты будут грузиться в одном месте,
-- а здесь мы добавляем ассет на загрузку в очередь
local image = love.graphics.newImage(imagePath)
local animationGrid = anim8.newGrid(CHARACTER_SIZE, CHARACTER_SIZE, image:getWidth(), image:getHeight())
return Character {
name = name,
animationTable = {
idle = anim8.newAnimation(animationGrid(ANIMATION_SIZE, IDLE_ROW), ANIMATION_SPEED),
run = anim8.newAnimation(animationGrid(ANIMATION_SIZE, RUN_ROW), ANIMATION_SPEED),
attack = anim8.newAnimation(animationGrid(ANIMATION_SIZE, ATTACK_ROW), ANIMATION_SPEED)
}
}
end
function Character:update(dt)
self.animation:update(dt)
end