LuaPlus extenssion

This commit is contained in:
2026-03-05 05:05:04 +03:00
parent 33104c3bca
commit d57ac17b69
10 changed files with 183 additions and 50 deletions

View File

@@ -0,0 +1,109 @@
-----------------------------------------------------------
-- weapon_base.lua, Базоавый скрипт оружия
-- Автор: Кирилл
-- Изменяли:
-- Дата: 05.03.2026
-----------------------------------------------------------
-- индификаторы состояний FSM
WEAPON_FSM_STATE_IDLE = 1
WEAPON_FSM_STATE_ATTACK = 2
WEAPON_FSM_STATE_ATTACK2 = 3
WEAPON_FSM_STATE_RELOAD = 4
-- базовый класс оружия
weapon_base = inherit_table(game_object)
-- инициализация FSM
weapon_base.m_fsm = {}
-- покой
weapon_base.m_fsm[WEAPON_FSM_STATE_IDLE] = {
anim = "idle", -- имя анимации
anim_playback = ANIM_PLAYBACK_REPEAT, -- бесконечно играть
anim_speed = 1.0 -- обычная скорость анимации
}
-- атака
weapon_base.m_fsm[WEAPON_FSM_STATE_ATTACK] = {
anim = "attack", -- имя анимации
anim_playback = ANIM_PLAYBACK_NONE,
anim_speed = 1.0 -- обычная скорость анимации
}
-- перезарядка
weapon_base.m_fsm[WEAPON_FSM_STATE_RELOAD] = {
anim = "reload", -- имя анимации
anim_playback = ANIM_PLAYBACK_NONE,
anim_speed = 1.0 -- обычная скорость анимации
}
function weapon_base:on_init()
game_object.on_init(self)
-- начальное состояние FSM
self.m_state = WEAPON_FSM_STATE_IDLE
self.m_next_state = WEAPON_FSM_STATE_IDLE
self.m_state_time = 0.0
self.m_end_state_time = 0.0
self.m_damage = 25
end
function weapon_base:on_shutdown()
game_object.on_shutdown(self)
end
function weapon_base:on_update(dt)
game_object.on_update(self, dt)
self:on_fsm_state_update(dt)
end
function weapon_base:on_fsm_state_update(dt)
-- обновления времени
self.m_state_time = self.m_state_time + dt
-- проверка на стрельбу
if (self.m_state == WEAPON_STATE_ATTACK or
self.m_state == WEAPON_STATE_ATTACK2) and
self.m_state_time >= self.m_end_state_time then
-- переходим в ожидание
self:set_state(WEAPON_STATE_IDLE)
end
-- костыль, нету анимаций бесконечных
if self.m_state == WEAPON_STATE_IDLE and self.m_state_time >= self.m_end_state_time then
-- переходим в ожидание
self:set_state(WEAPON_STATE_IDLE)
end
self:fsm_update(dt)
end
function weapon_base:set_state(next_state)
self.m_next_state = next_state
end
function weapon_base:fsm_update(dt)
-- надо ли менять состояние
if self.m_next_state ~= self.m_state then
if self.m_next_state == WEAPON_STATE_ATTACK then
self:set_anim("attack1")
elseif self.m_next_state == WEAPON_STATE_ATTACK2 then
self:set_anim("attack1")
end
-- сброс времени и установка его на таймер анимации
self.m_state_time = 0.0
self.m_end_state_time = render.get_anim_time(self:get_anim())
-- запускаем атаку
if self.m_next_state == WEAPON_STATE_ATTACK or self.m_next_state == WEAPON_STATE_ATTACK2 then
self:attack()
end
self.m_state = self.m_next_state
end
end

View File

@@ -0,0 +1 @@
weapon_key = inherit_table(weapon_base)