Files
gtav-src/script/dev_ng/shared/include/public/camhedz_arcade_leaderboard.sch
2025-09-29 00:52:08 +02:00

681 lines
27 KiB
XML
Executable File

USING "arcade_cabinet_minigame_common.sch"
USING "arcade_games_sound.sch"
USING "arcade_games_help_text.sch"
USING "camhedz_arcade_using.sch"
// ------------------------------ LEADERBOARD ------------------------------
CONST_INT ciARCADE_GAMES_LBD_DEFAULT_RANK 99
CONST_INT ciARCADE_GAMES_RESEND_LEADERBOARD_REQUEST_TIME 5000
//ARCADE_GAMES_LEADERBOARD_DATA lbData
FUNC CASINO_ARCADE_GAME ARCADE_GAMES_LEADERBOARD_GET_CASINO_ARCADE_GAME()
RETURN CASINO_ARCADE_GAME_Camhedz
ENDFUNC
//FUNC STRING ARCADE_GAMES_GAME_NAME_TO_STRING(CASINO_ARCADE_GAME eEnum)
// RETURN "Badlands Revenge II"
//ENDFUNC
FUNC STRING ARCADE_GAMES_LEADERBOARD_GET_TITLE_TEXTURE_NAME()
RETURN "CAMHEDZ_TITLE_SCREEN_LEADERBOARDS_BUTTON"
ENDFUNC
FUNC VECTOR_2D ARCADE_GAMES_LEADERBOARD_GET_TITLE_TEXTURE_POSITION()
RETURN INIT_VECTOR_2D(960.0,200.0)
ENDFUNC
FUNC VECTOR_2D ARCADE_GAMES_LEADERBOARD_GET_TITLE_TEXTURE_SIZE()
RETURN INIT_VECTOR_2D(276, 48)
ENDFUNC
FUNC VECTOR_2D ARCADE_GAMES_LEADERBOARD_GET_CHAR_TEXTURE_SIZE()
RETURN INIT_VECTOR_2D(24, 48)
ENDFUNC
FUNC VECTOR_2D ARCADE_GAMES_LEADERBOARD_GET_CHAR_TEXTURE_SEPARATION()
RETURN INIT_VECTOR_2D(24, 48*1.1)
ENDFUNC
FUNC VECTOR_2D ARCADE_GAMES_LEADERBOARD_GET_RANK_COLUMN_POSITION()
RETURN INIT_VECTOR_2D(600.0,350.0)
ENDFUNC
FUNC VECTOR_2D ARCADE_GAMES_LEADERBOARD_GET_INITIALS_COLUMN_POSITION()
RETURN INIT_VECTOR_2D(750.0,350.0)
ENDFUNC
FUNC VECTOR_2D ARCADE_GAMES_LEADERBOARD_GET_SCORE_COLUMN_POSITION()
RETURN INIT_VECTOR_2D(1220.0,350.0)
ENDFUNC
FUNC RGBA_COLOUR_STRUCT ARCADE_GAMES_LEADERBOARD_GET_DEFAULT_COLOR()
RGBA_COLOUR_STRUCT rgba
INIT_RGBA_STRUCT(rgba,255,255,255,255)
RETURN rgba
ENDFUNC
FUNC RGBA_COLOUR_STRUCT ARCADE_GAMES_LEADERBOARD_GET_ENTRY_COLOR(BOOL bIsPlayerTwo)
RGBA_COLOUR_STRUCT rgba
IF bIsPlayerTwo
INIT_RGBA_STRUCT(rgba,0,0,255,255)
ELSE
INIT_RGBA_STRUCT(rgba,255,0,0,255)
ENDIF
RETURN rgba
ENDFUNC
FUNC STRING ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_DICTIONARY()
RETURN "MPCamhedzVHSFont"
ENDFUNC
FUNC STRING ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_NUMBER()
RETURN "FONT_"
ENDFUNC
FUNC STRING ARCADE_GAMES_LEADERBOARD_GET_TEXTURE_LETTER()
RETURN "FONT_"
ENDFUNC
FUNC INT ARCADE_GAMES_LEADERBOARD_GET_SCORE_MAX_CHARS()
RETURN 0
ENDFUNC
/// PURPOSE:
/// Returns the default initials for a leaderboard position
FUNC INT ARCADE_GAMES_GET_DEFAULT_INITIALS_FOR_POSITION(INT iPosition)
SWITCH iPosition
CASE 0 RETURN 8457 //JEC
CASE 1 RETURN 91275 //LSW
CASE 2 RETURN 53260 //MAN
CASE 3 RETURN 78663 //HNT
CASE 4 RETURN 25103 //PIG
CASE 5 RETURN 102401 //BAZ
CASE 6 RETURN 12672 //AGD
CASE 7 RETURN 74380 //MKS
CASE 8 RETURN 90438 //GFW
CASE 9 RETURN 54337 //BRN
ENDSWITCH
RETURN 0
ENDFUNC
/// PURPOSE:
/// Returns the default score for a leaderboard position
FUNC INT ARCADE_GAMES_GET_DEFAULT_SCORE_FOR_POSITION(INT iPosition)
SWITCH iPosition
CASE 0 RETURN 100000
CASE 1 RETURN 90000
CASE 2 RETURN 80000
CASE 3 RETURN 70000
CASE 4 RETURN 60000
CASE 5 RETURN 50000
CASE 6 RETURN 40000
CASE 7 RETURN 30000
CASE 8 RETURN 20000
CASE 9 RETURN 10000
ENDSWITCH
RETURN 0
ENDFUNC
FUNC ARCADE_GAMES_SOUND ARCADE_GAMES_LEADERBAORD_GET_SOUND_LETTER_CHANGE()
RETURN ARCADE_GAMES_SOUND_CMHDZ_HIGH_SCORE_LETTER_CHANGE
ENDFUNC
FUNC ARCADE_GAMES_SOUND ARCADE_GAMES_LEADERBAORD_GET_SOUND_LETTER_SET()
RETURN ARCADE_GAMES_SOUND_CMHDZ_HIGH_SCORE_LETTER_SET
ENDFUNC
FUNC ARCADE_GAMES_SOUND ARCADE_GAMES_LEADERBAORD_GET_SOUND_STORE()
RETURN ARCADE_GAMES_SOUND_CMHDZ_HIGH_SCORE_STORE
ENDFUNC
//FUNC INT ARCADE_GAMES_GET_PLAYER_LEADERBOARD_POSITION(ARCADE_GAMES_LEADERBOARD_DATA &lbData)
//
// IF lbData.iLocalLbdPos != -1
// RETURN lbData.iLocalLbdPos
// ENDIF
//
// INT i
// FOR i = 0 TO ciCASINO_ARCADE_LEADERBOARD_POSITIONS - 1
// IF lbData.sLeaderboard[i].bPlayer
// lbData.iLocalLbdPos = i
// RETURN i
// ENDIF
// ENDFOR
//
// RETURN ciARCADE_GAMES_LBD_DEFAULT_RANK
//
//ENDFUNC
/// PURPOSE:
/// Initialise the leaderboard data
PROC ARCADE_GAMES_LEADERBOARD_INITIALISE(ARCADE_GAMES_LEADERBOARD_DATA &lbData, INT &iInitials[ciCASINO_ARCADE_LEADERBOARD_POSITIONS], INT &iScores[ciCASINO_ARCADE_LEADERBOARD_POSITIONS])
//CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_INITIALISE][LEADERBOARD] - ARCADE_GAMES_LEADERBOARD_INITIALISE ")
INT i
FOR i = 0 TO ciCASINO_ARCADE_LEADERBOARD_POSITIONS - 1
IF iScores[i] <= 0
#IF IS_DEBUG_BUILD
OR lbData.bForceDefaultLeaderboard
#ENDIF
//CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_INITIALISE][LEADERBOARD] - ARCADE_GAMES_LEADERBOARD_INITIALISE - iScores[",i,"] <= 0")
//First time - Initialise
lbData.sLeaderboard[i].iScore = ARCADE_GAMES_GET_DEFAULT_SCORE_FOR_POSITION(i)
lbData.sLeaderboard[i].iInitials = ARCADE_GAMES_GET_DEFAULT_INITIALS_FOR_POSITION(i)
BROADCAST_CASINO_ARCADE_UPDATE_LEADERBOARD_EVENT(GET_OWNER_OF_SIMPLE_INTERIOR_PLAYER_IS_IN(PLAYER_ID()), ARCADE_GAMES_LEADERBOARD_GET_CASINO_ARCADE_GAME(), i, lbData.sLeaderboard[i].iInitials, lbData.sLeaderboard[i].iScore)
ELSE
//CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_INITIALISE][LEADERBOARD] - ARCADE_GAMES_LEADERBOARD_INITIALISE - iScores[",i,"] = ",iScores[i])
lbData.sLeaderboard[i].iScore = iScores[i]
lbData.sLeaderboard[i].iInitials = iInitials[i]
ENDIF
ENDFOR
ENDPROC
PROC QUICK_SORT_LEADERBOARD(ARCADE_GAMES_LEADERBOARD_STRUCT &sArray[], INT iLeft, INT iRight)
INT i, j
INT p = sArray[((iLeft + iRight) / 2)].iScore
ARCADE_GAMES_LEADERBOARD_STRUCT q
i = iLeft
j = iRight
WHILE (i <= j)
WHILE ((sArray[i].iScore > p) AND (i < iRight))
i++
ENDWHILE
WHILE ((p > sArray[j].iScore) AND (j > iLeft))
j--
ENDWHILE
IF (i <= j)
q.iInitials = sArray[i].iInitials
q.iPlayer = sArray[i].iPlayer
q.iScore = sArray[i].iScore
sArray[i].iInitials = sArray[j].iInitials
sArray[i].iPlayer = sArray[j].iPlayer
sArray[i].iScore = sArray[j].iScore
sArray[j].iInitials = q.iInitials
sArray[j].iPlayer = q.iPlayer
sArray[j].iScore = q.iScore
i++
j--
ENDIF
ENDWHILE
IF (i < iRight)
QUICK_SORT_LEADERBOARD(sArray, i, iRight)
ENDIF
IF (iLeft < j)
QUICK_SORT_LEADERBOARD(sArray, iLeft, j)
ENDIF
ENDPROC
/// PURPOSE:
/// Sorts the leaderboard once players' final scores are set
PROC CMHDZ_SORT_SERVER_LEADERBOARD(CMHDZ_PLAYER_BROADCAST_DATA &lbPlayerBd[ciCMHDZ_MAX_MP_PLAYERS], ARCADE_GAMES_LEADERBOARD_STRUCT &serverLbData[ciCASINO_ARCADE_LEADERBOARD_POSITIONS], INT iSortForPart)
IF NOT NETWORK_IS_HOST_OF_THIS_SCRIPT()
//CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_SORT_SERVER_LEADERBOARD] Exit - not host")
EXIT
ENDIF
ARCADE_GAMES_LEADERBOARD_STRUCT sTempArray[ciCASINO_ARCADE_LEADERBOARD_POSITIONS + ciCMHDZ_MAX_MP_PLAYERS]
INT i
//CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_SORT_SERVER_LEADERBOARD]")
//CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_SORT_SERVER_LEADERBOARD] {dsw} CMHDZ_SORT_SERVER_LEADERBOARD - Init. iSortForPart: ", iSortForPart, " Score: ", lbPlayerBd[iSortForPart].iLeaderboardScore, " Min Score Req'd: ", serverLbData[ciCASINO_ARCADE_LEADERBOARD_POSITIONS-1].iScore)
// FOR i = 0 TO ciCASINO_ARCADE_LEADERBOARD_POSITIONS - 1
//
// IF serverLbData[i].iPlayer != -1
// serverLbData[i].iPlayer = -1
// ENDIF
//
// ENDFOR
// FOR i = 0 TO ciCMHDZ_MAX_MP_PLAYERS - 1
//
// IF NOT NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(i))
// RELOOP
// ENDIF
//
// IF lbPlayerBd[i].iLeaderboardScore > serverLbData[ciCASINO_ARCADE_LEADERBOARD_POSITIONS-1].iScore
//
// sTempArray[i].iInitials = lbPlayerBd[i].iLeaderboardInitials
// sTempArray[i].iScore = lbPlayerBd[i].iLeaderboardScore
// sTempArray[i].iPlayer = i
// iValidPlayerScores++
// //CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_SORT_SERVER_LEADERBOARD] sTempArray[", i, "].iPlayer = ", sTempArray[i].iPlayer)
// //CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_SORT_SERVER_LEADERBOARD] sTempArray[", i, "].iScore = ", sTempArray[i].iScore)
// ELSE
// //CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_SORT_SERVER_LEADERBOARD] Not Adding score for part ",i, ": ", lbPlayerBd[i].iLeaderboardScore, " as not > ", serverLbData[ciCASINO_ARCADE_LEADERBOARD_POSITIONS-1].iScore)
// ENDIF
//
// ENDFOR
sTempArray[0].iInitials = lbPlayerBd[iSortForPart].iLeaderboardInitials
sTempArray[0].iScore = lbPlayerBd[iSortForPart].iLeaderboardScore
sTempArray[0].iPlayer = iSortForPart
INT iValidPlayerScores = 1
FOR i = 0 TO ciCASINO_ARCADE_LEADERBOARD_POSITIONS - 1
sTempArray[i + iValidPlayerScores].iInitials = serverLbData[i].iInitials
sTempArray[i + iValidPlayerScores].iPlayer = serverLbData[i].iPlayer
sTempArray[i + iValidPlayerScores].iScore = serverLbData[i].iScore
ENDFOR
//CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_SORT_SERVER_LEADERBOARD] {dsw} CMHDZ_SORT_SERVER_LEADERBOARD - Before sort")
FOR i = 0 TO ciCASINO_ARCADE_LEADERBOARD_POSITIONS - 1
//CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_SORT_SERVER_LEADERBOARD] sTempArray[", i, "].iScore = ", sTempArray[i].iScore)
//CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_SORT_SERVER_LEADERBOARD] sTempArray[", i, "].iPlayer = ", sTempArray[i].iPlayer)
ENDFOR
QUICK_SORT_LEADERBOARD(sTempArray, 0, ciCASINO_ARCADE_LEADERBOARD_POSITIONS + ciCMHDZ_MAX_MP_PLAYERS - 1)
//CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_SORT_SERVER_LEADERBOARD] {dsw} CMHDZ_SORT_SERVER_LEADERBOARD - Sorting")
FOR i = 0 TO ciCASINO_ARCADE_LEADERBOARD_POSITIONS - 1
serverLbData[i].iInitials = sTempArray[i].iInitials
serverLbData[i].iPlayer = sTempArray[i].iPlayer
serverLbData[i].iScore = sTempArray[i].iScore
//CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_SORT_SERVER_LEADERBOARD] serverLbData[", i, "].iScore = ", serverLbData[i].iScore)
//CDEBUG1LN(DEBUG_MINIGAME, "[CMHDZ_SORT_SERVER_LEADERBOARD] serverLbData[", i, "].iPlayer = ", serverLbData[i].iPlayer)
BROADCAST_CASINO_ARCADE_UPDATE_LEADERBOARD_EVENT(GET_OWNER_OF_SIMPLE_INTERIOR_PLAYER_IS_IN(PLAYER_ID()), CASINO_ARCADE_GAME_Camhedz, i, serverLbData[i].iInitials, serverLbData[i].iScore)
ENDFOR
ENDPROC
//PROC ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY(ARCADE_GAMES_LEADERBOARD_DATA &lbData, ARCADE_GAMES_LEADERBOARD_STRUCT &serverLbData[ciCASINO_ARCADE_LEADERBOARD_POSITIONS], CMHDZ_PLAYER_BROADCAST_DATA &lbPlayerBd[ciCMHDZ_MAX_MP_PLAYERS], INT &iLbInitials, INT &iScore, BOOL bServerReady)
PROC ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY(ARCADE_GAMES_LEADERBOARD_DATA &lbData, ARCADE_GAMES_LEADERBOARD_STRUCT &lbHost[ciCASINO_ARCADE_LEADERBOARD_POSITIONS], INT &iLbInitials, INT &iScore, BOOL bServerReady)
// //CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] - ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY - iScore:",iScore)
// //CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] Called. Editing: ", lbData.bEditing, " iScore: ", iScore)
IF NOT lbData.bEditing
IF lbHost[ciCASINO_ARCADE_LEADERBOARD_POSITIONS-1].iScore < iScore
IF iScore != lbData.iMylastLbScore
lbData.bEditing = TRUE
lbData.iMylastLbScore = iScore
IF NOT IS_BIT_SET(playerBD[PARTICIPANT_ID_TO_INT()].iPlayerBitset, ENUM_TO_INT(CMHDZ_PLAYER_BD_BIT_EDITING_LEADERBOARD))
SET_BIT(playerBD[PARTICIPANT_ID_TO_INT()].iPlayerBitset, ENUM_TO_INT(CMHDZ_PLAYER_BD_BIT_EDITING_LEADERBOARD))
//CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] Set CMHDZ_PLAYER_BD_BIT_EDITING_LEADERBOARD. My Score: ", iScore, " Compare with score: ", lbHost[ciCASINO_ARCADE_LEADERBOARD_POSITIONS-1].iScore)
ENDIF
// BROADCAST_CMHDZ_REQUEST_LB_SORT()
// CMHDZ_SORT_SERVER_LEADERBOARD(lbPlayerBd, serverLbData)
ELSE
//CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] Not editing because my score: ", iScore, " = last score = ", lbData.iMylastLbScore)
EXIT
ENDIF
ELSE
//CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] Not editing because my score: ", iScore, " < ", lbHost[ciCASINO_ARCADE_LEADERBOARD_POSITIONS-1].iScore)
EXIT
ENDIF
ENDIF
//
// IF ARCADE_GAMES_GET_PLAYER_LEADERBOARD_POSITION() >= ciCASINO_ARCADE_LEADERBOARD_POSITIONS
// EXIT
// ENDIF
//
IF bServerReady
INT iUnpackedInitials[ciARCADE_CABINET_LEADERBOARD_INITIALS]
IF SC_PROFANITY_GET_CHECK_IS_VALID(lbData.iLbdInitialProfanityToken)
// //CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] 1")
IF SC_PROFANITY_GET_CHECK_IS_PENDING(lbData.iLbdInitialProfanityToken)
// //CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] EXIT 2")
EXIT
ENDIF
IF SC_PROFANITY_GET_STRING_PASSED(lbData.iLbdInitialProfanityToken)
//CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] - ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY - Profanity: Initials OK")
//CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] - ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY - iInitials: ",iLbInitials)
//CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] - ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY - iScore: ",iScore)
// lbData.sLeaderboard[ARCADE_GAMES_GET_PLAYER_LEADERBOARD_POSITION(lbData)].iInitials = lbData.iInitials
// BROADCAST_CASINO_ARCADE_UPDATE_LEADERBOARD_EVENT(GET_OWNER_OF_SIMPLE_INTERIOR_PLAYER_IS_IN(PLAYER_ID()), ARCADE_GAMES_LEADERBOARD_GET_CASINO_ARCADE_GAME(), ARCADE_GAMES_GET_PLAYER_LEADERBOARD_POSITION(lbData), lbData.sLeaderboard[ARCADE_GAMES_GET_PLAYER_LEADERBOARD_POSITION(lbData)].iInitials, lbData.sLeaderboard[ARCADE_GAMES_GET_PLAYER_LEADERBOARD_POSITION(lbData)].iScore,TRUE)
BROADCAST_CMHDZ_INITIALS_ENTERED(iLbInitials)
// BROADCAST_CMHDZ_CLEAR_REQUEST_LB_SORT()
lbData.bEditing = FALSE
IF IS_BIT_SET(playerBD[PARTICIPANT_ID_TO_INT()].iPlayerBitset, ENUM_TO_INT(CMHDZ_PLAYER_BD_BIT_EDITING_LEADERBOARD))
CLEAR_BIT(playerBD[PARTICIPANT_ID_TO_INT()].iPlayerBitset, ENUM_TO_INT(CMHDZ_PLAYER_BD_BIT_EDITING_LEADERBOARD))
ENDIF
lbData.iCurrentInitial = 0
lbData.iInitials = 0
lbData.iLbdInitialProfanityToken = 0
iLbInitials = 0
iScore = 0
ELSE
//CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] - ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY - Profanity: Initials BAD")
// ARCADE_GAMES_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_Change_Letter")
lbData.iCurrentInitial = 0
lbData.iInitials = 0
lbData.iLbdInitialProfanityToken = 0
ENDIF
// //CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] EXIT 3")
EXIT
ELSE
// //CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] SC_PROFANITY_GET_CHECK_IS_VALID not valid. Token: ", lbData.iLbdInitialProfanityToken)
ENDIF
//
// IF sDegenatronGamesData.lbData.iCurrentInitial >= ciARCADE_CABINET_LEADERBOARD_INITIALS - 1
// EXIT
// ENDIF
//
// //CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] 4")
CONTROL_ACTION CA_InitialUp = INPUT_SCRIPT_RB
CONTROL_ACTION CA_InitialDown = INPUT_SCRIPT_LB
CONTROL_ACTION CA_InitialAccept = INPUT_FRONTEND_ACCEPT
CONTROL_ACTION CA_InitialBack = INPUT_FRONTEND_CANCEL
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
CA_InitialAccept = INPUT_CURSOR_ACCEPT
CA_InitialBack = INPUT_CURSOR_CANCEL
CA_InitialUp = INPUT_FRONTEND_UP
CA_InitialDown = INPUT_FRONTEND_DOWN
ENDIF
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, CA_InitialAccept)
lbData.iCurrentInitial ++
//CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY] lbData.iCurrentInitial: ", lbData.iCurrentInitial)
IF lbData.iCurrentInitial >= ciARCADE_CABINET_LEADERBOARD_INITIALS - 1
//ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_LEADERBAORD_GET_SOUND_STORE())
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_Score_Entered)
lbData.iCurrentInitial = ciARCADE_CABINET_LEADERBOARD_INITIALS - 1
ARCADE_UNPACK_LEADERBOARD_INITIALS(iLbInitials, iUnpackedInitials)
TEXT_LABEL_3 tl3Initials = ARCADE_GET_CHAR_FROM_INT(iUnpackedInitials[0])
tl3Initials += ARCADE_GET_CHAR_FROM_INT(iUnpackedInitials[1])
tl3Initials += ARCADE_GET_CHAR_FROM_INT(iUnpackedInitials[2])
IF SC_PROFANITY_CHECK_STRING(tl3Initials, lbData.iLbdInitialProfanityToken)
//CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] - ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY - Profanity: Starting check")
ENDIF
ELSE
//ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_LEADERBAORD_GET_SOUND_LETTER_SET())
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_Score_Letter_Select)
ENDIF
EXIT
ENDIF
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, CA_InitialBack)
IF lbData.iCurrentInitial > 0
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_Score_Letter_Select)
lbData.iCurrentInitial --
ENDIF
EXIT
ENDIF
INT iDelta = 0
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, CA_InitialUp)
// ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_LEADERBAORD_GET_SOUND_LETTER_CHANGE())
// SCRIPT_ASSERT("ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY - CA_InitialUp")
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_Score_Letter_Change)
iDelta = 1
ELIF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, CA_InitialDown)
// ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_LEADERBAORD_GET_SOUND_LETTER_CHANGE())
// SCRIPT_ASSERT("ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY - CA_InitialDown")
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_Score_Letter_Change)
iDelta = -1
ENDIF
IF iDelta = 0
// //CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] EXIT 5 Editing: ", lbData.bEditing)
EXIT
ENDIF
// ARCADE_GAMES_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_Change_Letter")
ARCADE_UNPACK_LEADERBOARD_INITIALS(iLbInitials, iUnpackedInitials)
iUnpackedInitials[lbData.iCurrentInitial] += iDelta
IF iUnpackedInitials[lbData.iCurrentInitial] >= ciARCADE_CABINET_LEADERBOARD_INITIALS_MAX
iUnpackedInitials[lbData.iCurrentInitial] = 0
ELIF iUnpackedInitials[lbData.iCurrentInitial] < 0
iUnpackedInitials[lbData.iCurrentInitial] = ciARCADE_CABINET_LEADERBOARD_INITIALS_MAX - 1
ENDIF
//CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] lbData.iCurrentInitial: ", lbData.iCurrentInitial)
//CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] iUnpackedInitials = ", iUnpackedInitials[lbData.iCurrentInitial])
iLbInitials = ARCADE_PACK_LEADERBOARD_INITIALS(iUnpackedInitials)
//CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] Packed Initials = ", iLbInitials)
// //CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] EXIT 6")
ELSE
CDEBUG1LN(DEBUG_MINIGAME, "[ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY][LEADERBOARD] Server not ready")
ENDIF
ENDPROC
// ------------------------------ EVENT PROCESSING ------------------------------
/// PURPOSE:
/// Initialise the leaderboard data in ServerBD
PROC CMHDZ_INITIALISE_SERVER_LEADERBOARD(ARCADE_GAMES_LEADERBOARD_STRUCT &sLeaderboard[ciCASINO_ARCADE_LEADERBOARD_POSITIONS], INT &iInitials[ciCASINO_ARCADE_LEADERBOARD_POSITIONS], INT &iScores[ciCASINO_ARCADE_LEADERBOARD_POSITIONS], BOOL &bReceived)
IF !NETWORK_IS_HOST_OF_THIS_SCRIPT()
EXIT
ENDIF
INT i
FOR i = 0 TO ciCASINO_ARCADE_LEADERBOARD_POSITIONS - 1
IF iScores[i] <= 0
//First time - Initialise
sLeaderboard[i].iScore = ARCADE_GAMES_GET_DEFAULT_SCORE_FOR_POSITION(i)
sLeaderboard[i].iInitials = ARCADE_GAMES_GET_DEFAULT_INITIALS_FOR_POSITION(i)
BROADCAST_CASINO_ARCADE_UPDATE_LEADERBOARD_EVENT(GET_OWNER_OF_SIMPLE_INTERIOR_PLAYER_IS_IN(PLAYER_ID()), CASINO_ARCADE_GAME_Camhedz, i, sLeaderboard[i].iInitials, sLeaderboard[i].iScore)
ELSE
sLeaderboard[i].iScore = iScores[i]
sLeaderboard[i].iInitials = iInitials[i]
ENDIF
ENDFOR
bReceived = TRUE
ENDPROC
FUNC INT CMHDZ_GET_PLAYER_LEADERBOARD_POSITION(ARCADE_GAMES_LEADERBOARD_STRUCT &sLeaderboard[ciCASINO_ARCADE_LEADERBOARD_POSITIONS], INT iParticipant)
INT i
FOR i = 0 TO ciCASINO_ARCADE_LEADERBOARD_POSITIONS - 1
IF sLeaderboard[i].iPlayer = iParticipant
RETURN i
ENDIF
ENDFOR
RETURN 99
ENDFUNC
PROC CMHDZ_PROCESS_INITIALS_ENTERED_EVENT(PLAYER_INDEX piFromPlayer, ARCADE_GAMES_LEADERBOARD_STRUCT &sLeaderboard[ciCASINO_ARCADE_LEADERBOARD_POSITIONS], CMHDZ_PLAYER_BROADCAST_DATA &tlgPlayerBd[2], INT iInitials)
IF NOT NETWORK_IS_HOST_OF_THIS_SCRIPT()
//CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_PROCESS_INITIALS_ENTERED_EVENT] Exit as not host")
EXIT
ENDIF
INT iParticipant = NATIVE_TO_INT(NETWORK_GET_PARTICIPANT_INDEX(piFromPlayer))
INT iPosition = CMHDZ_GET_PLAYER_LEADERBOARD_POSITION(sLeaderboard, iParticipant)
//CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_PROCESS_INITIALS_ENTERED_EVENT] iPosition: ", iPosition, " Initials: ", iInitials)
IF iPosition < 0
OR iPosition >= ciCASINO_ARCADE_LEADERBOARD_POSITIONS
EXIT
ENDIF
sLeaderboard[iPosition].iInitials = iInitials //tlgPlayerBd[iParticipant].iLeaderboardInitials
UNUSED_PARAMETER(tlgPlayerBd)
//CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_PROCESS_INITIALS_ENTERED_EVENT] sLeaderboard[ ", iPosition, "].iInitials = ", tlgPlayerBd[iParticipant].iLeaderboardInitials , " Part: ", iParticipant)
BROADCAST_CASINO_ARCADE_UPDATE_LEADERBOARD_EVENT(GET_OWNER_OF_SIMPLE_INTERIOR_PLAYER_IS_IN(PLAYER_ID()), CASINO_ARCADE_GAME_Camhedz, iPosition, sLeaderboard[iPosition].iInitials, sLeaderboard[iPosition].iScore)
ENDPROC
///// PURPOSE:
///// Priot to editing the leaderboard, it needs to be sorted by the host. Clieients can request the leaderboard be sorted by sending an event
///// PARAMS:
///// piFromPlayer -
///// sLeaderboard -
///// tlgPlayerBd -
///// serverBitset -
//PROC CMHDZ_PROCESS_REQ_LB_SORT_EVENT(PLAYER_INDEX piFromPlayer, ARCADE_GAMES_LEADERBOARD_STRUCT &sLeaderboard[ciCASINO_ARCADE_LEADERBOARD_POSITIONS], CMHDZ_PLAYER_BROADCAST_DATA &tlgPlayerBd[2],INT &serverBitset)
// IF NOT NETWORK_IS_HOST_OF_THIS_SCRIPT()
// //CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_PROCESS_REQ_LB_SORT_EVENT] Exit as not host")
// EXIT
// ENDIF
//
// //UNUSED_PARAMETER(piFromPlayer)
// INT iParticipant = NATIVE_TO_INT(NETWORK_GET_PARTICIPANT_INDEX(piFromPlayer))
//
// CMHDZ_SORT_SERVER_LEADERBOARD(tlgPlayerBd, sLeaderboard, iParticipant)
//
// //CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_PROCESS_REQ_LB_SORT_EVENT] setting bit: ", iParticipant)
// SET_BIT(serverBitset, iParticipant)
//
//
//ENDPROC
//
///// PURPOSE:
///// After editing the leaderboard, clients need to clear that they've requested the LB be sorted, so that it will be appropriately
///// sorted the next time the client needs to edit the LB
///// PARAMS:
///// piFromPlayer -
///// sLeaderboard -
///// tlgPlayerBd -
///// serverBitset -
//PROC CMHDZ_PROCESS_CLEAR_REQ_LB_SORT_EVENT(PLAYER_INDEX piFromPlayer, INT &serverBitset)
// IF NOT NETWORK_IS_HOST_OF_THIS_SCRIPT()
// //CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_PROCESS_CLEAR_REQ_LB_SORT_EVENT] Exit as not host")
// EXIT
// ENDIF
//
// //UNUSED_PARAMETER(piFromPlayer)
// INT iParticipant = NATIVE_TO_INT(NETWORK_GET_PARTICIPANT_INDEX(piFromPlayer))
//
// //CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_PROCESS_CLEAR_REQ_LB_SORT_EVENT] Clearing bit: ", iParticipant)
// CLEAR_BIT(serverBitset, iParticipant)
//ENDPROC
#IF IS_DEBUG_BUILD
PROC ARCADE_GAMES_LEADERBOARD_WIDGET_CREATE(ARCADE_GAMES_LEADERBOARD_DATA &lbData)
START_WIDGET_GROUP("Leaderboard")
ADD_WIDGET_BOOL("Force Default Leaderboard", lbData.bForceDefaultLeaderboard)
ADD_WIDGET_BOOL("Test server sort", lbData.bDebugTestServerSort)
STOP_WIDGET_GROUP()
ENDPROC
PROC ARCADE_GAMES_LEADERBOARD_WIDGET_UPDATE(ARCADE_GAMES_LEADERBOARD_DATA &lbData, CMHDZ_PLAYER_BROADCAST_DATA &lbPlayerBd[ciCMHDZ_MAX_MP_PLAYERS], ARCADE_GAMES_LEADERBOARD_STRUCT &lbHostData[ciCASINO_ARCADE_LEADERBOARD_POSITIONS])
BOOL bReceived
IF lbData.bForceDefaultLeaderboard
INT iInitials[ciCASINO_ARCADE_LEADERBOARD_POSITIONS]
INT iScores[ciCASINO_ARCADE_LEADERBOARD_POSITIONS]
//ARCADE_GAMES_LEADERBOARD_INITIALISE(lbData, iInitials,iScores)
CMHDZ_INITIALISE_SERVER_LEADERBOARD(lbHostData, iInitials, iScores, bReceived)
lbData.bForceDefaultLeaderboard = FALSE
ENDIF
IF lbData.bDebugTestServerSort
CMHDZ_SORT_SERVER_LEADERBOARD(lbPlayerBd, lbHostData, PARTICIPANT_ID_TO_INT())
ENDIF
ENDPROC
#ENDIF
/// PURPOSE:
/// Processes all incoming events
PROC ARCADE_GAMES_LEADERBOARD_PROCESS_EVENTS(ARCADE_GAMES_LEADERBOARD_DATA &lbData, ARCADE_GAMES_LEADERBOARD_STRUCT &sLeaderboard[ciCASINO_ARCADE_LEADERBOARD_POSITIONS], CMHDZ_PLAYER_BROADCAST_DATA &cmhdzPlayerBd[2], BOOL &bReceived)
UNUSED_PARAMETER(lbData)
INT iCount
SCRIPT_EVENT_DATA_CASINO_ARCADE_SEND_LEADERBOARD_EVENT EventDataLeaderboardSend
SCRIPT_EVENT_DATA_CMHDZ_INITIALS_ENTERED EventDataInitialsEntered
// SCRIPT_EVENT_DATA_CMHDZ_REQUEST_LB_SORT EventDataReqLbSort
// SCRIPT_EVENT_DATA_CMHDZ_CLEAR_REQUEST_LB_SORT EventDataClearReqLbSort
REPEAT GET_NUMBER_OF_EVENTS(SCRIPT_EVENT_QUEUE_NETWORK) iCount
IF GET_EVENT_AT_INDEX(SCRIPT_EVENT_QUEUE_NETWORK, iCount) != EVENT_NETWORK_SCRIPT_EVENT
RELOOP
ENDIF
IF GET_EVENT_DATA(SCRIPT_EVENT_QUEUE_NETWORK, iCount, EventDataLeaderboardSend, SIZE_OF(EventDataLeaderboardSend))
/*
Gets sent via BROADCAST_CASINO_ARCADE_SEND_LEADERBOARD_EVENT(), which gets called via
PROCESS_SCRIPT_EVENT_CASINO_ARCADE_REQUEST_LEADERBOARD_EVENT, called via
BROADCAST_CASINO_ARCADE_REQUEST_LEADERBOARD_EVENT, called via
ARCADE_GAMES_LEADERBOARD_LOAD
*/
IF EventDataLeaderboardSend.Details.Type = SCRIPT_EVENT_CASINO_ARCADE_SEND_LEADERBOARD_EVENT
IF bReceived
RELOOP
ENDIF
//CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [ARCADE_GAMES_LEADERBOARD_PROCESS_EVENTS] - Found event: LEADERBOARD")
//CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [ARCADE_GAMES_LEADERBOARD_PROCESS_EVENTS] - Player = ", NATIVE_TO_INT(EventDataLeaderboardSend.Details.FromPlayerIndex))
IF EventDataLeaderboardSend.eGameType != CASINO_ARCADE_GAME_Camhedz
RELOOP
ENDIF
CMHDZ_INITIALISE_SERVER_LEADERBOARD(sLeaderboard, EventDataLeaderboardSend.iInitials, EventDataLeaderboardSend.iScores, bReceived)
RELOOP
ENDIF
ENDIF
IF GET_EVENT_DATA(SCRIPT_EVENT_QUEUE_NETWORK, iCount, EventDataInitialsEntered, SIZE_OF(EventDataInitialsEntered))
IF EventDataInitialsEntered.Details.Type = SCRIPT_EVENT_CMHDZ_INITIALS_ENTERED
//CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [ARCADE_GAMES_LEADERBOARD_PROCESS_EVENTS] - Found event: INITIALS")
//CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [ARCADE_GAMES_LEADERBOARD_PROCESS_EVENTS] - Player = ", NATIVE_TO_INT(EventDataInitialsEntered.Details.FromPlayerIndex))
CMHDZ_PROCESS_INITIALS_ENTERED_EVENT(EventDataInitialsEntered.Details.FromPlayerIndex, sLeaderboard, cmhdzPlayerBd, EventDataInitialsEntered.iInitials)
RELOOP
ENDIF
ENDIF
ENDREPEAT
ENDPROC