Files
SoaFE/DATA/SCRIPTS/STORY/STORY_REBEL_ACTIII_M09_SPACE.LUA
2026-02-28 14:00:45 -06:00

596 lines
19 KiB
Lua

--/////////////////////////////////////////////////////////////////////////////////////////////////
--
-- (C) Petroglyph Games, Inc.
--
--
-- ***** ** * *
-- * ** * * *
-- * * * * *
-- * * * * * * * *
-- * * *** ****** * ** **** *** * * * ***** * ***
-- * ** * * * ** * ** ** * * * * ** ** ** *
-- *** ***** * * * * * * * * ** * * * *
-- * * * * * * * * * * * * * * *
-- * * * * * * * * * * ** * * * *
-- * ** * * ** * ** * * ** * * * *
-- ** **** ** * **** ***** * ** *** * *
-- * * *
-- * * *
-- * * *
-- * * * *
-- **** * *
--
--/////////////////////////////////////////////////////////////////////////////////////////////////
-- C O N F I D E N T I A L S O U R C E C O D E -- D O N O T D I S T R I B U T E
--/////////////////////////////////////////////////////////////////////////////////////////////////
--
-- $File:
--
-- $Author: Brian_Hayes $
--
-- $Change:
--
-- $DateTime:
--
-- $Revision:
--
--/////////////////////////////////////////////////////////////////////////////////////////////////
require("PGStoryMode")
-----------------------------------------------------------------------------------------------------------------------
-- Definitions -- This function is called once when the script is first created.
-----------------------------------------------------------------------------------------------------------------------
function Definitions()
DebugMessage("%s -- In Definitions", tostring(Script))
StoryModeEvents =
{
Rebel_A3_M09_Begin = State_Rebel_A3_M09_Begin
,Rebel_M09_IntroCine_Dialog_Line_01_Remove_Text = State_IntroCine_Dialog_Line_01_Remove_Text
,Rebel_M09_IntroCine_Dialog_Line_02_Remove_Text = State_IntroCine_Dialog_Line_02_Remove_Text
,Rebel_M09_IntroCine_Dialog_Line_03_Remove_Text = State_IntroCine_Dialog_Line_03_Remove_Text
,Rebel_M09_IntroCine_Dialog_Line_04_Remove_Text = State_IntroCine_Dialog_Line_04_Remove_Text
,Rebel_M09_IntroCine_Dialog_Line_05_Remove_Text = State_IntroCine_Dialog_Line_05_Remove_Text
,Rebel_A3_M09_Plans_Recovered_01b_Remove_Movie = State_M09_Plans_Recovered
--,Rebel_A3_M09_Plans_Recovered_00_Remove_Movie = State_Rebel_A3_M09_Plans_Recovered_00
}
-- Waves of enemy units recover from EMP throughout the mission
--time_to_wakeup_1 = 45 original
time_to_wakeup_1 = 5
wakeup_table_1 = {
{"Tartan_Patrol_Cruiser", "1a"}
,{"Tartan_Patrol_Cruiser", "1b"}
,{"Victory_Destroyer", "1c"}
}
--time_to_wakeup_2 = 90 original
time_to_wakeup_2 = 60
wakeup_table_2 = {
{"Victory_Destroyer", "2a"}
,{"Tartan_Patrol_Cruiser", "2b"}
,{"Tartan_Patrol_Cruiser", "2c"}
,{"Tartan_Patrol_Cruiser", "2d"}
,{"Tartan_Patrol_Cruiser", "2e"}
,{"Tartan_Patrol_Cruiser", "2f"}
}
--time_to_wakeup_3 = 135 original
time_to_wakeup_3 = 120
wakeup_table_3 = {
{"Star_Destroyer", "3a"}
,{"Star_Destroyer", "3b"}
,{"Tartan_Patrol_Cruiser", "3c"}
,{"Tartan_Patrol_Cruiser", "3d"}
,{"Tartan_Patrol_Cruiser", "3e"}
,{"Tartan_Patrol_Cruiser", "3f"}
,{"Tartan_Patrol_Cruiser", "3g"}
}
--time_to_wakeup_4 = 180 original
time_to_wakeup_4 = 180
--time_to_get_plans = 60 original
time_to_get_plans = 60
time_trigger = 0
--time_to_make_transport1_vulnerable = 20 -- time_to_wakeup_1 + GameRandom(10,30)
--time_to_make_transport2_vulnerable = 20 -- time_to_wakeup_2 + GameRandom(10,30)
--time_to_make_transport3_vulnerable = 40 -- time_to_wakeup_3 + GameRandom(10,30)
time_to_make_transport1_vulnerable = 0 -- time_to_wakeup_1 + GameRandom(10,30)
time_to_make_transport2_vulnerable = 0 -- time_to_wakeup_2 + GameRandom(10,30)
time_to_make_transport3_vulnerable = 0 -- time_to_wakeup_3 + GameRandom(10,30)
time_to_make_transport4_vulnerable = 0 -- time_to_wakeup_3 + GameRandom(35,60)
exit_range = 400
first_time_serviced = true
flag_shuttles_escaping = false
fog_id = nil
end
function State_Rebel_A3_M09_Begin(message)
if message == OnEnter then
-- Prevent the AI from performing an automatic fog of war reveal for this tactical scenario.
-- MessageBox("disallowing ai controlled fog reveal")
GlobalValue.Set("Allow_AI_Controlled_Fog_Reveal", 0)
rebel_player = Find_Player("Rebel")
-- Find the transports
transport1 = Find_Hint("RM09_ALLIANCE_SHUTTLE", "1")
transport2 = Find_Hint("RM09_ALLIANCE_SHUTTLE", "2")
transport3 = Find_Hint("RM09_ALLIANCE_SHUTTLE", "3")
transport4 = Find_Hint("RM09_ALLIANCE_SHUTTLE", "4")
if not transport1 or not transport2 or not transport3 or not transport4 then
return
end
starbase = Find_First_Object("EMPIRE_STAR_BASE_4")
if not starbase then
return
end
-- Exit point for shuttles
exit_marker = Find_Hint("GENERIC_MARKER_SPACE", "shuttle_escape")
if TestValid(exit_marker) then
Register_Prox(exit_marker, Exit_Prox, exit_range, rebel_player)
else
return
end
-- Get all of the defense satellites
sat_list = Find_All_Objects_With_Hint("defense_sat")
for i, sat in pairs(sat_list) do
if TestValid(sat) then
sat.Prevent_AI_Usage(true)
sat.Prevent_Opportunity_Fire(true)
end
end
Create_Thread("Intro_Cinematic")
end
end
------------------------------------------------------------------------------------------------------------------------
-- Opening Cinematic stuff
------------------------------------------------------------------------------------------------------------------------
function Intro_Cinematic()
Suspend_AI(1)
Lock_Controls(1)
Letter_Box_In(0)
transport1 = Find_Hint("RM09_ALLIANCE_SHUTTLE", "1")
transport2 = Find_Hint("RM09_ALLIANCE_SHUTTLE", "2")
transport3 = Find_Hint("RM09_ALLIANCE_SHUTTLE", "3")
transport4 = Find_Hint("RM09_ALLIANCE_SHUTTLE", "4")
if not transport1 or not transport2 or not transport3 or not transport4 then
return
end
Start_Cinematic_Camera()
Set_Cinematic_Camera_Key(transport3, 600, 15, 60, 1, 0, 0, 0)
Set_Cinematic_Target_Key(transport3, 0, 0, 0, 0, 0, 0, 0)
--Resume_Hyperspace_In()
if TestValid(transport1) then
--transport1.Cinematic_Hyperspace_In(69)
transport1.Cinematic_Hyperspace_In(9)
end
if TestValid(transport2) then
--transport2.Cinematic_Hyperspace_In(81)
transport2.Cinematic_Hyperspace_In(21)
end
if TestValid(transport3) then
--transport3.Cinematic_Hyperspace_In(63)
transport3.Cinematic_Hyperspace_In(23)
end
if TestValid(transport4) then
--transport4.Cinematic_Hyperspace_In(75)
transport4.Cinematic_Hyperspace_In(15)
end
Fade_Screen_In(1)
Sleep(1)
Resume_Hyperspace_In()
Sleep(5)
Transition_Cinematic_Camera_Key(transport3, 6.0, 375, 15, 310, 1, 0, 0, 0)
Transition_Cinematic_Target_Key(transport3, 2.5, 0, 0, 0, 0, 0, 0, 0)
Sleep(5)
Story_Event("CUE_M09_DIALOG_REBELPILOT_01")
end
----------------------------------------------------------------------------------
-- cinematic dialog lua callbacks here
-----------------------------------------------------------------------------------
function State_IntroCine_Dialog_Line_01_Remove_Text(message)
if message == OnEnter then
Sleep(1)
antilles = Find_First_Object("SUNDERED_HEART")
if not TestValid(antilles) then
return
end
Set_Cinematic_Camera_Key(antilles, 500, 18, 290, 1, 0, 0, 0)
Set_Cinematic_Target_Key(antilles, 0, 0, 0, 0, 0, 0, 0)
Transition_Cinematic_Camera_Key(antilles, 20.0, 450, 13, 260, 1, 0, 0, 0)
Story_Event("CUE_M09_DIALOG_ANTILLES_01")
--Antilles: It's borrowed time at best. When they get moving again, we better not be around
end
end
function State_IntroCine_Dialog_Line_02_Remove_Text(message)
if message == OnEnter then
-- Sleep(1)
Story_Event("CUE_M09_DIALOG_ANTILLES_02")
--Antilles: Boarding parties, get going. Search the station and collect any data you can!
if not TestValid(transport3) then
return
end
end
end
function State_IntroCine_Dialog_Line_03_Remove_Text(message)
if message == OnEnter then
Set_Cinematic_Camera_Key(transport3, 350, 25, 170, 1, transport3, 1, 0)
Set_Cinematic_Target_Key(transport3, 0, 0, 0, 0, transport3, 0, 0)
Transition_Cinematic_Camera_Key(transport3, 10, 450, 20, 190, 1, transport3, 1, 0)
MoveTransportsToStarbase()
Story_Event("CUE_M09_DIALOG_REBELPILOT_02")
--Rebel Soldier: Yes, sir!
Sleep(6)
--camera shot from starbase
starbase = Find_Hint("EMPIRE_STAR_BASE_4", "starbase")
if not TestValid(starbase) then
return
end
end
end
function State_IntroCine_Dialog_Line_04_Remove_Text(message)
if message == OnEnter then
Sleep(8)
Story_Event("CUE_M09_DIALOG_ANTILLES_03")
--Antilles: That EMP didn't last as long as we thought! Protect the boarding party and take out any ship that reactivates!
cine_ship = Find_Hint("Tartan_Patrol_Cruiser", "unaffected")
if not TestValid(cine_ship) then
return
end
cine_ship2 = Find_Hint("Tartan_Patrol_Cruiser", "unaffected2")
if not TestValid(cine_ship2) then
return
end
cine_ship.Suspend_Locomotor(false)
cine_ship2.Suspend_Locomotor(false)
cine_ship.Prevent_AI_Usage(false)
cine_ship2.Prevent_AI_Usage(false)
cine_ship.Prevent_Opportunity_Fire(false)
cine_ship2.Prevent_Opportunity_Fire(false)
cine_ship2.Prevent_AI_Usage(false)
cine_ship.Move_To(antilles)
cine_ship2.Move_To(antilles)
Sleep(1)
Set_Cinematic_Camera_Key(cine_ship, 500, 15, 190, 1, cine_ship, 1, 0)
Set_Cinematic_Target_Key(antilles, 0, 0, 0, 0, antilles, 0, 0)
end
end
function State_IntroCine_Dialog_Line_05_Remove_Text(message)
if message == OnEnter then
Sleep(2)
Point_Camera_At(antilles)
Transition_To_Tactical_Camera(2)
Letter_Box_Out(2)
Sleep(2)
End_Cinematic_Camera()
Suspend_AI(0)
Lock_Controls(0)
Register_Timers()
fog_id = FogOfWar.Reveal_All(rebel_player)
end
end
function Register_Timers()
-- Don't register the timer events unitl the cinematics are done playing
Register_Timer(Wake_Sats, time_to_wakeup_4)
-- Register timers for enemy ship wakeup events
Register_Timer(Wake_Units, time_to_wakeup_1, wakeup_table_1)
Register_Timer(Wake_Units, time_to_wakeup_2, wakeup_table_2)
Register_Timer(Wake_Units, time_to_wakeup_3, wakeup_table_3)
-- Register timers to make transports vulnerable to enemy fire
Register_Timer(SwitchToRebel, time_to_make_transport1_vulnerable, transport1)
Register_Timer(SwitchToRebel, time_to_make_transport2_vulnerable, transport2)
Register_Timer(SwitchToRebel, time_to_make_transport3_vulnerable, transport3)
Register_Timer(SwitchToRebel, time_to_make_transport4_vulnerable, transport4)
-- If all of the transports are killed, the player loses
Register_Death_Event(transport1, Transport_Destroyed)
Register_Death_Event(transport2, Transport_Destroyed)
Register_Death_Event(transport3, Transport_Destroyed)
Register_Death_Event(transport4, Transport_Destroyed)
-- The player has to survive with at least one transport until this timer, then escape
--Register_Timer(Get_Plans, time_to_get_plans)
end
function MoveTransportsToStarbase()
if not flag_shuttles_escaping then
transport1 = Find_Hint("RM09_ALLIANCE_SHUTTLE", "1")
transport2 = Find_Hint("RM09_ALLIANCE_SHUTTLE", "2")
transport3 = Find_Hint("RM09_ALLIANCE_SHUTTLE", "3")
transport4 = Find_Hint("RM09_ALLIANCE_SHUTTLE", "4")
transport1_move_to = Find_Hint("GENERIC_MARKER_SPACE", "transport1moveto")
transport2_move_to = Find_Hint("GENERIC_MARKER_SPACE", "transport2moveto")
transport3_move_to = Find_Hint("GENERIC_MARKER_SPACE", "transport3moveto")
transport4_move_to = Find_Hint("GENERIC_MARKER_SPACE", "transport4moveto")
if TestValid(transport1) then
transport1.Move_To(transport1_move_to)
end
if TestValid(transport2) then
transport2.Move_To(transport2_move_to)
end
if TestValid(transport3) then
transport3.Move_To(transport3_move_to)
end
if TestValid(transport4) then
transport4.Move_To(transport4_move_to)
end
end
end
function Exit_Prox(prox_obj, trigger_obj)
--MessageBox("Rebel unit close to marker")
if trigger_obj == transport1 or trigger_obj == transport2 or trigger_obj == transport3 or trigger_obj == transport4 then
Story_Event("shuttles_clear")
prox_obj.Cancel_Event_Object_In_Range(Exit_Prox)
end
end
function Wake_Sats()
for i, sat in pairs(sat_list) do
if TestValid(sat) then
sat.Prevent_AI_Usage(false)
sat.Prevent_Opportunity_Fire(false)
sat.Prevent_All_Fire(false)
--flagging sats here
sat.Highlight(true)
Add_Radar_Blip(sat, "somename")
end
end
Story_Event("sats_awake")
end
-- Turn on AI and target of opportunity fire by and for all units of a given type and hint in the table
function Wake_Units(unit_type_table)
if unit_type_table == wakeup_table_1 then
Story_Event("batch_1_wake")
elseif unit_type_table == wakeup_table_2 then
Story_Event("batch_2_wake")
elseif unit_type_table == wakeup_table_3 then
Story_Event("batch_3_wake")
end
for i, type_and_hint in pairs(unit_type_table) do
unit = Find_Hint(type_and_hint[1], type_and_hint[2])
if TestValid(unit) then
unit.Prevent_AI_Usage(false)
unit.Prevent_Opportunity_Fire(false)
unit.Suspend_Locomotor(false)
unit.Prevent_All_Fire(false)
--jdg flags these guys
unit.Highlight(true)
Add_Radar_Blip(unit, "somename")
else
return
end
end
end
-- Make units vulnerable by setting them as player units (but not selectable/controllable)
function SwitchToRebel(unit)
unit.Set_Selectable(false)
unit.Change_Owner(rebel_player)
--unit.Prevent_Opportunity_Fire(false)
unit.Suspend_Locomotor(true)
unit.Prevent_All_Fire(true)
end
function State_M09_Plans_Recovered(message)
if message == OnEnter then
if not flag_shuttles_escaping then
flag_shuttles_escaping = true
-- Make transports move to an exit point
if TestValid(transport1) then
--transport1.Set_Selectable(true)
transport1.Suspend_Locomotor(false)
transport1.Move_To(exit_marker)
end
if TestValid(transport2) then
--transport2.Set_Selectable(true)
transport2.Suspend_Locomotor(false)
transport2.Move_To(exit_marker)
end
if TestValid(transport3) then
--transport3.Set_Selectable(true)
transport3.Suspend_Locomotor(false)
transport3.Move_To(exit_marker)
end
if TestValid(transport4) then
--transport4.Set_Selectable(true)
transport4.Suspend_Locomotor(false)
transport4.Move_To(exit_marker)
end
Create_Thread("Ending_Cinematic")
end
end
end
-- Here we can get functionality outside (and before) event functions
function Story_Mode_Service()
if first_time_serviced then
first_time_serviced = false
-- Turn AI off globally while we establish which units the scripted AI is allowed to use
Suspend_AI(1)
empire_player = Find_Player("Empire")
rebel_player = Find_Player("Rebel")
empire_unit_list = Find_All_Objects_Of_Type(empire_player)
for i, unit in pairs(empire_unit_list) do
--Make sure that any units which may have been given move orders
--before we had a chance to suspend the AI, now only have stop orders.
if unit.Is_Category("Corvette") or unit.Is_Category("Frigate") or unit.Is_Category("Transport")
or (unit.Is_Category("Capital") and not unit.Get_Type() == Find_Object_Type("EMPIRE_STAR_BASE_4")) then
unit.Move_To(unit.Get_Position())
end
-- Prevent the Starbase from ever firing
if unit.Get_Type() == Find_Object_Type("EMPIRE_STAR_BASE_4") then
unit.Prevent_All_Fire(true)
unit.Set_Selectable(false)
end
-- Turn on EMP effects (not working)
Hide_Sub_Object(unit, 0, "pi_damage_elec_cap00.alo")
Hide_Sub_Object(unit, 0, "pi_damage_elec_sd00.alo")
-- Turn off AI and target of opportunity fire by and for this unit
unit.Prevent_AI_Usage(true)
unit.Prevent_Opportunity_Fire(true)
unit.Suspend_Locomotor(true)
unit.Prevent_All_Fire(true)
end
-- Reenable AI globally, so that when we stop preventing ai usage for one unit, it will wake
Suspend_AI(0)
end
end
------------------------------------------------------------------------------------------------------------------------
-- dme Mission over, trigger end cinematic.
------------------------------------------------------------------------------------------------------------------------
function State_Rebel_A3_M09_Plans_Recovered_00(message)
if message == OnEnter then
Create_Thread("Ending_Cinematic")
end
end
------------------------------------------------------------------------------------------------------------------------
-- dme Ending Cinematic stuff
------------------------------------------------------------------------------------------------------------------------
function Ending_Cinematic()
Story_Event("DISABLE_ANTILLES_KILLED")
Fade_Screen_Out(.5)
Suspend_AI(1)
Lock_Controls(1)
Letter_Box_In(0)
Story_Event("START_END_CINEMATIC")
-- Ensure Antilles is still present for this cinematic
sundered_heart = Find_First_Object("SUNDERED_HEART")
if not sundered_heart then
return
end
warp_loc = Find_Hint("GENERIC_MARKER_SPACE", "warploc")
Start_Cinematic_Camera()
Fade_Screen_In(2)
-- Set_Cinematic_Camera_Key(target_pos, xoffset_dist, yoffset_pitch, zoffset_yaw, angles?, attach_object, use_object_rotation, cinematic_animation)
Set_Cinematic_Camera_Key(warp_loc, 1000, -10, -90, 1, 0, 1, 0)
-- Set_Cinematic_Camera_Key(target_pos, xoffset_dist, yoffset_pitch, zoffset_yaw, angles?, attach_object, use_object_rotation, cinematic_animation)
Set_Cinematic_Target_Key(sundered_heart, 0, 0, 0, 0, sundered_heart, 0, 0)
-- Transition_Cinematic_Camera_Key(target_pos, time, xoffset_dist, yoffset_pitch, zoffset_yaw, angles?, attach_object, use_object_rotation, cinematic_animation)
Transition_Cinematic_Camera_Key(warp_loc, 5, 200, 2.5, -37.5, 1, 0, 1, 0)
Transition_Cinematic_Camera_Key(warp_loc, 5, 200, 17, 15, 1, 0, 1, 0)
rebel = Find_Player("Rebel")
Start_Cinematic_Space_Retreat(rebel.Get_ID(), 8)
Sleep(4)
Story_Event("MISSION_09_VICTORY")
Sleep(3.9)
Set_Cinematic_Target_Key(sundered_heart, 0, 0, 0, 0, 0, 0, 0)
End_Cinematic_Camera()
end