651 lines
25 KiB
Scheme
Executable File
651 lines
25 KiB
Scheme
Executable File
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
//
|
|
// SCRIPT NAME : TRI_Triathlon_Dialog.sch
|
|
// AUTHOR : Carlos Mijares (CM)
|
|
// DESCRIPTION : Manages Triathlon dialog.
|
|
//
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
|
|
|
|
|
|
|
|
|
|
// =====================================
|
|
// FILE INCLUDES
|
|
// =====================================
|
|
|
|
// -----------------------------------
|
|
// GENERAL INCLUDES
|
|
// -----------------------------------
|
|
|
|
USING "minigames_helpers.sch"
|
|
USING "minigame_uiinputs.sch"
|
|
USING "commands_xml.sch"
|
|
USING "commands_water.sch"
|
|
USING "tri_head.sch"
|
|
|
|
|
|
// -----------------------------------
|
|
// SPR FILE INCLUDES
|
|
// -----------------------------------
|
|
|
|
USING "tri_helpers_triathlon.sch"
|
|
|
|
// =====================================
|
|
// E N D FILE INCLUDES
|
|
// =====================================
|
|
|
|
|
|
|
|
|
|
CONST_FLOAT OUT_OF_BREATH_THRESHOLD 30.0
|
|
|
|
|
|
|
|
|
|
|
|
// ===================================
|
|
// TRIATHLON DIALOG VARIABLES
|
|
// ===================================
|
|
|
|
// Contain all data for the clerk and cash bag synchronized scene.
|
|
STRUCT TRI_DIALOG_STRUCT
|
|
// Dialog conversation handle.
|
|
structPedsForConversation convoStruct
|
|
|
|
// Dialog group ID. "MGTR_Michael_1.dstar" is the filename
|
|
STRING szBlockOfText
|
|
|
|
// Dialog labels.
|
|
STRING szRootLabel_X
|
|
|
|
// Dialog line lables.
|
|
STRING szSpecificLabel_X
|
|
|
|
// Track at what time, in seconds, the dialog system starts.
|
|
FLOAT fSecondsBeforeDialogSystemStarts
|
|
|
|
// Track the seconds it takes between any dialog being allowed to play again.
|
|
FLOAT fSecondsBeforeAnyDialogCanPlay
|
|
|
|
// The bounds used to randomly determine whether the player or racer will play
|
|
// his dialog line, in dialog situations where both speakers have available dialog.
|
|
INT iMinBoundForRandomSpeakerSelector
|
|
INT iMaxBoundForRandomSpeakerSelector
|
|
INT iHalfOfMaxBoundForRandomSpeakerSelector
|
|
|
|
// Place dialog is played for a racer staying in one race position (1st, 2nd) for
|
|
// the random amount of time determined by the bounds below.
|
|
FLOAT fMinBoundForRandomTimeToPlayAnyPlaceDialog
|
|
FLOAT fMaxBoundForRandomTimeToPlayAnyPlaceDialog
|
|
ENDSTRUCT
|
|
|
|
TRI_DIALOG_STRUCT TriDialog
|
|
|
|
// Timers to control when to allow any dialog to play.
|
|
structTimer timerAnyDialogCanPlay
|
|
|
|
|
|
// Timers to control when to allow dialog to play again.
|
|
structTimer timerPlayerDialogCanPlay
|
|
|
|
structTimer timerPlayerStayInPlaceDialogCanPlay
|
|
structTimer timerPlayerStayFirstDialogCanPlay
|
|
structTimer timerPlayerStaySecondDialogCanPlay
|
|
structTimer timerPlayerStayLastDialogCanPlay
|
|
structTimer timerPlayerStaminaDialogCanPlay
|
|
|
|
|
|
// Selects which lines to play when player pushes other racers.
|
|
ENUM TRI_DIALOG_PUSH
|
|
TRI_DIALOG_PUSH_1,
|
|
TRI_DIALOG_PUSH_2,
|
|
TRI_DIALOG_PUSH_3,
|
|
TRI_DIALOG_PUSH_4,
|
|
TRI_DIALOG_PUSH_5,
|
|
TRI_DIALOG_PUSH_6,
|
|
TRI_DIALOG_PUSH_7,
|
|
TRI_DIALOG_NUM_OF_PUSH_LINES
|
|
ENDENUM
|
|
|
|
// Selects which lines to play when player overtakes another racer.
|
|
ENUM TRI_DIALOG_RANK_UP
|
|
TRI_DIALOG_RANK_UP_1,
|
|
TRI_DIALOG_RANK_UP_2,
|
|
TRI_DIALOG_RANK_UP_3,
|
|
TRI_DIALOG_RANK_UP_4,
|
|
TRI_DIALOG_RANK_UP_5,
|
|
TRI_DIALOG_RANK_UP_6,
|
|
TRI_DIALOG_LEG_UP_1,
|
|
TRI_DIALOG_LEG_UP_2,
|
|
TRI_DIALOG_LEG_UP_3,
|
|
TRI_DIALOG_LEG_UP_4,
|
|
TRI_DIALOG_NUM_OF_RANK_UP_LINES
|
|
ENDENUM
|
|
|
|
// Selects which lines to play when player overtakes another racer.
|
|
ENUM TRI_DIALOG_RANK_DOWN
|
|
TRI_DIALOG_RANK_DOWN_1,
|
|
TRI_DIALOG_RANK_DOWN_2,
|
|
TRI_DIALOG_RANK_DOWN_3,
|
|
TRI_DIALOG_RANK_DOWN_4,
|
|
TRI_DIALOG_RANK_DOWN_5,
|
|
TRI_DIALOG_RANK_DOWN_6,
|
|
TRI_DIALOG_LEG_DOWN_1,
|
|
TRI_DIALOG_LEG_DOWN_2,
|
|
TRI_DIALOG_LEG_DOWN_3,
|
|
TRI_DIALOG_LEG_DOWN_4,
|
|
TRI_DIALOG_NUM_OF_RANK_DOWN_LINES
|
|
ENDENUM
|
|
|
|
// Selects which lines to play when player remains in one place.
|
|
ENUM TRI_DIALOG_REMAIN_IN_PLACE
|
|
TRI_DIALOG_REMAIN_IN_PLACE_1,
|
|
TRI_DIALOG_REMAIN_IN_PLACE_2,
|
|
TRI_DIALOG_REMAIN_IN_PLACE_3,
|
|
TRI_DIALOG_REMAIN_IN_PLACE_4,
|
|
TRI_DIALOG_REMAIN_IN_PLACE_5,
|
|
TRI_DIALOG_NUM_OF_REMAIN_IN_PLACE_LINES
|
|
ENDENUM
|
|
|
|
// Selects which lines to play when player remains in first place
|
|
ENUM TRI_DIALOG_REMAIN_FIRST
|
|
TRI_DIALOG_REMAIN_FIRST_1,
|
|
TRI_DIALOG_REMAIN_FIRST_2,
|
|
TRI_DIALOG_REMAIN_FIRST_3,
|
|
TRI_DIALOG_REMAIN_FIRST_4,
|
|
TRI_DIALOG_REMAIN_FIRST_5,
|
|
TRI_DIALOG_NUM_OF_REMAIN_FIRST_LINES
|
|
ENDENUM
|
|
|
|
// Selects which lines to play when player remains in first place
|
|
ENUM TRI_DIALOG_REMAIN_SECOND
|
|
TRI_DIALOG_REMAIN_SECOND_1,
|
|
TRI_DIALOG_REMAIN_SECOND_2,
|
|
TRI_DIALOG_REMAIN_SECOND_3,
|
|
TRI_DIALOG_REMAIN_SECOND_4,
|
|
TRI_DIALOG_REMAIN_SECOND_5,
|
|
TRI_DIALOG_REMAIN_SECOND_6,
|
|
TRI_DIALOG_REMAIN_SECOND_7,
|
|
TRI_DIALOG_NUM_OF_REMAIN_SECOND_LINES
|
|
ENDENUM
|
|
|
|
// Selects which lines to play when player remains in first place
|
|
ENUM TRI_DIALOG_REMAIN_LAST
|
|
TRI_DIALOG_REMAIN_LAST_1,
|
|
TRI_DIALOG_REMAIN_LAST_2,
|
|
TRI_DIALOG_REMAIN_LAST_3,
|
|
TRI_DIALOG_REMAIN_LAST_4,
|
|
TRI_DIALOG_REMAIN_LAST_5,
|
|
TRI_DIALOG_NUM_OF_REMAIN_LAST_LINES
|
|
ENDENUM
|
|
|
|
// ===================================
|
|
// E N D TRIATHLON DIALOG VARIABLES
|
|
// ===================================
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ========================================
|
|
// DIALOG FUNCTIONS AND PROCEDURES
|
|
// ========================================
|
|
|
|
/// PURPOSE:
|
|
/// Plays cheers from scenario spectator peds, to be used during countdown and finish.
|
|
/// PARAMS:
|
|
/// thisRace -
|
|
PROC PLAY_TRI_BIG_CHEERS(TRI_RACE_STRUCT& thisRace)
|
|
PLAY_SOUND_FROM_COORD(thisRace.iCheerMasterSound, "CROWD_CHEER_MASTER", thisRace.sGate[thisRace.iGateCnt - 1].vPos)
|
|
CPRINTLN(DEBUG_TRIATHLON, "[tri_dialogue.sch::PLAY_TRI_BIG_CHEERS] They're CROWD_CHEER_MASTER for me, Michael!")
|
|
PLAY_SOUND_FROM_COORD(thisRace.iWallaSound, "POSITIONED_WALLA_MASTER", thisRace.sGate[thisRace.iGateCnt - 1].vPos)
|
|
CPRINTLN(DEBUG_TRIATHLON, "[tri_dialogue.sch::PLAY_TRI_BIG_CHEERS] They're POSITIONED_WALLA_MASTER for me, Michael!")
|
|
ENDPROC
|
|
|
|
PROC STOP_TRI_BIG_CHEERS(TRI_RACE_STRUCT& thisRace)
|
|
CPRINTLN(DEBUG_TRIATHLON, "[tri_dialogue.sch::STOP_TRI_BIG_CHEERS] Called Stop Sound on the cheers")
|
|
STOP_SOUND(thisRace.iCheerMasterSound)
|
|
STOP_SOUND(thisRace.iWallaSound)
|
|
ENDPROC
|
|
|
|
PROC PLAY_TRI_AMBIENT_SPEECH(PED_INDEX ped, STRING sContext, SPEECH_PARAMS eParams = SPEECH_PARAMS_FORCE_FRONTEND)
|
|
CDEBUG2LN(DEBUG_TRIATHLON, "PLAY_TRI_AMBIENT_SPEECH :: with sContext=", sContext)
|
|
PLAY_PED_AMBIENT_SPEECH(ped, sContext, eParams)
|
|
ENDPROC
|
|
|
|
PROC PLAY_TRI_AMBIENT_SPEECH_WITH_VOICE(PED_INDEX ped, STRING sContext, STRING sVoice, SPEECH_PARAMS eParams = SPEECH_PARAMS_FORCE_FRONTEND)
|
|
CDEBUG2LN(DEBUG_TRIATHLON, "PLAY_TRI_AMBIENT_SPEECH_WITH_VOICE :: with sContext=", sContext, ", sVoice=", sVoice)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(ped, sContext, sVoice, eParams)
|
|
ENDPROC
|
|
|
|
|
|
PROC PLAY_SINGLE_LINE_FROM_TRI_CONVO(structPedsForConversation &pedStruct, STRING sBlockOfTextToLoad, STRING sRootLabel, STRING sLabel, enumConversationPriority ePriority, enumSubtitlesState eSubtitles = DISPLAY_SUBTITLES)
|
|
IF NOT IS_TRI_CONTROL_FLAG_SET(TCF_NEWS_CAM_ACTIVE)
|
|
PLAY_SINGLE_LINE_FROM_CONVERSATION(pedStruct, sBlockOfTextToLoad, sRootLabel, sLabel, ePriority, eSubtitles)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Play player dialog when he finishes the race.
|
|
PROC PLAY_FINISHED_RACE_TRI_PLAYER_DIALOG(TRI_RACE_STRUCT& Race)
|
|
STRING sVoice, sContext
|
|
SWITCH Race.Racer[0].iRank
|
|
// Player won the race.
|
|
CASE 1
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL sVoice = "MICHAEL_NORMAL" BREAK
|
|
CASE CHAR_FRANKLIN sVoice = "FRANKLIN_NORMAL" BREAK
|
|
CASE CHAR_TREVOR sVoice = "TREVOR_NORMAL" BREAK
|
|
ENDSWITCH
|
|
// sContext = PICK_STRING(GET_PLAYER_SPRINT_STAMINA_REMAINING(PLAYER_ID()) < OUT_OF_BREATH_THRESHOLD, "RACE_WIN_POSITION_OUT_OF_BREATH", "GAME_WIN_SELF")
|
|
PLAY_TRI_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), "RACE_WIN_POSITION_OUT_OF_BREATH", sVoice)
|
|
BREAK
|
|
|
|
// Player placed 2nd or 3rd in the race.
|
|
CASE 2
|
|
CASE 3
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL sVoice = "MICHAEL_NORMAL" BREAK
|
|
CASE CHAR_FRANKLIN sVoice = "FRANKLIN_NORMAL" BREAK
|
|
CASE CHAR_TREVOR sVoice = "TREVOR_NORMAL" BREAK
|
|
ENDSWITCH
|
|
sContext = PICK_STRING(GET_PLAYER_SPRINT_STAMINA_REMAINING(PLAYER_ID()) < OUT_OF_BREATH_THRESHOLD, "RACE_NEARLY_WIN_POSITION_OUT_OF_BREATH", "RACE_NEARLY_WIN")
|
|
PLAY_TRI_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), sContext, sVoice)
|
|
BREAK
|
|
|
|
// Player placed in 4th, 5th, 6th or 7th place.
|
|
DEFAULT
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL sVoice = "MICHAEL_NORMAL" BREAK
|
|
CASE CHAR_FRANKLIN sVoice = "FRANKLIN_NORMAL" BREAK
|
|
CASE CHAR_TREVOR sVoice = "TREVOR_NORMAL" BREAK
|
|
ENDSWITCH
|
|
// sContext = PICK_STRING(GET_PLAYER_SPRINT_STAMINA_REMAINING(PLAYER_ID()) < OUT_OF_BREATH_THRESHOLD, "RACE_FINISHED_OUT_OF_BREATH", "GAME_LOSE_SELF")
|
|
PLAY_TRI_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), "RACE_FINISHED_OUT_OF_BREATH", sVoice)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Manage which dialog to play for player remaining in last place.
|
|
PROC Tri_Play_Dialog_For_Player_Staying_In_Last_Place(TRI_RACE_STRUCT& Race)
|
|
IF TIMER_DO_WHEN_READY(timerAnyDialogCanPlay, TriDialog.fSecondsBeforeAnyDialogCanPlay)
|
|
IF Tri_Is_Player_In_Last_Place(Race)
|
|
IF TIMER_DO_WHEN_READY(timerPlayerRemainingInLastPlace, 10.0)
|
|
IF TIMER_DO_WHEN_READY(timerPlayerStayLastDialogCanPlay, GET_RANDOM_FLOAT_IN_RANGE(TriDialog.fMinBoundForRandomTimeToPlayAnyPlaceDialog, TriDialog.fMaxBoundForRandomTimeToPlayAnyPlaceDialog))
|
|
STRING sVoice
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL sVoice = "MICHAEL_NORMAL" BREAK
|
|
CASE CHAR_FRANKLIN sVoice = "FRANKLIN_NORMAL" BREAK
|
|
CASE CHAR_TREVOR sVoice = "TREVOR_NORMAL" BREAK
|
|
ENDSWITCH
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
IF GET_RANDOM_FLOAT_IN_RANGE() < MICHAEL_LINES_GETTING_OLD_CHANCE
|
|
PLAY_TRI_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), "GETTING_OLD", "MICHAEL_NORMAL")
|
|
CPRINTLN(DEBUG_TRIATHLON, "[tri_dialogue.sch :: Tri_Play_Dialog_For_Player_Staying_In_Last_Place] PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), GETTING_OLD, MICHAEL_NORMAL)")
|
|
ENDIF
|
|
ELSE
|
|
PLAY_TRI_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), "RACE_STAY_POSITION_OUT_OF_BREATH", sVoice)
|
|
ENDIF
|
|
|
|
// Reset dialog timers
|
|
RESTART_TIMER_NOW(timerPlayerStayLastDialogCanPlay)
|
|
RESTART_TIMER_NOW(timerAnyDialogCanPlay)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Manage which dialog to play for player remaining in second place.
|
|
PROC Tri_Play_Dialog_For_Player_Staying_In_Second_Place(TRI_RACE_STRUCT& Race)
|
|
IF TIMER_DO_WHEN_READY(timerAnyDialogCanPlay, TriDialog.fSecondsBeforeAnyDialogCanPlay)
|
|
IF Tri_Is_Player_In_Second_Place(Race)
|
|
IF TIMER_DO_WHEN_READY(timerPlayerRemainingInSecondPlace, 10.0)
|
|
IF TIMER_DO_WHEN_READY(timerPlayerStaySecondDialogCanPlay, GET_RANDOM_FLOAT_IN_RANGE(TriDialog.fMinBoundForRandomTimeToPlayAnyPlaceDialog, TriDialog.fMaxBoundForRandomTimeToPlayAnyPlaceDialog))
|
|
STRING sVoice
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL sVoice = "MICHAEL_NORMAL" BREAK
|
|
CASE CHAR_FRANKLIN sVoice = "FRANKLIN_NORMAL" BREAK
|
|
CASE CHAR_TREVOR sVoice = "TREVOR_NORMAL" BREAK
|
|
ENDSWITCH
|
|
PLAY_TRI_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), "RACE_STAY_POSITION_OUT_OF_BREATH", sVoice)
|
|
|
|
// Reset dialog timers.
|
|
RESTART_TIMER_NOW(timerPlayerStaySecondDialogCanPlay)
|
|
RESTART_TIMER_NOW(timerAnyDialogCanPlay)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC Tri_Play_Dialog_For_Player_Losing_Stamina()
|
|
IF TIMER_DO_WHEN_READY(timerAnyDialogCanPlay, TriDialog.fSecondsBeforeAnyDialogCanPlay)
|
|
IF Tri_Player_Stamina.iCurrentEnergy <= 5
|
|
IF TIMER_DO_WHEN_READY(timerPlayerStaminaDialogCanPlay, GET_RANDOM_FLOAT_IN_RANGE(TriDialog.fMinBoundForRandomTimeToPlayAnyPlaceDialog, TriDialog.fMaxBoundForRandomTimeToPlayAnyPlaceDialog))
|
|
STRING sVoice
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL sVoice = "MICHAEL_NORMAL" BREAK
|
|
CASE CHAR_FRANKLIN sVoice = "FRANKLIN_NORMAL" BREAK
|
|
CASE CHAR_TREVOR sVoice = "TREVOR_NORMAL" BREAK
|
|
ENDSWITCH
|
|
PLAY_TRI_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), "TRIATHLON_COMMENT", sVoice)
|
|
|
|
RESTART_TIMER_NOW(timerAnyDialogCanPlay)
|
|
RESTART_TIMER_NOW(timerPlayerStaminaDialogCanPlay)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Manage which dialog to play for player remaining in first place.
|
|
PROC Tri_Play_Dialog_For_Player_Staying_In_First_Place(TRI_RACE_STRUCT& Race)
|
|
IF TIMER_DO_WHEN_READY(timerAnyDialogCanPlay, TriDialog.fSecondsBeforeAnyDialogCanPlay)
|
|
IF Tri_Is_Player_In_First_Place(Race)
|
|
IF TIMER_DO_WHEN_READY(timerPlayerRemainingInFirstPlace, 10.0)
|
|
IF TIMER_DO_WHEN_READY(timerPlayerStayFirstDialogCanPlay, GET_RANDOM_FLOAT_IN_RANGE(TriDialog.fMinBoundForRandomTimeToPlayAnyPlaceDialog, TriDialog.fMaxBoundForRandomTimeToPlayAnyPlaceDialog))
|
|
STRING sVoice
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL sVoice = "MICHAEL_NORMAL" BREAK
|
|
CASE CHAR_FRANKLIN sVoice = "FRANKLIN_NORMAL" BREAK
|
|
CASE CHAR_TREVOR sVoice = "TREVOR_NORMAL" BREAK
|
|
ENDSWITCH
|
|
PLAY_TRI_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), "RACE_STAY_1ST_OUT_OF_BREATH", sVoice)
|
|
|
|
// Reset dialog timers.
|
|
RESTART_TIMER_NOW(timerPlayerStayFirstDialogCanPlay)
|
|
RESTART_TIMER_NOW(timerAnyDialogCanPlay)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Manage which dialog to play for player remaining in one place during the race.
|
|
PROC Tri_Play_Dialog_For_Player_Staying_In_One_Place(TRI_RACE_STRUCT& Race)
|
|
IF TIMER_DO_WHEN_READY(timerAnyDialogCanPlay, TriDialog.fSecondsBeforeAnyDialogCanPlay)
|
|
IF Tri_Is_Player_In_One_Place(Race)
|
|
IF TIMER_DO_WHEN_READY(timerPlayerRemainingInPlace, 10.0)
|
|
IF TIMER_DO_WHEN_READY(timerPlayerStayInPlaceDialogCanPlay, GET_RANDOM_FLOAT_IN_RANGE(TriDialog.fMinBoundForRandomTimeToPlayAnyPlaceDialog, TriDialog.fMaxBoundForRandomTimeToPlayAnyPlaceDialog))
|
|
STRING sVoice
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL sVoice = "MICHAEL_NORMAL" BREAK
|
|
CASE CHAR_FRANKLIN sVoice = "FRANKLIN_NORMAL" BREAK
|
|
CASE CHAR_TREVOR sVoice = "TREVOR_NORMAL" BREAK
|
|
ENDSWITCH
|
|
PLAY_TRI_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), "RACE_STAY_POSITION_OUT_OF_BREATH", sVoice)
|
|
|
|
// Reset dialog timers.
|
|
RESTART_TIMER_NOW(timerPlayerStayInPlaceDialogCanPlay)
|
|
RESTART_TIMER_NOW(timerAnyDialogCanPlay)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Manage which dialog to play for AI racer passing player.
|
|
PROC Tri_Play_Dialog_For_Racer_Passing_Player(TRI_RACE_STRUCT& Race)
|
|
PED_INDEX closestPedToPlayerIndex
|
|
// TEXT_LABEL_31 texVoice
|
|
|
|
IF TIMER_DO_WHEN_READY(timerAnyDialogCanPlay, TriDialog.fSecondsBeforeAnyDialogCanPlay)
|
|
IF TIMER_DO_WHEN_READY(timerPlayerDialogCanPlay, GET_RANDOM_FLOAT_IN_RANGE(15.0, 25.0))
|
|
//CPRINTLN(DEBUG_TRIATHLON, "[TRI_Triathlon_Helpers->Tri_Update_Dialog_Status] Timer is ready for checking dropping rank at:", GET_TIMER_IN_SECONDS(timerPlayerDialogCanPlay))
|
|
IF Tri_Has_Player_Dropped_Rank(Race)
|
|
IF Tri_Is_A_Racer_Close_And_On_Screen(Race)
|
|
IF GET_RANDOM_INT_IN_RANGE(TriDialog.iMinBoundForRandomSpeakerSelector, TriDialog.iMaxBoundForRandomSpeakerSelector + 1) < TriDialog.iHalfOfMaxBoundForRandomSpeakerSelector
|
|
STRING sVoice
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL sVoice = "MICHAEL_NORMAL" BREAK
|
|
CASE CHAR_FRANKLIN sVoice = "FRANKLIN_NORMAL" BREAK
|
|
CASE CHAR_TREVOR sVoice = "TREVOR_NORMAL" BREAK
|
|
ENDSWITCH
|
|
STRING sContext = PICK_STRING(GET_PLAYER_SPRINT_STAMINA_REMAINING(PLAYER_ID()) < OUT_OF_BREATH_THRESHOLD, "RACE_RANKDOWN_OUT_OF_BREATH", "RACE_RANKDOWN")
|
|
PLAY_TRI_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), sContext, sVoice)
|
|
ELSE
|
|
closestPedToPlayerIndex = Tri_Get_Closest_Racer_To_Player(Race)
|
|
IF NOT IS_ENTITY_DEAD(closestPedToPlayerIndex)
|
|
PLAY_TRI_AMBIENT_SPEECH(closestPedToPlayerIndex, "GENERIC_INSULT_MED")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Reset dialog timers.
|
|
RESTART_TIMER_NOW(timerPlayerDialogCanPlay)
|
|
RESTART_TIMER_NOW(timerAnyDialogCanPlay)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Manage which dialog to play for player passing AI racer.
|
|
PROC Tri_Play_Dialog_For_Player_Passing_Racer(TRI_RACE_STRUCT& Race)
|
|
PED_INDEX closestPedToPlayerIndex
|
|
|
|
//IF TIMER_DO_WHEN_READY(timerPlayerRankUpDialogCanPlay, 1.0)
|
|
IF TIMER_DO_WHEN_READY(timerAnyDialogCanPlay, TriDialog.fSecondsBeforeAnyDialogCanPlay)
|
|
IF TIMER_DO_WHEN_READY(timerPlayerDialogCanPlay, GET_RANDOM_FLOAT_IN_RANGE(15.0, 25.0))
|
|
//CPRINTLN(DEBUG_TRIATHLON, "[TRI_Triathlon_Helpers->Tri_Update_Dialog_Status] Timer is ready for checking improved rank at:", GET_TIMER_IN_SECONDS(timerPlayerDialogCanPlay))
|
|
IF Tri_Has_Player_Improved_Rank(Race)
|
|
IF Tri_Is_A_Racer_Close_And_On_Screen(Race)
|
|
IF GET_RANDOM_INT_IN_RANGE(TriDialog.iMinBoundForRandomSpeakerSelector, TriDialog.iMaxBoundForRandomSpeakerSelector + 1) < TriDialog.iHalfOfMaxBoundForRandomSpeakerSelector
|
|
STRING sVoice
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL sVoice = "MICHAEL_NORMAL" BREAK
|
|
CASE CHAR_FRANKLIN sVoice = "FRANKLIN_NORMAL" BREAK
|
|
CASE CHAR_TREVOR sVoice = "TREVOR_NORMAL" BREAK
|
|
ENDSWITCH
|
|
STRING sContext = PICK_STRING(GET_PLAYER_SPRINT_STAMINA_REMAINING(PLAYER_ID()) < OUT_OF_BREATH_THRESHOLD, "RACE_RANKUP_OUT_OF_BREATH", "RACE_RANKUP")
|
|
PLAY_TRI_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), sContext, sVoice)
|
|
ELSE
|
|
closestPedToPlayerIndex = Tri_Get_Closest_Racer_To_Player(Race)
|
|
IF NOT IS_ENTITY_DEAD(closestPedToPlayerIndex)
|
|
PLAY_TRI_AMBIENT_SPEECH(closestPedToPlayerIndex, "GENERIC_CURSE_MED")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Reset dialog timer.
|
|
RESTART_TIMER_NOW(timerPlayerDialogCanPlay)
|
|
RESTART_TIMER_NOW(timerAnyDialogCanPlay)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Manage which dialog to play for player pushing AI racer.
|
|
PROC Tri_Play_Dialog_For_Racer_Being_Pushed(TRI_RACE_STRUCT& Race)
|
|
PED_INDEX closestPedToPlayerIndex
|
|
|
|
//IF TIMER_DO_WHEN_READY(timerPlayerPushDialogCanPlay, 2.0)
|
|
IF TIMER_DO_WHEN_READY(timerAnyDialogCanPlay, TriDialog.fSecondsBeforeAnyDialogCanPlay)
|
|
IF TIMER_DO_WHEN_READY(timerPlayerDialogCanPlay, GET_RANDOM_FLOAT_IN_RANGE(15.0, 25.0))
|
|
//CPRINTLN(DEBUG_TRIATHLON, "[TRI_Triathlon_Helpers->Tri_Update_Dialog_Status] Timer is ready for checking pushing at:", GET_TIMER_IN_SECONDS(timerPlayerDialogCanPlay))
|
|
IF Tri_Has_Player_Pushed_A_Racer(Race)
|
|
// Play a line of dialog of player bumping into a ped.
|
|
IF GET_RANDOM_INT_IN_RANGE(TriDialog.iMinBoundForRandomSpeakerSelector, TriDialog.iMaxBoundForRandomSpeakerSelector + 1) < TriDialog.iHalfOfMaxBoundForRandomSpeakerSelector
|
|
STRING sVoice
|
|
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
|
|
CASE CHAR_MICHAEL sVoice = "MICHAEL_NORMAL" BREAK
|
|
CASE CHAR_FRANKLIN sVoice = "FRANKLIN_NORMAL" BREAK
|
|
CASE CHAR_TREVOR sVoice = "TREVOR_NORMAL" BREAK
|
|
ENDSWITCH
|
|
PLAY_TRI_AMBIENT_SPEECH_WITH_VOICE(PLAYER_PED_ID(), "RACE_COLLIDE_OUT_OF_BREATH", sVoice)
|
|
ELSE
|
|
closestPedToPlayerIndex = Tri_Get_Closest_Racer_To_Player(Race)
|
|
|
|
IF NOT IS_ENTITY_DEAD(closestPedToPlayerIndex)
|
|
PLAY_TRI_AMBIENT_SPEECH(closestPedToPlayerIndex, "GENERIC_CURSE_MED")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Reset dialog timers.
|
|
RESTART_TIMER_NOW(timerPlayerDialogCanPlay)
|
|
RESTART_TIMER_NOW(timerAnyDialogCanPlay)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Returns TRUE when there are any objectives, warnings, or failure prints on screen.
|
|
FUNC BOOL Tri_Is_Important_Text_Being_Displayed_At_Bottom_Screen()
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED("SPR_HELP_WARN")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("SPR_RETR_FAIL")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("SPR_RETR_DES")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("SPR_RETR_WARN")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("SPR_HELP_FAIL")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("SPR_EXIT_WARN")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("SPR_EXIT_FAIL")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("SPR_EXIT_FAIL2")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("SPR_TXIT_WARN")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("SPR_TXIT_FAIL")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("SPR_HELP_WANT")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("SPR_OBJ_BIKE1")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("SPR_OBJ_BIKE2")
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED("TRI_OBJ_RUN")
|
|
RETURN TRUE
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Manage when dialog should be played.
|
|
/// Does not play when player speed is below 0.75
|
|
PROC UPDATE_TRI_DIALOG(TRI_RACE_STRUCT& thisRace)
|
|
IF IS_TRI_CONTROL_FLAG_SET(TCF_NEWS_CAM_ACTIVE)
|
|
EXIT
|
|
ENDIF
|
|
|
|
TRI_TRI_RACE_LEG eLeg = Tri_Get_Racer_Current_Race_Leg(thisRace, thisRace.Racer[0])
|
|
IF GET_ENTITY_SPEED(thisRace.Racer[0].Driver) > 0.75 AND eLeg <> TRI_TRI_RACE_LEG_SWIM
|
|
|
|
// Manage which dialog for player pushing AI racer should play.
|
|
Tri_Play_Dialog_For_Racer_Being_Pushed(thisRace)
|
|
|
|
// Manage which dialog to play for player passing AI racer.
|
|
Tri_Play_Dialog_For_Player_Passing_Racer(thisRace)
|
|
|
|
// Manage which dialog to play for AI racer passing player.
|
|
Tri_Play_Dialog_For_Racer_Passing_Player(thisRace)
|
|
|
|
// Manage which dialog to play for player remaining in one place.
|
|
Tri_Play_Dialog_For_Player_Staying_In_One_Place(thisRace)
|
|
|
|
// Manage which dialog to play for player remaining in first place.
|
|
Tri_Play_Dialog_For_Player_Staying_In_First_Place(thisRace)
|
|
|
|
// Manage which dialog to play for player remaining in second place.
|
|
Tri_Play_Dialog_For_Player_Staying_In_Second_Place(thisRace)
|
|
|
|
// Manage which dialog to play for player remaining in last place.
|
|
Tri_Play_Dialog_For_Player_Staying_In_Last_Place(thisRace)
|
|
|
|
// Manage dialog for player stamina reduction
|
|
Tri_Play_Dialog_For_Player_Losing_Stamina()
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Setup Triathlon dialog system.
|
|
PROC SETUP_TRI_DIALOG()
|
|
CPRINTLN(DEBUG_TRIATHLON, "[TRI_Triathlon_Helpers.sch->SETUP_TRI_DIALOG] Procedure started.")
|
|
|
|
TriDialog.fSecondsBeforeDialogSystemStarts = 0.0
|
|
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Initialize Triathlon dialog system.
|
|
PROC INIT_TRI_DIALOG()
|
|
CPRINTLN(DEBUG_TRIATHLON, "[TRI_Triathlon_Helpers.sch->INIT_TRI_DIALOG] Procedure started.")
|
|
|
|
// Initialize the time it takes between any dialog being allowed to play again.
|
|
TriDialog.fSecondsBeforeAnyDialogCanPlay = 15.0
|
|
|
|
// Initialize the variables for determining whether the player or AI racer will play a situational type of dialog line.
|
|
TriDialog.iMinBoundForRandomSpeakerSelector = 0
|
|
TriDialog.iMaxBoundForRandomSpeakerSelector = 10
|
|
TriDialog.iHalfOfMaxBoundForRandomSpeakerSelector = TriDialog.iMaxBoundForRandomSpeakerSelector / 2
|
|
|
|
|
|
// Set the time bounds when place dialog can play again.
|
|
TriDialog.fMinBoundForRandomTimeToPlayAnyPlaceDialog = 25.0
|
|
TriDialog.fMaxBoundForRandomTimeToPlayAnyPlaceDialog = 40.0
|
|
|
|
// Update the time bounds when place dialog can play again for Ironman, so dialog
|
|
// plays less frequently in the lenghtier race.
|
|
IF eCurrentTriRace = TRIATHLON_RACE_IRONMAN
|
|
TriDialog.fMinBoundForRandomTimeToPlayAnyPlaceDialog = 60.0
|
|
TriDialog.fMaxBoundForRandomTimeToPlayAnyPlaceDialog = 120.0
|
|
ENDIF
|
|
|
|
|
|
// Fill out the conversation struct.
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
ADD_PED_FOR_DIALOGUE(TriDialog.convoStruct, 0, PLAYER_PED_ID(), "MICHAEL")
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
|
|
ADD_PED_FOR_DIALOGUE(TriDialog.convoStruct, 1, PLAYER_PED_ID(), "FRANKLIN")
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
ADD_PED_FOR_DIALOGUE(TriDialog.convoStruct, 2, PLAYER_PED_ID(), "TREVOR")
|
|
ENDIF
|
|
|
|
// Set the dialog labels.
|
|
TriDialog.szBlockOfText = "MGTRAUD"
|
|
ENDPROC
|
|
|
|
// ========================================
|
|
// E N D DIALOG FUNCTIONS AND PROCEDURES
|
|
// ========================================
|
|
|
|
|
|
|
|
|
|
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
//
|
|
// END OF FILE - DO NOT ADD ANYTHING BELOW THIS BLOCK!
|
|
//
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|