Files
gtav-src/script/dev_ng/singleplayer/include/private/mission_titles_private.sch
T
2025-09-29 00:52:08 +02:00

725 lines
25 KiB
Scheme
Executable File

USING "globals.sch"
USING "rage_builtins.sch"
USING "candidate_public.sch"
USING "player_ped_public.sch"
// *****************************************************************************************
// SCRIPT NAME : mission_titles_private.sch
// AUTHOR : Andy Minghella
// DESCRIPTION : Handles displaying the mission title for story + RC missions
// *****************************************************************************************
// display positions
// default
CONST_FLOAT FLOW_MISSION_NAME_POS_X 0.0
CONST_FLOAT FLOW_MISSION_NAME_POS_Y -0.014
// races (test with fanatic 3)
CONST_FLOAT FLOW_MISSION_NAME_POS_X_RACE 0.0
CONST_FLOAT FLOW_MISSION_NAME_POS_Y_RACE -0.07
// rampages
CONST_FLOAT FLOW_MISSION_NAME_POS_X_RAMPAGE 0.0
CONST_FLOAT FLOW_MISSION_NAME_POS_Y_RAMPAGE -0.077
// time limit (test with SP_HEIST_FINALE_1 or SP_MISSION_ASSASSIN_2)
CONST_FLOAT FLOW_MISSION_NAME_POS_X_TIME_LIMIT 0.0
CONST_FLOAT FLOW_MISSION_NAME_POS_Y_TIME_LIMIT -0.05
// timer bar (test with Michael Event Amanda)
CONST_FLOAT FLOW_MISSION_NAME_POS_X_TIMER_BAR 0.0
CONST_FLOAT FLOW_MISSION_NAME_POS_Y_TIMER_BAR -0.035 // this was -0.03 but korean text over spills
// other display constants
CONST_FLOAT FLOW_MISSION_NAME_SCALE_X 0.67
CONST_FLOAT FLOW_MISSION_NAME_SCALE_Y 0.67
CONST_FLOAT FLOW_MISSION_NAME_SIZE_X 0.0
CONST_FLOAT FLOW_MISSION_NAME_SIZE_Y 0.01
CONST_INT FLOW_MISSION_NAME_DISPLAY_TIME 9000
CONST_INT FLOW_MISSION_NAME_DISPLAY_FADE_TIME 1000
CONST_FLOAT FLOW_MAX_MISSION_TITLE_WIDTH 0.17
CONST_FLOAT FLOW_MAX_MISSION_TITLE_WIDTH_4_3 0.14
FLOAT fSafeToDisplayTimer = 0
VECTOR vOriginalSubtitleTextPos
FLOAT fSubtitleTextPosOffsetY = -0.0375
FLOAT fMaxMissionTitleWidth = FLOW_MAX_MISSION_TITLE_WIDTH // if the mission title is longer than this we move the text up
// TIMERS
CONST_FLOAT MISSION_TITLE_DELAY 2.5
CONST_FLOAT MINIGAME_TITLE_DELAY 1.5
/*
// debug stuff for repositioning text
FLOAT fTitleDisplayX = FLOW_MISSION_NAME_POS_X_RACE
FLOAT fTitleDisplayY = FLOW_MISSION_NAME_POS_Y_RACE
FLOAT fTitleTextScaleX = FLOW_MISSION_NAME_SCALE_X
FLOAT fTitleTextScaleY = FLOW_MISSION_NAME_SCALE_Y
FLOAT fTitleSizeX = FLOW_MISSION_NAME_SIZE_X
FLOAT fTitleSizeY = FLOW_MISSION_NAME_SIZE_Y
BOOL bWidgetsSetup = FALSE
BOOL bPrintTitleCoords = FALSE
*/
/// PURPOSE:
/// Returns the Course name Label for this BJ Course
/// PARAMS:
/// iBJCourse - Course ID
/// RETURNS:
/// TEXT_LABEL_7 Course name Label for this BJ Course
FUNC TEXT_LABEL_7 GET_BJ_COURSE_NAME_LABEL(INT iBJCourse)
TEXT_LABEL_7 tCourseNameLabel = ""
TEXT_LABEL_7 tStatID
tStatID = iBJCourse
IF IS_STRING_NULL_OR_EMPTY(tStatID)
SCRIPT_ASSERT("ERROR: GET_BJ_COURSE_NAME_LABEL has been passed an illegal BJ COURSE ID")
ELSE
tCourseNameLabel = "MGBJ_"
tCourseNameLabel += tStatID
ENDIF
RETURN tCourseNameLabel
ENDFUNC
/// PURPOSE:
/// Returns the Lesson name Label for this flight school lesson
/// PARAMS:
/// iFSLesson - Lesson ID
/// RETURNS:
/// TEXT_LABEL_7 Lesson name Label for this FS Lesson
FUNC TEXT_LABEL_7 GET_FS_LESSON_NAME_LABEL(INT iFSLesson)
TEXT_LABEL_7 tLessonNameLabel = ""
TEXT_LABEL_7 tStatID
tStatID = iFSLesson
IF IS_STRING_NULL_OR_EMPTY(tStatID)
SCRIPT_ASSERT("ERROR: GET_FS_LESSON_NAME_LABEL has been passed an illegal FS LESSON ID")
ELSE
tLessonNameLabel = "MGFS_"
tLessonNameLabel += tStatID
ENDIF
RETURN tLessonNameLabel
ENDFUNC
/// PURPOSE:
/// Returns the course name Label for this Stunt plane time trial course
/// PARAMS:
/// iSPTTLesson - Course ID
/// RETURNS:
/// TEXT_LABEL_7 Course name Label for this SPTT Course
FUNC TEXT_LABEL_7 GET_SP_COURSE_NAME_LABEL(INT iSPTTCourse)
TEXT_LABEL_7 tCourseNameLabel = ""
TEXT_LABEL_7 tStatID
tStatID = iSPTTCourse
IF IS_STRING_NULL_OR_EMPTY(tStatID)
SCRIPT_ASSERT("ERROR: GET_SP_COURSE_NAME_LABEL has been passed an illegal SP COURSE ID")
ELSE
tCourseNameLabel = "MGSP_"
tCourseNameLabel += tStatID
ENDIF
RETURN tCourseNameLabel
ENDFUNC
/// PURPOSE:
/// Returns the course name Label for this Offroad race course
/// PARAMS:
/// iORRCourse - Course ID
/// RETURNS:
/// TEXT_LABEL_7 Course name Label for this ORR Course
FUNC TEXT_LABEL_7 GET_OR_COURSE_NAME_LABEL(INT iORRCourse)
TEXT_LABEL_7 tCourseNameLabel = ""
TEXT_LABEL_7 tStatID
tStatID = iORRCourse
IF IS_STRING_NULL_OR_EMPTY(tStatID)
SCRIPT_ASSERT("ERROR: GET_OR_COURSE_NAME_LABEL has been passed an illegal OR COURSE ID")
ELSE
tCourseNameLabel = "MGOR_"
tCourseNameLabel += tStatID
ENDIF
RETURN tCourseNameLabel
ENDFUNC
/// PURPOSE:
/// Returns the course name for this city race
/// PARAMS:
/// iCRCourse - Course ID
/// RETURNS:
/// TEXT_LABEL_7 Course name for this city race
FUNC TEXT_LABEL_7 GET_CR_COURSE_NAME_LABEL(INT iCRCourse)
TEXT_LABEL_7 tCourseNameLabel = ""
TEXT_LABEL_7 tStatID
tStatID = iCRCourse
IF IS_STRING_NULL_OR_EMPTY(tStatID) OR iCRCourse = 3 // City Race 3 no longer exists
SCRIPT_ASSERT("ERROR: GET_CR_COURSE_NAME_LABEL has been passed an illegal CR COURSE ID")
ELSE
tCourseNameLabel = "MGCR_"
tCourseNameLabel += tStatID
ENDIF
RETURN tCourseNameLabel
ENDFUNC
/// PURPOSE:
/// Returns the course name for this sea race
/// PARAMS:
/// iCRCourse - Course ID
/// RETURNS:
/// TEXT_LABEL_7 Course name for this sea race
FUNC TEXT_LABEL_7 GET_SR_COURSE_NAME_LABEL(INT iSRCourse)
TEXT_LABEL_7 tCourseNameLabel = ""
TEXT_LABEL_7 tStatID
tStatID = iSRCourse
IF IS_STRING_NULL_OR_EMPTY(tStatID)
SCRIPT_ASSERT("ERROR: GET_SR_COURSE_NAME_LABEL has been passed an illegal SR COURSE ID")
ELSE
tCourseNameLabel = "MGSR_"
tCourseNameLabel += tStatID
ENDIF
RETURN tCourseNameLabel
ENDFUNC
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Returns the string ID of the story or RC mission
/// RETURNS:
/// STRING id of the mission
FUNC STRING GET_MISSION_DISPLAY_STRING_FROM_ID(enumGrouping eMissionType, INT iMissionID)
SWITCH eMissionType
CASE CP_GROUP_MISSIONS
RETURN GET_SP_MISSION_DISPLAY_STRING_FROM_ID(INT_TO_ENUM(SP_MISSIONS, iMissionID))
CASE CP_GROUP_RANDOMCHARS
RETURN GET_RC_MISSION_DISPLAY_STRING_FROM_ID(INT_TO_ENUM(g_eRC_MissionIDs, iMissionID))
CASE CP_GROUP_MINIGAMES
RETURN "Minigame" //GET_BJ_COURSE_NAME_LABEL(iMissionID)
BREAK
ENDSWITCH
RETURN "Unknown"
ENDFUNC
/*
// debug stuff for repositioning text
PROC SETUP_TITLE_WIDGET()
IF bWidgetsSetup = FALSE
START_WIDGET_GROUP("Mission Titles- Debug")
ADD_WIDGET_FLOAT_SLIDER("title x", fTitleDisplayX, -1.0, 1.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("title y", fTitleDisplayY, -1.0, 1.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("scale x", fTitleTextScaleX, 0.0, 1.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("scale y", fTitleTextScaleY, 0.0, 1.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("fSizeX ", fTitleSizeX, 0.0, 1.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("fSizeY ", fTitleSizeY, 0.0, 1.0, 0.01)
ADD_WIDGET_FLOAT_SLIDER("subtitle shift y", fSubtitleTextPosOffsetY, -1.0, 1.0, 0.1)
ADD_WIDGET_INT_SLIDER("max title length", iMaxMissionTitleLength, 1, 32, 1)
ADD_WIDGET_BOOL("print", bPrintTitleCoords)
STOP_WIDGET_GROUP()
bWidgetsSetup= TRUE
ELSE
IF bPrintTitleCoords = TRUE
CPRINTLN(DEBUG_FLOW, "pos x = ", fTitleDisplayX, " y = ", fTitleDisplayY)
CPRINTLN(DEBUG_FLOW, "scale x = ", fTitleTextScaleX, " y = ", fTitleTextScaleY)
CPRINTLN(DEBUG_FLOW, "size x = ", fTitleSizeX, " y = ", fTitleSizeY)
bPrintTitleCoords = FALSE
ENDIF
ENDIF
ENDPROC
*/
#ENDIF
/// PURPOSE:
/// Returns the text label of the mission name for selected mission
/// PARAMS:
/// iMissionIndex - index of appropriate array
/// eMissionType - CP_GROUP_MISSIONS / CP_GROUP_RANDOMCHARS / CP_GROUP_MINIGAMES
/// RETURNS:
/// the text label of the mission name
FUNC TEXT_LABEL_7 GET_MISSION_TITLE(INT iMissionIndex, enumGrouping eMissionType, INT iVariation)
TEXT_LABEL_7 tMissionNameLabel = ""
SWITCH eMissionType
CASE CP_GROUP_MISSIONS
tMissionNameLabel = GET_SP_MISSION_NAME_LABEL(INT_TO_ENUM(SP_MISSIONS, iMissionIndex))
BREAK
#if not USE_CLF_DLC
#if not USE_NRM_DLC
CASE CP_GROUP_RANDOMCHARS
tMissionNameLabel = GET_RC_MISSION_NAME_LABEL(INT_TO_ENUM(g_eRC_MissionIDs, iMissionIndex))
BREAK
#endif
#endif
CASE CP_GROUP_MINIGAMES
SP_MINIGAMES eMiniGame
eMiniGame = INT_TO_ENUM(SP_MINIGAMES, iMissionIndex)
SWITCH eMiniGame
// minigames with multiple variations
CASE MINIGAME_BASEJUMPING
tMissionNameLabel = GET_BJ_COURSE_NAME_LABEL(iVariation)
BREAK
CASE MINIGAME_STREET_RACES
tMissionNameLabel = GET_CR_COURSE_NAME_LABEL(iVariation)
BREAK
CASE MINIGAME_SEA_RACES
tMissionNameLabel = GET_SR_COURSE_NAME_LABEL(iVariation)
BREAK
CASE MINIGAME_STUNT_PLANES
tMissionNameLabel = GET_SP_COURSE_NAME_LABEL(iVariation)
BREAK
CASE MINIGAME_PILOT_SCHOOL
tMissionNameLabel = GET_FS_LESSON_NAME_LABEL(iVariation)
BREAK
CASE MINIGAME_OFFROAD_RACES
tMissionNameLabel = GET_OR_COURSE_NAME_LABEL(iVariation)
BREAK
// other minigames only have 1 variation
DEFAULT
tMissionNameLabel = GET_MINIGAME_NAME_LABEL(eMiniGame)
BREAK
ENDSWITCH
BREAK
DEFAULT
CPRINTLN(DEBUG_FLOW,"GET_MISSION_TITLE passed an invalid mission type: ", eMissionType)
BREAK
ENDSWITCH
RETURN tMissionNameLabel
ENDFUNC
/// PURPOSE:
/// Stops mission title displaying and resets the variables it uses
PROC MISSION_FLOW_CLEAR_DISPLAY_MISSION_TITLE()
IF g_eMissionTitleState <> MTS_DONE
CPRINTLN(DEBUG_FLOW, "MISSION_FLOW_CLEAR_DISPLAY_MISSION_TITLE() - CALLED BY ", GET_THIS_SCRIPT_NAME())
ENDIF
IF g_bMissionTitleMovedSubtitles
RESET_HUD_COMPONENT_VALUES(NEW_HUD_SUBTITLE_TEXT)
g_bMissionTitleMovedSubtitles = FALSE
// Force the menu system to set the position..
g_sMenuData.bSubtitlesMoved = FALSE
ENDIF
g_eMissionTitleState = MTS_DONE
g_iFlowTimeBeganDisplayMissionTitle = -1
g_iFlowDisplayMissionTitle = -1
ENDPROC
/// PURPOSE:
/// Checks if we can now start displaying the mission name
/// PARAMS:
/// bWaitingToDisplay - TRUE if we are waiting to display title, FALSE if we've already started displaying it
/// RETURNS:
/// TRUE if we can now start displaying the mission name, FALSE otherwise
FUNC BOOL IS_IT_SAFE_TO_DISPLAY_MISSION_NAME(BOOL bWaitingToDisplay, TEXT_LABEL_23 tIntroMocap)
// Some checks that we do in all states
// not on mission, or screen hasn't fade in
IF NOT IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_STORY)
OR g_flowUnsaved.bUpdatingGameflow
OR (g_bMissionTitleBlocked = TRUE)
OR NOT IS_SCREEN_FADED_IN()
//CPRINTLN(DEBUG_FLOW, "IS_IT_SAFE_TO_DISPLAY_MISSION_NAME: Not on mission, not updating flow, or faded out, or title display blocked.")
RETURN FALSE
ENDIF
// State only checks
SWITCH g_eMissionTitleState
CASE MTS_CHECK_INTRO
//Work out if flagged mission has a cutscene.
IF ARE_STRINGS_EQUAL(tIntroMocap, "NONE")
OR IS_STRING_NULL_OR_EMPTY(tIntroMocap)
// this mission doesn't have an intro, skip to post intro stage
g_eMissionTitleState = MTS_POST_INTRO
ELSE
//This mission has an intro cut-scene. Wait for it to load
g_eMissionTitleState = MTS_LOAD_INTRO
ENDIF
BREAK
CASE MTS_LOAD_INTRO
// wait for intro to load
IF HAS_CUTSCENE_LOADED()
g_eMissionTitleState = MTS_PLAY_INTRO
ELSE
//CPRINTLN(DEBUG_FLOW, "IS_IT_SAFE_TO_DISPLAY_MISSION_NAME: Mission waiting for intro to load.")
ENDIF
BREAK
CASE MTS_PLAY_INTRO
//Show title part way through intro cut-scene
IF IS_CUTSCENE_PLAYING()
//CPRINTLN(DEBUG_FLOW, "IS_IT_SAFE_TO_DISPLAY_MISSION_NAME: Intro has started playing.")
g_eMissionTitleState = MTS_DISPLAY_CUTSCENE
RETURN TRUE
ELSE
IF NOT IS_CUTSCENE_ACTIVE()
//CPRINTLN(DEBUG_FLOW, "IS_IT_SAFE_TO_DISPLAY_MISSION_NAME: Intro skipped.")
// cut-scene has been skipped- show title now
g_eMissionTitleState = MTS_POST_INTRO
ENDIF
ENDIF
BREAK
CASE MTS_POST_INTRO
// Mission has no intro, or it is finished
// safe to display as long as there isn't another cut-scene playing
IF IS_CUTSCENE_PLAYING()
//CPRINTLN(DEBUG_FLOW, "IS_IT_SAFE_TO_DISPLAY_MISSION_NAME: Post intro, waiting for a cut-scene to end.")
ELSE
//CPRINTLN(DEBUG_FLOW, "IS_IT_SAFE_TO_DISPLAY_MISSION_NAME: Post intro + no cut-scene playing..")
g_eMissionTitleState = MTS_DISPLAY_GAMEPLAY
RETURN TRUE
ENDIF
BREAK
CASE MTS_DISPLAY_CUTSCENE
IF IS_CUTSCENE_PLAYING()
//CPRINTLN(DEBUG_FLOW, "IS_IT_SAFE_TO_DISPLAY_MISSION_NAME: MTS_DISPLAY_CUTSCENE, cut-scene playing, still safe.")
RETURN TRUE
ELSE
//CPRINTLN(DEBUG_FLOW, "IS_IT_SAFE_TO_DISPLAY_MISSION_NAME: MTS_DISPLAY_CUTSCENE. cut-scene ended")
IF bWaitingToDisplay = TRUE
// If we're not already displaying the title, we need to change state
// and try to display it over gameplay instead
g_eMissionTitleState = MTS_DISPLAY_GAMEPLAY
ENDIF
ENDIF
BREAK
CASE MTS_DISPLAY_GAMEPLAY
// displaying title over gameplay...
//safe to do so unless a cut-scene starts or the phone is onscreen
IF IS_CUTSCENE_PLAYING()
OR IS_PHONE_ONSCREEN()
OR IS_SELECTOR_ONSCREEN()
//CPRINTLN(DEBUG_FLOW, "IS_IT_SAFE_TO_DISPLAY_MISSION_NAME: MTS_DISPLAY_GAMEPLAY, cut-scene started / phone / seelctor on screen.")
ELSE
//CPRINTLN(DEBUG_FLOW, "IS_IT_SAFE_TO_DISPLAY_MISSION_NAME: MTS_DISPLAY_GAMEPLAY. still safe")
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Checks to see if the flow has requested a mission title be displayed on screen.
/// Waits for any display-only-when conditions are met and then fades in the title,
/// leaves it onscreen for a predetermined amount fo time, and then fades it out.
/// PARAMS:
/// tIntroMocap - the text label of the mocap for this mission
/// bUsesRaceHUD - does this mission use the race HUD? (like Fanatic 1-3)
/// bRampage - Is this mission a rampage? (they also have a HUD display in bottom right)
/// iVariation - used by minigames to specify which variation is running, so we get correct title
PROC UPDATE_MISSION_NAME_DISPLAYING(TEXT_LABEL_23 tIntroMocap, BOOL bUsesRaceHUD = FALSE, BOOL bRampage = FALSE, BOOL bTimeLimit = FALSE, BOOL bTimerBar = FALSE, INT iVariation=0)
//Check for new display requests.
IF g_eMissionTitleState <> MTS_DONE
// we are still waiting to display the title
IF g_iFlowTimeBeganDisplayMissionTitle = -1 // (this is reset to -1 when we start a mission)
IF IS_IT_SAFE_TO_DISPLAY_MISSION_NAME(TRUE, tIntroMocap)
FLOAT fTitleDelay
IF g_eMissionTitleType = CP_GROUP_MINIGAMES
fTitleDelay = MINIGAME_TITLE_DELAY
ELSE
fTitleDelay = MISSION_TITLE_DELAY
ENDIF
IF fSafeToDisplayTimer > fTitleDelay
// it has been safe to display title for long enough now, show the title
CPRINTLN(DEBUG_FLOW, "Started displaying mission title for ", GET_MISSION_DISPLAY_STRING_FROM_ID(g_eMissionTitleType, g_iFlowDisplayMissionTitle), ".")
g_iFlowTimeBeganDisplayMissionTitle = GET_GAME_TIMER()
vOriginalSubtitleTextPos = GET_HUD_COMPONENT_POSITION(NEW_HUD_SUBTITLE_TEXT)
fSafeToDisplayTimer = 0.0
ELSE
// not been safe to display long enough yet, increase timer
fSafeToDisplayTimer += GET_FRAME_TIME()
ENDIF
ELSE
// not safe to start displaying title, reset safe timer
fSafeToDisplayTimer = 0.0
ENDIF
ELSE
// we are currently displaying the title
INT iTimeDisplayed
INT iAlpha
INT iTimeLeft
TEXT_LABEL_7 txtMissionTitle
FLOAT fDisplayX, fDisplayY
IF NOT IS_IT_SAFE_TO_DISPLAY_MISSION_NAME(FALSE, tIntroMocap)
CPRINTLN(DEBUG_FLOW, "No longer safe to display mission title for ", GET_MISSION_DISPLAY_STRING_FROM_ID(g_eMissionTitleType, g_iFlowDisplayMissionTitle), ". Clearing early.")
g_iFlowTimeBeganDisplayMissionTitle = GET_GAME_TIMER() - FLOW_MISSION_NAME_DISPLAY_TIME
ENDIF
//Block area name from displaying as this will clash.
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_VEHICLE_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_DISTRICT_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_STREET_NAME)
iTimeDisplayed = GET_GAME_TIMER() - g_iFlowTimeBeganDisplayMissionTitle
IF iTimeDisplayed < FLOW_MISSION_NAME_DISPLAY_TIME
AND NOT IS_SCREEN_FADED_OUT()
iAlpha = 255
IF iTimeDisplayed < FLOW_MISSION_NAME_DISPLAY_FADE_TIME
//Fade text in over the first second.
iAlpha = CEIL(TO_FLOAT(iTimeDisplayed)/1000.0*255.0)
ELSE
iTimeLeft = FLOW_MISSION_NAME_DISPLAY_TIME - iTimeDisplayed
IF iTimeLeft < FLOW_MISSION_NAME_DISPLAY_FADE_TIME
//Fade text out over the last second.
iAlpha = CEIL(TO_FLOAT(iTimeLeft)/1000.0*255.0)
ENDIF
ENDIF
// set position of text
SWITCH g_eMissionTitleState
CASE MTS_POST_INTRO
CASE MTS_DISPLAY_GAMEPLAY
// if we are displaying over gameplay we may need to adjust y value
IF bUsesRaceHUD = TRUE
fDisplayX = FLOW_MISSION_NAME_POS_X_RACE
fDisplayY = FLOW_MISSION_NAME_POS_Y_RACE
ELIF bRampage = TRUE
fDisplayX = FLOW_MISSION_NAME_POS_X_RAMPAGE
fDisplayY = FLOW_MISSION_NAME_POS_Y_RAMPAGE
ELIF bTimeLimit = TRUE
fDisplayX= FLOW_MISSION_NAME_POS_X_TIME_LIMIT
fDisplayY= FLOW_MISSION_NAME_POS_Y_TIME_LIMIT
ELIF bTimerBar = TRUE
fDisplayX= FLOW_MISSION_NAME_POS_X_TIMER_BAR
fDisplayY= FLOW_MISSION_NAME_POS_Y_TIMER_BAR
ELSE
// use default
fDisplayX= FLOW_MISSION_NAME_POS_X
fDisplayY= FLOW_MISSION_NAME_POS_Y
ENDIF
BREAK
DEFAULT
// otherwise use default value
fDisplayX= FLOW_MISSION_NAME_POS_X
fDisplayY= FLOW_MISSION_NAME_POS_Y
BREAK
ENDSWITCH
//Render title.
// SETUP_TITLE_WIDGET()
// UNUSED_PARAMETER(fDisplayX)
// UNUSED_PARAMETER(fDisplayY)
SET_SCRIPT_GFX_ALIGN(UI_ALIGN_RIGHT, UI_ALIGN_BOTTOM)
SET_TEXT_FONT(FONT_CURSIVE)
SET_TEXT_JUSTIFICATION(FONT_RIGHT)
INT red, green, blue, alpha_value
enumCharacterList ePlayerCharForColour = GET_CURRENT_PLAYER_PED_ENUM()
#IF NOT USE_SP_DLC
// Fix for 1993570: For Trevor1 use the previous player's colour.
IF g_eMissionTitleType = CP_GROUP_MISSIONS
AND g_iFlowDisplayMissionTitle = ENUM_TO_INT(SP_MISSION_TREVOR_1)
ePlayerCharForColour = g_savedGlobals.sPlayerData.sInfo.ePreviousPed
ENDIF
#ENDIF
// this is the default color - if we aren't a player character use this
SWITCH ePlayerCharForColour
CASE CHAR_MICHAEL
GET_HUD_COLOUR(HUD_COLOUR_MICHAEL, red, green, blue, alpha_value)
BREAK
CASE CHAR_FRANKLIN
GET_HUD_COLOUR(HUD_COLOUR_FRANKLIN, red, green, blue, alpha_value)
BREAK
CASE CHAR_TREVOR
GET_HUD_COLOUR(HUD_COLOUR_TREVOR, red, green, blue, alpha_value)
BREAK
DEFAULT
red = 240
green = 200
blue = 80
ENDSWITCH
SET_TEXT_COLOUR(red, green, blue, iAlpha) // yellow text
SET_TEXT_DROP_SHADOW()
txtMissionTitle = GET_MISSION_TITLE(g_iFlowDisplayMissionTitle ,g_eMissionTitleType, iVariation)
// debug version- for tweaking values
// SET_SCRIPT_GFX_ALIGN_PARAMS(fTitleDisplayX, fTitleDisplayY, fTitleSizeX, fTitleSizeY)
// SET_TEXT_SCALE(fTitleTextScaleX, fTitleTextScaleY)
//
// BEGIN_TEXT_COMMAND_DISPLAY_TEXT(txtMissionTitle)
// END_TEXT_COMMAND_DISPLAY_TEXT(fTitleDisplayX, fTitleDisplayY)
// B*1396018 - Shift the subtitle if we using the default mission name pos
IF (fDisplayY = FLOW_MISSION_NAME_POS_Y)
/*
IF (GET_LENGTH_OF_STRING_WITH_THIS_TEXT_LABEL(txtMissionTitle) > iMaxMissionTitleLength)
IF IS_HUD_COMPONENT_ACTIVE(NEW_HUD_SUBTITLE_TEXT)
SET_HUD_COMPONENT_POSITION(NEW_HUD_SUBTITLE_TEXT, vOriginalSubtitleTextPos.x, vOriginalSubtitleTextPos.y + fSubtitleTextPosOffsetY)
ENDIF
ENDIF
*/
ENDIF
// in game version
SET_SCRIPT_GFX_ALIGN_PARAMS(fDisplayX, fDisplayY, FLOW_MISSION_NAME_SIZE_X, FLOW_MISSION_NAME_SIZE_Y)
SET_TEXT_SCALE(FLOW_MISSION_NAME_SCALE_X, FLOW_MISSION_NAME_SCALE_Y)
// if 4:3 use smaller value
IF (NOT GET_IS_WIDESCREEN() AND NOT GET_IS_HIDEF())
fMaxMissionTitleWidth = FLOW_MAX_MISSION_TITLE_WIDTH_4_3
//CPRINTLN(DEBUG_ACHIEVEMENT, "[4:3] MISSION TITLE:", txtMissionTitle, " WIDTH:", GET_STRING_WIDTH(txtMissionTitle), " MAX:", fMaxMissionTitleWidth)
ELSE
fMaxMissionTitleWidth = FLOW_MAX_MISSION_TITLE_WIDTH
//CPRINTLN(DEBUG_ACHIEVEMENT, "MISSION TITLE:", txtMissionTitle, " WIDTH:", GET_STRING_WIDTH(txtMissionTitle), " MAX:", fMaxMissionTitleWidth)
ENDIF
IF (fDisplayY = FLOW_MISSION_NAME_POS_Y)
IF (GET_STRING_WIDTH(txtMissionTitle) > fMaxMissionTitleWidth)
IF IS_HUD_COMPONENT_ACTIVE(NEW_HUD_SUBTITLE_TEXT)
SET_HUD_COMPONENT_POSITION(NEW_HUD_SUBTITLE_TEXT, vOriginalSubtitleTextPos.x, vOriginalSubtitleTextPos.y + fSubtitleTextPosOffsetY)
g_bMissionTitleMovedSubtitles = TRUE
ENDIF
ENDIF
ENDIF
BEGIN_TEXT_COMMAND_DISPLAY_TEXT(txtMissionTitle)
END_TEXT_COMMAND_DISPLAY_TEXT(fDisplayX, fDisplayY)
RESET_SCRIPT_GFX_ALIGN()
// if mission title is blocked clear the state
IF (g_bMissionTitleBlocked = TRUE)
CPRINTLN(DEBUG_FLOW, " Mission Title Display has been blocked")
MISSION_FLOW_CLEAR_DISPLAY_MISSION_TITLE()
fSafeToDisplayTimer = 0.0
ENDIF
ELSE
//Deactive completed display request.
CPRINTLN(DEBUG_FLOW, "Finished displaying mission title for ", GET_MISSION_DISPLAY_STRING_FROM_ID(g_eMissionTitleType, g_iFlowDisplayMissionTitle), ".")
MISSION_FLOW_CLEAR_DISPLAY_MISSION_TITLE()
fSafeToDisplayTimer = 0.0
ENDIF
ENDIF
ELSE
// done, wait for new request
ENDIF
ENDPROC
/// PURPOSE:
/// Tells the mission title system that a story mission is launching
/// PARAMS:
/// paramMissionID - the RC mission that is launching
PROC MISSION_FLOW_DISPLAY_MISSION_TITLE(SP_MISSIONS paramMissionID)
CPRINTLN(DEBUG_FLOW, GET_THIS_SCRIPT_NAME(), " requested to display mission title for mission ", GET_MISSION_DISPLAY_STRING_FROM_ID(CP_GROUP_MISSIONS, ENUM_TO_INT(paramMissionID)) ,".")
IF ENUM_TO_INT(paramMissionID) < ENUM_TO_INT(SP_MISSION_MAX)
MISSION_FLOW_CLEAR_DISPLAY_MISSION_TITLE()
g_iFlowDisplayMissionTitle = ENUM_TO_INT(paramMissionID)
g_eMissionTitleState = MTS_CHECK_INTRO
g_eMissionTitleType = CP_GROUP_MISSIONS
ELSE
SCRIPT_ASSERT("MISSION_FLOW_DISPLAY_MISSION_TITLE: Tried to start displaying a mission intro name for an invalid mission enum.")
ENDIF
ENDPROC
/// PURPOSE:
/// Tells the mission title system that an RC mission is launching
/// PARAMS:
/// eMissionID - the RC mission that is launching
PROC RANDOM_CHAR_DISPLAY_MISSION_TITLE(g_eRC_MissionIDs eMissionID)
CPRINTLN(DEBUG_FLOW, GET_THIS_SCRIPT_NAME(), " requested to display mission title for mission ", GET_MISSION_DISPLAY_STRING_FROM_ID(CP_GROUP_RANDOMCHARS, ENUM_TO_INT(eMissionID)) ,".")
IF ENUM_TO_INT(eMissionID) < ENUM_TO_INT(MAX_RC_MISSIONS)
MISSION_FLOW_CLEAR_DISPLAY_MISSION_TITLE()
g_iFlowDisplayMissionTitle = ENUM_TO_INT(eMissionID)
g_eMissionTitleState = MTS_CHECK_INTRO
g_eMissionTitleType = CP_GROUP_RANDOMCHARS
ELSE
SCRIPT_ASSERT("RANDOM_CHAR_DISPLAY_MISSION_TITLE: Tried to start displaying a mission intro name for an invalid mission enum.")
ENDIF
ENDPROC
/// PURPOSE:
/// Tells the mission title system that a minigame is launching
/// PARAMS:
/// eMissionID- the minigame that is launching
PROC MINIGAME_DISPLAY_MISSION_TITLE(INT iMinigame)
CPRINTLN(DEBUG_FLOW, GET_THIS_SCRIPT_NAME(), " requested to display mission title for mission ", GET_MISSION_DISPLAY_STRING_FROM_ID(CP_GROUP_MINIGAMES, iMinigame) ,".")
MISSION_FLOW_CLEAR_DISPLAY_MISSION_TITLE()
g_iFlowDisplayMissionTitle = iMinigame
g_eMissionTitleState = MTS_CHECK_INTRO
g_eMissionTitleType = CP_GROUP_MINIGAMES
ENDPROC
/// PURPOSE:
/// determine when the mission title has gone away
/// RETURNS:
/// g_eMissionTitleState = MTS_DONE
FUNC BOOL IS_MISSION_TITLE_FINISHED()
RETURN g_eMissionTitleState = MTS_DONE
ENDFUNC
/// PURPOSE:
/// Tells the mission title system to go into block state
/// PARAMS:
/// bBlock - block or unblock
PROC BLOCK_MISSION_TITLE(BOOL bBlock = TRUE)
CPRINTLN(DEBUG_FLOW, GET_THIS_SCRIPT_NAME(), " has set the mission title blocking to ", bBlock)
g_bMissionTitleBlocked = bBlock
ENDPROC
FUNC BOOL IS_MISSION_TITLE_BLOCKED()
RETURN g_bMissionTitleBlocked
ENDFUNC