e4s-sdk/gamedata/scripts/sr_cutscene.script
2026-06-17 23:06:51 +03:00

264 lines
9 KiB
Text

----------------------------------------------------------------------------------------------------
--' Cutscene trigger
----------------------------------------------------------------------------------------------------
--' Âðåìåííûå ïåðåìåííûå
local object_cutscene = nil
local storage_scene = nil
class "cam_effector_set"
function cam_effector_set:__init(set,storage)
self.set = set
self.state = "start"
self.cur_effect = 0
self.playing = false
self.looped = false
self.enabled = true
self.st = storage
end
function cam_effector_set:start_effect(eff)
--printf("playing effect [camera_effects\\"..eff.anim..".anm], time [%s]", device():time_global())
--callstack()
if not (eff.global_cameffect) then
level.add_cam_effector("camera_effects\\"..eff.anim..".anm", 210408, false, "sr_cutscene.effector_callback")
else
level.add_cam_effector2("camera_effects\\"..eff.anim..".anm", 210408, false, "sr_cutscene.effector_callback", self.st.fov or db.actor:fov()*0.75)
end
self.playing = true
end
function cam_effector_set:stop_effect()
level.remove_cam_effector(210408)
self.playing = false
self.state = "release"
self.cur_effect = 0
end
function cam_effector_set:update()
if(device().precache_frame > 0) then
return
end
if(self.playing) then
local eff = self.set[self.state][self.cur_effect]
if(eff) and (eff.looped~=false) then
local cond = xr_logic.pick_section_from_condlist(db.actor, nil, self.condlist)
if(cond=="false") then
self.looped = false
-- self:stop_effect()
end
end
else
local eff = self:select_effect()
if(eff) then
self:start_effect(eff)
end
end
end
function cam_effector_set:select_effect()
local state = self.state
local cur_effect = self.cur_effect
if(self.looped) then
return self.set[state][cur_effect]
end
if(state=="start") then
cur_effect = cur_effect + 1
if(self.set.start[cur_effect]) then
self.cur_effect = cur_effect
if type(self.set.start[cur_effect].enabled)=="string" then
local condlist = xr_logic.parse_condlist(db.actor, "sr_cutscene", "enabled_condlist", self.set.start[cur_effect].enabled)
if xr_logic.pick_section_from_condlist(db.actor, nil, condlist) == "false" then
return self:select_effect()
end
end
if(type(self.set.start[cur_effect].looped)=="string") then
self.looped = true
self.condlist = xr_logic.parse_condlist(db.actor, "sr_cutscene", "effect_condlist", self.set.start[cur_effect].looped)
end
return self.set.start[cur_effect]
else
self.state = "idle"
self.cur_effect = 0
return self:select_effect()
end
elseif(state=="idle") then
cur_effect = cur_effect + 1
if(self.set.idle[cur_effect]) then
self.cur_effect = cur_effect
if type(self.set.idle[cur_effect].enabled)=="string" then
local condlist = xr_logic.parse_condlist(db.actor, "sr_cutscene", "enabled_condlist", self.set.idle[cur_effect].enabled)
if xr_logic.pick_section_from_condlist(db.actor, nil, condlist) == "false" then
return self:select_effect()
end
end
if(type(self.set.idle[cur_effect].looped)=="string") then
self.looped = true
self.condlist = xr_logic.parse_condlist(db.actor, "sr_cutscene", "effect_condlist", self.set.idle[cur_effect].looped)
end
return self.set.idle[cur_effect]
else
self.state = "finish"
self.cur_effect = 0
return self:select_effect()
end
elseif(state=="finish") then
cur_effect = cur_effect + 1
if(self.set.finish[cur_effect]) then
self.cur_effect = cur_effect
if type(self.set.finish[cur_effect].enabled)=="string" then
local condlist = xr_logic.parse_condlist(db.actor, "sr_cutscene", "enabled_condlist", self.set.finish[cur_effect].enabled)
if xr_logic.pick_section_from_condlist(db.actor, nil, condlist) == "false" then
return self:select_effect()
end
end
if(type(self.set.finish[cur_effect].looped)=="string") then
self.looped = true
self.condlist = xr_logic.parse_condlist(db.actor, "sr_cutscene", "effect_condlist", self.set.finish[cur_effect].looped)
end
return self.set.finish[cur_effect]
else
self.state = "release"
self.cur_effect = 0
sr_cutscene.effector_callback()
return nil
end
end
end
--------------------------------------------------------------------------------
class "action_cutscene"
--' èíèöèàëèçàöèÿ îáúåêòà êëàññà
function action_cutscene:__init(obj, storage)
self.object = obj
self.st = storage
self.ui_disabled = false
self.motion_id = 1
self.postprocess = false
end
--' èíèöèàëèçàöèÿ ñõåìû ïîâåäåíèÿ
function action_cutscene:reset_scheme()
self.state = ""
self.st.signals = {} --' îáíóëÿåì ñèãíàëû
self.motion = nil
self:zone_enter()
end
--' ôóíêöèÿ îáíîâëåíèÿ, âûçûâàåìàÿ êîíâååðîì
function action_cutscene:update(delta)
local state = self.state
-- if(state~="run") then
-- self:zone_enter()
-- end
if(self.motion) then
self.motion:update()
if(self.st.signals["cam_effector_stop"]~=nil) then
self.motion:stop_effect()
self:cutscene_callback()
self.st.signals["cam_effector_stop"] = nil
end
end
--' âûïîëíÿåì àðõèòåêòóðíîå òðåáîâàíèå
if(xr_logic.try_switch_to_another_section(self.object, self.st, db.actor)) then
return
end
end
--' òóò íóæíî çàïóñòèòü ñöåíó
function action_cutscene:zone_enter()
self.state = "run"
--' òåëåïîðò â âûáðàííóþ òî÷êó
--printf("%s ZONE ENTER %s", self.object:name(), device():time_global())
xr_effects.teleport_actor(db.actor, self.object, {self.st.point, self.st.look})
if self.st.pp_effector ~= "nil.ppe" then
level.add_pp_effector(self.st.pp_effector, 234, false)
end
xr_effects.disable_ui(db.actor, nil)
self.ui_disabled = true
if self.st.outdoor and db.actor ~= nil and (level.get_time_hours() < 6 or level.get_time_hours() > 21) then
self.postprocess = true
level.add_complex_effector("brighten", 1999)
--level.add_pp_effector("brighten.ppe", 1999, true)
end
self.motion_id = 1
self:select_next_motion()
object_cutscene = self.object
storage_scene = self.st
end
--' Âûáîð è íà÷àëî îòûãðûøà ñëåäóþùåãî ïðîëåòà
function action_cutscene:select_next_motion()
local motion = self.st.cam_effector[self.motion_id]
if cam_effector_sets[motion] == nil then --Ýòî èìÿ ôàéëà, à íå èìÿ òàáëèöû.
self.motion = cam_effector_set({start={},idle={{anim=motion, looped=false, global_cameffect = self.st.global_cameffect}},finish={}}, self.st)
else
self.motion = cam_effector_set(cam_effector_sets[motion], self.st)
end
local effect = self.motion:select_effect()
self.motion:start_effect(effect)
self.motion_id = self.motion_id + 1
end
--' Èâåíò îá îêîí÷àíèè ïðîëåòà
function action_cutscene:cutscene_callback()
if(self.motion.state=="release") then
self.motion = nil
if(self.motion_id<=#self.st.cam_effector) then
self:select_next_motion()
--printf("SELECTING MOTION %s from %s", tostring(self.motion_id), tostring(#self.st.cam_effector))
else
if self.postprocess then
self.postprocess = false
level.remove_complex_effector(1999)
--level.remove_pp_effector(1999)
end
if(self.ui_disabled) then
if not db.actor:is_talking() and self.st.enable_ui_on_end then
xr_effects.enable_ui(db.actor, nil)
elseif self.st.enable_ui_on_end then
level.enable_input()
end
db.actor:set_actor_direction(-patrol(self.st.look):point(0):sub(patrol(self.st.point):point(0)):getH())
self.ui_disabled = false
self.st.signals["cameff_end"] = true
end
end
else
self.motion.playing = false
local eff = self.motion:select_effect()
if(eff) then
self.motion:start_effect(eff)
end
end
end
--------------------------------------------------------------------------------
function add_to_binder(npc, ini, scheme, section, storage)
local new_action = action_cutscene(npc, storage)
storage.cutscene_action = new_action
--' Çàðåãèñòðèðîâàòü âñå actions, â êîòîðûõ äîëæåí áûòü âûçâàí ìåòîä reset_scheme ïðè èçìåíåíèè íàñòðîåê ñõåìû:
xr_logic.subscribe_action_for_events(npc, storage, new_action)
end
function set_scheme(obj, ini, scheme, section, gulag_name)
local st = xr_logic.assign_storage_and_bind(obj, ini, scheme, section)
st.logic = xr_logic.cfg_get_switch_conditions(ini, section, obj)
st.point = utils.cfg_get_string(ini, section, "point", obj, true, "", "none")
st.look = utils.cfg_get_string(ini, section, "look", obj, true, "", "none")
st.global_cameffect = utils.cfg_get_bool(ini, section, "global_cameffect", obj, false, false)
st.pp_effector = utils.cfg_get_string(ini, section, "pp_effector", obj, false, "", "nil")..".ppe"
st.cam_effector = parse_names(utils.cfg_get_string(ini, section, "cam_effector", obj, true, ""))
st.fov = utils.cfg_get_number(ini, section, "fov", obj, true)
st.enable_ui_on_end = utils.cfg_get_bool(ini, section, "enable_ui_on_end", obj, false, true)
st.outdoor = utils.cfg_get_bool(ini, section, "outdoor", obj, false, false)
end
function effector_callback(obj)
xr_logic.issue_event(object_scene, storage_scene, "cutscene_callback")
end