Files
pke/data/scripts/weapons/weapon_base.lua
2026-03-05 05:05:04 +03:00

109 lines
3.1 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.
-----------------------------------------------------------
-- 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