Files
2025-09-29 00:52:08 +02:00

1492 lines
58 KiB
Scheme
Executable File

USING "minigames_helpers.sch"
USING "golf.sch"
USING "golf_buddies_lib.sch"
ENUM GOLF_PLAYERCARD_BITS
PCB_NONE = 0,
PCB_HIGHLiGHT = BIT0,
PCB_MP = BIT1,
PCB_CREWTAG = BIT2,
PCB_READY = BIT3,
PCB_HIDE_BALL = BIT4,
PCB_INACTIVE_HEADSET = BIT24,
PCB_TALKING_HEADSET = BIT25
ENDENUM
ENUM GOLF_HEADSET_STATE
GOLF_HEADSET_NONE = 0,
GOLF_HEADSET_INACTIVE = 1,
GOLF_HEADSET_ACTIVE = 2,
GOLF_HEADSET_MUTE = 3
ENDENUM
PROC PLAY_GOLF_SPLASH_SOUND(GOLF_SPLASH_TEXT_ENUM eSplashEnum)
IF eSplashEnum = GOLF_SPLASH_HOLE_IN_ONE
CDEBUG1LN(DEBUG_GOLF,"Play hole in one sound")
PLAY_SOUND_FRONTEND(-1, "GOLF_HUD_HOLE_IN_ONE_MASTER")
ELIF eSplashEnum = GOLF_SPLASH_EAGLE2
OR eSplashEnum = GOLF_SPLASH_EAGLE
CDEBUG1LN(DEBUG_GOLF,"Play eagle sound")
PLAY_SOUND_FRONTEND(-1, "GOLF_EAGLE", "HUD_AWARDS")
ELIF eSplashEnum = GOLF_SPLASH_BIRDIE
CDEBUG1LN(DEBUG_GOLF,"Play birdie sound")
PLAY_SOUND_FRONTEND(-1, "GOLF_BIRDIE", "HUD_AWARDS")
ELIF eSplashEnum = GOLF_SPLASH_CLOSEST_TO_PIN
OR eSplashEnum = GOLF_SPLASH_LONGEST_DIVE
OR eSplashEnum = GOLF_SPLASH_LONGEST_HOLE
CDEBUG1LN(DEBUG_GOLF,"Play new record sound")
PLAY_SOUND_FRONTEND(-1, "GOLF_NEW_RECORD", "HUD_AWARDS")
ELSE
CDEBUG1LN(DEBUG_GOLF,"Play other splash sound")
PLAY_SOUND_FRONTEND(-1, "OTHER_TEXT", "HUD_AWARDS")
ENDIF
ENDPROC
PROC SET_SPLASH_TEXT(GOLF_HELPERS &thisHelpers, GOLF_SPLASH_TEXT_ENUM eSplashEnum = GOLF_SPLASH_NONE, STRING sSplash = NULL, STRING sStrapline = NULL, INT iNumInStrap = -1, INT iDuration = 4000)
CDEBUG1LN(DEBUG_GOLF, "SPLASH - ", sSplash)
HUD_COLOURS eHudColor = HUD_COLOUR_YELLOW
IF (eSplashEnum >= GOLF_SPLASH_BOGEY AND eSplashEnum <= GOLF_SPLASH_BOGEY5)
OR (eSplashEnum >= GOLF_SPLASH_OOB AND eSplashEnum <= GOLF_SPLASH_SCORE_LIMIT)
eHudColor = HUD_COLOUR_RED
ENDIF
IF IS_STRING_NULL(sSplash)
sSplash = ""
CLEAR_GOLF_SPLASH()
ELSE
thisHelpers.eLastSplashText = eSplashEnum
SET_GOLF_UI_FLAG(thisHelpers, GUC_SPLASH_TEXT_DISPLAYED_THIS_TURN)
IF iNumInStrap >= 0
PLAY_GOLF_SPLASH_WITH_INT_IN_STRAP(sSplash, iNumInStrap, sStrapline, GOLF_SPLASH_SHARD_MIDSIZED, eHudColor, iDuration)
ELSE
IF eSplashEnum = GOLF_SPLASH_HOLE_IN_ONE OR eSplashEnum = GOLF_SPLASH_EAGLE2
OR eSplashEnum = GOLF_SPLASH_EAGLE OR eSplashEnum = GOLF_SPLASH_BIRDIE
HUD_COLOURS eEndHudColor = HUD_COLOUR_YELLOW
IF IS_GOLF_FOURSOME_MP()
eEndHudColor = HUD_COLOUR_BLUE
ENDIF
PLAY_GOLF_SPLASH(sSplash, sStrapline, GOLF_SPLASH_SHARD_MIDSIZED, eHudColor, iDuration, FALSE, eEndHudColor)
ELSE
PLAY_GOLF_SPLASH(sSplash, sStrapline, GOLF_SPLASH_SHARD_MIDSIZED, eHudColor, iDuration)
ENDIF
ENDIF
IF eSplashEnum != GOLF_SPLASH_NONE
PLAY_GOLF_SPLASH_SOUND(eSplashEnum)
ENDIF
ENDIF
ENDPROC
PROC OVERWRITE_GOLF_UI_DISPLAY(GOLF_HELPERS &thisHelpers, GOLF_UI_DISPLAY_STATE uiState)
thisHelpers.eCurrentGolfUIDisplay = uiState
ENDPROC
PROC SET_GOLF_UI_DISPLAY(GOLF_HELPERS &thisHelpers, GOLF_UI_DISPLAY_STATE uiState)
thisHelpers.eCurrentGolfUIDisplay = thisHelpers.eCurrentGolfUIDisplay | uiState
ENDPROC
PROC CLEAR_GOLF_UI_DISPLAY(GOLF_HELPERS &thisHelpers, GOLF_UI_DISPLAY_STATE uiState)
thisHelpers.eCurrentGolfUIDisplay -= thisHelpers.eCurrentGolfUIDisplay & uiState
ENDPROC
PROC MANAGE_GOLF_UI_DISPLAY(GOLF_HELPERS &thisHelpers)
GOLF_UI_DISPLAY_STATE eDisplayUI = thisHelpers.eCurrentGolfUIDisplay
IF NOT IS_MINIMAP_RENDERING()
eDisplayUI -= eDisplayUI & GOLF_DISPLAY_HOLE //don't show the box if the minimap isn't rendering
ENDIF
IF eDisplayUI != thisHelpers.ePreviousGolfUIDisplay
CDEBUG1LN(DEBUG_GOLF,"Change ui display state")
IF (thisHelpers.eCurrentGolfUIDisplay & GOLF_DISPLAY_HOLE) != GOLF_DISPLAY_NONE
CDEBUG1LN(DEBUG_GOLF,"GOLF_DISPLAY_HOLE")
ENDIF
IF (thisHelpers.eCurrentGolfUIDisplay & GOLF_DISPLAY_SHOT) != GOLF_DISPLAY_NONE
CDEBUG1LN(DEBUG_GOLF,"GOLF_DISPLAY_SHOT")
ENDIF
IF (thisHelpers.eCurrentGolfUIDisplay & GOLF_DISPLAY_METER) != GOLF_DISPLAY_NONE
CDEBUG1LN(DEBUG_GOLF,"GOLF_DISPLAY_METER")
ENDIF
IF (thisHelpers.eCurrentGolfUIDisplay & GOLF_DISPLAY_PLAYERCARD) != GOLF_DISPLAY_NONE
CDEBUG1LN(DEBUG_GOLF,"GOLF_DISPLAY_PLAYERCARD")
ENDIF
//When the scoreboard is up, we don't want anything else up
IF (thisHelpers.eCurrentGolfUIDisplay & GOLF_DISPLAY_SCOREBOARD) != GOLF_DISPLAY_NONE
CDEBUG1LN(DEBUG_GOLF,"GOLF_DISPLAY_SCOREBOARD")
BEGIN_SCALEFORM_MOVIE_METHOD(thisHelpers.golfUI, "SET_DISPLAY")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(GOLF_DISPLAY_SCOREBOARD))
END_SCALEFORM_MOVIE_METHOD()
ELSE
CDEBUG1LN(DEBUG_GOLF,"GOLF_DISPLAY_UI")
BEGIN_SCALEFORM_MOVIE_METHOD(thisHelpers.golfUI, "SET_DISPLAY")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(eDisplayUI))
END_SCALEFORM_MOVIE_METHOD()
ENDIF
thisHelpers.ePreviousGolfUIDisplay = eDisplayUI
ENDIF
ENDPROC
FUNC TEXT_LABEL GET_SCORE_TEXT(INT iScore, INT iCurrentPar, HUD_COLOURS &eScoreColour)
TEXT_LABEL txtScore
IF iScore != iCurrentPar
IF iScore < iCurrentPar
eScoreColour = HUD_COLOUR_GREEN
txtScore = "-"
ELSE
eScoreColour = HUD_COLOUR_RED
txtScore = "+"
ENDIF
txtScore += ABSI(iScore - iCurrentPar)
ELSE
eScoreColour = HUD_COLOUR_BLACK
txtScore = "E"
ENDIF
RETURN txtScore
ENDFUNC
FUNC INT GET_SCORE_ICON_FOR_HOLE(INT iHole, INT iScore, INT iPar)
CDEBUG1LN(DEBUG_GOLF,"Checking icon for hole ", iHole , " score " ,iScore , " par ", iPar)
IF iPar = iScore
CDEBUG1LN(DEBUG_GOLF,"Par on hole ", iHole)
RETURN 0 //no mark
ENDIF
INT iBit = BIT6 //mark hole in one
iBit = SHIFT_LEFT(iBit, (iHole*2)) //shift for current hole, each hole is two bits
IF iScore = 1
//we are good
ELSE
IF iScore < iPar
CDEBUG1LN(DEBUG_GOLF,"Below on hole ", iHole)
iBit = SHIFT_LEFT(iBit, 1) //shift one for below par
ELSE
//mark the next bit as well as the current for above par
CDEBUG1LN(DEBUG_GOLF,"Above on hole ", iHole)
iBit |= SHIFT_LEFT(iBit, 1)
ENDIF
ENDIF
RETURN iBit
ENDFUNC
#IF NOT GOLF_IS_AI_ONLY
PROC INITIALISE_PLAYERCARD_SCORES(GOLF_FOURSOME &thisFoursome)
INT iPlayerIndex
REPEAT GET_GOLF_FOURSOME_NUM_PLAYERS(thisFoursome) iPlayerIndex
thisFoursome.playerCore[iPlayerIndex].playerCard.iCardScore = 0
ENDREPEAT
ENDPROC
PROC SET_PLAYERCARD_SCORES(GOLF_FOURSOME &thisFoursome, GOLF_HELPERS &thisHelpers, INT iPlayerIndex, INT iScore, BOOL bNextHole)
INT iHole, iCurrentPar, iCurrentHole
iCurrentHole = GET_GOLF_FOURSOME_CURRENT_HOLE(thisFoursome)
IF bNextHole
iCurrentHole = GET_GOLF_FOURSOME_CURRENT_HOLE(thisFoursome) + 1
ENDIF
REPEAT iCurrentHole iHole
IF IS_HOLE_IN_PLAY(thisHelpers, iHole)
iCurrentPar += GET_GOLF_HOLE_PAR_STATIC(iHole)
ENDIF
ENDREPEAT
CDEBUG1LN(DEBUG_GOLF,"Setting card score of player ", iPlayerIndex ," to ", (iScore - iCurrentPar))
thisFoursome.playerCore[iPlayerIndex].playerCard.iCardScore = (iScore - iCurrentPar)
ENDPROC
FUNC INT GET_SLOT_FOR_SCORE(GOLF_FOURSOME &thisFoursome, GOLF_PLAYER_SCORECARD &playerCard)
INT iPlayerIndex
INT iSlot = 0
REPEAT GET_GOLF_FOURSOME_NUM_PLAYERS(thisFoursome) iPlayerIndex
IF NOT IS_GOLF_FOURSOME_INDEXED_PLAYER_CONTROL_FLAG_SET(thisFoursome, iPlayerIndex, GOLF_PLAYER_REMOVED)
IF iPlayerIndex != playerCard.ID
IF thisFoursome.playerCore[iPlayerIndex].playerCard.iCardScore < playerCard.iCardScore
iSlot++ //my score is bigger then someones, increase my index
ELIF thisFoursome.playerCore[iPlayerIndex].playerCard.iCardScore = playerCard.iCardScore
//my score is equal to someones
CDEBUG1LN(DEBUG_GOLF,"PLayer ", iPlayerIndex, " and player ", playerCard.ID, " have equal scores")
IF iPlayerIndex < playerCard.ID
//I have the larger player id
iSlot++
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
RETURN iSlot
ENDFUNC
PROC SET_PLAYERCARD_SLOT(GOLF_HELPERS &thisHelpers, GOLF_FOURSOME &thisFoursome, GOLF_PLAYER_SCORECARD &playerCard, INT iScore, BOOL bUseLiteralName, BOOL bNextHole, INT netIndex = -1)
TEXT_LABEL txtScore
HUD_COLOURS eScoreColour
GOLF_PLAYERCARD_BITS eStatus
INT iHole, iCurrentPar, iCurrentHole
IF playerCard.ID < 0
CDEBUG1LN(DEBUG_GOLF,"Trying to set card of invalid player")
EXIT
ENDIF
iCurrentHole = GET_GOLF_FOURSOME_CURRENT_HOLE(thisFoursome)
IF bNextHole
iCurrentHole = GET_GOLF_FOURSOME_CURRENT_HOLE(thisFoursome) + 1
ENDIF
REPEAT iCurrentHole iHole
IF IS_HOLE_IN_PLAY(thisHelpers, iHole)
iCurrentPar += GET_GOLF_HOLE_PAR_STATIC(iHole)
ENDIF
ENDREPEAT
CDEBUG1LN(DEBUG_GOLF,"Finding score after hole ", iCurrentHole, " Score passed in is ", iScore)
txtScore = GET_SCORE_TEXT(iScore, iCurrentPar, eScoreColour)
CDEBUG1LN(DEBUG_GOLF,"Current player is ", GET_GOLF_FOURSOME_CURRENT_PLAYER(thisFoursome))
IF GET_GOLF_FOURSOME_CURRENT_PLAYER(thisFoursome) = playerCard.ID
eStatus |= PCB_HIGHLiGHT
ENDIF
IF IS_GOLF_FOURSOME_MP()
eStatus |= PCB_MP
IF NOT IS_STRING_EMPTY(playerCard.crewTag)
eStatus |= PCB_CREWTAG
ENDIF
PARTICIPANT_INDEX partIndex = INT_TO_PARTICIPANTINDEX(netIndex)
IF NETWORK_IS_PARTICIPANT_ACTIVE(partIndex)
GAMER_HANDLE gamer = GET_GAMER_HANDLE_PLAYER( NETWORK_GET_PLAYER_INDEX(partIndex) )
IF NETWORK_PLAYER_HAS_HEADSET(NETWORK_GET_PLAYER_INDEX(partIndex))
IF NETWORK_IS_PLAYER_MUTED_BY_ME(NETWORK_GET_PLAYER_INDEX(partIndex))
eStatus |= (PCB_INACTIVE_HEADSET | PCB_TALKING_HEADSET) //muted headset
ELSE
IF NETWORK_IS_PLAYER_TALKING(NETWORK_GET_PLAYER_INDEX(partIndex))
OR NETWORK_IS_CHATTING_IN_PLATFORM_PARTY(gamer) OR NETWORK_IS_GAMER_TALKING(gamer)
eStatus |= PCB_TALKING_HEADSET //talking headset
ELSE
eStatus |= PCB_INACTIVE_HEADSET //inactive headset
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
INT iSlot = GET_SLOT_FOR_SCORE(thisFoursome, playerCard)
playerCard.iCurrentSlot = iSlot
CDEBUG1LN(DEBUG_GOLF,"Head shot texture for player ", playerCard.ID, " ", playerCard.mugShotName)
CDEBUG1LN(DEBUG_GOLF,"Crew tag for player, ", playerCard.crewTag)
CDEBUG1LN(DEBUG_GOLF,"Slot, ", iSlot)
BEGIN_SCALEFORM_MOVIE_METHOD(thisHelpers.golfUI, "SET_PLAYERCARD_SLOT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iSlot) //spot on card
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(eStatus)) //state
IF bUseLiteralName
SCALEFORM_MOVIE_METHOD_ADD_PARAM_PLAYER_NAME(playerCard.sPlayerName) //Player name
ELSE
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(playerCard.sPlayerName) //Player name from text file
ENDIF
SCALEFORM_MOVIE_METHOD_ADD_PARAM_PLAYER_NAME(playerCard.crewTag) //Crew Tag
SCALEFORM_MOVIE_METHOD_ADD_PARAM_PLAYER_NAME(playerCard.mugShotDic)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_PLAYER_NAME(playerCard.mugShotName)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(playerCard.eBallColour)) //ball colour
SCALEFORM_MOVIE_METHOD_ADD_PARAM_PLAYER_NAME(txtScore) //score text
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(eScoreColour)) //score colour
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SET_SCOREBOARD_SLOT(GOLF_HELPERS &thisHelpers, GOLF_COURSE &thisCourse, GOLF_FOURSOME &thisFoursome, GOLF_PLAYER &Player, GOLF_PLAYER_SCORECARD &playerCard, BOOL bUseLiteralName, BOOL bNextHole, BOOL bSetReady = FALSE)
TEXT_LABEL txtScore
TEXT_LABEL txtStrokes[18]
HUD_COLOURS eScoreColour
INT iScore = 0
INT iCurrentPar = 0
GOLF_PLAYERCARD_BITS eStatus
INT iHole, iCurrentHole
CDEBUG1LN(DEBUG_GOLF,"set scoreboard slot")
DEBUG_PRINTCALLSTACK()
IF playerCard.ID < 0
CDEBUG1LN(DEBUG_GOLF,"Trying to set scoreboard of invalid player")
EXIT
ENDIF
IF bNextHole
CDEBUG1LN(DEBUG_GOLF,"Set scoreboard slot for next hole")
iCurrentHole = GET_GOLF_FOURSOME_CURRENT_HOLE(thisFoursome) + 1
ELSE
iCurrentHole = GET_GOLF_FOURSOME_CURRENT_HOLE(thisFoursome)
ENDIF
IF GET_GOLF_FOURSOME_LOCAL_PLAYER(thisFoursome) = playerCard.ID
eStatus |= PCB_HIGHLiGHT
ENDIF
IF IS_GOLF_FOURSOME_MP()
eStatus |= PCB_MP
IF NOT IS_STRING_EMPTY(playerCard.crewTag)
eStatus |= PCB_CREWTAG
ENDIF
ENDIF
IF bSetReady
eStatus |= PCB_READY
ENDIF
REPEAT GET_GOLF_COURSE_NUM_HOLES(thisCourse) iHole
IF IS_HOLE_IN_PLAY(thisHelpers, iHole)
CDEBUG1LN(DEBUG_GOLF,"Score on hole ", iHole, " is ", Player.iCourseScore[iHole].iHoleScore)
IF Player.iCourseScore[iHole].iHoleScore != 0
AND iHole < iCurrentHole //causes problems in total par slot when looping
txtStrokes[iHole] = Player.iCourseScore[iHole].iHoleScore
iScore += Player.iCourseScore[iHole].iHoleScore
eStatus |= INT_TO_ENUM(GOLF_PLAYERCARD_BITS, GET_SCORE_ICON_FOR_HOLE(iHole, Player.iCourseScore[iHole].iHoleScore, GET_GOLF_HOLE_PAR(thisCourse, iHole)))
iCurrentPar += GET_GOLF_HOLE_PAR(thisCourse, iHole)
ELSE
txtStrokes[iHole] = " "
ENDIF
ELSE
txtStrokes[iHole] = ""
ENDIF
ENDREPEAT
txtScore = GET_SCORE_TEXT(iScore, iCurrentPar, eScoreColour)
txtScore += " ("
txtScore += iScore
txtScore += ")"
INT iSlot = GET_SLOT_FOR_SCORE(thisFoursome, playerCard)
playerCard.iScoreboardSlot = iSlot
CDEBUG1LN(DEBUG_GOLF,"iScore! ",iScore, " iCurrentPar ", iCurrentPar, " txtScore ", txtScore, " slot ", iSlot)
BEGIN_SCALEFORM_MOVIE_METHOD(thisHelpers.golfUI, "SET_SCOREBOARD_SLOT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iSlot) //slot
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(eStatus)) //state
IF bUseLiteralName
SCALEFORM_MOVIE_METHOD_ADD_PARAM_PLAYER_NAME(playerCard.sPlayerName) //Player name
ELSE
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(playerCard.sPlayerName) //Player name from text file
ENDIF
SCALEFORM_MOVIE_METHOD_ADD_PARAM_PLAYER_NAME(playerCard.crewTag) //Crew Tag
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("PLAYER_READY") //Ready string
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(playerCard.eBallColour)) //Ball colour
SCALEFORM_MOVIE_METHOD_ADD_PARAM_PLAYER_NAME(txtScore) //Total Score
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(eScoreColour)) //Score Colour
REPEAT GET_GOLF_COURSE_NUM_HOLES(thisCourse) iHole
IF IS_STRING_NULL_OR_EMPTY(txtStrokes[iHole])
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("GOLF_ENDASH")
ELSE
SCALEFORM_MOVIE_METHOD_ADD_PARAM_PLAYER_NAME(txtStrokes[iHole])
ENDIF
ENDREPEAT
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC REMOVE_PLAYER(SCALEFORM_INDEX golfUI, INT iPlayerIndex)
BEGIN_SCALEFORM_MOVIE_METHOD(golfUI, "CLEAR_PLAYERCARD_SLOT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iPlayerIndex)
END_SCALEFORM_MOVIE_METHOD()
BEGIN_SCALEFORM_MOVIE_METHOD(golfUI, "CLEAR_SCOREBOARD_SLOT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iPlayerIndex)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
#ENDIF
PROC SET_SHOT_DISPLAY(GOLF_HELPERS &thisHelpers, SHOT_DISPLAY_STATE shotDisplayState, STRING sLie, GOLF_LIE_TYPE shotLieDisplay,
FLOAT fWindDirection, INT iWindSpeed, STRING sClubName, eCLUB_TYPE shotClubDisplay,
STRING sShotName, INT iSpinPower, FLOAT fSpinDirection, INT iShotNum, BOOL bUseArrows)
INT iClub = ENUM_TO_INT(shotClubDisplay)
IF shotLieDisplay = LIE_UNKNOWN
shotLieDisplay = LIE_UNKNOWN_UI
ENDIF
shotLieDisplay += INT_TO_ENUM(GOLF_LIE_TYPE, 2) //ui is off from script enum
BEGIN_SCALEFORM_MOVIE_METHOD(thisHelpers.golfUI, "SET_SWING_DISPLAY")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(shotDisplayState)) //shot display state
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sLie) //Lie name
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(shotLieDisplay)) //Lie picture
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("GOLF_WIND_PLUS") //Wind speed
ADD_TEXT_COMPONENT_INTEGER(iWindSpeed)
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fWindDirection) //Wind Heading
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sClubName) //Club Name
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iClub) //Club picture
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sShotName) //normal, power, punch approach
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bUseArrows) //left right arrows next to shot name
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("GOLF_SPIN") //Spin name
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iSpinPower) //Spin power
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fSpinDirection) //Spin direction
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("SHOT_NUM") //Shot Number
ADD_TEXT_COMPONENT_INTEGER(iShotNum)
END_TEXT_COMMAND_SCALEFORM_STRING()
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC UPDATE_SHOT_DISPLAY(GOLF_HELPERS &thisHelpers, GOLF_FOURSOME &thisFoursome, GOLF_GAME &thisGame, GOLF_PLAYER_CORE &thisPlayerCore, SWING_METER &swingMeter)
eCLUB_TYPE eClub = GET_GOLF_CLUB_TYPE(thisGame.golfBag, GET_GOLF_PLAYER_CURRENT_CLUB(thisPlayerCore))
TEXT_LABEL_23 txtLie = GET_LIE_STRING_FROM_ENUM(GET_GOLF_PLAYER_LIE(thisPlayerCore))
TEXT_LABEL_23 txtClub = GET_CLUB_STRING_FROM_ENUM(eClub)
TEXT_LABEL_23 txtSwing = GET_STYLE_STRING_FROM_ENUM(GET_GOLF_PLAYER_SWING_STYLE(thisPlayerCore))
FLOAT windSpeed = thisGame.fWindStrength
IF windSpeed < 1.0
windSpeed = 1.0
ELIF windSpeed > 12.0 //wind speed should never really get higher then this but just incase it does, cap it
windSpeed = 12.0
ENDIF
BOOL bUseArrows = FALSE
// IF GET_GOLF_FOURSOME_CURRENT_PLAYER(thisFoursome) != GET_GOLF_FOURSOME_LOCAL_PLAYER(thisFoursome)
// bUseArrows = FALSE
// ENDIF
FLOAT fSpinHeading, fSpinPower
fSpinHeading = GET_HEADING_FROM_VECTOR_2D(swingMeter.fXSpin, swingMeter.fYSpin) + 90
fSpinPower = (SQRT(swingMeter.fXSpin*swingMeter.fXSpin + swingMeter.fYSpin*swingMeter.fYSpin) / 128) * 200
fSpinPower = FMIN(100.0, fSpinPower+0.1)
SET_SHOT_DISPLAY(thisHelpers, thisHelpers.eShotDisplayState, txtLie, GET_GOLF_PLAYER_LIE(thisPlayerCore),
thisGame.fOldWindHeading, FLOOR(windSpeed), txtClub, eClub, txtSwing,
FLOOR(fSpinPower), fSpinHeading, GET_GOLF_FOURSOME_CURRENT_PLAYER_SHOTS_ON_HOLE(thisFoursome)+1, bUseArrows)
ENDPROC
PROC SET_HOLE_DISPLAY(GOLF_HELPERS &thisHelpers, INT iHole = -1, INT iPar = -1, INT iDistance = -1)
BEGIN_SCALEFORM_MOVIE_METHOD(thisHelpers.golfUI, "SET_HOLE_DISPLAY")
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("GOLF_HOLE_NUM")
ADD_TEXT_COMPONENT_INTEGER(iHole)
END_TEXT_COMMAND_SCALEFORM_STRING()
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("GOLF_PAR_NUM")
ADD_TEXT_COMPONENT_INTEGER(iPar)
END_TEXT_COMMAND_SCALEFORM_STRING()
TEXT_LABEL_23 sUnits = "GOLF_HOLE_DIST"
IF GOLF_SHOULD_USE_FOREIGN_DISTANCE()
sUnits = "DIST_METER"
iDistance = FLOOR(YARDS_TO_METERS( TO_FLOAT(iDistance)))
ENDIF
BEGIN_TEXT_COMMAND_SCALEFORM_STRING(sUnits)
ADD_TEXT_COMPONENT_INTEGER(iDistance)
END_TEXT_COMMAND_SCALEFORM_STRING()
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SET_SCOREBOARD_TITLE(GOLF_HELPERS &thisHelpers)
BEGIN_SCALEFORM_MOVIE_METHOD(thisHelpers.golfUI, "SET_SCOREBOARD_TITLE")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("TITLE_STANDING") //Title
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("HOLE_ALLCAPS")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("PAR_ALLCAPS")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("SCORE_ALLCAPS")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("SCORE_HOLEINONE")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("SCORE_BELOW_PAR")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("SCORE_ABOVE_PAR")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("HOLE_1")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("HOLE_2")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("HOLE_3")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("HOLE_4")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("HOLE_5")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("HOLE_6")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("HOLE_7")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("HOLE_8")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("HOLE_9")
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SET_COURSE_PAR(GOLF_HELPERS &thisHelpers)
BEGIN_SCALEFORM_MOVIE_METHOD(thisHelpers.golfUI, "COURSE_PAR")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("PAR_5")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("PAR_4")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("PAR_3")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("PAR_4")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("PAR_4")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("PAR_3")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("PAR_4")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("PAR_5")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("PAR_4")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("PAR_TOTAL")
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC DISPLAY_SCOREBOARD(GOLF_HELPERS &thisHelpers, BOOL bVisible = FALSE)
CDEBUG1LN(DEBUG_GOLF, "Seting display scoreboard to ", bVisible)
IF bVisible = TRUE
SET_SPLASH_TEXT(thisHelpers)
//ui display flag is to let scaleform know what ui elements to display
SET_GOLF_UI_DISPLAY(thisHelpers, GOLF_DISPLAY_SCOREBOARD)
//this flag is for checking to see if the scoreboard is up
SET_GOLF_UI_FLAG(thisHelpers, GUC_SCOREBOARD_DISPLAYED)
//SET_RESULT_SCREEN_DISPLAYING_STATE(TRUE)
ELSE
CLEAR_GOLF_UI_DISPLAY(thisHelpers, GOLF_DISPLAY_SCOREBOARD)
CLEAR_GOLF_UI_FLAG(thisHelpers, GUC_SCOREBOARD_DISPLAYED)
//SET_RESULT_SCREEN_DISPLAYING_STATE(FALSE)
ENDIF
ENDPROC
PROC MANAGE_PLAYERCARD(GOLF_HELPERS &thisHelpers, GOLF_GAME &thisGame)
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
CLEAR_GOLF_UI_DISPLAY(thisHelpers, GOLF_DISPLAY_PLAYERCARD)
ELIF NOT IS_GOLF_CONTROL_FLAG_SET(thisGame, GCF_DISPLAY_QUITTER)
SET_GOLF_UI_DISPLAY(thisHelpers, GOLF_DISPLAY_PLAYERCARD)
ENDIF
ENDPROC
PROC SET_GOLF_HEADSET_STATE(GOLF_HELPERS &thisHelpers, INT ID, GOLF_HEADSET_STATE state)
CDEBUG1LN(DEBUG_GOLF, "Setting headset state of ", ID, " to ", state, ".")
BEGIN_SCALEFORM_MOVIE_METHOD(thisHelpers.golfUI, "SET_PLAYERCARD_HEADSET")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ID)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(state))
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SET_APEX_MARKER(SCALEFORM_INDEX golfUI, BOOL bVisible = FALSE, FLOAT fYLocation = 0.0)
/*
SWING_METER_SET_APEX_MARKER(visible:Boolean, position:Number, rotation:Number):Void
Set characteristics of apex marker (black)
visible - show or hide marker
position on bar (0 = top, 1 = bottom)
rotation of marker in degrees (-values = counter-clockwise) (lets not go more than -30 thru 30 to start).
//*/
BEGIN_SCALEFORM_MOVIE_METHOD(golfUI, "SWING_METER_SET_APEX_MARKER")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bVisible)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fYLocation)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SET_SWING_METER_FILL(SCALEFORM_INDEX golfUI, FLOAT fYLocation = 0.0, FLOAT fShotQuality = -1.0)
/*
SWING_METER_SET_FILL(span:Number, state:Number):Void
span percentage of bar filled from top (.2 = 20%)
state color to display (-1 = transparent white; 0 = white gradates to 1 = red)
fromTop boolean that determines if fill comes from top or bottom (default top)
//*/
BEGIN_SCALEFORM_MOVIE_METHOD(golfUI, "SWING_METER_SET_FILL")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fYLocation)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fShotQuality)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(TRUE)//true = fill from top, false = fill from bottom
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SET_PUTTMETER(GOLF_HELPERS &thisHelpers, SCALEFORM_INDEX golfUI, BOOL bVisible = FALSE, BOOL bForceSlowTransition = FALSE, FLOAT fXLocation = 0.0, FLOAT fYLocation = 0.0, FLOAT fHotspot = 0.0, FLOAT fHotspotSpan = 0.1)
//BEGIN_SCALEFORM_MOVIE_METHOD(golfUI, "SWING_METER_IS_TRANSITIOING")
//SCALEFORM_RETURN_INDEX scaleformRetIndex = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE()
//WHILE NOT IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(scaleformRetIndex)
//ENDWHILE
//BOOL isTransition = GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_BOOL(scaleformRetIndex)
//BOOL isTransition = END_SCALEFORM_MOVIE_METHOD_BOOL()
INT TransitionTime = 0
BOOL useFill = IS_GOLF_UI_FLAG_SET(thisHelpers, GUC_USE_FILL_QUALITY)
IF useFill OR thisHelpers.bShotPreviewCam OR bForceSlowTransition
TransitionTime = 1000
ENDIF
FLOAT adjustedHotspot = fHotSpot * (1 -(fHotspotSpan/2))
FLOAT shotQuality = ABSF(fYLocation - (adjustedHotspot + (fHotspotSpan/2)))
IF NOT useFill
shotQuality = -1.0
ENDIF
IF NOT bVisible AND IS_GOLF_UI_FLAG_SET(thisHelpers, GUC_SWING_METER_DISPLAYED) //AND NOT isTransition
BEGIN_SCALEFORM_MOVIE_METHOD(golfUI, "SWING_METER_TRANSITION_OUT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(TransitionTime)
END_SCALEFORM_MOVIE_METHOD()
CLEAR_GOLF_UI_FLAG(thisHelpers, GUC_SWING_METER_DISPLAYED)
ELIF bVisible AND NOT IS_GOLF_UI_FLAG_SET(thisHelpers, GUC_SWING_METER_DISPLAYED)
FLOAT fWideScreenAdjust = 0.0
FLOAT fResolutionAdjust = 0.0
IF GET_IS_WIDESCREEN()
fWideScreenAdjust = 0.095
ELIF IS_PC_VERSION()
fResolutionAdjust = 0.045
ENDIF
BEGIN_SCALEFORM_MOVIE_METHOD(golfUI, "SWING_METER_TRANSITION_IN")
END_SCALEFORM_MOVIE_METHOD()
SET_GOLF_UI_FLAG(thisHelpers, GUC_SWING_METER_DISPLAYED)
BEGIN_SCALEFORM_MOVIE_METHOD(golfUI,"SWING_METER_POSITION")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(SWING_METER_POS_X - fResolutionAdjust) //x
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(SWING_METER_POS_Y - fWideScreenAdjust) //y
// SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(TRUE) //position from center of swing meter
END_SCALEFORM_MOVIE_METHOD()
ENDIF
IF NOT IS_GOLF_UI_FLAG_SET(thisHelpers, GUC_SWING_METER_DISPLAYED)
EXIT
ENDIF
SET_SWING_METER_FILL( golfUI, fYLocation, shotQuality)
BEGIN_SCALEFORM_MOVIE_METHOD(golfUI, "SWING_METER_SET_MARKER")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bVisible)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fYLocation)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bVisible)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fXLocation)
END_SCALEFORM_MOVIE_METHOD()
/*
The top of the hot spot is located at fHotspot and stretches down fHotspotSpan.
We need to reposition the hot spot so that it evenly goes from 0 to 1 without going outside the meter.
V = min*(1-t) + t *max, where t = fHotSpot, min = 0, max = (1-fHotspotSpan)
*/
BEGIN_SCALEFORM_MOVIE_METHOD(golfUI, "SWING_METER_SET_TARGET")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fHotspotSpan)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(adjustedHotspot)
END_SCALEFORM_MOVIE_METHOD()
/*default is yellow
BEGIN_SCALEFORM_MOVIE_METHOD(golfUI, "SWING_METER_SET_TARGET_COLOR")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(255) //r
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0) //g
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0) //b
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(100) //a
END_SCALEFORM_MOVIE_METHOD()
//*/
ENDPROC
PROC SET_DISTANCE(SCALEFORM_INDEX golfUI, BOOL bVisible = FALSE, FLOAT fDistance = 0.0, FLOAT fCarry = 0.0, STRING sDistanceLable = NULL, STRING sCarryLabel = NULL, STRING sRecordLabel = NULL)
IF IS_STRING_NULL(sDistanceLable)
sDistanceLable = ""
ENDIF
IF IS_STRING_NULL(sCarryLabel)
sCarryLabel = ""
ENDIF
IF IS_STRING_NULL(sRecordLabel)
sRecordLabel = ""
ENDIF
BEGIN_SCALEFORM_MOVIE_METHOD(golfUI, "SET_DISTANCE")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bVisible)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fDistance)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fCarry)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sDistanceLable)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sCarryLabel)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sRecordLabel)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
FUNC STRING GET_DRIVE_PIN_TEXT_LABEL(INT iDistance)
IF iDistance = 1
IF GOLF_SHOULD_USE_FOREIGN_DISTANCE()
RETURN "DRIVE_PIN_M_SHORT"
ELSE
RETURN "DRIVE_PIN_SHORT"
ENDIF
ELSE
IF GOLF_SHOULD_USE_FOREIGN_DISTANCE()
RETURN "DRIVE_PIN_M"
ELSE
RETURN "DRIVE_PIN"
ENDIF
ENDIF
RETURN ""
ENDFUNC
//Keeps track of which splash text need to be displayed
PROC MANAGE_SPLASH_TEXT(GOLF_HELPERS &thisHelpers, GOLF_FOURSOME &thisFoursome)
UNUSED_PARAMETER(thisHelpers)
UNUSED_PARAMETER(thisFoursome)
#IF NOT GOLF_IS_AI_ONLY
INT iDist
IF IS_GOLF_UI_FLAG_SET(thisHelpers, GUC_DISPLAY_LONGEST_DRIVE)
CLEAR_GOLF_UI_FLAG(thisHelpers, GUC_DISPLAY_LONGEST_DRIVE | GUC_DISPLAY_LONGEST_HOLE | GUC_DISPLAY_GIR | GUC_DISPLAY_FIR)
SET_SPLASH_TEXT(thisHelpers, GOLF_SPLASH_LONGEST_DIVE, "GOLF_NEW_RECORD", PICK_STRING(GOLF_SHOULD_USE_FOREIGN_DISTANCE(), "DRIVE_LONG_M", "DRIVE_LONG"), FLOOR(GET_GOLF_STAT_LONGEST_DRIVE()), 10000)
EXIT
ENDIF
IF IS_GOLF_UI_FLAG_SET(thisHelpers, GUC_DISPLAY_LONGEST_HOLE)
CLEAR_GOLF_UI_FLAG(thisHelpers, GUC_DISPLAY_LONGEST_HOLE | GUC_DISPLAY_GIR | GUC_DISPLAY_FIR)
SET_SPLASH_TEXT(thisHelpers, GOLF_SPLASH_LONGEST_HOLE, "GOLF_NEW_RECORD", PICK_STRING(GOLF_SHOULD_USE_FOREIGN_DISTANCE(), "DRIVE_HOLE_M", "DRIVE_HOLE"), FLOOR(GET_GOLF_STAT_LONGEST_DRIVE_ON_HOLE(GET_GOLF_FOURSOME_CURRENT_HOLE(thisFoursome))), 10000)
EXIT
ENDIF
IF IS_GOLF_UI_FLAG_SET(thisHelpers, GUC_DISPLAY_CLOSEST_TO_PIN)
iDist = FLOOR(GET_GOLF_STAT_LONGEST_DRIVE_ON_HOLE(GET_GOLF_FOURSOME_CURRENT_HOLE(thisFoursome)))
CLEAR_GOLF_UI_FLAG(thisHelpers, GUC_DISPLAY_CLOSEST_TO_PIN | GUC_DISPLAY_GIR | GUC_DISPLAY_FIR)
CDEBUG1LN(DEBUG_GOLF, "Use drive to pin line ", GET_DRIVE_PIN_TEXT_LABEL(iDist))
SET_SPLASH_TEXT(thisHelpers, GOLF_SPLASH_CLOSEST_TO_PIN, "GOLF_NEW_RECORD", GET_DRIVE_PIN_TEXT_LABEL(iDist), iDist)
EXIT
ENDIF
IF IS_GOLF_UI_FLAG_SET(thisHelpers, GUC_DISPLAY_GIR)
CLEAR_GOLF_UI_FLAG(thisHelpers, GUC_DISPLAY_GIR | GUC_DISPLAY_FIR)
IF GET_GOLF_FOURSOME_CURRENT_PLAYER_CONTROL(thisFoursome) = HUMAN_LOCAL OR GET_GOLF_FOURSOME_CURRENT_PLAYER_CONTROL(thisFoursome) = HUMAN_LOCAL_MP
OR GET_GOLF_FOURSOME_CURRENT_PLAYER_CONTROL(thisFoursome) = HUMAN_NETWORK
SET_SPLASH_TEXT(thisHelpers, GOLF_SPLASH_GIR, "GIR", "GOLF_G_REGULATION", -1, 2000)
ENDIF
EXIT
ENDIF
IF IS_GOLF_UI_FLAG_SET(thisHelpers, GUC_DISPLAY_FIR)
CLEAR_GOLF_UI_FLAG(thisHelpers, GUC_DISPLAY_FIR)
IF GET_GOLF_FOURSOME_CURRENT_PLAYER_CONTROL(thisFoursome) = HUMAN_LOCAL OR GET_GOLF_FOURSOME_CURRENT_PLAYER_CONTROL(thisFoursome) = HUMAN_LOCAL_MP
OR GET_GOLF_FOURSOME_CURRENT_PLAYER_CONTROL(thisFoursome) = HUMAN_NETWORK
SET_SPLASH_TEXT(thisHelpers, GOLF_SPLASH_FIR, "FIR", "GOLF_F_REGULATION", -1, 10000)
ENDIF
EXIT
ENDIF
#ENDIF
ENDPROC
PROC GOLFUI_FLOATING_SET_STRENGTH(SCALEFORM_INDEX golfUI, STRING sLabel, FLOAT fStrength, FLOAT fShotTypeScalar)
IF IS_STRING_NULL(sLabel)
sLabel = ""
ENDIF
IF fStrength > 100.0
fStrength = 100.0
ELIF fStrength < 0.0
fStrength = 0.0
ENDIF
fStrength *= fShotTypeScalar
BEGIN_SCALEFORM_MOVIE_METHOD(golfUI, "SET_STRENGTH")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sLabel)
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRENGTH_PER")
ADD_TEXT_COMPONENT_INTEGER(CEIL(fStrength))
END_TEXT_COMMAND_SCALEFORM_STRING()
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC GOLFUI_FLOATING_SET_SLOT_ONE(SCALEFORM_INDEX floatingUI, STRING sLabel, FLOAT fDistance, BOOL bLong)
IF IS_STRING_NULL(sLabel)
sLabel = ""
ENDIF
TEXT_LABEL sUnits
IF bLong
sUnits = "DIST"
ELSE
sUnits = "DIST_SHORT"
ENDIF
IF fDistance > 1000
CDEBUG1LN(DEBUG_GOLF,"Absured value for distance")
// DEBUG_PRINTCALLSTACK()
ENDIF
IF GOLF_SHOULD_USE_FOREIGN_DISTANCE()
sUnits = "DIST_METER"
IF bLong
fDistance = YARDS_TO_METERS(fDistance)
ELSE
fDistance = FEET_TO_METERS(fDistance)
ENDIF
ENDIF
BEGIN_SCALEFORM_MOVIE_METHOD(floatingUI, "SET_SWING_DISTANCE")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sLabel)
BEGIN_TEXT_COMMAND_SCALEFORM_STRING(sUnits)
ADD_TEXT_COMPONENT_INTEGER(FLOOR(fDistance))
END_TEXT_COMMAND_SCALEFORM_STRING()
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC GOLFUI_FLOATING_SET_SLOT_TWO(SCALEFORM_INDEX floatingUI, STRING sLabel, FLOAT fDistance, BOOL bLong)
IF IS_STRING_NULL(sLabel)
sLabel = ""
ENDIF
TEXT_LABEL sUnits
IF bLong
sUnits = "DIST"
ELSE
sUnits = "DIST_SHORT"
ENDIF
IF GOLF_SHOULD_USE_FOREIGN_DISTANCE()
sUnits = "DIST_METER"
IF bLong
fDistance = YARDS_TO_METERS(fDistance)
ELSE
fDistance = FEET_TO_METERS(fDistance)
ENDIF
ENDIF
BEGIN_SCALEFORM_MOVIE_METHOD(floatingUI, "SET_PIN_DISTANCE")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sLabel)
BEGIN_TEXT_COMMAND_SCALEFORM_STRING(sUnits)
ADD_TEXT_COMPONENT_INTEGER(FLOOR(fDistance))
END_TEXT_COMMAND_SCALEFORM_STRING()
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC GOLFUI_FLOATING_SET_SLOT_THREE(SCALEFORM_INDEX floatingUI, STRING sLabel, FLOAT fHeight, BOOL bLong)
IF IS_STRING_NULL(sLabel)
sLabel = ""
ENDIF
TEXT_LABEL sUnits
IF bLong
sUnits = "DIST_SHORT"
ELSE
sUnits = "DIST_INCH"
ENDIF
IF GOLF_SHOULD_USE_FOREIGN_DISTANCE()
IF bLong
sUnits = "DIST_METER"
fHeight = FEET_TO_METERS(fHeight)
ELSE
sUnits = "DIST_CM"
fHeight = INCH_TO_CM(fHeight)
ENDIF
ENDIF
INT iDirection = 0
IF CEIL(fHeight) > 0
iDirection = 1//up arrow
ELIF CEIL(fHeight) < 0
iDirection = 2//down arrow
ENDIF
BEGIN_SCALEFORM_MOVIE_METHOD(floatingUI, "SET_HEIGHT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sLabel)
BEGIN_TEXT_COMMAND_SCALEFORM_STRING(sUnits)
ADD_TEXT_COMPONENT_INTEGER(CEIL(fHeight))
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iDirection)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC GOLFUI_FLOATING_TRANSITION_IN(SCALEFORM_INDEX floatingUI, INT iTimeMS)
BEGIN_SCALEFORM_MOVIE_METHOD(floatingUI, "TRANSITION_IN")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iTimeMS)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC GOLFUI_FLOATING_TRANSITION_OUT(SCALEFORM_INDEX floatingUI, INT iTimeMS)
BEGIN_SCALEFORM_MOVIE_METHOD(floatingUI, "TRANSITION_OUT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iTimeMS)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
FUNC FLOAT GET_GOLF_UI_POWER_SCALAR(GOLF_FOURSOME &thisFoursome)
RETURN GET_GOLF_LIE_MULTIPLIER(GET_GOLF_PLAYER_LIE(thisFoursome.playerCore[GET_GOLF_FOURSOME_CURRENT_PLAYER(thisFoursome)]))
* GET_SWING_STYLE_POWER_MULTIPLIER(GET_GOLF_FOURSOME_CURRENT_PLAYER_SWING_STYLE(thisFoursome))
ENDFUNC
PROC GOLFUI_FLOATING_INIT_STRENGTH( SCALEFORM_INDEX floatingUI, GOLF_FOURSOME &thisFoursome)
FLOAT scalar = 1.0
IF NOT IS_GOLF_FOURSOME_CURRENT_PLAYER_PUTTING(thisFoursome)
AND GET_GOLF_FOURSOME_CURRENT_PLAYER_SWING_STYLE(thisFoursome) != SWING_STYLE_PUNCH
scalar = GET_GOLF_UI_POWER_SCALAR(thisFoursome)
ENDIF
GOLFUI_FLOATING_SET_STRENGTH(floatingUI, "PREVIEW_PCT", GET_GOLF_FOURSOME_CURRENT_PLAYER_METER_GOAL(thisFoursome), scalar)
ENDPROC
PROC GOLFUI_FLOATING_INIT_SHOT_STRENGTH( SCALEFORM_INDEX floatingUI, GOLF_FOURSOME &thisFoursome)
FLOAT scalar = 1.0
FLOAT currentPower = thisFoursome.swingMeter.fCurrentPowerRel
IF NOT IS_GOLF_FOURSOME_CURRENT_PLAYER_PUTTING(thisFoursome)
AND GET_GOLF_FOURSOME_CURRENT_PLAYER_SWING_STYLE(thisFoursome) != SWING_STYLE_PUNCH
scalar = GET_GOLF_UI_POWER_SCALAR(thisFoursome)
ELSE
ENDIF
GOLFUI_FLOATING_SET_STRENGTH(floatingUI, "PREVIEW_PCT", currentPower, scalar)
ENDPROC
PROC GOLFUI_FLOATING_INIT_SWING_DISTANCE(SCALEFORM_INDEX floatingUI, GOLF_FOURSOME &thisFoursome)
GOLFUI_FLOATING_SET_SLOT_ONE(floatingUI, "PREVIEW_DIST", MAGIC_DISTANCE_CONVERSION* METERS_TO_YARDS(VDIST( GET_GOLF_FOURSOME_CURRENT_PLAYER_BALL_POSITION(thisFoursome), GET_GOLF_FOURSOME_CURRENT_PLAYER_SHOT_ESTIMATE(thisFoursome))), GET_GOLF_FOURSOME_CURRENT_PLAYER_LIE(thisFoursome) != LIE_GREEN)
ENDPROC
PROC GOLFUI_FLOATING_INIT_HIT_DISTANCE(SCALEFORM_INDEX floatingUI, GOLF_FOURSOME &thisFoursome)
GOLFUI_FLOATING_SET_SLOT_ONE(floatingUI, "PREVIEW_DIST", 0, GET_GOLF_FOURSOME_CURRENT_PLAYER_LIE(thisFoursome) != LIE_GREEN)
ENDPROC
PROC GOLFUI_FLOATING_UPDATE_HIT_DISTANCE(SCALEFORM_INDEX floatingUI, GOLF_FOURSOME &thisFoursome)
VECTOR vHitPos = GET_GOLF_FOURSOME_CURRENT_PLAYER_BALL_POSITION(thisFoursome)
VECTOR vBallPos = GET_ENTITY_COORDS( GET_GOLF_FOURSOME_CURRENT_PLAYER_BALL(thisFoursome))
FLOAT fActualDist = MAGIC_DISTANCE_CONVERSION * METERS_TO_YARDS(VDIST( vHitPos, vBallPos))
fActualDist = TO_FLOAT(FLOOR(fActualDist)) //truncate
GOLFUI_FLOATING_SET_SLOT_ONE(floatingUI, "PREVIEW_DIST", fActualDist, GET_GOLF_FOURSOME_CURRENT_PLAYER_LAST_LIE(thisFoursome) != LIE_GREEN)
ENDPROC
PROC GOLFUI_FLOATING_INIT_PIN_DISTANCE(SCALEFORM_INDEX floatingUI, GOLF_FOURSOME &thisFoursome)
GOLFUI_FLOATING_SET_SLOT_TWO(floatingUI, "PREVIEW_PIN", MAGIC_DISTANCE_CONVERSION* METERS_TO_YARDS(GET_GOLF_FOURSOME_CURRENT_PLAYER_DISTANCE_TO_HOLE(thisFoursome)), GET_GOLF_FOURSOME_CURRENT_PLAYER_LIE(thisFoursome) != LIE_GREEN)
ENDPROC
PROC GOLFUI_FLOATING_INIT_CARRY_DISTANCE(SCALEFORM_INDEX floatingUI, GOLF_FOURSOME &thisFoursome)
GOLFUI_FLOATING_SET_SLOT_TWO(floatingUI, "CARRY_DIST", MAGIC_DISTANCE_CONVERSION* METERS_TO_YARDS(GET_GOLF_FOURSOME_CURRENT_PLAYER_SHOT_CARRY(thisFoursome)), TRUE)
ENDPROC
PROC GOLFUI_FLOATING_INIT_HEIGHT(SCALEFORM_INDEX floatingUI, GOLF_FOURSOME &thisFoursome, GOLF_COURSE &thisCourse)
VECTOR ballPos = GET_GOLF_FOURSOME_CURRENT_PLAYER_BALL_POSITION(thisFoursome)
VECTOR previewPos = GET_GOLF_FOURSOME_CURRENT_PLAYER_SHOT_ESTIMATE(thisFoursome)
VECTOR vHolePos = GET_GOLF_HOLE_PIN_POSITION(thisCourse, GET_GOLF_FOURSOME_CURRENT_HOLE(thisFoursome))
IF VDIST2(previewPos, vHolePos) < (0.15*0.15) //player is near hole, don't count its dip as part of the hieght
previewPos += <<0.5, 0.5, 1.0>> //find ground pos near hole
GET_GROUND_Z_FOR_3D_COORD(previewPos, previewPos.z)
ENDIF
FLOAT fDistance = MAGIC_DISTANCE_CONVERSION* METERS_TO_YARDS(previewPos.z - ballPos.z)
IF GET_GOLF_FOURSOME_CURRENT_PLAYER_LIE(thisFoursome) = LIE_GREEN
//convert yards to inches
fDistance *= (12*3)
ENDIF
GOLFUI_FLOATING_SET_SLOT_THREE(floatingUI, "PREVIEW_HT", fDistance, GET_GOLF_FOURSOME_CURRENT_PLAYER_LIE(thisFoursome) != LIE_GREEN)
ENDPROC
PROC GOLFUI_FLOATING_CLEAR_PIN_DISTANCE(SCALEFORM_INDEX floatingUI)
GOLFUI_FLOATING_SET_SLOT_TWO(floatingUI, "", 0, FALSE)
ENDPROC
PROC GOLFUI_FLOATING_CLEAR_HEIGHT(SCALEFORM_INDEX floatingUI)
GOLFUI_FLOATING_SET_SLOT_THREE(floatingUI, "", 0, FALSE)
ENDPROC
PROC GOLFUI_FLOATING_CLEAR_SWING_DISTANCE(SCALEFORM_INDEX floatingUI)
GOLFUI_FLOATING_SET_SLOT_ONE(floatingUI, "", 0, FALSE)
ENDPROC
//When putting don't use the swing distnace stat
PROC INITIALIZE_FLOATING_HELP_FOR_PUTTING(GOLF_FOURSOME &thisFoursome, GOLF_HELPERS &thisHelpers, GOLF_COURSE &thisCourse)
GOLFUI_FLOATING_INIT_STRENGTH(thisHelpers.floatingUI, thisFoursome)
//GOLFUI_FLOATING_CLEAR_SWING_DISTANCE(thisHelpers.floatingUI)
GOLFUI_FLOATING_INIT_SWING_DISTANCE(thisHelpers.floatingUI, thisFoursome)
GOLFUI_FLOATING_INIT_PIN_DISTANCE(thisHelpers.floatingUI, thisFoursome)
GOLFUI_FLOATING_INIT_HEIGHT(thisHelpers.floatingUI, thisFoursome, thisCourse)
/*
VECTOR ballPos = GET_GOLF_FOURSOME_CURRENT_PLAYER_BALL_POSITION(thisFoursome)
VECTOR previewPos = GET_GOLF_FOURSOME_CURRENT_PLAYER_SHOT_ESTIMATE(thisFoursome)
//first slot is distance to pin, second is height
GOLFUI_FLOATING_SET_SLOT_ONE(thisHelpers.floatingUI, "PREVIEW_PIN", MAGIC_DISTANCE_CONVERSION* METERS_TO_YARDS(GET_GOLF_FOURSOME_CURRENT_PLAYER_DISTANCE_TO_HOLE(thisFoursome)), "DIST_SHORT")
GOLFUI_FLOATING_SET_SLOT_TWO(thisHelpers.floatingUI, "PREVIEW_HT", MAGIC_DISTANCE_CONVERSION* METERS_TO_YARDS(previewPos.z - ballPos.z), "DIST_SHORT")
GOLFUI_FLOATING_SET_SLOT_THREE(thisHelpers.floatingUI, "", 0, "") //clear slot three
//*/
ENDPROC
PROC INITIALIZE_FLOATING_HELP_FOR_SHOT(GOLF_FOURSOME &thisFoursome, GOLF_HELPERS &thisHelpers, GOLF_COURSE &thisCourse)
IF NOT IS_GOLF_UI_FLAG_SET(thisHelpers, GUC_REFRESH_FLOATING)
EXIT
ENDIF
IF IS_GOLF_FOURSOME_CURRENT_PLAYER_PUTTING(thisFoursome)
INITIALIZE_FLOATING_HELP_FOR_PUTTING(thisFoursome,thisHelpers, thisCourse)
ELSE
GOLFUI_FLOATING_INIT_STRENGTH(thisHelpers.floatingUI, thisFoursome)
GOLFUI_FLOATING_INIT_SWING_DISTANCE(thisHelpers.floatingUI, thisFoursome)
GOLFUI_FLOATING_INIT_PIN_DISTANCE(thisHelpers.floatingUI, thisFoursome)
GOLFUI_FLOATING_INIT_HEIGHT(thisHelpers.floatingUI, thisFoursome, thisCourse)
ENDIF
CLEAR_GOLF_UI_FLAG(thisHelpers, GUC_REFRESH_FLOATING)
ENDPROC
PROC INITIALIZE_FLOATING_HELP_FOR_FLIGHT(GOLF_FOURSOME &thisFoursome, GOLF_HELPERS &thisHelpers)
GOLFUI_FLOATING_INIT_SHOT_STRENGTH(thisHelpers.floatingUI, thisFoursome)
GOLFUI_FLOATING_INIT_HIT_DISTANCE(thisHelpers.floatingUI, thisFoursome)
GOLFUI_FLOATING_CLEAR_PIN_DISTANCE(thisHelpers.floatingUI)
GOLFUI_FLOATING_CLEAR_HEIGHT(thisHelpers.floatingUI)
ENDPROC
PROC DRAW_PUTT_METER(BOOL bEnable, GOLF_HELPERS &thisHelpers, SWING_METER &swingMeter, FLOAT fPowerMeterGoal)
FLOAT XLocation = swingMeter.fCurrentAccurRel
FLOAT YLocation = swingMeter.fCurrentMeterPosition
YLocation /=100.0
IF XLocation < -1.0
XLocation = -1.0
ELIF XLocation > 1.0
XLocation = 1.0
ENDIF
IF YLocation < 0.0
YLocation = 0.0
ELIF YLocation > 1.0
YLocation = 1.0
ENDIF
SET_PUTTMETER(thisHelpers, thisHelpers.golfUI, bEnable, FALSE, XLocation, YLocation, fPowerMeterGoal/100.0)
CLEAR_GOLF_UI_FLAG(thisHelpers, GUC_REFRESH_PUTT)
ENDPROC
PROC DRAW_SWING_METER(BOOL bEnable, GOLF_HELPERS &thisHelpers, SWING_METER &swingMeter, FLOAT fPowerMeterGoal)
FLOAT XLocation = swingMeter.fCurrentAccurRel
FLOAT YLocation = swingMeter.fCurrentMeterPosition
YLocation /=100.0
IF XLocation < -1.0
XLocation = -1.0
ELIF XLocation > 1.0
XLocation = 1.0
ENDIF
IF YLocation < 0.0
YLocation = 0.0
ELIF YLocation > 1.0
YLocation = 1.0
ENDIF
SET_PUTTMETER(thisHelpers, thisHelpers.golfUI,bEnable, FALSE, XLocation, YLocation, fPowerMeterGoal/100.0)
ENDPROC
PROC GOLF_SETUP_INTRO_KEYS(GOLF_HELPERS &thisHelpers)
STRING eSelectButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
STRING eQuitButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
INIT_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "BUDDY_SELECT", eSelectButton, FALSE, DEFAULT, TRUE, INPUT_FRONTEND_ACCEPT)
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "GOLF_QUIT", eQuitButton, 1, INPUT_FRONTEND_CANCEL )
thisHelpers.golfDisplayedControls= GDCS_SETUP_INTRO_KEYS
ENDPROC
PROC GOLF_SETUP_SCOREBOARD_KEYS(GOLF_HELPERS &thisHelpers, BOOL bAllowContinue, BOOL bAllowQuit, BOOL bAllowScroll, BOOL bReplay, BOOL bAllowLeaderboard)
STRING eQuitButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT)
//This is being manually set, so for the Japanese version these buttons need to be swapped
STRING eContinueButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_RDOWN)
//Swap the X/O buttons for JPN Orbis
#IF IS_JAPANESE_BUILD
IF IS_PLAYSTATION_PLATFORM()
eContinueButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_RRIGHT)
ENDIF
#ENDIF
STRING eScorecardButon = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_RB)
STRING eReplayButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_RLEFT)
// STRING eScrollbButton = GET_CONTROL_GROUP_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUTGROUP_FRONTEND_GENERIC_UD)
INT iSlot
IF bAllowContinue
INIT_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "GOLF_CONTINUE", eContinueButton, FALSE)
iSlot++
SET_BITMASK_AS_ENUM(thisHelpers.golfKeysInUse, GOLF_KEY_CONTINUE)
ELSE
CLEAR_BITMASK_AS_ENUM(thisHelpers.golfKeysInUse, GOLF_KEY_CONTINUE)
ENDIF
IF bReplay
IF iSlot = 0
INIT_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "REPLAY_TITLE", eReplayButton, FALSE)
ELSE
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "REPLAY_TITLE", eReplayButton, iSlot)
ENDIF
iSlot++
SET_BITMASK_AS_ENUM(thisHelpers.golfKeysInUse, GOLF_KEY_REPLAY)
ELSE
CLEAR_BITMASK_AS_ENUM(thisHelpers.golfKeysInUse, GOLF_KEY_REPLAY)
ENDIF
IF bAllowQuit
IF iSlot = 0
INIT_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "GOLF_QUIT", eQuitButton, FALSE)
ELSE
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "GOLF_QUIT", eQuitButton, iSlot)
ENDIF
iSlot++
SET_BITMASK_AS_ENUM(thisHelpers.golfKeysInUse, GOLF_KEY_QUIT)
ELSE
CLEAR_BITMASK_AS_ENUM(thisHelpers.golfKeysInUse, GOLF_KEY_QUIT)
ENDIF
IF bAllowLeaderboard
IF iSlot = 0
INIT_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "GOLF_SC_INST", eScorecardButon, FALSE)
ELSE
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "GOLF_SC_INST", eScorecardButon, iSlot)
ENDIF
iSlot++
SET_BITMASK_AS_ENUM(thisHelpers.golfKeysInUse, GOLF_KEY_SOCIAL_CLUB)
ELSE
CLEAR_BITMASK_AS_ENUM(thisHelpers.golfKeysInUse, GOLF_KEY_SOCIAL_CLUB)
ENDIF
IF bAllowScroll
// ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "MENU_SCROLL", eScrollbButton, iSlot)
// iSlot++
SET_BITMASK_AS_ENUM(thisHelpers.golfKeysInUse, GOLF_KEY_SCROLL)
ELSE
CLEAR_BITMASK_AS_ENUM(thisHelpers.golfKeysInUse, GOLF_KEY_SCROLL)
ENDIF
thisHelpers.golfDisplayedControls = GDCS_SETUP_SCOREBOARD_KEYS
ENDPROC
PROC GOLF_SETUP_SOCIAL_CLUB_KEYS(GOLF_HELPERS &thisHelpers, BOOL bAllowQuit, BOOL bAllowProfile)
STRING eBackButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
STRING eQuitButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT)
STRING eOpenGamerCardButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_SELECT)
CONTROL_ACTION caQuitInput = INPUT_SCRIPT_PAD_RIGHT
// Quit uses a different input on PC when on the frontend.
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
eQuitButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_LEADERBOARD)
caQuitInput = INPUT_FRONTEND_LEADERBOARD
ENDIF
INT iSlot
INIT_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "GOLF_BACK", eBackButton, FALSE, FALSE, TRUE, INPUT_FRONTEND_CANCEL)
iSlot++
IF bAllowProfile
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "SCLB_PROFILE", eOpenGamerCardButton, iSlot, INPUT_FRONTEND_SELECT)
iSlot++
SET_BITMASK_AS_ENUM(thisHelpers.golfKeysInUse, GOLF_KEY_PROFILE)
ELSE
CLEAR_BITMASK_AS_ENUM(thisHelpers.golfKeysInUse, GOLF_KEY_PROFILE)
ENDIF
IF bAllowQuit
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "GOLF_QUIT", eQuitButton, iSlot, caQuitInput)
iSlot++
SET_BITMASK_AS_ENUM(thisHelpers.golfKeysInUse, GOLF_KEY_QUIT)
ELSE
CLEAR_BITMASK_AS_ENUM(thisHelpers.golfKeysInUse, GOLF_KEY_QUIT)
ENDIF
thisHelpers.golfDisplayedControls = GDCS_SETUP_SOCIAL_CLUB_KEYS
ENDPROC
PROC GOLF_RESET_SOCIAL_CLUB_KEYS(GOLF_HELPERS &thisHelpers)
CLEAR_GOLF_UI_FLAG(thisHelpers, GUC_SOCIAL_CLUB_UI_DISPLAYED)
GOLF_SETUP_SCOREBOARD_KEYS(thisHelpers, IS_BITMASK_AS_ENUM_SET(thisHelpers.golfKeysInUse, GOLF_KEY_CONTINUE),
IS_BITMASK_AS_ENUM_SET(thisHelpers.golfKeysInUse, GOLF_KEY_QUIT),
IS_BITMASK_AS_ENUM_SET(thisHelpers.golfKeysInUse, GOLF_KEY_SCROLL),
IS_BITMASK_AS_ENUM_SET(thisHelpers.golfKeysInUse, GOLF_KEY_REPLAY),
IS_BITMASK_AS_ENUM_SET(thisHelpers.golfKeysInUse, GOLF_KEY_SOCIAL_CLUB))
ENDPROC
PROC SETUP_GOLF_SCOREBOARD_CONTROLS(GOLF_HELPERS &thisHelpers)
STRING eScorecardButon = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_RRIGHT)
STRING eQuitButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT)
// Different control checked on PC, so we can use the same control to quit the scoreboard as activate it. Also ensures we use a sensible key.
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
eScorecardButon = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_RB)
ENDIF
//In Japan X on playstation X is back, not O
#IF IS_JAPANESE_BUILD
IF IS_PLAYSTATION_PLATFORM()
eScorecardButon = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_RDOWN)
ENDIF
#ENDIF
INIT_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "GOLF_BACK", eScorecardButon, FALSE)
IF IS_GOLF_FOURSOME_MP()
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "INST_QUIT", eQuitButton, 1)
ENDIF
thisHelpers.golfDisplayedControls = GDCS_SETUP_GOLF_SCOREBOARD_CONTROLS
ENDPROC
PROC SETUP_GOLF_NAV_CONTROLS(GOLF_HELPERS &thisHelpers, BOOL bOnTee, BOOl bCart)
STRING eQuitButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT)
STRING eSkipToShottButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_LB)
STRING eScorecardButon = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_RB)
INIT_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "INST_QUIT", eQuitButton, FALSE)
IF bCart
ELSE
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "INST_SCORECARD", eScorecardButon, 1)
ENDIF
IF bOnTee
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "INST_SKIP_T", eSkipToShottButton, 2)
SET_BITMASK_AS_ENUM(thisHelpers.golfKeysInUse, GOLF_KEY_ON_TEE)
ELSE
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "INST_SKIP_S", eSkipToShottButton, 2)
CLEAR_BITMASK_AS_ENUM(thisHelpers.golfKeysInUse, GOLF_KEY_ON_TEE)
ENDIF
thisHelpers.golfDisplayedControls = GDCS_SETUP_GOLF_NAV_CONTROLS
ENDPROC
PROC SETUP_GOLF_ADRESS_CONTROLS(GOLF_HELPERS &thisHelpers, BOOL bPutting, BOOL bAllowPreviewHole, BOOL bInShotPreview)
INT iStartingIndex = 0
STRING eResetButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_RRIGHT)
STRING eQuitButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT)
STRING eSwingButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(PLAYER_CONTROL, INPUT_MOVE_DOWN_ONLY)
STRING eChangeShotButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_LB)
STRING ePreviewShotButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_RT)
STRING ePreviewHoleButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_LT)
STRING eScorecardButon = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_RB)
STRING eChangeClubButton = GET_CONTROL_GROUP_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUTGROUP_SCRIPT_DPAD_UD)
STRING eAimButton = GET_CONTROL_GROUP_INSTRUCTIONAL_BUTTONS_STRING(PLAYER_CONTROL, INPUTGROUP_LOOK)
// Different input used for Swing on PC mouse and keyboard The actual input is defined in dynamic.meta
// If that input is changed then we must change this input to match.
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
eSwingButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(PLAYER_CONTROL, INPUT_ATTACK)
ENDIF
INIT_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "INST_RESET_AIM", eResetButton, FALSE)
iStartingIndex++
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "INST_CLUB", eChangeClubButton, iStartingIndex)
iStartingIndex++
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "INST_QUIT", eQuitButton, iStartingIndex)
iStartingIndex++
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "INST_AIM", eAimButton, iStartingIndex)
iStartingIndex++
IF NOT bInShotPreview
IF bPutting
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "INST_PUTT", eSwingButton, iStartingIndex)
ELSE
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "INST_SWING", eSwingButton, iStartingIndex)
ENDIF
iStartingIndex++
ENDIF
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "INST_SHOT", eChangeShotButton, iStartingIndex)
iStartingIndex++
IF NOT bInShotPreview
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "INST_SCORECARD", eScorecardButon, iStartingIndex)
iStartingIndex++
IF bAllowPreviewHole
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "INST_PREVIEW_SH", ePreviewShotButton, iStartingIndex)
ADD_BUTTON_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, CUCB_BUTTON7_2, ePreviewHoleButton)
ELSE
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "INST_PREVIEW_S", ePreviewShotButton, iStartingIndex)
ENDIF
iStartingIndex++
ENDIF
thisHelpers.golfDisplayedControls = GDCS_SETUP_GOLF_ADRESS_CONTROLS
ENDPROC
PROC SETUP_GOLF_SPECTATE_COMPUTER_CONTROLS(GOLF_HELPERS &thisHelpers)
STRING eSkipButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
INIT_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "INSTR_SKIP_AI", eSkipButton, FALSE)
thisHelpers.golfDisplayedControls = GDCS_SETUP_GOLF_SPECTATE_COMPUTER_CONTROLS
ENDPROC
PROC SETUP_GOLF_SPECTATE_MP_CONTROLS(GOLF_HELPERS &thisHelpers)
STRING eCahngeViewButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_SELECT)
STRING eScorecardButon = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_RB)
STRING eQuitButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT)
INIT_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "INST_VIEW", eCahngeViewButton, FALSE)
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "INST_SCORECARD", eScorecardButon, 1)
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "INST_QUIT", eQuitButton, 2)
thisHelpers.golfDisplayedControls = GDCS_SETUP_GOLF_SPECTATE_MP_CONTROLS
ENDPROC
PROC SETUP_GOLF_BALL_IN_FLIGHT_CONTROLS(GOLF_HELPERS &thisHelpers)
//don't flip controls when ball is in flight
STRING eDirection = GET_CONTROL_GROUP_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUTGROUP_MOVE) //GET_CONTROL_GROUP_INSTRUCTIONAL_BUTTONS_STRING(PLAYER_CONTROL, INPUTGROUP_MOVE)
STRING eSpinButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_SCRIPT_RDOWN)
INIT_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "GOLF_PLUS", eSpinButton, FALSE)
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "INSTR_SPIN", eDirection, 1)
//ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "", , 2)
//ADD_BUTTON_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, CUCB_BUTTON0_2, GET_CONTROL_GROUP_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUTGROUP_FRONTEND_LSTICK_ALL), "GOLF_PLUS")
thisHelpers.golfDisplayedControls = GDCS_SETUP_GOLF_BALL_IN_FLIGHT_CONTROLS
ENDPROC
PROC SETUP_GOLF_FAIL_CONTROLS(GOLF_HELPERS &thisHelpers)
STRING eResetButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
STRING eQuitButton = GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
INIT_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "FAIL_RESET", eResetButton, FALSE)
ADD_LABEL_TO_COMPLEX_USE_CONTEXT(thisHelpers.useContext, "FAIL_QUIT", eQuitButton, 1)
thisHelpers.golfDisplayedControls = GDCS_SETUP_GOLF_FAIL_CONTROLS
ENDPROC
PROC GOLF_DISPLAY_CONTROLS(GOLF_HELPERS &thisHelpers, BOOL bJapan)
IF NOT IS_PLAYER_SCTV(PLAYER_ID())
AND NOT IS_TRANSITION_ACTIVE()
FLOAT fWidth = 1.0
IF NOT GET_IS_WIDESCREEN()
fWidth = 0.6
SET_HUD_COMPONENT_POSITION(NEW_HUD_SUBTITLE_TEXT, 0.0, -0.0375)
ENDIF
IF HAVE_CONTROLS_CHANGED(FRONTEND_CONTROL) OR HAVE_CONTROLS_CHANGED(PLAYER_CONTROL)
CDEBUG1LN(DEBUG_GOLF, "Golf Controls Switched")
SWITCH thisHelpers.golfDisplayedControls
CASE GDCS_SETUP_INTRO_KEYS
GOLF_SETUP_INTRO_KEYS(thisHelpers)
BREAK
CASE GDCS_SETUP_SCOREBOARD_KEYS
GOLF_SETUP_SCOREBOARD_KEYS(thisHelpers, IS_BITMASK_AS_ENUM_SET(thisHelpers.golfKeysInUse, GOLF_KEY_CONTINUE),
IS_BITMASK_AS_ENUM_SET(thisHelpers.golfKeysInUse, GOLF_KEY_QUIT),
IS_BITMASK_AS_ENUM_SET(thisHelpers.golfKeysInUse, GOLF_KEY_SCROLL),
IS_BITMASK_AS_ENUM_SET(thisHelpers.golfKeysInUse, GOLF_KEY_REPLAY),
IS_BITMASK_AS_ENUM_SET(thisHelpers.golfKeysInUse, GOLF_KEY_SOCIAL_CLUB))
BREAK
CASE GDCS_SETUP_SOCIAL_CLUB_KEYS
GOLF_SETUP_SOCIAL_CLUB_KEYS(thisHelpers, IS_BITMASK_AS_ENUM_SET(thisHelpers.golfKeysInUse, GOLF_KEY_QUIT),
IS_BITMASK_AS_ENUM_SET(thisHelpers.golfKeysInUse, GOLF_KEY_PROFILE))
BREAK
CASE GDCS_SETUP_GOLF_SCOREBOARD_CONTROLS
SETUP_GOLF_SCOREBOARD_CONTROLS(thisHelpers)
BREAK
CASE GDCS_SETUP_GOLF_NAV_CONTROLS
SETUP_GOLF_NAV_CONTROLS(thisHelpers, IS_BITMASK_AS_ENUM_SET(thisHelpers.golfKeysInUse, GOLF_KEY_ON_TEE), IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
BREAK
CASE GDCS_SETUP_GOLF_ADRESS_CONTROLS
CLEAR_GOLF_UI_FLAG(thisHelpers, GUC_REFRESH_INPUT)
BREAK
CASE GDCS_SETUP_GOLF_SPECTATE_COMPUTER_CONTROLS
SETUP_GOLF_SPECTATE_COMPUTER_CONTROLS(thisHelpers)
BREAK
CASE GDCS_SETUP_GOLF_SPECTATE_MP_CONTROLS
SETUP_GOLF_SPECTATE_MP_CONTROLS(thisHelpers)
BREAK
CASE GDCS_SETUP_GOLF_BALL_IN_FLIGHT_CONTROLS
SETUP_GOLF_BALL_IN_FLIGHT_CONTROLS(thisHelpers)
BREAK
CASE GDCS_SETUP_GOLF_FAIL_CONTROLS
SETUP_GOLF_FAIL_CONTROLS(thisHelpers)
BREAK
ENDSWITCH
ENDIF
// Fix for B* 2309115
IF NETWORK_TEXT_CHAT_IS_TYPING()
EXIT
ENDIF
UPDATE_COMPLEX_USE_CONTEXT(thisHelpers.useContext, 200.0, GFX_ORDER_BEFORE_HUD, FALSE, bJapan, fWidth)
ENDIF
ENDPROC
FUNC INT GOLF_INSTRUCTIONS_BUTTONS_GET_LINES(GOLF_FOURSOME &thisFoursome)
IF NOT GET_IS_WIDESCREEN()
IF NOT IS_GOLF_FOURSOME_STATE_AT_END(thisFoursome)
AND GET_GOLF_FOURSOME_LOCAL_PLAYER(thisFoursome) = GET_GOLF_FOURSOME_CURRENT_PLAYER(thisFoursome)
IF GET_CURRENT_LANGUAGE() = LANGUAGE_ITALIAN
OR GET_CURRENT_LANGUAGE() = LANGUAGE_GERMAN
OR GET_CURRENT_LANGUAGE() = LANGUAGE_SPANISH
OR GET_CURRENT_LANGUAGE() = LANGUAGE_MEXICAN
OR GET_CURRENT_LANGUAGE() = LANGUAGE_PORTUGUESE
OR GET_CURRENT_LANGUAGE() = LANGUAGE_POLISH
OR GET_CURRENT_LANGUAGE() = LANGUAGE_RUSSIAN
RETURN 2
ENDIF
IF GET_ASPECT_RATIO(TRUE) <= 1.7
RETURN 2
ENDIF
ENDIF
ENDIF
RETURN 1
ENDFUNC