----------------------------------------------------------- -- 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