109 lines
3.1 KiB
Lua
109 lines
3.1 KiB
Lua
-----------------------------------------------------------
|
||
-- 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 |