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

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