Files
escape-from-funcraft-client/tacz/daffas/assets/daffas_arsenal/scripts/migraine3_state_machine.lua
T
2026-07-23 16:35:06 +05:00

184 lines
4.7 KiB
Lua

-- 脚本的位置是 "{命名空间}:{路径}",那么 require 的格式为 "{命名空间}_{路径}"
-- 注意!require 取得的内容不应该被修改,应仅调用
local default = require("tacz_default_state_machine")
local STATIC_TRACK_LINE = default.STATIC_TRACK_LINE
local BOLT_CAUGHT_TRACK = default.BOLT_CAUGHT_TRACK
local bolt_caught_states = default.bolt_caught_states
local normal_state = setmetatable({}, {__index = bolt_caught_states.normal})
-- 检查当前是否还有弹药
local function isNoAmmo(context)
-- 这里同时检查了枪管和弹匣
return (not context:hasBulletInBarrel()) and (context:getAmmoCount() <= 0)
end
-- 更新"不空挂"状态
function normal_state.update(this, context)
-- 如果弹药数量是 0 了,那么立刻手动触发一次转到"空挂"状态的输入
if (isNoAmmo(context)) then
context:stopAnimation(context:getTrack(STATIC_TRACK_LINE, BOLT_CAUGHT_TRACK))
context:trigger(this.INPUT_BOLT_CAUGHT)
else
local a = context:getAmmoCount()
if (a < 9) then
context:setAnimationProgress(context:getTrack(STATIC_TRACK_LINE, BOLT_CAUGHT_TRACK),0.1+(8-a)*0.5,false)
else
context:setAnimationProgress(context:getTrack(STATIC_TRACK_LINE, BOLT_CAUGHT_TRACK),0.1,false)
end
end
end
-- 进入"不空挂"状态
function normal_state.entry(this, context)
context:runAnimation("static_ammo_display", context:getTrack(STATIC_TRACK_LINE, BOLT_CAUGHT_TRACK), false, PLAY_ONCE_STOP, 0)
this.bolt_caught_states.normal.update(this, context)
end
local GUN_KICK_TRACK_LINE = default.GUN_KICK_TRACK_LINE
local gun_kick_state = default.gun_kick_state
local main_track_states = default.main_track_states
local idle_state = setmetatable({}, {__index = main_track_states.idle})
-- Shoot animations
local shoot_animations = {
"shoot_1", "shoot_2", "shoot_3", "shoot_4",
"shoot_5", "shoot_6", "shoot_7", "shoot_8", "shoot_9"
}
local last_shoot_animation = "shoot_last"
local bolt_catch_animation = "static_bolt_caught"
local function getNextShootAnimation()
return shoot_animations[math.random(#shoot_animations)]
end
-- ===========================================================================================================================================================================
-- Idle state bolt catch after last shot
function idle_state.transition(this, context, input)
local track = context:findIdleTrack(GUN_KICK_TRACK_LINE, false)
if context:getAmmoCount() == 0
and context:getFlag("played_shoot_last")
and not context:isTrackPlaying(track) then
context:runAnimation(bolt_catch_animation, track, true, PLAY_ONCE_STOP, 0)
context:setFlag("played_shoot_last", false)
end
return main_track_states.idle.transition(this, context, input)
end
-- ===========================================================================================================================================================================
-- Random shooting state
local shoot_state = setmetatable({}, { __index = gun_kick_state })
function shoot_state.transition(this, context, input)
if input ~= INPUT_SHOOT then return nil end
local fireMode = context:getFireMode()
if fireMode ~= SEMI and fireMode ~= AUTO and fireMode ~= BURST then
return nil
end
local track = context:findIdleTrack(GUN_KICK_TRACK_LINE, false)
if context:getAmmoCount() == 0 then
context:runAnimation(last_shoot_animation, track, true, PLAY_ONCE_STOP, 0)
context:runAnimation("last_shoot", context:getTrack(STATIC_TRACK_LINE, BOLT_CAUGHT_TRACK), true, PLAY_ONCE_HOLD, 0)
else
local anim = getNextShootAnimation()
context:runAnimation(anim, track, true, PLAY_ONCE_STOP, 0)
end
return nil
end
-- 用元表的方式继承默认状态机的属性
local M = setmetatable({
gun_kick_state = setmetatable({}, { __index = shoot_state }),
bolt_caught_states = setmetatable({
normal = normal_state,
}, {__index = bolt_caught_states}),
}, {__index = default})
function M:initialize(context)
default.initialize(self, context)
end
-- 继承默认状态机需要重新初始化状态
function M:states()
return {
self.base_track_state,
self.bolt_caught_states.normal,
self.over_heat_states.normal,
self.main_track_states.start,
self.gun_kick_state,
self.movement_track_states.idle,
self.ADS_states.normal,
self.slide_states.normal
}
end
-- 导出状态机
return M