//////////////////////////////////////////////////////////////////////////////// /* Script Type: Cutscene Script; Cutscene 1 Description: Introductory cutscene - Helper function: MakeSpouse creates an npc of the opposite gender from player for plot purposes - Helper function: DecreasePCCopySpeed decreases the PCCopy's speed to normal, depending on the class of the player - 3 additional cutaction type helper functions implemented Related Scripts: cs1_onenter */ //////////////////////////////////////////////////////////////////////////////// #include "x2_inc_cutscene" #include "inc_common_funcs" object MakeSpouse(object oPC, location lSpouse); void DecreasePCCopySpeed(object oPCCopy); void CutSoundObjectPlay(float fDelay, object oSound, int iShift = TRUE); void CallSoundObjectPlay(int nCutscene, object oSound); void CutChangeActorFaction(float fDelay, object oActor, int iShift = TRUE); void CallChangeActorFaction(int nCutscene, object oActor); // void CutSetCameraHeight(float fDelay, object oPC, float fHeight, int iShift = TRUE); // void CallSetCameraHeight(int nCutscene, object oPC, float fHeight); void CutEndCS1(float fDelay, object oPC, int iShift = TRUE); void CallEndCS1(int nCutscene, object oPC); void main() { object oPC = GetFirstPC(); object oPCCopy; object oSpouse; object oAssailant; object oPolice; object oBellSound; // Declare location location lSpouse = GetLocation(GetWaypointByTag("wp_cs1_spouse1")); // Declare effects effect eGhost = EffectCutsceneGhost(); effect eSlowWalk = EffectMovementSpeedDecrease(30); effect eFreeze = EffectCutsceneParalyze(); BlackScreen(oPC); // These effects need to be removed manually after CutDisableCutscene (use RemoveAllEffects helper function) ApplyCutEffects(oPC); // Create PCCopy and set walking speed oPCCopy = CutCreatePCCopy(oPC, GetLocation(GetWaypointByTag("wp_cs1_pccopy0")), "pcCopy"); DecreasePCCopySpeed(oPCCopy); // Create Spouse if (!(GetLocalInt(oPC, "madeSpouse") == 1)) { oSpouse = MakeSpouse(oPC, lSpouse); SetLocalInt(oPC, "madeSpouse", 1); } // Declare other objects oAssailant = GetObjectByTag("UnknownAssailant"); oPolice = GetObjectByTag("Cs1Officer"); oBellSound = GetObjectByTag("Cs1BellTowerRings"); // Apply Effects ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oPCCopy); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSlowWalk, oSpouse); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oSpouse); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oPolice); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oAssailant); // Set Active Cutscene CutSetActiveCutscene(1, CUT_DELAY_TYPE_CONSTANT); CutSetActiveCutsceneForObject(oPC, 1, TRUE); CutSetActiveCutsceneForObject(oPCCopy, 1); CutSetActiveCutsceneForObject(oSpouse, 1); CutSetActiveCutsceneForObject(oAssailant, 1); CutSetActiveCutsceneForObject(oPolice, 1); CutSetActiveCutsceneForObject(oBellSound, 1); //CutSetAbortDelay(1, 2.0); //CutSetDestroyCopyDelay(1, 1.0); // Cutscene Settings CutSetCutsceneMode(0.0, oPC, TRUE, CUT_CAMERA_HEIGHT_LOW, TRUE, FALSE); CutFadeFromBlack(0.2, oPC, FADE_SPEED_SLOWEST); CutSetCameraSpeed(0.3, oPC, 1.0); CutFadeToBlack(124.5, oPC, FADE_SPEED_MEDIUM); CutFadeFromBlack(126.5, oPC, FADE_SPEED_SLOW); CutFadeToBlack(133.0, oPC, FADE_SPEED_SLOW); // ApplyEffects CutApplyEffectToObject2(118.7, DURATION_TYPE_INSTANT, eFreeze, oSpouse); // Camera Facings CutSetCamera(0.0, oPC, CAMERA_MODE_TOP_DOWN, 70.0, 25.0, 50.0, CAMERA_TRANSITION_TYPE_SNAP); CutSetCamera(0.5, oPC, CAMERA_MODE_TOP_DOWN, 40.0, 6.5, 78.0, CAMERA_TRANSITION_TYPE_MEDIUM); CutSetCamera(17.3, oPC, CAMERA_MODE_TOP_DOWN, 330.0, 6.5, 80.0, CAMERA_TRANSITION_TYPE_SNAP); CutSetCamera(24.2, oPC, CAMERA_MODE_TOP_DOWN, 60.0, 7.5, 75.0, CAMERA_TRANSITION_TYPE_SNAP); CutSetCamera(39.5, oPC, CAMERA_MODE_TOP_DOWN, 292.0, 8.0, 89.0, CAMERA_TRANSITION_TYPE_SNAP); CutSetCamera(53.25, oPC, CAMERA_MODE_TOP_DOWN, 195.0, 16.5, 65.0, CAMERA_TRANSITION_TYPE_SLOW); CutSetCamera(64.6, oPC, CAMERA_MODE_TOP_DOWN, 90.0, 15.5, 55.0, CAMERA_TRANSITION_TYPE_SLOW); CutSetCamera(70.75, oPC, CAMERA_MODE_TOP_DOWN, 16.0, 16.0, 89.0, CAMERA_TRANSITION_TYPE_SLOW); CutSetCamera(87.0, oPC, CAMERA_MODE_TOP_DOWN, 338.0, 10.5, 80.0, CAMERA_TRANSITION_TYPE_SLOW); CutSetCamera(99.5, oPC, CAMERA_MODE_TOP_DOWN, 200.0, 8.5, 85.0, CAMERA_TRANSITION_TYPE_SNAP); CutSetCamera(112.5, oPC, CAMERA_MODE_TOP_DOWN, 25.0, 10.0, 65.5, CAMERA_TRANSITION_TYPE_SNAP); CutSetCamera(115.5, oPC, CAMERA_MODE_TOP_DOWN, 160.0, 1.0, 85.0, CAMERA_TRANSITION_TYPE_SNAP); CutSetCamera(126.0, oPC, CAMERA_MODE_TOP_DOWN, 75.0, 7.7, 15.0, CAMERA_TRANSITION_TYPE_SNAP); CutSetCamera(127.6, oPC, CAMERA_MODE_TOP_DOWN, 75.0, 25.0, 45.0, CAMERA_TRANSITION_TYPE_SLOW); // Conversation Facings CutSetFacingPoint(4.5, oPCCopy, "spouse"); CutSetFacingPoint(5.5, oSpouse, "pcCopy"); CutSetFacingPoint(61.6, oAssailant, "pcCopy"); // MoveTos CutActionMoveToLocation(1.5, oPCCopy, GetLocation(GetWaypointByTag("wp_cs1_pccopy1")), FALSE); CutActionMoveToObject(50.5, oSpouse, GetWaypointByTag("wp_cs1_spouse2"), FALSE); CutActionMoveToObject(50.75, oPCCopy, GetWaypointByTag("wp_cs1_pccopy2"), FALSE); CutActionMoveToObject(53.5, oAssailant, GetWaypointByTag("wp_cs1_assailant1"), FALSE); CutActionMoveToObject(54.25, oPC, GetWaypointByTag("wp_cs1_pc1"), TRUE); CutActionMoveToObject(64.5, oPC, GetWaypointByTag("wp_cs1_pc2"), TRUE); CutJumpToLocation(101.0, oPolice, GetLocation(GetWaypointByTag("wp_cs1_police1"))); CutActionMoveToObject(112.7, oPolice, oAssailant, TRUE); CutJumpToObject(117.8, oSpouse, GetWaypointByTag("wp_cs1_spouse3")); CutActionMoveToObject(121.5, oAssailant, GetWaypointByTag("wp_cs1_assailant2"), TRUE); CutActionMoveToObject(124.6, oPCCopy, oSpouse, TRUE); // SpeakStrings CutSpeakString(5.0, oPCCopy, "You know, you don't have to walk me back home from the station at the end of every workday."); CutSpeakString(17.5, oSpouse, "Hmm? You would prefer to walk alone then, eh?"); CutSpeakString(24.4, oPCCopy, "Of course not you silly!"); CutSpeakString(28.8, oPCCopy, "But now that we have our baby, some of our old habits just have to go."); CutSpeakString(39.7, oSpouse, "I know, I know. But we're so nearby..."); CutSpeakString(45.8, oSpouse, "Well, let's go home to our girl!"); CutBeginConversation(62.0, oPCCopy, oAssailant, "cs1_conv1"); CutSpeakString(69.0, oPCCopy, "I'm sorry, but, who are you?"); CutBeginConversation(74.0, oPCCopy, oAssailant, "cs1_conv2"); CutSpeakString(78.0, oAssailant, "You killed my son! My wife died a broken woman because of you!"); CutSpeakString(87.3, oPCCopy, "Good Sir... you must be mistaken..."); CutSpeakString(92.0, oPCCopy, "I'm sorry to hear your loss, but I can assure you--"); CutSpeakString(99.7, oAssailant, "No! I won't have it!"); CutSpeakString(103.0, oAssailant, "You KILLED him! You TORE my family apart!!"); CutSpeakString(108.5, oAssailant, "Well it's time to reap what you've sown!"); CutSpeakString(112.8, oPolice, "Police! You with the bow! Stop!"); if (GetGender(oSpouse) == GENDER_MALE) { CutSpeakString(117.0, oAssailant, "Damn! Stupid bastard jumped in the way!"); } else { CutSpeakString(117.0, oAssailant, "Damn! Stupid bitch jumped in the way!"); } CutSpeakString(121.0, oAssailant, "I'll get you yet, you hear?!"); if (GetGender(oSpouse) == GENDER_MALE) { CutSpeakString(127.5, oPCCopy, "Jack...?!"); } else { CutSpeakString(127.5, oPCCopy, "Jane...?!"); } if (GetGender(oSpouse) == GENDER_MALE) { CutSpeakString(129.5, oPCCopy, "JACK!!!"); } else { CutSpeakString(129.5, oPCCopy, "JANE!!!"); } CutSpeakString(131.5, oPCCopy, "N-- NOOOOOOOOOO!!!!!!!!!!!"); // Animations CutPlayAnimation(0.6, oSpouse, ANIMATION_FIREFORGET_PAUSE_BORED, 1.0); CutActionCloseDoor(0.75, oPCCopy, GetObjectByTag("police_door")); CutPlayAnimation(5.1, oPCCopy, ANIMATION_LOOPING_TALK_NORMAL, 11.5); if (GetGender(oSpouse) == GENDER_MALE) { CutPlayAnimation(17.6, oSpouse, ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD, 1.0); } else { CutPlayAnimation(17.6, oSpouse, ANIMATION_FIREFORGET_TAUNT, 1.0); } CutPlayAnimation(24.5, oPCCopy, ANIMATION_LOOPING_TALK_PLEADING, 2.0); CutPlayAnimation(28.5, oPCCopy, ANIMATION_LOOPING_TALK_NORMAL, 10.5); CutPlayAnimation(39.4, oSpouse, ANIMATION_LOOPING_TALK_NORMAL, 8.85); //CutPlayAnimation(46.1, oSpouse, ANIMATION_LOOPING_TALK_NORMAL, 1.0); CutPlayAnimation(49.0, oPCCopy, ANIMATION_LOOPING_LISTEN, 1.0); CutPlayAnimation(62.1, oAssailant, ANIMATION_LOOPING_TALK_FORCEFUL, 2.0); CutPlayAnimation(78.1, oAssailant, ANIMATION_LOOPING_TALK_FORCEFUL, 1.5); CutPlayAnimation(99.6, oAssailant, ANIMATION_LOOPING_TALK_FORCEFUL, 2.0); CutPlayAnimation(104.0, oAssailant, ANIMATION_LOOPING_PAUSE_TIRED, 4.0); CutPlayAnimation(108.6, oAssailant, ANIMATION_LOOPING_TALK_FORCEFUL, 2.0); CutPlayAnimation(117.1, oAssailant, ANIMATION_LOOPING_TALK_FORCEFUL, 3.0); CutPlayAnimation(118.0, oSpouse, ANIMATION_LOOPING_DEAD_FRONT, 1.0); CutPlayAnimation(127.4, oPCCopy, ANIMATION_LOOPING_TALK_PLEADING, 2.0); CutPlayAnimation(129.6, oPCCopy, ANIMATION_LOOPING_PAUSE_TIRED, 2.0); CutPlayAnimation(131.6, oPCCopy, ANIMATION_LOOPING_CONJURE2, 10.0); // ClearActions CutClearAllActions(61.5, oAssailant, TRUE); CutClearAllActions(62.25, oPCCopy, TRUE); CutClearAllActions(62.3, oSpouse, TRUE); CutClearAllActions(116.2, oAssailant, TRUE); // Sounds if (GetGender(oSpouse) == GENDER_MALE) { CutPlaySound(18.2, oSpouse, "vs_nx2drslm_haha"); } else { CutPlaySound(18.2, oSpouse, "vs_nx2seerf_haha"); } CutSoundObjectPlay(55.5, oBellSound); CutSetAmbient(56.9, oPC, 31); // Attack Choreography CutChangeActorFaction(115.6, oAssailant); CutActionAttack(115.7, oAssailant, oSpouse); CutChangeActorFaction(116.3, oAssailant); // End Cutscene 1, Move to Cutscene 2 CutEndCS1(135.5, oPC); } // creates a spouse of the opposite gender from the player, for plot purposes object MakeSpouse(object oPC, location lSpouse) { int nGender = GetGender(oPC); if (nGender == GENDER_FEMALE) { object oSpouse = CreateObject(OBJECT_TYPE_CREATURE, "jack", lSpouse, FALSE, "spouse"); return oSpouse; } else { object oSpouse = CreateObject(OBJECT_TYPE_CREATURE, "jane", lSpouse, FALSE, "spouse"); return oSpouse; } } // reduces the walk speed of oPCCopy to approximately normal speed to match pace // of spouse void DecreasePCCopySpeed(object oPCCopy) { effect eNormWalkBarb = EffectMovementSpeedDecrease(49); effect eNormWalk = EffectMovementSpeedDecrease(34); if (GetHasFeat(FEAT_BARBARIAN_ENDURANCE, oPCCopy)) { ApplyEffectToObject(DURATION_TYPE_PERMANENT ,eNormWalkBarb, oPCCopy); } else { ApplyEffectToObject(DURATION_TYPE_PERMANENT ,eNormWalk, oPCCopy); } } void CutSoundObjectPlay(float fDelay, object oSound, int iShift = TRUE) { int nCutscene = GetActiveCutsceneNum(); fDelay = CutCalculateCurrentDelay(fDelay, nCutscene); DelayCommand(fDelay, DelayCommand(GetShift(oSound, iShift), CallSoundObjectPlay(nCutscene, oSound))); } void CallSoundObjectPlay(int nCutscene, object oSound) { if(nCutscene == GetLocalInt(oSound, "nCutsceneNumber")) { SoundObjectPlay(oSound); } } void CutChangeActorFaction(float fDelay, object oActor, int iShift = TRUE) { int nCutscene = GetActiveCutsceneNum(); fDelay = CutCalculateCurrentDelay(fDelay, nCutscene); DelayCommand(fDelay, DelayCommand(GetShift(oActor, iShift), CallChangeActorFaction(nCutscene, oActor))); } // Change object oActor faction to hostile on first used, commoner on second use void CallChangeActorFaction(int nCutscene, object oActor) { if(nCutscene == GetLocalInt(oActor, "nCutsceneNumber")) { if (!(GetLocalInt(oActor, "changed_faction") == TRUE)) { ChangeToStandardFaction(oActor, STANDARD_FACTION_HOSTILE); SetLocalInt(oActor, "changed_faction", TRUE); } else { ChangeToStandardFaction(oActor, STANDARD_FACTION_COMMONER); } } } /* void CutSetCameraHeight(float fDelay, object oPC, float fHeight, int iShift = TRUE) { int nCutscene = GetActiveCutsceneNum(); fDelay = CutCalculateCurrentDelay(fDelay, nCutscene); DelayCommand(fDelay, DelayCommand(GetShift(oPC, iShift), CallSetCameraHeight(nCutscene, oPC, fHeight))); } void CallSetCameraHeight(int nCutscene, object oPC, float fHeight) { if(nCutscene == GetLocalInt(oPC, "nCutsceneNumber")) { SetCameraHeight(oPC, fHeight); } } */ void CutEndCS1(float fDelay, object oPC, int iShift = TRUE) { int nCutscene = GetActiveCutsceneNum(); fDelay = CutCalculateCurrentDelay(fDelay, nCutscene); DelayCommand(fDelay, DelayCommand(GetShift(oPC, iShift), CallEndCS1(nCutscene, oPC))); } // Ends cutscene 1 and moves player to cutscene 2 void CallEndCS1(int nCutscene, object oPC) { if(nCutscene == GetLocalInt(oPC, "nCutsceneNumber")) { CutResetActiveObjectsForCutscene(1); CutDisableCutscene(1, 2.0, 1.0, RESTORE_TYPE_NONE); AssignCommand(oPC, ClearAllActions()); RemoveAllEffects(oPC); AssignCommand(oPC, ActionEquipMostEffectiveArmor()); if ((GetClassByPosition(1, oPC) == CLASS_TYPE_MONK)) { AssignCommand(oPC, ActionEquipItem(GetItemPossessedBy(oPC, "PoliceArmoredGlove"), INVENTORY_SLOT_ARMS)); } else { if ((GetClassByPosition(1, oPC) == CLASS_TYPE_RANGER)) { AssignCommand(oPC, ActionEquipMostDamagingRanged()); } else { AssignCommand(oPC, ActionEquipMostDamagingMelee()); } } DelayCommand(1.0, AssignCommand(oPC, ActionJumpToObject(GetWaypointByTag("wp_cs2_pc0")))); } }