// _________________________________________________________________________________________ // _________________________________________________________________________________________ // ___ ___ // ___ Author: Sam Hackett Date: 19/07/2012 ___ // _________________________________________________________________________________________ // ___ ___ // ___ (A1) - FriendActivity file for use – FriendActivity.sc ___ // ___ ___ // _________________________________________________________________________________________ //Compile out Title Update changes to header functions. //Must be before includes. //CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R. USING "rage_builtins.sch" USING "globals.sch" USING "model_enums.sch" USING "commands_streaming.sch" USING "script_blips.sch" //- commands headers -// //- script headers -// //- public headers -// USING "cellphone_public.sch" USING "cutscene_public.sch" USING "friends_public.sch" USING "mission_control_public.sch" USING "mission_control_public.sch" USING "selector_public.sch" USING "timer_public.sch" //- private headers -// USING "player_scene_schedule.sch" USING "friendActivity_pickup_private.sch" USING "friendActivity_journey_private.sch" USING "friendActivity_bar_private.sch" USING "friendActivity_squad_private.sch" USING "friendActivity_dropoff_private.sch" #IF IS_DEBUG_BUILD //- debug headers -// USING "friends_debug.sch" USING "script_debug.sch" USING "shared_debug.sch" USING "code_control_public.sch" #ENDIF // ******************************************************************************************* // VARIABLES // ******************************************************************************************* BOOL gIsActivityInProgress = TRUE BOOL bAddedInitialPeds = FALSE // Widget stuff (WIDGET_ID and BOOL and INT and FLOAT and VECTOR) #IF IS_DEBUG_BUILD WIDGET_GROUP_ID friend_activitys_widget INT debug_iCurActivityState BOOL debug_bRegisterATextMessage // BOOL debug_bDisplayFriend // BOOL debug_bJumpToDropoffOnfoot // BOOL debug_bJumpToDropoffIncar #ENDIF // ******************************************************************************************* // GENERAL FUNCTIONS AND PROCEDURES // ******************************************************************************************* //PURPOSE: Stores the most recent friend for hospital cutscene (needs to store here rather than on pickup, in case player switched since then) FUNC BOOL Private_StoreRecentFriend() enumCharacterList ePlayerChar = GET_CURRENT_PLAYER_PED_ENUM() enumCharacterList eChar REPEAT MAX_BATTLE_BUDDIES eChar IF ePlayerChar <> eChar AND Private_HasSoldierBeenAvailable(gActivity.mSoldiers[eChar], FALSE) g_eRecentFriendChar = eChar CPRINTLN(DEBUG_FRIENDS, "Priavte_StoreRecentFriend() - ", GetLabel_enumCharacterList(g_eRecentFriendChar), " (soldier)") RETURN TRUE ENDIF ENDREPEAT IF gActivity.mFriendA.bWasPickedUp g_eRecentFriendChar = gActivity.mFriendA.eChar CPRINTLN(DEBUG_FRIENDS, "Priavte_StoreRecentFriend() - ", GetLabel_enumCharacterList(g_eRecentFriendChar), " (friendA)") RETURN TRUE ENDIF IF gActivity.mFriendB.bWasPickedUp g_eRecentFriendChar = gActivity.mFriendB.eChar CPRINTLN(DEBUG_FRIENDS, "Priavte_StoreRecentFriend() - ", GetLabel_enumCharacterList(g_eRecentFriendChar), " (friendB)") RETURN TRUE ENDIF CPRINTLN(DEBUG_FRIENDS, "Priavte_StoreRecentFriend() - no-one to store") g_eRecentFriendChar = NO_CHARACTER RETURN FALSE ENDFUNC //PURPOSE: Called on completion of the mission to release memory used for models etc PROC FriendActivity_Cleanup() IF bAddedInitialPeds // Cleanup each activity member... Private_CleanupFriend(gActivity.mPlayer, MC_AmbientWander) Private_CleanupFriend(gActivity.mFriendA, MC_AmbientWander) Private_CleanupFriend(gActivity.mFriendB, MC_AmbientWander) // Cleanup each squad member... INT i REPEAT MAX_BATTLE_BUDDIES i Private_CleanupSoldier(gActivity.mSoldiers[i]) // TODO: This needs working out ENDREPEAT PRIVATE_SET_FRIEND_A_PED_ID(null) PRIVATE_SET_FRIEND_B_PED_ID(null) // Remove anim dicts Private_ReleaseFriendPickupResources() // Destroy scripted cams SET_CINEMATIC_BUTTON_ACTIVE(TRUE) #IF IS_DEBUG_BUILD // Delete the mission widget IF DOES_WIDGET_GROUP_EXIST(friend_activitys_widget) DELETE_WIDGET_GROUP(friend_activitys_widget) ENDIF #ENDIF // Kill mission text link SET_GAME_PAUSED(FALSE) KILL_FACE_TO_FACE_CONVERSATION() // Restore stirp club IF gActivity.bRestoreStripClub SET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_MINIGAME_ACTIVE, ENUM_TO_INT(MINIGAME_STRIPCLUB), TRUE) ENDIF // Unblock scenarios at dropoff (if necessary) // Private_ClearDropoffScenarioBlocking() // Reset relgroups the soldiers may have set the playergroup to hate // BBUDDIES REMOVED // Private_ResetHatedRelGroups() #IF IS_DEBUG_BUILD SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(FALSE) #ENDIF ENDIF // Clear adhoc location Private_ClearAdhocFriendLoc() // Clearing Load Scene IF IS_NEW_LOAD_SCENE_ACTIVE() NEW_LOAD_SCENE_STOP() ENDIF // Reset battle buddy behaviour // RESET_ALL_BATTLEBUDDY_BEHAVIOUR_REQUESTS() // Reset flags g_bitfieldFriendFlags = 0 g_bitfieldBattleBuddyAvailable = 0 g_bitfieldBattleBuddyOverridden = 0 // Enable selector and ambient player creation g_bSupressAmbientPlayersForFriendActivity = FALSE // Reset any friend connections that are active (in case player is third party) g_SavedGlobals.sFriendsData.g_FriendScriptThread = 0 DEACTIVATE_ALL_CONNECTIONS() // Restore location blips IF gActivity.bRestoreLocationBlips Private_RestoreLocationBlips() gActivity.bRestoreLocationBlips = FALSE ENDIF IF (gActivity.iCandidateID <> NO_CANDIDATE_ID) CPRINTLN(DEBUG_FRIENDS, "FriendActivity_Cleanup() - Candidate ID: ", gActivity.iCandidateID) Mission_Over(gActivity.iCandidateID) ELSE CPRINTLN(DEBUG_FRIENDS, "FriendActivity_Cleanup() - No candidate ID") ENDIF TERMINATE_THIS_THREAD() ENDPROC //PURPOSE: Called on successful completion of the mission PROC FriendActivity_Passed() CLEAR_PRINTS() MAKE_AUTOSAVE_REQUEST() gIsActivityInProgress = FALSE ENDPROC //PURPOSE: Called when mission had been failed. Currently ends PROC FriendActivity_Failed(enumActivityFailReason eFail) #IF IS_DEBUG_BUILD IF gActivity.mPlayer.eState <> FRIEND_NULL AND Private_IsPlayerThirdParty() CPRINTLN(DEBUG_FRIENDS, "FriendActivity_Failed() - Player is third party - no text messages will be sent") ENDIF #ENDIF enumCharacterList ePlayerChar = GET_CURRENT_PLAYER_PED_ENUM() IF gActivity.eLogFailCharA <> NO_CHARACTER PLAYSTATS_FRIEND_ACTIVITY(ENUM_TO_INT(gActivity.eLogFailCharA), 1) ENDIF IF gActivity.eLogFailCharB <> NO_CHARACTER AND gActivity.eLogFailCharB <> gActivity.eLogFailCharA PLAYSTATS_FRIEND_ACTIVITY(ENUM_TO_INT(gActivity.eLogFailCharB), 1) ENDIF SWITCH eFail #IF IS_DEBUG_BUILD CASE FAF_Debug CPRINTLN(DEBUG_FRIENDS, "FriendActivity_Failed: FAF_Debug") PRINT_NOW("FR_X_DEBUG", DEFAULT_GOD_TEXT_TIME, 0) BREAK #ENDIF // Player - multiplayer -------------------------------------------------- CASE FAF_Multiplayer CPRINTLN(DEBUG_FRIENDS, "FriendActivity_Failed: FAF_Multiplayer") BREAK // Player - death/arrest ------------------------------------------------- CASE FAF_PlayerDeathArrest CPRINTLN(DEBUG_FRIENDS, "FriendActivity_Failed: FAF_PlayerDeathArrest") enumFriendTextMessage eTxtMessage IF IS_PLAYER_BEING_ARRESTED(PLAYER_ID()) eTxtMessage = FTM_PLAYER_BUSTED ELSE eTxtMessage = FTM_PLAYER_DIED Private_StoreRecentFriend() // Flags to Alwyns respawn controller that it should do some dialogue about dying with the friend ENDIF IF ePlayerChar <> CHAR_MICHAEL AND Private_HasSoldierBeenAvailable(gActivity.mSoldiers[CHAR_MICHAEL], TRUE) REGISTERED_FRIEND_TEXT_MESSAGE_TO_PLAYER(ePlayerChar, CHAR_MICHAEL, eTxtMessage) ELIF ePlayerChar <> CHAR_FRANKLIN AND Private_HasSoldierBeenAvailable(gActivity.mSoldiers[CHAR_FRANKLIN], TRUE) REGISTERED_FRIEND_TEXT_MESSAGE_TO_PLAYER(ePlayerChar, CHAR_FRANKLIN, eTxtMessage) ELIF ePlayerChar <> CHAR_TREVOR AND Private_HasSoldierBeenAvailable(gActivity.mSoldiers[CHAR_TREVOR], TRUE) REGISTERED_FRIEND_TEXT_MESSAGE_TO_PLAYER(ePlayerChar, CHAR_TREVOR, eTxtMessage) ELIF ePlayerChar <> CHAR_MICHAEL AND Private_HasSoldierBeenAvailable(gActivity.mSoldiers[CHAR_MICHAEL], FALSE) REGISTERED_FRIEND_TEXT_MESSAGE_TO_PLAYER(ePlayerChar, CHAR_MICHAEL, eTxtMessage) ELIF ePlayerChar <> CHAR_FRANKLIN AND Private_HasSoldierBeenAvailable(gActivity.mSoldiers[CHAR_FRANKLIN], FALSE) REGISTERED_FRIEND_TEXT_MESSAGE_TO_PLAYER(ePlayerChar, CHAR_FRANKLIN, eTxtMessage) ELIF ePlayerChar <> CHAR_TREVOR AND Private_HasSoldierBeenAvailable(gActivity.mSoldiers[CHAR_TREVOR], FALSE) REGISTERED_FRIEND_TEXT_MESSAGE_TO_PLAYER(ePlayerChar, CHAR_TREVOR, eTxtMessage) ELIF gActivity.mPlayer.eState = FRIEND_NULL OR NOT Private_IsPlayerThirdParty() IF gActivity.mFriendA.eState <> FRIEND_NULL REGISTERED_FRIEND_TEXT_MESSAGE_TO_PLAYER(ePlayerChar, gActivity.mFriendA.eChar, eTxtMessage) ELIF gActivity.mFriendB.eState <> FRIEND_NULL REGISTERED_FRIEND_TEXT_MESSAGE_TO_PLAYER(ePlayerChar, gActivity.mFriendB.eChar, eTxtMessage) ENDIF ENDIF BREAK // Player - on mission --------------------------------------------------- CASE FAF_PlayerOnMission CPRINTLN(DEBUG_FRIENDS, "FriendActivity_Failed: FAF_PlayerOnMission") BREAK // Player - switched ----------------------------------------------------- CASE FAF_PlayerSwitch CPRINTLN(DEBUG_FRIENDS, "FriendActivity_Failed: FAF_PlayerSwitch") // PRINT_HELP("FR_X_CANCEL") // The friend activity has been cancelled. BREAK // Retry abort ----------------------------------------------------------- CASE FAF_RetryAbort CPRINTLN(DEBUG_FRIENDS, "FriendActivity_Failed: FAF_RetryAbort") // Delete all members Private_CleanupSoldier(gActivity.mSoldiers[0], MC_Delete) Private_CleanupSoldier(gActivity.mSoldiers[1], MC_Delete) Private_CleanupSoldier(gActivity.mSoldiers[2], MC_Delete) Private_CleanupFriend(gActivity.mPlayer, MC_Delete) Private_CleanupFriend(gActivity.mFriendA, MC_Delete) Private_CleanupFriend(gActivity.mFriendB, MC_Delete) BREAK // Playback abort -------------------------------------------------------- CASE FAF_PlaybackAbort CPRINTLN(DEBUG_FRIENDS, "FriendActivity_Failed: FAF_PlaybackAbort") // Delete all members Private_CleanupSoldier(gActivity.mSoldiers[0], MC_DeletePedAndCar) Private_CleanupSoldier(gActivity.mSoldiers[1], MC_DeletePedAndCar) Private_CleanupSoldier(gActivity.mSoldiers[2], MC_DeletePedAndCar) Private_CleanupFriend(gActivity.mPlayer, MC_DeletePedAndCar) Private_CleanupFriend(gActivity.mFriendA, MC_DeletePedAndCar) Private_CleanupFriend(gActivity.mFriendB, MC_DeletePedAndCar) BREAK // Member fails... CASE FAF_MemberFail // TODO: Add FRIEND_FAIL_REMOVED and differentiate from FRIEND_CANCEL. Then make the cancel one print "cancelled" fail reason BREAK DEFAULT CPRINTLN(DEBUG_FRIENDS, "FriendActivity_Failed: UNKNOWN enumActivityFailReason") SCRIPT_ASSERT("FriendActivity_Failed: UNKNOWN enumActivityFailReason") BREAK ENDSWITCH // Push text messages into comms manager queue IF eFail <> FAF_Multiplayer Private_FlushTextMessageQueue() ENDIF gIsActivityInProgress = FALSE ENDPROC #IF IS_DEBUG_BUILD // ******************************************************************************************* // DEBUGGING FUNCTIONS AND PROCEDURES // ******************************************************************************************* PROC DEBUG_DisplayGeneralInfo() // Print activity state DrawFriendLiteralString(GetLabel_enumActivityState(gActivity.mState), 1, HUD_COLOUR_GREY) // Print dialogue state TEXT_LABEL_63 tDialogueState = GetLabel_enumFriendDialogueState(gActivity.mDialogue.eState) tDialogueState += ": " IF IS_TIMER_STARTED(gActivity.mDialogue.mGeneralTimer) tDialogueState += GET_STRING_FROM_MILISECONDS(ROUND(GET_TIMER_IN_SECONDS(gActivity.mDialogue.mGeneralTimer) * 1000.0)) ENDIF DrawFriendLiteralString(tDialogueState, 2, HUD_COLOUR_GREYLIGHT) // TEXT_LABEL_63 tDialogueState = "General timer: " // IF IS_TIMER_STARTED(gActivity.mDialogue.mGeneralTimer) // tDialogueState += GET_STRING_FROM_MILISECONDS(ROUND(GET_TIMER_IN_SECONDS(gActivity.mDialogue.mGeneralTimer) * 1000.0)) // ENDIF // DrawFriendLiteralString(tDialogueState, 2, HUD_COLOUR_GREYLIGHT) tDialogueState = "Chat timer: " IF IS_TIMER_STARTED(gActivity.mDialogue.mChatTimer) tDialogueState += GET_STRING_FROM_MILISECONDS(ROUND(GET_TIMER_IN_SECONDS(gActivity.mDialogue.mChatTimer) * 1000.0)) ENDIF DrawFriendLiteralString(tDialogueState, 3, HUD_COLOUR_GREYLIGHT) // IF gActivity.mDialogue.eState <> gActivity.mDialogue.eDefaultState // TEXT_LABEL_63 tDefaultState = GetLabel_enumFriendDialogueState(gActivity.mDialogue.eDefaultState) // DrawFriendLiteralString(tDefaultState, 3, HUD_COLOUR_GREYDARK) // ENDIF // Print dialogue chat timer // IF gActivity.mDialogue.eState = FDIALOGUE_JOURNEY_IDLE // TEXT_LABEL_63 tTimerState = "Chat:" // IF IS_TIMER_STARTED(gActivity.mDialogue.mGeneralTimer) // tTimerState += GET_STRING_FROM_MILISECONDS(ROUND(GET_TIMER_IN_SECONDS(gActivity.mDialogue.mChatTimer) * 1000.0)) // ENDIF // // DrawFriendLiteralString(tTimerState, 3, HUD_COLOUR_GREY) // ENDIF // IF IS_TIMER_STARTED(gActivity.mDialogue.mGeneralTimer) // tDialogueState += " g" // tDialogueState += FLOOR(GET_TIMER_IN_SECONDS(gActivity.mDialogue.mGeneralTimer)) // ENDIF // IF IS_TIMER_STARTED(gActivity.mDialogue.mChatTimer) // tDialogueState += " c" // tDialogueState += FLOOR(GET_TIMER_IN_SECONDS(gActivity.mDialogue.mChatTimer)) // ENDIF // tDialogueState += " / " // tDialogueState += GetLabel_enumFriendAudioState(gActivity.mAudio.eState) // DrawFriendLiteralString(tDialogueState, 2, HUD_COLOUR_GREY) ENDPROC //PURPOSE: Initialises the mission widget PROC Create_FriendActivity_Widget() INT iWidget TEXT_LABEL_63 str = "friendActivity.sc - " str += GetLabel_enumCharacterList(gActivity.mFriendA.eChar) friend_activitys_widget = START_WIDGET_GROUP(str) START_NEW_WIDGET_COMBO() REPEAT COUNT_OF(enumActivityState) iWidget ADD_TO_WIDGET_COMBO(GetLabel_enumActivityState(INT_TO_ENUM(enumActivityState, iWidget))) ENDREPEAT STOP_WIDGET_COMBO("debug_iCurActivityState", debug_iCurActivityState) ADD_WIDGET_INT_SLIDER("gActivity.iVisitedCount", gActivity.iVisitedCount, 0, CONST_iMaxVisitedLocations, 1) ADD_WIDGET_BOOL("bRegisterATextMessage", debug_bRegisterATextMessage) STOP_WIDGET_GROUP() ENDPROC //PROC DEBUG_Get_Row_For_DrawFriendLiteralString() // // iACTIVITY_DRAW_ROW = 5 // // IF g_iDebugSelectedFriendConnDisplay > 0 // IF g_iDebugSelectedFriendConnDisplay = 1 // //F8 display is on // enumFamilyMember loopAsStrandID // REPEAT NUM_OF_PLAYABLE_PEDS loopAsStrandID // TIMEOFDAY sLastTimeActive = g_savedGlobals.sPlayerData.sInfo.sLastTimeActive[loopAsStrandID] // IF Is_TimeOfDay_Valid(sLastTimeActive) // iACTIVITY_DRAW_ROW++ // ENDIF // ENDREPEAT // // ELIF g_iDebugSelectedFriendConnDisplay = 2 // //F10 display is on // iACTIVITY_DRAW_ROW = 4 // ELSE // //some other display is on??? // CPRINTLN(DEBUG_FRIENDS, "g_iDebugSelectedFriendConnDisplay: ", g_iDebugSelectedFriendConnDisplay) // ENDIF // ENDIF // // BOOL bBefore = FALSE // enumFriendConnection connID // REPEAT MAX_FRIEND_CONNECTIONS connID // enumFriend friendA_ID = g_SavedGlobals.sFriendsData.g_FriendConnectData[connID].friendA // enumFriend friendB_ID = g_SavedGlobals.sFriendsData.g_FriendConnectData[connID].friendB // // enumCharacterList friendA_CharID = GET_CHAR_FROM_FRIEND(friendA_ID) // enumCharacterList friendB_CharID = GET_CHAR_FROM_FRIEND(friendB_ID) // // IF HAVE_CHARS_ARRANGED_FRIEND_ACTIVITY(friendA_CharID, friendB_CharID) // IF ((gActivity.mPlayer.eChar = friendA_CharID) AND (gActivity.mFriendA.eChar = friendB_CharID)) // OR ((gActivity.mPlayer.eChar = friendB_CharID) AND (gActivity.mFriendA.eChar = friendA_CharID)) // bBefore = TRUE // ELSE // IF NOT bBefore // iACTIVITY_DRAW_ROW += 4 // ENDIF // ENDIF // ENDIF // ENDREPEAT // //ENDPROC //PURPOSE: Moniters for any changes in the mission widget PROC Watch_FriendActivity_Widget() debug_iCurActivityState = ENUM_TO_INT(gActivity.mState) IF debug_bRegisterATextMessage enumFriendTextMessage eFriendTextMessage = INT_TO_ENUM(enumFriendTextMessage, GET_RANDOM_INT_IN_RANGE(0, ENUM_TO_INT(MAX_FRIEND_TEXT_MESSAGES))) IF gActivity.mPlayer.eChar <> NO_CHARACTER g_iCharWaitTime[gActivity.mPlayer.eChar] = GET_GAME_TIMER() ENDIF IF gActivity.mFriendA.eChar <> NO_CHARACTER g_iCharWaitTime[gActivity.mFriendA.eChar] = GET_GAME_TIMER() ENDIF IF REGISTERED_FRIEND_TEXT_MESSAGE_TO_PLAYER(gActivity.mPlayer.eChar, gActivity.mFriendA.eChar, eFriendTextMessage) debug_bRegisterATextMessage = FALSE ENDIF ENDIF ENDPROC PROC DEBUG_GetJumpLocationText(enumActivityLocation eJumpLoc, TEXT_LABEL_63& tLocName, INT& Red, INT& Green, INT& Blue) INT iAlpha IF eJumpLoc = MAX_ACTIVITY_LOCATIONS IF gActivity.iVisitedCount > 0 GET_HUD_COLOUR(HUD_COLOUR_PURE_WHITE, Red, Green, Blue, iAlpha) ELSE GET_HUD_COLOUR(HUD_COLOUR_RED, Red, Green, Blue, iAlpha) ENDIF tLocName = "Dropoff" ELIF eJumpLoc = ALOC_suspendFriends GET_HUD_COLOUR(HUD_COLOUR_PURE_WHITE, Red, Green, Blue, iAlpha) tLocName = "Cancel warp" ELSE // Check if visited already BOOL bAlreadyVisited = IS_EXTENDED_BIT_SET(gActivity.bitsVisitedActivities, ENUM_TO_INT(g_ActivityLocations[eJumpLoc].type)) structBits64 emptyBits RESET_EXTENDED_BITS(emptyBits) // Determine text colour IF Private_IsLocationAvailable(eJumpLoc, gActivity.mPlayer.eChar, gActivity.mFriendA.eChar, gActivity.mFriendB.eChar, emptyBits, emptyBits, gActivity.eDropoffLoc, IS_CINEMA_OPEN_NOW(), IS_GOLF_OPEN_NOW(), FALSE) // NB: Tell it there are no visited locations, so we can get visited ones, then colour them yellow if visited IF NOT bAlreadyVisited GET_HUD_COLOUR(HUD_COLOUR_PURE_WHITE, Red, Green, Blue, iAlpha) ELSE GET_HUD_COLOUR(HUD_COLOUR_GREY, Red, Green, Blue, iAlpha) ENDIF ELSE GET_HUD_COLOUR(HUD_COLOUR_RED, Red, Green, Blue, iAlpha) ENDIF tLocName = GetLabel_enumActivityLocation(eJumpLoc) ENDIF ENDPROC PROC DEBUG_SelectJumpLocation(enumActivityLocation &eJumpLoc) WHILE IS_KEYBOARD_KEY_PRESSED(KEY_J) //-- Update key input INT iJumpLoc = ENUM_TO_INT(eJumpLoc) INT iMAX_LOCATIONS = ENUM_TO_INT(MAX_ACTIVITY_LOCATIONS) IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_H) iJumpLoc-- IF iJumpLoc < 0 iJumpLoc = iMAX_LOCATIONS ENDIF ENDIF IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_K) iJumpLoc++ IF iJumpLoc > iMAX_LOCATIONS iJumpLoc = 0 ENDIF ENDIF INT iPrevLoc = iJumpLoc - 1 IF iPrevLoc < 0 iPrevLoc = iMAX_LOCATIONS ENDIF INT iNextLoc = ENUM_TO_INT(iJumpLoc) + 1 IF iNextLoc > iMAX_LOCATIONS iNextLoc = 0 ENDIF eJumpLoc = INT_TO_ENUM(enumActivityLocation, iJumpLoc) enumActivityLocation ePrevLoc = INT_TO_ENUM(enumActivityLocation, iPrevLoc) enumActivityLocation eNextLoc = INT_TO_ENUM(enumActivityLocation, iNextLoc) //-- Display current selection CONST_FLOAT fDEBUG_TEXT_SCALE 0.5 CONST_FLOAT fDEBUG_TEXT_CENTRE_X 0.40 CONST_FLOAT fDEBUG_TEXT_CENTRE_Y 0.75 SET_TEXT_SCALE(fDEBUG_TEXT_SCALE, fDEBUG_TEXT_SCALE) INT JumpRed=0, JumpGreen=0, JumpBlue=0 INT PrevRed=0, PrevGreen=0, PrevBlue=0 INT NextRed=0, NextGreen=0, NextBlue=0 TEXT_LABEL_63 tJumpLocName = "", tPrevLocName = "", tNextLocName = "" DEBUG_GetJumpLocationText(eJumpLoc, tJumpLocName, JumpRed, JumpGreen, JumpBlue) DEBUG_GetJumpLocationText(ePrevLoc, tPrevLocName, PrevRed, PrevGreen, PrevBlue) DEBUG_GetJumpLocationText(eNextLoc, tNextLocName, NextRed, NextGreen, NextBlue) // Display current selection SET_TEXT_COLOUR(JumpRed, JumpGreen, JumpBlue, 255) DISPLAY_TEXT_WITH_LITERAL_STRING(fDEBUG_TEXT_CENTRE_X, fDEBUG_TEXT_CENTRE_Y, "FR_DEBUG_J", tJumpLocName) // Display previous selection SET_TEXT_SCALE(fDEBUG_TEXT_SCALE*0.9, fDEBUG_TEXT_SCALE*0.9) SET_TEXT_COLOUR(PrevRed, PrevGreen, PrevBlue, 128) DISPLAY_TEXT_WITH_LITERAL_STRING(fDEBUG_TEXT_CENTRE_X-0.05, fDEBUG_TEXT_CENTRE_Y-0.03, "STRING", tPrevLocName) // Display next selection SET_TEXT_SCALE(fDEBUG_TEXT_SCALE*0.9, fDEBUG_TEXT_SCALE*0.9) SET_TEXT_COLOUR(NextRed, NextGreen, NextBlue, 128) DISPLAY_TEXT_WITH_LITERAL_STRING(fDEBUG_TEXT_CENTRE_X+0.05, fDEBUG_TEXT_CENTRE_Y+0.03, "STRING", tNextLocName) WAIT(0) ENDWHILE ENDPROC //PURPOSE: Moniters for any keyboard inputs that would alter the mission (debug pass etc) PROC FriendActivity_Debug_Options() IF (gActivity.mState <> ACTIVITY_STATE_Pickup) AND (gActivity.mState <> ACTIVITY_STATE_Minigame) // AND (gActivity.mState <> ACTIVITY_STATE_SquadMission) IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S) Private_ClearObjective() Private_CleanupFriend(gActivity.mFriendA, MC_Delete) Private_CleanupFriend(gActivity.mFriendB, MC_Delete) INT i REPEAT MAX_BATTLE_BUDDIES i Private_CleanupSoldier(gActivity.mSoldiers[i], MC_Delete) ENDREPEAT FriendActivity_Passed() ENDIF IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F) Private_ClearObjective() Private_CleanupFriend(gActivity.mFriendA, MC_Delete) Private_CleanupFriend(gActivity.mFriendB, MC_Delete) INT i REPEAT MAX_BATTLE_BUDDIES i Private_CleanupSoldier(gActivity.mSoldiers[i], MC_Delete) ENDREPEAT FriendActivity_Failed(FAF_Debug) ENDIF ENDIF IF IS_KEYBOARD_KEY_PRESSED(KEY_J) // Jump to next mission stage IF IS_PLAYER_CONTROL_ON(PLAYER_ID()) SWITCH gActivity.mState CASE ACTIVITY_STATE_Pickup VECTOR vDriveway VECTOR vPickupJumpOffset IF gActivity.mFriendA.eState = FRIEND_PICKUP vDriveway = gActivity.mFriendA.vDriveway vPickupJumpOffset = DEBUG_GetFriendLocJumpOffset(gActivity.mFriendA.ePickup) ELIF gActivity.mFriendB.eState = FRIEND_PICKUP vDriveway = gActivity.mFriendB.vDriveway vPickupJumpOffset = DEBUG_GetFriendLocJumpOffset(gActivity.mFriendB.ePickup) ELSE EXIT // BREAK - Not sure if this would break the parsing in this language ENDIF IF NOT GET_MISSION_FLAG() // BOOL bNeedToLoadScene IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vDriveway, <<20.0, 20.0, 20.0>>) SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vDriveway+vPickupJumpOffset) SET_ENTITY_HEADING(PLAYER_PED_ID(), GET_HEADING_FROM_VECTOR_2D(-vPickupJumpOffset.x, -vPickupJumpOffset.y)) // bNeedToLoadScene = TRUE ELSE SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vDriveway) SET_ENTITY_HEADING(PLAYER_PED_ID(), GET_RANDOM_FLOAT_IN_RANGE(0.0, 360.0)) // bNeedToLoadScene = FALSE ENDIF // Force create member peds within 100m radius SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) BOOL bCreatedAllPeds bCreatedAllPeds = FALSE WHILE NOT bCreatedAllPeds bCreatedAllPeds = TRUE // IF gActivity.mPlayer.eState = FRIEND_PICKUP // IF NOT DOES_ENTITY_EXIST(gActivity.mPlayer.hPed) // VECTOR vCreatePos = g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[friend.eChar] // FLOAT fCreateRot = g_savedGlobals.sPlayerData.sInfo.fLastKnownHead[friend.eChar] // TIMEOFDAY sLastTimeActive = g_savedGlobals.sPlayerData.sInfo.sLastTimeActive[friend.eChar] // // IF Is_TIMEOFDAY_Valid(sLastTimeActive) // AND NOT HasNumOfHoursPassedSincePedTimeStruct(sLastTimeActive, 1) // AND NOT ARE_VECTORS_EQUAL(vCreatePos, <<0,0,0>>) AND (fCreateRot = 0) // IF Util_IsPedInsideRange(PLAYER_PED_ID(), vCreatePos, 100.0) // IF NOT Private_TryCreateMember_AtLastKnownPos(gActivity.mPlayer, 150, 40, TRUE) // bCreatedAllPeds = FALSE // ENDIF // ENDIF // ENDIF // ENDIF // ENDIF IF gActivity.mFriendA.eState = FRIEND_PICKUP IF NOT DOES_ENTITY_EXIST(gActivity.mFriendA.hPed) IF Util_IsPedInsideRange(PLAYER_PED_ID(), gActivity.mFriendA.vDoorstep, 100.0) IF NOT Private_TryCreateFriend_AtDest(gActivity.mFriendA, TRUE) bCreatedAllPeds = FALSE ENDIF ENDIF ENDIF ENDIF IF gActivity.mFriendB.eState = FRIEND_PICKUP IF NOT DOES_ENTITY_EXIST(gActivity.mFriendB.hPed) IF Util_IsPedInsideRange(PLAYER_PED_ID(), gActivity.mFriendB.vDoorstep, 100.0) IF NOT Private_TryCreateFriend_AtDest(gActivity.mFriendB, TRUE) bCreatedAllPeds = FALSE ENDIF ENDIF ENDIF ENDIF WAIT(0) ENDWHILE SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) // IF bNeedToLoadScene // LOAD_SCENE(vDriveway) // ENDIF ENDIF BREAK CASE ACTIVITY_STATE_Journey enumActivityLocation eJumpLocation VECTOR vExactPos VECTOR vJumpOffset VECTOR vJumpPos FLOAT fJumpRot IF gActivity.iVisitedCount = 0 eJumpLocation = ALOC_cinema_vinewood ELSE eJumpLocation = MAX_ACTIVITY_LOCATIONS ENDIF // Let player select jump location DEBUG_SelectJumpLocation(eJumpLocation) IF eJumpLocation <> ALOC_suspendFriends IF eJumpLocation <> MAX_ACTIVITY_LOCATIONS // Jumping to an activity vExactPos = GET_STATIC_BLIP_POSITION(g_ActivityLocations[eJumpLocation].sprite) vJumpOffset = DEBUG_GetActivityLocJumpOffset(eJumpLocation) ELSE // Jumping to dropoff vExactPos = gActivity.vDropoff vJumpOffset = DEBUG_GetFriendLocJumpOffset(gActivity.eDropoffLoc) ENDIF IF vJumpOffset.x > 0.001 OR vJumpOffset.y > 0.001 fJumpRot = GET_HEADING_FROM_VECTOR_2D(-vJumpOffset.x, -vJumpOffset.y) ELSE fJumpRot = 0.0 ENDIF vJumpPos = vExactPos + vJumpOffset // Warp player to dest IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vExactPos, <<20.0, 20.0, 20.0>>) LOAD_SCENE(vExactPos) SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vJumpPos) SET_ENTITY_HEADING(PLAYER_PED_ID(), fJumpRot) ELSE SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vExactPos) SET_ENTITY_HEADING(PLAYER_PED_ID(), GET_RANDOM_FLOAT_IN_RANGE(0.0, 360.0)) ENDIF // If player is in car, make sure buddy is in car too IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) VEHICLE_INDEX tempPlayerVeh tempPlayerVeh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) IF NOT IS_PED_INJURED(FRIEND_A_PED_ID()) IF NOT IS_ENTITY_DEAD(tempPlayerVeh) IF NOT IS_PED_IN_VEHICLE(FRIEND_A_PED_ID(), tempPlayerVeh) SET_PED_INTO_VEHICLE(FRIEND_A_PED_ID(), tempPlayerVeh, VS_ANY_PASSENGER) ENDIF ENDIF ENDIF IF NOT IS_PED_INJURED(FRIEND_B_PED_ID()) IF NOT IS_ENTITY_DEAD(tempPlayerVeh) IF NOT IS_PED_IN_VEHICLE(FRIEND_B_PED_ID(), tempPlayerVeh) SET_PED_INTO_VEHICLE(FRIEND_B_PED_ID(), tempPlayerVeh, VS_ANY_PASSENGER) ENDIF ENDIF ENDIF ENDIF // If buddy hasn't made it, just warp into vicinity IF NOT IS_PED_INJURED(FRIEND_A_PED_ID()) IF NOT IS_ENTITY_AT_ENTITY(FRIEND_A_PED_ID(), PLAYER_PED_ID(), <<10.0, 10.0, 10.0>>) SET_ENTITY_COORDS(FRIEND_A_PED_ID(), GET_ENTITY_COORDS(PLAYER_PED_ID())+<>) ENDIF ENDIF IF NOT IS_PED_INJURED(FRIEND_B_PED_ID()) IF NOT IS_ENTITY_AT_ENTITY(FRIEND_B_PED_ID(), PLAYER_PED_ID(), <<10.0, 10.0, 10.0>>) SET_ENTITY_COORDS(FRIEND_B_PED_ID(), GET_ENTITY_COORDS(PLAYER_PED_ID())+<>) ENDIF ENDIF ENDIF BREAK DEFAULT SAVE_STRING_TO_DEBUG_FILE("SKIP gActivity.mState = ") SAVE_STRING_TO_DEBUG_FILE(GetLabel_enumActivityState(gActivity.mState)) SAVE_NEWLINE_TO_DEBUG_FILE() BREAK ENDSWITCH ENDIF CLEAR_PRINTS() HANG_UP_AND_PUT_AWAY_PHONE() SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) WHILE IS_KEYBOARD_KEY_PRESSED(KEY_J) WAIT(0) ENDWHILE ENDIF IF IS_KEYBOARD_KEY_PRESSED(KEY_W) IF (g_iDebugSelectedFriendConnDisplay > 0) IF (g_savedGlobals.sFlow.isGameflowActive) Set_Mission_Flow_Flag_State(FLOWFLAG_ALLOW_RANDOM_EVENTS, TRUE) Set_Mission_Flow_Flag_State(FLOWFLAG_ALLOW_CINEMA_ACTIVITY, TRUE) Set_Mission_Flow_Flag_State(FLOWFLAG_ALLOW_COMEDYCLUB_ACTIVITY, TRUE) Set_Mission_Flow_Flag_State(FLOWFLAG_ALLOW_LIVEMUSIC_ACTIVITY, TRUE) Execute_Code_ID(CID_ACTIVATE_MINIGAME_POST_ARM3_BLOCK) Execute_Code_ID(CID_ACTIVATE_MINIGAME_GOLF) Execute_Code_ID(CID_ACTIVATE_MINIGAME_DARTS2) Execute_Code_ID(CID_ACTIVATE_MINIGAME_STRIPCLUB) ENDIF ENDIF ENDIF ENDPROC #ENDIF // ******************************************************************************************* // MISSION SPECIFIC FUNCTIONS AND PROCEDURES // ******************************************************************************************* FUNC BOOL Private_IsAmbientLaunching(enumFriend eFriend) IF bAddedInitialPeds = FALSE enumCharacterList eChar = GET_CHAR_FROM_FRIEND(eFriend) IF IS_PLAYER_PED_PLAYABLE(eChar) SELECTOR_SLOTS_ENUM eSelectorSlot = GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(eChar) PED_INDEX hSelectorPed = g_sPlayerPedRequest.sSelectorPeds.pedID[eSelectorSlot] IF NOT IS_PED_INJURED(hSelectorPed) RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC PROC INIT_VARS() // Ensure bitfields are large enough #IF IS_DEBUG_BUILD IF ENUM_TO_INT(MAX_ACTIVITY_TYPES) >= 64 SCRIPT_ASSERT("MAX_ACTIVITY_TYPES >= 64, check that bitsAllowedActivities and bitsVisitedActivities can handle >= 64 bits") ENDIF IF ENUM_TO_INT(MAX_ACTIVITY_LOCATIONS) >= 64 SCRIPT_ASSERT("MAX_ACTIVITY_LOCATIONS >= 64, check that bitsVisitedLocations can handle >= 64 bits") ENDIF #ENDIF // Initialise locations Private_InitialiseFriendLocations(FALSE) Private_InitialiseActivityLocations() // Initialise members Private_InitFriend(gActivity.mPlayer) Private_InitFriend(gActivity.mFriendA) Private_InitFriend(gActivity.mFriendB) Private_InitSoldier(gActivity.mSoldiers[0], CHAR_MICHAEL) Private_InitSoldier(gActivity.mSoldiers[1], CHAR_FRANKLIN) Private_InitSoldier(gActivity.mSoldiers[2], CHAR_TREVOR) // Init fail queues Private_InitFailReasonQueue() Private_InitTextMessageQueue() //-- Initialise state vars // System gActivity.mState = ACTIVITY_STATE_Init gActivity.mFailReason = FAF_NoFail gActivity.bInitState = FALSE gActivity.iCandidateID = NO_CANDIDATE_ID gActivity.bIsCinemaEnabled = FALSE gActivity.bIsGolfEnabled = FALSE gActivity.bRestoreLocationBlips = FALSE gActivity.bRestoreStripClub = FALSE gActivity.bResumeFriendsAfterSquad = FALSE gActivity.eGroupSpacing = FSPACING_NORMAL gActivity.iLastHaircutChangeTime = GET_TIME_PLAYER_PED_LAST_CHANGED_HAIRDO(gActivity.mPlayer.eChar) gActivity.iLastClothesChangeTime = GET_TIME_PLAYER_PED_LAST_CHANGED_CLOTHES(gActivity.mPlayer.eChar) gActivity.iLastTattooChangeTime = GET_TIME_PLAYER_PED_LAST_GOT_TATTOO(gActivity.mPlayer.eChar) gActivity.eLoadingActivityLoc = NO_ACTIVITY_LOCATION gActivity.eLogFailCharA = NO_CHARACTER gActivity.eLogFailCharB = NO_CHARACTER gIsActivityInProgress = TRUE g_bSupressAmbientPlayersForFriendActivity = TRUE // Disable ambient player spawning (so by the time player gets to friend, no ambient player should exist) g_eRecentFriendChar = NO_CHARACTER bAddedInitialPeds = FALSE // General gActivity.ePlayerChar = GET_CURRENT_PLAYER_PED_ENUM() gActivity.bUpdateAfterSwitch = FALSE gActivity.eQueuedFailTextMsg = NO_FRIEND_TEXT_MESSAGE gActivity.eQueuedFailTextSender = NO_CHARACTER gActivity.eQueuedFailTextReceiver = NO_CHARACTER gActivity.mDialogue.eState = FDIALOGUE_NONE gActivity.mDialogue.eStatePriority = FDIALOGUE_PRIORITY_IDLE gActivity.mDialogue.iCounter = 0 gActivity.mDialogue.eDefaultState = FDIALOGUE_NONE gActivity.mDialogue.eConvChar = NO_CHARACTER gActivity.mDialogue.eConvPhrase = NO_FRIEND_ACTIVITY_PHRASE gActivity.mDialogue.eChatChars[0] = NO_CHARACTER gActivity.mDialogue.eChatChars[1] = NO_CHARACTER gActivity.mDialogue.eChatChars[2] = NO_CHARACTER CANCEL_TIMER(gActivity.mDialogue.mGeneralTimer) RESTART_TIMER_NOW(gActivity.mDialogue.mChatTimer) //CANCEL_TIMER(gActivity.mDialogue.mChatTimer) CANCEL_TIMER(gActivity.mDialogue.mSuggestTimer) gActivity.mDialogue.bHasDonePickupIdleChat = FALSE gActivity.mDialogue.iJourneyChatCounter = 0 gActivity.mAudio.eState = FAUDIO_IDLE // Initialise activity vars RESET_EXTENDED_BITS(gActivity.bitsAllowedActivities) gActivity.iAllowedCount = 0 RESET_EXTENDED_BITS(gActivity.bitsSuggestedActivities) RESET_EXTENDED_BITS(gActivity.bitsVisitedActivities) RESET_EXTENDED_BITS(gActivity.bitsVisitedLocations) gActivity.iVisitedCount = 0 gActivity.bTakeFriendHome = FALSE gActivity.eDropoffLoc = NO_FRIEND_LOCATION // gActivity.hDropoffScenarioBlock = NULL gActivity.bIsDropoffRouteDisplayed = FALSE gActivity.bIsRural = FALSE // Initialise rejection data gActivity.bIsZoneRejectionEnabled = TRUE gActivity.eRecentRejectionZone = SP_MISSION_NONE // Squad // Private_InitHatedRelGroups() // BBUDDIES REMOVED gActivity.eHotswapStage = SWAP_STATE_Wait gActivity.bIsAnySwitchAvailable = FALSE gActivity.iPlayerGroupFollowerCount = 0 ENDPROC PROC PROCESS_INIT_STATE(enumFriendConnection eFriendConnection) enumFriend friendID enumFriendConnectionMode eConnectionMode = GET_CONNECTION_MODE(eFriendConnection) BOOL bIsAmbientLaunching = FALSE // BOOL bIsSquadLaunching = FALSE // BBUDDIES REMOVED // BOOL bIsReplayLaunching = FALSE IF eConnectionMode = FC_MODE_Ambient bIsAmbientLaunching = TRUE ENDIF // IF eConnectionMode = FC_MODE_Squad // BBUDDIES REMOVED // bIsSquadLaunching = TRUE // ENDIF // // IF eConnectionMode = FC_MODE_ReplayGroup // bIsReplayLaunching = TRUE // ENDIF //-- If replay system requested clear entities... IF REPLAY_SYSTEM_HAS_REQUESTED_A_SCRIPT_CLEANUP() Private_SetActivityFailReason(FAF_PlaybackAbort) EXIT //-- If player is dead/arrested... ELIF NOT IS_PLAYER_PLAYING(PLAYER_ID()) Private_SetActivityFailReason(FAF_PlayerDeathArrest) EXIT //-- If connection has been cleared... ELIF GET_CONNECTION_STATE(eFriendConnection) <> FC_STATE_Init SCRIPT_ASSERT("Initialise FriendActivity - passed connection not in FC_STATE_Init state, abort") Private_SetActivityFailReason(FAF_PlayerOnMission) EXIT //-- If connection doesn't involve player... ELIF NOT GET_OTHER_FRIEND_FROM_CONNECTION(eFriendConnection, friendID) SCRIPT_ASSERT("Initialise FriendActivity - passed connection does not involved current player, abort") Private_SetActivityFailReason(FAF_PlayerOnMission) EXIT // ELIF bIsSquadLaunching OR bIsReplayLaunching // BBUDDIES REMOVED // // //-- If player has started non prep mission (and isn't on replay)... // IF IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_FRIEND_ACTIVITY) // AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_PREP) // AND NOT bIsReplayLaunching // // Private_SetActivityFailReason(FAF_PlayerOnMission) // EXIT // // ELSE // // //-- Add members -- // enumCharacterList ePlayerChar = GET_CURRENT_PLAYER_PED_ENUM() // enumCharacterList eFriendChar = GET_CHAR_FROM_FRIEND(friendID) // // Private_AddSoldier(gActivity.mSoldiers[ePlayerChar], eConnectionMode) // Private_AddSoldier(gActivity.mSoldiers[eFriendChar], eConnectionMode) // // Private_SetDialogueIdleState(gActivity.mDialogue, FDIALOGUE_SQUAD_IDLE) // bAddedInitialPeds = TRUE // // //-- Update connection state -- // IF NOT ACTIVATE_CONNECTION(eFriendConnection, FC_MODE_Squad) // SCRIPT_ASSERT("Couldn't activate connection on friend script init") // Private_SetActivityFailReason(FAF_PlayerOnMission) // EXIT // ENDIF // // //-- Start squad -- // IF bIsReplayLaunching // Private_SetActivityState(ACTIVITY_STATE_SquadReboot) // // ELIF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_PREP) // Private_SetActivityState(ACTIVITY_STATE_SquadMission) // // ELSE // Private_SetActivityState(ACTIVITY_STATE_SquadRoaming) // ENDIF // // ENDIF // ELIF (bIsAmbientLaunching = FALSE) OR Private_SetCurrentlyOnFriendMission(gActivity.iCandidateID) //-- If player has started other mission... IF IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_FRIEND_ACTIVITY) AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY) AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY_WITH_MG) Private_SetActivityFailReason(FAF_PlayerOnMission) EXIT ELSE //-- Add members -- Private_LoadFriendPickupResources() enumCharacterList ePlayerChar = GET_CURRENT_PLAYER_PED_ENUM() enumCharacterList eFriendChar = GET_CHAR_FROM_FRIEND(friendID) enumFriendLocation ePickupLoc = FriendLoc_GetBestPickupLoc(ePlayerChar, eFriendChar, TRUE) Private_AddFriend(gActivity.mPlayer, ePlayerChar, NO_FRIEND_LOCATION, -1) Private_AddFriend(gActivity.mFriendA, eFriendChar, ePickupLoc, 0, bIsAmbientLaunching) Private_SetDialogueIdleState(gActivity.mDialogue, FDIALOGUE_PICKUP_IDLE) bAddedInitialPeds = TRUE //-- Update connection state -- IF NOT ACTIVATE_CONNECTION(eFriendConnection, FC_MODE_Friend) SCRIPT_ASSERT("Couldn't activate connection on friend script init") Private_SetActivityFailReason(FAF_PlayerOnMission) EXIT ENDIF // Cancel old queued text messages Private_CancelCommsBetweenFriends(ePlayerChar, eFriendChar) //-- Start hangout -- IF bIsAmbientLaunching = FALSE Private_SetActivityState(ACTIVITY_STATE_Pickup) ELSE Private_SetActivityState(ACTIVITY_STATE_Journey) ENDIF ENDIF ENDIF ENDPROC // ******************************************************************************************* // MAIN SCRIPT // ******************************************************************************************* SCRIPT(enumFriendConnection paramFriendConnection) IF HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_PLAYER_KILLED_OR_ARRESTED|FORCE_CLEANUP_FLAG_SP_TO_MP|FORCE_CLEANUP_FLAG_MAGDEMO) CPRINTLN(DEBUG_FRIENDS, "FriendActivity.sc - HAS_FORCE_CLEANUP_OCCURRED()") IF GET_CAUSE_OF_MOST_RECENT_FORCE_CLEANUP() = FORCE_CLEANUP_FLAG_PLAYER_KILLED_OR_ARRESTED FriendActivity_Failed(FAF_PlayerDeathArrest) ELSE FriendActivity_Failed(FAF_Multiplayer) ENDIF FriendActivity_Cleanup() ENDIF // Print out requested connection and mode #IF IS_DEBUG_BUILD TEXT_LABEL_63 tConn = GetLabel_enumFriendConnection(paramFriendConnection) TEXT_LABEL_63 tMode = GetLabel_enumFriendConnectionMode(GET_CONNECTION_MODE(paramFriendConnection)) CPRINTLN(DEBUG_FRIENDS, "Initiating friend activity with ", tConn, " (Init mode: ", tMode, ")") #ENDIF // Reset all vars INIT_VARS() WAIT(0) #IF IS_DEBUG_BUILD Create_FriendActivity_Widget() #ENDIF WHILE gIsActivityInProgress WAIT(0) SWITCH gActivity.mState CASE ACTIVITY_STATE_Init PROCESS_INIT_STATE(paramFriendConnection) IF gActivity.mFailReason <> FAF_NoFail FriendActivity_Failed(gActivity.mFailReason) ENDIF BREAK CASE ACTIVITY_STATE_Pickup PROCESS_PICKUP_STATE() IF gActivity.mFailReason <> FAF_NoFail FriendActivity_Failed(gActivity.mFailReason) ENDIF BREAK CASE ACTIVITY_STATE_Journey IF gActivity.bInitState gActivity.bInitState = FALSE INIT_JOURNEY_STATE() ENDIF PROCESS_JOURNEY_STATE() IF gActivity.mFailReason <> FAF_NoFail FriendActivity_Failed(gActivity.mFailReason) ENDIF BREAK CASE ACTIVITY_STATE_Minigame IF PROCESS_MINIGAME_STATE() END_MINIGAME_STATE() ENDIF BREAK CASE ACTIVITY_STATE_Cinema IF PROCESS_CINEMA_STATE() END_CINEMA_STATE() ENDIF BREAK CASE ACTIVITY_STATE_Bar IF PROCESS_BAR_STATE() END_MINIGAME_STATE() ENDIF BREAK // CASE ACTIVITY_STATE_SquadReboot // BBUDDIES REMOVED // PROCESS_SQUAD_REBOOT_STATE() // // IF gActivity.mFailReason <> FAF_NoFail // FriendActivity_Failed(gActivity.mFailReason) // ENDIF // BREAK // // CASE ACTIVITY_STATE_SquadRoaming // PROCESS_SQUAD_ROAMING_STATE() // // IF gActivity.mFailReason <> FAF_NoFail // FriendActivity_Failed(gActivity.mFailReason) // ENDIF // BREAK // // CASE ACTIVITY_STATE_SquadMission // IF gActivity.bInitState // gActivity.bInitState = FALSE // INIT_SQUAD_MISSION_STATE() // ENDIF // // PROCESS_SQUAD_MISSION_STATE() // // IF gActivity.mFailReason <> FAF_NoFail // FriendActivity_Failed(gActivity.mFailReason) // ENDIF // BREAK CASE ACTIVITY_STATE_Trapped IF gActivity.bInitState gActivity.bInitState = FALSE INIT_TRAPPED_STATE() ENDIF PROCESS_TRAPPED_STATE() IF gActivity.mFailReason <> FAF_NoFail FriendActivity_Failed(gActivity.mFailReason) ENDIF BREAK CASE ACTIVITY_STATE_Dropoff IF PROCESS_DROPOFF_STATE(TRUE) FriendActivity_Passed() ENDIF BREAK CASE ACTIVITY_STATE_DropoffEarly IF PROCESS_DROPOFF_STATE(FALSE) FriendActivity_Passed() ENDIF BREAK // CASE ACTIVITY_STATE_DropoffSquad // BBUDDIES REMOVED // IF PROCESS_DROPOFF_SQUAD_STATE() // FriendActivity_Passed() // ENDIF // BREAK DEFAULT CPRINTLN(DEBUG_FRIENDS, "Unknown activity state: \"", GetLabel_enumActivityState(gActivity.mState), "\"") SCRIPT_ASSERT("Unknown activity state") BREAK ENDSWITCH #IF IS_DEBUG_BUILD DEBUG_DisplayGeneralInfo() Watch_FriendActivity_Widget() FriendActivity_Debug_Options() #ENDIF ENDWHILE FriendActivity_Cleanup() ENDSCRIPT