6101 lines
228 KiB
XML
Executable File
6101 lines
228 KiB
XML
Executable File
USING "street_crime_using.sch"
|
|
USING "street_crime_drawing.sch"
|
|
USING "net_arcade_cabinet.sch"
|
|
|
|
// ------------------------------ HELPERS ------------------------------
|
|
|
|
/// PURPOSE:
|
|
/// Updates the player's global state
|
|
PROC SCGW_SET_GLOBAL_PLAYER_STATE(CASINO_ARCADE_STREET_CRIME_PLAYER_STATE eState)
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SET_GLOBAL_PLAYER_STATE - State changed from ",
|
|
SCGW_DEBUG_GET_CASINO_ARCADE_STREET_CRIME_PLAYER_STATE_AS_STRING(g_sCasinoArcadeStreetCrimeVars.ePlayerState), " to ", SCGW_DEBUG_GET_CASINO_ARCADE_STREET_CRIME_PLAYER_STATE_AS_STRING(eState))
|
|
|
|
g_sCasinoArcadeStreetCrimeVars.ePlayerState = eState
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Updates the player's global state
|
|
PROC SCGW_SET_GLOBAL_THIS_FRAME_ACTION(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION eState)
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SET_GLOBAL_PLAYER_STATE - State changed from ",
|
|
SCGW_DEBUG_GET_CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_AS_STRING(g_sCasinoArcadeStreetCrimeVars.eThisFrameAction), " to ", SCGW_DEBUG_GET_CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_AS_STRING(eState))
|
|
|
|
g_sCasinoArcadeStreetCrimeVars.eThisFrameAction = eState
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL SHOULD_ALLOW_STREET_CRIME_IN_PROPERTY()
|
|
SWITCH GET_SIMPLE_INTERIOR_TYPE_LOCAL_PLAYER_IS_IN()
|
|
CASE SIMPLE_INTERIOR_TYPE_CASINO_APARTMENT
|
|
CASE SIMPLE_INTERIOR_TYPE_ARCADE
|
|
RETURN TRUE
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Returns true if the game should quit
|
|
/// Processes holding a button to quit
|
|
/// RETURNS:
|
|
///
|
|
FUNC BOOL SCGW_SHOULD_QUIT_NOW()
|
|
|
|
IF g_bForceQuitPenthouseArcadeMachines
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SHOULD_QUIT_NOW - g_bForceQuitPenthouseArcadeMachines")
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
IF IS_LOCAL_PLAYER_WALKING_IN_OR_OUT_OF_SIMPLE_INTERIOR()
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SHOULD_QUIT_NOW - IS_LOCAL_PLAYER_WALKING_IN_OR_OUT_OF_SIMPLE_INTERIOR")
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_LEAVING_ANY_SIMPLE_INTERIOR_USING_THE_LIMO_SERVICE()
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SHOULD_QUIT_NOW - IS_PLAYER_LEAVING_ANY_SIMPLE_INTERIOR_USING_THE_LIMO_SERVICE")
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_DOING_HELI_DOCK_CUTSCENE(GET_PLAYER_INDEX())
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SHOULD_QUIT_NOW - IS_PLAYER_DOING_HELI_DOCK_CUTSCENE")
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
IF NOT SHOULD_ALLOW_STREET_CRIME_IN_PROPERTY()
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SHOULD_QUIT_NOW - Not allowed in this property")
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
IF SHOULD_KICK_PLAYER_FROM_ANY_ARCADE_GAME()
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SHOULD_QUIT_NOW - SHOULD_KICK_PLAYER_FROM_ANY_ARCADE_GAME")
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
IF SCGW_ServerBD.eCurrentServerState = SCGW_SERVER_STATE_RUNNING
|
|
AND SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].eCurrentPlayerState != SCGW_PLAYER_STATE_CANT_RESPAWN
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
IF sSCGWData.eCurrentState < SCGW_CLIENT_STATE_INTRO_VIDEO
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
CONTROL_ACTION CA_Quit = INPUT_FRONTEND_CANCEL
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
CA_Quit = INPUT_FRONTEND_DELETE
|
|
ENDIF
|
|
|
|
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, CA_Quit)
|
|
OR (IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, CA_Quit))
|
|
DRAW_GENERIC_METER(ciSCGW_HOLD_TO_QUIT_TIME - ABSI(NATIVE_TO_INT(GET_NETWORK_TIME()) - sSCGWData.iQuitTime), ciSCGW_HOLD_TO_QUIT_TIME, "DEG_GAME_QUIT")
|
|
ELSE
|
|
DRAW_GENERIC_METER(0, ciSCGW_HOLD_TO_QUIT_TIME, "DEG_GAME_QUIT")
|
|
ENDIF
|
|
|
|
IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, CA_Quit)
|
|
|
|
IF sSCGWData.iQuitTime = -HIGHEST_INT
|
|
sSCGWData.iQuitTime = NATIVE_TO_INT(GET_NETWORK_TIME()) + ciSCGW_HOLD_TO_QUIT_TIME
|
|
ENDIF
|
|
|
|
//DRAW_GENERIC_METER(ciSCGW_HOLD_TO_QUIT_TIME - (sSCGWData.iQuitTime - NATIVE_TO_INT(GET_NETWORK_TIME())), ciSCGW_HOLD_TO_QUIT_TIME, "SCGW_EXIT", HUD_COLOUR_RED, -1, HUDORDER_TOP)
|
|
|
|
IF NATIVE_TO_INT(GET_NETWORK_TIME()) > sSCGWData.iQuitTime
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SHOULD_QUIT_NOW - Button Held")
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
ELIF sSCGWData.iQuitTime != -HIGHEST_INT
|
|
sSCGWData.iQuitTime = -HIGHEST_INT
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_IN_ARCADE_PROPERTY(PLAYER_ID())
|
|
IF SHOULD_KICK_PLAYER_FROM_ANY_ARCADE_GAME()
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SHOULD_QUIT_NOW - SHOULD_KICK_PLAYER_FROM_ANY_ARCADE_GAME true")
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
// ------------------------------ LEADERBOARD ------------------------------
|
|
|
|
/// PURPOSE:
|
|
/// Returns the default initials for a leaderboard position
|
|
FUNC INT SCGW_GET_DEFAULT_INITIALS_FOR_POSITION(INT iPosition)
|
|
|
|
SWITCH iPosition
|
|
CASE 0 RETURN 69644 //Green - MAR
|
|
CASE 1 RETURN 356361 //Purple - JAX
|
|
CASE 2 RETURN 533761 //Yellow - BUC
|
|
CASE 3 RETURN 861443 //Blue - DUS
|
|
CASE 4 RETURN 21638 //Green - GSF
|
|
CASE 5 RETURN 336649 //Purple - JMS
|
|
CASE 6 RETURN 586639 //Yellow - POP
|
|
CASE 7 RETURN 795403 //Blue - LMC
|
|
CASE 8 RETURN 38023 //Green - HSJ
|
|
CASE 9 RETURN 341123 //Purple - DST
|
|
ENDSWITCH
|
|
|
|
RETURN 0
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Initialise the leaderboard data in ServerBD
|
|
PROC SCGW_INITIALISE_SERVER_LEADERBOARD(INT &iInitials[ciCASINO_ARCADE_LEADERBOARD_POSITIONS], INT &iScores[ciCASINO_ARCADE_LEADERBOARD_POSITIONS])
|
|
|
|
IF !sSCGWData.sLocalPlayer.bIsHost
|
|
EXIT
|
|
ENDIF
|
|
|
|
INT i
|
|
FOR i = 0 TO ciCASINO_ARCADE_LEADERBOARD_POSITIONS - 1
|
|
|
|
IF iScores[i] <= 0
|
|
//First time - Initialise
|
|
SCGW_ServerBD.sLeaderboard[i].iScore = 50 - (i * 2)
|
|
SCGW_ServerBD.sLeaderboard[i].iInitials = SCGW_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_STREET_CRIMES, i, SCGW_ServerBD.sLeaderboard[i].iInitials, SCGW_ServerBD.sLeaderboard[i].iScore)
|
|
ELSE
|
|
SCGW_ServerBD.sLeaderboard[i].iScore = iScores[i]
|
|
SCGW_ServerBD.sLeaderboard[i].iInitials = iInitials[i]
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
SCGW_ServerBD.bLeaderboardRecieved = TRUE
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_INITIALS_ENTERED_EVENT(PLAYER_INDEX piFromPlayer)
|
|
|
|
INT iParticipant = NATIVE_TO_INT(NETWORK_GET_PARTICIPANT_INDEX(piFromPlayer))
|
|
|
|
INT iPosition = SCGW_GET_PLAYER_LEADERBOARD_POSITION(iParticipant)
|
|
|
|
IF iPosition < 0
|
|
OR iPosition >= ciCASINO_ARCADE_LEADERBOARD_POSITIONS
|
|
EXIT
|
|
ENDIF
|
|
|
|
SCGW_ServerBD.sLeaderboard[iPosition].iInitials = SCGW_PlayerBD[iParticipant].iLeaderboardInitials
|
|
BROADCAST_CASINO_ARCADE_UPDATE_LEADERBOARD_EVENT(GET_OWNER_OF_SIMPLE_INTERIOR_PLAYER_IS_IN(PLAYER_ID()), CASINO_ARCADE_GAME_STREET_CRIMES, iPosition, SCGW_ServerBD.sLeaderboard[iPosition].iInitials, SCGW_ServerBD.sLeaderboard[iPosition].iScore)
|
|
|
|
ENDPROC
|
|
|
|
PROC QUICK_SORT_LEADERBOARD(SCGW_LEADERBOARD_STRUCT &sArray[], INT iLeft, INT iRight)
|
|
|
|
INT i, j
|
|
INT p = sArray[((iLeft + iRight) / 2)].iScore
|
|
SCGW_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 SCGW_SORT_SERVER_LEADERBOARD()
|
|
|
|
SCGW_LEADERBOARD_STRUCT sTempArray[ciCASINO_ARCADE_LEADERBOARD_POSITIONS + ciSCGW_MAX_PLAYERS]
|
|
|
|
INT i
|
|
|
|
FOR i = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
|
|
IF NOT NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(i))
|
|
AND NOT SCGW_Bot[i].bActive
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[i].iGang = ciSCGW_GANG_NONE
|
|
RELOOP
|
|
ENDIF
|
|
|
|
sTempArray[i].iInitials = SCGW_PlayerBD[i].iLeaderboardInitials
|
|
sTempArray[i].iScore = SCGW_PlayerBD[i].iLeaderboardScore
|
|
sTempArray[i].iPlayer = i
|
|
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO ciCASINO_ARCADE_LEADERBOARD_POSITIONS - 1
|
|
sTempArray[i + ciSCGW_MAX_PLAYERS].iInitials = SCGW_ServerBD.sLeaderboard[i].iInitials
|
|
sTempArray[i + ciSCGW_MAX_PLAYERS].iPlayer = SCGW_ServerBD.sLeaderboard[i].iPlayer
|
|
sTempArray[i + ciSCGW_MAX_PLAYERS].iScore = SCGW_ServerBD.sLeaderboard[i].iScore
|
|
ENDFOR
|
|
|
|
QUICK_SORT_LEADERBOARD(sTempArray, 0, ciCASINO_ARCADE_LEADERBOARD_POSITIONS + ciSCGW_MAX_PLAYERS - 1)
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SORT_SERVER_LEADERBOARD - Sorting")
|
|
|
|
FOR i = 0 TO ciCASINO_ARCADE_LEADERBOARD_POSITIONS - 1
|
|
SCGW_ServerBD.sLeaderboard[i].iInitials = sTempArray[i].iInitials
|
|
SCGW_ServerBD.sLeaderboard[i].iPlayer = sTempArray[i].iPlayer
|
|
SCGW_ServerBD.sLeaderboard[i].iScore = sTempArray[i].iScore
|
|
BROADCAST_CASINO_ARCADE_UPDATE_LEADERBOARD_EVENT(GET_OWNER_OF_SIMPLE_INTERIOR_PLAYER_IS_IN(PLAYER_ID()), CASINO_ARCADE_GAME_STREET_CRIMES, i, SCGW_ServerBD.sLeaderboard[i].iInitials, SCGW_ServerBD.sLeaderboard[i].iScore)
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
// ------------------------------ HELP TEXT ------------------------------
|
|
|
|
/// PURPOSE:
|
|
/// Returns whether or not the help text is on display
|
|
FUNC BOOL SCGW_IS_THIS_HELP_BEING_DISPLAYED(STRING stHelp)
|
|
|
|
IF sSCGWData.iDisplayedHelpText = GET_HASH_KEY(stHelp)
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Prints a help text string and sets iDisplayedHelpText
|
|
/// PARAMS:
|
|
/// stHelp -
|
|
PROC SCGW_PRINT_HELP_FOREVER(STRING stHelp)
|
|
|
|
sSCGWData.iDisplayedHelpText = GET_HASH_KEY(stHelp)
|
|
PRINT_HELP_FOREVER(stHelp)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PRINT_HELP_FOREVER - Printing ", stHelp, "(",sSCGWData.iDisplayedHelpText,")")
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Prints a help text string with a number and sets iDisplayedHelpText
|
|
/// PARAMS:
|
|
/// stHelp -
|
|
PROC SCGW_PRINT_HELP_FOREVER_WITH_NUMBER(STRING stHelp, INT iValue)
|
|
|
|
sSCGWData.iDisplayedHelpText = GET_HASH_KEY(stHelp)
|
|
PRINT_HELP_WITH_NUMBER(stHelp, iValue)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PRINT_HELP_FOREVER_WITH_NUMBER - Printing ", stHelp, "(",sSCGWData.iDisplayedHelpText,")")
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Clears help text and resets stCurrentHelpText & iCurrentHelpTextExpiry to stop it being redrawn
|
|
PROC SCGW_CLEAR_HELP_TEXT()
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_CLEAR_HELP_TEXT - Clearing")
|
|
DEBUG_PRINTCALLSTACK()
|
|
|
|
sSCGWData.iDisplayedHelpText = -1
|
|
sSCGWData.bDoNotApplyPC = FALSE
|
|
|
|
IF sSCGWData.iCurrentHelpTextExpiry != -HIGHEST_INT
|
|
sSCGWData.iCurrentHelpTextExpiry = -HIGHEST_INT
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sSCGWData.stCurrentHelpText)
|
|
sSCGWData.stCurrentHelpText = ARCADE_GET_NULL_STRING()
|
|
ENDIF
|
|
|
|
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Draws start/quit helptext on the gang screen
|
|
PROC SCGW_PROCESS_GANG_SCREEN_HELP_TEXT()
|
|
|
|
SET_BIT(sSCGWData.iHelpTextBitset, ciSCGW_HELP_BS_SHOWING_HELP_TEXT)
|
|
|
|
TEXT_LABEL_23 stHelp
|
|
IF SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].eCurrentPlayerState = SCGW_PLAYER_STATE_WAITING_TO_START
|
|
stHelp = "SCGW_H_RDY1"
|
|
ELSE
|
|
stHelp = "SCGW_H_RDY0"
|
|
IF sSCGWData.sLocalPlayer.bIsHost AND sSCGWData.bCanAddBots
|
|
stHelp += "_H"
|
|
ENDIF
|
|
IF IS_PLAYSTATION_PLATFORM()
|
|
stHelp += "_PS4"
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
stHelp += "_PC"
|
|
ENDIF
|
|
|
|
IF SCGW_IS_THIS_HELP_BEING_DISPLAYED(stHelp)
|
|
EXIT
|
|
ENDIF
|
|
|
|
SCGW_CLEAR_HELP_TEXT()
|
|
SCGW_PRINT_HELP_FOREVER(stHelp)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Draws helptext on the leaderboard entry screen
|
|
PROC SCGW_PROCESS_LBD_ENTRY_HELP_TEXT()
|
|
|
|
SET_BIT(sSCGWData.iHelpTextBitset, ciSCGW_HELP_BS_SHOWING_HELP_TEXT)
|
|
|
|
TEXT_LABEL_15 stHelp
|
|
|
|
IF SCGW_GET_PLAYER_LEADERBOARD_POSITION(sSCGWData.sLocalPlayer.iLocalPart) = ciSCGW_LBD_DEFAULT_RANK
|
|
stHelp = "SC_H_LBD_2"
|
|
ELIF sSCGWData.iInitial = ciARCADE_CABINET_LEADERBOARD_INITIALS - 2
|
|
stHelp = "SC_H_LBD_1"
|
|
ELSE
|
|
stHelp = "SC_H_LBD_0"
|
|
ENDIF
|
|
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
stHelp += "PC"
|
|
ENDIF
|
|
|
|
IF SCGW_IS_THIS_HELP_BEING_DISPLAYED(stHelp)
|
|
EXIT
|
|
ENDIF
|
|
|
|
SCGW_CLEAR_HELP_TEXT()
|
|
SCGW_PRINT_HELP_FOREVER(stHelp)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Draws helptext on the leaderboard screen
|
|
PROC SCGW_PROCESS_LBD_HELP_TEXT()
|
|
|
|
SET_BIT(sSCGWData.iHelpTextBitset, ciSCGW_HELP_BS_SHOWING_HELP_TEXT)
|
|
|
|
TEXT_LABEL_15 stHelp = "SC_H_LBD_3"
|
|
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
stHelp += "PC"
|
|
ENDIF
|
|
|
|
IF SCGW_IS_THIS_HELP_BEING_DISPLAYED(stHelp)
|
|
EXIT
|
|
ENDIF
|
|
|
|
SCGW_CLEAR_HELP_TEXT()
|
|
SCGW_PRINT_HELP_FOREVER(stHelp)
|
|
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Draws help text
|
|
PROC SCGW_PROCESS_HELP_TEXT()
|
|
|
|
IF sSCGWData.iCurrentHelpTextExpiry = -HIGHEST_INT
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF IS_STRING_NULL_OR_EMPTY(sSCGWData.stCurrentHelpText)
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NATIVE_TO_INT(GET_NETWORK_TIME()) > sSCGWData.iCurrentHelpTextExpiry
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_HELP_TEXT - Text: ", sSCGWData.stCurrentHelpText, " has expired")
|
|
|
|
SCGW_CLEAR_HELP_TEXT()
|
|
|
|
EXIT
|
|
|
|
ENDIF
|
|
|
|
SET_BIT(sSCGWData.iHelpTextBitset, ciSCGW_HELP_BS_SHOWING_HELP_TEXT)
|
|
|
|
TEXT_LABEL_15 stHelp = sSCGWData.stCurrentHelpText
|
|
IF sSCGWData.iCurrentHelpTextValue = -1
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
AND NOT sSCGWData.bDoNotApplyPC
|
|
stHelp += "_PC"
|
|
ENDIF
|
|
ELSE
|
|
IF SCGW_IS_THIS_HELP_BEING_DISPLAYED(stHelp)
|
|
EXIT
|
|
ENDIF
|
|
|
|
SCGW_PRINT_HELP_FOREVER_WITH_NUMBER(stHelp, sSCGWData.iCurrentHelpTextValue)
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF SCGW_IS_THIS_HELP_BEING_DISPLAYED(stHelp)
|
|
EXIT
|
|
ENDIF
|
|
|
|
SCGW_PRINT_HELP_FOREVER(stHelp)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Triggers help text
|
|
PROC SCGW_TRIGGER_HELP_TEXT(STRING stHelpText, INT iDuration, BOOL bDoNotApplyPC = FALSE)
|
|
|
|
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
|
|
SCGW_CLEAR_HELP_TEXT()
|
|
ENDIF
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_TRIGGER_HELP_TEXT - Triggering: ", stHelpText, " Duration: ", iDuration)
|
|
|
|
sSCGWData.iCurrentHelpTextExpiry = NATIVE_TO_INT(GET_NETWORK_TIME()) + iDuration
|
|
sSCGWData.stCurrentHelpText = stHelpText
|
|
sSCGWData.iCurrentHelpTextValue = -1
|
|
sSCGWData.bDoNotApplyPC = bDoNotApplyPC
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Triggers help text
|
|
PROC SCGW_TRIGGER_HELP_TEXT_WITH_INT(STRING stHelpText, INT iValue, INT iDuration, BOOL bDoNotApplyPC = FALSE)
|
|
|
|
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
|
|
SCGW_CLEAR_HELP_TEXT()
|
|
ENDIF
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_TRIGGER_HELP_TEXT_WITH_INT - Triggering: ", stHelpText, " iValue: ", iValue, " Duration: ", iDuration)
|
|
|
|
sSCGWData.iCurrentHelpTextExpiry = NATIVE_TO_INT(GET_NETWORK_TIME()) + iDuration
|
|
sSCGWData.iCurrentHelpTextValue = iValue
|
|
sSCGWData.stCurrentHelpText = stHelpText
|
|
sSCGWData.bDoNotApplyPC = bDoNotApplyPC
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Returns whether or not help text is being drawn by the minigame this frame
|
|
FUNC BOOL SCGW_SHOULD_ALLOW_HELP_TEXT_THIS_FRAME()
|
|
|
|
RETURN IS_BIT_SET(sSCGWData.iHelpTextBitset, ciSCGW_HELP_BS_SHOWING_HELP_TEXT)
|
|
|
|
ENDFUNC
|
|
|
|
// ------------------------------ EXPLOSIONS ------------------------------
|
|
|
|
/// PURPOSE:
|
|
/// Adds an explosion at the coords
|
|
PROC SCGW_ADD_EXPLOSION_AT_COORDS(VECTOR_2D vCoords)
|
|
|
|
sSCGWData.sExplosions[sSCGWData.iNextExplosionIndex].iAnimFrame = 0
|
|
sSCGWData.sExplosions[sSCGWData.iNextExplosionIndex].vPosition = vCoords
|
|
IF VECTOR_2D_DIST2(vCoords, sSCGWData.sPlayers[sSCGWData.sLocalPlayer.iLocalPart].vActualPlayerPosition) < POW(cfSCGW_GRID_SPRITE_SCALE_Y * 2, 2)
|
|
SET_CONTROL_SHAKE(PLAYER_CONTROL, ciSCGW_VIB_EXPLODE_DURATION, ciSCGW_VIB_EXPLODE_FREQ)
|
|
ENDIF
|
|
|
|
SCGW_PLAY_FIRE_AND_FORGET_GLOBAL_SOUND("Rocket_Explode", vCoords)
|
|
|
|
sSCGWData.iNextExplosionIndex ++
|
|
IF sSCGWData.iNextExplosionIndex >= ciSCGW_MAX_EXPLOSIONS
|
|
sSCGWData.iNextExplosionIndex = 0
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
// ------------------------------ FLYOVERS ------------------------------
|
|
|
|
PROC SCGW_INIT_FLYOVER_POSITION()
|
|
|
|
SWITCH sSCGWData.iFlyoverType
|
|
CASE ciSCGW_FLYOVER_TYPE_BIRDS
|
|
CASE ciSCGW_FLYOVER_TYPE_PLANE
|
|
sSCGWData.vFlyoverPos = INIT_VECTOR_2D(1.0 + GET_RANDOM_FLOAT_IN_RANGE(-0.5, 0.0), 1.0 + GET_RANDOM_FLOAT_IN_RANGE(0.0, cfSCREEN_CENTER))
|
|
BREAK
|
|
CASE ciSCGW_FLYOVER_TYPE_HELI
|
|
sSCGWData.vFlyoverPos = INIT_VECTOR_2D(0.0 + GET_RANDOM_FLOAT_IN_RANGE(0.0, 0.5), 1.0 + GET_RANDOM_FLOAT_IN_RANGE(0.0, cfSCREEN_CENTER))
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
FUNC FLOAT SCGW_GET_FLYOVER_SPEED_X()
|
|
|
|
SWITCH sSCGWData.iFlyoverType
|
|
CASE ciSCGW_FLYOVER_TYPE_BIRDS
|
|
RETURN cfSCGW_FLYOVER_BIRDS_SPRITE_SPEED_X
|
|
CASE ciSCGW_FLYOVER_TYPE_PLANE
|
|
RETURN cfSCGW_FLYOVER_PLANE_SPRITE_SPEED_X
|
|
CASE ciSCGW_FLYOVER_TYPE_HELI
|
|
RETURN cfSCGW_FLYOVER_HELI_SPRITE_SPEED_X
|
|
ENDSWITCH
|
|
|
|
RETURN 0.0
|
|
|
|
ENDFUNC
|
|
|
|
FUNC FLOAT SCGW_GET_FLYOVER_SPEED_Y()
|
|
|
|
SWITCH sSCGWData.iFlyoverType
|
|
CASE ciSCGW_FLYOVER_TYPE_BIRDS
|
|
RETURN cfSCGW_FLYOVER_BIRDS_SPRITE_SPEED_Y
|
|
CASE ciSCGW_FLYOVER_TYPE_PLANE
|
|
RETURN cfSCGW_FLYOVER_PLANE_SPRITE_SPEED_Y
|
|
CASE ciSCGW_FLYOVER_TYPE_HELI
|
|
RETURN cfSCGW_FLYOVER_HELI_SPRITE_SPEED_Y
|
|
ENDSWITCH
|
|
|
|
RETURN 0.0
|
|
|
|
ENDFUNC
|
|
|
|
PROC SCGW_PROCESS_FLYOVERS()
|
|
|
|
IF sSCGWData.iFlyoverTime = -HIGHEST_INT
|
|
sSCGWData.iFlyoverTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
ENDIF
|
|
|
|
IF NATIVE_TO_INT(GET_NETWORK_TIME()) - sSCGWData.iFlyoverTime > ciSCGW_FLYOVER_INTERVAL
|
|
sSCGWData.iFlyoverTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
INT iNewType = GET_RANDOM_INT_IN_RANGE(0, ciSCGW_FLYOVER_TYPE_MAX)
|
|
IF iNewType = sSCGWData.iFlyoverType
|
|
iNewType = GET_RANDOM_INT_IN_RANGE(0, ciSCGW_FLYOVER_TYPE_MAX)
|
|
ENDIF
|
|
sSCGWData.iFlyoverType = iNewType
|
|
SCGW_INIT_FLYOVER_POSITION()
|
|
ENDIF
|
|
|
|
sSCGWData.vFlyoverPos.x = sSCGWData.vFlyoverPos.x +@ SCGW_GET_FLYOVER_SPEED_X()
|
|
sSCGWData.vFlyoverPos.y = sSCGWData.vFlyoverPos.y +@ SCGW_GET_FLYOVER_SPEED_Y()
|
|
|
|
ENDPROC
|
|
|
|
// ------------------------------ ROUNDS ------------------------------
|
|
|
|
/// PURPOSE:
|
|
/// Returns the winning participant index for the current round
|
|
/// Returns -1 if round is tied for sudden death
|
|
FUNC INT SCGW_GET_ROUND_WINNER()
|
|
|
|
INT iWinner = -1
|
|
INT iTopScore = -1
|
|
INT iPlayerLoop = 0
|
|
BOOL bTied = FALSE
|
|
BOOL bAllDeadSuddenDeath = TRUE
|
|
FOR iPlayerLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
|
|
IF NOT NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iPlayerLoop))
|
|
AND NOT SCGW_Bot[iPlayerLoop].bActive
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[iPlayerLoop].iGang = ciSCGW_GANG_NONE
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF NOT SCGW_ServerBD.bAllDeadSuddenDeath
|
|
IF SCGW_ServerBD.bSuddenDeath
|
|
AND SCGW_IS_PLAYER_DEAD(iPlayerLoop)
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_ServerBD.bSuddenDeath
|
|
bAllDeadSuddenDeath = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF SCGW_UF_ServerBD.iCurrentScore[SCGW_PlayerBD[iPlayerLoop].iGang] > iTopScore
|
|
iWinner = iPlayerLoop
|
|
iTopScore = SCGW_UF_ServerBD.iCurrentScore[SCGW_PlayerBD[iPlayerLoop].iGang]
|
|
bTied = FALSE
|
|
ELIF SCGW_UF_ServerBD.iCurrentScore[SCGW_PlayerBD[iPlayerLoop].iGang] = iTopScore
|
|
bTied = TRUE
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
IF bTied
|
|
AND NOT SCGW_ServerBD.bAllDeadSuddenDeath
|
|
iWinner = -1
|
|
ENDIF
|
|
|
|
IF bAllDeadSuddenDeath
|
|
AND SCGW_ServerBD.bSuddenDeath
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_GET_ROUND_WINNER - All players dead in sudden death")
|
|
SCGW_ServerBD.bAllDeadSuddenDeath = TRUE
|
|
ENDIF
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_GET_ROUND_WINNER - Winner: ", iWinner, " Top score: ", iTopScore)
|
|
RETURN iWinner
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Returns the winning participant index for the entire game
|
|
FUNC INT SCGW_GET_GAME_WINNER()
|
|
|
|
INT iWinner = -1
|
|
INT iTopScore = -1
|
|
INT iPlayerLoop = 0
|
|
FOR iPlayerLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
|
|
IF NOT NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iPlayerLoop))
|
|
AND NOT SCGW_Bot[iPlayerLoop].bActive
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[iPlayerLoop].iGang = ciSCGW_GANG_NONE
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_ServerBD.iRoundScores[SCGW_PlayerBD[iPlayerLoop].iGang] > iTopScore
|
|
iWinner = iPlayerLoop
|
|
iTopScore = SCGW_ServerBD.iRoundScores[SCGW_PlayerBD[iPlayerLoop].iGang]
|
|
ELIF iWinner > -1
|
|
AND SCGW_ServerBD.iRoundScores[SCGW_PlayerBD[iPlayerLoop].iGang] = iTopScore
|
|
IF (SCGW_PlayerBD[iPlayerLoop].iLeaderboardScore + SCGW_UF_ServerBD.iCurrentScore[SCGW_PlayerBD[iPlayerLoop].iGang]) > (SCGW_PlayerBD[iWinner].iLeaderboardScore + SCGW_UF_ServerBD.iCurrentScore[SCGW_PlayerBD[iWinner].iGang])
|
|
iWinner = iPlayerLoop
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_GET_GAME_WINNER - Winner: ", iWinner, " Top score: ", iTopScore)
|
|
RETURN iWinner
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Returns true if end conditions for the round are met
|
|
FUNC BOOL SCGW_SHOULD_CURRENT_ROUND_END()
|
|
|
|
IF NOT SCGW_ServerBD.bSuddenDeath
|
|
AND NATIVE_TO_INT(GET_NETWORK_TIME()) > SCGW_ServerBD.iStartTime + ciSCGW_MATCH_LENGTH
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SHOULD_CURRENT_ROUND_END - RETURNING TRUE - ROUND TIMER EXPIRED")
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
IF sSCGWData.iActivePlayers <= 1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SHOULD_CURRENT_ROUND_END - RETURNING TRUE - NOT ENOUGH PLAYERS LEFT")
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF IS_DEBUG_KEY_JUST_PRESSED(KEY_S, KEYBOARD_MODIFIER_NONE, "Host S Skip")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SHOULD_CURRENT_ROUND_END - RETURNING TRUE - HOST PRESSED S")
|
|
RETURN TRUE
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Returns whether or not the game should advance to another round
|
|
FUNC BOOL SCGW_SHOULD_CONTINUE_TO_NEXT_ROUND()
|
|
|
|
IF sSCGWData.iConnectedPlayers <= 1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SHOULD_CONTINUE_TO_NEXT_ROUND - Returning FALSE - Not enough players left to play")
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
IF SCGW_ServerBD.iCurrentRound >= SCGW_ServerBD.iNumRounds
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SHOULD_CONTINUE_TO_NEXT_ROUND - Returning FALSE - No more rounds to play")
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
INT iRequiredWins = FLOOR(TO_FLOAT(SCGW_ServerBD.iNumRounds) / 2.0)
|
|
IF SCGW_ServerBD.iCurrentRound > iRequiredWins
|
|
INT iPlayerLoop
|
|
FOR iPlayerLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
IF NOT NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iPlayerLoop))
|
|
AND NOT SCGW_Bot[iPlayerLoop].bActive
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[iPlayerLoop].iGang = ciSCGW_GANG_NONE
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_ServerBD.iRoundScores[SCGW_PlayerBD[iPlayerLoop].iGang] > iRequiredWins
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SHOULD_CONTINUE_TO_NEXT_ROUND - Returning FALSE gang: ", SCGW_PlayerBD[iPlayerLoop].iGang, " Has enough wins to win the game")
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDFOR
|
|
ENDIF
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SHOULD_CONTINUE_TO_NEXT_ROUND - Returning TRUE More rounds to play")
|
|
RETURN TRUE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Increments the win stat for the player's gang when they win
|
|
PROC SCGW_UPDATE_PLAYER_WINS()
|
|
|
|
INT iWins
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF sSCGWData.sDebug.bTriggerChallenges = TRUE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_WINS - bTriggerChallenges ON")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
SWITCH SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iGang
|
|
|
|
CASE ciSCGW_GANG_GREEN
|
|
iWins = GET_MP_INT_CHARACTER_STAT(MP_STAT_SCGW_NUM_WINS_GANG_0) + 1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_WINS - Updating wins as gang 0 to, ", iWins)
|
|
SET_MP_INT_CHARACTER_STAT(MP_STAT_SCGW_NUM_WINS_GANG_0, iWins)
|
|
IF iWins = g_sMPtunables.iVC_SCGW_WIN_CHALLENGE_REQUIREMENT
|
|
#IF IS_DEBUG_BUILD
|
|
OR sSCGWData.sDebug.bTriggerChallenges = TRUE
|
|
#ENDIF
|
|
SET_PACKED_STAT_BOOL(PACKED_MP_THE_HOODS, TRUE)
|
|
SET_REWARD_UNLOCKED(UNLOCKTYPEENUM_TATTOO, "CLO_VWM_D_1_3", "UNLOCK_NAME_SHIRT3","FeedhitTshirt04","MPTshirtAwards3" ,DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,TRUE)
|
|
SCGW_TRIGGER_HELP_TEXT_WITH_INT("SCGW_CH_0", g_sMPtunables.iVC_SCGW_WIN_CHALLENGE_REQUIREMENT, ciSCGW_DEFAULT_HELP_TEXT_TIME, TRUE)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_GANG_PURPLE
|
|
iWins = GET_MP_INT_CHARACTER_STAT(MP_STAT_SCGW_NUM_WINS_GANG_1) + 1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_WINS - Updating wins as gang 1 to, ", iWins)
|
|
SET_MP_INT_CHARACTER_STAT(MP_STAT_SCGW_NUM_WINS_GANG_1, iWins)
|
|
IF iWins = g_sMPtunables.iVC_SCGW_WIN_CHALLENGE_REQUIREMENT
|
|
#IF IS_DEBUG_BUILD
|
|
OR sSCGWData.sDebug.bTriggerChallenges = TRUE
|
|
#ENDIF
|
|
SET_PACKED_STAT_BOOL(PACKED_MP_THE_PUNKS, TRUE)
|
|
SET_REWARD_UNLOCKED(UNLOCKTYPEENUM_TATTOO, "CLO_VWM_D_1_4", "UNLOCK_NAME_SHIRT3","FeedhitTshirt04","MPTshirtAwards3" ,DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,TRUE)
|
|
SCGW_TRIGGER_HELP_TEXT_WITH_INT("SCGW_CH_1", g_sMPtunables.iVC_SCGW_WIN_CHALLENGE_REQUIREMENT, ciSCGW_DEFAULT_HELP_TEXT_TIME, TRUE)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_GANG_YELLOW
|
|
iWins = GET_MP_INT_CHARACTER_STAT(MP_STAT_SCGW_NUM_WINS_GANG_2) + 1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_WINS - Updating wins as gang 2 to, ", iWins)
|
|
SET_MP_INT_CHARACTER_STAT(MP_STAT_SCGW_NUM_WINS_GANG_2, iWins)
|
|
IF iWins = g_sMPtunables.iVC_SCGW_WIN_CHALLENGE_REQUIREMENT
|
|
#IF IS_DEBUG_BUILD
|
|
OR sSCGWData.sDebug.bTriggerChallenges = TRUE
|
|
#ENDIF
|
|
SET_PACKED_STAT_BOOL(PACKED_MP_THE_YOKELS, TRUE)
|
|
SET_REWARD_UNLOCKED(UNLOCKTYPEENUM_TATTOO, "CLO_VWM_D_1_5", "UNLOCK_NAME_SHIRT3","FeedhitTshirt04","MPTshirtAwards3" ,DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,TRUE)
|
|
SCGW_TRIGGER_HELP_TEXT_WITH_INT("SCGW_CH_2", g_sMPtunables.iVC_SCGW_WIN_CHALLENGE_REQUIREMENT, ciSCGW_DEFAULT_HELP_TEXT_TIME, TRUE)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_GANG_BLUE
|
|
iWins = GET_MP_INT_CHARACTER_STAT(MP_STAT_SCGW_NUM_WINS_GANG_3) + 1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_WINS - Updating wins as gang 3 to, ", iWins)
|
|
SET_MP_INT_CHARACTER_STAT(MP_STAT_SCGW_NUM_WINS_GANG_3, iWins)
|
|
IF iWins = g_sMPtunables.iVC_SCGW_WIN_CHALLENGE_REQUIREMENT
|
|
#IF IS_DEBUG_BUILD
|
|
OR sSCGWData.sDebug.bTriggerChallenges = TRUE
|
|
#ENDIF
|
|
SET_PACKED_STAT_BOOL(PACKED_MP_THE_BIKERS, TRUE)
|
|
SET_REWARD_UNLOCKED(UNLOCKTYPEENUM_TATTOO, "CLO_VWM_D_1_2", "UNLOCK_NAME_SHIRT3","FeedhitTshirt04","MPTshirtAwards3" ,DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,TRUE)
|
|
SCGW_TRIGGER_HELP_TEXT_WITH_INT("SCGW_CH_3", g_sMPtunables.iVC_SCGW_WIN_CHALLENGE_REQUIREMENT, ciSCGW_DEFAULT_HELP_TEXT_TIME, TRUE)
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
// ------------------------------ GRID OWNERSHIP ------------------------------
|
|
|
|
/// PURPOSE:
|
|
/// Returns the single int position of the building at iGridX, iGridY
|
|
FUNC INT SCGW_GET_BUILDING_CENTER(INT iGridX, INT iGridY)
|
|
|
|
RETURN SCGW_GET_POSITION_FROM_COORDS(1 + (iGridX * 2), 1 + (iGridY * 2))
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Returns the gang that owns the grid space iGridX, iGridY
|
|
/// Returns ciSCGW_GANG_NONE if no gang owns the grid space
|
|
FUNC INT SCGW_GET_GRID_BUILDING_GANG_OWNER(INT iGridX, INT iGridY)
|
|
|
|
INT iGridCenter = SCGW_GET_BUILDING_CENTER(iGridX, iGridY)
|
|
|
|
INT i
|
|
FOR i = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
|
|
IF NOT NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(i))
|
|
AND NOT SCGW_Bot[i].bActive
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[i].iGang = ciSCGW_GANG_NONE
|
|
RELOOP
|
|
ENDIF
|
|
|
|
//Top Row - Horizontal
|
|
IF NOT IS_LONG_BIT_SET(SCGW_ServerBD.iPositionOwnershipBS[SCGW_PlayerBD[i].iGang][ciSCGW_OWNERSHIP_LINK_RIGHT], iGridCenter - ciSCGW_MAX_PLAYER_POSITIONS_X - 1)
|
|
RELOOP
|
|
ENDIF
|
|
IF NOT IS_LONG_BIT_SET(SCGW_ServerBD.iPositionOwnershipBS[SCGW_PlayerBD[i].iGang][ciSCGW_OWNERSHIP_LINK_RIGHT], iGridCenter - ciSCGW_MAX_PLAYER_POSITIONS_X)
|
|
RELOOP
|
|
ENDIF
|
|
|
|
//Top Row - Vertical
|
|
IF NOT IS_LONG_BIT_SET(SCGW_ServerBD.iPositionOwnershipBS[SCGW_PlayerBD[i].iGang][ciSCGW_OWNERSHIP_LINK_DOWN], iGridCenter - ciSCGW_MAX_PLAYER_POSITIONS_X - 1)
|
|
RELOOP
|
|
ENDIF
|
|
IF NOT IS_LONG_BIT_SET(SCGW_ServerBD.iPositionOwnershipBS[SCGW_PlayerBD[i].iGang][ciSCGW_OWNERSHIP_LINK_DOWN], iGridCenter - ciSCGW_MAX_PLAYER_POSITIONS_X + 1)
|
|
RELOOP
|
|
ENDIF
|
|
|
|
//Middle Row - Vertical
|
|
IF NOT IS_LONG_BIT_SET(SCGW_ServerBD.iPositionOwnershipBS[SCGW_PlayerBD[i].iGang][ciSCGW_OWNERSHIP_LINK_DOWN], iGridCenter - 1)
|
|
RELOOP
|
|
ENDIF
|
|
IF NOT IS_LONG_BIT_SET(SCGW_ServerBD.iPositionOwnershipBS[SCGW_PlayerBD[i].iGang][ciSCGW_OWNERSHIP_LINK_DOWN], iGridCenter + 1)
|
|
RELOOP
|
|
ENDIF
|
|
|
|
//Bottom Row - Horizontal
|
|
IF NOT IS_LONG_BIT_SET(SCGW_ServerBD.iPositionOwnershipBS[SCGW_PlayerBD[i].iGang][ciSCGW_OWNERSHIP_LINK_RIGHT], iGridCenter + ciSCGW_MAX_PLAYER_POSITIONS_X - 1)
|
|
RELOOP
|
|
ENDIF
|
|
IF NOT IS_LONG_BIT_SET(SCGW_ServerBD.iPositionOwnershipBS[SCGW_PlayerBD[i].iGang][ciSCGW_OWNERSHIP_LINK_RIGHT], iGridCenter + ciSCGW_MAX_PLAYER_POSITIONS_X)
|
|
RELOOP
|
|
ENDIF
|
|
|
|
RETURN SCGW_PlayerBD[i].iGang
|
|
|
|
ENDFOR
|
|
|
|
RETURN ciSCGW_GANG_NONE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Marks the grid side as claimed by this gang
|
|
/// HOST ONLY
|
|
PROC SCGW_SET_GRID_SIDE_AS_CLAIMED_BY_GANG(INT iGridIndex, INT iSide, INT iGang)
|
|
|
|
IF !sSCGWData.sLocalPlayer.bIsHost
|
|
EXIT
|
|
ENDIF
|
|
|
|
INT i
|
|
|
|
FOR i = 0 TO ciSCGW_GANG_MAX - 1
|
|
IF i = iGang
|
|
//Set as claimed for the gang
|
|
IF NOT IS_LONG_BIT_SET(SCGW_ServerBD.iPositionOwnershipBS[i][iSide], iGridIndex)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SET_GRID_SIDE_AS_CLAIMED_BY_GANG - Setting grid index: ", iGridIndex, "'s side: ", iSide, " as claimed by gang: ", i)
|
|
SET_LONG_BIT(SCGW_ServerBD.iPositionOwnershipBS[i][iSide], iGridIndex)
|
|
ENDIF
|
|
ELSE
|
|
//Set all other gangs as unclaimed
|
|
IF IS_LONG_BIT_SET(SCGW_ServerBD.iPositionOwnershipBS[i][iSide], iGridIndex)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SET_GRID_SIDE_AS_CLAIMED_BY_GANG - Setting grid index: ", iGridIndex, "'s side: ", iSide, " as no longer claimed by gang: ", i)
|
|
CLEAR_LONG_BIT(SCGW_ServerBD.iPositionOwnershipBS[i][iSide], iGridIndex)
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Maintains the gang ownership of the territories and updates scores
|
|
/// HOST ONLY
|
|
PROC SCGW_PROCESS_SERVER_BUILDING_OWNERSHIP()
|
|
|
|
IF !sSCGWData.sLocalPlayer.bIsHost
|
|
EXIT
|
|
ENDIF
|
|
|
|
INT iNewScores[ciSCGW_MAX_PLAYERS]
|
|
|
|
INT i, j
|
|
FOR i = 0 TO ciSCGW_MAX_GRID_POSITIONS_X - 1
|
|
FOR j = 0 TO ciSCGW_MAX_GRID_POSITIONS_Y - 1
|
|
INT iGangOwner = SCGW_GET_GRID_BUILDING_GANG_OWNER(i, j)
|
|
IF SCGW_ServerBD.iGridGangOwnership[i][j] != iGangOwner
|
|
SCGW_ServerBD.iGridGangOwnership[i][j] = iGangOwner
|
|
ENDIF
|
|
IF iGangOwner != ciSCGW_GANG_NONE
|
|
iNewScores[iGangOwner]++
|
|
ENDIF
|
|
ENDFOR
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO ciSCGW_GANG_MAX - 1
|
|
IF SCGW_UF_ServerBD.iCurrentScore[i] != iNewScores[i]
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] - SCGW_PROCESS_SERVER_BUILDING_OWNERSHIP - Gang ", i, "'s Score updated from ", SCGW_UF_ServerBD.iCurrentScore[i], " to ", iNewScores[i])
|
|
SCGW_UF_ServerBD.iCurrentScore[i] = iNewScores[i]
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
// ------------------------------ INPUT PROCESSING ------------------------------
|
|
|
|
/// PURPOSE:
|
|
/// Returns true if no input processing should be done this frame
|
|
FUNC BOOL SCGW_IS_INPUT_DISABLED_THIS_FRAME()
|
|
|
|
IF IS_PAUSE_MENU_ACTIVE()
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].eCurrentPlayerState != SCGW_PLAYER_STATE_ALIVE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SCGW_IS_INPUT_DISABLED_THIS_FRAME_BOT(INT iBot)
|
|
|
|
IF IS_PAUSE_MENU_ACTIVE()
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
IF SCGW_Bot[iBot].SCGW_player.eCurrentPlayerState != SCGW_PLAYER_STATE_ALIVE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC INT SCGW_GET_FIRST_INPUT_FOR_GANG(INT iGang)
|
|
|
|
SWITCH iGang
|
|
CASE ciSCGW_GANG_GREEN RETURN ciSCGW_INPUT_MOVE_RIGHT
|
|
CASE ciSCGW_GANG_PURPLE RETURN ciSCGW_INPUT_MOVE_LEFT
|
|
CASE ciSCGW_GANG_YELLOW RETURN ciSCGW_INPUT_MOVE_RIGHT
|
|
CASE ciSCGW_GANG_BLUE RETURN ciSCGW_INPUT_MOVE_LEFT
|
|
ENDSWITCH
|
|
|
|
RETURN ciSCGW_INPUT_NONE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Returns the movement input pressed this frame if any
|
|
FUNC INT SCGW_GET_MOVE_INPUT()
|
|
|
|
IF SCGW_IS_INPUT_DISABLED_THIS_FRAME()
|
|
RETURN ciSCGW_INPUT_NONE
|
|
ENDIF
|
|
|
|
IF NOT IS_BIT_SET(sSCGWData.iLocalBS, ciSCGW_LOCALBS_FIRST_MOVE_DONE)
|
|
RETURN SCGW_GET_FIRST_INPUT_FOR_GANG(SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iGang)
|
|
ENDIF
|
|
|
|
CONTROL_ACTION CA_MoveUp = MAX_INPUTS
|
|
CONTROL_ACTION CA_MoveDown = MAX_INPUTS
|
|
CONTROL_ACTION CA_MoveLeft = MAX_INPUTS
|
|
CONTROL_ACTION CA_MoveRight = MAX_INPUTS
|
|
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
CA_MoveUp = MAX_INPUTS
|
|
CA_MoveDown = MAX_INPUTS
|
|
CA_MoveLeft = MAX_INPUTS
|
|
CA_MoveRight = MAX_INPUTS
|
|
ENDIF
|
|
|
|
FLOAT fLeftStickY = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_Y)
|
|
|
|
IF fLeftStickY < -cfSTICK_THRESHOLD
|
|
OR (CA_MoveUp != MAX_INPUTS AND IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, CA_MoveUp))
|
|
RETURN ciSCGW_INPUT_MOVE_UP
|
|
ENDIF
|
|
|
|
IF fLeftStickY > cfSTICK_THRESHOLD
|
|
OR (CA_MoveDown != MAX_INPUTS AND IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, CA_MoveDown))
|
|
RETURN ciSCGW_INPUT_MOVE_DOWN
|
|
ENDIF
|
|
|
|
FLOAT fLeftStickX = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_X)
|
|
|
|
IF fLeftStickX < -cfSTICK_THRESHOLD
|
|
OR (CA_MoveLeft != MAX_INPUTS AND IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, CA_MoveLeft))
|
|
RETURN ciSCGW_INPUT_MOVE_LEFT
|
|
ENDIF
|
|
|
|
IF fLeftStickX > cfSTICK_THRESHOLD
|
|
OR (CA_MoveRight != MAX_INPUTS AND IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, CA_MoveRight))
|
|
RETURN ciSCGW_INPUT_MOVE_RIGHT
|
|
ENDIF
|
|
|
|
RETURN ciSCGW_INPUT_NONE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SCGW_IS_VALID_MOVEMENT(INT iMoveInputThisFrame, INT iCurrentPlayerX, INT iCurrentPlayerY)
|
|
BOOL bValidMovement = FALSE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_INPUT_BOT - iMoveInputThisFrame ",iMoveInputThisFrame)
|
|
SWITCH iMoveInputThisFrame
|
|
|
|
CASE ciSCGW_INPUT_MOVE_UP
|
|
bValidMovement = iCurrentPlayerY > 0 AND iCurrentPlayerX % 2 = 0
|
|
BREAK
|
|
|
|
CASE ciSCGW_INPUT_MOVE_DOWN
|
|
bValidMovement = iCurrentPlayerY < ciSCGW_MAX_PLAYER_POSITIONS_Y - 1 AND iCurrentPlayerX % 2 = 0
|
|
BREAK
|
|
|
|
CASE ciSCGW_INPUT_MOVE_LEFT
|
|
bValidMovement = iCurrentPlayerX > 0 AND iCurrentPlayerY % 2 = 0
|
|
BREAK
|
|
|
|
CASE ciSCGW_INPUT_MOVE_RIGHT
|
|
bValidMovement = iCurrentPlayerX < ciSCGW_MAX_PLAYER_POSITIONS_X - 1 AND iCurrentPlayerY % 2 = 0
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
RETURN bValidMovement
|
|
ENDFUNC
|
|
|
|
FUNC INT SCGW_BEST_MOVE_TO_TARGET(INT iPosX,INT iPosY,INT iTargetPosX,INT iTargetPosY)
|
|
INT iMoveX = iTargetPosX - iPosX
|
|
INT iMoveY = iTargetPosY - iPosY
|
|
IF iTargetPosX < 0 OR iTargetPosX > ciSCGW_MAX_PLAYER_POSITIONS_X
|
|
OR iTargetPosY < 0 OR iTargetPosY > ciSCGW_MAX_PLAYER_POSITIONS_Y
|
|
OR iMoveX = 0 AND iMoveY = 0
|
|
RETURN ciSCGW_INPUT_NONE
|
|
ENDIF
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_BEST_MOVE_TO_TARGET - iMoveX = iTargetPosX - iPosX ---- ",iMoveX," = ",iTargetPosX," - ",iPosX)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_BEST_MOVE_TO_TARGET - iMoveY = iTargetPosY - iPosY ---- ",iMoveY," = ",iTargetPosY," - ",iPosY)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_BEST_MOVE_TO_TARGET - SCGW_IS_VALID_MOVEMENT(ciSCGW_INPUT_MOVE_DOWN, iPosX, iPosY) ",SCGW_IS_VALID_MOVEMENT(ciSCGW_INPUT_MOVE_DOWN, iPosX, iPosY))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_BEST_MOVE_TO_TARGET - SCGW_IS_VALID_MOVEMENT(ciSCGW_INPUT_MOVE_UP, iPosX, iPosY) ",SCGW_IS_VALID_MOVEMENT(ciSCGW_INPUT_MOVE_UP, iPosX, iPosY))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_BEST_MOVE_TO_TARGET - SCGW_IS_VALID_MOVEMENT(ciSCGW_INPUT_MOVE_RIGHT, iPosX, iPosY) ",SCGW_IS_VALID_MOVEMENT(ciSCGW_INPUT_MOVE_RIGHT, iPosX, iPosY))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_BEST_MOVE_TO_TARGET - SCGW_IS_VALID_MOVEMENT(ciSCGW_INPUT_MOVE_LEFT, iPosX, iPosY) ",SCGW_IS_VALID_MOVEMENT(ciSCGW_INPUT_MOVE_LEFT, iPosX, iPosY))
|
|
|
|
INT hMove
|
|
INT vMove
|
|
IF iMoveY < 0
|
|
vMove = ciSCGW_INPUT_MOVE_UP
|
|
ELSE
|
|
vMove = ciSCGW_INPUT_MOVE_DOWN
|
|
ENDIF
|
|
IF iMoveX < 0
|
|
hMove = ciSCGW_INPUT_MOVE_LEFT
|
|
ELSE
|
|
hMove = ciSCGW_INPUT_MOVE_RIGHT
|
|
ENDIF
|
|
IF ABSI(iMoveX) < ABSI(iMoveY)
|
|
IF iPosX % 2 = 0
|
|
RETURN vMove
|
|
ELSE
|
|
RETURN hMove
|
|
ENDIF
|
|
ELSE
|
|
IF iPosY % 2 = 0
|
|
RETURN hMove
|
|
ELSE
|
|
RETURN vMove
|
|
ENDIF
|
|
ENDIF
|
|
RETURN ciSCGW_INPUT_NONE
|
|
ENDFUNC
|
|
|
|
FUNC INT SCGW_GET_MOVE_INPUT_BOT(INT iBot)
|
|
|
|
IF SCGW_IS_INPUT_DISABLED_THIS_FRAME_BOT(iBot)
|
|
RETURN ciSCGW_INPUT_NONE
|
|
ENDIF
|
|
|
|
IF NOT IS_BIT_SET(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_FIRST_MOVE_DONE)
|
|
RETURN SCGW_GET_FIRST_INPUT_FOR_GANG(SCGW_Bot[iBot].SCGW_player.iGang)
|
|
ENDIF
|
|
|
|
INT iTargetPosX = SCGW_Bot[iBot].iTargetPosX
|
|
INT iTargetPosY = SCGW_Bot[iBot].iTargetPosY
|
|
INT iPosX
|
|
INT iPosY
|
|
SCGW_GET_POSITION_COORDS(SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition,iPosX,iPosY)
|
|
INT iBestMove = SCGW_BEST_MOVE_TO_TARGET(iPosX, iPosY, iTargetPosX, iTargetPosY)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_GET_MOVE_INPUT_BOT - iBot ",iBot," SCGW_BEST_MOVE_TO_TARGET(",iPosX,", ",iPosY,", ",iTargetPosX,", ",iTargetPosY,") ",iBestMove )
|
|
|
|
RETURN iBestMove
|
|
|
|
RETURN ciSCGW_INPUT_NONE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Returns the turning input pressed this frame if any
|
|
FUNC INT SCGW_GET_TURN_INPUT()
|
|
|
|
IF SCGW_IS_INPUT_DISABLED_THIS_FRAME()
|
|
RETURN ciSCGW_INPUT_NONE
|
|
ENDIF
|
|
|
|
CONTROL_ACTION CA_TurnUp = MAX_INPUTS
|
|
CONTROL_ACTION CA_TurnDown = MAX_INPUTS
|
|
CONTROL_ACTION CA_TurnLeft = MAX_INPUTS
|
|
CONTROL_ACTION CA_TurnRight = MAX_INPUTS
|
|
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
CA_TurnUp = INPUT_FRONTEND_UP
|
|
CA_TurnDown = INPUT_FRONTEND_DOWN
|
|
CA_TurnLeft = INPUT_FRONTEND_LEFT
|
|
CA_TurnRight = INPUT_FRONTEND_RIGHT
|
|
ENDIF
|
|
|
|
FLOAT fRightStickY = 0
|
|
IF NOT IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
fRightStickY = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_Y)
|
|
ENDIF
|
|
|
|
IF fRightStickY < -cfSTICK_THRESHOLD
|
|
OR (CA_TurnUp != MAX_INPUTS AND IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, CA_TurnUp))
|
|
RETURN ciSCGW_INPUT_TURN_UP
|
|
ENDIF
|
|
|
|
IF fRightStickY > cfSTICK_THRESHOLD
|
|
OR (CA_TurnDown != MAX_INPUTS AND IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, CA_TurnDown))
|
|
RETURN ciSCGW_INPUT_TURN_DOWN
|
|
ENDIF
|
|
|
|
FLOAT fRightStickX = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_X)
|
|
|
|
IF fRightStickX < -cfSTICK_THRESHOLD
|
|
OR (CA_TurnLeft != MAX_INPUTS AND IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, CA_TurnLeft))
|
|
RETURN ciSCGW_INPUT_TURN_LEFT
|
|
ENDIF
|
|
|
|
IF fRightStickX > cfSTICK_THRESHOLD
|
|
OR (CA_TurnRight != MAX_INPUTS AND IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, CA_TurnRight))
|
|
RETURN ciSCGW_INPUT_TURN_RIGHT
|
|
ENDIF
|
|
|
|
RETURN ciSCGW_INPUT_NONE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC INT SCGW_GET_TURN_INPUT_BOT(INT iBot)
|
|
|
|
IF SCGW_IS_INPUT_DISABLED_THIS_FRAME_BOT(iBot)
|
|
RETURN ciSCGW_INPUT_NONE
|
|
ENDIF
|
|
|
|
RETURN SCGW_Bot[iBot].iFaceDirection
|
|
|
|
ENDFUNC
|
|
/// PURPOSE:
|
|
/// Returns the shooting input pressed this frame if any
|
|
FUNC INT SCGW_GET_SHOOT_INPUT()
|
|
|
|
IF SCGW_IS_INPUT_DISABLED_THIS_FRAME()
|
|
RETURN ciSCGW_INPUT_NONE
|
|
ENDIF
|
|
|
|
CONTROL_ACTION CA_Shoot = INPUT_SCRIPT_RT
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
CA_Shoot = INPUT_FRONTEND_X
|
|
ENDIF
|
|
|
|
IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, CA_Shoot)
|
|
RETURN ciSCGW_INPUT_SHOOT
|
|
ENDIF
|
|
|
|
RETURN ciSCGW_INPUT_NONE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC INT SCGW_GET_SHOOT_INPUT_BOT(INT iBot)
|
|
|
|
IF SCGW_IS_INPUT_DISABLED_THIS_FRAME_BOT(iBot)
|
|
RETURN ciSCGW_INPUT_NONE
|
|
ENDIF
|
|
|
|
// CONTROL_ACTION CA_Shoot = INPUT_SCRIPT_RT
|
|
// IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
// CA_Shoot = INPUT_FRONTEND_X
|
|
// ENDIF
|
|
//
|
|
IF SCGW_Bot[iBot].bShouldShoot
|
|
RETURN ciSCGW_INPUT_SHOOT
|
|
ENDIF
|
|
|
|
RETURN ciSCGW_INPUT_NONE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Returns true if the player can shoot in iDirection with no immediate obstructions (screen edges and buildings)
|
|
FUNC BOOL SCGW_CAN_PLAYER_SHOOT_THIS_DIRECTION(INT iDirection)
|
|
|
|
VECTOR_2D vMax = SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_GET_POSITION_FROM_COORDS(ciSCGW_MAX_PLAYER_POSITIONS_X - 1, ciSCGW_MAX_PLAYER_POSITIONS_Y - 1))
|
|
VECTOR_2D vMin = SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_GET_POSITION_FROM_COORDS(0, 0))
|
|
|
|
//Map Bounds
|
|
SWITCH iDirection
|
|
|
|
CASE ciSCGW_GRID_DIRECTION_UP
|
|
IF IS_FLOAT_IN_RANGE(sSCGWData.sPlayers[sSCGWData.sLocalPlayer.iLocalPart].vActualPlayerPosition.y,
|
|
vMin.y - cfARCADE_MINIGAME_FLOAT_TOLERANCE,
|
|
vMin.y + cfARCADE_MINIGAME_FLOAT_TOLERANCE)
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_GRID_DIRECTION_DOWN
|
|
IF IS_FLOAT_IN_RANGE(sSCGWData.sPlayers[sSCGWData.sLocalPlayer.iLocalPart].vActualPlayerPosition.y,
|
|
vMax.y - cfARCADE_MINIGAME_FLOAT_TOLERANCE,
|
|
vMax.y + cfARCADE_MINIGAME_FLOAT_TOLERANCE)
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_GRID_DIRECTION_LEFT
|
|
IF IS_FLOAT_IN_RANGE(sSCGWData.sPlayers[sSCGWData.sLocalPlayer.iLocalPart].vActualPlayerPosition.x,
|
|
vMin.x - cfARCADE_MINIGAME_FLOAT_TOLERANCE,
|
|
vMin.x + cfARCADE_MINIGAME_FLOAT_TOLERANCE)
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_GRID_DIRECTION_RIGHT
|
|
IF IS_FLOAT_IN_RANGE(sSCGWData.sPlayers[sSCGWData.sLocalPlayer.iLocalPart].vActualPlayerPosition.x,
|
|
vMax.x - cfARCADE_MINIGAME_FLOAT_TOLERANCE,
|
|
vMax.x + cfARCADE_MINIGAME_FLOAT_TOLERANCE)
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
INT iCurrentPlayerX, iCurrentPlayerY, iPreviousPlayerX, iPreviousPlayerY
|
|
SCGW_GET_POSITION_COORDS(SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iPlayerPosition, iCurrentPlayerX, iCurrentPlayerY)
|
|
SCGW_GET_POSITION_COORDS(SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iPreviousPlayerPosition, iPreviousPlayerX, iPreviousPlayerY)
|
|
|
|
//While Moving
|
|
IF SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastMovementTime + SCGW_GET_PLAYER_MOVEMENT_TIME(sSCGWData.sLocalPlayer.iLocalPart) > NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
IF iCurrentPlayerY != iPreviousPlayerY
|
|
//Vertical Movement
|
|
IF iDirection = ciSCGW_GRID_DIRECTION_LEFT
|
|
OR iDirection = ciSCGW_GRID_DIRECTION_RIGHT
|
|
RETURN FALSE
|
|
ENDIF
|
|
ELIF iCurrentPlayerX != iPreviousPlayerX
|
|
//Horizontal Movement
|
|
IF iDirection = ciSCGW_GRID_DIRECTION_UP
|
|
OR iDirection = ciSCGW_GRID_DIRECTION_DOWN
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SCGW_CAN_PLAYER_SHOOT_THIS_DIRECTION_BOT(INT iBot, INT iDirection)
|
|
|
|
VECTOR_2D vMax = SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_GET_POSITION_FROM_COORDS(ciSCGW_MAX_PLAYER_POSITIONS_X - 1, ciSCGW_MAX_PLAYER_POSITIONS_Y - 1))
|
|
VECTOR_2D vMin = SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_GET_POSITION_FROM_COORDS(0, 0))
|
|
|
|
//Map Bounds
|
|
SWITCH iDirection
|
|
|
|
CASE ciSCGW_GRID_DIRECTION_UP
|
|
IF IS_FLOAT_IN_RANGE(sSCGWData.sPlayers[iBot].vActualPlayerPosition.y,
|
|
vMin.y - cfARCADE_MINIGAME_FLOAT_TOLERANCE,
|
|
vMin.y + cfARCADE_MINIGAME_FLOAT_TOLERANCE)
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_GRID_DIRECTION_DOWN
|
|
IF IS_FLOAT_IN_RANGE(sSCGWData.sPlayers[iBot].vActualPlayerPosition.y,
|
|
vMax.y - cfARCADE_MINIGAME_FLOAT_TOLERANCE,
|
|
vMax.y + cfARCADE_MINIGAME_FLOAT_TOLERANCE)
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_GRID_DIRECTION_LEFT
|
|
IF IS_FLOAT_IN_RANGE(sSCGWData.sPlayers[iBot].vActualPlayerPosition.x,
|
|
vMin.x - cfARCADE_MINIGAME_FLOAT_TOLERANCE,
|
|
vMin.x + cfARCADE_MINIGAME_FLOAT_TOLERANCE)
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_GRID_DIRECTION_RIGHT
|
|
IF IS_FLOAT_IN_RANGE(sSCGWData.sPlayers[iBot].vActualPlayerPosition.x,
|
|
vMax.x - cfARCADE_MINIGAME_FLOAT_TOLERANCE,
|
|
vMax.x + cfARCADE_MINIGAME_FLOAT_TOLERANCE)
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
INT iCurrentPlayerX, iCurrentPlayerY, iPreviousPlayerX, iPreviousPlayerY
|
|
SCGW_GET_POSITION_COORDS(SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition, iCurrentPlayerX, iCurrentPlayerY)
|
|
SCGW_GET_POSITION_COORDS(SCGW_Bot[iBot].SCGW_UF_Player.iPreviousPlayerPosition, iPreviousPlayerX, iPreviousPlayerY)
|
|
|
|
//While Moving
|
|
IF SCGW_Bot[iBot].SCGW_UF_Player.iLastMovementTime + SCGW_GET_PLAYER_MOVEMENT_TIME(iBot) > NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
IF iCurrentPlayerY != iPreviousPlayerY
|
|
//Vertical Movement
|
|
IF iDirection = ciSCGW_GRID_DIRECTION_LEFT
|
|
OR iDirection = ciSCGW_GRID_DIRECTION_RIGHT
|
|
RETURN FALSE
|
|
ENDIF
|
|
ELIF iCurrentPlayerX != iPreviousPlayerX
|
|
//Horizontal Movement
|
|
IF iDirection = ciSCGW_GRID_DIRECTION_UP
|
|
OR iDirection = ciSCGW_GRID_DIRECTION_DOWN
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Returns true if the player can turn towards iTurnInput
|
|
/// False if turning would face a building
|
|
FUNC BOOL SCGW_CAN_PLAYER_TURN_THIS_DIRECTION(INT iParticipant, INT iTurnInput)
|
|
|
|
INT iCurrentPlayerX, iCurrentPlayerY, iPreviousPlayerX, iPreviousPlayerY
|
|
SCGW_GET_POSITION_COORDS(SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iPlayerPosition, iCurrentPlayerX, iCurrentPlayerY)
|
|
SCGW_GET_POSITION_COORDS(SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iPreviousPlayerPosition, iPreviousPlayerX, iPreviousPlayerY)
|
|
|
|
//Mid Grid
|
|
SWITCH iTurnInput
|
|
|
|
CASE ciSCGW_INPUT_TURN_UP
|
|
CASE ciSCGW_INPUT_TURN_DOWN
|
|
IF iCurrentPlayerX % 2 != 0
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_INPUT_TURN_LEFT
|
|
CASE ciSCGW_INPUT_TURN_RIGHT
|
|
IF iCurrentPlayerY % 2 != 0
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
//While Moving
|
|
IF SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastMovementTime + SCGW_GET_PLAYER_MOVEMENT_TIME(iParticipant) > NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
IF iCurrentPlayerY != iPreviousPlayerY
|
|
//Vertical Movement
|
|
IF iTurnInput = ciSCGW_INPUT_TURN_LEFT
|
|
OR iTurnInput = ciSCGW_INPUT_TURN_RIGHT
|
|
RETURN FALSE
|
|
ENDIF
|
|
ELIF iCurrentPlayerX != iPreviousPlayerX
|
|
//Horizontal Movement
|
|
IF iTurnInput = ciSCGW_INPUT_TURN_UP
|
|
OR iTurnInput = ciSCGW_INPUT_TURN_DOWN
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SCGW_CAN_PLAYER_TURN_THIS_DIRECTION_BOT(INT iBot, INT iTurnInput)
|
|
|
|
INT iCurrentPlayerX, iCurrentPlayerY, iPreviousPlayerX, iPreviousPlayerY
|
|
SCGW_GET_POSITION_COORDS(SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition, iCurrentPlayerX, iCurrentPlayerY)
|
|
SCGW_GET_POSITION_COORDS(SCGW_Bot[iBot].SCGW_UF_Player.iPreviousPlayerPosition, iPreviousPlayerX, iPreviousPlayerY)
|
|
|
|
//Mid Grid
|
|
SWITCH iTurnInput
|
|
|
|
CASE ciSCGW_INPUT_TURN_UP
|
|
CASE ciSCGW_INPUT_TURN_DOWN
|
|
IF iCurrentPlayerX % 2 != 0
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_INPUT_TURN_LEFT
|
|
CASE ciSCGW_INPUT_TURN_RIGHT
|
|
IF iCurrentPlayerY % 2 != 0
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
//While Moving
|
|
IF SCGW_Bot[iBot].SCGW_UF_Player.iLastMovementTime + SCGW_GET_PLAYER_MOVEMENT_TIME(sSCGWData.sLocalPlayer.iLocalPart) > NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
IF iCurrentPlayerY != iPreviousPlayerY
|
|
//Vertical Movement
|
|
IF iTurnInput = ciSCGW_INPUT_TURN_LEFT
|
|
OR iTurnInput = ciSCGW_INPUT_TURN_RIGHT
|
|
RETURN FALSE
|
|
ENDIF
|
|
ELIF iCurrentPlayerX != iPreviousPlayerX
|
|
//Horizontal Movement
|
|
IF iTurnInput = ciSCGW_INPUT_TURN_UP
|
|
OR iTurnInput = ciSCGW_INPUT_TURN_DOWN
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Processes moving the local player based on their input
|
|
PROC SCGW_PROCESS_MOVEMENT_INPUT()
|
|
|
|
INT iMoveInputThisFrame = SCGW_GET_MOVE_INPUT()
|
|
BOOL bDirectionChange = FALSE
|
|
|
|
IF NOT (SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastMovementTime + SCGW_GET_PLAYER_MOVEMENT_TIME(sSCGWData.sLocalPlayer.iLocalPart) < NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
AND IS_BIT_SET(sSCGWData.iLocalBS, ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED))
|
|
AND NATIVE_TO_INT(GET_NETWORK_TIME()) < SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastMovementTime + ciSCGW_PLAYER_CHANGE_DIRECTION_TIME
|
|
AND SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastMovementDirection != iMoveInputThisFrame
|
|
AND NOT IS_BIT_SET(sSCGWData.iLocalBS, ciSCGW_LOCALBS_CURRENT_MOVE_DIRECTION_CHANGED)
|
|
bDirectionChange = TRUE
|
|
ENDIF
|
|
|
|
INT iCurrentPlayerX, iCurrentPlayerY, iPreviousPlayerX, iPreviousPlayerY
|
|
IF bDirectionChange
|
|
SCGW_GET_POSITION_COORDS(SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iPreviousPlayerPosition, iCurrentPlayerX, iCurrentPlayerY)
|
|
SCGW_GET_POSITION_COORDS(SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iPreviousPlayerPosition, iPreviousPlayerX, iPreviousPlayerY)
|
|
ELSE
|
|
SCGW_GET_POSITION_COORDS(SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iPlayerPosition, iCurrentPlayerX, iCurrentPlayerY)
|
|
SCGW_GET_POSITION_COORDS(SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iPreviousPlayerPosition, iPreviousPlayerX, iPreviousPlayerY)
|
|
ENDIF
|
|
|
|
BOOL bValidMovement = FALSE
|
|
INT iPositionChangeY = 0
|
|
INT iPositionChangeX = 0
|
|
|
|
SWITCH iMoveInputThisFrame
|
|
|
|
CASE ciSCGW_INPUT_MOVE_UP
|
|
bValidMovement = iCurrentPlayerY > 0 AND iCurrentPlayerX % 2 = 0
|
|
iPositionChangeY = -1
|
|
BREAK
|
|
|
|
CASE ciSCGW_INPUT_MOVE_DOWN
|
|
bValidMovement = iCurrentPlayerY < ciSCGW_MAX_PLAYER_POSITIONS_Y - 1 AND iCurrentPlayerX % 2 = 0
|
|
iPositionChangeY = 1
|
|
BREAK
|
|
|
|
CASE ciSCGW_INPUT_MOVE_LEFT
|
|
bValidMovement = iCurrentPlayerX > 0 AND iCurrentPlayerY % 2 = 0
|
|
iPositionChangeX = -1
|
|
BREAK
|
|
|
|
CASE ciSCGW_INPUT_MOVE_RIGHT
|
|
bValidMovement = iCurrentPlayerX < ciSCGW_MAX_PLAYER_POSITIONS_X - 1 AND iCurrentPlayerY % 2 = 0
|
|
iPositionChangeX = 1
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF bValidMovement
|
|
|
|
IF (SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastMovementTime + SCGW_GET_PLAYER_MOVEMENT_TIME(sSCGWData.sLocalPlayer.iLocalPart) < NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
AND IS_BIT_SET(sSCGWData.iLocalBS, ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED))
|
|
OR bDirectionChange
|
|
|
|
IF bDirectionChange
|
|
OR (NOT IS_BIT_SET(sSCGWData.iLocalBS, ciSCGW_LOCALBS_FIRST_MOVE_DONE))
|
|
SET_BIT(sSCGWData.iLocalBS, ciSCGW_LOCALBS_CURRENT_MOVE_DIRECTION_CHANGED)
|
|
ENDIF
|
|
|
|
IF iPreviousPlayerX != iCurrentPlayerX
|
|
iPreviousPlayerX = iCurrentPlayerX
|
|
ENDIF
|
|
|
|
IF iPreviousPlayerY != iCurrentPlayerY
|
|
iPreviousPlayerY = iCurrentPlayerY
|
|
ENDIF
|
|
|
|
IF (iPositionChangeX != 0)
|
|
iCurrentPlayerX += iPositionChangeX
|
|
ENDIF
|
|
|
|
IF (iPositionChangeY != 0)
|
|
iCurrentPlayerY += iPositionChangeY
|
|
ENDIF
|
|
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iPlayerPosition = SCGW_GET_POSITION_FROM_COORDS(iCurrentPlayerX, iCurrentPlayerY)
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iPreviousPlayerPosition = SCGW_GET_POSITION_FROM_COORDS(iPreviousPlayerX, iPreviousPlayerY)
|
|
|
|
IF sSCGWData.sLocalPlayer.iSpeedBoostRemainingMoves > 0
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].fMoveSpeed = cfSCGW_BOOST_SPEED
|
|
sSCGWData.sLocalPlayer.iSpeedBoostRemainingMoves--
|
|
ELIF NOT IS_FLOAT_IN_RANGE(SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].fMoveSpeed, cfSCGW_BASE_SPEED - cfARCADE_MINIGAME_FLOAT_TOLERANCE, cfSCGW_BASE_SPEED + cfARCADE_MINIGAME_FLOAT_TOLERANCE)
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].fMoveSpeed = cfSCGW_BASE_SPEED
|
|
ENDIF
|
|
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastMovementTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
|
|
IF iPositionChangeX > 0
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iFacingDirection = ciSCGW_GRID_DIRECTION_RIGHT
|
|
ELIF iPositionChangeX < 0
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iFacingDirection = ciSCGW_GRID_DIRECTION_LEFT
|
|
ELIF iPositionChangeY < 0
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iFacingDirection = ciSCGW_GRID_DIRECTION_UP
|
|
ELIF iPositionChangeY > 0
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iFacingDirection = ciSCGW_GRID_DIRECTION_DOWN
|
|
ENDIF
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_INPUT - MOVING - iPositionChangeX = ", iPositionChangeX, " iPositionChangeY = ", iPositionChangeY, " iPlayerPosition = (", SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iPlayerPosition,")" )
|
|
CLEAR_BIT(sSCGWData.iLocalBS, ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED)
|
|
CLEAR_BIT(sSCGWData.iLocalBS, ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED_HALF)
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastMovementDirection = iMoveInputThisFrame
|
|
|
|
IF NOT IS_BIT_SET(sSCGWData.iLocalBS, ciSCGW_LOCALBS_FIRST_MOVE_DONE)
|
|
SET_BIT(sSCGWData.iLocalBS, ciSCGW_LOCALBS_FIRST_MOVE_DONE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_MOVEMENT_INPUT_BOT(INT iBot)
|
|
|
|
INT iMoveInputThisFrame = SCGW_GET_MOVE_INPUT_BOT(iBot)
|
|
BOOL bDirectionChange = FALSE
|
|
|
|
IF NOT (SCGW_Bot[iBot].SCGW_UF_Player.iLastMovementTime + SCGW_GET_PLAYER_MOVEMENT_TIME(sSCGWData.sLocalPlayer.iLocalPart) < NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
AND IS_BIT_SET(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED))
|
|
AND NATIVE_TO_INT(GET_NETWORK_TIME()) < SCGW_Bot[iBot].SCGW_UF_Player.iLastMovementTime + ciSCGW_PLAYER_CHANGE_DIRECTION_TIME
|
|
AND SCGW_Bot[iBot].SCGW_UF_Player.iLastMovementDirection != iMoveInputThisFrame
|
|
AND NOT IS_BIT_SET(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_CURRENT_MOVE_DIRECTION_CHANGED)
|
|
bDirectionChange = TRUE
|
|
ENDIF
|
|
|
|
INT iCurrentPlayerX, iCurrentPlayerY, iPreviousPlayerX, iPreviousPlayerY
|
|
IF bDirectionChange
|
|
SCGW_GET_POSITION_COORDS(SCGW_Bot[iBot].SCGW_UF_Player.iPreviousPlayerPosition, iCurrentPlayerX, iCurrentPlayerY)
|
|
SCGW_GET_POSITION_COORDS(SCGW_Bot[iBot].SCGW_UF_Player.iPreviousPlayerPosition, iPreviousPlayerX, iPreviousPlayerY)
|
|
ELSE
|
|
SCGW_GET_POSITION_COORDS(SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition, iCurrentPlayerX, iCurrentPlayerY)
|
|
SCGW_GET_POSITION_COORDS(SCGW_Bot[iBot].SCGW_UF_Player.iPreviousPlayerPosition, iPreviousPlayerX, iPreviousPlayerY)
|
|
ENDIF
|
|
|
|
BOOL bValidMovement = FALSE
|
|
INT iPositionChangeY = 0
|
|
INT iPositionChangeX = 0
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_INPUT_BOT - iBot ",iBot," iMoveInputThisFrame ",iMoveInputThisFrame)
|
|
SWITCH iMoveInputThisFrame
|
|
|
|
CASE ciSCGW_INPUT_MOVE_UP
|
|
bValidMovement = iCurrentPlayerY > 0 AND iCurrentPlayerX % 2 = 0
|
|
iPositionChangeY = -1
|
|
BREAK
|
|
|
|
CASE ciSCGW_INPUT_MOVE_DOWN
|
|
bValidMovement = iCurrentPlayerY < ciSCGW_MAX_PLAYER_POSITIONS_Y - 1 AND iCurrentPlayerX % 2 = 0
|
|
iPositionChangeY = 1
|
|
BREAK
|
|
|
|
CASE ciSCGW_INPUT_MOVE_LEFT
|
|
bValidMovement = iCurrentPlayerX > 0 AND iCurrentPlayerY % 2 = 0
|
|
iPositionChangeX = -1
|
|
BREAK
|
|
|
|
CASE ciSCGW_INPUT_MOVE_RIGHT
|
|
bValidMovement = iCurrentPlayerX < ciSCGW_MAX_PLAYER_POSITIONS_X - 1 AND iCurrentPlayerY % 2 = 0
|
|
iPositionChangeX = 1
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF bValidMovement
|
|
|
|
IF (SCGW_Bot[iBot].SCGW_UF_Player.iLastMovementTime + SCGW_GET_PLAYER_MOVEMENT_TIME(iBot) < NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
AND IS_BIT_SET(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED))
|
|
OR bDirectionChange
|
|
|
|
IF bDirectionChange
|
|
OR (NOT IS_BIT_SET(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_FIRST_MOVE_DONE))
|
|
SET_BIT(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_CURRENT_MOVE_DIRECTION_CHANGED)
|
|
ENDIF
|
|
|
|
IF iPreviousPlayerX != iCurrentPlayerX
|
|
iPreviousPlayerX = iCurrentPlayerX
|
|
ENDIF
|
|
|
|
IF iPreviousPlayerY != iCurrentPlayerY
|
|
iPreviousPlayerY = iCurrentPlayerY
|
|
ENDIF
|
|
|
|
IF (iPositionChangeX != 0)
|
|
iCurrentPlayerX += iPositionChangeX
|
|
ENDIF
|
|
|
|
IF (iPositionChangeY != 0)
|
|
iCurrentPlayerY += iPositionChangeY
|
|
ENDIF
|
|
|
|
SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition = SCGW_GET_POSITION_FROM_COORDS(iCurrentPlayerX, iCurrentPlayerY)
|
|
SCGW_Bot[iBot].SCGW_UF_Player.iPreviousPlayerPosition = SCGW_GET_POSITION_FROM_COORDS(iPreviousPlayerX, iPreviousPlayerY)
|
|
|
|
IF sSCGWData.sLocalPlayer.iSpeedBoostRemainingMoves > 0
|
|
SCGW_Bot[iBot].SCGW_player.fMoveSpeed = cfSCGW_BOOST_SPEED
|
|
sSCGWData.sLocalPlayer.iSpeedBoostRemainingMoves--
|
|
ELIF NOT IS_FLOAT_IN_RANGE(SCGW_Bot[iBot].SCGW_player.fMoveSpeed, cfSCGW_BASE_SPEED - cfARCADE_MINIGAME_FLOAT_TOLERANCE, cfSCGW_BASE_SPEED + cfARCADE_MINIGAME_FLOAT_TOLERANCE)
|
|
SCGW_Bot[iBot].SCGW_player.fMoveSpeed = cfSCGW_BASE_SPEED
|
|
ENDIF
|
|
|
|
SCGW_Bot[iBot].SCGW_UF_Player.iLastMovementTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
|
|
IF iPositionChangeX > 0
|
|
SCGW_Bot[iBot].SCGW_UF_Player.iFacingDirection = ciSCGW_GRID_DIRECTION_RIGHT
|
|
ELIF iPositionChangeX < 0
|
|
SCGW_Bot[iBot].SCGW_UF_Player.iFacingDirection = ciSCGW_GRID_DIRECTION_LEFT
|
|
ELIF iPositionChangeY < 0
|
|
SCGW_Bot[iBot].SCGW_UF_Player.iFacingDirection = ciSCGW_GRID_DIRECTION_UP
|
|
ELIF iPositionChangeY > 0
|
|
SCGW_Bot[iBot].SCGW_UF_Player.iFacingDirection = ciSCGW_GRID_DIRECTION_DOWN
|
|
ENDIF
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_INPUT_BOT - MOVING - iBot ",iBot," iPositionChangeX = ", iPositionChangeX, " iPositionChangeY = ", iPositionChangeY, " iPlayerPosition = (", SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition,")" )
|
|
CLEAR_BIT(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED)
|
|
CLEAR_BIT(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED_HALF)
|
|
SCGW_Bot[iBot].SCGW_UF_Player.iLastMovementDirection = iMoveInputThisFrame
|
|
|
|
IF NOT IS_BIT_SET(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_FIRST_MOVE_DONE)
|
|
SET_BIT(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_FIRST_MOVE_DONE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processes changing the player's direction based on input
|
|
PROC SCGW_PROCESS_TURN_INPUT()
|
|
|
|
INT iTurnInputThisFrame = SCGW_GET_TURN_INPUT()
|
|
|
|
BOOL bValidTurn = SCGW_CAN_PLAYER_TURN_THIS_DIRECTION(sSCGWData.sLocalPlayer.iLocalPart,iTurnInputThisFrame)
|
|
|
|
IF bValidTurn
|
|
SWITCH iTurnInputThisFrame
|
|
CASE ciSCGW_INPUT_TURN_UP
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iFacingDirection = ciSCGW_GRID_DIRECTION_UP
|
|
BREAK
|
|
|
|
CASE ciSCGW_INPUT_TURN_DOWN
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iFacingDirection = ciSCGW_GRID_DIRECTION_DOWN
|
|
BREAK
|
|
|
|
CASE ciSCGW_INPUT_TURN_LEFT
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iFacingDirection = ciSCGW_GRID_DIRECTION_LEFT
|
|
BREAK
|
|
|
|
CASE ciSCGW_INPUT_TURN_RIGHT
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iFacingDirection = ciSCGW_GRID_DIRECTION_RIGHT
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_TURN_INPUT_BOT(INT iBot)
|
|
|
|
INT iTurnInputThisFrame = SCGW_GET_TURN_INPUT_BOT(iBot)
|
|
|
|
BOOL bValidTurn = SCGW_CAN_PLAYER_TURN_THIS_DIRECTION_BOT(iBot, iTurnInputThisFrame)
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_TURN_INPUT_BOT - iTurnInputThisFrame ", iTurnInputThisFrame)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_TURN_INPUT_BOT - bValidTurn ", bValidTurn)
|
|
IF bValidTurn
|
|
SWITCH iTurnInputThisFrame
|
|
CASE ciSCGW_INPUT_TURN_UP
|
|
SCGW_Bot[iBot].SCGW_UF_Player.iFacingDirection = ciSCGW_GRID_DIRECTION_UP
|
|
BREAK
|
|
|
|
CASE ciSCGW_INPUT_TURN_DOWN
|
|
SCGW_Bot[iBot].SCGW_UF_Player.iFacingDirection = ciSCGW_GRID_DIRECTION_DOWN
|
|
BREAK
|
|
|
|
CASE ciSCGW_INPUT_TURN_LEFT
|
|
SCGW_Bot[iBot].SCGW_UF_Player.iFacingDirection = ciSCGW_GRID_DIRECTION_LEFT
|
|
BREAK
|
|
|
|
CASE ciSCGW_INPUT_TURN_RIGHT
|
|
SCGW_Bot[iBot].SCGW_UF_Player.iFacingDirection = ciSCGW_GRID_DIRECTION_RIGHT
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
ENDIF
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_TURN_INPUT_BOT - SCGW_Bot[",iBot,"].SCGW_UF_Player.iFacingDirection ", SCGW_Bot[iBot].SCGW_UF_Player.iFacingDirection)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processes the player shooting
|
|
PROC SCGW_PROCESS_SHOOT_INPUT()
|
|
|
|
IF SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iEquippedWeaponType = ciSCGW_WEAPON_NONE
|
|
EXIT
|
|
ENDIF
|
|
|
|
INT iShootInputThisFrame = SCGW_GET_SHOOT_INPUT()
|
|
INT iShotDirection
|
|
BOOL bValidShot = FALSE
|
|
|
|
IF iShootInputThisFrame != ciSCGW_INPUT_NONE
|
|
bValidShot = SCGW_CAN_PLAYER_SHOOT_THIS_DIRECTION(SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iFacingDirection)
|
|
ENDIF
|
|
|
|
IF bValidShot
|
|
|
|
IF NATIVE_TO_INT(GET_NETWORK_TIME()) < sSCGWData.sLocalPlayer.iLastShotTime + sSCGWData.sWeaponData[SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iEquippedWeaponType].iShotInterval
|
|
EXIT
|
|
ENDIF
|
|
|
|
iShotDirection = SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iFacingDirection
|
|
|
|
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].sProjectiles[sSCGWData.iNextShotIndex].iShotTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].sProjectiles[sSCGWData.iNextShotIndex].iShotDirection = iShotDirection
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].sProjectiles[sSCGWData.iNextShotIndex].iShotWeaponType = SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iEquippedWeaponType
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].sProjectiles[sSCGWData.iNextShotIndex].vShotOrigin = sSCGWData.sPlayers[sSCGWData.sLocalPlayer.iLocalPart].vActualPlayerPosition
|
|
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iFacingDirection = iShotDirection
|
|
|
|
sSCGWData.sLocalPlayer.iLastShotTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_SHOOT_INPUT - SHOOTING - iNextShotIndex = ", sSCGWData.iNextShotIndex, " iShotDirection = ", iShotDirection, " iShotOrigin = (", SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].sProjectiles[sSCGWData.iNextShotIndex].vShotOrigin.x,", ", SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].sProjectiles[sSCGWData.iNextShotIndex].vShotOrigin.y,")" )
|
|
|
|
sSCGWData.iNextShotIndex ++
|
|
IF sSCGWData.iNextShotIndex >= ciSCGW_MAX_PLAYER_SHOTS
|
|
sSCGWData.iNextShotIndex = 0
|
|
ENDIF
|
|
|
|
SET_CONTROL_SHAKE(PLAYER_CONTROL, ciSCGW_VIB_SHOOT_DURATION, ciSCGW_VIB_SHOOT_FREQ)
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_SHOOT_INPUT_BOT(INT iBot)
|
|
|
|
IF SCGW_Bot[iBot].SCGW_player.iEquippedWeaponType = ciSCGW_WEAPON_NONE
|
|
EXIT
|
|
ENDIF
|
|
|
|
INT iShootInputThisFrame = SCGW_GET_SHOOT_INPUT_BOT(iBot)
|
|
INT iShotDirection
|
|
BOOL bValidShot = FALSE
|
|
|
|
IF iShootInputThisFrame != ciSCGW_INPUT_NONE
|
|
bValidShot = SCGW_CAN_PLAYER_SHOOT_THIS_DIRECTION_BOT(iBot, SCGW_Bot[iBot].SCGW_UF_Player.iFacingDirection)
|
|
ENDIF
|
|
|
|
IF bValidShot
|
|
|
|
IF NATIVE_TO_INT(GET_NETWORK_TIME()) < sSCGWData.sBotPlayer[iBot].iLastShotTime + sSCGWData.sWeaponData[SCGW_Bot[iBot].SCGW_player.iEquippedWeaponType].iShotInterval
|
|
EXIT
|
|
ENDIF
|
|
|
|
iShotDirection = SCGW_Bot[iBot].SCGW_UF_Player.iFacingDirection
|
|
|
|
|
|
SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[sSCGWData.iNextShotIndex].iShotTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[sSCGWData.iNextShotIndex].iShotDirection = iShotDirection
|
|
SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[sSCGWData.iNextShotIndex].iShotWeaponType = SCGW_Bot[iBot].SCGW_player.iEquippedWeaponType
|
|
SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[sSCGWData.iNextShotIndex].vShotOrigin = sSCGWData.sPlayers[iBot].vActualPlayerPosition
|
|
|
|
SCGW_Bot[iBot].SCGW_UF_Player.iFacingDirection = iShotDirection
|
|
|
|
sSCGWData.sBotPlayer[iBot].iLastShotTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_SHOOT_INPUT_BOT - SHOOTING - iNextShotIndex = ", sSCGWData.iNextShotIndex, " iShotDirection = ", iShotDirection, " iShotOrigin = (", SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[sSCGWData.iNextShotIndex].vShotOrigin.x,", ", SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[sSCGWData.iNextShotIndex].vShotOrigin.y,")" )
|
|
|
|
sSCGWData.iNextShotIndex ++
|
|
IF sSCGWData.iNextShotIndex >= ciSCGW_MAX_PLAYER_SHOTS
|
|
sSCGWData.iNextShotIndex = 0
|
|
ENDIF
|
|
|
|
SET_CONTROL_SHAKE(PLAYER_CONTROL, ciSCGW_VIB_SHOOT_DURATION, ciSCGW_VIB_SHOOT_FREQ)
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL SCGW_PROCESS_BOT_AI_SHOULD_SHOOT(INT iBot)
|
|
INT iPosX
|
|
INT iPosY
|
|
INT iPlayerPosX
|
|
INT iPlayerPosY
|
|
SCGW_GET_POSITION_COORDS(SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition,iPosX,iPosY)
|
|
INT iPlayerLoop
|
|
FOR iPlayerLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
IF iPlayerLoop != iBot AND (NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iPlayerLoop)) OR SCGW_Bot[iPlayerLoop].bActive) AND (SCGW_PlayerBD[iPlayerLoop].iHealth > 0 OR SCGW_Bot[iPlayerLoop].SCGW_player.iHealth > 0)
|
|
SCGW_GET_POSITION_COORDS(SCGW_UF_PlayerBD[iPlayerLoop].iPlayerPosition,iPlayerPosX,iPlayerPosY)
|
|
IF iPlayerPosX = iPosX
|
|
RETURN iPlayerPosY <= iPosY AND SCGW_Bot[iBot].SCGW_UF_Player.iFacingDirection = ciSCGW_GRID_DIRECTION_UP
|
|
OR iPlayerPosY >= iPosY AND SCGW_Bot[iBot].SCGW_UF_Player.iFacingDirection = ciSCGW_GRID_DIRECTION_DOWN
|
|
ELIF iPlayerPosY = iPosY
|
|
RETURN iPlayerPosX <= iPosX AND SCGW_Bot[iBot].SCGW_UF_Player.iFacingDirection = ciSCGW_GRID_DIRECTION_LEFT
|
|
OR iPlayerPosX >= iPosX AND SCGW_Bot[iBot].SCGW_UF_Player.iFacingDirection = ciSCGW_GRID_DIRECTION_RIGHT
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC INT SCGW_PROCESS_BOT_AI_SHOULD_FACE_DIRECTION(INT iBot)
|
|
INT iPosX
|
|
INT iPosY
|
|
INT iPlayerPosX
|
|
INT iPlayerPosY
|
|
SCGW_GET_POSITION_COORDS(SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition,iPosX,iPosY)
|
|
INT iPlayerLoop
|
|
FOR iPlayerLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
IF iPlayerLoop != iBot AND (NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iPlayerLoop)) OR SCGW_Bot[iPlayerLoop].bActive)
|
|
SCGW_GET_POSITION_COORDS(SCGW_UF_PlayerBD[iPlayerLoop].iPlayerPosition,iPlayerPosX,iPlayerPosY)
|
|
IF iPlayerPosX = iPosX
|
|
IF iPlayerPosY <= iPosY
|
|
RETURN ciSCGW_INPUT_TURN_UP
|
|
ELIF iPlayerPosY >= iPosY
|
|
RETURN ciSCGW_INPUT_TURN_DOWN
|
|
ENDIF
|
|
ELIF iPlayerPosY = iPosY
|
|
IF iPlayerPosX <= iPosX
|
|
RETURN ciSCGW_INPUT_TURN_LEFT
|
|
ELIF iPlayerPosX >= iPosX
|
|
RETURN ciSCGW_INPUT_TURN_RIGHT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
RETURN -1
|
|
ENDFUNC
|
|
|
|
FUNC INT SCGW_PROCESS_BOT_AI_GET_OWNER_GANG(INT iX, INT iY)
|
|
IF (iX >=0 AND iX <= ciSCGW_MAX_GRID_POSITIONS_X - 1)
|
|
AND (iY >=0 AND iY <= ciSCGW_MAX_GRID_POSITIONS_Y - 1)
|
|
RETURN sSCGWData.iPreviousGangOwnership[iX][iY]
|
|
ENDIF
|
|
RETURN -2
|
|
ENDFUNC
|
|
PROC SCGW_PROCESS_BOT_AI_GET_CLOSEST_BUILDINGS(INT iBot,INT &i00, INT &i01, INT &i10, INT &i11)
|
|
INT iPosX
|
|
INT iPosY
|
|
SCGW_GET_POSITION_COORDS(SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition,iPosX,iPosY)
|
|
i00 = SCGW_PROCESS_BOT_AI_GET_OWNER_GANG(iPosX/2-1, iPosY/2-1)
|
|
i01 = SCGW_PROCESS_BOT_AI_GET_OWNER_GANG(iPosX/2-1, iPosY/2)
|
|
i10 = SCGW_PROCESS_BOT_AI_GET_OWNER_GANG(iPosX/2, iPosY/2-1)
|
|
i11 = SCGW_PROCESS_BOT_AI_GET_OWNER_GANG(iPosX/2, iPosY/2)
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_BOT_AI_FIND_BEST_MOVE(INT iBot)
|
|
INT iPosX
|
|
INT iPosY
|
|
// INT iPosTargetX
|
|
// INT iPosTargetY
|
|
INT i00
|
|
INT i01
|
|
INT i10
|
|
INT i11
|
|
SCGW_GET_POSITION_COORDS(SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition,iPosX,iPosY)
|
|
SCGW_PROCESS_BOT_AI_GET_CLOSEST_BUILDINGS(iBot,i00,i01,i10,i11)
|
|
IF i00 != SCGW_Bot[iBot].SCGW_player.iGang AND i00 != -2
|
|
ELIF i01 != SCGW_Bot[iBot].SCGW_player.iGang AND i01 != -2
|
|
ELIF i10 != SCGW_Bot[iBot].SCGW_player.iGang AND i10 != -2
|
|
ELIF i11 != SCGW_Bot[iBot].SCGW_player.iGang AND i11 != -2
|
|
ELSE
|
|
ENDIF
|
|
|
|
// iGangToDraw = sSCGWData.iPreviousGangOwnership[iGridX][iGridY]
|
|
|
|
// INT iPos = SCGW_GET_POSITION_FROM_COORDS(iPosTargetX, iPosTargetY)
|
|
// iGangToDraw = sSCGWData.iPreviousGangOwnership[iGridX][iGridY]
|
|
ENDPROC
|
|
|
|
FUNC BOOL SCGW_PROCESS_BOT_AI_SHOULD_AVOID_VEHICLE(INT iBot)
|
|
INT iPosX
|
|
INT iPosY
|
|
SCGW_GET_POSITION_COORDS(SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition,iPosX,iPosY)
|
|
INT iPosTargetX
|
|
INT iPosTargetY
|
|
INT iVehicleLoop
|
|
FOR iVehicleLoop = 0 TO ciSCGW_MAX_ACTIVE_VEHICLES - 1
|
|
IF SCGW_ServerBD.sVehicles[iVehicleLoop].iVehicleType = -1
|
|
RELOOP
|
|
ENDIF
|
|
SCGW_GET_POSITION_COORDS(SCGW_ServerBD.sVehicles[iVehicleLoop].iVehicleOrigin, iPosTargetX, iPosTargetY)
|
|
IF iPosTargetX = iPosX
|
|
OR iPosTargetY = iPosY
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_SHOULD_AVOID_VEHICLE - iBot ",iBot," iPosX ",iPosX," iPosY ",iPosY )
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_SHOULD_AVOID_VEHICLE - iVehicleLoop ",iVehicleLoop," iPosX ",iPosTargetX," iPosY ",iPosTargetY )
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_SHOULD_AVOID_VEHICLE - RETURN TRUE")
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDFOR
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC SCGW_PROCESS_BOT_AI_AVOID_VEHICLE(INT iBot)
|
|
INT iPosX
|
|
INT iPosY
|
|
INT iTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
SCGW_GET_POSITION_COORDS(SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition,iPosX,iPosY)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," iPosX ",iPosX," iPosY ",iPosY )
|
|
BOOL bShouldMoveFromX
|
|
BOOL bShouldMoveFromY
|
|
BOOL bShouldMoveDown
|
|
BOOL bShouldMoveRight
|
|
INT iVehiclePosX
|
|
INT iVehiclePosY
|
|
INT iVehicleLoop
|
|
FOR iVehicleLoop = 0 TO ciSCGW_MAX_ACTIVE_VEHICLES - 1
|
|
INT iVehicleMoveTime = PICK_INT(SCGW_ServerBD.sVehicles[iVehicleLoop].iVehicleDirection = ciSCGW_GRID_DIRECTION_DOWN OR SCGW_ServerBD.sVehicles[iVehicleLoop].iVehicleDirection = ciSCGW_GRID_DIRECTION_UP, ciSCGW_MAX_PLAYER_POSITIONS_Y + 2, ciSCGW_MAX_PLAYER_POSITIONS_X + 2) * ciSCGW_VEHICLE_GRID_SPEED
|
|
IF SCGW_ServerBD.sVehicles[iVehicleLoop].iVehicleType = -1
|
|
OR (iTime < SCGW_ServerBD.sVehicles[iVehicleLoop].iVehicleTime AND iTime > SCGW_ServerBD.sVehicles[iVehicleLoop].iVehicleTime + iVehicleMoveTime)
|
|
RELOOP
|
|
ENDIF
|
|
SCGW_GET_POSITION_COORDS(SCGW_ServerBD.sVehicles[iVehicleLoop].iVehicleOrigin, iVehiclePosX, iVehiclePosY)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iVehicleLoop ",iVehicleLoop," iVehiclePosX ",iVehiclePosX," iVehiclePosY ",iVehiclePosY )
|
|
|
|
bShouldMoveFromX = bShouldMoveFromX OR (iVehiclePosX = iPosX)
|
|
bShouldMoveFromY = bShouldMoveFromY OR (iVehiclePosY = iPosY)
|
|
bShouldMoveDown = bShouldMoveDown OR (SCGW_ServerBD.sVehicles[iVehicleLoop].iVehicleDirection = ciSCGW_GRID_DIRECTION_DOWN AND iVehiclePosY = iPosY)
|
|
bShouldMoveRight = bShouldMoveRight OR (SCGW_ServerBD.sVehicles[iVehicleLoop].iVehicleDirection = ciSCGW_GRID_DIRECTION_LEFT AND iVehiclePosX = iPosX)
|
|
ENDFOR
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," bShouldMoveFromX ",bShouldMoveFromX)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," bShouldMoveFromY ",bShouldMoveFromY)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," bShouldMoveDown ",bShouldMoveDown)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," bShouldMoveRight ",bShouldMoveRight)
|
|
IF bShouldMoveFromX
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," bShouldMoveFromX")
|
|
IF bShouldMoveDown
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," bShouldMoveDown")
|
|
IF iPosY+2 > ciSCGW_MAX_PLAYER_POSITIONS_Y-1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," iPosY+2 > ciSCGW_MAX_PLAYER_POSITIONS_Y-1")
|
|
SCGW_Bot[iBot].iTargetPosY = iPosY-2
|
|
ELSE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," iPosY+2 <= ciSCGW_MAX_PLAYER_POSITIONS_Y-1")
|
|
SCGW_Bot[iBot].iTargetPosY = iPosY+2
|
|
ENDIF
|
|
ELSE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," NOT bShouldMoveDown")
|
|
IF iPosY-2 < 0
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," iPosY-2 < 0")
|
|
SCGW_Bot[iBot].iTargetPosY = iPosY+2
|
|
ELSE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," iPosY-2 >= 0")
|
|
SCGW_Bot[iBot].iTargetPosY = iPosY-2
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF bShouldMoveFromY
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," bShouldMoveFromY")
|
|
IF bShouldMoveRight
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," bShouldMoveRight")
|
|
IF iPosX+2 > ciSCGW_MAX_PLAYER_POSITIONS_X-1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," iPosX+2 > ciSCGW_MAX_PLAYER_POSITIONS_X-1")
|
|
SCGW_Bot[iBot].iTargetPosX = iPosX-2
|
|
ELSE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," iPosX+2 <= ciSCGW_MAX_PLAYER_POSITIONS_X-1")
|
|
SCGW_Bot[iBot].iTargetPosX = iPosX+2
|
|
ENDIF
|
|
ELSE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," NOT bShouldMoveRight")
|
|
IF iPosX-2 < 0
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," iPosX-2 < 0")
|
|
SCGW_Bot[iBot].iTargetPosX = iPosX+2
|
|
ELSE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," iPosX-2 >= 0")
|
|
SCGW_Bot[iBot].iTargetPosX = iPosX-2
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT bShouldMoveFromX AND NOT bShouldMoveFromY
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," NOT bShouldMoveFromX AND NOT bShouldMoveFromY ")
|
|
SCGW_Bot[iBot].iTargetPosX = GET_RANDOM_INT_IN_RANGE(0,ciSCGW_MAX_PLAYER_POSITIONS_X/2)*2
|
|
SCGW_Bot[iBot].iTargetPosY = GET_RANDOM_INT_IN_RANGE(0,ciSCGW_MAX_PLAYER_POSITIONS_Y/2)*2
|
|
ENDIF
|
|
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_BOT_AI_AVOID_VEHICLE - iBot ",iBot," iTargetPosX ",SCGW_Bot[iBot].iTargetPosX," iTargetPosY ",SCGW_Bot[iBot].iTargetPosY )
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING_FIND_BUILDING(INT iBot)
|
|
INT iPosX
|
|
INT iPosY
|
|
SCGW_GET_POSITION_COORDS(SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition,iPosX,iPosY)
|
|
INT iTargetPosX
|
|
INT iTargetPosY
|
|
INT iRandom
|
|
INT iIterator
|
|
INT iBuildingToCaptureX
|
|
INT iBuildingToCaptureY
|
|
SWITCH GET_RANDOM_INT_IN_RANGE(0,6)
|
|
CASE 5
|
|
iTargetPosX = -1
|
|
iTargetPosY = -1
|
|
iRandom = GET_RANDOM_INT_IN_RANGE(0,4)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - iBot ",iBot," iRandom ",iRandom," iPosX ",iPosX," iPosY ",iPosY )
|
|
FOR iIterator = 0 TO 3
|
|
IF iPosX % 2 = 1 AND iPosY % 2 = 0
|
|
iTargetPosX = iPosX
|
|
IF (iIterator+iRandom)%2 = 0
|
|
iTargetPosY = iPosY-1
|
|
ELSE
|
|
iTargetPosY = iPosY+1
|
|
ENDIF
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - A iIterator ",iIterator," (iIterator+iRandom)%2 = ",(iIterator+iRandom)%2," iTargetPosX ",iTargetPosX," iTargetPosY ",iTargetPosY)
|
|
ELIF iPosY % 2 = 1 AND iPosX % 2 = 0
|
|
iTargetPosY = iPosY
|
|
IF (iIterator+iRandom)%2 = 0
|
|
iTargetPosX = iPosX-1
|
|
ELSE
|
|
iTargetPosX = iPosX+1
|
|
ENDIF
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - B iIterator ",iIterator," (iIterator+iRandom)%2 = ",(iIterator+iRandom)%2," iTargetPosX ",iTargetPosX," iTargetPosY ",iTargetPosY)
|
|
ELSE
|
|
IF (iIterator+iRandom)%4 = 0
|
|
iTargetPosX = iPosX-1
|
|
iTargetPosY = iPosY-1
|
|
ELIF (iIterator+iRandom)%4 = 1
|
|
iTargetPosX = iPosX+1
|
|
iTargetPosY = iPosY-1
|
|
ELIF (iIterator+iRandom)%4 = 2
|
|
iTargetPosX = iPosX-1
|
|
iTargetPosY = iPosY+1
|
|
ELSE
|
|
iTargetPosX = iPosX+1
|
|
iTargetPosY = iPosY+1
|
|
ENDIF
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - C iIterator ",iIterator," (iIterator+iRandom)%4 = ",(iIterator+iRandom)%4," iTargetPosX ",iTargetPosX," iTargetPosY ",iTargetPosY)
|
|
ENDIF
|
|
IF iTargetPosX != -1 AND iTargetPosY != -1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - iBot ",iBot," iGang ",SCGW_Bot[iBot].SCGW_player.iGang," iTargetPosX/2 ",iTargetPosX/2," iTargetPosY/2 ",iTargetPosY/2 )
|
|
IF SCGW_ServerBD.iGridGangOwnership[(iTargetPosX/2)%ciSCGW_MAX_GRID_POSITIONS_X][(iTargetPosY/2)%ciSCGW_MAX_GRID_POSITIONS_Y] != SCGW_Bot[iBot].SCGW_player.iGang
|
|
SCGW_Bot[iBot].iBuildingToCaptureX = (iTargetPosX/2)%ciSCGW_MAX_GRID_POSITIONS_X
|
|
SCGW_Bot[iBot].iBuildingToCaptureY = (iTargetPosY/2)%ciSCGW_MAX_GRID_POSITIONS_Y
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
BREAK
|
|
CASE 0
|
|
FOR iBuildingToCaptureY = 0 TO ciSCGW_MAX_GRID_POSITIONS_Y-1
|
|
FOR iBuildingToCaptureX = 0 TO ciSCGW_MAX_GRID_POSITIONS_X-1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - iBot ",iBot," iBuildingToCaptureX ",iBuildingToCaptureX," iBuildingToCaptureY ",iBuildingToCaptureY )
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - iBot ",iBot," iPosX/2 ",iPosX/2," iPosY/2 ",iPosY/2 )
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - iBot ",iBot," iGridGangOwnership ",SCGW_ServerBD.iGridGangOwnership[(iBuildingToCaptureX+iPosX/2)%ciSCGW_MAX_GRID_POSITIONS_X][(iBuildingToCaptureY+iPosY/2)%ciSCGW_MAX_GRID_POSITIONS_Y]," iGang ",SCGW_Bot[iBot].SCGW_player.iGang )
|
|
IF SCGW_ServerBD.iGridGangOwnership[(iBuildingToCaptureX+iPosX/2)%ciSCGW_MAX_GRID_POSITIONS_X][(iBuildingToCaptureY+iPosY/2)%ciSCGW_MAX_GRID_POSITIONS_Y] != SCGW_Bot[iBot].SCGW_player.iGang
|
|
SCGW_Bot[iBot].iBuildingToCaptureX = (iBuildingToCaptureX+iPosX/2)%ciSCGW_MAX_GRID_POSITIONS_X
|
|
SCGW_Bot[iBot].iBuildingToCaptureY = (iBuildingToCaptureY+iPosY/2)%ciSCGW_MAX_GRID_POSITIONS_Y
|
|
EXIT
|
|
ENDIF
|
|
ENDFOR
|
|
ENDFOR
|
|
BREAK
|
|
CASE 1
|
|
FOR iBuildingToCaptureX = 0 TO ciSCGW_MAX_GRID_POSITIONS_X-1
|
|
FOR iBuildingToCaptureY = 0 TO ciSCGW_MAX_GRID_POSITIONS_Y-1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - iBot ",iBot," iBuildingToCaptureX ",iBuildingToCaptureX," iBuildingToCaptureY ",iBuildingToCaptureY )
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - iBot ",iBot," iPosX/2 ",iPosX/2," iPosY/2 ",iPosY/2 )
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - iBot ",iBot," iGridGangOwnership ",SCGW_ServerBD.iGridGangOwnership[(iBuildingToCaptureX+iPosX/2)%ciSCGW_MAX_GRID_POSITIONS_X][(iBuildingToCaptureY+iPosY/2)%ciSCGW_MAX_GRID_POSITIONS_Y]," iGang ",SCGW_Bot[iBot].SCGW_player.iGang )
|
|
IF SCGW_ServerBD.iGridGangOwnership[(iBuildingToCaptureX+iPosX/2)%ciSCGW_MAX_GRID_POSITIONS_X][(iBuildingToCaptureY+iPosY/2)%ciSCGW_MAX_GRID_POSITIONS_Y] != SCGW_Bot[iBot].SCGW_player.iGang
|
|
SCGW_Bot[iBot].iBuildingToCaptureX = (iBuildingToCaptureX+iPosX/2)%ciSCGW_MAX_GRID_POSITIONS_X
|
|
SCGW_Bot[iBot].iBuildingToCaptureY = (iBuildingToCaptureY+iPosY/2)%ciSCGW_MAX_GRID_POSITIONS_Y
|
|
EXIT
|
|
ENDIF
|
|
ENDFOR
|
|
ENDFOR
|
|
BREAK
|
|
CASE 2
|
|
FOR iBuildingToCaptureX = ciSCGW_MAX_GRID_POSITIONS_X-1 TO 0
|
|
FOR iBuildingToCaptureY = ciSCGW_MAX_GRID_POSITIONS_Y-1 TO 0
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - iBot ",iBot," iBuildingToCaptureX ",iBuildingToCaptureX," iBuildingToCaptureY ",iBuildingToCaptureY )
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - iBot ",iBot," iPosX/2 ",iPosX/2," iPosY/2 ",iPosY/2 )
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - iBot ",iBot," iGridGangOwnership ",SCGW_ServerBD.iGridGangOwnership[(iBuildingToCaptureX+iPosX/2)%ciSCGW_MAX_GRID_POSITIONS_X][(iBuildingToCaptureY+iPosY/2)%ciSCGW_MAX_GRID_POSITIONS_Y]," iGang ",SCGW_Bot[iBot].SCGW_player.iGang )
|
|
IF SCGW_ServerBD.iGridGangOwnership[(iBuildingToCaptureX+iPosX/2)%ciSCGW_MAX_GRID_POSITIONS_X][(iBuildingToCaptureY+iPosY/2)%ciSCGW_MAX_GRID_POSITIONS_Y] != SCGW_Bot[iBot].SCGW_player.iGang
|
|
SCGW_Bot[iBot].iBuildingToCaptureX = (iBuildingToCaptureX+iPosX/2)%ciSCGW_MAX_GRID_POSITIONS_X
|
|
SCGW_Bot[iBot].iBuildingToCaptureY = (iBuildingToCaptureY+iPosY/2)%ciSCGW_MAX_GRID_POSITIONS_Y
|
|
EXIT
|
|
ENDIF
|
|
ENDFOR
|
|
ENDFOR
|
|
BREAK
|
|
CASE 3
|
|
FOR iBuildingToCaptureY = ciSCGW_MAX_GRID_POSITIONS_Y-1 TO 0
|
|
FOR iBuildingToCaptureX = ciSCGW_MAX_GRID_POSITIONS_X-1 TO 0
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - iBot ",iBot," iBuildingToCaptureX ",iBuildingToCaptureX," iBuildingToCaptureY ",iBuildingToCaptureY )
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - iBot ",iBot," iPosX/2 ",iPosX/2," iPosY/2 ",iPosY/2 )
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - iBot ",iBot," iGridGangOwnership ",SCGW_ServerBD.iGridGangOwnership[(iBuildingToCaptureX+iPosX/2)%ciSCGW_MAX_GRID_POSITIONS_X][(iBuildingToCaptureY+iPosY/2)%ciSCGW_MAX_GRID_POSITIONS_Y]," iGang ",SCGW_Bot[iBot].SCGW_player.iGang )
|
|
IF SCGW_ServerBD.iGridGangOwnership[(iBuildingToCaptureX+iPosX/2)%ciSCGW_MAX_GRID_POSITIONS_X][(iBuildingToCaptureY+iPosY/2)%ciSCGW_MAX_GRID_POSITIONS_Y] != SCGW_Bot[iBot].SCGW_player.iGang
|
|
SCGW_Bot[iBot].iBuildingToCaptureX = (iBuildingToCaptureX+iPosX/2)%ciSCGW_MAX_GRID_POSITIONS_X
|
|
SCGW_Bot[iBot].iBuildingToCaptureY = (iBuildingToCaptureY+iPosY/2)%ciSCGW_MAX_GRID_POSITIONS_Y
|
|
EXIT
|
|
ENDIF
|
|
ENDFOR
|
|
ENDFOR
|
|
BREAK
|
|
CASE 4
|
|
SCGW_Bot[iBot].iBuildingToCaptureX = GET_RANDOM_INT_IN_RANGE(0,ciSCGW_MAX_GRID_POSITIONS_X)
|
|
SCGW_Bot[iBot].iBuildingToCaptureY = GET_RANDOM_INT_IN_RANGE(0,ciSCGW_MAX_GRID_POSITIONS_y)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING_FIND_BUILDING_FIND_CORNER(INT iBot)
|
|
SCGW_Bot[iBot].iBuildingToCaptureCorner++
|
|
SCGW_Bot[iBot].iBuildingToCaptureCorner = SCGW_Bot[iBot].iBuildingToCaptureCorner%6
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - iBuildingToCaptureCorner ",SCGW_Bot[iBot].iBuildingToCaptureCorner )
|
|
IF SCGW_Bot[iBot].iBuildingToCaptureCorner = 0
|
|
SCGW_Bot[iBot].iBuildingToCaptureCornerRandom = GET_RANDOM_INT_IN_RANGE(0,4)
|
|
ELIF SCGW_Bot[iBot].iBuildingToCaptureCorner = 5
|
|
SCGW_Bot[iBot].iBuildingToCaptureX = -1
|
|
SCGW_Bot[iBot].iBuildingToCaptureY = -1
|
|
SCGW_Bot[iBot].iTargetPosX = SCGW_Bot[iBot].iBuildingToCaptureX
|
|
SCGW_Bot[iBot].iTargetPosY = SCGW_Bot[iBot].iBuildingToCaptureY
|
|
EXIT
|
|
ENDIF
|
|
SWITCH ((SCGW_Bot[iBot].iBuildingToCaptureCorner+SCGW_Bot[iBot].iBuildingToCaptureCornerRandom)%6)
|
|
CASE 0
|
|
CASE 4
|
|
SCGW_Bot[iBot].iTargetPosX = SCGW_Bot[iBot].iBuildingToCaptureX*2+1-1
|
|
SCGW_Bot[iBot].iTargetPosY = SCGW_Bot[iBot].iBuildingToCaptureY*2+1-1
|
|
BREAK
|
|
CASE 1
|
|
SCGW_Bot[iBot].iTargetPosX = SCGW_Bot[iBot].iBuildingToCaptureX*2+1+1
|
|
SCGW_Bot[iBot].iTargetPosY = SCGW_Bot[iBot].iBuildingToCaptureY*2+1-1
|
|
BREAK
|
|
CASE 2
|
|
SCGW_Bot[iBot].iTargetPosX = SCGW_Bot[iBot].iBuildingToCaptureX*2+1+1
|
|
SCGW_Bot[iBot].iTargetPosY = SCGW_Bot[iBot].iBuildingToCaptureY*2+1+1
|
|
BREAK
|
|
CASE 3
|
|
SCGW_Bot[iBot].iTargetPosX = SCGW_Bot[iBot].iBuildingToCaptureX*2+1-1
|
|
SCGW_Bot[iBot].iTargetPosY = SCGW_Bot[iBot].iBuildingToCaptureY*2+1+1
|
|
BREAK
|
|
CASE 5
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING(INT iBot)
|
|
IF SCGW_Bot[iBot].iBuildingToCaptureX = -1 AND SCGW_Bot[iBot].iBuildingToCaptureY = -1
|
|
SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING_FIND_BUILDING(iBot)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - iBot ",iBot," iBuildingToCaptureX ",SCGW_Bot[iBot].iBuildingToCaptureX," iBuildingToCaptureY ",SCGW_Bot[iBot].iBuildingToCaptureY )
|
|
ENDIF
|
|
INT iPosX
|
|
INT iPosY
|
|
TEXT_LABEL_63 tlLine = ""
|
|
FOR iPosY = 0 TO ciSCGW_MAX_GRID_POSITIONS_Y-1
|
|
tlLine = ""
|
|
FOR iPosX = 0 TO ciSCGW_MAX_GRID_POSITIONS_X-1
|
|
tlLine += SCGW_ServerBD.iGridGangOwnership[iPosX][iPosY]
|
|
tlLine += " "
|
|
ENDFOR
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - ",tlLine )
|
|
ENDFOR
|
|
|
|
IF SCGW_Bot[iBot].iBuildingToCaptureX != -1 AND SCGW_Bot[iBot].iBuildingToCaptureY != -1
|
|
AND SCGW_ServerBD.iGridGangOwnership[SCGW_Bot[iBot].iBuildingToCaptureX%ciSCGW_MAX_GRID_POSITIONS_X][SCGW_Bot[iBot].iBuildingToCaptureY%ciSCGW_MAX_GRID_POSITIONS_Y] = SCGW_Bot[iBot].SCGW_player.iGang
|
|
SCGW_Bot[iBot].iBuildingToCaptureCorner = 4
|
|
ENDIF
|
|
|
|
IF SCGW_Bot[iBot].iBuildingToCaptureX != -1 AND SCGW_Bot[iBot].iBuildingToCaptureY != -1
|
|
SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING_FIND_BUILDING_FIND_CORNER(iBot)
|
|
ENDIF
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING - iBot ",iBot," SCGW_Bot[iBot].iTargetPosX ",SCGW_Bot[iBot].iTargetPosX," SCGW_Bot[iBot].iTargetPosY ",SCGW_Bot[iBot].iTargetPosY )
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_BOT_AI_COLLECT_PICKUP(INT iBot)
|
|
INT iPosX
|
|
INT iPosY
|
|
SCGW_GET_POSITION_COORDS(SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition,iPosX,iPosY)
|
|
INT iPickupX = -1
|
|
INT iPickupY = -1
|
|
INT iFinalPickupX = -1
|
|
INT iFinalPickupY = -1
|
|
INT iPickup = 0
|
|
FOR iPickup = 0 TO ciSCGW_MAX_SPAWNED_PICKUPS-1
|
|
IF SCGW_ServerBD.sPickups[iPickup].iSpawnedPickupType != -1 AND SCGW_ServerBD.sPickups[iPickup].iSpawnedPickupLocation != -1 AND SCGW_ServerBD.sPickups[iPickup].iSpawnedPickupSpawnTime != -HIGHEST_INT
|
|
IF SCGW_ServerBD.sPickups[iPickup].iSpawnedPickupType = ciSCGW_PICKUPS_HEALTH
|
|
SCGW_GET_POSITION_COORDS(SCGW_ServerBD.sPickups[iPickup].iSpawnedPickupLocation,iPickupX,iPickupY)
|
|
IF iFinalPickupX = -1 AND iFinalPickupY = -1
|
|
OR ABSI(iPickupX-iPosX)+ABSI(iPickupY-iPosY) < ABSI(iFinalPickupX-iPosX)+ABSI(iFinalPickupY-iPosY)
|
|
iFinalPickupX = iPickupX
|
|
iFinalPickupY = iPickupY
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
IF iFinalPickupX = -1
|
|
SCGW_Bot[iBot].iTargetPosX = GET_RANDOM_INT_IN_RANGE(0,ciSCGW_MAX_PLAYER_POSITIONS_X/2)*2
|
|
ENDIF
|
|
IF iFinalPickupY = -1
|
|
SCGW_Bot[iBot].iTargetPosY = GET_RANDOM_INT_IN_RANGE(0,ciSCGW_MAX_PLAYER_POSITIONS_Y/2)*2
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_BOT_AI_SUDDEN_DEATH(INT iBot)
|
|
IF SCGW_Bot[iBot].iSuddenDeathTarget = -1
|
|
SCGW_Bot[iBot].iSuddenDeathTarget = GET_RANDOM_INT_IN_RANGE(0,ciSCGW_MAX_PLAYERS)
|
|
ENDIF
|
|
|
|
IF SCGW_Bot[iBot].iSuddenDeathTarget = iBot
|
|
SCGW_Bot[iBot].iSuddenDeathTarget = -1
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(SCGW_Bot[iBot].iSuddenDeathTarget))
|
|
AND NOT SCGW_Bot[SCGW_Bot[iBot].iSuddenDeathTarget].bActive
|
|
SCGW_Bot[iBot].iSuddenDeathTarget = -1
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[SCGW_Bot[iBot].iSuddenDeathTarget].iHealth = 0
|
|
SCGW_Bot[iBot].iSuddenDeathTarget = -1
|
|
EXIT
|
|
ENDIF
|
|
|
|
SCGW_GET_POSITION_COORDS(SCGW_UF_PlayerBD[SCGW_Bot[iBot].iSuddenDeathTarget].iPlayerPosition,SCGW_Bot[iBot].iTargetPosX,SCGW_Bot[iBot].iTargetPosY)
|
|
ENDPROC
|
|
|
|
FUNC BOOL SCGW_PROCESS_BOT_AI_SHOULD_GO_SUDDEN_DEATH(INT iBot)
|
|
UNUSED_PARAMETER(iBot)
|
|
RETURN SCGW_ServerBD.bSuddenDeath
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SCGW_PROCESS_BOT_AI_SHOULD_COLLECT_PICKUP(INT iBot)
|
|
RETURN SCGW_Bot[iBot].SCGW_player.iHealth <= ciSCGW_MAX_PLAYER_HEALTH / 2
|
|
ENDFUNC
|
|
|
|
PROC SCGW_PROCESS_BOT_AI(INT iBot)
|
|
SCGW_Bot[iBot].bShouldShoot = SCGW_PROCESS_BOT_AI_SHOULD_SHOOT(iBot)
|
|
SCGW_Bot[iBot].iFaceDirection = SCGW_PROCESS_BOT_AI_SHOULD_FACE_DIRECTION(iBot)
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_SHOOT_INPUT_BOT - iBot ",iBot," SCGW_Bot[iBot].eStateAI ",SCGW_Bot[iBot].eStateAI," SCGW_Bot[iBot].bTaskComplete ",SCGW_Bot[iBot].bTaskComplete )
|
|
|
|
IF SCGW_Bot[iBot].bTaskComplete
|
|
IF SCGW_Bot[iBot].eStateAI != SCGW_BOT_STATE_AI_SUDDEN_DEATH AND SCGW_PROCESS_BOT_AI_SHOULD_GO_SUDDEN_DEATH(iBot)
|
|
SCGW_Bot[iBot].eStateAI = SCGW_BOT_STATE_AI_SUDDEN_DEATH
|
|
// SCGW_Bot[iBot].bTaskComplete = TRUE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_SHOOT_INPUT_BOT - iBot ",iBot," SCGW_PROCESS_BOT_AI_SHOULD_GO_SUDDEN_DEATH")
|
|
ELIF SCGW_Bot[iBot].eStateAI != SCGW_BOT_STATE_AI_AVOID_VEHICLE AND SCGW_PROCESS_BOT_AI_SHOULD_AVOID_VEHICLE(iBot)
|
|
SCGW_Bot[iBot].eStateAI = SCGW_BOT_STATE_AI_AVOID_VEHICLE
|
|
// SCGW_Bot[iBot].bTaskComplete = TRUE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_SHOOT_INPUT_BOT - iBot ",iBot," SCGW_PROCESS_BOT_AI_SHOULD_AVOID_VEHICLE")
|
|
ELIF SCGW_Bot[iBot].eStateAI != SCGW_BOT_STATE_AI_COLLECT_PICKUP AND SCGW_PROCESS_BOT_AI_SHOULD_COLLECT_PICKUP(iBot)
|
|
SCGW_Bot[iBot].eStateAI = SCGW_BOT_STATE_AI_COLLECT_PICKUP
|
|
// SCGW_Bot[iBot].bTaskComplete = TRUE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_SHOOT_INPUT_BOT - iBot ",iBot," SCGW_PROCESS_BOT_AI_SHOULD_COLLECT_PICKUP")
|
|
ELIF SCGW_Bot[iBot].eStateAI != SCGW_BOT_STATE_AI_CAPTURE_BUILDING AND SCGW_Bot[iBot].bTaskComplete
|
|
SCGW_Bot[iBot].eStateAI = SCGW_BOT_STATE_AI_CAPTURE_BUILDING
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [AC] SCGW_PROCESS_SHOOT_INPUT_BOT - iBot ",iBot," SCGW_BOT_STATE_AI_CAPTURE_BUILDING")
|
|
ENDIF
|
|
|
|
SWITCH SCGW_Bot[iBot].eStateAI
|
|
CASE SCGW_BOT_STATE_AI_CAPTURE_BUILDING
|
|
SCGW_PROCESS_BOT_AI_CAPTURE_BUILDING(iBot)
|
|
BREAK
|
|
CASE SCGW_BOT_STATE_AI_AVOID_VEHICLE
|
|
SCGW_PROCESS_BOT_AI_AVOID_VEHICLE(iBot)
|
|
BREAK
|
|
CASE SCGW_BOT_STATE_AI_COLLECT_PICKUP
|
|
SCGW_PROCESS_BOT_AI_COLLECT_PICKUP(iBot)
|
|
BREAK
|
|
CASE SCGW_BOT_STATE_AI_SUDDEN_DEATH
|
|
SCGW_PROCESS_BOT_AI_SUDDEN_DEATH(iBot)
|
|
BREAK
|
|
ENDSWITCH
|
|
IF SCGW_Bot[iBot].iTargetPosX = -1
|
|
SCGW_Bot[iBot].iTargetPosX = GET_RANDOM_INT_IN_RANGE(0,ciSCGW_MAX_PLAYER_POSITIONS_X/2)*2
|
|
ENDIF
|
|
IF SCGW_Bot[iBot].iTargetPosY = -1
|
|
SCGW_Bot[iBot].iTargetPosY = GET_RANDOM_INT_IN_RANGE(0,ciSCGW_MAX_PLAYER_POSITIONS_Y/2)*2
|
|
ENDIF
|
|
|
|
SCGW_Bot[iBot].bTaskComplete = FALSE
|
|
ELSE
|
|
IF (SCGW_Bot[iBot].SCGW_UF_Player.iLastMovementTime + SCGW_GET_PLAYER_MOVEMENT_TIME(iBot) < NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
AND IS_BIT_SET(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED))
|
|
IF SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition = SCGW_GET_POSITION_FROM_COORDS(SCGW_Bot[iBot].iTargetPosX,SCGW_Bot[iBot].iTargetPosY)
|
|
OR SCGW_Bot[iBot].iTargetPosX = -1 AND SCGW_Bot[iBot].iTargetPosY = -1
|
|
SCGW_Bot[iBot].bTaskComplete = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Main processing for player input
|
|
PROC SCGW_PROCESS_INPUT()
|
|
|
|
SCGW_PROCESS_MOVEMENT_INPUT()
|
|
|
|
SCGW_PROCESS_TURN_INPUT()
|
|
|
|
SCGW_PROCESS_SHOOT_INPUT()
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_INPUT_BOT(INT iBot)
|
|
|
|
SCGW_PROCESS_BOT_AI(iBot)
|
|
|
|
SCGW_PROCESS_MOVEMENT_INPUT_BOT(iBot)
|
|
|
|
SCGW_PROCESS_TURN_INPUT_BOT(iBot)
|
|
|
|
SCGW_PROCESS_SHOOT_INPUT_BOT(iBot)
|
|
|
|
ENDPROC
|
|
|
|
// ------------------------------ PICKUP PROCESSING ------------------------------
|
|
|
|
/// PURPOSE:
|
|
/// Sets the pickup as being collected by a player
|
|
/// HOST ONLY
|
|
PROC SCGW_REMOVE_COLLECTED_PICKUP(INT iPickupIndex)
|
|
|
|
IF !sSCGWData.sLocalPlayer.bIsHost
|
|
EXIT
|
|
ENDIF
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_REMOVE_COLLECTED_PICKUP - Removing collected pickup: ", iPickupIndex)
|
|
SCGW_ServerBD.sPickups[iPickupIndex].iSpawnedPickupType = ciSCGW_PICKUPS_NONE
|
|
SCGW_ServerBD.sPickups[iPickupIndex].iSpawnedPickupLocation = -1
|
|
SCGW_ServerBD.sPickups[iPickupIndex].iSpawnedPickupSpawnTime = -HIGHEST_INT
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processes the spawning of pickups
|
|
/// HOST ONLY
|
|
PROC SCGW_PROCESS_SERVER_PICKUPS(BOOL bForceSpawn = FALSE, BOOL bSuddenDeath = FALSE)
|
|
|
|
IF !sSCGWData.sLocalPlayer.bIsHost
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF SCGW_ServerBD.bSuddenDeath
|
|
AND NOT bForceSpawn
|
|
EXIT
|
|
ENDIF
|
|
|
|
INT i
|
|
|
|
FOR i = 0 TO ciSCGW_MAX_SPAWNED_PICKUPS - 1
|
|
IF SCGW_ServerBD.sPickups[i].iSpawnedPickupSpawnTime = -HIGHEST_INT
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF (NATIVE_TO_INT(GET_NETWORK_TIME()) < SCGW_ServerBD.sPickups[i].iSpawnedPickupSpawnTime + ciSCGW_PICKUP_DURATION)
|
|
RELOOP
|
|
ENDIF
|
|
|
|
SCGW_ServerBD.sPickups[i].iSpawnedPickupLocation = -1
|
|
SCGW_ServerBD.sPickups[i].iSpawnedPickupType = ciSCGW_PICKUPS_NONE
|
|
SCGW_ServerBD.sPickups[i].iSpawnedPickupSpawnTime = -HIGHEST_INT
|
|
ENDFOR
|
|
|
|
IF (NATIVE_TO_INT(GET_NETWORK_TIME()) < SCGW_ServerBD.iLastPickupSpawnTime + ciSCGW_PICKUP_SPAWN_INTERVAL)
|
|
AND NOT bForceSpawn
|
|
EXIT
|
|
ENDIF
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_SERVER_PICKUPS - SPAWNING NEW PICKUPS")
|
|
|
|
SCGW_ServerBD.iLastPickupSpawnTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
|
|
IF bSuddenDeath
|
|
//Sudden Death
|
|
SCGW_SPAWN_SUDDEN_DEATH_PICKUPS()
|
|
ELIF NATIVE_TO_INT(GET_NETWORK_TIME()) - SCGW_ServerBD.iStartTime < ciSCGW_PICKUP_SPAWN_INTERVAL
|
|
//First Spawn
|
|
SCGW_SPAWN_STARTING_PICKUPS()
|
|
ELIF NATIVE_TO_INT(GET_NETWORK_TIME()) - SCGW_ServerBD.iStartTime >= ciSCGW_PICKUP_SPAWN_INTERVAL
|
|
AND NATIVE_TO_INT(GET_NETWORK_TIME()) - SCGW_ServerBD.iStartTime < (ciSCGW_MATCH_LENGTH / 2)
|
|
//Mid Game
|
|
SCGW_SPAWN_MID_GAME_PICKUPS()
|
|
ELIF NATIVE_TO_INT(GET_NETWORK_TIME()) - SCGW_ServerBD.iStartTime < ciSCGW_MATCH_LENGTH - ciSCGW_PICKUP_DURATION
|
|
//Late Game
|
|
SCGW_SPAWN_LATE_GAME_PICKUPS()
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
// ------------------------------ PLAYER PROCESSING ------------------------------
|
|
|
|
/// PURPOSE:
|
|
/// Updates the player state
|
|
PROC SCGW_SET_PLAYER_STATE(SCGW_PLAYER_STATE eNewState)
|
|
|
|
IF sSCGWData.sLocalPlayer.iLocalPart = -1
|
|
EXIT
|
|
ENDIF
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SET_PLAYER_STATE - State changed from ",
|
|
SCGW_DEBUG_GET_PLAYER_STATE_AS_STRING(SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].eCurrentPlayerState), " to ", SCGW_DEBUG_GET_PLAYER_STATE_AS_STRING(eNewState))
|
|
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].eCurrentPlayerState = eNewState
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_SET_PLAYER_STATE_BOT(INT iBot, SCGW_PLAYER_STATE eNewState)
|
|
|
|
IF iBot = -1
|
|
EXIT
|
|
ENDIF
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SET_PLAYER_STATE_BOT - State changed from ",
|
|
SCGW_DEBUG_GET_PLAYER_STATE_AS_STRING(SCGW_Bot[iBot].SCGW_player.eCurrentPlayerState), " to ", SCGW_DEBUG_GET_PLAYER_STATE_AS_STRING(eNewState))
|
|
|
|
SCGW_Bot[iBot].SCGW_player.eCurrentPlayerState = eNewState
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Updates the player's health by iHealthChange
|
|
PROC SCGW_UPDATE_PLAYER_HEALTH(INT iHealthChange, BOOL bHitByCar = FALSE)
|
|
|
|
INT iNewHealth = SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iHealth + iHealthChange
|
|
|
|
IF iNewHealth > ciSCGW_MAX_PLAYER_HEALTH
|
|
iNewHealth = ciSCGW_MAX_PLAYER_HEALTH
|
|
ELIF iNewHealth <= 0
|
|
iNewHealth = 0
|
|
IF SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].eCurrentPlayerState = SCGW_PLAYER_STATE_ALIVE
|
|
SCGW_SET_PLAYER_STATE(SCGW_PLAYER_STATE_DEAD)
|
|
SET_BIT(sSCGWData.iLocalBS, ciSCGW_LOCALBS_DIED_THIS_ROUND)
|
|
SCGW_PLAY_LOCAL_PLAYER_DEATH_SOUND("Death_Bleeps")
|
|
g_sCasinoArcadeStreetCrimeVars.ePlayerState = CASINO_ARCADE_STREET_CRIME_PLAYER_STATE_DEAD
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF iNewHealth != SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iHealth
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iHealth = iNewHealth
|
|
ENDIF
|
|
|
|
IF iHealthChange < 0
|
|
BROADCAST_SCRIPT_EVENT_SCGW_MINIGAME_DAMAGED(sSCGWData.sLocalPlayer.iLocalPart, SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].eCurrentPlayerState != SCGW_PLAYER_STATE_ALIVE, bHitByCar)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_UPDATE_PLAYER_HEALTH_BOT(INT iBot, INT iHealthChange, BOOL bHitByCar = FALSE)
|
|
|
|
INT iNewHealth = SCGW_Bot[iBot].SCGW_player.iHealth + iHealthChange
|
|
|
|
IF iNewHealth > ciSCGW_MAX_PLAYER_HEALTH
|
|
iNewHealth = ciSCGW_MAX_PLAYER_HEALTH
|
|
ELIF iNewHealth <= 0
|
|
iNewHealth = 0
|
|
IF SCGW_Bot[iBot].SCGW_player.eCurrentPlayerState = SCGW_PLAYER_STATE_ALIVE
|
|
SCGW_SET_PLAYER_STATE_BOT(iBot,SCGW_PLAYER_STATE_DEAD)
|
|
// SET_BIT(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_DIED_THIS_ROUND)
|
|
SCGW_PLAY_LOCAL_PLAYER_DEATH_SOUND("Death_Bleeps")
|
|
// g_sCasinoArcadeStreetCrimeVars.ePlayerState = CASINO_ARCADE_STREET_CRIME_PLAYER_STATE_DEAD
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF iNewHealth != SCGW_Bot[iBot].SCGW_player.iHealth
|
|
SCGW_Bot[iBot].SCGW_player.iHealth = iNewHealth
|
|
ENDIF
|
|
|
|
IF iHealthChange < 0
|
|
BROADCAST_SCRIPT_EVENT_SCGW_MINIGAME_DAMAGED(iBot, SCGW_Bot[iBot].SCGW_player.eCurrentPlayerState != SCGW_PLAYER_STATE_ALIVE, bHitByCar)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Returns whether or not the pickup can be used by the player
|
|
FUNC BOOL SCGW_CAN_PLAYER_USE_PICKUP(INT iPickupIndex)
|
|
|
|
SWITCH SCGW_ServerBD.sPickups[iPickupIndex].iSpawnedPickupType
|
|
|
|
CASE ciSCGW_PICKUPS_HEALTH
|
|
IF SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iHealth = ciSCGW_MAX_PLAYER_HEALTH
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_SPEED
|
|
CASE ciSCGW_PICKUPS_GANG_CARS
|
|
//NEVER BLOCKED
|
|
RETURN TRUE
|
|
|
|
CASE ciSCGW_PICKUPS_PISTOL
|
|
IF SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iEquippedWeaponType = ciSCGW_WEAPON_PISTOL
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_UZI
|
|
IF SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iEquippedWeaponType = ciSCGW_WEAPON_UZI
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_AK47
|
|
IF SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iEquippedWeaponType = ciSCGW_WEAPON_AK47
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_ROCKET
|
|
IF SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iEquippedWeaponType = ciSCGW_WEAPON_ROCKET
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_SHOTGUN
|
|
IF SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iEquippedWeaponType = ciSCGW_WEAPON_SHOTGUN
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN TRUE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SCGW_CAN_PLAYER_USE_PICKUP_BOT(INT iPickupIndex, INT iBot)
|
|
|
|
SWITCH SCGW_ServerBD.sPickups[iPickupIndex].iSpawnedPickupType
|
|
|
|
CASE ciSCGW_PICKUPS_HEALTH
|
|
IF SCGW_Bot[iBot].SCGW_player.iHealth = ciSCGW_MAX_PLAYER_HEALTH
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_SPEED
|
|
CASE ciSCGW_PICKUPS_GANG_CARS
|
|
//NEVER BLOCKED
|
|
RETURN TRUE
|
|
|
|
CASE ciSCGW_PICKUPS_PISTOL
|
|
IF SCGW_Bot[iBot].SCGW_player.iEquippedWeaponType = ciSCGW_WEAPON_PISTOL
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_UZI
|
|
IF SCGW_Bot[iBot].SCGW_player.iEquippedWeaponType = ciSCGW_WEAPON_UZI
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_AK47
|
|
IF SCGW_Bot[iBot].SCGW_player.iEquippedWeaponType = ciSCGW_WEAPON_AK47
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_ROCKET
|
|
IF SCGW_Bot[iBot].SCGW_player.iEquippedWeaponType = ciSCGW_WEAPON_ROCKET
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_SHOTGUN
|
|
IF SCGW_Bot[iBot].SCGW_player.iEquippedWeaponType = ciSCGW_WEAPON_SHOTGUN
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN TRUE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Applies a collected pickup's effect to the player
|
|
/// PARAMS:
|
|
/// iPickupIndex -
|
|
PROC SCGW_PROCESS_PICKUP_COLLECTED(INT iPickupIndex)
|
|
|
|
VECTOR_2D vPickupPosition = SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_ServerBD.sPickups[iPickupIndex].iSpawnedPickupLocation)
|
|
|
|
sArcadePlayStats.powerUps ++
|
|
|
|
SWITCH SCGW_ServerBD.sPickups[iPickupIndex].iSpawnedPickupType
|
|
|
|
CASE ciSCGW_PICKUPS_HEALTH
|
|
SCGW_PLAY_FIRE_AND_FORGET_GLOBAL_SOUND("Pickup_Health", vPickupPosition)
|
|
SCGW_UPDATE_PLAYER_HEALTH(ciSCGW_HEALTH_PICKUP_VALUE)
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_SPEED
|
|
SCGW_PLAY_FIRE_AND_FORGET_GLOBAL_SOUND("Pickup_Speed", vPickupPosition)
|
|
sSCGWData.sLocalPlayer.iSpeedBoostRemainingMoves += ciSCGW_SPEED_PICKUP_VALUE
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_GANG_CARS
|
|
SCGW_PLAY_FIRE_AND_FORGET_GLOBAL_SOUND("Pickup_Collect_Transport", vPickupPosition)
|
|
BROADCAST_SCGW_MINIGAME_REQUEST_CARS(SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iPlayerPosition, SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iGang)
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_PISTOL
|
|
SCGW_PLAY_FIRE_AND_FORGET_GLOBAL_SOUND("Pickup_Collect_Weapon", vPickupPosition)
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iEquippedWeaponType = ciSCGW_WEAPON_PISTOL
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_UZI
|
|
SCGW_PLAY_FIRE_AND_FORGET_GLOBAL_SOUND("Pickup_Collect_Weapon", vPickupPosition)
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iEquippedWeaponType = ciSCGW_WEAPON_UZI
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_AK47
|
|
SCGW_PLAY_FIRE_AND_FORGET_GLOBAL_SOUND("Pickup_Collect_Weapon", vPickupPosition)
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iEquippedWeaponType = ciSCGW_WEAPON_AK47
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_ROCKET
|
|
SCGW_PLAY_FIRE_AND_FORGET_GLOBAL_SOUND("Pickup_Collect_Weapon", vPickupPosition)
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iEquippedWeaponType = ciSCGW_WEAPON_ROCKET
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_SHOTGUN
|
|
SCGW_PLAY_FIRE_AND_FORGET_GLOBAL_SOUND("Pickup_Collect_Weapon", vPickupPosition)
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iEquippedWeaponType = ciSCGW_WEAPON_SHOTGUN
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_BIT_SET(sSCGWData.iHelpTextBitset, ciSCGW_HELP_BS_SHOOTING_HELP_SHOWN)
|
|
AND SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iEquippedWeaponType != ciSCGW_WEAPON_NONE
|
|
SET_BIT(sSCGWData.iHelpTextBitset, ciSCGW_HELP_BS_SHOOTING_HELP_SHOWN)
|
|
SCGW_TRIGGER_HELP_TEXT("SCGW_H_SHOOT", ciSCGW_DEFAULT_HELP_TEXT_TIME)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_PICKUP_COLLECTED_BOT(INT iPickupIndex, INT iBot)
|
|
|
|
// VECTOR_2D vPickupPosition = SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_ServerBD.sPickups[iPickupIndex].iSpawnedPickupLocation)
|
|
|
|
sArcadePlayStats.powerUps ++
|
|
|
|
SWITCH SCGW_ServerBD.sPickups[iPickupIndex].iSpawnedPickupType
|
|
|
|
CASE ciSCGW_PICKUPS_HEALTH
|
|
// SCGW_PLAY_FIRE_AND_FORGET_GLOBAL_SOUND("Pickup_Health", vPickupPosition)
|
|
SCGW_UPDATE_PLAYER_HEALTH_BOT(iBot,ciSCGW_HEALTH_PICKUP_VALUE)
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_SPEED
|
|
// SCGW_PLAY_FIRE_AND_FORGET_GLOBAL_SOUND("Pickup_Speed", vPickupPosition)
|
|
sSCGWData.sLocalPlayer.iSpeedBoostRemainingMoves += ciSCGW_SPEED_PICKUP_VALUE
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_GANG_CARS
|
|
// SCGW_PLAY_FIRE_AND_FORGET_GLOBAL_SOUND("Pickup_Collect_Transport", vPickupPosition)
|
|
BROADCAST_SCGW_MINIGAME_REQUEST_CARS(SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition, SCGW_Bot[iBot].SCGW_player.iGang)
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_PISTOL
|
|
// SCGW_PLAY_FIRE_AND_FORGET_GLOBAL_SOUND("Pickup_Collect_Weapon", vPickupPosition)
|
|
SCGW_Bot[iBot].SCGW_player.iEquippedWeaponType = ciSCGW_WEAPON_PISTOL
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_UZI
|
|
// SCGW_PLAY_FIRE_AND_FORGET_GLOBAL_SOUND("Pickup_Collect_Weapon", vPickupPosition)
|
|
SCGW_Bot[iBot].SCGW_player.iEquippedWeaponType = ciSCGW_WEAPON_UZI
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_AK47
|
|
// SCGW_PLAY_FIRE_AND_FORGET_GLOBAL_SOUND("Pickup_Collect_Weapon", vPickupPosition)
|
|
SCGW_Bot[iBot].SCGW_player.iEquippedWeaponType = ciSCGW_WEAPON_AK47
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_ROCKET
|
|
// SCGW_PLAY_FIRE_AND_FORGET_GLOBAL_SOUND("Pickup_Collect_Weapon", vPickupPosition)
|
|
SCGW_Bot[iBot].SCGW_player.iEquippedWeaponType = ciSCGW_WEAPON_ROCKET
|
|
BREAK
|
|
|
|
CASE ciSCGW_PICKUPS_SHOTGUN
|
|
// SCGW_PLAY_FIRE_AND_FORGET_GLOBAL_SOUND("Pickup_Collect_Weapon", vPickupPosition)
|
|
SCGW_Bot[iBot].SCGW_player.iEquippedWeaponType = ciSCGW_WEAPON_SHOTGUN
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_BIT_SET(sSCGWData.iHelpTextBitset, ciSCGW_HELP_BS_SHOOTING_HELP_SHOWN)
|
|
AND SCGW_Bot[iBot].SCGW_player.iEquippedWeaponType != ciSCGW_WEAPON_NONE
|
|
// SET_BIT(sSCGWData.iHelpTextBitset, ciSCGW_HELP_BS_SHOOTING_HELP_SHOWN)
|
|
// SCGW_TRIGGER_HELP_TEXT("SCGW_H_SHOOT", ciSCGW_DEFAULT_HELP_TEXT_TIME)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Initialises the player's starting position based on gang
|
|
PROC SCGW_SET_LOCAL_PLAYER_START_POSITION()
|
|
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iPlayerPosition = SCGW_GET_POSITION_FROM_COORDS(sSCGWData.sPositionData.iPlayerStartPositions[SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iGang][ciSCGW_PLAYER_GRID_AXIS_X], sSCGWData.sPositionData.iPlayerStartPositions[SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iGang][ciSCGW_PLAYER_GRID_AXIS_Y])
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iPreviousPlayerPosition = SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iPlayerPosition
|
|
|
|
IF sSCGWData.sPositionData.iPlayerStartPositions[SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iGang][ciSCGW_PLAYER_GRID_AXIS_Y] = 0
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iFacingDirection = ciSCGW_GRID_DIRECTION_DOWN
|
|
ELSE
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iFacingDirection = ciSCGW_GRID_DIRECTION_UP
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_SET_LOCAL_PLAYER_START_POSITION_BOT(INT iBot)
|
|
|
|
SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition = SCGW_GET_POSITION_FROM_COORDS(sSCGWData.sPositionData.iPlayerStartPositions[SCGW_Bot[iBot].SCGW_player.iGang][ciSCGW_PLAYER_GRID_AXIS_X], sSCGWData.sPositionData.iPlayerStartPositions[SCGW_Bot[iBot].SCGW_player.iGang][ciSCGW_PLAYER_GRID_AXIS_Y])
|
|
SCGW_Bot[iBot].SCGW_UF_Player.iPreviousPlayerPosition = SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition
|
|
|
|
IF sSCGWData.sPositionData.iPlayerStartPositions[SCGW_Bot[iBot].SCGW_player.iGang][ciSCGW_PLAYER_GRID_AXIS_Y] = 0
|
|
SCGW_Bot[iBot].SCGW_UF_Player.iFacingDirection = ciSCGW_GRID_DIRECTION_DOWN
|
|
ELSE
|
|
SCGW_Bot[iBot].SCGW_UF_Player.iFacingDirection = ciSCGW_GRID_DIRECTION_UP
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Returns the best respawn position for the local player
|
|
/// Picks a corner the player owns with no players or cars if possible
|
|
FUNC INT SCGW_GET_BEST_RESPAWN_POSITION()
|
|
|
|
INT iBestPosition = -1
|
|
INT iBestScore = -1
|
|
|
|
INT i, j
|
|
INT iPlayerXBitSet, iPlayerYBitSet, iCarXBitSet, iCarYBitSet
|
|
INT iTempPosX, iTempPosY
|
|
|
|
FOR i = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
|
|
IF i = sSCGWData.sLocalPlayer.iLocalPart
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF NOT NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(i))
|
|
AND NOT SCGW_Bot[i].bActive
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[i].iGang = ciSCGW_GANG_NONE
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_IS_PLAYER_DEAD(i)
|
|
RELOOP
|
|
ENDIF
|
|
|
|
SCGW_GET_POSITION_COORDS(SCGW_UF_PlayerBD[i].iPlayerPosition, iTempPosX, iTempPosY)
|
|
SET_BIT(iPlayerXBitSet, iTempPosX)
|
|
SET_BIT(iPlayerYBitSet, iTempPosY)
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO ciSCGW_MAX_ACTIVE_VEHICLES - 1
|
|
|
|
IF SCGW_ServerBD.sVehicles[i].iVehicleType = -1
|
|
RELOOP
|
|
ENDIF
|
|
|
|
SCGW_GET_POSITION_COORDS(SCGW_ServerBD.sVehicles[i].iVehicleOrigin, iTempPosX, iTempPosY)
|
|
|
|
IF SCGW_ServerBD.sVehicles[i].iVehicleDirection = ciSCGW_GRID_DIRECTION_UP
|
|
OR SCGW_ServerBD.sVehicles[i].iVehicleDirection = ciSCGW_GRID_DIRECTION_DOWN
|
|
SET_BIT(iCarXBitSet, iTempPosX)
|
|
ELIF SCGW_ServerBD.sVehicles[i].iVehicleDirection = ciSCGW_GRID_DIRECTION_LEFT
|
|
OR SCGW_ServerBD.sVehicles[i].iVehicleDirection = ciSCGW_GRID_DIRECTION_RIGHT
|
|
SET_BIT(iCarYBitSet, iTempPosY)
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
INT iCurrentPosition = -1
|
|
INT iCurrentScore = 0
|
|
FOR i = 0 TO ciSCGW_MAX_PLAYER_POSITIONS_X - 1
|
|
FOR j = 0 TO ciSCGW_MAX_PLAYER_POSITIONS_Y - 1
|
|
|
|
iCurrentScore = ciSCGW_RESPAWNING_TOTAL_SCORE
|
|
iCurrentPosition = SCGW_GET_POSITION_FROM_COORDS(i, j)
|
|
|
|
IF NOT( IS_LONG_BIT_SET(SCGW_ServerBD.iPositionOwnershipBS[SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iGang][ciSCGW_OWNERSHIP_LINK_DOWN], iCurrentPosition)
|
|
OR IS_LONG_BIT_SET(SCGW_ServerBD.iPositionOwnershipBS[SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iGang][ciSCGW_OWNERSHIP_LINK_RIGHT], iCurrentPosition))
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF IS_BIT_SET(iCarXBitSet, i)
|
|
iCurrentScore -= ciSCGW_RESPAWNING_NO_CARS_X_SCORE
|
|
ENDIF
|
|
|
|
IF IS_BIT_SET(iCarYBitSet, j)
|
|
iCurrentScore -= ciSCGW_RESPAWNING_NO_CARS_Y_SCORE
|
|
ENDIF
|
|
|
|
IF IS_BIT_SET(iPlayerXBitSet, i)
|
|
iCurrentScore -= ciSCGW_RESPAWNING_NO_PLAYERS_X_SCORE
|
|
ENDIF
|
|
|
|
IF IS_BIT_SET(iPlayerYBitSet, j)
|
|
iCurrentScore -= ciSCGW_RESPAWNING_NO_PLAYERS_Y_SCORE
|
|
ENDIF
|
|
|
|
IF iCurrentScore = ciSCGW_RESPAWNING_TOTAL_SCORE
|
|
RETURN iCurrentPosition
|
|
ENDIF
|
|
|
|
IF iCurrentScore > iBestScore
|
|
iBestScore = iCurrentScore
|
|
iBestPosition = iCurrentPosition
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
ENDFOR
|
|
|
|
RETURN iBestPosition
|
|
|
|
ENDFUNC
|
|
|
|
FUNC INT SCGW_GET_BEST_RESPAWN_POSITION_BOT(INT iBot)
|
|
|
|
INT iBestPosition = -1
|
|
INT iBestScore = -1
|
|
|
|
INT i, j
|
|
INT iPlayerXBitSet, iPlayerYBitSet, iCarXBitSet, iCarYBitSet
|
|
INT iTempPosX, iTempPosY
|
|
|
|
FOR i = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
|
|
IF i = iBot
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF NOT NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(i))
|
|
AND NOT SCGW_Bot[i].bActive
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[i].iGang = ciSCGW_GANG_NONE
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_IS_PLAYER_DEAD(i)
|
|
RELOOP
|
|
ENDIF
|
|
|
|
SCGW_GET_POSITION_COORDS(SCGW_UF_PlayerBD[i].iPlayerPosition, iTempPosX, iTempPosY)
|
|
SET_BIT(iPlayerXBitSet, iTempPosX)
|
|
SET_BIT(iPlayerYBitSet, iTempPosY)
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO ciSCGW_MAX_ACTIVE_VEHICLES - 1
|
|
|
|
IF SCGW_ServerBD.sVehicles[i].iVehicleType = -1
|
|
RELOOP
|
|
ENDIF
|
|
|
|
SCGW_GET_POSITION_COORDS(SCGW_ServerBD.sVehicles[i].iVehicleOrigin, iTempPosX, iTempPosY)
|
|
|
|
IF SCGW_ServerBD.sVehicles[i].iVehicleDirection = ciSCGW_GRID_DIRECTION_UP
|
|
OR SCGW_ServerBD.sVehicles[i].iVehicleDirection = ciSCGW_GRID_DIRECTION_DOWN
|
|
SET_BIT(iCarXBitSet, iTempPosX)
|
|
ELIF SCGW_ServerBD.sVehicles[i].iVehicleDirection = ciSCGW_GRID_DIRECTION_LEFT
|
|
OR SCGW_ServerBD.sVehicles[i].iVehicleDirection = ciSCGW_GRID_DIRECTION_RIGHT
|
|
SET_BIT(iCarYBitSet, iTempPosY)
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
INT iCurrentPosition = -1
|
|
INT iCurrentScore = 0
|
|
FOR i = 0 TO ciSCGW_MAX_PLAYER_POSITIONS_X - 1
|
|
FOR j = 0 TO ciSCGW_MAX_PLAYER_POSITIONS_Y - 1
|
|
|
|
iCurrentScore = ciSCGW_RESPAWNING_TOTAL_SCORE
|
|
iCurrentPosition = SCGW_GET_POSITION_FROM_COORDS(i, j)
|
|
|
|
IF NOT( IS_LONG_BIT_SET(SCGW_ServerBD.iPositionOwnershipBS[SCGW_Bot[iBot].SCGW_player.iGang][ciSCGW_OWNERSHIP_LINK_DOWN], iCurrentPosition)
|
|
OR IS_LONG_BIT_SET(SCGW_ServerBD.iPositionOwnershipBS[SCGW_Bot[iBot].SCGW_player.iGang][ciSCGW_OWNERSHIP_LINK_RIGHT], iCurrentPosition))
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF IS_BIT_SET(iCarXBitSet, i)
|
|
iCurrentScore -= ciSCGW_RESPAWNING_NO_CARS_X_SCORE
|
|
ENDIF
|
|
|
|
IF IS_BIT_SET(iCarYBitSet, j)
|
|
iCurrentScore -= ciSCGW_RESPAWNING_NO_CARS_Y_SCORE
|
|
ENDIF
|
|
|
|
IF IS_BIT_SET(iPlayerXBitSet, i)
|
|
iCurrentScore -= ciSCGW_RESPAWNING_NO_PLAYERS_X_SCORE
|
|
ENDIF
|
|
|
|
IF IS_BIT_SET(iPlayerYBitSet, j)
|
|
iCurrentScore -= ciSCGW_RESPAWNING_NO_PLAYERS_Y_SCORE
|
|
ENDIF
|
|
|
|
IF iCurrentScore = ciSCGW_RESPAWNING_TOTAL_SCORE
|
|
RETURN iCurrentPosition
|
|
ENDIF
|
|
|
|
IF iCurrentScore > iBestScore
|
|
iBestScore = iCurrentScore
|
|
iBestPosition = iCurrentPosition
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
ENDFOR
|
|
|
|
RETURN iBestPosition
|
|
|
|
ENDFUNC
|
|
/// PURPOSE:
|
|
/// Initialises the player's respawn position based on owned territory
|
|
PROC SCGW_SET_RESPAWN_POSITION()
|
|
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iPlayerPosition = SCGW_GET_BEST_RESPAWN_POSITION()
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iPreviousPlayerPosition = SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iPlayerPosition
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_SET_RESPAWN_POSITION_BOT(INT iBot)
|
|
|
|
SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition = SCGW_GET_BEST_RESPAWN_POSITION_BOT(iBot)
|
|
SCGW_Bot[iBot].SCGW_UF_Player.iPreviousPlayerPosition = SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Returns true if the player has terriroty they can respawn into
|
|
FUNC BOOL SCGW_CAN_PLAYER_RESPAWN(INT iParticipant)
|
|
|
|
IF IS_BIT_SET(sSCGWData.iLocalBS, ciSCGW_LOCALBS_STARTED_RESPAWNING)
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[iParticipant].iGang = -1
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
IF SCGW_UF_ServerBD.iCurrentScore[SCGW_PlayerBD[iParticipant].iGang] = 0
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL SCGW_CAN_PLAYER_RESPAWN_BOT(INT iBot)
|
|
|
|
IF IS_BIT_SET(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_STARTED_RESPAWNING)
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
IF SCGW_Bot[iBot].SCGW_player.iGang = -1
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
IF SCGW_UF_ServerBD.iCurrentScore[SCGW_Bot[iBot].SCGW_player.iGang] = 0
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Respawns the local player at owned territory
|
|
/// TODO: checks to make sure spawn location is good
|
|
PROC SCGW_RESPAWN_LOCAL_PLAYER()
|
|
|
|
SCGW_SET_RESPAWN_POSITION()
|
|
SCGW_SET_PLAYER_STATE(SCGW_PLAYER_STATE_ALIVE)
|
|
SCGW_PLAY_LOCAL_PLAYER_DEATH_SOUND("Death_Resurrect")
|
|
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastRespawnTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iHealth = ciSCGW_MAX_PLAYER_HEALTH
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iEquippedWeaponType = ciSCGW_WEAPON_NONE
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].fMoveSpeed = cfSCGW_BASE_SPEED
|
|
sSCGWData.sLocalPlayer.iSpeedBoostRemainingMoves = 0
|
|
|
|
SCGW_SET_GLOBAL_PLAYER_STATE(CASINO_ARCADE_STREET_CRIME_PLAYER_STATE_PLAYING)
|
|
|
|
IF IS_BIT_SET(sSCGWData.iLocalBS, ciSCGW_LOCALBS_STARTED_RESPAWNING)
|
|
CLEAR_BIT(sSCGWData.iLocalBS, ciSCGW_LOCALBS_STARTED_RESPAWNING)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_RESPAWN_LOCAL_PLAYER_BOT(INT iBot)
|
|
|
|
SCGW_SET_RESPAWN_POSITION_BOT(iBot)
|
|
SCGW_SET_PLAYER_STATE_BOT(iBot,SCGW_PLAYER_STATE_ALIVE)
|
|
SCGW_PLAY_LOCAL_PLAYER_DEATH_SOUND("Death_Resurrect")
|
|
|
|
SCGW_Bot[iBot].SCGW_player.iLastRespawnTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
SCGW_Bot[iBot].SCGW_player.iHealth = ciSCGW_MAX_PLAYER_HEALTH
|
|
SCGW_Bot[iBot].SCGW_player.iEquippedWeaponType = ciSCGW_WEAPON_NONE
|
|
SCGW_Bot[iBot].SCGW_player.fMoveSpeed = cfSCGW_BASE_SPEED
|
|
sSCGWData.sLocalPlayer.iSpeedBoostRemainingMoves = 0
|
|
|
|
// SCGW_SET_GLOBAL_PLAYER_STATE(CASINO_ARCADE_STREET_CRIME_PLAYER_STATE_PLAYING)
|
|
|
|
IF IS_BIT_SET(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_STARTED_RESPAWNING)
|
|
CLEAR_BIT(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_STARTED_RESPAWNING)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processes respawning or blocking respawning when the local player is dead
|
|
PROC SCGW_PROCESS_LOCAL_PLAYER_RESPAWNING()
|
|
|
|
IF SCGW_UF_ServerBD.iCurrentScore[SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iGang] = 0
|
|
AND (NATIVE_TO_INT(GET_NETWORK_TIME()) - SCGW_ServerBD.iStartTime) > ciSCGW_ALLOW_TERRITORY_HELP_TIME
|
|
IF IS_BIT_SET(sSCGWData.iHelpTextBitset, ciSCGW_HELP_BS_MOVEMENT_HELP_SHOWN)
|
|
AND NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
|
|
AND NOT IS_BIT_SET(sSCGWData.iHelpTextBitset, ciSCGW_HELP_BS_RESPAWN_HELP_SHOWN)
|
|
SCGW_TRIGGER_HELP_TEXT("SCGW_H_RSPWN", ciSCGW_DEFAULT_HELP_TEXT_TIME)
|
|
SET_BIT(sSCGWData.iHelpTextBitset, ciSCGW_HELP_BS_RESPAWN_HELP_SHOWN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].eCurrentPlayerState != SCGW_PLAYER_STATE_DEAD
|
|
EXIT
|
|
ENDIF
|
|
|
|
SCGW_CLEAR_HELP_TEXT()
|
|
|
|
IF SCGW_ServerBD.bSuddenDeath
|
|
SCGW_SET_PLAYER_STATE(SCGW_PLAYER_STATE_CANT_RESPAWN)
|
|
SCGW_SET_GLOBAL_PLAYER_STATE(CASINO_ARCADE_STREET_CRIME_PLAYER_STATE_DEAD_CANT_RESPAWN)
|
|
ENDIF
|
|
|
|
IF SCGW_CAN_PLAYER_RESPAWN(sSCGWData.sLocalPlayer.iLocalPart)
|
|
IF NATIVE_TO_INT(GET_NETWORK_TIME()) >= SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastDamagedTime + ciSCGW_WASTED_TIME
|
|
AND NOT IS_BIT_SET(sSCGWData.iLocalBS, ciSCGW_LOCALBS_STARTED_RESPAWNING)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] - SCGW_PROCESS_LOCAL_PLAYER_RESPAWNING - ciSCGW_LOCALBS_STARTED_RESPAWNING")
|
|
SET_BIT(sSCGWData.iLocalBS, ciSCGW_LOCALBS_STARTED_RESPAWNING)
|
|
ENDIF
|
|
|
|
IF NATIVE_TO_INT(GET_NETWORK_TIME()) >= SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastDamagedTime + ciSCGW_RESPAWN_TIME
|
|
SCGW_RESPAWN_LOCAL_PLAYER()
|
|
ENDIF
|
|
ELSE
|
|
IF NATIVE_TO_INT(GET_NETWORK_TIME()) > SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastDamagedTime + ciSCGW_NO_RESPAWN_GRACE_PERIOD
|
|
AND NOT IS_BIT_SET(sSCGWData.iLocalBS, ciSCGW_LOCALBS_STARTED_RESPAWNING)
|
|
SCGW_SET_PLAYER_STATE(SCGW_PLAYER_STATE_CANT_RESPAWN)
|
|
SCGW_PLAY_LOCAL_PLAYER_DEATH_SOUND("Death_Dead")
|
|
SCGW_SET_GLOBAL_PLAYER_STATE(CASINO_ARCADE_STREET_CRIME_PLAYER_STATE_DEAD_CANT_RESPAWN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_LOCAL_PLAYER_RESPAWNING_BOT(INT iBot)
|
|
|
|
IF SCGW_UF_ServerBD.iCurrentScore[SCGW_Bot[iBot].SCGW_player.iGang] = 0
|
|
AND (NATIVE_TO_INT(GET_NETWORK_TIME()) - SCGW_ServerBD.iStartTime) > ciSCGW_ALLOW_TERRITORY_HELP_TIME
|
|
IF IS_BIT_SET(sSCGWData.iHelpTextBitset, ciSCGW_HELP_BS_MOVEMENT_HELP_SHOWN)
|
|
AND NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
|
|
AND NOT IS_BIT_SET(sSCGWData.iHelpTextBitset, ciSCGW_HELP_BS_RESPAWN_HELP_SHOWN)
|
|
// SCGW_TRIGGER_HELP_TEXT("SCGW_H_RSPWN", ciSCGW_DEFAULT_HELP_TEXT_TIME)
|
|
// SET_BIT(sSCGWData.iHelpTextBitset, ciSCGW_HELP_BS_RESPAWN_HELP_SHOWN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF SCGW_Bot[iBot].SCGW_player.eCurrentPlayerState != SCGW_PLAYER_STATE_DEAD
|
|
EXIT
|
|
ENDIF
|
|
|
|
// SCGW_CLEAR_HELP_TEXT()
|
|
|
|
IF SCGW_ServerBD.bSuddenDeath
|
|
SCGW_SET_PLAYER_STATE_BOT(iBot,SCGW_PLAYER_STATE_CANT_RESPAWN)
|
|
// SCGW_SET_GLOBAL_PLAYER_STATE(CASINO_ARCADE_STREET_CRIME_PLAYER_STATE_DEAD_CANT_RESPAWN)
|
|
ENDIF
|
|
|
|
IF SCGW_CAN_PLAYER_RESPAWN_BOT(iBot)
|
|
IF NATIVE_TO_INT(GET_NETWORK_TIME()) >= SCGW_Bot[iBot].SCGW_player.iLastDamagedTime + ciSCGW_WASTED_TIME
|
|
AND NOT IS_BIT_SET(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_STARTED_RESPAWNING)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] - SCGW_PROCESS_LOCAL_PLAYER_RESPAWNING - ciSCGW_LOCALBS_STARTED_RESPAWNING")
|
|
SET_BIT(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_STARTED_RESPAWNING)
|
|
ENDIF
|
|
|
|
IF NATIVE_TO_INT(GET_NETWORK_TIME()) >= SCGW_Bot[iBot].SCGW_player.iLastDamagedTime + ciSCGW_RESPAWN_TIME
|
|
SCGW_RESPAWN_LOCAL_PLAYER_BOT(iBot)
|
|
ENDIF
|
|
ELSE
|
|
IF NATIVE_TO_INT(GET_NETWORK_TIME()) > SCGW_Bot[iBot].SCGW_player.iLastDamagedTime + ciSCGW_NO_RESPAWN_GRACE_PERIOD
|
|
AND NOT IS_BIT_SET(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_STARTED_RESPAWNING)
|
|
SCGW_SET_PLAYER_STATE_BOT(iBot,SCGW_PLAYER_STATE_CANT_RESPAWN)
|
|
SCGW_PLAY_LOCAL_PLAYER_DEATH_SOUND("Death_Dead")
|
|
// SCGW_SET_GLOBAL_PLAYER_STATE(CASINO_ARCADE_STREET_CRIME_PLAYER_STATE_DEAD_CANT_RESPAWN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processes the position of player iParticipant
|
|
PROC SCGW_PROCESS_PLAYER_POSITION(INT iParticipant)
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] - SCGW_PROCESS_PLAYER_POSITION - iParticipant ",iParticipant)
|
|
INT iCurrentPlayerX, iCurrentPlayerY, iPreviousPlayerX, iPreviousPlayerY
|
|
SCGW_GET_POSITION_COORDS(SCGW_UF_PlayerBD[iParticipant].iPlayerPosition, iCurrentPlayerX, iCurrentPlayerY)
|
|
SCGW_GET_POSITION_COORDS(SCGW_UF_PlayerBD[iParticipant].iPreviousPlayerPosition, iPreviousPlayerX, iPreviousPlayerY)
|
|
VECTOR_2D vPlayerDestination = SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_UF_PlayerBD[iParticipant].iPlayerPosition)
|
|
VECTOR_2D vPreviousPlayerPosition = SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_UF_PlayerBD[iParticipant].iPreviousPlayerPosition)
|
|
FLOAT fAlpha = TO_FLOAT(NATIVE_TO_INT(GET_NETWORK_TIME()) - SCGW_UF_PlayerBD[iParticipant].iLastMovementTime) / (TO_FLOAT(SCGW_GET_PLAYER_MOVEMENT_TIME(iParticipant)))
|
|
|
|
IF fAlpha < 0.0
|
|
fAlpha = 0.0
|
|
ENDIF
|
|
|
|
IF iParticipant = sSCGWData.sLocalPlayer.iLocalPart
|
|
AND ((fAlpha >= 0.65 AND NOT IS_BIT_SET(sSCGWData.iLocalBS, ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED_HALF))
|
|
OR (fAlpha >= 0.8 AND NOT IS_BIT_SET(sSCGWData.iLocalBS, ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED)))
|
|
IF iPreviousPlayerX != iCurrentPlayerX
|
|
IF iPreviousPlayerX > iCurrentPlayerX
|
|
//Moving Left
|
|
BROADCAST_SCGW_MINIGAME_SIDE_CLAIMED(SCGW_UF_PlayerBD[iParticipant].iPlayerPosition, ciSCGW_OWNERSHIP_LINK_RIGHT, SCGW_PlayerBD[iParticipant].iGang)
|
|
ELSE
|
|
//Moving Right
|
|
INT iBit = SCGW_GET_POSITION_FROM_COORDS(iCurrentPlayerX - 1, iCurrentPlayerY)
|
|
BROADCAST_SCGW_MINIGAME_SIDE_CLAIMED(iBit, ciSCGW_OWNERSHIP_LINK_RIGHT, SCGW_PlayerBD[iParticipant].iGang)
|
|
ENDIF
|
|
ELIF iPreviousPlayerY != iCurrentPlayerY
|
|
IF iPreviousPlayerY > iCurrentPlayerY
|
|
//Moving Up
|
|
BROADCAST_SCGW_MINIGAME_SIDE_CLAIMED(SCGW_UF_PlayerBD[iParticipant].iPlayerPosition, ciSCGW_OWNERSHIP_LINK_DOWN, SCGW_PlayerBD[iParticipant].iGang)
|
|
ELSE
|
|
//Moving Down
|
|
INT iBit = SCGW_GET_POSITION_FROM_COORDS(iCurrentPlayerX, iCurrentPlayerY - 1)
|
|
BROADCAST_SCGW_MINIGAME_SIDE_CLAIMED(iBit, ciSCGW_OWNERSHIP_LINK_DOWN, SCGW_PlayerBD[iParticipant].iGang)
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT IS_BIT_SET(sSCGWData.iLocalBS, ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED_HALF)
|
|
SET_BIT(sSCGWData.iLocalBS, ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED_HALF)
|
|
ELSE
|
|
CLEAR_BIT(sSCGWData.iLocalBS, ciSCGW_LOCALBS_CURRENT_MOVE_DIRECTION_CHANGED)
|
|
SET_BIT(sSCGWData.iLocalBS, ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fAlpha > 0.85
|
|
OR fAlpha < 0.15
|
|
|
|
//Pickups
|
|
INT iPlayerPos
|
|
IF fAlpha > 0.85
|
|
iPlayerPos = SCGW_UF_PlayerBD[iParticipant].iPlayerPosition
|
|
ELSE
|
|
iPlayerPos = SCGW_UF_PlayerBD[iParticipant].iPreviousPlayerPosition
|
|
ENDIF
|
|
|
|
INT i
|
|
FOR i = 0 TO ciSCGW_MAX_SPAWNED_PICKUPS - 1
|
|
|
|
IF SCGW_ServerBD.sPickups[i].iSpawnedPickupType = ciSCGW_PICKUPS_NONE
|
|
IF IS_BIT_SET(sSCGWData.iHiddenPickupsBS, i)
|
|
CLEAR_BIT(sSCGWData.iHiddenPickupsBS, i)
|
|
ENDIF
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF NOT SCGW_CAN_PLAYER_USE_PICKUP(i)
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF NATIVE_TO_INT(GET_NETWORK_TIME()) - SCGW_ServerBD.sPickups[i].iSpawnedPickupSpawnTime < ciSCGW_PICKUP_COLLECTION_TIME
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF IS_BIT_SET(sSCGWData.iHiddenPickupsBS, i)
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF iPlayerPos = SCGW_ServerBD.sPickups[i].iSpawnedPickupLocation
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] - SCGW_UPDATE_PLAYER_POSITION - Player ", iParticipant, " picked up pickup ", i, " type ", SCGW_ServerBD.sPickups[i].iSpawnedPickupType, " at ", SCGW_ServerBD.sPickups[i].iSpawnedPickupLocation)
|
|
IF iParticipant = sSCGWData.sLocalPlayer.iLocalPart
|
|
SET_BIT(sSCGWData.iHiddenPickupsBS, i)
|
|
SCGW_PROCESS_PICKUP_COLLECTED(i)
|
|
SET_CONTROL_SHAKE(PLAYER_CONTROL, ciSCGW_VIB_PICKUP_DURATION, ciSCGW_VIB_PICKUP_FREQ)
|
|
BROADCAST_SCGW_MINIGAME_PICKUP_COLLECTED(i)
|
|
SCGW_SET_GLOBAL_THIS_FRAME_ACTION(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_COLLECTED_PICKUP)
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
ENDIF
|
|
|
|
IF fAlpha < 1.0
|
|
IF sSCGWData.sPlayers[iParticipant].vLastFramePlayerPosition.x < 0
|
|
AND sSCGWData.sPlayers[iParticipant].vLastFramePlayerPosition.y < 0
|
|
sSCGWData.sPlayers[iParticipant].vLastFramePlayerPosition = LERP_VECTOR_2D(vPreviousPlayerPosition, vPlayerDestination, fAlpha)
|
|
ELSE
|
|
sSCGWData.sPlayers[iParticipant].vLastFramePlayerPosition = sSCGWData.sPlayers[iParticipant].vActualPlayerPosition
|
|
ENDIF
|
|
sSCGWData.sPlayers[iParticipant].vActualPlayerPosition = LERP_VECTOR_2D(vPreviousPlayerPosition, vPlayerDestination, fAlpha)
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF sSCGWData.sPlayers[iParticipant].vLastFramePlayerPosition.x < 0
|
|
AND sSCGWData.sPlayers[iParticipant].vLastFramePlayerPosition.y < 0
|
|
sSCGWData.sPlayers[iParticipant].vLastFramePlayerPosition = vPlayerDestination
|
|
ELSE
|
|
sSCGWData.sPlayers[iParticipant].vLastFramePlayerPosition = sSCGWData.sPlayers[iParticipant].vActualPlayerPosition
|
|
ENDIF
|
|
sSCGWData.sPlayers[iParticipant].vActualPlayerPosition = vPlayerDestination
|
|
sSCGWData.sPlayers[iParticipant].iPlayerAnimFrame = 0
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_PLAYER_POSITION_BOT(INT iBot)
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] - SCGW_PROCESS_PLAYER_POSITION_BOT - iBot ",iBot)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] - SCGW_PROCESS_PLAYER_POSITION_BOT - SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition ",SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition)
|
|
INT iCurrentPlayerX, iCurrentPlayerY, iPreviousPlayerX, iPreviousPlayerY
|
|
SCGW_GET_POSITION_COORDS(SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition, iCurrentPlayerX, iCurrentPlayerY)
|
|
SCGW_GET_POSITION_COORDS(SCGW_Bot[iBot].SCGW_UF_Player.iPreviousPlayerPosition, iPreviousPlayerX, iPreviousPlayerY)
|
|
VECTOR_2D vPlayerDestination = SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition)
|
|
VECTOR_2D vPreviousPlayerPosition = SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_Bot[iBot].SCGW_UF_Player.iPreviousPlayerPosition)
|
|
FLOAT fAlpha = TO_FLOAT(NATIVE_TO_INT(GET_NETWORK_TIME()) - SCGW_Bot[iBot].SCGW_UF_Player.iLastMovementTime) / (TO_FLOAT(SCGW_GET_PLAYER_MOVEMENT_TIME_BOT(iBot)))
|
|
|
|
IF fAlpha < 0.0
|
|
fAlpha = 0.0
|
|
ENDIF
|
|
|
|
IF ((fAlpha >= 0.65 AND NOT IS_BIT_SET(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED_HALF))
|
|
OR (fAlpha >= 0.8 AND NOT IS_BIT_SET(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED)))
|
|
IF iPreviousPlayerX != iCurrentPlayerX
|
|
IF iPreviousPlayerX > iCurrentPlayerX
|
|
//Moving Left
|
|
BROADCAST_SCGW_MINIGAME_SIDE_CLAIMED(SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition, ciSCGW_OWNERSHIP_LINK_RIGHT, SCGW_Bot[iBot].SCGW_player.iGang)
|
|
ELSE
|
|
//Moving Right
|
|
INT iBit = SCGW_GET_POSITION_FROM_COORDS(iCurrentPlayerX - 1, iCurrentPlayerY)
|
|
BROADCAST_SCGW_MINIGAME_SIDE_CLAIMED(iBit, ciSCGW_OWNERSHIP_LINK_RIGHT, SCGW_Bot[iBot].SCGW_player.iGang)
|
|
ENDIF
|
|
ELIF iPreviousPlayerY != iCurrentPlayerY
|
|
IF iPreviousPlayerY > iCurrentPlayerY
|
|
//Moving Up
|
|
BROADCAST_SCGW_MINIGAME_SIDE_CLAIMED(SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition, ciSCGW_OWNERSHIP_LINK_DOWN, SCGW_Bot[iBot].SCGW_player.iGang)
|
|
ELSE
|
|
//Moving Down
|
|
INT iBit = SCGW_GET_POSITION_FROM_COORDS(iCurrentPlayerX, iCurrentPlayerY - 1)
|
|
BROADCAST_SCGW_MINIGAME_SIDE_CLAIMED(iBit, ciSCGW_OWNERSHIP_LINK_DOWN, SCGW_Bot[iBot].SCGW_player.iGang)
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT IS_BIT_SET(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED_HALF)
|
|
SET_BIT(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED_HALF)
|
|
ELSE
|
|
CLEAR_BIT(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_CURRENT_MOVE_DIRECTION_CHANGED)
|
|
SET_BIT(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fAlpha > 0.85
|
|
OR fAlpha < 0.15
|
|
//Pickups
|
|
INT iPlayerPos
|
|
IF fAlpha > 0.85
|
|
iPlayerPos = SCGW_Bot[iBot].SCGW_UF_Player.iPlayerPosition
|
|
ELSE
|
|
iPlayerPos = SCGW_Bot[iBot].SCGW_UF_Player.iPreviousPlayerPosition
|
|
ENDIF
|
|
|
|
INT i
|
|
FOR i = 0 TO ciSCGW_MAX_SPAWNED_PICKUPS - 1
|
|
|
|
IF SCGW_ServerBD.sPickups[i].iSpawnedPickupType = ciSCGW_PICKUPS_NONE
|
|
IF IS_BIT_SET(sSCGWData.iHiddenPickupsBS, i)
|
|
CLEAR_BIT(sSCGWData.iHiddenPickupsBS, i)
|
|
ENDIF
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF NOT SCGW_CAN_PLAYER_USE_PICKUP_BOT(i,iBot)
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF NATIVE_TO_INT(GET_NETWORK_TIME()) - SCGW_ServerBD.sPickups[i].iSpawnedPickupSpawnTime < ciSCGW_PICKUP_COLLECTION_TIME
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF IS_BIT_SET(sSCGWData.iHiddenPickupsBS, i)
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF iPlayerPos = SCGW_ServerBD.sPickups[i].iSpawnedPickupLocation
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] - SCGW_PROCESS_PLAYER_POSITION_BOT - Bot ", iBot, " picked up pickup ", i, " type ", SCGW_ServerBD.sPickups[i].iSpawnedPickupType, " at ", SCGW_ServerBD.sPickups[i].iSpawnedPickupLocation)
|
|
// IF iParticipant = sSCGWData.sLocalPlayer.iLocalPart;
|
|
SET_BIT(sSCGWData.iHiddenPickupsBS, i)
|
|
SCGW_PROCESS_PICKUP_COLLECTED_BOT(i,iBot)
|
|
BROADCAST_SCGW_MINIGAME_PICKUP_COLLECTED(i)
|
|
SCGW_SET_GLOBAL_THIS_FRAME_ACTION(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_COLLECTED_PICKUP)
|
|
// ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
ENDIF
|
|
|
|
IF fAlpha < 1.0
|
|
IF sSCGWData.sPlayers[iBot].vLastFramePlayerPosition.x < 0
|
|
AND sSCGWData.sPlayers[iBot].vLastFramePlayerPosition.y < 0
|
|
sSCGWData.sPlayers[iBot].vLastFramePlayerPosition = LERP_VECTOR_2D(vPreviousPlayerPosition, vPlayerDestination, fAlpha)
|
|
ELSE
|
|
sSCGWData.sPlayers[iBot].vLastFramePlayerPosition = sSCGWData.sPlayers[iBot].vActualPlayerPosition
|
|
ENDIF
|
|
sSCGWData.sPlayers[iBot].vActualPlayerPosition = LERP_VECTOR_2D(vPreviousPlayerPosition, vPlayerDestination, fAlpha)
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF sSCGWData.sPlayers[iBot].vLastFramePlayerPosition.x < 0
|
|
AND sSCGWData.sPlayers[iBot].vLastFramePlayerPosition.y < 0
|
|
sSCGWData.sPlayers[iBot].vLastFramePlayerPosition = vPlayerDestination
|
|
ELSE
|
|
sSCGWData.sPlayers[iBot].vLastFramePlayerPosition = sSCGWData.sPlayers[iBot].vActualPlayerPosition
|
|
ENDIF
|
|
sSCGWData.sPlayers[iBot].vActualPlayerPosition = vPlayerDestination
|
|
sSCGWData.sPlayers[iBot].iPlayerAnimFrame = 0
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processes the positions of all active players
|
|
PROC SCGW_PROCESS_PLAYER_POSITIONS()
|
|
|
|
INT iPlayerLoop = 0
|
|
FOR iPlayerLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
|
|
IF NOT NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iPlayerLoop))
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[iPlayerLoop].iGang = ciSCGW_GANG_NONE
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_IS_PLAYER_DEAD(iPlayerLoop)
|
|
sSCGWData.sPlayers[iPlayerLoop].vLastFramePlayerPosition = INIT_VECTOR_2D(-1,-1)
|
|
RELOOP
|
|
ENDIF
|
|
|
|
SCGW_PROCESS_PLAYER_POSITION(iPlayerLoop)
|
|
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_PLAYER_POSITIONS_BOT()
|
|
|
|
INT iBot = 0
|
|
FOR iBot = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
|
|
IF NOT SCGW_Bot[iBot].bActive
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] - SCGW_PROCESS_PLAYER_POSITIONS_BOT - NOT SCGW_Bot[iBot].bActive iBot ",iBot)
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_Bot[iBot].SCGW_player.iGang = ciSCGW_GANG_NONE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] - SCGW_PROCESS_PLAYER_POSITIONS_BOT - SCGW_Bot[iBot].SCGW_player.iGang = ciSCGW_GANG_NONE iBot ",iBot)
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_IS_PLAYER_DEAD(iBot)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] - SCGW_PROCESS_PLAYER_POSITIONS_BOT - SCGW_IS_PLAYER_DEAD(iBot) iBot ",iBot)
|
|
sSCGWData.sPlayers[iBot].vLastFramePlayerPosition = INIT_VECTOR_2D(-1,-1)
|
|
RELOOP
|
|
ENDIF
|
|
|
|
SCGW_PROCESS_PLAYER_POSITION_BOT(iBot)
|
|
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_DAMAGED_EVENT(INT iParticipant, BOOL bDead, BOOL bHitByCar)
|
|
|
|
IF bDead
|
|
IF bHitByCar
|
|
SCGW_PLAY_GANG_SOUND_FROM_PLAYER("Hit_By_Car", iParticipant, sSCGWData.sPlayers[iParticipant].iPlayerSoundId)
|
|
ELSE
|
|
SCGW_PLAY_GANG_SOUND_FROM_PLAYER("Death", iParticipant, sSCGWData.sPlayers[iParticipant].iPlayerSoundId)
|
|
ENDIF
|
|
ELSE
|
|
SCGW_PLAY_GANG_SOUND_FROM_PLAYER("Pain", iParticipant, sSCGWData.sPlayers[iParticipant].iPlayerSoundId)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processes a player beign hit by a projectile
|
|
PROC SCGW_PROCESS_PLAYER_HIT_BY_BULLET(INT iShotLoop, INT iCollisionPlayerLoop, INT iParticipant)
|
|
|
|
sSCGWData.sPlayers[iParticipant].sProjectiles[iShotLoop].vActualBulletPosition = sSCGWData.sPlayers[iCollisionPlayerLoop].vActualPlayerPosition
|
|
|
|
IF iCollisionPlayerLoop = sSCGWData.sLocalPlayer.iLocalPart
|
|
SCGW_UPDATE_PLAYER_HEALTH(-sSCGWData.sWeaponData[SCGW_UF_PlayerBD[iParticipant].sProjectiles[iShotLoop].iShotWeaponType].iShotDamage)
|
|
SET_CONTROL_SHAKE(PLAYER_CONTROL, ciSCGW_VIB_HIT_DURATION, ciSCGW_VIB_HIT_FREQ)
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastDamagedTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Local player was hit, new health: ", SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iHealth)
|
|
IF SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].eCurrentPlayerState != SCGW_PLAYER_STATE_ALIVE
|
|
SCGW_SET_GLOBAL_THIS_FRAME_ACTION(INT_TO_ENUM(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION, ENUM_TO_INT(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_KILLED_BY_PLAYER_1) + SCGW_PlayerBD[iParticipant].iGang))
|
|
ENDIF
|
|
ELIF iParticipant = sSCGWData.sLocalPlayer.iLocalPart
|
|
AND SCGW_PlayerBD[iCollisionPlayerLoop].iHealth - sSCGWData.sWeaponData[SCGW_UF_PlayerBD[iParticipant].sProjectiles[iShotLoop].iShotWeaponType].iShotDamage <= 0
|
|
SCGW_SET_GLOBAL_THIS_FRAME_ACTION(INT_TO_ENUM(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION, ENUM_TO_INT(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_KILLED_PLAYER_1) + SCGW_PlayerBD[iCollisionPlayerLoop].iGang))
|
|
sArcadePlayStats.kills ++
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_BOT_HIT_BY_BULLET(INT iShotLoop, INT iBotLoop, INT iParticipant)
|
|
|
|
sSCGWData.sPlayers[iParticipant].sProjectiles[iShotLoop].vActualBulletPosition = sSCGWData.sPlayers[iBotLoop].vActualPlayerPosition
|
|
|
|
SCGW_UPDATE_PLAYER_HEALTH_BOT(iBotLoop,-sSCGWData.sWeaponData[SCGW_UF_PlayerBD[iParticipant].sProjectiles[iShotLoop].iShotWeaponType].iShotDamage)
|
|
SET_CONTROL_SHAKE(PLAYER_CONTROL, ciSCGW_VIB_HIT_DURATION, ciSCGW_VIB_HIT_FREQ)
|
|
SCGW_Bot[iBotLoop].SCGW_player.iLastDamagedTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Local player was hit, new health: ", SCGW_Bot[iBotLoop].SCGW_player.iHealth)
|
|
IF SCGW_Bot[iBotLoop].SCGW_player.eCurrentPlayerState != SCGW_PLAYER_STATE_ALIVE
|
|
SCGW_SET_GLOBAL_THIS_FRAME_ACTION(INT_TO_ENUM(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION, ENUM_TO_INT(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_KILLED_BY_PLAYER_1) + SCGW_PlayerBD[iParticipant].iGang))
|
|
ENDIF
|
|
IF SCGW_Bot[iBotLoop].SCGW_player.iHealth <= 0
|
|
SCGW_SET_GLOBAL_THIS_FRAME_ACTION(INT_TO_ENUM(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION, ENUM_TO_INT(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_KILLED_PLAYER_1) + SCGW_Bot[iBotLoop].SCGW_player.iGang))
|
|
sArcadePlayStats.kills ++
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_PLAYER_HIT_BY_BULLET_BOT(INT iShotLoop, INT iCollisionPlayerLoop, INT iBot)
|
|
|
|
sSCGWData.sPlayers[iBot].sProjectiles[iShotLoop].vActualBulletPosition = sSCGWData.sPlayers[iCollisionPlayerLoop].vActualPlayerPosition
|
|
|
|
IF iCollisionPlayerLoop = sSCGWData.sLocalPlayer.iLocalPart
|
|
SCGW_UPDATE_PLAYER_HEALTH(-sSCGWData.sWeaponData[SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].iShotWeaponType].iShotDamage)
|
|
SET_CONTROL_SHAKE(PLAYER_CONTROL, ciSCGW_VIB_HIT_DURATION, ciSCGW_VIB_HIT_FREQ)
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastDamagedTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Local player was hit, new health: ", SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iHealth)
|
|
IF SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].eCurrentPlayerState != SCGW_PLAYER_STATE_ALIVE
|
|
SCGW_SET_GLOBAL_THIS_FRAME_ACTION(INT_TO_ENUM(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION, ENUM_TO_INT(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_KILLED_BY_PLAYER_1) + SCGW_Bot[iBot].SCGW_player.iGang))
|
|
ENDIF
|
|
ELIF iBot = sSCGWData.sLocalPlayer.iLocalPart
|
|
AND SCGW_PlayerBD[iCollisionPlayerLoop].iHealth - sSCGWData.sWeaponData[SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].iShotWeaponType].iShotDamage <= 0
|
|
SCGW_SET_GLOBAL_THIS_FRAME_ACTION(INT_TO_ENUM(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION, ENUM_TO_INT(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_KILLED_PLAYER_1) + SCGW_PlayerBD[iCollisionPlayerLoop].iGang))
|
|
sArcadePlayStats.kills ++
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_BOT_HIT_BY_BULLET_BOT(INT iShotLoop, INT iBotLoop, INT iBot)
|
|
|
|
sSCGWData.sPlayers[iBot].sProjectiles[iShotLoop].vActualBulletPosition = sSCGWData.sPlayers[iBotLoop].vActualPlayerPosition
|
|
|
|
SCGW_UPDATE_PLAYER_HEALTH_BOT(iBotLoop,-sSCGWData.sWeaponData[SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].iShotWeaponType].iShotDamage)
|
|
SET_CONTROL_SHAKE(PLAYER_CONTROL, ciSCGW_VIB_HIT_DURATION, ciSCGW_VIB_HIT_FREQ)
|
|
SCGW_Bot[iBotLoop].SCGW_player.iLastDamagedTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Local player was hit, new health: ", SCGW_Bot[iBotLoop].SCGW_player.iHealth)
|
|
IF SCGW_Bot[iBotLoop].SCGW_player.eCurrentPlayerState != SCGW_PLAYER_STATE_ALIVE
|
|
SCGW_SET_GLOBAL_THIS_FRAME_ACTION(INT_TO_ENUM(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION, ENUM_TO_INT(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_KILLED_BY_PLAYER_1) + SCGW_Bot[iBot].SCGW_player.iGang))
|
|
ENDIF
|
|
IF SCGW_Bot[iBotLoop].SCGW_player.iHealth <= 0
|
|
SCGW_SET_GLOBAL_THIS_FRAME_ACTION(INT_TO_ENUM(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION, ENUM_TO_INT(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_KILLED_PLAYER_1) + SCGW_Bot[iBotLoop].SCGW_player.iGang))
|
|
sArcadePlayStats.kills ++
|
|
ENDIF
|
|
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processes player iParticipant's active shots
|
|
PROC SCGW_PROCESS_PLAYER_SHOT_POSITIONS(INT iParticipant, INT &iShotsThisFrameBS)
|
|
|
|
VECTOR_2D vPlayerCollision0, vPlayerCollision1, vBulletCollision0, vBulletCollision1, vCollisionOffset
|
|
|
|
INT iShotLoop = 0
|
|
FOR iShotLoop = 0 TO ciSCGW_MAX_PLAYER_SHOTS - 1
|
|
|
|
INT iShotBit = SCGW_GET_PARTICIPANT_SHOT_BIT(iParticipant, iShotLoop)
|
|
|
|
IF SCGW_UF_PlayerBD[iParticipant].sProjectiles[iShotLoop].iShotTime = -HIGHEST_INT
|
|
IF IS_BIT_SET(sSCGWData.iFinalizedShotsBS, iShotBit)
|
|
CLEAR_BIT(sSCGWData.iFinalizedShotsBS, iShotBit)
|
|
ENDIF
|
|
RELOOP
|
|
ENDIF
|
|
|
|
SET_BIT(iShotsThisFrameBS, iShotBit)
|
|
IF NOT IS_BIT_SET(sSCGWData.iShotsLastFrame, iShotBit)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - START MUZZLE FLASH - Player ", iParticipant," Shot ", iShotLoop)
|
|
sSCGWData.sPlayers[iParticipant].iMuzzleFlashFrame = 0
|
|
SCGW_PLAY_SHOOTING_SOUND_FOR_PLAYER(iParticipant, iShotLoop)
|
|
ENDIF
|
|
|
|
FLOAT fShotDistance = 0
|
|
VECTOR_2D vBulletGridDestination = SCGW_UF_PlayerBD[iParticipant].sProjectiles[iShotLoop].vShotOrigin
|
|
|
|
SWITCH SCGW_UF_PlayerBD[iParticipant].sProjectiles[iShotLoop].iShotDirection
|
|
CASE ciSCGW_GRID_DIRECTION_UP
|
|
fShotDistance = - (sSCGWData.sWeaponData[SCGW_UF_PlayerBD[iParticipant].sProjectiles[iShotLoop].iShotWeaponType].iGridRange * cfSCGW_GRID_SPRITE_SCALE_Y)
|
|
vBulletGridDestination.y += fShotDistance
|
|
vCollisionOffset = INIT_VECTOR_2D(0, cfSCGW_COLLISION_OFFSET_Y)
|
|
BREAK
|
|
CASE ciSCGW_GRID_DIRECTION_DOWN
|
|
fShotDistance = (sSCGWData.sWeaponData[SCGW_UF_PlayerBD[iParticipant].sProjectiles[iShotLoop].iShotWeaponType].iGridRange * cfSCGW_GRID_SPRITE_SCALE_Y)
|
|
vBulletGridDestination.y += fShotDistance
|
|
vCollisionOffset = INIT_VECTOR_2D(0, -cfSCGW_COLLISION_OFFSET_Y)
|
|
BREAK
|
|
CASE ciSCGW_GRID_DIRECTION_LEFT
|
|
fShotDistance = -(sSCGWData.sWeaponData[SCGW_UF_PlayerBD[iParticipant].sProjectiles[iShotLoop].iShotWeaponType].iGridRange * cfSCGW_GRID_SPRITE_SCALE_X)
|
|
vBulletGridDestination.x += fShotDistance
|
|
vCollisionOffset = INIT_VECTOR_2D(cfSCGW_COLLISION_OFFSET_X, 0)
|
|
BREAK
|
|
CASE ciSCGW_GRID_DIRECTION_RIGHT
|
|
fShotDistance = (sSCGWData.sWeaponData[SCGW_UF_PlayerBD[iParticipant].sProjectiles[iShotLoop].iShotWeaponType].iGridRange * cfSCGW_GRID_SPRITE_SCALE_X)
|
|
vBulletGridDestination.x += fShotDistance
|
|
vCollisionOffset = INIT_VECTOR_2D(-cfSCGW_COLLISION_OFFSET_X, 0)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Player ", iParticipant," Shot ", iShotLoop, " (",SCGW_UF_PlayerBD[iParticipant].sProjectiles[iShotLoop].vShotOrigin.x,", ", SCGW_UF_PlayerBD[iParticipant].sProjectiles[iShotLoop].vShotOrigin.y, ") -> (", vBulletGridDestination.x, ", ", vBulletGridDestination.y, ")")
|
|
|
|
FLOAT fAlpha = TO_FLOAT(NATIVE_TO_INT(GET_NETWORK_TIME()) - SCGW_UF_PlayerBD[iParticipant].sProjectiles[iShotLoop].iShotTime) / TO_FLOAT(sSCGWData.sWeaponData[SCGW_UF_PlayerBD[iParticipant].sProjectiles[iShotLoop].iShotWeaponType].iGridRange * sSCGWData.sWeaponData[SCGW_UF_PlayerBD[iParticipant].sProjectiles[iShotLoop].iShotWeaponType].iGridShotTime)
|
|
|
|
IF IS_BIT_SET(sSCGWData.iFinalizedShotsBS, iShotBit)
|
|
IF fAlpha > 1.0
|
|
sSCGWData.sPlayers[iParticipant].sProjectiles[iShotLoop].vLastFrameBulletPosition = INIT_VECTOR_2D(-1, -1)
|
|
IF iParticipant = sSCGWData.sLocalPlayer.iLocalPart
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].sProjectiles[iShotLoop].iShotTime = -HIGHEST_INT
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].sProjectiles[iShotLoop].vShotOrigin.x = -1
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].sProjectiles[iShotLoop].vShotOrigin.y = -1
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].sProjectiles[iShotLoop].iShotDirection = -1
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].sProjectiles[iShotLoop].iShotWeaponType = -1
|
|
ENDIF
|
|
ENDIF
|
|
RELOOP
|
|
ENDIF
|
|
|
|
VECTOR_2D vOrigin = SCGW_UF_PlayerBD[iParticipant].sProjectiles[iShotLoop].vShotOrigin
|
|
VECTOR_2D vDestination = vBulletGridDestination
|
|
|
|
IF IS_FLOAT_IN_RANGE(sSCGWData.sPlayers[iParticipant].sProjectiles[iShotLoop].vLastFrameBulletPosition.x, -1 - cfARCADE_MINIGAME_FLOAT_TOLERANCE, -1 + cfARCADE_MINIGAME_FLOAT_TOLERANCE)
|
|
AND IS_FLOAT_IN_RANGE(sSCGWData.sPlayers[iParticipant].sProjectiles[iShotLoop].vLastFrameBulletPosition.y, -1 - cfARCADE_MINIGAME_FLOAT_TOLERANCE, -1 + cfARCADE_MINIGAME_FLOAT_TOLERANCE)
|
|
sSCGWData.sPlayers[iParticipant].sProjectiles[iShotLoop].vLastFrameBulletPosition = vOrigin
|
|
ELSE
|
|
sSCGWData.sPlayers[iParticipant].sProjectiles[iShotLoop].vLastFrameBulletPosition = sSCGWData.sPlayers[iParticipant].sProjectiles[iShotLoop].vActualBulletPosition
|
|
ENDIF
|
|
|
|
sSCGWData.sPlayers[iParticipant].sProjectiles[iShotLoop].vActualBulletPosition = LERP_VECTOR_2D(vOrigin, vDestination, fAlpha)
|
|
|
|
//Collision
|
|
INT iCollisionPlayerLoop = 0
|
|
BOOL bHitPlayer = FALSE
|
|
|
|
//Set up bullet collision lines
|
|
vBulletCollision0 = sSCGWData.sPlayers[iParticipant].sProjectiles[iShotLoop].vActualBulletPosition
|
|
vBulletCollision1 = ADD_VECTOR_2D(sSCGWData.sPlayers[iParticipant].sProjectiles[iShotLoop].vLastFrameBulletPosition, vCollisionOffset)
|
|
|
|
FOR iCollisionPlayerLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Player ", iParticipant," - iCollisionPlayerLoop ",iCollisionPlayerLoop)
|
|
|
|
IF iCollisionPlayerLoop = iParticipant
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Player ", iParticipant," - iCollisionPlayerLoop = iParticipant ")
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF NOT NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iCollisionPlayerLoop))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Player ", iParticipant," - NOT NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iCollisionPlayerLoop)) ")
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[iCollisionPlayerLoop].iGang = ciSCGW_GANG_NONE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Player ", iParticipant," - SCGW_PlayerBD[iCollisionPlayerLoop].iGang = ciSCGW_GANG_NONE ")
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_IS_PLAYER_DEAD(iCollisionPlayerLoop)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Player ", iParticipant," - SCGW_IS_PLAYER_DEAD(iCollisionPlayerLoop) ")
|
|
RELOOP
|
|
ENDIF
|
|
|
|
vPlayerCollision0 = sSCGWData.sPlayers[iCollisionPlayerLoop].vActualPlayerPosition
|
|
vPlayerCollision1 = sSCGWData.sPlayers[iCollisionPlayerLoop].vLastFramePlayerPosition
|
|
|
|
IF ABSF(vPlayerCollision0.x - vBulletCollision0.x) > cfSCGW_GRID_SPRITE_SCALE_X
|
|
OR ABSF(vPlayerCollision0.y - vBulletCollision0.y) > cfSCGW_GRID_SPRITE_SCALE_Y
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Player ", iParticipant," - ABSF(vPlayerCollision0.x - vBulletCollision0.x) > cfSCGW_GRID_SPRITE_SCALE_X OR ABSF(vPlayerCollision0.y - vBulletCollision0.y) > cfSCGW_GRID_SPRITE_SCALE_Y")
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_DO_LINES_INTERSECT_FOR_COLLISION(vBulletCollision0, vBulletCollision1, vPlayerCollision0, vPlayerCollision1)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Player ", iParticipant," Shot ", iShotLoop, " Hit player ", iCollisionPlayerLoop)
|
|
SCGW_PROCESS_PLAYER_HIT_BY_BULLET(iShotLoop, iCollisionPlayerLoop, iParticipant)
|
|
bHitPlayer = TRUE
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
INT iBotLoop = 0
|
|
FOR iBotLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Player ", iParticipant," - iBotLoop ",iBotLoop)
|
|
|
|
IF iBotLoop = iParticipant
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Player ", iParticipant," - iBotLoop = iParticipant ")
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF NOT SCGW_Bot[iBotLoop].bActive
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Player ", iParticipant," - NOT SCGW_Bot[iBotLoop].bActive ")
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_Bot[iBotLoop].SCGW_player.iGang = ciSCGW_GANG_NONE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Player ", iParticipant," - SCGW_Bot[iBotLoop].SCGW_player.iGang = ciSCGW_GANG_NONE ")
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_IS_PLAYER_DEAD_BOT(iBotLoop)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Player ", iParticipant," - SCGW_IS_PLAYER_DEAD_BOT(iBotLoop) ")
|
|
RELOOP
|
|
ENDIF
|
|
|
|
vPlayerCollision0 = sSCGWData.sPlayers[iBotLoop].vActualPlayerPosition
|
|
vPlayerCollision1 = sSCGWData.sPlayers[iBotLoop].vLastFramePlayerPosition
|
|
|
|
IF ABSF(vPlayerCollision0.x - vBulletCollision0.x) > cfSCGW_GRID_SPRITE_SCALE_X
|
|
OR ABSF(vPlayerCollision0.y - vBulletCollision0.y) > cfSCGW_GRID_SPRITE_SCALE_Y
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Player ", iParticipant," - ABSF(vPlayerCollision0.x - vBulletCollision0.x) > cfSCGW_GRID_SPRITE_SCALE_X OR ABSF(vPlayerCollision0.y - vBulletCollision0.y) > cfSCGW_GRID_SPRITE_SCALE_Y")
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_DO_LINES_INTERSECT_FOR_COLLISION(vBulletCollision0, vBulletCollision1, vPlayerCollision0, vPlayerCollision1)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Player ", iParticipant," Shot ", iShotLoop, " Hit Bot ", iBotLoop)
|
|
SCGW_PROCESS_BOT_HIT_BY_BULLET(iShotLoop, iBotLoop, iParticipant)
|
|
bHitPlayer = TRUE
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
IF fAlpha >= 1.0
|
|
OR bHitPlayer
|
|
IF NOT IS_BIT_SET(sSCGWData.iFinalizedShotsBS, iShotBit)
|
|
IF SCGW_UF_PlayerBD[iParticipant].sProjectiles[iShotLoop].iShotWeaponType = ciSCGW_WEAPON_ROCKET
|
|
SCGW_ADD_EXPLOSION_AT_COORDS(sSCGWData.sPlayers[iParticipant].sProjectiles[iShotLoop].vActualBulletPosition)
|
|
ENDIF
|
|
|
|
SET_BIT(sSCGWData.iFinalizedShotsBS, iShotBit)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_PLAYER_SHOT_POSITIONS_BOT(INT iBot, INT &iShotsThisFrameBS)
|
|
|
|
VECTOR_2D vPlayerCollision0, vPlayerCollision1, vBulletCollision0, vBulletCollision1, vCollisionOffset
|
|
|
|
INT iShotLoop = 0
|
|
FOR iShotLoop = 0 TO ciSCGW_MAX_PLAYER_SHOTS - 1
|
|
|
|
INT iShotBit = SCGW_GET_PARTICIPANT_SHOT_BIT(iBot, iShotLoop)
|
|
|
|
IF SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].iShotTime = -HIGHEST_INT
|
|
IF IS_BIT_SET(sSCGWData.iFinalizedShotsBSBot, iShotBit)
|
|
CLEAR_BIT(sSCGWData.iFinalizedShotsBSBot, iShotBit)
|
|
ENDIF
|
|
RELOOP
|
|
ENDIF
|
|
|
|
SET_BIT(iShotsThisFrameBS, iShotBit)
|
|
IF NOT IS_BIT_SET(sSCGWData.iShotsLastFrameBot, iShotBit)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - START MUZZLE FLASH - Bot ", iBot," Shot ", iShotLoop)
|
|
sSCGWData.sPlayers[iBot].iMuzzleFlashFrame = 0
|
|
SCGW_PLAY_SHOOTING_SOUND_FOR_BOT(iBot, iShotLoop)
|
|
ENDIF
|
|
|
|
FLOAT fShotDistance = 0
|
|
VECTOR_2D vBulletGridDestination = SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].vShotOrigin
|
|
|
|
SWITCH SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].iShotDirection
|
|
CASE ciSCGW_GRID_DIRECTION_UP
|
|
fShotDistance = - (sSCGWData.sWeaponData[SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].iShotWeaponType].iGridRange * cfSCGW_GRID_SPRITE_SCALE_Y)
|
|
vBulletGridDestination.y += fShotDistance
|
|
vCollisionOffset = INIT_VECTOR_2D(0, cfSCGW_COLLISION_OFFSET_Y)
|
|
BREAK
|
|
CASE ciSCGW_GRID_DIRECTION_DOWN
|
|
fShotDistance = (sSCGWData.sWeaponData[SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].iShotWeaponType].iGridRange * cfSCGW_GRID_SPRITE_SCALE_Y)
|
|
vBulletGridDestination.y += fShotDistance
|
|
vCollisionOffset = INIT_VECTOR_2D(0, -cfSCGW_COLLISION_OFFSET_Y)
|
|
BREAK
|
|
CASE ciSCGW_GRID_DIRECTION_LEFT
|
|
fShotDistance = -(sSCGWData.sWeaponData[SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].iShotWeaponType].iGridRange * cfSCGW_GRID_SPRITE_SCALE_X)
|
|
vBulletGridDestination.x += fShotDistance
|
|
vCollisionOffset = INIT_VECTOR_2D(cfSCGW_COLLISION_OFFSET_X, 0)
|
|
BREAK
|
|
CASE ciSCGW_GRID_DIRECTION_RIGHT
|
|
fShotDistance = (sSCGWData.sWeaponData[SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].iShotWeaponType].iGridRange * cfSCGW_GRID_SPRITE_SCALE_X)
|
|
vBulletGridDestination.x += fShotDistance
|
|
vCollisionOffset = INIT_VECTOR_2D(-cfSCGW_COLLISION_OFFSET_X, 0)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Bot ", iBot," Shot ", iShotLoop, " (",SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].vShotOrigin.x,", ", SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].vShotOrigin.y, ") -> (", vBulletGridDestination.x, ", ", vBulletGridDestination.y, ")")
|
|
|
|
FLOAT fAlpha = TO_FLOAT(NATIVE_TO_INT(GET_NETWORK_TIME()) - SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].iShotTime) / TO_FLOAT(sSCGWData.sWeaponData[SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].iShotWeaponType].iGridRange * sSCGWData.sWeaponData[SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].iShotWeaponType].iGridShotTime)
|
|
|
|
IF IS_BIT_SET(sSCGWData.iFinalizedShotsBSBot, iShotBit)
|
|
IF fAlpha > 1.0
|
|
sSCGWData.sPlayers[iBot].sProjectiles[iShotLoop].vLastFrameBulletPosition = INIT_VECTOR_2D(-1, -1)
|
|
// IF iParticipant = sSCGWData.sLocalPlayer.iLocalPart
|
|
SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].iShotTime = -HIGHEST_INT
|
|
SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].vShotOrigin.x = -1
|
|
SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].vShotOrigin.y = -1
|
|
SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].iShotDirection = -1
|
|
SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].iShotWeaponType = -1
|
|
// ENDIF
|
|
ENDIF
|
|
RELOOP
|
|
ENDIF
|
|
|
|
VECTOR_2D vOrigin = SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].vShotOrigin
|
|
VECTOR_2D vDestination = vBulletGridDestination
|
|
|
|
IF IS_FLOAT_IN_RANGE(sSCGWData.sPlayers[iBot].sProjectiles[iShotLoop].vLastFrameBulletPosition.x, -1 - cfARCADE_MINIGAME_FLOAT_TOLERANCE, -1 + cfARCADE_MINIGAME_FLOAT_TOLERANCE)
|
|
AND IS_FLOAT_IN_RANGE(sSCGWData.sPlayers[iBot].sProjectiles[iShotLoop].vLastFrameBulletPosition.y, -1 - cfARCADE_MINIGAME_FLOAT_TOLERANCE, -1 + cfARCADE_MINIGAME_FLOAT_TOLERANCE)
|
|
sSCGWData.sPlayers[iBot].sProjectiles[iShotLoop].vLastFrameBulletPosition = vOrigin
|
|
ELSE
|
|
sSCGWData.sPlayers[iBot].sProjectiles[iShotLoop].vLastFrameBulletPosition = sSCGWData.sPlayers[iBot].sProjectiles[iShotLoop].vActualBulletPosition
|
|
ENDIF
|
|
|
|
sSCGWData.sPlayers[iBot].sProjectiles[iShotLoop].vActualBulletPosition = LERP_VECTOR_2D(vOrigin, vDestination, fAlpha)
|
|
|
|
//Collision
|
|
INT iCollisionPlayerLoop = 0
|
|
BOOL bHitPlayer = FALSE
|
|
|
|
//Set up bullet collision lines
|
|
vBulletCollision0 = sSCGWData.sPlayers[iBot].sProjectiles[iShotLoop].vActualBulletPosition
|
|
vBulletCollision1 = ADD_VECTOR_2D(sSCGWData.sPlayers[iBot].sProjectiles[iShotLoop].vLastFrameBulletPosition, vCollisionOffset)
|
|
|
|
FOR iCollisionPlayerLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Bot ", iBot," - iCollisionPlayerLoop ",iCollisionPlayerLoop)
|
|
|
|
IF iCollisionPlayerLoop = iBot
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Bot ", iBot," - iCollisionPlayerLoop = iBot ")
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF NOT NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iCollisionPlayerLoop))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Bot ", iBot," - NOT NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iCollisionPlayerLoop)) ")
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[iCollisionPlayerLoop].iGang = ciSCGW_GANG_NONE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Bot ", iBot," - SCGW_PlayerBD[iCollisionPlayerLoop].iGang = ciSCGW_GANG_NONE ")
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_IS_PLAYER_DEAD(iCollisionPlayerLoop)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Bot ", iBot," - SCGW_IS_PLAYER_DEAD(iCollisionPlayerLoop) ")
|
|
RELOOP
|
|
ENDIF
|
|
|
|
vPlayerCollision0 = sSCGWData.sPlayers[iCollisionPlayerLoop].vActualPlayerPosition
|
|
vPlayerCollision1 = sSCGWData.sPlayers[iCollisionPlayerLoop].vLastFramePlayerPosition
|
|
|
|
IF ABSF(vPlayerCollision0.x - vBulletCollision0.x) > cfSCGW_GRID_SPRITE_SCALE_X
|
|
OR ABSF(vPlayerCollision0.y - vBulletCollision0.y) > cfSCGW_GRID_SPRITE_SCALE_Y
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Bot ", iBot," - ABSF(vPlayerCollision0.x - vBulletCollision0.x) > cfSCGW_GRID_SPRITE_SCALE_X OR ABSF(vPlayerCollision0.y - vBulletCollision0.y) > cfSCGW_GRID_SPRITE_SCALE_Y")
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_DO_LINES_INTERSECT_FOR_COLLISION(vBulletCollision0, vBulletCollision1, vPlayerCollision0, vPlayerCollision1)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Bot ", iBot," Shot ", iShotLoop, " Hit player ", iCollisionPlayerLoop)
|
|
SCGW_PROCESS_PLAYER_HIT_BY_BULLET_BOT(iShotLoop, iCollisionPlayerLoop, iBot)
|
|
bHitPlayer = TRUE
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
INT iBotLoop = 0
|
|
FOR iBotLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Bot ", iBot," - iCollisionPlayerLoop ",iCollisionPlayerLoop)
|
|
|
|
IF iBotLoop = iBot
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Bot ", iBot," - iBotLoop = iBot ")
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF NOT SCGW_Bot[iBotLoop].bActive
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Bot ", iBot," - NOT SCGW_Bot[iBotLoop].bActive ")
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_Bot[iBotLoop].SCGW_player.iGang = ciSCGW_GANG_NONE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Bot ", iBot," - SCGW_Bot[iBotLoop].SCGW_player.iGang = ciSCGW_GANG_NONE")
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_IS_PLAYER_DEAD_BOT(iBotLoop)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Bot ", iBot," - SCGW_IS_PLAYER_DEAD_BOT(iBotLoop)")
|
|
RELOOP
|
|
ENDIF
|
|
|
|
vPlayerCollision0 = sSCGWData.sPlayers[iBotLoop].vActualPlayerPosition
|
|
vPlayerCollision1 = sSCGWData.sPlayers[iBotLoop].vLastFramePlayerPosition
|
|
|
|
IF ABSF(vPlayerCollision0.x - vBulletCollision0.x) > cfSCGW_GRID_SPRITE_SCALE_X
|
|
OR ABSF(vPlayerCollision0.y - vBulletCollision0.y) > cfSCGW_GRID_SPRITE_SCALE_Y
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Bot ", iBot," - ABSF(vPlayerCollision0.x - vBulletCollision0.x) > cfSCGW_GRID_SPRITE_SCALE_X OR ABSF(vPlayerCollision0.y - vBulletCollision0.y) > cfSCGW_GRID_SPRITE_SCALE_Y")
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_DO_LINES_INTERSECT_FOR_COLLISION(vBulletCollision0, vBulletCollision1, vPlayerCollision0, vPlayerCollision1)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_PLAYER_SHOT_POSITIONS - Bot ", iBot," Shot ", iShotLoop, " Hit bot ", iBotLoop)
|
|
SCGW_PROCESS_BOT_HIT_BY_BULLET_BOT(iShotLoop, iBotLoop, iBot)
|
|
bHitPlayer = TRUE
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
IF fAlpha >= 1.0
|
|
OR bHitPlayer
|
|
IF NOT IS_BIT_SET(sSCGWData.iFinalizedShotsBSBot, iShotBit)
|
|
IF SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[iShotLoop].iShotWeaponType = ciSCGW_WEAPON_ROCKET
|
|
SCGW_ADD_EXPLOSION_AT_COORDS(sSCGWData.sPlayers[iBot].sProjectiles[iShotLoop].vActualBulletPosition)
|
|
ENDIF
|
|
|
|
SET_BIT(sSCGWData.iFinalizedShotsBSBot, iShotBit)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processes the shot positions of all active players
|
|
PROC SCGW_PROCESS_SHOT_POSITIONS()
|
|
|
|
INT iShotsThisFrameBS = 0
|
|
|
|
INT iPlayerLoop = 0
|
|
FOR iPlayerLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
|
|
IF NOT NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iPlayerLoop))
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[iPlayerLoop].iGang = ciSCGW_GANG_NONE
|
|
RELOOP
|
|
ENDIF
|
|
|
|
SCGW_PROCESS_PLAYER_SHOT_POSITIONS(iPlayerLoop, iShotsThisFrameBS)
|
|
|
|
ENDFOR
|
|
|
|
sSCGWData.iShotsLastFrame = iShotsThisFrameBS
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_SHOT_POSITIONS_BOT()
|
|
|
|
INT iShotsThisFrameBS = 0
|
|
|
|
INT iBot = 0
|
|
FOR iBot = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
|
|
IF NOT SCGW_Bot[iBot].bActive
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_Bot[iBot].SCGW_player.iGang = ciSCGW_GANG_NONE
|
|
RELOOP
|
|
ENDIF
|
|
|
|
SCGW_PROCESS_PLAYER_SHOT_POSITIONS_BOT(iBot, iShotsThisFrameBS)
|
|
|
|
ENDFOR
|
|
|
|
sSCGWData.iShotsLastFrameBot = iShotsThisFrameBS
|
|
|
|
ENDPROC
|
|
|
|
// ------------------------------ VEHICLE PROCESSING ------------------------------
|
|
|
|
/// PURPOSE:
|
|
/// Processes a player beign hit by a vehicle
|
|
PROC SCGW_PROCESS_PLAYER_HIT_BY_VEHICLE(INT iCollisionPlayerLoop)
|
|
|
|
IF iCollisionPlayerLoop = sSCGWData.sLocalPlayer.iLocalPart
|
|
SCGW_UPDATE_PLAYER_HEALTH(-ciSCGW_VEHICLE_DAMAGE, TRUE)
|
|
SET_CONTROL_SHAKE(PLAYER_CONTROL, ciSCGW_VIB_CAR_HIT_DURATION, ciSCGW_VIB_CAR_HIT_FREQ)
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastDamagedTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_PLAYER_HIT_BY_VEHICLE - Local player was hit, new health: ", SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iHealth)
|
|
SCGW_SET_GLOBAL_THIS_FRAME_ACTION(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_KILLED_BY_VEHICLE)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_PLAYER_HIT_BY_VEHICLE_BOT(INT iBotLoop)
|
|
|
|
SCGW_UPDATE_PLAYER_HEALTH_BOT(iBotLoop,-ciSCGW_VEHICLE_DAMAGE, TRUE)
|
|
SCGW_Bot[iBotLoop].SCGW_player.iLastDamagedTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_PLAYER_HIT_BY_VEHICLE - Bot ",iBotLoop," was hit, new health: ", SCGW_Bot[iBotLoop].SCGW_player.iHealth)
|
|
SCGW_SET_GLOBAL_THIS_FRAME_ACTION(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_KILLED_BY_VEHICLE)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processes spawned vehicle positions
|
|
PROC SCGW_PROCESS_VEHICLE_POSITIONS()
|
|
|
|
VECTOR_2D vPlayerCollision0, vPlayerCollision1, vVehicleCollision0, vVehicleCollision1, vCollisionOffset
|
|
|
|
BOOL bVehicleOnScreen = FALSE
|
|
|
|
INT i
|
|
INT iStartX, iStartY, iEndX, iEndY
|
|
FOR i = 0 TO ciSCGW_MAX_ACTIVE_VEHICLES - 1
|
|
INT iTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
IF SCGW_ServerBD.sVehicles[i].iVehicleType != -1
|
|
AND iTime > SCGW_ServerBD.sVehicles[i].iVehicleTime
|
|
INT iVehicleMoveTime = PICK_INT(SCGW_ServerBD.sVehicles[i].iVehicleDirection = ciSCGW_GRID_DIRECTION_DOWN OR SCGW_ServerBD.sVehicles[i].iVehicleDirection = ciSCGW_GRID_DIRECTION_UP, ciSCGW_MAX_PLAYER_POSITIONS_Y + 2, ciSCGW_MAX_PLAYER_POSITIONS_X + 2) * ciSCGW_VEHICLE_GRID_SPEED
|
|
IF iTime > SCGW_ServerBD.sVehicles[i].iVehicleTime + iVehicleMoveTime
|
|
RELOOP
|
|
ENDIF
|
|
|
|
bVehicleOnScreen = TRUE
|
|
|
|
FLOAT fAlpha = TO_FLOAT(iTime - SCGW_ServerBD.sVehicles[i].iVehicleTime) / TO_FLOAT(iVehicleMoveTime)
|
|
|
|
SCGW_GET_POSITION_COORDS(SCGW_ServerBD.sVehicles[i].iVehicleOrigin, iStartX, iStartY)
|
|
|
|
SWITCH SCGW_ServerBD.sVehicles[i].iVehicleDirection
|
|
|
|
CASE ciSCGW_GRID_DIRECTION_UP
|
|
iEndX = iStartX
|
|
iEndY = 0
|
|
vCollisionOffset = INIT_VECTOR_2D(0, -(sSCGWData.sVehicleData[SCGW_ServerBD.sVehicles[i].iVehicleType].vSpriteScale.y / 2))
|
|
BREAK
|
|
|
|
CASE ciSCGW_GRID_DIRECTION_DOWN
|
|
iEndX = iStartX
|
|
iEndY = ciSCGW_MAX_PLAYER_POSITIONS_Y - 1
|
|
vCollisionOffset = INIT_VECTOR_2D(0, (sSCGWData.sVehicleData[SCGW_ServerBD.sVehicles[i].iVehicleType].vSpriteScale.y / 2))
|
|
BREAK
|
|
|
|
CASE ciSCGW_GRID_DIRECTION_LEFT
|
|
iEndX = 0
|
|
iEndY = iStartY
|
|
vCollisionOffset = INIT_VECTOR_2D(-(sSCGWData.sVehicleData[SCGW_ServerBD.sVehicles[i].iVehicleType].vSpriteScale.x / 2), 0)
|
|
BREAK
|
|
|
|
CASE ciSCGW_GRID_DIRECTION_RIGHT
|
|
iEndX = ciSCGW_MAX_PLAYER_POSITIONS_X - 1
|
|
iEndY = iStartY
|
|
vCollisionOffset = INIT_VECTOR_2D((sSCGWData.sVehicleData[SCGW_ServerBD.sVehicles[i].iVehicleType].vSpriteScale.x / 2), 0)
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
VECTOR_2D vStartPosition = SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_ServerBD.sVehicles[i].iVehicleOrigin)
|
|
VECTOR_2D vEndPosition = SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_GET_POSITION_FROM_COORDS(iEndX, iEndY))
|
|
|
|
SWITCH SCGW_ServerBD.sVehicles[i].iVehicleDirection
|
|
|
|
CASE ciSCGW_GRID_DIRECTION_UP
|
|
vStartPosition.y += cfSCGW_GRID_POS_Y_INCR
|
|
vEndPosition.y += -cfSCGW_GRID_POS_Y_INCR
|
|
BREAK
|
|
|
|
CASE ciSCGW_GRID_DIRECTION_DOWN
|
|
vStartPosition.y += -cfSCGW_GRID_POS_Y_INCR
|
|
vEndPosition.y += cfSCGW_GRID_POS_Y_INCR
|
|
BREAK
|
|
|
|
CASE ciSCGW_GRID_DIRECTION_LEFT
|
|
vStartPosition.x += cfSCGW_GRID_POS_X_INCR
|
|
vEndPosition.x += -cfSCGW_GRID_POS_X_INCR
|
|
BREAK
|
|
|
|
CASE ciSCGW_GRID_DIRECTION_RIGHT
|
|
vStartPosition.x += -cfSCGW_GRID_POS_X_INCR
|
|
vEndPosition.x += cfSCGW_GRID_POS_X_INCR
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
sSCGWData.sVehicles[i].vLastFrameVehiclePosition = sSCGWData.sVehicles[i].vActualVehiclePosition
|
|
sSCGWData.sVehicles[i].vActualVehiclePosition = LERP_VECTOR_2D(vStartPosition, vEndPosition, fAlpha)
|
|
|
|
IF NOT SCGW_IS_RECT_COMPLETELY_OUTSIDE_OF_GAME_AREA(sSCGWData.sVehicles[i].vActualVehiclePosition, sSCGWData.sVehicleData[SCGW_ServerBD.sVehicles[i].iVehicleType].vSpriteScale)
|
|
IF SCGW_IS_RECT_COMPLETELY_OUTSIDE_OF_GAME_AREA(sSCGWData.sVehicles[i].vLastFrameVehiclePosition, sSCGWData.sVehicleData[SCGW_ServerBD.sVehicles[i].iVehicleType].vSpriteScale)
|
|
IF SCGW_ServerBD.sVehicles[i].iVehicleType != ciSCGW_VEHICLE_TYPE_ICE_CREAM
|
|
SCGW_PLAY_FIRE_AND_FORGET_GLOBAL_SOUND(SCGW_GET_VEHICLE_WARNING_SOUND(SCGW_ServerBD.sVehicles[i].iVehicleType), sSCGWData.sVehicles[i].vActualVehiclePosition)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("dlc_vw_am_tw_vehicle_drivethrough_scene")
|
|
START_AUDIO_SCENE("dlc_vw_am_tw_vehicle_drivethrough_scene")
|
|
ENDIF
|
|
IF IS_AUDIO_SCENE_ACTIVE("dlc_vw_am_tw_in_gameplay_scene")
|
|
STOP_AUDIO_SCENE("dlc_vw_am_tw_in_gameplay_scene")
|
|
ENDIF
|
|
IF i != 2 //Don't play sound for 2nd gang vehicle
|
|
VECTOR_2D vVehPos = sSCGWData.sVehicles[i].vActualVehiclePosition
|
|
IF i = 1
|
|
AND SCGW_ServerBD.sVehicles[i].iVehicleDirection != SCGW_ServerBD.sVehicles[2].iVehicleDirection
|
|
vVehPos = INIT_VECTOR_2D(cfSCREEN_CENTER, cfSCREEN_CENTER)
|
|
ENDIF
|
|
IF SCGW_ServerBD.sVehicles[i].iVehicleType >= ciSCGW_AMBIENT_VEHICLE_TYPES
|
|
INT iGang = SCGW_ServerBD.sVehicles[i].iVehicleType - ciSCGW_AMBIENT_VEHICLE_TYPES
|
|
SCGW_START_LOOPING_GANG_SOUND(SCGW_GET_VEHICLE_LOOP_SOUND(SCGW_ServerBD.sVehicles[i].iVehicleType), sSCGWData.sVehicles[i].iVehicleLoopSoundId, vVehPos, iGang)
|
|
ELSE
|
|
SCGW_START_LOOPING_GLOBAL_SOUND(SCGW_GET_VEHICLE_LOOP_SOUND(SCGW_ServerBD.sVehicles[i].iVehicleType), sSCGWData.sVehicles[i].iVehicleLoopSoundId, vVehPos)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF sSCGWData.sVehicles[i].iVehicleLoopSoundId != -1
|
|
SCGW_STOP_LOOPING_SOUND(sSCGWData.sVehicles[i].iVehicleLoopSoundId)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//Set up vehicle collision lines
|
|
vVehicleCollision0 = ADD_VECTOR_2D(sSCGWData.sVehicles[i].vActualVehiclePosition, vCollisionOffset)
|
|
vVehicleCollision1 = SUBTRACT_VECTOR_2D(sSCGWData.sVehicles[i].vLastFrameVehiclePosition, vCollisionOffset)
|
|
|
|
//Collision
|
|
INT iCollisionPlayerLoop = 0
|
|
FOR iCollisionPlayerLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
|
|
IF NOT NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iCollisionPlayerLoop))
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[iCollisionPlayerLoop].iGang = ciSCGW_GANG_NONE
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_IS_PLAYER_DEAD(iCollisionPlayerLoop)
|
|
RELOOP
|
|
ENDIF
|
|
|
|
vPlayerCollision0 = sSCGWData.sPlayers[iCollisionPlayerLoop].vActualPlayerPosition
|
|
vPlayerCollision1 = sSCGWData.sPlayers[iCollisionPlayerLoop].vLastFramePlayerPosition
|
|
|
|
IF ABSF(vPlayerCollision0.x - vVehicleCollision0.x) > cfSCGW_GRID_SPRITE_SCALE_X
|
|
OR ABSF(vPlayerCollision0.y - vVehicleCollision0.y) > cfSCGW_GRID_SPRITE_SCALE_Y
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_DO_LINES_INTERSECT_FOR_COLLISION(vVehicleCollision0, vVehicleCollision1, vPlayerCollision0, vPlayerCollision1)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_VEHICLE_POSITIONS - Player ", iCollisionPlayerLoop, " hit by ", i)
|
|
SCGW_PROCESS_PLAYER_HIT_BY_VEHICLE(iCollisionPlayerLoop)
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
INT iBotLoop = 0
|
|
FOR iBotLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
|
|
IF NOT SCGW_Bot[iBotLoop].bActive
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_Bot[iBotLoop].SCGW_player.iGang = ciSCGW_GANG_NONE
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_IS_PLAYER_DEAD_BOT(iBotLoop)
|
|
RELOOP
|
|
ENDIF
|
|
|
|
vPlayerCollision0 = sSCGWData.sPlayers[iBotLoop].vActualPlayerPosition
|
|
vPlayerCollision1 = sSCGWData.sPlayers[iBotLoop].vLastFramePlayerPosition
|
|
|
|
IF ABSF(vPlayerCollision0.x - vVehicleCollision0.x) > cfSCGW_GRID_SPRITE_SCALE_X
|
|
OR ABSF(vPlayerCollision0.y - vVehicleCollision0.y) > cfSCGW_GRID_SPRITE_SCALE_Y
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_DO_LINES_INTERSECT_FOR_COLLISION(vVehicleCollision0, vVehicleCollision1, vPlayerCollision0, vPlayerCollision1)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_VEHICLE_POSITIONS - Player ", iCollisionPlayerLoop, " hit by ", i)
|
|
SCGW_PROCESS_PLAYER_HIT_BY_VEHICLE_BOT(iBotLoop)
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
ELSE
|
|
IF sSCGWData.sVehicles[i].iVehicleLoopSoundId != -1
|
|
SCGW_STOP_LOOPING_SOUND(sSCGWData.sVehicles[i].iVehicleLoopSoundId)
|
|
ENDIF
|
|
|
|
sSCGWData.sVehicles[i].vActualVehiclePosition = SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_ServerBD.sVehicles[i].iVehicleOrigin)
|
|
|
|
SWITCH SCGW_ServerBD.sVehicles[i].iVehicleDirection
|
|
|
|
CASE ciSCGW_GRID_DIRECTION_UP
|
|
sSCGWData.sVehicles[i].vActualVehiclePosition.y += cfSCGW_GRID_POS_Y_INCR
|
|
BREAK
|
|
|
|
CASE ciSCGW_GRID_DIRECTION_DOWN
|
|
sSCGWData.sVehicles[i].vActualVehiclePosition.y += -cfSCGW_GRID_POS_Y_INCR
|
|
BREAK
|
|
|
|
CASE ciSCGW_GRID_DIRECTION_LEFT
|
|
sSCGWData.sVehicles[i].vActualVehiclePosition.x += cfSCGW_GRID_POS_X_INCR
|
|
BREAK
|
|
|
|
CASE ciSCGW_GRID_DIRECTION_RIGHT
|
|
sSCGWData.sVehicles[i].vActualVehiclePosition.x += -cfSCGW_GRID_POS_X_INCR
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
sSCGWData.sVehicles[i].vLastFrameVehiclePosition = sSCGWData.sVehicles[i].vActualVehiclePosition
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
IF NOT bVehicleOnScreen
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("dlc_vw_am_tw_in_gameplay_scene")
|
|
START_AUDIO_SCENE("dlc_vw_am_tw_in_gameplay_scene")
|
|
ENDIF
|
|
IF IS_AUDIO_SCENE_ACTIVE("dlc_vw_am_tw_vehicle_drivethrough_scene")
|
|
STOP_AUDIO_SCENE("dlc_vw_am_tw_vehicle_drivethrough_scene")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Spawns gang backup vehicles for the gang near their position
|
|
/// HOST ONLY
|
|
PROC SCGW_SPAWN_GANG_BACKUP_VEHICLES(INT iGang, INT iPosition)
|
|
|
|
IF !sSCGWData.sLocalPlayer.bIsHost
|
|
EXIT
|
|
ENDIF
|
|
|
|
INT i, iPlayerX, iPlayerY
|
|
INT iDirections[ciSCGW_MAX_GANG_BACKUP_VEHICLES]
|
|
INT iOrigins[ciSCGW_MAX_GANG_BACKUP_VEHICLES]
|
|
INT iIncrement = 1
|
|
SCGW_GET_POSITION_COORDS(iPosition, iPlayerX, iPlayerY)
|
|
|
|
IF (GET_RANDOM_BOOL())
|
|
//Vertical Vehicles
|
|
IF iPlayerX % 2 = 0
|
|
//Need to move 2 grid spaces over so the cars go either side of the buildings
|
|
iIncrement = 2
|
|
ENDIF
|
|
|
|
FOR i = 0 TO ciSCGW_MAX_GANG_BACKUP_VEHICLES - 1
|
|
BOOL bUp = GET_RANDOM_BOOL()
|
|
iDirections[i] = PICK_INT(bUp, ciSCGW_GRID_DIRECTION_UP, ciSCGW_GRID_DIRECTION_DOWN)
|
|
iOrigins[i] = SCGW_GET_POSITION_FROM_COORDS(iPlayerX + iIncrement, PICK_INT(bUp, ciSCGW_MAX_PLAYER_POSITIONS_Y - 1, 0))
|
|
|
|
//Make increment negative for next vehicle
|
|
iIncrement *= -1
|
|
ENDFOR
|
|
ELSE
|
|
//Horizontal Vehicles
|
|
IF iPlayerY % 2 = 0
|
|
//Need to move 2 grid spaces over so the cars go either side of the buildings
|
|
iIncrement = 2
|
|
ENDIF
|
|
|
|
FOR i = 0 TO ciSCGW_MAX_GANG_BACKUP_VEHICLES - 1
|
|
BOOL bLeft = GET_RANDOM_BOOL()
|
|
iDirections[i] = PICK_INT(bLeft, ciSCGW_GRID_DIRECTION_LEFT, ciSCGW_GRID_DIRECTION_RIGHT)
|
|
iOrigins[i] = SCGW_GET_POSITION_FROM_COORDS(PICK_INT(bLeft, ciSCGW_MAX_PLAYER_POSITIONS_X - 1, 0), iPlayerY + iIncrement)
|
|
|
|
//Make increment negative for next vehicle
|
|
iIncrement *= -1
|
|
ENDFOR
|
|
ENDIF
|
|
|
|
INT iVehicleOffset = (ciSCGW_MAX_ACTIVE_VEHICLES - ciSCGW_MAX_GANG_BACKUP_VEHICLES)
|
|
FOR i = 0 TO ciSCGW_MAX_GANG_BACKUP_VEHICLES - 1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SPAWN_GANG_BACKUP_VEHICLES - Spawning backup vehicle ", i, " for gang: ", iGang, " origin: ", iOrigins[i], " direction: ", iDirections[i])
|
|
SCGW_ServerBD.sVehicles[i + iVehicleOffset].iVehicleOrigin = iOrigins[i]
|
|
SCGW_ServerBD.sVehicles[i + iVehicleOffset].iVehicleTime = NATIVE_TO_INT(GET_NETWORK_TIME()) + ciSCGW_VEHICLE_DELAY
|
|
SCGW_ServerBD.sVehicles[i + iVehicleOffset].iVehicleDirection = iDirections[i]
|
|
SCGW_ServerBD.sVehicles[i + iVehicleOffset].iVehicleType = ciSCGW_AMBIENT_VEHICLE_TYPES + iGang
|
|
ENDFOR
|
|
|
|
SCGW_ServerBD.iLastVehicleSpawnTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processes the spawning of vehicles
|
|
/// HOST ONLY
|
|
/// TODO: Check for potential collisions
|
|
PROC SCGW_PROCESS_SERVER_VEHICLES()
|
|
|
|
IF !sSCGWData.sLocalPlayer.bIsHost
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF (NATIVE_TO_INT(GET_NETWORK_TIME()) < SCGW_ServerBD.iLastVehicleSpawnTime + ciSCGW_VEHICLE_INTERVAL)
|
|
EXIT
|
|
ENDIF
|
|
|
|
//Set on attempt to spawn so we don't spam this method if spawning is blocked somehow
|
|
SCGW_ServerBD.iLastVehicleSpawnTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_SERVER_VEHICLES - Attempting to spawn vehicle")
|
|
|
|
INT iVehicleX
|
|
INT iVehicleY
|
|
INT iDirection
|
|
|
|
IF (GET_RANDOM_BOOL())
|
|
//Vertical
|
|
BOOL bUp = GET_RANDOM_BOOL()
|
|
iVehicleX = GET_RANDOM_INT_IN_RANGE(0, ciSCGW_MAX_PLAYER_POSITIONS_X)
|
|
IF iVehicleX % 2 != 0
|
|
iVehicleX++
|
|
IF iVehicleX >= ciSCGW_MAX_PLAYER_POSITIONS_X
|
|
iVehicleX = 0
|
|
ENDIF
|
|
ENDIF
|
|
iVehicleY = PICK_INT(bUp, ciSCGW_MAX_PLAYER_POSITIONS_Y - 1, 0)
|
|
iDirection = PICK_INT(bUp, ciSCGW_GRID_DIRECTION_UP, ciSCGW_GRID_DIRECTION_DOWN)
|
|
ELSE
|
|
//Horizontal
|
|
BOOL bLeft = GET_RANDOM_BOOL()
|
|
iVehicleX = PICK_INT(bLeft, ciSCGW_MAX_PLAYER_POSITIONS_X - 1, 0)
|
|
iVehicleY = GET_RANDOM_INT_IN_RANGE(0, ciSCGW_MAX_PLAYER_POSITIONS_Y)
|
|
IF iVehicleY % 2 != 0
|
|
iVehicleY++
|
|
IF iVehicleY >= ciSCGW_MAX_PLAYER_POSITIONS_Y
|
|
iVehicleY = 0
|
|
ENDIF
|
|
ENDIF
|
|
iDirection = PICK_INT(bLeft, ciSCGW_GRID_DIRECTION_LEFT, ciSCGW_GRID_DIRECTION_RIGHT)
|
|
ENDIF
|
|
|
|
SCGW_ServerBD.sVehicles[0].iVehicleTime = NATIVE_TO_INT(GET_NETWORK_TIME()) + ciSCGW_VEHICLE_DELAY
|
|
SCGW_ServerBD.sVehicles[0].iVehicleOrigin = SCGW_GET_POSITION_FROM_COORDS(iVehicleX, iVehicleY)
|
|
SCGW_ServerBD.sVehicles[0].iVehicleDirection = iDirection
|
|
SCGW_ServerBD.sVehicles[0].iVehicleType = GET_RANDOM_INT_IN_RANGE(0, ciSCGW_AMBIENT_VEHICLE_TYPES)
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_SERVER_VEHICLES - spawning vehicle of type ", SCGW_ServerBD.sVehicles[0].iVehicleType, " at (", iVehicleX,", ", iVehicleY, ")")
|
|
|
|
ENDPROC
|
|
|
|
|
|
// ------------------------------ INITIALIZATION ------------------------------
|
|
|
|
/// PURPOSE:
|
|
/// Initializes a grid cell to be owned by a gang, including trails
|
|
/// PARAMS:
|
|
/// iGang -
|
|
PROC SCGW_SET_GRID_OWNED_BY_GANG(INT iGang, INT iX, INT iY, BOOL bForIntro = FALSE)
|
|
|
|
INT iGridCenter = SCGW_GET_BUILDING_CENTER(iX, iY)
|
|
|
|
//Top Row - Horizontal
|
|
IF NOT (bForIntro AND iGang = ciSCGW_GANG_BLUE)
|
|
SET_LONG_BIT(SCGW_ServerBD.iPositionOwnershipBS[iGang][ciSCGW_OWNERSHIP_LINK_RIGHT], iGridCenter - ciSCGW_MAX_PLAYER_POSITIONS_X - 1)
|
|
ENDIF
|
|
IF NOT (bForIntro AND iGang = ciSCGW_GANG_YELLOW)
|
|
SET_LONG_BIT(SCGW_ServerBD.iPositionOwnershipBS[iGang][ciSCGW_OWNERSHIP_LINK_RIGHT], iGridCenter - ciSCGW_MAX_PLAYER_POSITIONS_X)
|
|
ENDIF
|
|
//Top Row - Vertical
|
|
SET_LONG_BIT(SCGW_ServerBD.iPositionOwnershipBS[iGang][ciSCGW_OWNERSHIP_LINK_DOWN], iGridCenter - ciSCGW_MAX_PLAYER_POSITIONS_X - 1)
|
|
SET_LONG_BIT(SCGW_ServerBD.iPositionOwnershipBS[iGang][ciSCGW_OWNERSHIP_LINK_DOWN], iGridCenter - ciSCGW_MAX_PLAYER_POSITIONS_X + 1)
|
|
//Middle Row - Vertical
|
|
SET_LONG_BIT(SCGW_ServerBD.iPositionOwnershipBS[iGang][ciSCGW_OWNERSHIP_LINK_DOWN], iGridCenter - 1)
|
|
SET_LONG_BIT(SCGW_ServerBD.iPositionOwnershipBS[iGang][ciSCGW_OWNERSHIP_LINK_DOWN], iGridCenter + 1)
|
|
//Bottom Row - Horizontal
|
|
IF NOT (bForIntro AND iGang = ciSCGW_GANG_PURPLE)
|
|
SET_LONG_BIT(SCGW_ServerBD.iPositionOwnershipBS[iGang][ciSCGW_OWNERSHIP_LINK_RIGHT], iGridCenter + ciSCGW_MAX_PLAYER_POSITIONS_X - 1)
|
|
ENDIF
|
|
IF NOT (bForIntro AND iGang = ciSCGW_GANG_GREEN)
|
|
SET_LONG_BIT(SCGW_ServerBD.iPositionOwnershipBS[iGang][ciSCGW_OWNERSHIP_LINK_RIGHT], iGridCenter + ciSCGW_MAX_PLAYER_POSITIONS_X)
|
|
ENDIF
|
|
//Ownership
|
|
SCGW_ServerBD.iGridGangOwnership[iX][iY] = iGang
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Returns the X grid coord for the gang's start location
|
|
FUNC INT SCGW_GET_STARTING_GRID_FOR_GANG_X(INT iGang)
|
|
|
|
SWITCH iGang
|
|
CASE ciSCGW_GANG_GREEN
|
|
RETURN 0
|
|
CASE ciSCGW_GANG_PURPLE
|
|
RETURN ciSCGW_MAX_GRID_POSITIONS_X - 1
|
|
CASE ciSCGW_GANG_YELLOW
|
|
RETURN 0
|
|
CASE ciSCGW_GANG_BLUE
|
|
RETURN ciSCGW_MAX_GRID_POSITIONS_X - 1
|
|
ENDSWITCH
|
|
|
|
RETURN -1
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Returns the Y grid coord for the gang's start location
|
|
FUNC INT SCGW_GET_STARTING_GRID_FOR_GANG_Y(INT iGang)
|
|
|
|
SWITCH iGang
|
|
CASE ciSCGW_GANG_GREEN
|
|
RETURN 0
|
|
CASE ciSCGW_GANG_PURPLE
|
|
RETURN 0
|
|
CASE ciSCGW_GANG_YELLOW
|
|
RETURN ciSCGW_MAX_GRID_POSITIONS_Y - 1
|
|
CASE ciSCGW_GANG_BLUE
|
|
RETURN ciSCGW_MAX_GRID_POSITIONS_Y - 1
|
|
ENDSWITCH
|
|
|
|
RETURN -1
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Resets all required server data for a new round
|
|
/// HOST ONLY
|
|
PROC INITIALIZE_SERVER_DATA_FOR_NEW_ROUND()
|
|
|
|
IF !sSCGWData.sLocalPlayer.bIsHost
|
|
EXIT
|
|
ENDIF
|
|
|
|
INT i, j, k
|
|
|
|
SCGW_ServerBD.bSuddenDeath = FALSE
|
|
SCGW_ServerBD.bAllDeadSuddenDeath = FALSE
|
|
|
|
//Gang Ownership
|
|
FOR i = 0 TO ciSCGW_MAX_GRID_POSITIONS_X - 1
|
|
FOR j = 0 TO ciSCGW_MAX_GRID_POSITIONS_Y - 1
|
|
SCGW_ServerBD.iGridGangOwnership[i][j] = ciSCGW_GANG_NONE
|
|
ENDFOR
|
|
ENDFOR
|
|
|
|
//Trails & Score
|
|
FOR i = 0 TO ciSCGW_GANG_MAX - 1
|
|
SCGW_UF_ServerBD.iCurrentScore[i] = 0
|
|
FOR j = 0 TO ciSCGW_OWNERSHIP_LINK_MAX - 1
|
|
FOR k = 0 TO ciSCGW_GRIDBS_LENGTH - 1
|
|
SCGW_ServerBD.iPositionOwnershipBS[i][j][k] = 0
|
|
ENDFOR
|
|
ENDFOR
|
|
ENDFOR
|
|
|
|
//Starting Territories
|
|
FOR i = 0 TO ciSCGW_GANG_MAX - 1
|
|
IF sSCGWData.iGangPlayers[i] = -1
|
|
RELOOP
|
|
ENDIF
|
|
|
|
SCGW_SET_GRID_OWNED_BY_GANG(i, SCGW_GET_STARTING_GRID_FOR_GANG_X(i), SCGW_GET_STARTING_GRID_FOR_GANG_Y(i), TRUE)
|
|
ENDFOR
|
|
|
|
//Pickups
|
|
FOR i = 0 TO ciSCGW_MAX_SPAWNED_PICKUPS - 1
|
|
SCGW_ServerBD.sPickups[i].iSpawnedPickupLocation = -1
|
|
SCGW_ServerBD.sPickups[i].iSpawnedPickupType = ciSCGW_PICKUPS_NONE
|
|
SCGW_ServerBD.sPickups[i].iSpawnedPickupSpawnTime = -HIGHEST_INT
|
|
ENDFOR
|
|
|
|
//Vehicles
|
|
FOR i = 0 TO ciSCGW_MAX_ACTIVE_VEHICLES - 1
|
|
SCGW_ServerBD.sVehicles[i].iVehicleTime = -HIGHEST_INT
|
|
SCGW_ServerBD.sVehicles[i].iVehicleOrigin = -1
|
|
SCGW_ServerBD.sVehicles[i].iVehicleDirection = -1
|
|
SCGW_ServerBD.sVehicles[i].iVehicleType = -1
|
|
ENDFOR
|
|
|
|
//Round up to nearest second for nicer flashing <15 secs
|
|
SCGW_ServerBD.iStartTime = CEIL(TO_FLOAT(NATIVE_TO_INT(GET_NETWORK_TIME()) + ciSCGW_START_TIME_OFFSET)/1000.0) * 1000
|
|
|
|
//Run once to init scores
|
|
SCGW_PROCESS_SERVER_BUILDING_OWNERSHIP()
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Resets all required client and local player broadcast data for a new round
|
|
PROC INITIALIZE_CLIENT_DATA_FOR_NEW_ROUND()
|
|
|
|
SCGW_SET_LOCAL_PLAYER_START_POSITION()
|
|
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iHealth = ciSCGW_MAX_PLAYER_HEALTH
|
|
SCGW_SET_PLAYER_STATE(SCGW_PLAYER_STATE_ALIVE)
|
|
|
|
INT i,j
|
|
FOR i = 0 TO ciSCGW_MAX_PLAYER_SHOTS - 1
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].sProjectiles[i].iShotTime = -HIGHEST_INT
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].sProjectiles[i].vShotOrigin.x = -1
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].sProjectiles[i].vShotOrigin.y = -1
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].sProjectiles[i].iShotDirection = -1
|
|
SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].sProjectiles[i].iShotWeaponType = -1
|
|
FOR j = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
sSCGWData.sPlayers[j].sProjectiles[i].vLastFrameBulletPosition = INIT_VECTOR_2D(-1, -1)
|
|
ENDFOR
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO ciSCGW_MAX_GRID_POSITIONS_X - 1
|
|
FOR j = 0 TO ciSCGW_MAX_GRID_POSITIONS_Y - 1
|
|
sSCGWData.iGangOwnershipLastChanged[i][j] = -HIGHEST_INT
|
|
sSCGWData.iPreviousGangOwnership[i][j] = -1
|
|
sSCGWData.iLastFrameGangOwnership[i][j] = -1
|
|
ENDFOR
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
sSCGWData.sPlayers[i].iDisplayHealth = ciSCGW_MAX_PLAYER_HEALTH
|
|
ENDFOR
|
|
|
|
sSCGWData.iFlyoverTime = -HIGHEST_INT
|
|
sSCGWData.vFlyoverPos = INIT_VECTOR_2D(0.0, 0.0)
|
|
|
|
SET_BIT(sSCGWData.iLocalBS, ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED)
|
|
SET_BIT(sSCGWData.iLocalBS, ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED_HALF)
|
|
CLEAR_BIT(sSCGWData.iLocalBS, ciSCGW_LOCALBS_DIED_THIS_ROUND)
|
|
CLEAR_BIT(sSCGWData.iLocalBS, ciSCGW_LOCALBS_FIRST_MOVE_DONE)
|
|
|
|
RESET_NET_TIMER(sSCGWData.tdSuddenDeathText)
|
|
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastRespawnTime = -HIGHEST_INT
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].fMoveSpeed = cfSCGW_BASE_SPEED
|
|
|
|
INT iUnpackedInitials[ciARCADE_CABINET_LEADERBOARD_INITIALS]
|
|
ARCADE_UNPACK_LEADERBOARD_INITIALS(SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLeaderboardInitials, iUnpackedInitials)
|
|
iUnpackedInitials[ciARCADE_CABINET_LEADERBOARD_INITIALS - 1] = SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iGang
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLeaderboardInitials = ARCADE_PACK_LEADERBOARD_INITIALS(iUnpackedInitials)
|
|
|
|
sSCGWData.sLocalPlayer.iSpeedBoostRemainingMoves = 0
|
|
sSCGWData.iNextExplosionIndex = 0
|
|
sSCGWData.iNextShotIndex = 0
|
|
sSCGWData.iAudioBS = 0
|
|
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iEquippedWeaponType = ciSCGW_WEAPON_NONE
|
|
|
|
ENDPROC
|
|
|
|
PROC INITIALIZE_CLIENT_DATA_FOR_NEW_ROUND_BOT(INT iBot)
|
|
|
|
SCGW_SET_LOCAL_PLAYER_START_POSITION_BOT(iBot)
|
|
|
|
SCGW_Bot[iBot].SCGW_player.iHealth = ciSCGW_MAX_PLAYER_HEALTH
|
|
SCGW_SET_PLAYER_STATE_BOT(iBot,SCGW_PLAYER_STATE_ALIVE)
|
|
|
|
INT i,j
|
|
FOR i = 0 TO ciSCGW_MAX_PLAYER_SHOTS - 1
|
|
SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[i].iShotTime = -HIGHEST_INT
|
|
SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[i].vShotOrigin.x = -1
|
|
SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[i].vShotOrigin.y = -1
|
|
SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[i].iShotDirection = -1
|
|
SCGW_Bot[iBot].SCGW_UF_Player.sProjectiles[i].iShotWeaponType = -1
|
|
FOR j = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
sSCGWData.sPlayers[j].sProjectiles[i].vLastFrameBulletPosition = INIT_VECTOR_2D(-1, -1)
|
|
ENDFOR
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO ciSCGW_MAX_GRID_POSITIONS_X - 1
|
|
FOR j = 0 TO ciSCGW_MAX_GRID_POSITIONS_Y - 1
|
|
sSCGWData.iGangOwnershipLastChanged[i][j] = -HIGHEST_INT
|
|
sSCGWData.iPreviousGangOwnership[i][j] = -1
|
|
sSCGWData.iLastFrameGangOwnership[i][j] = -1
|
|
ENDFOR
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
sSCGWData.sPlayers[i].iDisplayHealth = ciSCGW_MAX_PLAYER_HEALTH
|
|
ENDFOR
|
|
|
|
sSCGWData.iFlyoverTime = -HIGHEST_INT
|
|
sSCGWData.vFlyoverPos = INIT_VECTOR_2D(0.0, 0.0)
|
|
|
|
SET_BIT(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED)
|
|
SET_BIT(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_CURRENT_MOVE_PROCESSED_HALF)
|
|
CLEAR_BIT(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_DIED_THIS_ROUND)
|
|
CLEAR_BIT(sSCGWData.iBotBS[iBot], ciSCGW_LOCALBS_FIRST_MOVE_DONE)
|
|
|
|
RESET_NET_TIMER(sSCGWData.tdSuddenDeathText)
|
|
|
|
SCGW_Bot[iBot].SCGW_player.iLastRespawnTime = -HIGHEST_INT
|
|
SCGW_Bot[iBot].SCGW_player.fMoveSpeed = cfSCGW_BASE_SPEED
|
|
|
|
sSCGWData.sLocalPlayer.iSpeedBoostRemainingMoves = 0
|
|
sSCGWData.iNextExplosionIndex = 0
|
|
sSCGWData.iNextShotIndex = 0
|
|
sSCGWData.iAudioBS = 0
|
|
|
|
SCGW_Bot[iBot].SCGW_player.iEquippedWeaponType = ciSCGW_WEAPON_NONE
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Initializes the tile layout for the entire game
|
|
/// HOST ONLY
|
|
PROC SCGW_INITIALIZE_MAP_TILES()
|
|
|
|
IF !sSCGWData.sLocalPlayer.bIsHost
|
|
EXIT
|
|
ENDIF
|
|
|
|
INT i, j
|
|
INT iTiles[ciSCGW_MAX_GRID_SPRITES]
|
|
FOR i = 0 TO ciSCGW_MAX_GRID_SPRITES - 1
|
|
iTiles[i] = i
|
|
ENDFOR
|
|
|
|
SET_RANDOM_SEED(NATIVE_TO_INT(GET_NETWORK_TIME()))
|
|
FOR i = 0 TO ciSCGW_MAX_GRID_SPRITES - 1
|
|
j = GET_RANDOM_INT_IN_RANGE(0, ciSCGW_MAX_GRID_SPRITES)
|
|
INT iSwap = iTiles[i]
|
|
iTiles[i] = iTiles[j]
|
|
iTiles[j] = iSwap
|
|
ENDFOR
|
|
|
|
INT iTileIndex = 0
|
|
FOR i = 0 TO ciSCGW_MAX_GRID_POSITIONS_X - 1
|
|
FOR j = 0 TO ciSCGW_MAX_GRID_POSITIONS_Y - 1
|
|
SCGW_ServerBD.iGridSpriteIndexes[i][j] = iTiles[iTileIndex]
|
|
iTileIndex++
|
|
ENDFOR
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL SCGW_IS_ANY_BOT_ACTIVE()
|
|
INT iBot
|
|
FOR iBot = 0 TO ciSCGW_GANG_MAX - 1
|
|
IF SCGW_Bot[iBot].bActive
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDFOR
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
|
|
// ------------------------------ CLIENT STATE MACHINE ------------------------------
|
|
|
|
/// PURPOSE:
|
|
/// Updates the client state
|
|
PROC SCGW_SET_CLIENT_STATE(SCGW_CLIENT_STATE eNewState)
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SET_CLIENT_STATE - State changed from ",
|
|
SCGW_DEBUG_GET_CLIENT_STATE_AS_STRING(sSCGWData.eCurrentState), " to ", SCGW_DEBUG_GET_CLIENT_STATE_AS_STRING(eNewState))
|
|
|
|
sSCGWData.eCurrentState = eNewState
|
|
|
|
ENDPROC
|
|
|
|
FUNC INT GET_TELEMETRY_LOCATION()
|
|
IF PLAYER_ID() != INVALID_PLAYER_INDEX()
|
|
SWITCH GET_SIMPLE_INTERIOR_TYPE_LOCAL_PLAYER_IS_IN()
|
|
CASE SIMPLE_INTERIOR_TYPE_ARCADE
|
|
RETURN HASH("SIMPLE_INTERIOR_TYPE_ARCADE")
|
|
BREAK
|
|
CASE SIMPLE_INTERIOR_TYPE_CASINO_APARTMENT
|
|
RETURN HASH("SIMPLE_INTERIOR_TYPE_CASINO_APARTMENT")
|
|
BREAK
|
|
|
|
DEFAULT
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] [GET_TELEMETRY_LOCATION] not in valid location, setting sArcadePlayStats.location = 0")
|
|
RETURN 0
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MINIGAME, "[SCGW] [JS] [GET_TELEMETRY_LOCATION] Invalid Player ID, setting sArcadePlayStats.location = 0")
|
|
RETURN 0
|
|
ENDIF
|
|
|
|
RETURN 0
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Final cleanup procedure: removes all assets and resets player state.
|
|
PROC SCGW_CLEANUP_AND_EXIT_CLIENT()
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] - SCGW_CLEANUP_AND_EXIT_CLIENT - Cleaning up and terminating the script")
|
|
|
|
IF SCGW_IS_ANY_BOT_ACTIVE()
|
|
sArcadePlayStats.numPlayers = 1
|
|
ENDIF
|
|
|
|
sArcadePlayStats.location = GET_TELEMETRY_LOCATION()
|
|
ARCADE_SEND_PLAY_STATS()
|
|
|
|
ARCADE_CABINET_COMMON_CLEANUP()
|
|
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPArcadeCabinetGrid")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPArcadeCabinetGridTiles")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPArcadeCabinetGridPlayerBlue")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPArcadeCabinetGridPlayerGreen")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPArcadeCabinetGridPlayerPurple")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPArcadeCabinetGridPlayerYellow")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPArcadeCabinetGridHUD")
|
|
|
|
CLEAR_ADDITIONAL_TEXT(MINIGAME_TEXT_SLOT,TRUE)
|
|
|
|
IF (sSCGWData.binkIntro != NULL)
|
|
RELEASE_BINK_MOVIE(sSCGWData.binkIntro)
|
|
ENDIF
|
|
|
|
//Audio
|
|
IF IS_AUDIO_SCENE_ACTIVE("dlc_vw_am_tw_in_menus_scene")
|
|
STOP_AUDIO_SCENE("dlc_vw_am_tw_in_menus_scene")
|
|
ENDIF
|
|
IF IS_AUDIO_SCENE_ACTIVE("dlc_vw_am_tw_in_gameplay_scene")
|
|
STOP_AUDIO_SCENE("dlc_vw_am_tw_in_gameplay_scene")
|
|
ENDIF
|
|
IF IS_AUDIO_SCENE_ACTIVE("dlc_vw_am_tw_vehicle_drivethrough_scene")
|
|
STOP_AUDIO_SCENE("dlc_vw_am_tw_vehicle_drivethrough_scene")
|
|
ENDIF
|
|
SCGW_TRIGGER_MUSIC_EVENT(SCGW_GET_MUSIC_EVENT_STRING(SCGW_MUSIC_EVENT_STOP_MUSIC))
|
|
INT i
|
|
FOR i = 0 TO ciSCGW_MAX_ACTIVE_VEHICLES - 1
|
|
IF sSCGWData.sVehicles[i].iVehicleLoopSoundId >= 0
|
|
STOP_SOUND(sSCGWData.sVehicles[i].iVehicleLoopSoundId)
|
|
RELEASE_SOUND_ID(sSCGWData.sVehicles[i].iVehicleLoopSoundId)
|
|
ENDIF
|
|
IF sSCGWData.sVehicles[i].iVehicleWarningSoundId >= 0
|
|
STOP_SOUND(sSCGWData.sVehicles[i].iVehicleWarningSoundId)
|
|
RELEASE_SOUND_ID(sSCGWData.sVehicles[i].iVehicleWarningSoundId)
|
|
ENDIF
|
|
ENDFOR
|
|
FOR i = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
IF sSCGWData.sPlayers[i].iWalkingSoundId >= 0
|
|
STOP_SOUND(sSCGWData.sPlayers[i].iWalkingSoundId)
|
|
RELEASE_SOUND_ID(sSCGWData.sPlayers[i].iWalkingSoundId)
|
|
ENDIF
|
|
IF sSCGWData.sPlayers[i].iPlayerSoundId >= 0
|
|
STOP_SOUND(sSCGWData.sPlayers[i].iPlayerSoundId)
|
|
RELEASE_SOUND_ID(sSCGWData.sPlayers[i].iPlayerSoundId)
|
|
ENDIF
|
|
IF sSCGWData.sPlayers[i].iShotSoundId >= 0
|
|
STOP_SOUND(sSCGWData.sPlayers[i].iShotSoundId)
|
|
RELEASE_SOUND_ID(sSCGWData.sPlayers[i].iShotSoundId)
|
|
ENDIF
|
|
ENDFOR
|
|
IF sSCGWData.sLocalPlayer.iDeathSoundId >= 0
|
|
STOP_SOUND(sSCGWData.sLocalPlayer.iDeathSoundId)
|
|
RELEASE_SOUND_ID(sSCGWData.sLocalPlayer.iDeathSoundId)
|
|
ENDIF
|
|
IF sSCGWData.iAmbienceSoundId >= 0
|
|
STOP_SOUND(sSCGWData.iAmbienceSoundId)
|
|
RELEASE_SOUND_ID(sSCGWData.iAmbienceSoundId)
|
|
ENDIF
|
|
|
|
//Don't release unless launched from debug?
|
|
RELEASE_NAMED_SCRIPT_AUDIO_BANK("DLC_VINEWOOD/DLC_VW_AM_TW")
|
|
|
|
SCGW_CLEAR_HELP_TEXT()
|
|
|
|
//Set the state so calling the main update function does nothing.
|
|
SCGW_SET_CLIENT_STATE(SCGW_CLIENT_STATE_FINISHED)
|
|
|
|
g_sCasinoArcadeStreetCrimeVars.ePlayerState = CASINO_ARCADE_STREET_CRIME_PLAYER_STATE_NOT_PLAYING
|
|
g_sCasinoArcadeStreetCrimeVars.eThisFrameAction = CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_NONE
|
|
|
|
SET_PLAYER_PLAYING_ARCADE_GAME_WITH_AI(FALSE)
|
|
|
|
|
|
TERMINATE_THIS_MULTIPLAYER_THREAD_NO_ARGS()
|
|
|
|
ENDPROC
|
|
|
|
//~~~~~ Client State Machine State Updates ~~~~~
|
|
|
|
/// PURPOSE:
|
|
/// Processing for the client state: SCGW_CLIENT_STATE_INITIALISING
|
|
PROC SCGW_PROCESS_CLIENT_STATE_INITIALISING()
|
|
|
|
IF SCGW_ServerBD.eCurrentServerState > SCGW_SERVER_STATE_LAUNCHING
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_CLIENT_STATE_INITIALISING - JOINED LATE, BAILING")
|
|
IF IS_PLAYER_IN_ARCADE_PROPERTY(PLAYER_ID())
|
|
sSCGWData.sArcadeCabinetAnimEvent.bLoopAnim = FALSE
|
|
sSCGWData.sArcadeCabinetAnimEvent.bHoldLastFrame = FALSE
|
|
PLAY_ARCADE_CABINET_ANIMATION(sSCGWData.sArcadeCabinetAnimEvent, ARCADE_CABINET_ANIM_CLIP_EXIT)
|
|
ENDIF
|
|
SCGW_SET_CLIENT_STATE(SCGW_CLIENT_STATE_CLEANUP)
|
|
EXIT
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iGang = ciSCGW_GANG_NONE
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iGang = 0
|
|
sSCGWData.sDebug.bDebugOnePlayerTest = TRUE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_CLIENT_STATE_INITIALISING - GAME LAUNCHED WITH ONE PLAYER FROM M MENU")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
ARCADE_CABINET_COMMON_INITIALIZATION()
|
|
|
|
ARCADE_GAMES_POSTFX_INIT(CASINO_ARCADE_GAME_STREET_CRIMES)
|
|
SCGW_INITIALIZE_POSITION_DATA_STRUCT()
|
|
SCGW_INITIALIZE_COLOURS()
|
|
SCGW_INITIALIZE_GANGS()
|
|
SCGW_INITIALIZE_VEHICLE_TYPES()
|
|
SCGW_INITIALIZE_PICKUP_TYPES()
|
|
SCGW_INITIALIZE_WEAPON_TYPES()
|
|
|
|
INT i, j
|
|
FOR i = 0 TO ciSCGW_MAX_GRID_POSITIONS_X - 1
|
|
FOR j = 0 TO ciSCGW_MAX_GRID_POSITIONS_Y - 1
|
|
sSCGWData.iGangOwnershipLastChanged[i][j] = -HIGHEST_INT
|
|
sSCGWData.iPreviousGangOwnership[i][j] = -1
|
|
sSCGWData.iLastFrameGangOwnership[i][j] = -1
|
|
ENDFOR
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO ciSCGW_GANG_MAX - 1
|
|
sSCGWData.iGangPlayerJoinTimes[i] = -HIGHEST_INT
|
|
ENDFOR
|
|
|
|
sSCGWData.binkIntro = SET_BINK_MOVIE("DegenSting_StreetCrime_1920x1080_auto")
|
|
|
|
SCGW_SET_CLIENT_STATE(SCGW_CLIENT_STATE_REQUESTING_ASSETS)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processing for the client state: SCGW_CLIENT_STATE_REQUESTING_ASSETS
|
|
PROC SCGW_PROCESS_CLIENT_STATE_REQUESTING_ASSETS()
|
|
|
|
|
|
IF NOT ARCADE_GAMES_POSTFX_REQUESTING_ASSETS()
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[IAP] [JS] IAP_HAVE_ALL_ASSETS_LOADED - Loading PostFX")
|
|
EXIT
|
|
ENDIF
|
|
|
|
//Textures
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPArcadeCabinetGrid")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPArcadeCabinetGrid")
|
|
PRINTLN("[SCGW] [JS] SCGW_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPArcadeCabinetGrid")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPArcadeCabinetGridPlayerYellow")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPArcadeCabinetGridPlayerYellow")
|
|
PRINTLN("[SCGW] [JS] SCGW_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPArcadeCabinetGridPlayerYellow")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPArcadeCabinetGridPlayerPurple")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPArcadeCabinetGridPlayerPurple")
|
|
PRINTLN("[SCGW] [JS] SCGW_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPArcadeCabinetGridPlayerPurple")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPArcadeCabinetGridPlayerGreen")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPArcadeCabinetGridPlayerGreen")
|
|
PRINTLN("[SCGW] [JS] SCGW_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPArcadeCabinetGridPlayerGreen")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPArcadeCabinetGridPlayerBlue")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPArcadeCabinetGridPlayerBlue")
|
|
PRINTLN("[SCGW] [JS] SCGW_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPArcadeCabinetGridPlayerBlue")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPArcadeCabinetGridTiles")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPArcadeCabinetGridTiles")
|
|
PRINTLN("[SCGW] [JS] SCGW_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPArcadeCabinetGridTiles")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPArcadeCabinetGridHUD")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPArcadeCabinetGridHUD")
|
|
PRINTLN("[SCGW] [JS] SCGW_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPArcadeCabinetGridHUD")
|
|
EXIT
|
|
ENDIF
|
|
|
|
//Text
|
|
REQUEST_ADDITIONAL_TEXT("SCGW", MINIGAME_TEXT_SLOT)
|
|
IF NOT HAS_THIS_ADDITIONAL_TEXT_LOADED("SCGW", MINIGAME_TEXT_SLOT)
|
|
PRINTLN("[SCGW] [JS] SCGW_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading Text")
|
|
EXIT
|
|
ENDIF
|
|
|
|
//Audio
|
|
IF NOT REQUEST_SCRIPT_AUDIO_BANK("DLC_VINEWOOD/DLC_VW_AM_TW")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading Audio Bank DLC_VINEWOOD/DLC_VW_AM_TW")
|
|
EXIT
|
|
ENDIF
|
|
|
|
SCGW_SET_CLIENT_STATE(SCGW_CLIENT_STATE_INTRO_VIDEO)
|
|
PLAY_BINK_MOVIE(sSCGWData.binkIntro)
|
|
SET_BINK_SHOULD_SKIP(sSCGWData.binkIntro, TRUE)
|
|
SCGW_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_Degenatron_Screen")
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_PROCESS_CLIENT_STATE_INTRO_VIDEO()
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("dlc_vw_am_tw_in_menus_scene")
|
|
START_AUDIO_SCENE("dlc_vw_am_tw_in_menus_scene")
|
|
ENDIF
|
|
IF IS_AUDIO_SCENE_ACTIVE("dlc_vw_am_tw_in_gameplay_scene")
|
|
STOP_AUDIO_SCENE("dlc_vw_am_tw_in_gameplay_scene")
|
|
ENDIF
|
|
IF IS_AUDIO_SCENE_ACTIVE("dlc_vw_am_tw_vehicle_drivethrough_scene")
|
|
STOP_AUDIO_SCENE("dlc_vw_am_tw_vehicle_drivethrough_scene")
|
|
ENDIF
|
|
|
|
SCGW_DRAW_BACKGROUND()
|
|
|
|
DRAW_BINK_MOVIE(sSCGWData.binkIntro, cfSCREEN_CENTER, cfSCREEN_CENTER, 1.0 * fAspectRatioModifier, 1.0, 0.0, 255, 255, 255, 255)
|
|
|
|
IF GET_BINK_MOVIE_TIME(sSCGWData.binkIntro) >= 30.0
|
|
AND NOT IS_BIT_SET(sSCGWData.iLocalBS, ciSCGW_LOCALBS_TITLE_MUSIC_STARTED)
|
|
SET_BIT(sSCGWData.iLocalBS, ciSCGW_LOCALBS_TITLE_MUSIC_STARTED)
|
|
SCGW_TRIGGER_MUSIC_EVENT(SCGW_GET_MUSIC_EVENT_STRING(SCGW_MUSIC_EVENT_TITLE_START))
|
|
ENDIF
|
|
|
|
IF GET_BINK_MOVIE_TIME(sSCGWData.binkIntro) >= 99.0
|
|
#IF IS_DEBUG_BUILD
|
|
OR IS_DEBUG_KEY_JUST_PRESSED(KEY_J, KEYBOARD_MODIFIER_NONE, "Skip Intro")
|
|
#ENDIF
|
|
STOP_BINK_MOVIE(sSCGWData.binkIntro)
|
|
RELEASE_BINK_MOVIE(sSCGWData.binkIntro)
|
|
SCGW_SET_CLIENT_STATE(SCGW_CLIENT_STATE_GANG_SCREEN)
|
|
sSCGWData.iGangPlayerJoinTimes[SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iGang] = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
SCGW_SET_GLOBAL_PLAYER_STATE(CASINO_ARCADE_STREET_CRIME_PLAYER_STATE_READY_UP)
|
|
ENDIF
|
|
|
|
ARCADE_GAMES_POSTFX_DRAW()
|
|
SCGW_DRAW_FACADE()
|
|
|
|
ENDPROC
|
|
|
|
FUNC INT SCGW_GET_AVAILABLE_GANG()
|
|
INT iPlayerLoop
|
|
INT iGang
|
|
BOOL bAvailable
|
|
FOR iGang = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
bAvailable = TRUE
|
|
FOR iPlayerLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
IF SCGW_PlayerBD[iPlayerLoop].iGang = iGang
|
|
AND NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iPlayerLoop))
|
|
bAvailable = FALSE
|
|
ENDIF
|
|
IF SCGW_Bot[iPlayerLoop].SCGW_player.iGang = iGang
|
|
bAvailable = FALSE
|
|
ENDIF
|
|
ENDFOR
|
|
IF bAvailable
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_GET_AVAILABLE_GANG - Gang ",iGang," available")
|
|
RETURN iGang
|
|
ENDIF
|
|
ENDFOR
|
|
RETURN -1
|
|
ENDFUNC
|
|
|
|
PROC SCGW_PROCESS_CLIENT_STATE_GANG_SCREEN()
|
|
|
|
SCGW_DRAW_GANG_SCREEN()
|
|
|
|
CONTROL_ACTION CA_Start = INPUT_FRONTEND_PAUSE
|
|
CONTROL_ACTION CA_Back = INPUT_SCRIPT_RRIGHT
|
|
CONTROL_ACTION CA_JoinAI = INPUT_FRONTEND_RLEFT
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
CA_Start = INPUT_FRONTEND_ACCEPT
|
|
CA_Back = INPUT_FRONTEND_DELETE
|
|
ENDIF
|
|
|
|
IF NATIVE_TO_INT(GET_NETWORK_TIME()) > sSCGWData.iReadyPressedTime + ciSCGW_READY_SPAM_DELAY
|
|
IF SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].eCurrentPlayerState != SCGW_PLAYER_STATE_WAITING_TO_START
|
|
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, CA_Start)
|
|
SCGW_CLEAR_HELP_TEXT()
|
|
SCGW_SET_GLOBAL_THIS_FRAME_ACTION(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_READY_UP)
|
|
SCGW_SET_PLAYER_STATE(SCGW_PLAYER_STATE_WAITING_TO_START)
|
|
SCGW_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_Ready")
|
|
sSCGWData.iReadyPressedTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
ENDIF
|
|
IF sSCGWData.bCanAddBots
|
|
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, CA_JoinAI)
|
|
INT iPlayerLoop
|
|
FOR iPlayerLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
IF NOT NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iPlayerLoop))
|
|
AND NOT SCGW_Bot[iPlayerLoop].bActive
|
|
// IF SCGW_Bot[iPlayerLoop].SCGW_player.iGang = -1
|
|
SCGW_Bot[iPlayerLoop].SCGW_player.iGang = SCGW_GET_AVAILABLE_GANG()
|
|
SCGW_Bot[iPlayerLoop].bActive = TRUE
|
|
SCGW_Bot[iPlayerLoop].SCGW_player.eCurrentPlayerState = SCGW_PLAYER_STATE_WAITING_TO_START
|
|
BREAKLOOP
|
|
// ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].eCurrentPlayerState = SCGW_PLAYER_STATE_WAITING_TO_START
|
|
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, CA_Back)
|
|
SCGW_CLEAR_HELP_TEXT()
|
|
SCGW_SET_PLAYER_STATE(SCGW_PLAYER_STATE_INITIALISING)
|
|
SCGW_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_Unready")
|
|
sSCGWData.iReadyPressedTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SCGW_PROCESS_GANG_SCREEN_HELP_TEXT()
|
|
|
|
IF SCGW_ServerBD.eCurrentServerState >= SCGW_SERVER_STATE_INIT_ROUND
|
|
SCGW_SET_CLIENT_STATE(SCGW_CLIENT_STATE_LAUNCHING)
|
|
SCGW_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_Start_Game")
|
|
ARCADE_INITIALISE_PLAY_STATS(TRUE)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processing for the client state: SCGW_CLIENT_STATE_LAUNCHING
|
|
PROC SCGW_PROCESS_CLIENT_STATE_LAUNCHING()
|
|
|
|
SCGW_DRAW_GAME_STATIC()
|
|
SCGW_PROCESS_HELP_TEXT()
|
|
|
|
IF SCGW_ServerBD.eCurrentServerState <= SCGW_SERVER_STATE_LAUNCHING
|
|
EXIT
|
|
ENDIF
|
|
|
|
sArcadePlayStats.numPlayers = sSCGWData.iConnectedPlayers
|
|
|
|
SCGW_SET_CLIENT_STATE(SCGW_CLIENT_STATE_INIT_ROUND)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processing for the client state: SCGW_CLIENT_STATE_INIT_ROUND
|
|
PROC SCGW_PROCESS_CLIENT_STATE_INIT_ROUND()
|
|
|
|
SCGW_DRAW_GAME_STATIC()
|
|
SCGW_PROCESS_HELP_TEXT()
|
|
|
|
IF SCGW_ServerBD.eCurrentServerState <= SCGW_SERVER_STATE_INIT_ROUND
|
|
EXIT
|
|
ENDIF
|
|
|
|
INITIALIZE_CLIENT_DATA_FOR_NEW_ROUND()
|
|
INT iBot
|
|
FOR iBot = 0 TO ciSCGW_MAX_PLAYERS-1
|
|
IF iBot != sSCGWData.sLocalPlayer.iLocalPart
|
|
AND SCGW_Bot[iBot].bActive
|
|
INITIALIZE_CLIENT_DATA_FOR_NEW_ROUND_BOT(iBot)
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
SCGW_SET_GLOBAL_PLAYER_STATE(CASINO_ARCADE_STREET_CRIME_PLAYER_STATE_COUNTDOWN)
|
|
|
|
SCGW_SET_CLIENT_STATE(SCGW_CLIENT_STATE_COUNTDOWN)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processing for the client state: SCGW_CLIENT_STATE_COUNTDOWN
|
|
PROC SCGW_PROCESS_CLIENT_STATE_COUNTDOWN()
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("dlc_vw_am_tw_in_menus_scene")
|
|
STOP_AUDIO_SCENE("dlc_vw_am_tw_in_menus_scene")
|
|
ENDIF
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("dlc_vw_am_tw_in_gameplay_scene")
|
|
START_AUDIO_SCENE("dlc_vw_am_tw_in_gameplay_scene")
|
|
ENDIF
|
|
IF IS_AUDIO_SCENE_ACTIVE("dlc_vw_am_tw_vehicle_drivethrough_scene")
|
|
STOP_AUDIO_SCENE("dlc_vw_am_tw_vehicle_drivethrough_scene")
|
|
ENDIF
|
|
|
|
SCGW_START_LOOPING_GLOBAL_SOUND("Ambience", sSCGWData.iAmbienceSoundId, INIT_VECTOR_2D(-1, -1), FALSE)
|
|
|
|
SCGW_PROCESS_PLAYER_POSITIONS()
|
|
SCGW_PROCESS_PLAYER_POSITIONS_BOT()
|
|
SCGW_PROCESS_HELP_TEXT()
|
|
|
|
SCGW_DRAW_COUNTDOWN_SCREEN()
|
|
|
|
IF NATIVE_TO_INT(GET_NETWORK_TIME()) < SCGW_ServerBD.iStartTime
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT IS_BIT_SET(sSCGWData.iHelpTextBitset, ciSCGW_HELP_BS_MOVEMENT_HELP_SHOWN)
|
|
SET_BIT(sSCGWData.iHelpTextBitset, ciSCGW_HELP_BS_MOVEMENT_HELP_SHOWN)
|
|
SCGW_TRIGGER_HELP_TEXT("SCGW_H_MOVE", ciSCGW_DEFAULT_HELP_TEXT_TIME)
|
|
ENDIF
|
|
|
|
SCGW_SET_GLOBAL_PLAYER_STATE(CASINO_ARCADE_STREET_CRIME_PLAYER_STATE_PLAYING)
|
|
SCGW_TRIGGER_MUSIC_EVENT(SCGW_GET_MUSIC_EVENT_STRING(SCGW_MUSIC_EVENT_GAMEPLAY))
|
|
|
|
SCGW_SET_CLIENT_STATE(SCGW_CLIENT_STATE_RUNNING)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processing for the client state: SCGW_CLIENT_STATE_RUNNING
|
|
PROC SCGW_PROCESS_CLIENT_STATE_RUNNING()
|
|
|
|
SCGW_START_LOOPING_GLOBAL_SOUND("Ambience", sSCGWData.iAmbienceSoundId, INIT_VECTOR_2D(-1, -1), FALSE)
|
|
|
|
SCGW_PROCESS_INPUT()
|
|
INT iBot
|
|
FOR iBot = 0 TO ciSCGW_MAX_PLAYERS-1
|
|
IF iBot != sSCGWData.sLocalPlayer.iLocalPart
|
|
AND SCGW_Bot[iBot].bActive
|
|
SCGW_PROCESS_INPUT_BOT(iBot)
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
SCGW_PROCESS_PLAYER_POSITIONS()
|
|
SCGW_PROCESS_PLAYER_POSITIONS_BOT()
|
|
SCGW_PROCESS_VEHICLE_POSITIONS()
|
|
SCGW_PROCESS_SHOT_POSITIONS()
|
|
SCGW_PROCESS_SHOT_POSITIONS_BOT()
|
|
|
|
SCGW_PROCESS_FLYOVERS()
|
|
|
|
SCGW_PROCESS_LOCAL_PLAYER_RESPAWNING()
|
|
FOR iBot = 0 TO ciSCGW_MAX_PLAYERS-1
|
|
IF iBot != sSCGWData.sLocalPlayer.iLocalPart
|
|
AND SCGW_Bot[iBot].bActive
|
|
SCGW_PROCESS_LOCAL_PLAYER_RESPAWNING_BOT(iBot)
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
SCGW_DRAW_GAME_RUNNING()
|
|
|
|
SCGW_PROCESS_HELP_TEXT()
|
|
|
|
SCGW_PROCESS_ZERO_TERRITORIES_SOUND_LOOP()
|
|
|
|
IF sSCGWData.iLastFrameWinningPart != sSCGWData.iWinningPart
|
|
IF sSCGWData.iLastFrameWinningPart = sSCGWData.sLocalPlayer.iLocalPart
|
|
SCGW_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_Player_Loses_Lead")
|
|
ELIF sSCGWData.iWinningPart = sSCGWData.sLocalPlayer.iLocalPart
|
|
SCGW_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_Player_Takes_Lead")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF SCGW_ServerBD.bSuddenDeath
|
|
AND NOT HAS_NET_TIMER_STARTED(sSCGWData.tdSuddenDeathText)
|
|
SCGW_TRIGGER_MUSIC_EVENT(SCGW_GET_MUSIC_EVENT_STRING(SCGW_MUSIC_EVENT_SUDDEN_DEATH))
|
|
REINIT_NET_TIMER(sSCGWData.tdSuddenDeathText)
|
|
ENDIF
|
|
|
|
IF (SCGW_ServerBD.eCurrentServerState <= SCGW_SERVER_STATE_RUNNING)
|
|
EXIT
|
|
ENDIF
|
|
|
|
INT i
|
|
FOR i = 0 TO ciSCGW_MAX_ACTIVE_VEHICLES - 1
|
|
IF sSCGWData.sVehicles[i].iVehicleLoopSoundId != -1
|
|
SCGW_STOP_LOOPING_SOUND(sSCGWData.sVehicles[i].iVehicleLoopSoundId)
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
SCGW_CLEAR_HELP_TEXT()
|
|
sArcadePlayStats.score += SCGW_UF_ServerBD.iCurrentScore[SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iGang]
|
|
sSCGWData.iGameWinnerAnimFrame = 0
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLeaderboardScore += SCGW_UF_ServerBD.iCurrentScore[SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iGang]
|
|
SCGW_SET_CLIENT_STATE(SCGW_CLIENT_STATE_ROUND_END_SCREEN)
|
|
SCGW_TRIGGER_MUSIC_EVENT(SCGW_GET_MUSIC_EVENT_STRING(SCGW_MUSIC_EVENT_MID_ROUND))
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processing for the client state: SCGW_CLIENT_STATE_ROUND_END_SCREEN
|
|
PROC SCGW_PROCESS_CLIENT_STATE_ROUND_END_SCREEN()
|
|
|
|
BOOL bRoundEnd = SCGW_SHOULD_CONTINUE_TO_NEXT_ROUND()
|
|
|
|
IF bRoundEnd
|
|
SCGW_DRAW_ROUND_END_SCREEN()
|
|
ELSE
|
|
SCGW_DRAW_GAME_END_SCREEN()
|
|
ENDIF
|
|
|
|
SCGW_PROCESS_HELP_TEXT()
|
|
|
|
IF SCGW_ServerBD.eCurrentServerState >= SCGW_SERVER_STATE_LEADERBOARD
|
|
SCGW_STOP_LOOPING_SOUND(sSCGWData.iAmbienceSoundId)
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("dlc_vw_am_tw_in_menus_scene")
|
|
START_AUDIO_SCENE("dlc_vw_am_tw_in_menus_scene")
|
|
ENDIF
|
|
IF IS_AUDIO_SCENE_ACTIVE("dlc_vw_am_tw_in_gameplay_scene")
|
|
STOP_AUDIO_SCENE("dlc_vw_am_tw_in_gameplay_scene")
|
|
ENDIF
|
|
IF IS_AUDIO_SCENE_ACTIVE("dlc_vw_am_tw_vehicle_drivethrough_scene")
|
|
STOP_AUDIO_SCENE("dlc_vw_am_tw_vehicle_drivethrough_scene")
|
|
ENDIF
|
|
SCGW_TRIGGER_MUSIC_EVENT(SCGW_GET_MUSIC_EVENT_STRING(SCGW_MUSIC_EVENT_TITLE_START))
|
|
SCGW_SET_CLIENT_STATE(SCGW_CLIENT_STATE_LBD_ENTRY)
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF SCGW_ServerBD.eCurrentServerState = SCGW_SERVER_STATE_INIT_ROUND
|
|
OR SCGW_ServerBD.eCurrentServerState = SCGW_SERVER_STATE_COUNTDOWN
|
|
SCGW_STOP_LOOPING_SOUND(sSCGWData.iAmbienceSoundId)
|
|
SCGW_SET_CLIENT_STATE(SCGW_CLIENT_STATE_INIT_ROUND)
|
|
EXIT
|
|
ENDIF
|
|
|
|
SCGW_START_LOOPING_GLOBAL_SOUND("Ambience", sSCGWData.iAmbienceSoundId, INIT_VECTOR_2D(-1, -1), FALSE)
|
|
|
|
IF g_sCasinoArcadeStreetCrimeVars.ePlayerState != CASINO_ARCADE_STREET_CRIME_PLAYER_STATE_PLAYING
|
|
//Waiting for host to move state
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF bRoundEnd
|
|
//Set global state to Won/Lost Round
|
|
IF SCGW_ServerBD.iRoundWinner[SCGW_ServerBD.iCurrentRound - 1] != -1
|
|
IF SCGW_ServerBD.iRoundWinner[SCGW_ServerBD.iCurrentRound - 1] = sSCGWData.sLocalPlayer.iLocalPart
|
|
SCGW_SET_GLOBAL_PLAYER_STATE(CASINO_ARCADE_STREET_CRIME_PLAYER_STATE_ROUND_END_WON)
|
|
SCGW_PLAY_GANG_SOUND_FROM_PLAYER("Win", sSCGWData.sLocalPlayer.iLocalPart, sSCGWData.sPlayers[sSCGWData.sLocalPlayer.iLocalPart].iPlayerSoundId)
|
|
ELSE
|
|
SCGW_SET_GLOBAL_PLAYER_STATE(CASINO_ARCADE_STREET_CRIME_PLAYER_STATE_ROUND_END_LOST)
|
|
SCGW_PLAY_GANG_SOUND_FROM_PLAYER("Lose_Game", sSCGWData.sLocalPlayer.iLocalPart, sSCGWData.sPlayers[sSCGWData.sLocalPlayer.iLocalPart].iPlayerSoundId)
|
|
ENDIF
|
|
SCGW_SET_GLOBAL_THIS_FRAME_ACTION(INT_TO_ENUM(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION, ENUM_TO_INT(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_WON_PLAYER_1) + SCGW_PlayerBD[SCGW_ServerBD.iRoundWinner[SCGW_ServerBD.iCurrentRound - 1]].iGang))
|
|
ENDIF
|
|
ELSE
|
|
//Set global state to Won/Lost Game
|
|
IF SCGW_ServerBD.iGameWinner != -1
|
|
IF SCGW_ServerBD.iGameWinner = sSCGWData.sLocalPlayer.iLocalPart
|
|
SCGW_UPDATE_PLAYER_WINS()
|
|
SCGW_SET_GLOBAL_PLAYER_STATE(CASINO_ARCADE_STREET_CRIME_PLAYER_STATE_GAME_END_WON)
|
|
SCGW_PLAY_GANG_SOUND_FROM_PLAYER("Win", sSCGWData.sLocalPlayer.iLocalPart, sSCGWData.sPlayers[sSCGWData.sLocalPlayer.iLocalPart].iPlayerSoundId)
|
|
ELSE
|
|
SCGW_SET_GLOBAL_PLAYER_STATE(CASINO_ARCADE_STREET_CRIME_PLAYER_STATE_GAME_END_LOST)
|
|
SCGW_PLAY_GANG_SOUND_FROM_PLAYER("Lose_Game", sSCGWData.sLocalPlayer.iLocalPart, sSCGWData.sPlayers[sSCGWData.sLocalPlayer.iLocalPart].iPlayerSoundId)
|
|
ENDIF
|
|
SCGW_SET_GLOBAL_THIS_FRAME_ACTION(INT_TO_ENUM(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION, ENUM_TO_INT(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_WON_PLAYER_1) + SCGW_PlayerBD[SCGW_ServerBD.iGameWinner].iGang))
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_BIT_SET(sSCGWData.iLocalBS, ciSCGW_LOCALBS_DIED_THIS_ROUND)
|
|
AND SCGW_ServerBD.iRoundWinner[SCGW_ServerBD.iCurrentRound - 1] != -1
|
|
AND SCGW_ServerBD.iRoundWinner[SCGW_ServerBD.iCurrentRound - 1] = sSCGWData.sLocalPlayer.iLocalPart
|
|
IF NOT GET_MP_BOOL_CHARACTER_STAT(MP_STAT_SCGW_WON_NO_DEATHS)
|
|
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_SCGW_WON_NO_DEATHS, TRUE)
|
|
SET_REWARD_UNLOCKED(UNLOCKTYPEENUM_TATTOO, "CLO_VWM_D_1_1", "UNLOCK_NAME_SHIRT3","FeedhitTshirt04","MPTshirtAwards3" ,DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT,TRUE)
|
|
SET_PACKED_STAT_BOOL(PACKED_MP_UNTOUCHABLE, TRUE)
|
|
SCGW_TRIGGER_HELP_TEXT("SCGW_CH_4", ciSCGW_DEFAULT_HELP_TEXT_TIME, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processing for the client state: SCGW_CLIENT_STATE_LBD_ENTRY
|
|
PROC SCGW_PROCESS_CLIENT_STATE_LBD_ENTRY()
|
|
|
|
IF NOT IS_ACCOUNT_OVER_17_FOR_UGC()
|
|
SCGW_CLEANUP_AND_EXIT_CLIENT()
|
|
ENDIF
|
|
|
|
SCGW_DRAW_LEADERBOARD_ENTRIES()
|
|
|
|
SCGW_PROCESS_LBD_ENTRY_HELP_TEXT()
|
|
|
|
INT iUnpackedInitials[ciARCADE_CABINET_LEADERBOARD_INITIALS]
|
|
|
|
IF SC_PROFANITY_GET_CHECK_IS_VALID(sSCGWData.iLbdInitialProfanityToken)
|
|
|
|
IF SC_PROFANITY_GET_CHECK_IS_PENDING(sSCGWData.iLbdInitialProfanityToken)
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF SC_PROFANITY_GET_STRING_PASSED(sSCGWData.iLbdInitialProfanityToken)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_CLIENT_STATE_LBD_ENTRY - Profanity: Initials OK")
|
|
BROADCAST_SCGW_INITIALS_ENTERED()
|
|
SCGW_SET_CLIENT_STATE(SCGW_CLIENT_STATE_LBD)
|
|
SCGW_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_Change_Screen")
|
|
sSCGWData.iLbdInitialProfanityToken = 0
|
|
ELSE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_CLIENT_STATE_LBD_ENTRY - Profanity: Initials BAD")
|
|
SCGW_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_Change_Letter")
|
|
sSCGWData.iInitial = 0
|
|
ARCADE_UNPACK_LEADERBOARD_INITIALS(0, iUnpackedInitials)
|
|
iUnpackedInitials[ciARCADE_CABINET_LEADERBOARD_INITIALS - 1] = SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iGang
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLeaderboardInitials = ARCADE_PACK_LEADERBOARD_INITIALS(iUnpackedInitials)
|
|
sSCGWData.iLbdInitialProfanityToken = 0
|
|
ENDIF
|
|
|
|
EXIT
|
|
|
|
ENDIF
|
|
|
|
CONTROL_ACTION CA_InitialUp = INPUT_SCRIPT_RB
|
|
CONTROL_ACTION CA_InitialDown = INPUT_SCRIPT_LB
|
|
CONTROL_ACTION CA_InitialAccept = INPUT_FRONTEND_RDOWN
|
|
CONTROL_ACTION CA_InitialBack = INPUT_FRONTEND_RRIGHT
|
|
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)
|
|
sSCGWData.iInitial ++
|
|
IF sSCGWData.iInitial = ciARCADE_CABINET_LEADERBOARD_INITIALS - 1
|
|
ARCADE_UNPACK_LEADERBOARD_INITIALS(SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLeaderboardInitials, 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, sSCGWData.iLbdInitialProfanityToken)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_CLIENT_STATE_LBD_ENTRY - Profanity: Starting check")
|
|
SCGW_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_Entered_Score")
|
|
ENDIF
|
|
ELIF SCGW_GET_PLAYER_LEADERBOARD_POSITION(sSCGWData.sLocalPlayer.iLocalPart) = ciSCGW_LBD_DEFAULT_RANK
|
|
SCGW_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_Change_Screen")
|
|
SCGW_SET_CLIENT_STATE(SCGW_CLIENT_STATE_LBD)
|
|
ENDIF
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF SCGW_GET_PLAYER_LEADERBOARD_POSITION(sSCGWData.sLocalPlayer.iLocalPart) = ciSCGW_LBD_DEFAULT_RANK
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, CA_InitialBack)
|
|
IF sSCGWData.iInitial > 0
|
|
sSCGWData.iInitial --
|
|
ENDIF
|
|
EXIT
|
|
ENDIF
|
|
|
|
INT iDelta = 0
|
|
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, CA_InitialUp)
|
|
iDelta = 1
|
|
ELIF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, CA_InitialDown)
|
|
iDelta = -1
|
|
ENDIF
|
|
|
|
IF iDelta = 0
|
|
EXIT
|
|
ENDIF
|
|
|
|
SCGW_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_Change_Letter")
|
|
|
|
ARCADE_UNPACK_LEADERBOARD_INITIALS(SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLeaderboardInitials, iUnpackedInitials)
|
|
|
|
iUnpackedInitials[sSCGWData.iInitial] += iDelta
|
|
|
|
IF iUnpackedInitials[sSCGWData.iInitial] >= ciARCADE_CABINET_LEADERBOARD_INITIALS_MAX
|
|
iUnpackedInitials[sSCGWData.iInitial] = 0
|
|
ELIF iUnpackedInitials[sSCGWData.iInitial] < 0
|
|
iUnpackedInitials[sSCGWData.iInitial] = ciARCADE_CABINET_LEADERBOARD_INITIALS_MAX - 1
|
|
ENDIF
|
|
|
|
SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLeaderboardInitials = ARCADE_PACK_LEADERBOARD_INITIALS(iUnpackedInitials)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processing for the client state: SCGW_CLIENT_STATE_LBD
|
|
PROC SCGW_PROCESS_CLIENT_STATE_LBD()
|
|
|
|
SCGW_PROCESS_LBD_HELP_TEXT()
|
|
|
|
SCGW_DRAW_LEADERBOARD()
|
|
|
|
ENDPROC
|
|
|
|
//~~~~~ Client State Machine Main Update ~~~~~
|
|
|
|
/// PURPOSE:
|
|
/// Processes the client state machine, calling the method to process the current state
|
|
PROC SCGW_PROCESS_CLIENT_STATE_MACHINE()
|
|
|
|
SWITCH sSCGWData.eCurrentState
|
|
|
|
CASE SCGW_CLIENT_STATE_INITIALISING
|
|
|
|
SCGW_PROCESS_CLIENT_STATE_INITIALISING()
|
|
|
|
BREAK
|
|
|
|
CASE SCGW_CLIENT_STATE_REQUESTING_ASSETS
|
|
|
|
SCGW_PROCESS_CLIENT_STATE_REQUESTING_ASSETS()
|
|
|
|
BREAK
|
|
|
|
CASE SCGW_CLIENT_STATE_INTRO_VIDEO
|
|
|
|
SCGW_PROCESS_CLIENT_STATE_INTRO_VIDEO()
|
|
|
|
BREAK
|
|
|
|
CASE SCGW_CLIENT_STATE_GANG_SCREEN
|
|
|
|
SCGW_PROCESS_CLIENT_STATE_GANG_SCREEN()
|
|
|
|
BREAK
|
|
|
|
CASE SCGW_CLIENT_STATE_LAUNCHING
|
|
|
|
SCGW_PROCESS_CLIENT_STATE_LAUNCHING()
|
|
|
|
BREAK
|
|
|
|
CASE SCGW_CLIENT_STATE_INIT_ROUND
|
|
|
|
SCGW_PROCESS_CLIENT_STATE_INIT_ROUND()
|
|
|
|
BREAK
|
|
|
|
CASE SCGW_CLIENT_STATE_COUNTDOWN
|
|
|
|
SCGW_PROCESS_CLIENT_STATE_COUNTDOWN()
|
|
|
|
BREAK
|
|
|
|
CASE SCGW_CLIENT_STATE_RUNNING
|
|
|
|
SCGW_PROCESS_CLIENT_STATE_RUNNING()
|
|
|
|
BREAK
|
|
|
|
CASE SCGW_CLIENT_STATE_ROUND_END_SCREEN
|
|
|
|
SCGW_PROCESS_CLIENT_STATE_ROUND_END_SCREEN()
|
|
|
|
BREAK
|
|
|
|
CASE SCGW_CLIENT_STATE_LBD_ENTRY
|
|
|
|
SCGW_PROCESS_CLIENT_STATE_LBD_ENTRY()
|
|
|
|
BREAK
|
|
|
|
CASE SCGW_CLIENT_STATE_LBD
|
|
|
|
SCGW_PROCESS_CLIENT_STATE_LBD()
|
|
|
|
BREAK
|
|
|
|
CASE SCGW_CLIENT_STATE_CLEANUP
|
|
|
|
SCGW_CLEANUP_AND_EXIT_CLIENT()
|
|
|
|
BREAK
|
|
|
|
CASE SCGW_CLIENT_STATE_FINISHED
|
|
//Do nothing
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
// ------------------------------ SERVER STATE MACHINE ------------------------------
|
|
|
|
/// PURPOSE:
|
|
/// Updates the server state
|
|
PROC SCGW_SET_SERVER_STATE(SCGW_SERVER_STATE eNewState)
|
|
|
|
IF !sSCGWData.sLocalPlayer.bIsHost
|
|
EXIT
|
|
ENDIF
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_SET_SERVER_STATE - State changed from ",
|
|
SCGW_DEBUG_GET_SERVER_STATE_AS_STRING(SCGW_ServerBD.eCurrentServerState), " to ", SCGW_DEBUG_GET_SERVER_STATE_AS_STRING(eNewState))
|
|
|
|
SCGW_ServerBD.eCurrentServerState = eNewState
|
|
|
|
ENDPROC
|
|
|
|
//~~~~~ Server State Machine State Updates ~~~~~
|
|
|
|
/// PURPOSE:
|
|
/// Processing for the server state: SCGW_SERVER_STATE_INITIALISING
|
|
PROC SCGW_PROCESS_SERVER_STATE_INITIALISING()
|
|
|
|
SCGW_INITIALIZE_MAP_TILES()
|
|
|
|
SCGW_SET_SERVER_STATE(SCGW_SERVER_STATE_LAUNCHING)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processing for the server state: SCGW_SERVER_STATE_LAUNCHING
|
|
PROC SCGW_PROCESS_SERVER_STATE_LAUNCHING()
|
|
|
|
INT iPlayerLoop, iNumPlayers
|
|
BOOL bAllLoaded = TRUE
|
|
|
|
FOR iPlayerLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
|
|
IF NOT NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iPlayerLoop))
|
|
AND NOT SCGW_Bot[iPlayerLoop].bActive
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[iPlayerLoop].iGang = ciSCGW_GANG_NONE
|
|
bAllLoaded = FALSE
|
|
BREAKLOOP
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[iPlayerLoop].eCurrentPlayerState = SCGW_PLAYER_STATE_INITIALISING
|
|
bAllLoaded = FALSE
|
|
BREAKLOOP
|
|
ENDIF
|
|
|
|
iNumPlayers++
|
|
|
|
ENDFOR
|
|
|
|
IF !bAllLoaded
|
|
IF HAS_NET_TIMER_STARTED(sSCGWData.tdIntroDelayTimer)
|
|
RESET_NET_TIMER(sSCGWData.tdIntroDelayTimer)
|
|
ENDIF
|
|
|
|
//Waiting for players to load and ready up
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF iNumPlayers <= 1
|
|
#IF IS_DEBUG_BUILD
|
|
AND sSCGWData.sDebug.bDebugOnePlayerTest = FALSE
|
|
#ENDIF
|
|
IF HAS_NET_TIMER_STARTED(sSCGWData.tdIntroDelayTimer)
|
|
RESET_NET_TIMER(sSCGWData.tdIntroDelayTimer)
|
|
ENDIF
|
|
|
|
//Not enough players to start
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT HAS_NET_TIMER_STARTED(sSCGWData.tdIntroDelayTimer)
|
|
REINIT_NET_TIMER(sSCGWData.tdIntroDelayTimer)
|
|
EXIT
|
|
ELIF NOT HAS_NET_TIMER_EXPIRED(sSCGWData.tdIntroDelayTimer, ciSCGW_GANG_ALL_READY_DELAY)
|
|
EXIT
|
|
ENDIF
|
|
|
|
SCGW_ServerBD.iNumRounds = iNumPlayers + 1
|
|
|
|
SCGW_SET_SERVER_STATE(SCGW_SERVER_STATE_INIT_ROUND)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processing for the server state: SCGW_SERVER_STATE_INIT_ROUND
|
|
PROC SCGW_PROCESS_SERVER_STATE_INIT_ROUND()
|
|
|
|
INITIALIZE_SERVER_DATA_FOR_NEW_ROUND()
|
|
|
|
SCGW_SET_SERVER_STATE(SCGW_SERVER_STATE_COUNTDOWN)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processing for the server state: SCGW_SERVER_STATE_COUNTDOWN
|
|
PROC SCGW_PROCESS_SERVER_STATE_COUNTDOWN()
|
|
|
|
IF NATIVE_TO_INT(GET_NETWORK_TIME()) < SCGW_ServerBD.iStartTime
|
|
EXIT
|
|
ENDIF
|
|
|
|
//Inititialize spawn times to the start time
|
|
SCGW_ServerBD.iLastPickupSpawnTime = SCGW_ServerBD.iStartTime
|
|
SCGW_ServerBD.iLastVehicleSpawnTime = SCGW_ServerBD.iStartTime
|
|
|
|
SCGW_PROCESS_SERVER_PICKUPS(TRUE)
|
|
SCGW_SET_SERVER_STATE(SCGW_SERVER_STATE_RUNNING)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processing for the server state: SCGW_SERVER_STATE_RUNNING
|
|
PROC SCGW_PROCESS_SERVER_STATE_RUNNING()
|
|
|
|
SCGW_PROCESS_SERVER_BUILDING_OWNERSHIP()
|
|
SCGW_PROCESS_SERVER_PICKUPS()
|
|
SCGW_PROCESS_SERVER_VEHICLES()
|
|
|
|
IF NOT SCGW_SHOULD_CURRENT_ROUND_END()
|
|
EXIT
|
|
ENDIF
|
|
|
|
INT iWinner = SCGW_GET_ROUND_WINNER()
|
|
|
|
IF iWinner = -1
|
|
SCGW_PROCESS_SERVER_PICKUPS(TRUE, TRUE)
|
|
SCGW_ServerBD.bSuddenDeath = TRUE
|
|
EXIT
|
|
ENDIF
|
|
|
|
SCGW_ServerBD.iRoundScores[SCGW_PlayerBD[iWinner].iGang] ++
|
|
SCGW_ServerBD.iRoundWinner[SCGW_ServerBD.iCurrentRound] = iWinner
|
|
SCGW_ServerBD.iCurrentRound++
|
|
SCGW_ServerBD.iEndTime = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
|
|
IF NOT SCGW_SHOULD_CONTINUE_TO_NEXT_ROUND()
|
|
SCGW_ServerBD.iGameWinner = SCGW_GET_GAME_WINNER()
|
|
ENDIF
|
|
|
|
SCGW_SET_SERVER_STATE(SCGW_SERVER_STATE_ROUND_END_SCREEN)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Processing for the server state: SCGW_SERVER_STATE_ROUND_END_SCREEN
|
|
PROC SCGW_PROCESS_SERVER_STATE_ROUND_END_SCREEN()
|
|
|
|
IF (NATIVE_TO_INT(GET_NETWORK_TIME()) < SCGW_ServerBD.iEndTime + ciSCGW_ROUND_RESULT_TIME)
|
|
//Waiting for end screen to finish displaying
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF SCGW_SHOULD_CONTINUE_TO_NEXT_ROUND()
|
|
SCGW_SET_SERVER_STATE(SCGW_SERVER_STATE_INIT_ROUND)
|
|
EXIT
|
|
ENDIF
|
|
|
|
SCGW_SORT_SERVER_LEADERBOARD()
|
|
SCGW_SET_SERVER_STATE(SCGW_SERVER_STATE_LEADERBOARD)
|
|
|
|
ENDPROC
|
|
|
|
//~~~~~ Server State Machine Main Update ~~~~~
|
|
|
|
/// PURPOSE:
|
|
/// Processes the server state machine, calling the method to process the current state
|
|
PROC SCGW_PROCESS_SERVER_STATE_MACHINE()
|
|
|
|
IF NOT sSCGWData.sLocalPlayer.bIsHost
|
|
EXIT
|
|
ENDIF
|
|
|
|
SWITCH SCGW_ServerBD.eCurrentServerState
|
|
|
|
CASE SCGW_SERVER_STATE_INITIALISING
|
|
SCGW_PROCESS_SERVER_STATE_INITIALISING()
|
|
BREAK
|
|
|
|
CASE SCGW_SERVER_STATE_LAUNCHING
|
|
SCGW_PROCESS_SERVER_STATE_LAUNCHING()
|
|
BREAK
|
|
|
|
CASE SCGW_SERVER_STATE_INIT_ROUND
|
|
SCGW_PROCESS_SERVER_STATE_INIT_ROUND()
|
|
BREAK
|
|
|
|
CASE SCGW_SERVER_STATE_COUNTDOWN
|
|
SCGW_PROCESS_SERVER_STATE_COUNTDOWN()
|
|
BREAK
|
|
|
|
CASE SCGW_SERVER_STATE_RUNNING
|
|
SCGW_PROCESS_SERVER_STATE_RUNNING()
|
|
BREAK
|
|
|
|
CASE SCGW_SERVER_STATE_ROUND_END_SCREEN
|
|
SCGW_PROCESS_SERVER_STATE_ROUND_END_SCREEN()
|
|
BREAK
|
|
|
|
CASE SCGW_SERVER_STATE_LEADERBOARD
|
|
|
|
BREAK
|
|
|
|
CASE SCGW_SERVER_STATE_FINISHED
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
// ------------------------------ EVENT PROCESSING ------------------------------
|
|
|
|
/// PURPOSE:
|
|
/// Processes all incoming events sent by players in the minigame
|
|
PROC SCGW_PROCESS_EVENTS()
|
|
|
|
INT iCount
|
|
SCRIPT_EVENT_DATA_SCGW_MINIGAME_PICKUP_COLLECTED EventDataPickupCollected
|
|
SCRIPT_EVENT_DATA_SCGW_MINIGAME_SIDE_CLAIMED EventDataSideClaimed
|
|
SCRIPT_EVENT_DATA_SCGW_MINIGAME_REQUEST_CARS EventDataRequestCars
|
|
SCRIPT_EVENT_DATA_SCGW_MINIGAME_DAMAGED EventDataDamaged
|
|
SCRIPT_EVENT_DATA_CASINO_ARCADE_SEND_LEADERBOARD_EVENT EventDataLeaderboardSend
|
|
SCRIPT_EVENT_DATA_SCGW_INITIALS_ENTERED EventDataInitialsEntered
|
|
|
|
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, EventDataPickupCollected, SIZE_OF(EventDataPickupCollected))
|
|
IF EventDataPickupCollected.Details.Type = SCRIPT_EVENT_SCGW_MINIGAME_PICKUP_COLLECTED
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_EVENTS - Found event: PICKUP COLLECTED")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_EVENTS - Player = ", NATIVE_TO_INT(EventDataPickupCollected.Details.FromPlayerIndex))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_EVENTS - iPickupIndex = ", EventDataPickupCollected.iPickupIndex)
|
|
SCGW_REMOVE_COLLECTED_PICKUP(EventDataPickupCollected.iPickupIndex)
|
|
RELOOP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_EVENT_DATA(SCRIPT_EVENT_QUEUE_NETWORK, iCount, EventDataSideClaimed, SIZE_OF(EventDataSideClaimed))
|
|
IF EventDataSideClaimed.Details.Type = SCRIPT_EVENT_SCGW_MINIGAME_SIDE_CLAIMED
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_EVENTS - Found event: SIDE CLAIMED")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_EVENTS - Player = ", NATIVE_TO_INT(EventDataSideClaimed.Details.FromPlayerIndex))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_EVENTS - iGridIndex = ", EventDataSideClaimed.iGridIndex)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_EVENTS - iSide = ", EventDataSideClaimed.iSide)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_EVENTS - iGang = ", EventDataSideClaimed.iGang)
|
|
SCGW_SET_GRID_SIDE_AS_CLAIMED_BY_GANG(EventDataSideClaimed.iGridIndex, EventDataSideClaimed.iSide, EventDataSideClaimed.iGang)
|
|
RELOOP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_EVENT_DATA(SCRIPT_EVENT_QUEUE_NETWORK, iCount, EventDataRequestCars, SIZE_OF(EventDataRequestCars))
|
|
IF EventDataRequestCars.Details.Type = SCRIPT_EVENT_SCGW_MINIGAME_REQUEST_CARS
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_EVENTS - Found event: REQUEST CARS")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_EVENTS - Player = ", NATIVE_TO_INT(EventDataRequestCars.Details.FromPlayerIndex))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_EVENTS - iPosition = ", EventDataRequestCars.iPosition)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_EVENTS - iGang = ", EventDataRequestCars.iGang)
|
|
SCGW_SPAWN_GANG_BACKUP_VEHICLES(EventDataRequestCars.iGang, EventDataRequestCars.iPosition)
|
|
RELOOP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_EVENT_DATA(SCRIPT_EVENT_QUEUE_NETWORK, iCount, EventDataDamaged, SIZE_OF(EventDataDamaged))
|
|
IF EventDataRequestCars.Details.Type = SCRIPT_EVENT_SCGW_MINIGAME_DAMAGED
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_EVENTS - Found event: DAMAGED")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_EVENTS - Player = ", NATIVE_TO_INT(EventDataDamaged.Details.FromPlayerIndex))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_EVENTS - bDead = ", EventDataDamaged.bDead)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_EVENTS - bHitByCar = ", EventDataDamaged.bHitByCar)
|
|
SCGW_PROCESS_DAMAGED_EVENT(EventDataDamaged.iParticipant, EventDataDamaged.bDead, EventDataDamaged.bHitByCar)
|
|
RELOOP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_EVENT_DATA(SCRIPT_EVENT_QUEUE_NETWORK, iCount, EventDataLeaderboardSend, SIZE_OF(EventDataLeaderboardSend))
|
|
IF EventDataLeaderboardSend.Details.Type = SCRIPT_EVENT_CASINO_ARCADE_SEND_LEADERBOARD_EVENT
|
|
IF SCGW_ServerBD.bLeaderboardRecieved
|
|
RELOOP
|
|
ENDIF
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_EVENTS - Found event: LEADERBOARD")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_EVENTS - Player = ", NATIVE_TO_INT(EventDataLeaderboardSend.Details.FromPlayerIndex))
|
|
IF EventDataLeaderboardSend.eGameType != CASINO_ARCADE_GAME_STREET_CRIMES
|
|
RELOOP
|
|
ENDIF
|
|
SCGW_INITIALISE_SERVER_LEADERBOARD(EventDataLeaderboardSend.iInitials, EventDataLeaderboardSend.iScores)
|
|
RELOOP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_EVENT_DATA(SCRIPT_EVENT_QUEUE_NETWORK, iCount, EventDataInitialsEntered, SIZE_OF(EventDataInitialsEntered))
|
|
IF EventDataInitialsEntered.Details.Type = SCRIPT_EVENT_SCGW_INITIALS_ENTERED
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_EVENTS - Found event: INITIALS")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_PROCESS_EVENTS - Player = ", NATIVE_TO_INT(EventDataInitialsEntered.Details.FromPlayerIndex))
|
|
SCGW_PROCESS_INITIALS_ENTERED_EVENT(EventDataInitialsEntered.Details.FromPlayerIndex)
|
|
RELOOP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
// ------------------------------ DEBUG ------------------------------
|
|
|
|
/// PURPOSE:
|
|
/// Sets the given widget group to be the parent for any widgets created by the minigame.
|
|
PROC SCGW_DEBUG_SET_PARENT_WIDGET_GROUP(WIDGET_GROUP_ID parentWidgetGroup)
|
|
|
|
sSCGWData.sDebug.widgetGridMinigame = parentWidgetGroup
|
|
|
|
ENDPROC
|
|
|
|
PROC SCGW_DEBUG_CREATE_PLAYERS_WIDGET()
|
|
INT iPlayerLoop
|
|
START_WIDGET_GROUP("iPlayerPosition")
|
|
FOR iPlayerLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
ADD_WIDGET_INT_READ_ONLY(CONVERT_INT_TO_STRING(iPlayerLoop),SCGW_UF_PlayerBD[iPlayerLoop].iPlayerPosition)
|
|
ENDFOR
|
|
STOP_WIDGET_GROUP()
|
|
ENDPROC
|
|
/// PURPOSE:
|
|
/// Creates the debug widgets for this minigame.
|
|
PROC SCGW_DEBUG_UPDATE_WIDGETS()
|
|
IF sSCGWData.sDebug.bCallVehicles
|
|
sSCGWData.sDebug.bCallVehicles = FALSE
|
|
BROADCAST_SCGW_MINIGAME_REQUEST_CARS(SCGW_UF_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iPlayerPosition, SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iGang)
|
|
ENDIF
|
|
ENDPROC
|
|
/// PURPOSE:
|
|
/// Creates the debug widgets for this minigame.
|
|
PROC SCGW_DEBUG_CREATE_WIDGETS()
|
|
|
|
IF sSCGWData.sDebug.bDebugCreatedWidgets
|
|
OR sSCGWData.sDebug.widgetGridMinigame = NULL
|
|
EXIT
|
|
ENDIF
|
|
|
|
SET_CURRENT_WIDGET_GROUP(sSCGWData.sDebug.widgetGridMinigame)
|
|
|
|
START_WIDGET_GROUP("Grid Arcade Cabinet Minigame")
|
|
|
|
ADD_WIDGET_BOOL("bBlockDrawing", g_bBlockArcadeCabinetDrawing)
|
|
ADD_WIDGET_BOOL("g_bMinimizeArcadeCabinetDrawing", g_bMinimizeArcadeCabinetDrawing)
|
|
ADD_WIDGET_BOOL("bDrawCollisionDebug", sSCGWData.sDebug.bDrawCollisionDebug)
|
|
ADD_WIDGET_BOOL("bDisableSFX", sSCGWData.sDebug.bDisableSFX)
|
|
ADD_WIDGET_BOOL("bDisableMusic", sSCGWData.sDebug.bDisableMusic)
|
|
ADD_WIDGET_BOOL("bTriggerChallenges", sSCGWData.sDebug.bTriggerChallenges)
|
|
ADD_WIDGET_BOOL("bCallVehicles", sSCGWData.sDebug.bCallVehicles)
|
|
|
|
SCGW_DEBUG_CREATE_PLAYERS_WIDGET()
|
|
ARCADE_GAMES_POSTFX_WIDGET_CREATE()
|
|
STOP_WIDGET_GROUP()
|
|
|
|
CLEAR_CURRENT_WIDGET_GROUP(sSCGWData.sDebug.widgetGridMinigame)
|
|
|
|
sSCGWData.sDebug.bDebugCreatedWidgets = TRUE
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Dumps the current state of the game to the logs
|
|
/// Automatically called when a bug is entered
|
|
PROC SCGW_DEBUG_DUMP_DATA_TO_LOGS()
|
|
|
|
//INT i, j
|
|
|
|
ARCADE_CABINET_DUMP_DATA_TO_CONSOLE()
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_DEBUG_DUMP_DATA_TO_LOGS - Dumping data...")
|
|
|
|
//TODO:
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Updates all debug functionality for the minigame.
|
|
PROC SCGW_DEBUG_PROCESSING()
|
|
|
|
SCGW_DEBUG_CREATE_WIDGETS()
|
|
SCGW_DEBUG_UPDATE_WIDGETS()
|
|
ARCADE_GAMES_POSTFX_WIDGET_UPDATE()
|
|
|
|
//Enable debug lines for debug
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
|
|
//If a bug is entered dump all data to the console.
|
|
IF IS_KEYBOARD_KEY_PRESSED(KEY_SPACE)
|
|
OR IS_KEYBOARD_KEY_PRESSED(KEY_RBRACKET)
|
|
SCGW_DEBUG_DUMP_DATA_TO_LOGS()
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
// ------------------------------ MAIN UPDATE ------------------------------
|
|
|
|
PROC SCGW_PLAYER_TO_BOT()
|
|
INT iBot
|
|
FOR iBot = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
IF SCGW_Bot[iBot].bActive
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_BOT_PLAYERS - SCGW_Bot[",iBot,"].SCGW_player.iGang ",SCGW_Bot[iBot].SCGW_player.iGang)
|
|
SCGW_PlayerBD[iBot] = SCGW_Bot[iBot].SCGW_player
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_BOT_PLAYERS - SCGW_PlayerBD[iBot].iGang ",SCGW_PlayerBD[iBot].iGang)
|
|
ENDIF
|
|
ENDFOR
|
|
ENDPROC
|
|
|
|
PROC SCGW_BOT_TO_PLAYER()
|
|
INT iBot
|
|
FOR iBot = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
IF SCGW_Bot[iBot].bActive
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_BOT_PLAYERS - SCGW_Bot[",iBot,"].SCGW_player.iGang ",SCGW_Bot[iBot].SCGW_player.iGang)
|
|
SCGW_PlayerBD[iBot] = SCGW_Bot[iBot].SCGW_player
|
|
SCGW_UF_PlayerBD[iBot] = SCGW_Bot[iBot].SCGW_UF_Player
|
|
ENDIF
|
|
ENDFOR
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Keeps the cached local participant index up to date and checks for host migrations
|
|
PROC SCGW_UPDATE_LOCAL_PLAYER_DATA()
|
|
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
sSCGWData.sLocalPlayer.iLocalPart = PARTICIPANT_ID_TO_INT()
|
|
BOOL bIsHostThisFrame = NETWORK_IS_HOST_OF_THIS_SCRIPT()
|
|
#IF IS_DEBUG_BUILD
|
|
IF sSCGWData.sLocalPlayer.bIsHost != bIsHostThisFrame
|
|
IF bIsHostThisFrame
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_LOCAL_PLAYER_DATA - SCRIPT HOST MIGRATED TO LOCAL PLAYER")
|
|
ELSE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_LOCAL_PLAYER_DATA - SCRIPT HOST MIGRATED TO PARTICIPANT: ", NATIVE_TO_INT(NETWORK_GET_HOST_OF_THIS_SCRIPT()))
|
|
ENDIF
|
|
ENDIF
|
|
#ENDIF
|
|
sSCGWData.sLocalPlayer.bIsHost = bIsHostThisFrame
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Maintains a count of all players taking part in the minigame
|
|
PROC SCGW_UPDATE_ACTIVE_PLAYERS()
|
|
|
|
sSCGWData.iActivePlayers = 0
|
|
sSCGWData.iConnectedPlayers = 0
|
|
sSCGWData.iLastFrameWinningPart = sSCGWData.iWinningPart
|
|
|
|
INT iHighScore = -1
|
|
INT iWinner = -1
|
|
|
|
INT iPlayerLoop = 0
|
|
FOR iPlayerLoop = 0 TO ciSCGW_GANG_MAX - 1
|
|
sSCGWData.iGangPlayers[iPlayerLoop] = -1
|
|
IF SCGW_UF_ServerBD.iCurrentScore[iPlayerLoop] > iHighScore
|
|
iHighScore = SCGW_UF_ServerBD.iCurrentScore[iPlayerLoop]
|
|
iWinner = iPlayerLoop
|
|
ELIF SCGW_UF_ServerBD.iCurrentScore[iPlayerLoop] = iHighScore
|
|
//Draw no winner
|
|
iWinner = -1
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
FOR iPlayerLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
|
|
IF NOT NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iPlayerLoop))
|
|
AND NOT SCGW_Bot[iPlayerLoop].bActive
|
|
RELOOP
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[iPlayerLoop].iGang = ciSCGW_GANG_NONE
|
|
RELOOP
|
|
ENDIF
|
|
|
|
sSCGWData.iGangPlayers[SCGW_PlayerBD[iPlayerLoop].iGang] = iPlayerLoop
|
|
|
|
IF SCGW_PlayerBD[iPlayerLoop].iGang = iWinner
|
|
iWinner = iPlayerLoop
|
|
ENDIF
|
|
|
|
IF sSCGWData.iGangPlayerJoinTimes[SCGW_PlayerBD[iPlayerLoop].iGang] = -HIGHEST_INT
|
|
AND g_sCasinoArcadeStreetCrimeVars.eThisFrameAction = CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_NONE
|
|
SCGW_SET_GLOBAL_THIS_FRAME_ACTION(INT_TO_ENUM(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION, ENUM_TO_INT(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_JOINED_PLAYER_1) + SCGW_PlayerBD[iPlayerLoop].iGang))
|
|
sSCGWData.iGangPlayerJoinTimes[SCGW_PlayerBD[iPlayerLoop].iGang] = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
ENDIF
|
|
|
|
sSCGWData.iConnectedPlayers++
|
|
|
|
IF sSCGWData.sPlayers[iPlayerLoop].iDisplayHealth != SCGW_PlayerBD[iPlayerLoop].iHealth
|
|
INT iDelta = SCGW_PlayerBD[iPlayerLoop].iHealth - sSCGWData.sPlayers[iPlayerLoop].iDisplayHealth
|
|
IF iDelta > 0
|
|
sSCGWData.sPlayers[iPlayerLoop].iDisplayHealth += (sSCGWData.iUpdateFrames)
|
|
IF sSCGWData.sPlayers[iPlayerLoop].iDisplayHealth > SCGW_PlayerBD[iPlayerLoop].iHealth
|
|
sSCGWData.sPlayers[iPlayerLoop].iDisplayHealth = SCGW_PlayerBD[iPlayerLoop].iHealth
|
|
ENDIF
|
|
ELSE
|
|
sSCGWData.sPlayers[iPlayerLoop].iDisplayHealth -= (sSCGWData.iUpdateFramesHalf)
|
|
IF sSCGWData.sPlayers[iPlayerLoop].iDisplayHealth < SCGW_PlayerBD[iPlayerLoop].iHealth
|
|
sSCGWData.sPlayers[iPlayerLoop].iDisplayHealth = SCGW_PlayerBD[iPlayerLoop].iHealth
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF SCGW_PlayerBD[iPlayerLoop].eCurrentPlayerState = SCGW_PLAYER_STATE_CANT_RESPAWN
|
|
RELOOP
|
|
ENDIF
|
|
|
|
sSCGWData.iActivePlayers ++
|
|
|
|
ENDFOR
|
|
|
|
sSCGWData.iWinningPart = iWinner
|
|
|
|
FOR iPlayerLoop = 0 TO ciSCGW_GANG_MAX - 1
|
|
IF sSCGWData.iGangPlayers[iPlayerLoop] = -1
|
|
AND sSCGWData.iGangPlayerJoinTimes[iPlayerLoop] != -HIGHEST_INT
|
|
sSCGWData.iGangPlayerJoinTimes[iPlayerLoop] = -HIGHEST_INT
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF sSCGWData.sDebug.bDebugOnePlayerTest
|
|
sSCGWData.iActivePlayers ++
|
|
sSCGWData.iConnectedPlayers++
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_UPDATE_ACTIVE_PLAYERS - iConnectedPlayers = ", sSCGWData.iConnectedPlayers, " iActivePlayers = ", sSCGWData.iActivePlayers)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Run every frame before the state machines are processed
|
|
PROC SCGW_PRE_UPDATE()
|
|
|
|
//Reset This frame action if required
|
|
IF g_sCasinoArcadeStreetCrimeVars.eThisFrameAction != CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_NONE
|
|
SCGW_SET_GLOBAL_THIS_FRAME_ACTION(CASINO_ARCADE_STREET_CRIME_THIS_FRAME_ACTION_NONE)
|
|
ENDIF
|
|
|
|
sSCGWData.iFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
|
|
sSCGWData.iUpdateFrames = FLOOR(sSCGWData.iFrameTimeCounter / cfSCGW_ANIM_FRAME_TIME)
|
|
sSCGWData.iFrameTimeCounter = sSCGWData.iFrameTimeCounter - ROUND(cfSCGW_ANIM_FRAME_TIME * sSCGWData.iUpdateFrames)
|
|
|
|
sSCGWData.iFrameTimeCounterHalf += ROUND(GET_FRAME_TIME() * 1000)
|
|
sSCGWData.iUpdateFramesHalf = FLOOR(sSCGWData.iFrameTimeCounterHalf / (cfSCGW_ANIM_FRAME_TIME*3))
|
|
sSCGWData.iFrameTimeCounterHalf = sSCGWData.iFrameTimeCounterHalf - ROUND((cfSCGW_ANIM_FRAME_TIME*3) * sSCGWData.iUpdateFramesHalf)
|
|
|
|
sSCGWData.iPickupAnimFrame += sSCGWData.iUpdateFrames
|
|
|
|
sSCGWData.iRocketAnimFrame += sSCGWData.iUpdateFramesHalf
|
|
IF sSCGWData.iRocketAnimFrame >= ciSCGW_ROCKET_SPRITE_FRAMES
|
|
sSCGWData.iRocketAnimFrame = 0
|
|
ENDIF
|
|
|
|
SCGW_PLAYER_TO_BOT()
|
|
SCGW_UPDATE_LOCAL_PLAYER_DATA()
|
|
SCGW_UPDATE_ACTIVE_PLAYERS()
|
|
|
|
IF sSCGWData.eCurrentState >= SCGW_CLIENT_STATE_CLEANUP
|
|
// Cleaning up, don't do anything else
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT IS_SKYSWOOP_AT_GROUND()
|
|
SCGW_SET_CLIENT_STATE(SCGW_CLIENT_STATE_CLEANUP)
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF SCGW_SHOULD_QUIT_NOW()
|
|
IF IS_PLAYER_IN_ARCADE_PROPERTY(PLAYER_ID())
|
|
sSCGWData.sArcadeCabinetAnimEvent.bLoopAnim = FALSE
|
|
sSCGWData.sArcadeCabinetAnimEvent.bHoldLastFrame = FALSE
|
|
PLAY_ARCADE_CABINET_ANIMATION(sSCGWData.sArcadeCabinetAnimEvent, ARCADE_CABINET_ANIM_CLIP_EXIT)
|
|
ENDIF
|
|
SCGW_SET_CLIENT_STATE(SCGW_CLIENT_STATE_CLEANUP)
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF sSCGWData.sLocalPlayer.bIsHost
|
|
AND NOT SCGW_ServerBD.bLeaderboardRecieved
|
|
AND (sSCGWData.iLastLeaderboardRequest = -HIGHEST_INT
|
|
OR NATIVE_TO_INT(GET_NETWORK_TIME()) - sSCGWData.iLastLeaderboardRequest > ciSCGW_RESEND_LEADERBOARD_REQUEST_TIME)
|
|
BROADCAST_CASINO_ARCADE_REQUEST_LEADERBOARD_EVENT(GET_OWNER_OF_SIMPLE_INTERIOR_PLAYER_IS_IN(PLAYER_ID()), CASINO_ARCADE_GAME_STREET_CRIMES)
|
|
sSCGWData.iLastLeaderboardRequest = NATIVE_TO_INT(GET_NETWORK_TIME())
|
|
ENDIF
|
|
|
|
SCGW_PROCESS_EVENTS()
|
|
|
|
CLEAR_BIT(sSCGWData.iHelpTextBitset, ciSCGW_HELP_BS_SHOWING_HELP_TEXT)
|
|
|
|
BOOL bIsPlaying = sSCGWData.eCurrentState >= SCGW_CLIENT_STATE_INTRO_VIDEO
|
|
ARCADE_CABINET_COMMON_EVERY_FRAME_PROCESSING(bIsPlaying)
|
|
|
|
sSCGWData.bCanAddBots = TRUE
|
|
INT iPlayerLoop
|
|
FOR iPlayerLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
IF sSCGWData.sLocalPlayer.iLocalPart != iPlayerLoop
|
|
AND NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iPlayerLoop))
|
|
sSCGWData.bCanAddBots = FALSE
|
|
ENDIF
|
|
ENDFOR
|
|
FOR iPlayerLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
|
|
IF NOT sSCGWData.bCanAddBots
|
|
SCGW_Bot[iPlayerLoop].bActive = FALSE
|
|
SET_PLAYER_PLAYING_ARCADE_GAME_WITH_AI(FALSE)
|
|
ENDIF
|
|
IF SCGW_Bot[iPlayerLoop].bActive
|
|
SET_PLAYER_PLAYING_ARCADE_GAME_WITH_AI(TRUE)
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Run every frame after the state machines are processed
|
|
PROC SCGW_POST_UPDATE()
|
|
SCGW_BOT_TO_PLAYER()
|
|
IF NOT SCGW_SHOULD_ALLOW_HELP_TEXT_THIS_FRAME()
|
|
HIDE_HELP_TEXT_THIS_FRAME()
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Call every frame to run the minigame
|
|
PROC PROCESS_STREET_CRIME_GANG_WARS()
|
|
|
|
SCGW_PRE_UPDATE()
|
|
|
|
SCGW_PROCESS_CLIENT_STATE_MACHINE()
|
|
|
|
SCGW_PROCESS_SERVER_STATE_MACHINE()
|
|
|
|
SCGW_POST_UPDATE()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SCGW_DEBUG_PROCESSING()
|
|
#ENDIF
|
|
|
|
ENDPROC
|