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

2012 lines
80 KiB
XML
Executable File

USING "street_crime_using.sch"
USING "arcade_games_postfx.sch"
// ------------------------------ HELPERS ------------------------------
/// PURPOSE:
/// Lightens a colour by fAmount
/// 1.0 = white
/// 0.0 = rgba
FUNC RGBA_COLOUR_STRUCT SCGW_LIGHTEN_COLOUR(RGBA_COLOUR_STRUCT rgba, FLOAT fAmount)
rgba.iR = ROUND((255 - rgba.iR) * fAmount + rgba.iR)
rgba.iG = ROUND((255 - rgba.iG) * fAmount + rgba.iG)
rgba.iB = ROUND((255 - rgba.iB) * fAmount + rgba.iB)
RETURN rgba
ENDFUNC
/// PURPOSE:
/// Draws a sprite between two vector positions.
/// Stretches EITHER vertical OR Horizontal
/// Maintains the scale of the non-stretched direction
PROC STRETCH_SPRITE_BETWEEN_VECTOR_2DS(VECTOR_2D v1, VECTOR_2D v2, VECTOR_2D vSpriteScale, STRING stTextureDict, STRING stTexture, RGBA_COLOUR_STRUCT rgba)
VECTOR_2D vMidpoint = DIVIDE_VECTOR_2D(ADD_VECTOR_2D(v1, v2), 2.0)
IF IS_FLOAT_IN_RANGE(v1.x, v2.x - cfARCADE_MINIGAME_FLOAT_TOLERANCE, v2.x + cfARCADE_MINIGAME_FLOAT_TOLERANCE)
AND NOT IS_FLOAT_IN_RANGE(v1.y, v2.y - cfARCADE_MINIGAME_FLOAT_TOLERANCE, v2.y + cfARCADE_MINIGAME_FLOAT_TOLERANCE)
//Vertical Stretch
ARCADE_CABINET_DRAW_SPRITE(stTextureDict, stTexture,
vMidpoint.x, vMidpoint.y,
vSpriteScale.x, ABSF(v1.y - v2.y),
0.0, rgba)
ELIF NOT IS_FLOAT_IN_RANGE(v1.x, v2.x - cfARCADE_MINIGAME_FLOAT_TOLERANCE, v2.x + cfARCADE_MINIGAME_FLOAT_TOLERANCE)
AND IS_FLOAT_IN_RANGE(v1.y, v2.y - cfARCADE_MINIGAME_FLOAT_TOLERANCE, v2.y + cfARCADE_MINIGAME_FLOAT_TOLERANCE)
//Horizontal Stretch
ARCADE_CABINET_DRAW_SPRITE(stTextureDict, stTexture,
vMidpoint.x, vMidpoint.y,
ABSF(v1.x - v2.x), vSpriteScale.y,
0.0, rgba)
ENDIF
ENDPROC
// ------------------------------ HUD & UI ------------------------------
/// PURPOSE:
/// Draws a fullscreen black background
PROC SCGW_DRAW_BACKGROUND()
DRAW_RECT_FROM_VECTOR_2D(INIT_VECTOR_2D(cfSCREEN_CENTER, cfSCREEN_CENTER), INIT_VECTOR_2D(1, 1), sSCGWData.sColours.rgbaBlack)
ENDPROC
/// PURPOSE:
/// Draws a rect over the play area only
PROC SCGW_DRAW_PLAY_AREA_FADE(RGBA_COLOUR_STRUCT rgba, INT iAlpha)
rgba.iA = iAlpha
DRAW_RECT_FROM_VECTOR_2D(INIT_VECTOR_2D(cfSCREEN_CENTER, cfSCREEN_CENTER), INIT_VECTOR_2D(1,1), rgba)
ENDPROC
/// PURPOSE:
/// Returns the X offset for iGang's HUD frame
FUNC FLOAT SCGW_GET_HUD_FRAME_OFFSET_FOR_GANG(INT iGang)
SWITCH iGang
CASE ciSCGW_GANG_GREEN
RETURN cfSCGW_TOP_HUD_GANG_0_OFFSET_X
CASE ciSCGW_GANG_PURPLE
RETURN cfSCGW_TOP_HUD_GANG_1_OFFSET_X
CASE ciSCGW_GANG_YELLOW
RETURN cfSCGW_TOP_HUD_GANG_2_OFFSET_X
CASE ciSCGW_GANG_BLUE
RETURN cfSCGW_TOP_HUD_GANG_3_OFFSET_X
ENDSWITCH
RETURN 0.0
ENDFUNC
FUNC RGBA_COLOUR_STRUCT SCGW_GET_COLOUR_FOR_ROUND_DISPLAY(INT iRound)
IF SCGW_ServerBD.iRoundWinner[iRound] = -1
RETURN sSCGWData.sColours.rgbaSprite
ELSE
RETURN sSCGWData.sColours.rgbaGangColours[SCGW_PlayerBD[SCGW_ServerBD.iRoundWinner[iRound]].iGang]
ENDIF
ENDFUNC
/// PURPOSE:
/// Draws each gang's HUD frame
/// iGangPlayer can be -1 if the player is not connected
PROC SCGW_DRAW_GANG_UI(INT iGang, INT iGangPlayer)
INT i
FLOAT fFrameOffset = SCGW_GET_HUD_FRAME_OFFSET_FOR_GANG(iGang)
//Frame
IF iGangPlayer = -1
//Player not connected - INSERT COIN
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "hud_insert_coin",
fFrameOffset + (cfSCGW_TOP_HUD_FRAME_SCALE_X / 2), cfSCGW_TOP_HUD_OFFSET_Y + cfSCGW_TOP_HUD_FRAME_Y_OFFSET,
cfSCGW_TOP_HUD_FRAME_SCALE_X, cfSCGW_TOP_HUD_FRAME_SCALE_Y,
0.0, sSCGWData.sColours.rgbaGangColours[iGang])
ELIF SCGW_IS_PLAYER_DEAD(iGangPlayer)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "hud_wasted",
fFrameOffset + (cfSCGW_TOP_HUD_FRAME_SCALE_X / 2), cfSCGW_TOP_HUD_OFFSET_Y + cfSCGW_TOP_HUD_FRAME_Y_OFFSET,
cfSCGW_TOP_HUD_FRAME_SCALE_X, cfSCGW_TOP_HUD_FRAME_SCALE_Y,
0.0, sSCGWData.sColours.rgbaWasted)
ELSE
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "hud_frame",
fFrameOffset + (cfSCGW_TOP_HUD_FRAME_SCALE_X / 2), cfSCGW_TOP_HUD_OFFSET_Y + cfSCGW_TOP_HUD_FRAME_Y_OFFSET,
cfSCGW_TOP_HUD_FRAME_SCALE_X, cfSCGW_TOP_HUD_FRAME_SCALE_Y,
0.0, sSCGWData.sColours.rgbaGangColours[iGang])
ENDIF
//Portrait
TEXT_LABEL_63 tl63Head = "hud_head_"
tl63Head += sSCGWData.stGangSprites[iGang]
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", tl63Head,
fFrameOffset + (cfSCGW_TOP_HUD_PORTRAIT_SCALE_X / 2), cfSCGW_TOP_HUD_OFFSET_Y + cfSCGW_TOP_HUD_PORTRAIT_Y_OFFSET,
cfSCGW_TOP_HUD_PORTRAIT_SCALE_X, cfSCGW_TOP_HUD_PORTRAIT_SCALE_Y,
0.0, sSCGWData.sColours.rgbaSprite)
IF iGangPlayer = -1
//Nothing else to draw unless playing
EXIT
ENDIF
//Mic
IF NETWORK_IS_PARTICIPANT_ACTIVE(INT_TO_PARTICIPANTINDEX(iGangPlayer))
PLAYER_INDEX piPlayer = NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(iGangPlayer))
IF NETWORK_IS_PLAYER_TALKING(piPlayer)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "hud_mic",
fFrameOffset + cfSCGW_TOP_HUD_MIC_X_OFFSET + (cfSCGW_TOP_HUD_MIC_SCALE_X / 2), cfSCGW_TOP_HUD_OFFSET_Y + cfSCGW_TOP_HUD_MIC_Y_OFFSET + (cfSCGW_TOP_HUD_MIC_SCALE_Y / 2),
cfSCGW_TOP_HUD_MIC_SCALE_X, cfSCGW_TOP_HUD_MIC_SCALE_Y,
0.0, sSCGWData.sColours.rgbaGangColours[iGang])
ENDIF
ELIF SCGW_Bot[iGangPlayer].bActive
ENDIF
IF SCGW_PlayerBD[iGangPlayer].eCurrentPlayerState = SCGW_PLAYER_STATE_ALIVE
//Health
INT iHealthBars = sSCGWData.sPlayers[iGangPlayer].iDisplayHealth - 1
FOR i = 0 TO iHealthBars
IF i >= SCGW_PlayerBD[iGangPlayer].iHealth
AND sSCGWData.eCurrentState = SCGW_CLIENT_STATE_RUNNING
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "hud_health",
fFrameOffset + cfSCGW_TOP_HUD_HEALTH_X_OFFSET + (cfSCGW_TOP_HUD_HEALTH_SCALE_X * i) + (cfSCGW_TOP_HUD_HEALTH_SCALE_X / 2), cfSCGW_TOP_HUD_OFFSET_Y + cfSCGW_TOP_HUD_HEALTH_Y_OFFSET + (cfSCGW_TOP_HUD_HEALTH_SCALE_Y / 2),
cfSCGW_TOP_HUD_HEALTH_SCALE_X, cfSCGW_TOP_HUD_HEALTH_SCALE_Y,
0.0, sSCGWData.sColours.rgbaWasted)
ELSE
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "hud_health",
fFrameOffset + cfSCGW_TOP_HUD_HEALTH_X_OFFSET + (cfSCGW_TOP_HUD_HEALTH_SCALE_X * i) + (cfSCGW_TOP_HUD_HEALTH_SCALE_X / 2), cfSCGW_TOP_HUD_OFFSET_Y + cfSCGW_TOP_HUD_HEALTH_Y_OFFSET + (cfSCGW_TOP_HUD_HEALTH_SCALE_Y / 2),
cfSCGW_TOP_HUD_HEALTH_SCALE_X, cfSCGW_TOP_HUD_HEALTH_SCALE_Y,
0.0, SCGW_LIGHTEN_COLOUR(sSCGWData.sColours.rgbaGangColours[iGang], (TO_FLOAT(i)/(ciSCGW_MAX_HEALTH_BARS-1))))
ENDIF
ENDFOR
//Score
SET_TEXT_SCALE(cfSCGW_TOP_TEXT_SCALE, cfSCGW_TOP_TEXT_SCALE)
IF SCGW_UF_ServerBD.iCurrentScore[iGang] = 0
AND (SCGW_ServerBD.eCurrentServerState = SCGW_SERVER_STATE_RUNNING)
AND iGang = SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iGang
AND SIN(TO_FLOAT(GET_GAME_TIMER()) * cfSCGW_TIMER_SIN_MOD) > 0.5
SET_TEXT_COLOUR(sSCGWData.sColours.rgbaWasted.iR, sSCGWData.sColours.rgbaWasted.iG, sSCGWData.sColours.rgbaWasted.iB, sSCGWData.sColours.rgbaWasted.iA)
ELSE
SET_TEXT_COLOUR(sSCGWData.sColours.rgbaGangColours[iGang].iR, sSCGWData.sColours.rgbaGangColours[iGang].iG, sSCGWData.sColours.rgbaGangColours[iGang].iB, sSCGWData.sColours.rgbaGangColours[iGang].iA)
ENDIF
SET_TEXT_DROP_SHADOW()
SET_TEXT_CENTRE(TRUE)
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("SCGW_SCORE")
ADD_TEXT_COMPONENT_INTEGER(SCGW_UF_ServerBD.iCurrentScore[iGang])
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(fFrameOffset + cfSCGW_TOP_SCORE_OFFSET), cfSCGW_TOP_TEXT_Y_POS)
ENDIF
ENDPROC
/// PURPOSE:
/// Draws the top HUD
PROC SCGW_DRAW_TOP_HUD()
INT i
//Background
DRAW_RECT_FROM_VECTOR_2D(INIT_VECTOR_2D(cfSCREEN_CENTER, cfSCGW_TOP_HUD_OFFSET_Y + cfSCGW_TOP_HUD_BACKGROUND_OFFSET_Y),
INIT_VECTOR_2D(cfSCGW_TOP_HUD_BACKGROUND_SCALE_X, cfSCGW_TOP_HUD_BACKGROUND_SCALE_Y),
sSCGWData.sColours.rgbaHudBackground)
//Divider
DRAW_RECT_FROM_VECTOR_2D(INIT_VECTOR_2D(cfSCREEN_CENTER, cfSCGW_TOP_HUD_OFFSET_Y + cfSCGW_TOP_HUD_DIVIDER_OFFSET_Y),
INIT_VECTOR_2D(cfSCGW_TOP_HUD_DIVIDER_SCALE_X, cfSCGW_TOP_HUD_DIVIDER_SCALE_Y),
sSCGWData.sColours.rgbaBlack)
//Players
FOR i = 0 TO ciSCGW_GANG_MAX - 1
SCGW_DRAW_GANG_UI(i, sSCGWData.iGangPlayers[i])
ENDFOR
//Rounds
FLOAT fRoundXOffset = (TO_FLOAT(SCGW_ServerBD.iNumRounds - 1) / 2) * cfSCGW_TOP_HUD_ROUNDS_OFFSET_X
FOR i = 0 TO SCGW_ServerBD.iNumRounds - 1
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "hud_rounds",
fRoundXOffset + cfSCREEN_CENTER + (cfSCGW_TOP_HUD_ROUNDS_SCALE_X * i), cfSCGW_TOP_HUD_OFFSET_Y + cfSCGW_TOP_HUD_ROUNDS_OFFSET_Y + (cfSCGW_TOP_HUD_ROUNDS_SCALE_Y / 2) + cfSCGW_EXTRA_ROUND_COUNT_PADDING,
cfSCGW_TOP_HUD_ROUNDS_SCALE_X, cfSCGW_TOP_HUD_ROUNDS_SCALE_Y,
0.0, SCGW_GET_COLOUR_FOR_ROUND_DISPLAY(i))
ENDFOR
//Timer
INT iTimeDif = 0
INT iMinutes = 0
INT iSeconds = 0
IF (SCGW_ServerBD.eCurrentServerState = SCGW_SERVER_STATE_RUNNING)
AND NOT SCGW_ServerBD.bSuddenDeath
iTimeDif = SCGW_ServerBD.iStartTime + ciSCGW_MATCH_LENGTH - NATIVE_TO_INT(GET_NETWORK_TIME())
ENDIF
iMinutes = iTimeDif/60000
iSeconds = iTimeDif/1000 % 60
SET_TEXT_SCALE(cfSCGW_TOP_TEXT_SCALE, cfSCGW_TOP_TEXT_SCALE)
IF iTimeDif < 10000
AND (SCGW_ServerBD.eCurrentServerState = SCGW_SERVER_STATE_RUNNING)
IF NOT IS_BIT_SET(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_COUNTDOWN_SOUND_PLAYED)
SCGW_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_Countdown_10s")
SET_BIT(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_COUNTDOWN_SOUND_PLAYED)
ENDIF
INT iAlpha = ROUND(SIN(TO_FLOAT(NATIVE_TO_INT(GET_NETWORK_TIME())) * (cfSCGW_TIMER_SIN_MOD/2)) * 255)
IF iAlpha > 51
iAlpha = 255
ELSE
iAlpha = 0
ENDIF
SET_TEXT_COLOUR(255, 0, 0, iAlpha)
ELIF iTimeDif < 30000
AND (SCGW_ServerBD.eCurrentServerState = SCGW_SERVER_STATE_RUNNING)
SET_TEXT_COLOUR(255, 0, 0, 255)
ELSE
SET_TEXT_COLOUR(255, 255, 255, 255)
ENDIF
SET_TEXT_DROP_SHADOW()
SET_TEXT_CENTRE(TRUE)
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
TEXT_LABEL_15 tl15 = "SCGW_ROUND_T"
IF iSeconds < 10
tl15 += "_S"
ENDIF
BEGIN_TEXT_COMMAND_DISPLAY_TEXT(tl15)
ADD_TEXT_COMPONENT_INTEGER(iMinutes)
ADD_TEXT_COMPONENT_INTEGER(iSeconds)
END_TEXT_COMMAND_DISPLAY_TEXT(cfSCREEN_CENTER, cfSCGW_TOP_TEXT_Y_POS + cfSCGW_EXTRA_ROUND_COUNT_PADDING)
ENDPROC
PROC SCGW_DRAW_FACADE()
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridTiles", "facade", cfSCREEN_CENTER, cfSCREEN_CENTER, 1.0, 1.0, 0.0, sSCGWData.sColours.rgbaSprite)
ENDPROC
// ------------------------------ DAMAGE_BORDER ------------------------------
PROC SCGW_DRAW_DAMAGE_BORDER()
BOOL bDraw = FALSE
IF SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastDamagedTime + ciSCGW_DAMAGE_FLASH_TIME > NATIVE_TO_INT(GET_NETWORK_TIME())
bDraw = TRUE
ENDIF
IF SCGW_IS_PLAYER_DEAD(sSCGWData.sLocalPlayer.iLocalPart)
INT iTimeToRespawn = NATIVE_TO_INT(GET_NETWORK_TIME()) - SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastDamagedTime
IF iTimeToRespawn < ciSCGW_WASTED_TIME
OR SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].eCurrentPlayerState = SCGW_PLAYER_STATE_CANT_RESPAWN
bDraw = TRUE
ENDIF
ENDIF
IF !bDraw
EXIT
ENDIF
INT i
FLOAT fY = cfSCGW_DAMAGE_BORDER_V_SPRITE_SCALE_Y / 2
FOR i = 0 TO ciSCGW_DAMAGE_BORDER_V_SPRITES - 1
//Left
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGrid", "damage_v",
cfSCGW_DAMAGE_BORDER_LEFT_OFFSET_X, fY,
cfSCGW_DAMAGE_BORDER_V_SPRITE_SCALE_X, cfSCGW_DAMAGE_BORDER_V_SPRITE_SCALE_Y,
180.0, sSCGWData.sColours.rgbaWasted)
//Right
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGrid", "damage_v",
1.0 - cfSCGW_DAMAGE_BORDER_RIGHT_OFFSET_X, fY,
cfSCGW_DAMAGE_BORDER_V_SPRITE_SCALE_X, cfSCGW_DAMAGE_BORDER_V_SPRITE_SCALE_Y,
0.0, sSCGWData.sColours.rgbaWasted)
fY += cfSCGW_DAMAGE_BORDER_V_SPRITE_SCALE_Y
ENDFOR
FLOAT fX = cfSCGW_DAMAGE_BORDER_H_SPRITE_SCALE_X / 2
FOR i = 0 TO ciSCGW_DAMAGE_BORDER_H_SPRITES - 1
//Top
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGrid", "damage_h",
fX, cfSCGW_DAMAGE_BORDER_TOP_OFFSET_Y,
cfSCGW_DAMAGE_BORDER_H_SPRITE_SCALE_X, cfSCGW_DAMAGE_BORDER_H_SPRITE_SCALE_Y,
0.0, sSCGWData.sColours.rgbaWasted)
//Bottom
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGrid", "damage_h",
fX, 1.0 - cfSCGW_DAMAGE_BORDER_BOTTOM_OFFSET_Y,
cfSCGW_DAMAGE_BORDER_H_SPRITE_SCALE_X, cfSCGW_DAMAGE_BORDER_H_SPRITE_SCALE_Y,
180.0, sSCGWData.sColours.rgbaWasted)
fX += cfSCGW_DAMAGE_BORDER_H_SPRITE_SCALE_X
ENDFOR
ENDPROC
// ------------------------------ CENTER MESSAGES ------------------------------
/// PURPOSE:
/// Draws the round start countdown on screen.
PROC SCGW_DRAW_COUNTDOWN()
IF SCGW_ServerBD.iStartTime = -HIGHEST_INT
EXIT
ENDIF
INT iTimeToStart = SCGW_ServerBD.iStartTime - NATIVE_TO_INT(GET_NETWORK_TIME())
IF (iTimeToStart < ciSCGW_COUNTDOWN_BAIL_TIME)
EXIT
ENDIF
IF (iTimeToStart <= 0)
IF NOT IS_BIT_SET(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_FIGHT_DOOF_PLAYED)
SCGW_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_GO")
SET_BIT(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_FIGHT_DOOF_PLAYED)
ENDIF
FLOAT fAlpha = TO_FLOAT(iTimeToStart) / (TO_FLOAT(ciSCGW_COUNTDOWN_BAIL_TIME) / 3.5)
SCGW_DRAW_PLAY_AREA_FADE(sSCGWData.sColours.rgbaBlack, ROUND(INTERP_FLOAT(ciSCGW_COUNTDOWN_ALPHA, 0, fAlpha, INTERPTYPE_ACCEL)))
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "text_fight", cfSCREEN_CENTER, cfSCREEN_CENTER + cfSCGW_CENTER_TEXT_OFFSET_Y, cfSCGW_FIGHT_SPRITE_SCALE_X, cfSCGW_FIGHT_SPRITE_SCALE_Y, 0.0, sSCGWData.sColours.rgbaSprite)
EXIT
ENDIF
SCGW_DRAW_PLAY_AREA_FADE(sSCGWData.sColours.rgbaBlack, ciSCGW_COUNTDOWN_ALPHA)
IF (iTimeToStart <= ciSCGW_COUNTDOWN_1_TIME)
IF NOT IS_BIT_SET(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_1_DOOF_PLAYED)
SCGW_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_3_2_1")
SET_BIT(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_1_DOOF_PLAYED)
ENDIF
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "text_1", cfSCREEN_CENTER, cfSCREEN_CENTER + cfSCGW_CENTER_TEXT_OFFSET_Y, cfSCGW_COUNTDOWN_SPRITE_SCALE_X, cfSCGW_COUNTDOWN_SPRITE_SCALE_Y, 0.0, sSCGWData.sColours.rgbaSprite)
EXIT
ENDIF
IF (iTimeToStart <= ciSCGW_COUNTDOWN_2_TIME)
IF NOT IS_BIT_SET(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_2_DOOF_PLAYED)
SCGW_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_3_2_1")
SET_BIT(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_2_DOOF_PLAYED)
ENDIF
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "text_2", cfSCREEN_CENTER, cfSCREEN_CENTER + cfSCGW_CENTER_TEXT_OFFSET_Y, cfSCGW_COUNTDOWN_SPRITE_SCALE_X, cfSCGW_COUNTDOWN_SPRITE_SCALE_Y, 0.0, sSCGWData.sColours.rgbaSprite)
EXIT
ENDIF
IF (iTimeToStart <= ciSCGW_COUNTDOWN_3_TIME)
IF NOT IS_BIT_SET(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_3_DOOF_PLAYED)
SCGW_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_3_2_1")
SET_BIT(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_3_DOOF_PLAYED)
ENDIF
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "text_3", cfSCREEN_CENTER, cfSCREEN_CENTER + cfSCGW_CENTER_TEXT_OFFSET_Y, cfSCGW_COUNTDOWN_SPRITE_SCALE_X, cfSCGW_COUNTDOWN_SPRITE_SCALE_Y, 0.0, sSCGWData.sColours.rgbaSprite)
EXIT
ENDIF
IF (iTimeToStart <= ciSCGW_COUNTDOWN_ROUND_TIME)
IF NOT IS_BIT_SET(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_ROUND_DOOF_PLAYED)
SCGW_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_3_2_1")
SET_BIT(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_ROUND_DOOF_PLAYED)
ENDIF
TEXT_LABEL_63 tl63RoundSprite = "text_round_"
tl63RoundSprite += SCGW_ServerBD.iCurrentRound + 1
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", tl63RoundSprite, cfSCREEN_CENTER, cfSCREEN_CENTER + cfSCGW_CENTER_TEXT_OFFSET_Y, cfSCGW_ROUND_SPRITE_SCALE_X, cfSCGW_ROUND_SPRITE_SCALE_Y, 0.0, sSCGWData.sColours.rgbaSprite)
EXIT
ENDIF
ENDPROC
/// PURPOSE:
/// Draws the sudden death text in the middle of the screen
PROC SCGW_DRAW_SUDDEN_DEATH()
IF !SCGW_ServerBD.bSuddenDeath
EXIT
ENDIF
IF NOT HAS_NET_TIMER_STARTED(sSCGWData.tdSuddenDeathText)
EXIT
ENDIF
IF HAS_NET_TIMER_EXPIRED(sSCGWData.tdSuddenDeathText, ciSCGW_SUDDEN_DEATH_TEXT_TIME)
EXIT
ENDIF
VECTOR_2D vTextPos = INIT_VECTOR_2D(cfSCREEN_CENTER, cfSCREEN_CENTER + cfSCGW_CENTER_TEXT_OFFSET_Y)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "TEXT_SUDDEN", vTextPos.x, vTextPos.y, cfSCGW_SUDDEN_TEXT_SCALE_X, cfSCGW_SUDDEN_TEXT_SCALE_Y, 0.0, sSCGWData.sColours.rgbaSprite)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "TEXT_DEATH", vTextPos.x, vTextPos.y + cfSCGW_DEATH_TEXT_OFFSET_Y, cfSCGW_DEATH_TEXT_SCALE_X, cfSCGW_DEATH_TEXT_SCALE_Y, 0.0, sSCGWData.sColours.rgbaSprite)
ENDPROC
/// PURPOSE:
/// Draws the game winning gang in the middle of the screen
PROC SCGW_DRAW_GAME_WINNER()
IF SCGW_ServerBD.iGameWinner = -1
EXIT
ENDIF
SCGW_DRAW_PLAY_AREA_FADE(sSCGWData.sColours.rgbaGangColours[SCGW_PlayerBD[SCGW_ServerBD.iGameWinner].iGang], ciSCGW_WIN_ALPHA)
BOOL bDrawBlur = FALSE, bDrawGraff = TRUE
VECTOR_2D vTextPos = INIT_VECTOR_2D(cfSCREEN_CENTER, cfSCREEN_CENTER + cfSCGW_CENTER_TEXT_OFFSET_Y)
INT iBlurAlpha = 255
TEXT_LABEL_63 tl63GraffSprite = "text_gang_"
tl63GraffSprite += sSCGWData.stGangSprites[SCGW_PlayerBD[SCGW_ServerBD.iGameWinner].iGang]
tl63GraffSprite += "_"
IF sSCGWData.iGameWinnerAnimFrame < ciSCGW_GAME_WINNER_TEXT_FRAMES
vTextPos.y += (cfSCGW_GAME_WINNER_TEXT_START_OFFSET_Y / (sSCGWData.iGameWinnerAnimFrame + 1))
bDrawGraff = FALSE
sSCGWData.iGameWinnerAnimFrame += sSCGWData.iUpdateFrames
ELIF sSCGWData.iGameWinnerAnimFrame < ciSCGW_GAME_WINNER_TEXT_FRAMES + ciSCGW_GAME_WINNER_BLUR_FRAMES
iBlurAlpha = FLOOR((255.0 / ciSCGW_GAME_WINNER_BLUR_FRAMES) * (ciSCGW_GAME_WINNER_BLUR_FRAMES - (sSCGWData.iGameWinnerAnimFrame - ciSCGW_GAME_WINNER_TEXT_FRAMES)))
bDrawBlur = TRUE
bDrawGraff = FALSE
sSCGWData.iGameWinnerAnimFrame += sSCGWData.iUpdateFrames
ELIF sSCGWData.iGameWinnerAnimFrame < ciSCGW_GAME_WINNER_TEXT_FRAMES + ciSCGW_GAME_WINNER_BLUR_FRAMES + ciSCGW_GAME_WINNER_GRAFF_FRAMES
IF (sSCGWData.iGameWinnerAnimFrame + 1) - ciSCGW_GAME_WINNER_TEXT_FRAMES - ciSCGW_GAME_WINNER_BLUR_FRAMES < 10
tl63GraffSprite += "0"
ENDIF
tl63GraffSprite += (sSCGWData.iGameWinnerAnimFrame + 1) - ciSCGW_GAME_WINNER_TEXT_FRAMES - ciSCGW_GAME_WINNER_BLUR_FRAMES
sSCGWData.iGameWinnerAnimFrame += sSCGWData.iUpdateFramesHalf
ELSE
tl63GraffSprite += ciSCGW_GAME_WINNER_GRAFF_FRAMES
ENDIF
IF bDrawBlur
RGBA_COLOUR_STRUCT rgbaBlur = sSCGWData.sColours.rgbaSprite
rgbaBlur.iA = iBlurAlpha
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "text_bkgd_blur", vTextPos.x, vTextPos.y, cfSCGW_GAME_WINNER_BLUR_SCALE_X, cfSCGW_GAME_WINNER_BLUR_SCALE_Y, 0.0, rgbaBlur)
ENDIF
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "text_winner", vTextPos.x, vTextPos.y, cfSCGW_GAME_WINNER_TEXT_SCALE_X, cfSCGW_GAME_WINNER_TEXT_SCALE_Y, 0.0, sSCGWData.sColours.rgbaSprite)
IF bDrawGraff
TEXT_LABEL_63 tl63GraffDict = "MPArcadeCabinetGridPlayer"
tl63GraffDict += sSCGWData.stGangSprites[SCGW_PlayerBD[SCGW_ServerBD.iGameWinner].iGang]
ARCADE_CABINET_DRAW_SPRITE(tl63GraffDict, tl63GraffSprite, vTextPos.x, vTextPos.y + cfSCGW_GAME_WINNER_GRAFF_OFFSET_Y, cfSCGW_GAME_WINNER_GRAFF_SCALE_X, cfSCGW_GAME_WINNER_GRAFF_SCALE_Y, 0.0, sSCGWData.sColours.rgbaGangColours[SCGW_PlayerBD[SCGW_ServerBD.iGameWinner].iGang])
ENDIF
ENDPROC
/// PURPOSE:
/// Draws the round winning gang in the middle of the screen
PROC SCGW_DRAW_ROUND_WINNER()
IF SCGW_ServerBD.iCurrentRound = 0
EXIT
ENDIF
IF SCGW_ServerBD.iRoundWinner[SCGW_ServerBD.iCurrentRound - 1] = -1
EXIT
ENDIF
SCGW_DRAW_PLAY_AREA_FADE(sSCGWData.sColours.rgbaGangColours[SCGW_PlayerBD[SCGW_ServerBD.iRoundWinner[SCGW_ServerBD.iCurrentRound - 1]].iGang], ciSCGW_WIN_ALPHA)
VECTOR_2D vTextPos = INIT_VECTOR_2D(cfSCREEN_CENTER, cfSCREEN_CENTER + cfSCGW_ROUND_WINNER_TEXT_OFFSET_Y)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "text_round_winner", cfSCREEN_CENTER, cfSCREEN_CENTER + cfSCGW_ROUND_WINNER_TEXT_OFFSET_Y, cfSCGW_ROUND_WINNER_SPRITE_SCALE_X, cfSCGW_ROUND_WINNER_SPRITE_SCALE_Y, 0.0, sSCGWData.sColours.rgbaSprite)
TEXT_LABEL_63 tl63GraffSprite = "text_gang_"
tl63GraffSprite += sSCGWData.stGangSprites[SCGW_PlayerBD[SCGW_ServerBD.iRoundWinner[SCGW_ServerBD.iCurrentRound - 1]].iGang]
tl63GraffSprite += "_"
IF sSCGWData.iGameWinnerAnimFrame < ciSCGW_GAME_WINNER_GRAFF_FRAMES
IF (sSCGWData.iGameWinnerAnimFrame + 1) < 10
tl63GraffSprite += "0"
ENDIF
tl63GraffSprite += (sSCGWData.iGameWinnerAnimFrame + 1)
sSCGWData.iGameWinnerAnimFrame += sSCGWData.iUpdateFramesHalf
ELSE
tl63GraffSprite += ciSCGW_GAME_WINNER_GRAFF_FRAMES
ENDIF
TEXT_LABEL_63 tl63GraffDict = "MPArcadeCabinetGridPlayer"
tl63GraffDict += sSCGWData.stGangSprites[SCGW_PlayerBD[SCGW_ServerBD.iRoundWinner[SCGW_ServerBD.iCurrentRound - 1]].iGang]
ARCADE_CABINET_DRAW_SPRITE(tl63GraffDict, tl63GraffSprite, vTextPos.x, vTextPos.y + cfSCGW_GAME_WINNER_GRAFF_OFFSET_Y + ((cfSCGW_ROUND_WINNER_SPRITE_SCALE_Y - cfSCGW_GAME_WINNER_GRAFF_SCALE_Y)/2), cfSCGW_GAME_WINNER_GRAFF_SCALE_X, cfSCGW_GAME_WINNER_GRAFF_SCALE_Y, 0.0, sSCGWData.sColours.rgbaGangColours[SCGW_PlayerBD[SCGW_ServerBD.iRoundWinner[SCGW_ServerBD.iCurrentRound - 1]].iGang])
ENDPROC
/// PURPOSE:
/// Draws "Wasted" on the screen when the player is dead
PROC SCGW_DRAW_WASTED_TEXT()
SCGW_DRAW_PLAY_AREA_FADE(sSCGWData.sColours.rgbaWasted, ciSCGW_WASTED_ALPHA)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "text_wasted", cfSCREEN_CENTER, cfSCREEN_CENTER + cfSCGW_CENTER_TEXT_OFFSET_Y, cfSCGW_WASTED_SPRITE_SCALE_X, cfSCGW_WASTED_SPRITE_SCALE_Y, 0.0, sSCGWData.sColours.rgbaWasted)
ENDPROC
/// PURPOSE:
/// Draws "Ready?" -> "Fight" when the player is respawning
PROC SCGW_DRAW_RESPAWN_TEXT()
IF SCGW_IS_PLAYER_DEAD(sSCGWData.sLocalPlayer.iLocalPart)
IF IS_BIT_SET(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_RESPAWN_FIGHT_SOUND_PLAYED)
CLEAR_BIT(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_RESPAWN_FIGHT_SOUND_PLAYED)
ENDIF
INT iTimeToRespawn = NATIVE_TO_INT(GET_NETWORK_TIME()) - SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastDamagedTime
IF iTimeToRespawn < ciSCGW_WASTED_TIME
OR SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].eCurrentPlayerState = SCGW_PLAYER_STATE_CANT_RESPAWN
SCGW_DRAW_WASTED_TEXT()
IF NOT IS_BIT_SET(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_WASTED_SOUND_PLAYED)
SET_BIT(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_WASTED_SOUND_PLAYED)
SCGW_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_Wasted")
ENDIF
EXIT
ENDIF
IF iTimeToRespawn < ciSCGW_RESPAWN_TIME
IF NOT IS_BIT_SET(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_READY_SOUND_PLAYED)
SET_BIT(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_READY_SOUND_PLAYED)
SCGW_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_Text_Appear_Generic")
ENDIF
SCGW_DRAW_PLAY_AREA_FADE(sSCGWData.sColours.rgbaBlack, ciSCGW_COUNTDOWN_ALPHA)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "text_ready", cfSCREEN_CENTER, cfSCREEN_CENTER + cfSCGW_CENTER_TEXT_OFFSET_Y, cfSCGW_READY_SPRITE_SCALE_X, cfSCGW_READY_SPRITE_SCALE_Y, 0.0, sSCGWData.sColours.rgbaSprite)
ENDIF
ELSE
IF IS_BIT_SET(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_WASTED_SOUND_PLAYED)
CLEAR_BIT(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_WASTED_SOUND_PLAYED)
ENDIF
IF IS_BIT_SET(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_READY_SOUND_PLAYED)
CLEAR_BIT(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_READY_SOUND_PLAYED)
ENDIF
ENDIF
IF SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastRespawnTime = -HIGHEST_INT
EXIT
ENDIF
INT iFightTime = NATIVE_TO_INT(GET_NETWORK_TIME()) - SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].iLastRespawnTime
IF iFightTime < ciSCGW_RESPAWN_FIGHT_TIME
IF NOT IS_BIT_SET(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_RESPAWN_FIGHT_SOUND_PLAYED)
SET_BIT(sSCGWData.iAudioBS, ciSCGW_AUDIOBS_RESPAWN_FIGHT_SOUND_PLAYED)
SCGW_PLAY_FIRE_AND_FORGET_FRONTEND_SOUND("Frontend_GO")
ENDIF
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "text_fight", cfSCREEN_CENTER, cfSCREEN_CENTER + cfSCGW_CENTER_TEXT_OFFSET_Y, cfSCGW_FIGHT_SPRITE_SCALE_X, cfSCGW_FIGHT_SPRITE_SCALE_Y, 0.0, sSCGWData.sColours.rgbaSprite)
ENDIF
ENDPROC
// ------------------------------ GANG SCREEN ------------------------------
/// PURPOSE:
/// Returns the texture dictionary the gang's ready up sprite is in based on whether or not the player is connected
FUNC STRING SCGW_GET_TEXTURE_DICTIONARY_FOR_GANG_READY_SPRITE(INT iGang)
IF sSCGWData.iGangPlayers[iGang] != -1
SWITCH iGang
CASE ciSCGW_GANG_GREEN
RETURN "MPArcadeCabinetGridPlayerGreen"
CASE ciSCGW_GANG_PURPLE
RETURN "MPArcadeCabinetGridPlayerPurple"
CASE ciSCGW_GANG_YELLOW
RETURN "MPArcadeCabinetGridPlayerYellow"
CASE ciSCGW_GANG_BLUE
RETURN "MPArcadeCabinetGridPlayerBlue"
ENDSWITCH
ENDIF
RETURN "MPArcadeCabinetGridHUD"
ENDFUNC
/// PURPOSE:
/// Returns the texture name of the gang's ready up sprite based on whether or not the player is connected
FUNC STRING SCGW_GET_TEXTURE_FOR_GANG_READY_SPRITE(INT iGang)
IF sSCGWData.iGangPlayers[iGang] = -1
SWITCH iGang
CASE ciSCGW_GANG_GREEN
RETURN "Gang_Lobby_Green_Off"
CASE ciSCGW_GANG_PURPLE
RETURN "Gang_Lobby_Purple_Off"
CASE ciSCGW_GANG_YELLOW
RETURN "Gang_Lobby_Yellow_Off"
CASE ciSCGW_GANG_BLUE
RETURN "Gang_Lobby_Blue_Off"
ENDSWITCH
ELSE
SWITCH iGang
CASE ciSCGW_GANG_GREEN
RETURN "Gang_Lobby_Green_On"
CASE ciSCGW_GANG_PURPLE
RETURN "Gang_Lobby_Purple_On"
CASE ciSCGW_GANG_YELLOW
RETURN "Gang_Lobby_Yellow_On"
CASE ciSCGW_GANG_BLUE
RETURN "Gang_Lobby_Blue_On"
ENDSWITCH
ENDIF
RETURN "INVALID GANG"
ENDFUNC
/// PURPOSE:
/// Returns the scale of the ready up sprites
FUNC VECTOR_2D SCGW_GET_SPRITE_SCALE_FOR_GANG_READY_SPRITE()
RETURN INIT_VECTOR_2D(cfSCGW_GANG_READY_SCALE_X, cfSCGW_GANG_READY_SCALE_Y)
ENDFUNC
/// PURPOSE:
/// Returns the screenspace position to draw a gang's ready up sprite
FUNC VECTOR_2D SCGW_GET_SPRITE_POSITION_FOR_GANG_READY_SPRITE(INT iGang)
SWITCH iGang
CASE ciSCGW_GANG_GREEN
RETURN INIT_VECTOR_2D(cfSCGW_GANG_READY_POS_X_0, cfSCGW_GANG_READY_POS_Y_0)
CASE ciSCGW_GANG_PURPLE
RETURN INIT_VECTOR_2D(cfSCGW_GANG_READY_POS_X_1, cfSCGW_GANG_READY_POS_Y_1)
CASE ciSCGW_GANG_YELLOW
RETURN INIT_VECTOR_2D(cfSCGW_GANG_READY_POS_X_2, cfSCGW_GANG_READY_POS_Y_2)
CASE ciSCGW_GANG_BLUE
RETURN INIT_VECTOR_2D(cfSCGW_GANG_READY_POS_X_3, cfSCGW_GANG_READY_POS_Y_3)
ENDSWITCH
RETURN INIT_VECTOR_2D(cfSCREEN_CENTER, cfSCREEN_CENTER)
ENDFUNC
/// PURPOSE:
/// Returns the position of the ready text for the gang
FUNC STRING SCGW_GET_READY_TEXT_POSITION_FOR_GANG(INT iGang)
SWITCH iGang
CASE ciSCGW_GANG_GREEN
RETURN INIT_VECTOR_2D(cfSCGW_GANG_READY_POS_X_0, cfSCGW_GANG_READY_TEXT_POS_Y)
CASE ciSCGW_GANG_PURPLE
RETURN INIT_VECTOR_2D(cfSCGW_GANG_READY_POS_X_1, cfSCGW_GANG_READY_TEXT_POS_Y)
CASE ciSCGW_GANG_YELLOW
RETURN INIT_VECTOR_2D(cfSCGW_GANG_READY_POS_X_2, cfSCGW_GANG_READY_TEXT_POS_Y)
CASE ciSCGW_GANG_BLUE
RETURN INIT_VECTOR_2D(cfSCGW_GANG_READY_POS_X_3, cfSCGW_GANG_READY_TEXT_POS_Y)
ENDSWITCH
RETURN INIT_VECTOR_2D(cfSCREEN_CENTER, cfSCREEN_CENTER)
ENDFUNC
/// PURPOSE:
/// Returns the position of the local player arrow sprite for the gang
FUNC VECTOR_2D SCGW_GET_LOCAL_PLAYER_ARROW_POSITION_FOR_GANG(INT iGang)
SWITCH iGang
CASE ciSCGW_GANG_GREEN
RETURN INIT_VECTOR_2D(cfSCGW_GANG_READY_POS_X_0, cfSCGW_GANG_READY_ARROW_POS_Y)
CASE ciSCGW_GANG_PURPLE
RETURN INIT_VECTOR_2D(cfSCGW_GANG_READY_POS_X_1, cfSCGW_GANG_READY_ARROW_POS_Y)
CASE ciSCGW_GANG_YELLOW
RETURN INIT_VECTOR_2D(cfSCGW_GANG_READY_POS_X_2, cfSCGW_GANG_READY_ARROW_POS_Y)
CASE ciSCGW_GANG_BLUE
RETURN INIT_VECTOR_2D(cfSCGW_GANG_READY_POS_X_3, cfSCGW_GANG_READY_ARROW_POS_Y)
ENDSWITCH
RETURN INIT_VECTOR_2D(cfSCREEN_CENTER, cfSCREEN_CENTER)
ENDFUNC
/// PURPOSE:
/// Draws the ready up sprite and all text based on the gang player's status
PROC SCGW_DRAW_READY_UP_FOR_GANG(INT iGang, BOOL bForLbd = FALSE)
VECTOR_2D vPos = SCGW_GET_SPRITE_POSITION_FOR_GANG_READY_SPRITE(iGang)
VECTOR_2D vScale = SCGW_GET_SPRITE_SCALE_FOR_GANG_READY_SPRITE()
//Background Sprite
ARCADE_CABINET_DRAW_SPRITE(SCGW_GET_TEXTURE_DICTIONARY_FOR_GANG_READY_SPRITE(iGang),
SCGW_GET_TEXTURE_FOR_GANG_READY_SPRITE(iGang),
vPos.x, vPos.y, vScale.x, vScale.y,
0.0, sSCGWData.sColours.rgbaSprite)
//Local Player Arrow
IF sSCGWData.iGangPlayers[iGang] = sSCGWData.sLocalPlayer.iLocalPart
RGBA_COLOUR_STRUCT rgba = sSCGWData.sColours.rgbaGangColours[iGang]
IF SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].eCurrentPlayerState != SCGW_PLAYER_STATE_WAITING_TO_START
rgba.iA = ROUND(TAN(TO_FLOAT(GET_GAME_TIMER()) * cfSCGW_GANG_READY_ARROW_FLASH_MOD)) * 255
ENDIF
VECTOR_2D vArrowPos = SCGW_GET_LOCAL_PLAYER_ARROW_POSITION_FOR_GANG(iGang)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "gang_lobby_player_highlight",
vArrowPos.x, vArrowPos.y, cfSCGW_GANG_READY_ARROW_SCALE_X, cfSCGW_GANG_READY_ARROW_SCALE_Y,
0.0, rgba)
ENDIF
IF sSCGWData.iGangPlayers[iGang] != -1
//Player Name
SET_TEXT_SCALE(cfSCGW_GANG_PLAYER_NAME_TEXT_SCALE, cfSCGW_GANG_PLAYER_NAME_TEXT_SCALE)
SET_TEXT_COLOUR(sSCGWData.sColours.rgbaGangColours[iGang].iR, sSCGWData.sColours.rgbaGangColours[iGang].iG, sSCGWData.sColours.rgbaGangColours[iGang].iB, 255)
SET_TEXT_CENTRE(TRUE)
SET_TEXT_FONT(FONT_CONDENSED)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("STRING")
IF NOT SCGW_IS_GANG_BOT(iGang)
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(GET_PLAYER_NAME(NETWORK_GET_PLAYER_INDEX(INT_TO_PARTICIPANTINDEX(sSCGWData.iGangPlayers[iGang]))))
ELSE
TEXT_LABEL_15 tlBotName = "Bot "
SWITCH iGang
CASE 0 tlBotName += "Green" BREAK
CASE 1 tlBotName += "Purple" BREAK
CASE 2 tlBotName += "Yellow" BREAK
CASE 3 tlBotName += "Blue" BREAK
ENDSWITCH
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(tlBotName)
ENDIF
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(vPos.x), cfSCGW_GANG_PLAYER_NAME_TEXT_POS_Y)
ENDIF
IF bForLbd
EXIT
ENDIF
//Ready Text
IF sSCGWData.iGangPlayers[iGang] != -1
AND SCGW_PlayerBD[sSCGWData.iGangPlayers[iGang]].eCurrentPlayerState = SCGW_PLAYER_STATE_WAITING_TO_START
SET_TEXT_SCALE(cfSCGW_GANG_READY_TEXT_SCALE, cfSCGW_GANG_READY_TEXT_SCALE)
SET_TEXT_COLOUR(0, 0, 0, 255)
SET_TEXT_CENTRE(TRUE)
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("SCGW_R")
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(vPos.x + cfSCGW_DROP_SHADOW_OFFSET_X), cfSCGW_GANG_READY_TEXT_POS_Y + cfSCGW_DROP_SHADOW_OFFSET_Y)
SET_TEXT_SCALE(cfSCGW_GANG_READY_TEXT_SCALE, cfSCGW_GANG_READY_TEXT_SCALE)
SET_TEXT_COLOUR(sSCGWData.sColours.rgbaGangColours[iGang].iR, sSCGWData.sColours.rgbaGangColours[iGang].iG, sSCGWData.sColours.rgbaGangColours[iGang].iB, 255)
SET_TEXT_CENTRE(TRUE)
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("SCGW_R")
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(vPos.x), cfSCGW_GANG_READY_TEXT_POS_Y)
ENDIF
//Just Joined Fill
IF sSCGWData.iGangPlayerJoinTimes[iGang] != -HIGHEST_INT
AND NATIVE_TO_INT(GET_NETWORK_TIME()) - sSCGWData.iGangPlayerJoinTimes[iGang] <= ciSCGW_GANG_READY_JUST_JOINED_TIME
FLOAT fAlpha = TO_FLOAT(NATIVE_TO_INT(GET_NETWORK_TIME()) - sSCGWData.iGangPlayerJoinTimes[iGang]) / ciSCGW_GANG_READY_JUST_JOINED_TIME
RGBA_COLOUR_STRUCT rgbaFill = sSCGWData.sColours.rgbaGangColours[iGang]
rgbaFill.iA = ROUND(INTERP_FLOAT(ciSCGW_GANG_READY_JUST_JOINED_ALPHA, 0, fAlpha, INTERPTYPE_ACCEL))
vScale.y -= cfSCGW_GANG_READY_RECT_OFFSET
vPos.y += (cfSCGW_GANG_READY_RECT_OFFSET/2)
DRAW_RECT_FROM_VECTOR_2D(vPos, vScale, rgbaFill)
ENDIF
ENDPROC
/// PURPOSE:
/// Draws the gang ready up screen
PROC SCGW_DRAW_GANG_SCREEN()
SCGW_DRAW_BACKGROUND()
INT iGang
INT iReadyCount
FOR iGang = 0 TO ciSCGW_GANG_MAX - 1
SCGW_DRAW_READY_UP_FOR_GANG(iGang)
IF sSCGWData.iGangPlayers[iGang] != -1
AND SCGW_PlayerBD[sSCGWData.iGangPlayers[iGang]].eCurrentPlayerState = SCGW_PLAYER_STATE_WAITING_TO_START
iReadyCount++
ENDIF
ENDFOR
IF iReadyCount != sSCGWData.iConnectedPlayers
TEXT_LABEL_15 tl15Text
IF SCGW_PlayerBD[sSCGWData.sLocalPlayer.iLocalPart].eCurrentPlayerState = SCGW_PLAYER_STATE_WAITING_TO_START
tl15Text = "SCGW_WFP"
ELSE
tl15Text = "SCGW_PS"
ENDIF
INT iAlpha = ROUND(SIN(TO_FLOAT(GET_GAME_TIMER()) * cfSCGW_TIMER_SIN_MOD) * 255)
IF iAlpha > 51
iAlpha = 255
ELSE
iAlpha = 0
ENDIF
SET_TEXT_SCALE(cfSCGW_GANG_PRESS_START_TEXT_SCALE, cfSCGW_GANG_PRESS_START_TEXT_SCALE)
SET_TEXT_COLOUR(255, 255, 255, iAlpha)
SET_TEXT_DROP_SHADOW()
SET_TEXT_CENTRE(TRUE)
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT(tl15Text)
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(cfSCREEN_CENTER), cfSCGW_GANG_PRESS_START_TEXT_POS_Y)
ENDIF
ARCADE_GAMES_POSTFX_DRAW()
SCGW_DRAW_FACADE()
ENDPROC
// ------------------------------ LEADERBOARD ------------------------------
FUNC STRING SCGW_GET_POSITION_STRING(INT iPosition)
SWITCH iPosition
CASE 0 RETURN "SCGW_1ST"
CASE 1 RETURN "SCGW_2ND"
CASE 2 RETURN "SCGW_3RD"
CASE 3 RETURN "SCGW_4TH"
CASE 4 RETURN "SCGW_5TH"
CASE 5 RETURN "SCGW_6TH"
CASE 6 RETURN "SCGW_7TH"
CASE 7 RETURN "SCGW_8TH"
CASE 8 RETURN "SCGW_9TH"
CASE 9 RETURN "SCGW_10TH"
ENDSWITCH
RETURN "SCGW_URD"
ENDFUNC
PROC SCGW_DRAW_LEADERBOARD_ENTRIES()
SCGW_DRAW_BACKGROUND()
INT iUnpackedInitials[ciARCADE_CABINET_LEADERBOARD_INITIALS]
INT iGang
FOR iGang = 0 TO ciSCGW_GANG_MAX - 1
SCGW_DRAW_READY_UP_FOR_GANG(iGang, TRUE)
IF sSCGWData.iGangPlayers[iGang] = -1
RELOOP
ENDIF
VECTOR_2D vPos = SCGW_GET_SPRITE_POSITION_FOR_GANG_READY_SPRITE(iGang)
//Position/Rank
INT iPosition = SCGW_GET_PLAYER_LEADERBOARD_POSITION(sSCGWData.iGangPlayers[iGang])
SET_TEXT_SCALE(cfSCGW_LBD_ENTRY_POSITION_TEXT_SCALE, cfSCGW_LBD_ENTRY_POSITION_TEXT_SCALE)
SET_TEXT_COLOUR(0, 0, 0, 255)
SET_TEXT_CENTRE(TRUE)
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT(SCGW_GET_POSITION_STRING(iPosition))
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(vPos.x + cfSCGW_DROP_SHADOW_OFFSET_X), cfSCGW_LBD_ENTRY_POSITION_POS_Y + cfSCGW_DROP_SHADOW_OFFSET_Y)
SET_TEXT_SCALE(cfSCGW_LBD_ENTRY_POSITION_TEXT_SCALE, cfSCGW_LBD_ENTRY_POSITION_TEXT_SCALE)
SET_TEXT_COLOUR(sSCGWData.sColours.rgbaGangColours[iGang].iR, sSCGWData.sColours.rgbaGangColours[iGang].iG, sSCGWData.sColours.rgbaGangColours[iGang].iB, 255)
SET_TEXT_CENTRE(TRUE)
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT(SCGW_GET_POSITION_STRING(iPosition))
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(vPos.x), cfSCGW_LBD_ENTRY_POSITION_POS_Y)
//Total Score
INT iScore = SCGW_PlayerBD[sSCGWData.iGangPlayers[iGang]].iLeaderboardScore
SET_TEXT_SCALE(cfSCGW_LBD_ENTRY_SCORE_TEXT_SCALE, cfSCGW_LBD_ENTRY_SCORE_TEXT_SCALE)
SET_TEXT_COLOUR(0, 0, 0, 255)
SET_TEXT_CENTRE(TRUE)
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("SCGW_PTS")
ADD_TEXT_COMPONENT_INTEGER(iScore)
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(vPos.x + cfSCGW_DROP_SHADOW_OFFSET_X), cfSCGW_LBD_ENTRY_SCORE_POS_Y + cfSCGW_DROP_SHADOW_OFFSET_Y)
SET_TEXT_SCALE(cfSCGW_LBD_ENTRY_SCORE_TEXT_SCALE, cfSCGW_LBD_ENTRY_SCORE_TEXT_SCALE)
SET_TEXT_COLOUR(sSCGWData.sColours.rgbaGangColours[iGang].iR, sSCGWData.sColours.rgbaGangColours[iGang].iG, sSCGWData.sColours.rgbaGangColours[iGang].iB, 255)
SET_TEXT_CENTRE(TRUE)
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("SCGW_PTS")
ADD_TEXT_COMPONENT_INTEGER(iScore)
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(vPos.x), cfSCGW_LBD_ENTRY_SCORE_POS_Y)
IF sSCGWData.iGangPlayers[iGang] != sSCGWData.sLocalPlayer.iLocalPart
RELOOP
ENDIF
IF iPosition >= ciCASINO_ARCADE_LEADERBOARD_POSITIONS
RELOOP
ENDIF
//Initials
ARCADE_UNPACK_LEADERBOARD_INITIALS(SCGW_PlayerBD[sSCGWData.iGangPlayers[iGang]].iLeaderboardInitials, iUnpackedInitials)
SET_TEXT_SCALE(cfSCGW_LBD_ENTRY_INITIALS_TEXT_SCALE, cfSCGW_LBD_ENTRY_INITIALS_TEXT_SCALE)
SET_TEXT_COLOUR(0, 0, 0, 255)
SET_TEXT_CENTRE(TRUE)
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(ARCADE_GET_CHAR_FROM_INT(iUnpackedInitials[0]))
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(vPos.x - cfSCGW_LBD_ENTRY_INITIALS_SPACING + cfSCGW_DROP_SHADOW_OFFSET_X), cfSCGW_LBD_ENTRY_INITIALS_POS_Y + cfSCGW_DROP_SHADOW_OFFSET_Y)
SET_TEXT_SCALE(cfSCGW_LBD_ENTRY_INITIALS_TEXT_SCALE, cfSCGW_LBD_ENTRY_INITIALS_TEXT_SCALE)
IF sSCGWData.iInitial = 0
SET_TEXT_COLOUR(sSCGWData.sColours.rgbaGangColours[iGang].iR, sSCGWData.sColours.rgbaGangColours[iGang].iG, sSCGWData.sColours.rgbaGangColours[iGang].iB, 255)
ELSE
SET_TEXT_COLOUR(255, 255, 255, 255)
ENDIF
SET_TEXT_CENTRE(TRUE)
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(ARCADE_GET_CHAR_FROM_INT(iUnpackedInitials[0]))
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(vPos.x - cfSCGW_LBD_ENTRY_INITIALS_SPACING), cfSCGW_LBD_ENTRY_INITIALS_POS_Y)
ARCADE_UNPACK_LEADERBOARD_INITIALS(SCGW_PlayerBD[sSCGWData.iGangPlayers[iGang]].iLeaderboardInitials, iUnpackedInitials)
SET_TEXT_SCALE(cfSCGW_LBD_ENTRY_INITIALS_TEXT_SCALE, cfSCGW_LBD_ENTRY_INITIALS_TEXT_SCALE)
SET_TEXT_COLOUR(0, 0, 0, 255)
SET_TEXT_CENTRE(TRUE)
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(ARCADE_GET_CHAR_FROM_INT(iUnpackedInitials[1]))
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(vPos.x + cfSCGW_DROP_SHADOW_OFFSET_X), cfSCGW_LBD_ENTRY_INITIALS_POS_Y + cfSCGW_DROP_SHADOW_OFFSET_Y)
SET_TEXT_SCALE(cfSCGW_LBD_ENTRY_INITIALS_TEXT_SCALE, cfSCGW_LBD_ENTRY_INITIALS_TEXT_SCALE)
IF sSCGWData.iInitial = 1
SET_TEXT_COLOUR(sSCGWData.sColours.rgbaGangColours[iGang].iR, sSCGWData.sColours.rgbaGangColours[iGang].iG, sSCGWData.sColours.rgbaGangColours[iGang].iB, 255)
ELSE
SET_TEXT_COLOUR(255, 255, 255, 255)
ENDIF
SET_TEXT_CENTRE(TRUE)
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(ARCADE_GET_CHAR_FROM_INT(iUnpackedInitials[1]))
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(vPos.x), cfSCGW_LBD_ENTRY_INITIALS_POS_Y)
ARCADE_UNPACK_LEADERBOARD_INITIALS(SCGW_PlayerBD[sSCGWData.iGangPlayers[iGang]].iLeaderboardInitials, iUnpackedInitials)
SET_TEXT_SCALE(cfSCGW_LBD_ENTRY_INITIALS_TEXT_SCALE, cfSCGW_LBD_ENTRY_INITIALS_TEXT_SCALE)
SET_TEXT_COLOUR(0, 0, 0, 255)
SET_TEXT_CENTRE(TRUE)
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(ARCADE_GET_CHAR_FROM_INT(iUnpackedInitials[2]))
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(vPos.x + cfSCGW_LBD_ENTRY_INITIALS_SPACING + cfSCGW_DROP_SHADOW_OFFSET_X), cfSCGW_LBD_ENTRY_INITIALS_POS_Y + cfSCGW_DROP_SHADOW_OFFSET_Y)
SET_TEXT_SCALE(cfSCGW_LBD_ENTRY_INITIALS_TEXT_SCALE, cfSCGW_LBD_ENTRY_INITIALS_TEXT_SCALE)
IF sSCGWData.iInitial = 2
SET_TEXT_COLOUR(sSCGWData.sColours.rgbaGangColours[iGang].iR, sSCGWData.sColours.rgbaGangColours[iGang].iG, sSCGWData.sColours.rgbaGangColours[iGang].iB, 255)
ELSE
SET_TEXT_COLOUR(255, 255, 255, 255)
ENDIF
SET_TEXT_CENTRE(TRUE)
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(ARCADE_GET_CHAR_FROM_INT(iUnpackedInitials[2]))
END_TEXT_COMMAND_DISPLAY_TEXT( APPLY_ASPECT_MOD_TO_X(vPos.x + cfSCGW_LBD_ENTRY_INITIALS_SPACING), cfSCGW_LBD_ENTRY_INITIALS_POS_Y)
ENDFOR
ARCADE_GAMES_POSTFX_DRAW()
SCGW_DRAW_FACADE()
ENDPROC
PROC SCGW_DRAW_LEADERBOARD()
SCGW_DRAW_BACKGROUND()
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "lbd", cfSCREEN_CENTER, cfSCREEN_CENTER, cfSCGW_LBD_BG_SCALE_X, cfSCGW_LBD_BG_SCALE_Y, 0.0, sSCGWData.sColours.rgbaSprite)
//Title
SET_TEXT_SCALE(cfSCGW_LBD_TEXT_SCALE, cfSCGW_LBD_TEXT_SCALE)
SET_TEXT_COLOUR(0, 0, 0, 255)
SET_TEXT_CENTRE(TRUE)
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("SCGW_LBD_T")
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(cfSCREEN_CENTER + cfSCGW_DROP_SHADOW_OFFSET_X), cfSCGW_LBD_TITLE_POS_Y + cfSCGW_DROP_SHADOW_OFFSET_Y)
SET_TEXT_SCALE(cfSCGW_LBD_TEXT_SCALE, cfSCGW_LBD_TEXT_SCALE)
SET_TEXT_COLOUR(255, 255, 255, 255)
SET_TEXT_CENTRE(TRUE)
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("SCGW_LBD_T")
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(cfSCREEN_CENTER), cfSCGW_LBD_TITLE_POS_Y)
INT iUnpackedInitials[ciARCADE_CABINET_LEADERBOARD_INITIALS]
FLOAT fY = cfSCGW_LBD_STARTING_POS_Y
INT iPositionLoop = 0
FOR iPositionLoop = 0 TO ciCASINO_ARCADE_LEADERBOARD_POSITIONS - 1
ARCADE_UNPACK_LEADERBOARD_INITIALS(SCGW_ServerBD.sLeaderboard[iPositionLoop].iInitials, iUnpackedInitials)
INT iAlpha = 255
IF SCGW_ServerBD.sLeaderboard[iPositionLoop].iPlayer = sSCGWData.sLocalPlayer.iLocalPart
iAlpha = ROUND(ABSF(SIN(TO_FLOAT(NATIVE_TO_INT(GET_NETWORK_TIME())) * 0.5) * 80)) + 175
ENDIF
//Position
SET_TEXT_SCALE(cfSCGW_LBD_TEXT_SCALE, cfSCGW_LBD_TEXT_SCALE)
SET_TEXT_COLOUR(0, 0, 0, iAlpha)
SET_TEXT_RIGHT_JUSTIFY(TRUE)
SET_TEXT_WRAP(APPLY_ASPECT_MOD_TO_X(0.0), APPLY_ASPECT_MOD_TO_X(cfSCGW_LBD_POSITION_POS_X + cfSCGW_DROP_SHADOW_OFFSET_X))
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT(SCGW_GET_POSITION_STRING(iPositionLoop))
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(cfSCREEN_CENTER), fY + cfSCGW_DROP_SHADOW_OFFSET_Y)
SET_TEXT_SCALE(cfSCGW_LBD_TEXT_SCALE, cfSCGW_LBD_TEXT_SCALE)
SET_TEXT_COLOUR(sSCGWData.sColours.rgbaGangColours[iUnpackedInitials[3]].iR, sSCGWData.sColours.rgbaGangColours[iUnpackedInitials[3]].iG, sSCGWData.sColours.rgbaGangColours[iUnpackedInitials[3]].iB, iAlpha)
SET_TEXT_RIGHT_JUSTIFY(TRUE)
SET_TEXT_WRAP(APPLY_ASPECT_MOD_TO_X(0.0), APPLY_ASPECT_MOD_TO_X(cfSCGW_LBD_POSITION_POS_X))
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT(SCGW_GET_POSITION_STRING(iPositionLoop))
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(cfSCREEN_CENTER), fY)
//Initials
SET_TEXT_SCALE(cfSCGW_LBD_TEXT_SCALE, cfSCGW_LBD_TEXT_SCALE)
SET_TEXT_COLOUR(0, 0, 0, iAlpha)
SET_TEXT_RIGHT_JUSTIFY(TRUE)
SET_TEXT_WRAP(APPLY_ASPECT_MOD_TO_X(0.0), APPLY_ASPECT_MOD_TO_X(cfSCGW_LBD_INITIAL_1_POS_X + cfSCGW_DROP_SHADOW_OFFSET_X))
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(ARCADE_GET_CHAR_FROM_INT(iUnpackedInitials[0]))
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(cfSCREEN_CENTER), fY + cfSCGW_DROP_SHADOW_OFFSET_Y)
SET_TEXT_SCALE(cfSCGW_LBD_TEXT_SCALE, cfSCGW_LBD_TEXT_SCALE)
SET_TEXT_COLOUR(sSCGWData.sColours.rgbaGangColours[iUnpackedInitials[3]].iR, sSCGWData.sColours.rgbaGangColours[iUnpackedInitials[3]].iG, sSCGWData.sColours.rgbaGangColours[iUnpackedInitials[3]].iB, iAlpha)
SET_TEXT_RIGHT_JUSTIFY(TRUE)
SET_TEXT_WRAP(APPLY_ASPECT_MOD_TO_X(0.0), APPLY_ASPECT_MOD_TO_X(cfSCGW_LBD_INITIAL_1_POS_X))
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(ARCADE_GET_CHAR_FROM_INT(iUnpackedInitials[0]))
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(cfSCREEN_CENTER), fY)
SET_TEXT_SCALE(cfSCGW_LBD_TEXT_SCALE, cfSCGW_LBD_TEXT_SCALE)
SET_TEXT_COLOUR(0, 0, 0, iAlpha)
SET_TEXT_RIGHT_JUSTIFY(TRUE)
SET_TEXT_WRAP(APPLY_ASPECT_MOD_TO_X(0.0), APPLY_ASPECT_MOD_TO_X(cfSCGW_LBD_INITIAL_2_POS_X + cfSCGW_DROP_SHADOW_OFFSET_X))
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(ARCADE_GET_CHAR_FROM_INT(iUnpackedInitials[1]))
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(cfSCREEN_CENTER), fY + cfSCGW_DROP_SHADOW_OFFSET_Y)
SET_TEXT_SCALE(cfSCGW_LBD_TEXT_SCALE, cfSCGW_LBD_TEXT_SCALE)
SET_TEXT_COLOUR(sSCGWData.sColours.rgbaGangColours[iUnpackedInitials[3]].iR, sSCGWData.sColours.rgbaGangColours[iUnpackedInitials[3]].iG, sSCGWData.sColours.rgbaGangColours[iUnpackedInitials[3]].iB, iAlpha)
SET_TEXT_RIGHT_JUSTIFY(TRUE)
SET_TEXT_WRAP(APPLY_ASPECT_MOD_TO_X(0.0), APPLY_ASPECT_MOD_TO_X(cfSCGW_LBD_INITIAL_2_POS_X))
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(ARCADE_GET_CHAR_FROM_INT(iUnpackedInitials[1]))
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(cfSCREEN_CENTER), fY)
SET_TEXT_SCALE(cfSCGW_LBD_TEXT_SCALE, cfSCGW_LBD_TEXT_SCALE)
SET_TEXT_COLOUR(0, 0, 0, iAlpha)
SET_TEXT_RIGHT_JUSTIFY(TRUE)
SET_TEXT_WRAP(APPLY_ASPECT_MOD_TO_X(0.0), APPLY_ASPECT_MOD_TO_X(cfSCGW_LBD_INITIAL_3_POS_X + cfSCGW_DROP_SHADOW_OFFSET_X))
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(ARCADE_GET_CHAR_FROM_INT(iUnpackedInitials[2]))
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(cfSCREEN_CENTER), fY + cfSCGW_DROP_SHADOW_OFFSET_Y)
SET_TEXT_SCALE(cfSCGW_LBD_TEXT_SCALE, cfSCGW_LBD_TEXT_SCALE)
SET_TEXT_COLOUR(sSCGWData.sColours.rgbaGangColours[iUnpackedInitials[3]].iR, sSCGWData.sColours.rgbaGangColours[iUnpackedInitials[3]].iG, sSCGWData.sColours.rgbaGangColours[iUnpackedInitials[3]].iB, iAlpha)
SET_TEXT_RIGHT_JUSTIFY(TRUE)
SET_TEXT_WRAP(APPLY_ASPECT_MOD_TO_X(0.0), APPLY_ASPECT_MOD_TO_X(cfSCGW_LBD_INITIAL_3_POS_X))
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(ARCADE_GET_CHAR_FROM_INT(iUnpackedInitials[2]))
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(cfSCREEN_CENTER), fY)
//Score
SET_TEXT_SCALE(cfSCGW_LBD_TEXT_SCALE, cfSCGW_LBD_TEXT_SCALE)
SET_TEXT_COLOUR(0, 0, 0, iAlpha)
SET_TEXT_RIGHT_JUSTIFY(TRUE)
SET_TEXT_WRAP(APPLY_ASPECT_MOD_TO_X(0.0), APPLY_ASPECT_MOD_TO_X(cfSCGW_LBD_SCORE_POS_X + cfSCGW_DROP_SHADOW_OFFSET_X))
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("SCGW_PTS")
ADD_TEXT_COMPONENT_INTEGER(SCGW_ServerBD.sLeaderboard[iPositionLoop].iScore)
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(cfSCREEN_CENTER), fY + cfSCGW_DROP_SHADOW_OFFSET_Y)
SET_TEXT_SCALE(cfSCGW_LBD_TEXT_SCALE, cfSCGW_LBD_TEXT_SCALE)
SET_TEXT_COLOUR(sSCGWData.sColours.rgbaGangColours[iUnpackedInitials[3]].iR, sSCGWData.sColours.rgbaGangColours[iUnpackedInitials[3]].iG, sSCGWData.sColours.rgbaGangColours[iUnpackedInitials[3]].iB, iAlpha)
SET_TEXT_RIGHT_JUSTIFY(TRUE)
SET_TEXT_WRAP(APPLY_ASPECT_MOD_TO_X(0.0), APPLY_ASPECT_MOD_TO_X(cfSCGW_LBD_SCORE_POS_X))
SET_TEXT_FONT(FONT_STYLE_PRICEDOWN)
BEGIN_TEXT_COMMAND_DISPLAY_TEXT("SCGW_PTS")
ADD_TEXT_COMPONENT_INTEGER(SCGW_ServerBD.sLeaderboard[iPositionLoop].iScore)
END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(cfSCREEN_CENTER), fY)
fY += cfSCGW_LBD_SPACING_Y
ENDFOR
ARCADE_GAMES_POSTFX_DRAW()
SCGW_DRAW_FACADE()
ENDPROC
// ------------------------------ FLYOVERS ------------------------------
FUNC VECTOR_2D SCGW_GET_FLYOVER_SCALE(INT iFlyoverType)
SWITCH iFlyoverType
CASE ciSCGW_FLYOVER_TYPE_BIRDS
RETURN INIT_VECTOR_2D(cfSCGW_FLYOVER_BIRDS_SPRITE_SCALE_X, cfSCGW_FLYOVER_BIRDS_SPRITE_SCALE_Y)
CASE ciSCGW_FLYOVER_TYPE_PLANE
RETURN INIT_VECTOR_2D(cfSCGW_FLYOVER_PLANE_SPRITE_SCALE_X, cfSCGW_FLYOVER_PLANE_SPRITE_SCALE_Y)
CASE ciSCGW_FLYOVER_TYPE_HELI
RETURN INIT_VECTOR_2D(cfSCGW_FLYOVER_HELI_SPRITE_SCALE_X, cfSCGW_FLYOVER_HELI_SPRITE_SCALE_Y)
ENDSWITCH
RETURN INIT_VECTOR_2D(0,0)
ENDFUNC
FUNC STRING SCGW_GET_FLYOVER_SPRITE(INT iFlyoverType)
SWITCH iFlyoverType
CASE ciSCGW_FLYOVER_TYPE_BIRDS
RETURN "BIRDS"
CASE ciSCGW_FLYOVER_TYPE_PLANE
RETURN "AIRPLANE"
CASE ciSCGW_FLYOVER_TYPE_HELI
RETURN "HELICOPTER"
ENDSWITCH
RETURN ""
ENDFUNC
PROC SCGW_DRAW_FLYOVERS()
VECTOR_2D vScale = SCGW_GET_FLYOVER_SCALE(sSCGWData.iFlyoverType)
IF SCGW_IS_RECT_COMPLETELY_OUTSIDE_OF_GAME_AREA(sSCGWData.vFlyoverPos, vScale)
EXIT
ENDIF
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGrid", SCGW_GET_FLYOVER_SPRITE(sSCGWData.iFlyoverType), sSCGWData.vFlyoverPos.x, sSCGWData.vFlyoverPos.y,
vScale.x, vScale.y, 0.0, sSCGWData.sColours.rgbaSprite)
ENDPROC
// ------------------------------ EXPLOSIONS ------------------------------
/// PURPOSE:
/// Draws all active explosions
PROC SCGW_DRAW_EXPLOSIONS()
INT i
FOR i = 0 TO ciSCGW_MAX_EXPLOSIONS - 1
IF sSCGWData.sExplosions[i].iAnimFrame <= -1
RELOOP
ENDIF
TEXT_LABEL_63 tl63Sprite = "fire_ball"
tl63Sprite += (sSCGWData.sExplosions[i].iAnimFrame + 1)
VECTOR_2D vScale = INIT_VECTOR_2D(cfSCGW_EXPLOSION_SPRITE_SCALE_X / 2, cfSCGW_EXPLOSION_SPRITE_SCALE_Y / 2)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGrid", tl63Sprite,
sSCGWData.sExplosions[i].vPosition.x, sSCGWData.sExplosions[i].vPosition.y,
vScale.x, vScale.y, 0.0, sSCGWData.sColours.rgbaSprite)
sSCGWData.sExplosions[i].iAnimFrame += sSCGWData.iUpdateFrames
IF sSCGWData.sExplosions[i].iAnimFrame >= ciSCGW_EXPLOSION_FRAMES
sSCGWData.sExplosions[i].iAnimFrame = -1
ENDIF
ENDFOR
ENDPROC
// ------------------------------ MAP TILES ------------------------------
/// PURPOSE:
/// Processing drawing and animating the owning gang tag over the tile at iGridX, iGridY
PROC SCGW_DRAW_GANG_TAG_FOR_TILE(INT iGridX, INT iGridY)
TEXT_LABEL_63 tl63GangTexture
INT iGangToDraw
VECTOR_2D vScale
FLOAT fAlpha
IF sSCGWData.iLastFrameGangOwnership[iGridX][iGridY] != SCGW_ServerBD.iGridGangOwnership[iGridX][iGridY]
sSCGWData.iPreviousGangOwnership[iGridX][iGridY] = sSCGWData.iLastFrameGangOwnership[iGridX][iGridY]
sSCGWData.iGangOwnershipLastChanged[iGridX][iGridY] = NATIVE_TO_INT(GET_NETWORK_TIME())
IF sSCGWData.eCurrentState = SCGW_CLIENT_STATE_RUNNING
SCGW_PLAY_FIRE_AND_FORGET_GANG_SOUND("Steal_Area", SCGW_GET_SCREEN_COORDS_FROM_GRID_COORDS(iGridX, iGridY), SCGW_ServerBD.iGridGangOwnership[iGridX][iGridY])
ENDIF
ENDIF
IF sSCGWData.iPreviousGangOwnership[iGridX][iGridY] = ciSCGW_GANG_NONE
iGangToDraw = SCGW_ServerBD.iGridGangOwnership[iGridX][iGridY]
IF NATIVE_TO_INT(GET_NETWORK_TIME()) - sSCGWData.iGangOwnershipLastChanged[iGridX][iGridY] < ciSCGW_TERRITORY_ANIM_IN
fAlpha = TO_FLOAT(NATIVE_TO_INT(GET_NETWORK_TIME()) - sSCGWData.iGangOwnershipLastChanged[iGridX][iGridY]) / ciSCGW_TERRITORY_ANIM_IN
IF fAlpha > 1.0
fAlpha = 1.0
ENDIF
vScale.x = INTERP_FLOAT(0, cfSCGW_GANG_SPRAY_SPRITE_SCALE_X, fAlpha, INTERPTYPE_DECEL)
vScale.y = INTERP_FLOAT(0, cfSCGW_GANG_SPRAY_SPRITE_SCALE_Y, fAlpha, INTERPTYPE_DECEL)
ELSE
vScale = INIT_VECTOR_2D(cfSCGW_GANG_SPRAY_SPRITE_SCALE_X, cfSCGW_GANG_SPRAY_SPRITE_SCALE_Y)
ENDIF
ELSE
IF NATIVE_TO_INT(GET_NETWORK_TIME()) - sSCGWData.iGangOwnershipLastChanged[iGridX][iGridY] < ciSCGW_TERRITORY_ANIM_OUT
iGangToDraw = sSCGWData.iPreviousGangOwnership[iGridX][iGridY]
fAlpha = TO_FLOAT(NATIVE_TO_INT(GET_NETWORK_TIME()) - sSCGWData.iGangOwnershipLastChanged[iGridX][iGridY]) / ciSCGW_TERRITORY_ANIM_OUT
IF fAlpha > 1.0
fAlpha = 1.0
ENDIF
vScale.x = INTERP_FLOAT(cfSCGW_GANG_SPRAY_SPRITE_SCALE_X, 0, fAlpha, INTERPTYPE_ACCEL)
vScale.y = INTERP_FLOAT(cfSCGW_GANG_SPRAY_SPRITE_SCALE_Y, 0, fAlpha, INTERPTYPE_ACCEL)
ELSE
iGangToDraw = SCGW_ServerBD.iGridGangOwnership[iGridX][iGridY]
vScale = INIT_VECTOR_2D(cfSCGW_GANG_SPRAY_SPRITE_SCALE_X, cfSCGW_GANG_SPRAY_SPRITE_SCALE_Y)
ENDIF
ENDIF
IF iGangToDraw > ciSCGW_GANG_NONE
tl63GangTexture = "gang_logo_"
tl63GangTexture += sSCGWData.stGangSprites[iGangToDraw]
VECTOR_2D vCenter = SCGW_GET_SCREEN_COORDS_FROM_GRID_COORDS(iGridX, iGridY)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGrid", tl63GangTexture, vCenter.x, vCenter.y, vScale.x, vScale.y, 0.0, sSCGWData.sColours.rgbaGangColours[iGangToDraw])
ENDIF
sSCGWData.iLastFrameGangOwnership[iGridX][iGridY] = SCGW_ServerBD.iGridGangOwnership[iGridX][iGridY]
ENDPROC
/// PURPOSE:
/// Draws all of the building tiles
PROC SCGW_DRAW_MAP_TILES()
INT i, j
FOR i = 0 TO ciSCGW_MAX_GRID_POSITIONS_X - 1
FOR j = 0 TO ciSCGW_MAX_GRID_POSITIONS_Y - 1
//Map Tile
TEXT_LABEL_63 tl63Texture = "top_down_tile_"
INT iTileIndex = SCGW_ServerBD.iGridSpriteIndexes[i][j] + 1
tl63Texture += iTileIndex
VECTOR_2D vCenter = SCGW_GET_SCREEN_COORDS_FROM_GRID_COORDS(i, j)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridTiles", tl63Texture,
vCenter.x, vCenter.y,
cfSCGW_GRID_SPRITE_SCALE_X, cfSCGW_GRID_SPRITE_SCALE_Y,
0.0, sSCGWData.sColours.rgbaSprite)
//Gang Tag
SCGW_DRAW_GANG_TAG_FOR_TILE(i, j)
ENDFOR
ENDFOR
//Border Tiles
FOR i = -1 TO ciSCGW_MAX_GRID_POSITIONS_X
VECTOR_2D vCenterTop = SCGW_GET_SCREEN_COORDS_FROM_GRID_COORDS(i, -1)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridTiles", "top_down_tile_1",
vCenterTop.x, vCenterTop.y,
cfSCGW_GRID_SPRITE_SCALE_X, cfSCGW_GRID_SPRITE_SCALE_Y,
0.0, sSCGWData.sColours.rgbaSprite)
VECTOR_2D vCenterBottom = SCGW_GET_SCREEN_COORDS_FROM_GRID_COORDS(i, ciSCGW_MAX_GRID_POSITIONS_Y)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridTiles", "top_down_tile_1",
vCenterBottom.x, vCenterBottom.y,
cfSCGW_GRID_SPRITE_SCALE_X, cfSCGW_GRID_SPRITE_SCALE_Y,
0.0, sSCGWData.sColours.rgbaSprite)
ENDFOR
//First and last tiles already drawn above
FOR i = 0 TO ciSCGW_MAX_GRID_POSITIONS_Y - 1
VECTOR_2D vCenterLeft = SCGW_GET_SCREEN_COORDS_FROM_GRID_COORDS(-1, i)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridTiles", "top_down_tile_1",
vCenterLeft.x, vCenterLeft.y,
cfSCGW_GRID_SPRITE_SCALE_X, cfSCGW_GRID_SPRITE_SCALE_Y,
0.0, sSCGWData.sColours.rgbaSprite)
VECTOR_2D vCenterRight = SCGW_GET_SCREEN_COORDS_FROM_GRID_COORDS(ciSCGW_MAX_GRID_POSITIONS_X, i)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridTiles", "top_down_tile_1",
vCenterRight.x, vCenterRight.y,
cfSCGW_GRID_SPRITE_SCALE_X, cfSCGW_GRID_SPRITE_SCALE_Y,
0.0, sSCGWData.sColours.rgbaSprite)
ENDFOR
ENDPROC
// ------------------------------ PICKUPS ------------------------------
/// PURPOSE:
/// Draws all spawned pickups
PROC SCGW_DRAW_PICKUPS()
FLOAT fSineNumber = ABSF(SIN(TO_FLOAT(NATIVE_TO_INT(GET_NETWORK_TIME())) * cfSCGW_PICKUP_SCALE_SIN_MOD))
VECTOR_2D vScale
INT i
INT iDrawnPickups
BOOL bSoundTriggered = FALSE
FOR i = 0 TO ciSCGW_MAX_SPAWNED_PICKUPS - 1
IF SCGW_ServerBD.sPickups[i].iSpawnedPickupType = ciSCGW_PICKUPS_NONE
RELOOP
ENDIF
IF IS_BIT_SET(sSCGWData.iHiddenPickupsBS, i)
RELOOP
ENDIF
VECTOR_2D vPickupPosition = SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_ServerBD.sPickups[i].iSpawnedPickupLocation)
SET_BIT(iDrawnPickups, i)
IF NOT IS_BIT_SET(sSCGWData.iLastFramePickups, i)
AND NOT bSoundTriggered
SCGW_PLAY_FIRE_AND_FORGET_GLOBAL_SOUND("Pickup_Spawn", vPickupPosition)
bSoundTriggered = TRUE
ENDIF
TEXT_LABEL_63 tl63PickupTexture = sSCGWData.sPickupData[SCGW_ServerBD.sPickups[i].iSpawnedPickupType].stSpriteName
IF sSCGWData.sPickupData[SCGW_ServerBD.sPickups[i].iSpawnedPickupType].iMaxAnimFrames > 0
tl63PickupTexture += ((sSCGWData.iPickupAnimFrame % sSCGWData.sPickupData[SCGW_ServerBD.sPickups[i].iSpawnedPickupType].iMaxAnimFrames) + 1)
ENDIF
vScale = INIT_VECTOR_2D(cfSCGW_PICKUP_SPRITE_SCALE_X, cfSCGW_PICKUP_SPRITE_SCALE_Y)
IF NOT (SCGW_ServerBD.sPickups[i].iSpawnedPickupType = ciSCGW_PICKUPS_HEALTH
OR SCGW_ServerBD.sPickups[i].iSpawnedPickupType = ciSCGW_PICKUPS_GANG_CARS
OR SCGW_ServerBD.sPickups[i].iSpawnedPickupType = ciSCGW_PICKUPS_SPEED)
vScale.x -= ((vScale.x * cfSCGW_PICKUP_SCALE_MOD) * fSineNumber)
vScale.y -= ((vScale.y * cfSCGW_PICKUP_SCALE_MOD) * fSineNumber)
ENDIF
RGBA_COLOUR_STRUCT rgba = sSCGWData.sColours.rgbaSprite
IF NATIVE_TO_INT(GET_NETWORK_TIME()) - SCGW_ServerBD.sPickups[i].iSpawnedPickupSpawnTime < ciSCGW_PICKUP_COLLECTION_TIME
rgba.iA = ROUND(fSineNumber * 255)
ELIF NATIVE_TO_INT(GET_NETWORK_TIME()) - SCGW_ServerBD.sPickups[i].iSpawnedPickupSpawnTime > (ciSCGW_PICKUP_DURATION - 1000)
rgba.iA = ROUND(INTERP_FLOAT(1.0, 0.1, TO_FLOAT(NATIVE_TO_INT(GET_NETWORK_TIME()) - SCGW_ServerBD.sPickups[i].iSpawnedPickupSpawnTime - (ciSCGW_PICKUP_DURATION - 1000)) / 1000.0, INTERPTYPE_SMOOTHSTEP) * 255)
ENDIF
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGrid", tl63PickupTexture,
vPickupPosition.x, vPickupPosition.y,
vScale.x, vScale.y, 0.0, rgba)
ENDFOR
sSCGWData.iLastFramePickups = iDrawnPickups
ENDPROC
// ------------------------------ VEHICLES ------------------------------
/// PURPOSE:
/// Returns the X offset for the vehicle warnign to accomodate the curved screen edges
FUNC FLOAT SCGW_GET_VEHICLE_WARNING_X_OFFSET(INT iY, BOOL bLeft = TRUE)
SWITCH iY
CASE 0
IF bLeft
RETURN cfSCGW_VEHICLE_ALERT_LEFT_0_X_OFFSET
ENDIF
RETURN cfSCGW_VEHICLE_ALERT_RIGHT_0_X_OFFSET
CASE 2
IF bLeft
RETURN cfSCGW_VEHICLE_ALERT_LEFT_2_X_OFFSET
ENDIF
RETURN cfSCGW_VEHICLE_ALERT_RIGHT_2_X_OFFSET
CASE 4
IF bLeft
RETURN cfSCGW_VEHICLE_ALERT_LEFT_4_X_OFFSET
ENDIF
RETURN cfSCGW_VEHICLE_ALERT_RIGHT_4_X_OFFSET
CASE 6
IF bLeft
RETURN cfSCGW_VEHICLE_ALERT_LEFT_6_X_OFFSET
ENDIF
RETURN cfSCGW_VEHICLE_ALERT_RIGHT_6_X_OFFSET
CASE 8
IF bLeft
RETURN cfSCGW_VEHICLE_ALERT_LEFT_8_X_OFFSET
ENDIF
RETURN cfSCGW_VEHICLE_ALERT_RIGHT_8_X_OFFSET
ENDSWITCH
RETURN 0.0
ENDFUNC
/// PURPOSE:
/// Returns the colour and transparency for a vehicle warnign based on iVehicleType
FUNC RGBA_COLOUR_STRUCT SCGW_GET_VEHICLE_WARNING_COLOUR(INT iVehicleType)
FLOAT fSin = SIN(GET_GAME_TIMER() * 0.5)
RGBA_COLOUR_STRUCT rgba = sSCGWData.sColours.rgbaSprite
SWITCH iVehicleType
CASE ciSCGW_VEHICLE_TYPE_ICE_CREAM
CASE ciSCGW_VEHICLE_TYPE_TANK
//White
BREAK
CASE ciSCGW_VEHICLE_TYPE_AMBULANCE
CASE ciSCGW_VEHICLE_TYPE_POLICE
CASE ciSCGW_VEHICLE_TYPE_FIRE
//Flash between blue and red
IF fSin > 0.0
INIT_RGBA_STRUCT(rgba, 255, 0, 0)
ELSE
INIT_RGBA_STRUCT(rgba, 0, 0, 255)
ENDIF
BREAK
CASE ciSCGW_VEHICLE_TYPE_GANG_0
rgba = sSCGWData.sColours.rgbaGangColours[0]
BREAK
CASE ciSCGW_VEHICLE_TYPE_GANG_1
rgba = sSCGWData.sColours.rgbaGangColours[1]
BREAK
CASE ciSCGW_VEHICLE_TYPE_GANG_2
rgba = sSCGWData.sColours.rgbaGangColours[2]
BREAK
CASE ciSCGW_VEHICLE_TYPE_GANG_3
rgba = sSCGWData.sColours.rgbaGangColours[3]
BREAK
ENDSWITCH
rgba.iA = 55 + ROUND(ABSF(fSin) * 200)
RETURN rgba
ENDFUNC
/// PURPOSE:
/// Draws a flashing sprite at the location a vehicle is about to drive onto the screen
/// PARAMS:
/// iVehicle -
PROC SCGW_DRAW_VEHICLE_WARNING(INT iVehicle)
INT iX, iY
VECTOR_2D vPos
SCGW_GET_POSITION_COORDS(SCGW_ServerBD.sVehicles[iVehicle].iVehicleOrigin, iX, iY)
IF SCGW_ServerBD.sVehicles[iVehicle].iVehicleDirection = ciSCGW_GRID_DIRECTION_DOWN
vPos = SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_GET_POSITION_FROM_COORDS(iX, 0))
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "vehicle_alert",
vPos.x, vPos.y + cfSCGW_VEHICLE_ALERT_TOP_Y_OFFSET,
cfSCGW_VEHICLE_ALERT_SCALE_X, cfSCGW_VEHICLE_ALERT_SCALE_Y,
180.0, SCGW_GET_VEHICLE_WARNING_COLOUR(SCGW_ServerBD.sVehicles[iVehicle].iVehicleType))
ELIF SCGW_ServerBD.sVehicles[iVehicle].iVehicleDirection = ciSCGW_GRID_DIRECTION_UP
vPos = SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_GET_POSITION_FROM_COORDS(iX, ciSCGW_MAX_PLAYER_POSITIONS_Y - 1))
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "vehicle_alert",
vPos.x, vPos.y + cfSCGW_VEHICLE_ALERT_BOTTOM_Y_OFFSET,
cfSCGW_VEHICLE_ALERT_SCALE_X, cfSCGW_VEHICLE_ALERT_SCALE_Y,
0.0, SCGW_GET_VEHICLE_WARNING_COLOUR(SCGW_ServerBD.sVehicles[iVehicle].iVehicleType))
ELIF SCGW_ServerBD.sVehicles[iVehicle].iVehicleDirection = ciSCGW_GRID_DIRECTION_RIGHT
vPos = SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_GET_POSITION_FROM_COORDS(0, iY))
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "vehicle_alert",
vPos.x + SCGW_GET_VEHICLE_WARNING_X_OFFSET(iY, TRUE), vPos.y,
cfSCGW_VEHICLE_ALERT_SCALE_X, cfSCGW_VEHICLE_ALERT_SCALE_Y,
90.0, SCGW_GET_VEHICLE_WARNING_COLOUR(SCGW_ServerBD.sVehicles[iVehicle].iVehicleType))
ELIF SCGW_ServerBD.sVehicles[iVehicle].iVehicleDirection = ciSCGW_GRID_DIRECTION_LEFT
vPos = SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_GET_POSITION_FROM_COORDS(ciSCGW_MAX_PLAYER_POSITIONS_X - 1, iY))
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGridHUD", "vehicle_alert",
vPos.x + SCGW_GET_VEHICLE_WARNING_X_OFFSET(iY, FALSE), vPos.y,
cfSCGW_VEHICLE_ALERT_SCALE_X, cfSCGW_VEHICLE_ALERT_SCALE_Y,
-90.0, SCGW_GET_VEHICLE_WARNING_COLOUR(SCGW_ServerBD.sVehicles[iVehicle].iVehicleType))
ENDIF
ENDPROC
/// PURPOSE:
/// Returns the vehicle rotation based on the direction is is travelling
FUNC FLOAT SCGW_GET_VEHICLE_ROTATION_FROM_GRID_DIRECTION(INT iGridDirection)
SWITCH iGridDirection
CASE ciSCGW_GRID_DIRECTION_UP
RETURN 90.0
CASE ciSCGW_GRID_DIRECTION_DOWN
RETURN 270.0
CASE ciSCGW_GRID_DIRECTION_LEFT
RETURN 0.0
CASE ciSCGW_GRID_DIRECTION_RIGHT
RETURN 180.0
ENDSWITCH
RETURN 0.0
ENDFUNC
/// PURPOSE:
/// Returns the time the vehicle will take to move across the screen based on the direction is is travelling
FUNC INT SCGW_GET_VEHICLE_MOVE_TIME_FROM_GRID_DIRECTION(INT iGridDirection)
INT iGridSpacesToMove
SWITCH iGridDirection
CASE ciSCGW_GRID_DIRECTION_UP
CASE ciSCGW_GRID_DIRECTION_DOWN
iGridSpacesToMove = ciSCGW_MAX_PLAYER_POSITIONS_Y + 2
BREAK
CASE ciSCGW_GRID_DIRECTION_LEFT
CASE ciSCGW_GRID_DIRECTION_RIGHT
iGridSpacesToMove = ciSCGW_MAX_PLAYER_POSITIONS_X + 2
BREAK
ENDSWITCH
RETURN iGridSpacesToMove * ciSCGW_VEHICLE_GRID_SPEED
ENDFUNC
/// PURPOSE:
/// Draws spawned vehicles moving across the map
PROC SCGW_DRAW_VEHICLES()
INT i
FOR i = 0 TO ciSCGW_MAX_ACTIVE_VEHICLES - 1
IF SCGW_ServerBD.sVehicles[i].iVehicleType = -1
RELOOP
ENDIF
IF NATIVE_TO_INT(GET_NETWORK_TIME()) < SCGW_ServerBD.sVehicles[i].iVehicleTime
SCGW_DRAW_VEHICLE_WARNING(i)
RELOOP
ENDIF
INT iVehicleMoveTime = SCGW_GET_VEHICLE_MOVE_TIME_FROM_GRID_DIRECTION(SCGW_ServerBD.sVehicles[i].iVehicleDirection)
IF NATIVE_TO_INT(GET_NETWORK_TIME()) > SCGW_ServerBD.sVehicles[i].iVehicleTime + iVehicleMoveTime
RELOOP
ENDIF
IF NATIVE_TO_INT(GET_NETWORK_TIME()) < SCGW_ServerBD.sVehicles[i].iVehicleTime + (iVehicleMoveTime/2)
AND SCGW_IS_RECT_COMPLETELY_OUTSIDE_OF_GAME_AREA(INIT_VECTOR_2D(sSCGWData.sVehicles[i].vActualVehiclePosition.x, sSCGWData.sVehicles[i].vActualVehiclePosition.y), INIT_VECTOR_2D(sSCGWData.sVehicleData[SCGW_ServerBD.sVehicles[i].iVehicleType].vSpriteScale.x, sSCGWData.sVehicleData[SCGW_ServerBD.sVehicles[i].iVehicleType].vSpriteScale.y))
SCGW_DRAW_VEHICLE_WARNING(i)
ENDIF
FLOAT fRotation = SCGW_GET_VEHICLE_ROTATION_FROM_GRID_DIRECTION(SCGW_ServerBD.sVehicles[i].iVehicleDirection)
sSCGWData.sVehicles[i].iVehicleAnimationFrame += sSCGWData.iUpdateFramesHalf
IF sSCGWData.sVehicles[i].iVehicleAnimationFrame >= sSCGWData.sVehicleData[SCGW_ServerBD.sVehicles[i].iVehicleType].iMaxAnimFrames
sSCGWData.sVehicles[i].iVehicleAnimationFrame = 0
ENDIF
TEXT_LABEL_63 tl63VehSprite = ""
tl63VehSprite += sSCGWData.sVehicleData[SCGW_ServerBD.sVehicles[i].iVehicleType].stSpriteName
IF SCGW_ServerBD.sVehicles[i].iVehicleType < ciSCGW_AMBIENT_VEHICLE_TYPES
tl63VehSprite += (sSCGWData.sVehicles[i].iVehicleAnimationFrame + 1)
ENDIF
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGrid", tl63VehSprite,
sSCGWData.sVehicles[i].vActualVehiclePosition.x, sSCGWData.sVehicles[i].vActualVehiclePosition.y,
sSCGWData.sVehicleData[SCGW_ServerBD.sVehicles[i].iVehicleType].vSpriteScale.x, sSCGWData.sVehicleData[SCGW_ServerBD.sVehicles[i].iVehicleType].vSpriteScale.y,
fRotation, sSCGWData.sColours.rgbaSprite)
ENDFOR
ENDPROC
// ------------------------------ PLAYERS ------------------------------
/// PURPOSE:
/// Returns the player sprite rotation based on the direction they are facing
FUNC FLOAT SCGW_GET_PLAYER_ROTATION_FROM_GRID_DIRECTION(INT iGridDirection)
SWITCH iGridDirection
CASE ciSCGW_GRID_DIRECTION_UP
RETURN 0.0
CASE ciSCGW_GRID_DIRECTION_DOWN
RETURN 180.0
CASE ciSCGW_GRID_DIRECTION_LEFT
RETURN 270.0
CASE ciSCGW_GRID_DIRECTION_RIGHT
RETURN 90.0
ENDSWITCH
RETURN 0.0
ENDFUNC
/// PURPOSE:
/// Draws all trails left behind players
PROC SCGW_DRAW_PLAYER_TRAILS()
//Claimed Trails
INT i, j, iGang
FOR i = 0 TO ciSCGW_MAX_PLAYER_POSITIONS_X - 1
FOR j = 0 TO ciSCGW_MAX_PLAYER_POSITIONS_Y - 1
INT iPos = SCGW_GET_POSITION_FROM_COORDS(i, j)
IF i + 1 < ciSCGW_MAX_PLAYER_POSITIONS_X
INT iDestinationPos = SCGW_GET_POSITION_FROM_COORDS(i + 1, j)
FOR iGang = 0 TO ciSCGW_GANG_MAX - 1
IF IS_LONG_BIT_SET(SCGW_ServerBD.iPositionOwnershipBS[iGang][ciSCGW_OWNERSHIP_LINK_RIGHT], iPos)
VECTOR_2D vMidpoint = DIVIDE_VECTOR_2D(ADD_VECTOR_2D(SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(iPos), SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(iDestinationPos)), 2.0)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGrid", "player_trail",
vMidpoint.x, vMidpoint.y,
cfSCGW_TRAIL_SPRITE_SCALE_X, cfSCGW_TRAIL_SPRITE_SCALE_Y,
0.0, sSCGWData.sColours.rgbaGangColours[iGang])
BREAKLOOP
ENDIF
ENDFOR
ENDIF
IF j + 1 < ciSCGW_MAX_PLAYER_POSITIONS_Y
INT iDestinationPos = SCGW_GET_POSITION_FROM_COORDS(i, j + 1)
FOR iGang = 0 TO ciSCGW_GANG_MAX - 1
IF IS_LONG_BIT_SET(SCGW_ServerBD.iPositionOwnershipBS[iGang][ciSCGW_OWNERSHIP_LINK_DOWN], iPos)
VECTOR_2D vMidpoint = DIVIDE_VECTOR_2D(ADD_VECTOR_2D(SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(iPos), SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(iDestinationPos)), 2.0)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGrid", "player_trail",
vMidpoint.x, vMidpoint.y,
cfSCGW_TRAIL_SPRITE_SCALE_X, cfSCGW_TRAIL_SPRITE_SCALE_Y,
90.0, sSCGWData.sColours.rgbaGangColours[iGang])
BREAKLOOP
ENDIF
ENDFOR
ENDIF
ENDFOR
ENDFOR
INT iCurrentPlayerX, iCurrentPlayerY, iPreviousPlayerX, iPreviousPlayerY
RGBA_COLOUR_STRUCT rgba
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_UF_PlayerBD[iPlayerLoop].iPlayerPosition = SCGW_UF_PlayerBD[iPlayerLoop].iPreviousPlayerPosition
RELOOP
ENDIF
SCGW_GET_POSITION_COORDS(SCGW_UF_PlayerBD[iPlayerLoop].iPlayerPosition, iCurrentPlayerX, iCurrentPlayerY)
SCGW_GET_POSITION_COORDS(SCGW_UF_PlayerBD[iPlayerLoop].iPreviousPlayerPosition, iPreviousPlayerX, iPreviousPlayerY)
INT iBit = -1
rgba = sSCGWData.sColours.rgbaGangColours[SCGW_PlayerBD[iPlayerLoop].iGang]
FLOAT fAlpha = TO_FLOAT(NATIVE_TO_INT(GET_NETWORK_TIME()) - SCGW_UF_PlayerBD[iPlayerLoop].iLastMovementTime) / (TO_FLOAT(SCGW_GET_PLAYER_MOVEMENT_TIME(iPlayerLoop)))
IF fAlpha > 1.2
RELOOP
ENDIF
rgba.iA = ROUND(255 * INTERP_FLOAT(0.0, 1.0, fAlpha, INTERPTYPE_SPHERICAL_ACCEL))
IF iPreviousPlayerX != iCurrentPlayerX
IF iPreviousPlayerX > iCurrentPlayerX
//Moving Left
iBit = SCGW_UF_PlayerBD[iPlayerLoop].iPlayerPosition
ELSE
//Moving Right
iBit = SCGW_GET_POSITION_FROM_COORDS(iCurrentPlayerX - 1, iCurrentPlayerY)
ENDIF
IF IS_LONG_BIT_SET(SCGW_ServerBD.iPositionOwnershipBS[SCGW_PlayerBD[iPlayerLoop].iGang][ciSCGW_OWNERSHIP_LINK_RIGHT], iBit)
//Already claimed
RELOOP
ENDIF
VECTOR_2D vMidpoint = DIVIDE_VECTOR_2D(ADD_VECTOR_2D(SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_UF_PlayerBD[iPlayerLoop].iPreviousPlayerPosition), SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_UF_PlayerBD[iPlayerLoop].iPlayerPosition)), 2.0)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGrid", "player_trail",
vMidpoint.x, vMidpoint.y,
cfSCGW_TRAIL_SPRITE_SCALE_X, cfSCGW_TRAIL_SPRITE_SCALE_Y,
0.0, rgba)
ELIF iPreviousPlayerY != iCurrentPlayerY
IF iPreviousPlayerY > iCurrentPlayerY
//Moving Up
iBit = SCGW_UF_PlayerBD[iPlayerLoop].iPlayerPosition
ELSE
//Moving Down
iBit = SCGW_GET_POSITION_FROM_COORDS(iCurrentPlayerX, iCurrentPlayerY - 1)
ENDIF
IF IS_LONG_BIT_SET(SCGW_ServerBD.iPositionOwnershipBS[SCGW_PlayerBD[iPlayerLoop].iGang][ciSCGW_OWNERSHIP_LINK_DOWN], iBit)
//Already claimed
RELOOP
ENDIF
VECTOR_2D vMidpoint = DIVIDE_VECTOR_2D(ADD_VECTOR_2D(SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_UF_PlayerBD[iPlayerLoop].iPreviousPlayerPosition), SCGW_GET_SCREEN_COORDS_FROM_PLAYER_GRID_POSITION(SCGW_UF_PlayerBD[iPlayerLoop].iPlayerPosition)), 2.0)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGrid", "player_trail",
vMidpoint.x, vMidpoint.y,
cfSCGW_TRAIL_SPRITE_SCALE_X, cfSCGW_TRAIL_SPRITE_SCALE_Y,
90.0, rgba)
ENDIF
ENDFOR
ENDPROC
/// PURPOSE:
/// Draws all player projectiles
PROC SCGW_DRAW_PLAYER_BULLETS()
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
INT iShotLoop = 0
FOR iShotLoop = 0 TO ciSCGW_MAX_PLAYER_SHOTS - 1
IF SCGW_UF_PlayerBD[iPlayerLoop].sProjectiles[iShotLoop].iShotTime = -HIGHEST_INT
RELOOP
ENDIF
//Don't draw if we have processed the bullet's collision locally
IF IS_BIT_SET(sSCGWData.iFinalizedShotsBS, SCGW_GET_PARTICIPANT_SHOT_BIT(iPlayerLoop, iShotLoop))
RELOOP
ENDIF
FLOAT fRotation = SCGW_GET_PLAYER_ROTATION_FROM_GRID_DIRECTION(SCGW_UF_PlayerBD[iPlayerLoop].sProjectiles[iShotLoop].iShotDirection)
IF SCGW_UF_PlayerBD[iPlayerLoop].sProjectiles[iShotLoop].iShotWeaponType = ciSCGW_WEAPON_ROCKET
TEXT_LABEL_63 tl63RocketSprite = "rocket_trail_"
tl63RocketSprite += (sSCGWData.iRocketAnimFrame + 1)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGrid", tl63RocketSprite,
sSCGWData.sPlayers[iPlayerLoop].sProjectiles[iShotLoop].vActualBulletPosition.x, sSCGWData.sPlayers[iPlayerLoop].sProjectiles[iShotLoop].vActualBulletPosition.y,
cfSCGW_ROCKET_SPRITE_SCALE_X, cfSCGW_ROCKET_SPRITE_SCALE_Y,
fRotation, sSCGWData.sColours.rgbaSprite)
ELSE
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGrid", "bullet",
sSCGWData.sPlayers[iPlayerLoop].sProjectiles[iShotLoop].vActualBulletPosition.x, sSCGWData.sPlayers[iPlayerLoop].sProjectiles[iShotLoop].vActualBulletPosition.y,
cfSCGW_BULLET_SPRITE_SCALE_X, cfSCGW_BULLET_SPRITE_SCALE_Y,
fRotation, sSCGWData.sColours.rgbaSprite)
ENDIF
ENDFOR
ENDFOR
ENDPROC
/// PURPOSE:
/// Returns the position of the player's muzzle flare based on their rotation and weapon
FUNC VECTOR_2D SCGW_GET_MUZZLE_FLASH_OFFSET_FOR_PLAYER(INT iParticipant, FLOAT fRotation)
VECTOR_2D vMuzzlePos = ARCADE_CABINET_CONVERT_TO_VECTOR_2D_TO_PIXELSPACE(sSCGWData.sPlayers[iParticipant].vActualPlayerPosition)
SWITCH SCGW_PlayerBD[iParticipant].iEquippedWeaponType
CASE ciSCGW_WEAPON_PISTOL
CASE ciSCGW_WEAPON_UZI
vMuzzlePos = ADD_VECTOR_2D(vMuzzlePos, INIT_VECTOR_2D(cfSCGW_MUZZLE_FLARE_PIXEL_OFFSET_X_SMALL, cfSCGW_MUZZLE_FLARE_PIXEL_OFFSET_Y_SMALL))
BREAk
CASE ciSCGW_WEAPON_AK47
CASE ciSCGW_WEAPON_ROCKET
CASE ciSCGW_WEAPON_SHOTGUN
vMuzzlePos = ADD_VECTOR_2D(vMuzzlePos, INIT_VECTOR_2D(cfSCGW_MUZZLE_FLARE_PIXEL_OFFSET_X_LARGE, cfSCGW_MUZZLE_FLARE_PIXEL_OFFSET_Y_LARGE))
BREAK
ENDSWITCH
vMuzzlePos = ROTATE_VECTOR_2D_AROUND_VECTOR_2D(ARCADE_CABINET_CONVERT_TO_VECTOR_2D_TO_PIXELSPACE(sSCGWData.sPlayers[iParticipant].vActualPlayerPosition), vMuzzlePos, fRotation)
vMuzzlePos = ARCADE_CABINET_CONVERT_TO_VECTOR_2D_TO_SCREENSPACE(vMuzzlePos)
RETURN vMuzzlePos
ENDFUNC
/// PURPOSE:
/// Handles drawing player iParticipant
PROC SCGW_DRAW_PLAYER(INT iParticipant)
TEXT_LABEL_63 tl63Dict = "MPArcadeCabinetGridPlayer"
tl63Dict += sSCGWData.stGangSprites[SCGW_PlayerBD[iParticipant].iGang]
//Dead players
IF SCGW_IS_PLAYER_DEAD(iParticipant)
TEXT_LABEL_63 tl63DeadSprite = "dead_"
tl63DeadSprite += (sSCGWData.stGangSprites[SCGW_PlayerBD[iParticipant].iGang])
ARCADE_CABINET_DRAW_SPRITE(tl63Dict, tl63DeadSprite,
sSCGWData.sPlayers[iParticipant].vActualPlayerPosition.x, sSCGWData.sPlayers[iParticipant].vActualPlayerPosition.y,
cfSCGW_DEAD_PLAYER_SPRITE_SCALE_X, cfSCGW_DEAD_PLAYER_SPRITE_SCALE_Y,
0.0, sSCGWData.sColours.rgbaSprite)
EXIT
ENDIF
RGBA_COLOUR_STRUCT rgba = sSCGWData.sColours.rgbaSprite
//Walk anim
IF SCGW_UF_PlayerBD[iParticipant].iLastMovementTime + SCGW_GET_PLAYER_MOVEMENT_TIME(iParticipant) > NATIVE_TO_INT(GET_NETWORK_TIME())
IF sSCGWData.sPlayers[iParticipant].iPlayerAnimFrame = 0
SCGW_PLAY_GANG_SOUND_FROM_PLAYER("Footsteps", iParticipant, sSCGWData.sPlayers[iParticipant].iWalkingSoundId)
ENDIF
sSCGWData.sPlayers[iParticipant].iPlayerAnimFrame += sSCGWData.iUpdateFrames
IF sSCGWData.sPlayers[iParticipant].iPlayerAnimFrame >= ciSCGW_PLAYER_WALK_FRAMES
sSCGWData.sPlayers[iParticipant].iPlayerAnimFrame = 0
ENDIF
ENDIF
//Damage flashing
IF SCGW_PlayerBD[iParticipant].iLastDamagedTime + ciSCGW_DAMAGE_FLASH_TIME > NATIVE_TO_INT(GET_NETWORK_TIME())
FLOAT fSineNumber = ABSF(SIN(TO_FLOAT(SCGW_PlayerBD[iParticipant].iLastDamagedTime + ciSCGW_DAMAGE_FLASH_TIME - NATIVE_TO_INT(GET_NETWORK_TIME())) * cfSCGW_PLAYER_DAMAGE_FLASH_MOD))
rgba.iA = ciSCGW_PLAYER_DAMAGE_FLASH_MAX - (ROUND(fSineNumber) * ciSCGW_PLAYER_DAMAGE_FLASH_AMOUNT)
ENDIF
//Draw player sprite
FLOAT fRotation = SCGW_GET_PLAYER_ROTATION_FROM_GRID_DIRECTION(SCGW_UF_PlayerBD[iParticipant].iFacingDirection)
TEXT_LABEL_63 tl63PlayerSprite = "walk_"
tl63PlayerSprite += sSCGWData.stGangSprites[SCGW_PlayerBD[iParticipant].iGang]
tl63PlayerSprite += "_"
tl63PlayerSprite += (sSCGWData.sWeaponData[SCGW_PlayerBD[iParticipant].iEquippedWeaponType].stPlayerSpriteName)
tl63PlayerSprite += (sSCGWData.sPlayers[iParticipant].iPlayerAnimFrame + 1)
CDEBUG1LN(DEBUG_MINIGAME, "[SCGW] [JS] SCGW_DRAW_PLAYER - iParticipant ",iParticipant," tl63PlayerSprite ",tl63PlayerSprite)
//Speed effect
IF SCGW_PlayerBD[iParticipant].fMoveSpeed < cfSCGW_BASE_SPEED
AND sSCGWData.sPlayers[iParticipant].iPlayerAnimFrame > 0
INT iA = rgba.iA
rgba.iA = iA / 2
VECTOR_2D vPos = sSCGWData.sPlayers[iParticipant].vActualPlayerPosition
IF GET_RANDOM_BOOL()
vPos = ADD_VECTOR_2D(vPos, INIT_VECTOR_2D(cfSCGW_PLAYER_SPEED_OFFSET_X * SIN(TO_FLOAT(GET_GAME_TIMER())), cfSCGW_PLAYER_SPEED_OFFSET_Y * COS(TO_FLOAT(GET_GAME_TIMER()))))
ELSE
vPos = ADD_VECTOR_2D(vPos, INIT_VECTOR_2D(cfSCGW_PLAYER_SPEED_OFFSET_X * COS(TO_FLOAT(GET_GAME_TIMER())), cfSCGW_PLAYER_SPEED_OFFSET_Y * SIN(TO_FLOAT(GET_GAME_TIMER()))))
ENDIF
ARCADE_CABINET_DRAW_SPRITE(tl63Dict, tl63PlayerSprite,
vPos.x, vPos.y,
cfSCGW_PLAYER_SPRITE_SCALE_X, cfSCGW_PLAYER_SPRITE_SCALE_Y,
fRotation, rgba)
rgba.iA = iA
ENDIF
ARCADE_CABINET_DRAW_SPRITE(tl63Dict, tl63PlayerSprite,
sSCGWData.sPlayers[iParticipant].vActualPlayerPosition.x, sSCGWData.sPlayers[iParticipant].vActualPlayerPosition.y,
cfSCGW_PLAYER_SPRITE_SCALE_X, cfSCGW_PLAYER_SPRITE_SCALE_Y,
fRotation, rgba)
//Muzzle Flash
IF sSCGWData.sPlayers[iParticipant].iMuzzleFlashFrame > -1
TEXT_LABEL_63 tl63MuzzleFlare = "muzzle_flare_"
tl63MuzzleFlare += (sSCGWData.sPlayers[iParticipant].iMuzzleFlashFrame + 1)
VECTOR_2D vMuzzlePos = SCGW_GET_MUZZLE_FLASH_OFFSET_FOR_PLAYER(iParticipant, fRotation)
ARCADE_CABINET_DRAW_SPRITE("MPArcadeCabinetGrid", tl63MuzzleFlare,
vMuzzlePos.x, vMuzzlePos.y,
cfSCGW_MUZZLE_FLARE_SCALE_X, cfSCGW_MUZZLE_FLARE_SCALE_Y,
fRotation, rgba)
sSCGWData.sPlayers[iParticipant].iMuzzleFlashFrame += sSCGWData.iUpdateFrames
IF sSCGWData.sPlayers[iParticipant].iMuzzleFlashFrame >= ciSCGW_MUZZLE_FLARE_ANIM_FRAMES
sSCGWData.sPlayers[iParticipant].iMuzzleFlashFrame = -1
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Processes drawing all players
PROC SCGW_DRAW_PLAYERS()
INT iPlayerLoop = 0
FOR iPlayerLoop = 0 TO ciSCGW_MAX_PLAYERS - 1
IF iPlayerLoop = sSCGWData.sLocalPlayer.iLocalPart
//Drawn last so the local player is always on top
RELOOP
ENDIF
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
SCGW_DRAW_PLAYER(iPlayerLoop)
ENDFOR
SCGW_DRAW_PLAYER(sSCGWData.sLocalPlayer.iLocalPart)
ENDPROC
// ------------------------------ COUNTDOWN ------------------------------
/// PURPOSE:
/// Draws the game between states
PROC SCGW_DRAW_GAME_STATIC()
SCGW_DRAW_BACKGROUND()
SCGW_DRAW_MAP_TILES()
SCGW_DRAW_PLAY_AREA_FADE(sSCGWData.sColours.rgbaBlack, ciSCGW_COUNTDOWN_ALPHA)
SCGW_DRAW_TOP_HUD()
ARCADE_GAMES_POSTFX_DRAW()
SCGW_DRAW_FACADE()
ENDPROC
// ------------------------------ COUNTDOWN ------------------------------
/// PURPOSE:
/// Draws the game while the countdown is in progress
PROC SCGW_DRAW_COUNTDOWN_SCREEN()
SCGW_DRAW_BACKGROUND()
SCGW_DRAW_MAP_TILES()
SCGW_DRAW_PLAYER_TRAILS()
IF SCGW_ServerBD.iStartTime - NATIVE_TO_INT(GET_NETWORK_TIME()) <= ciSCGW_COUNTDOWN_ROUND_TIME
SCGW_DRAW_PLAYERS()
ENDIF
SCGW_DRAW_COUNTDOWN()
SCGW_DRAW_TOP_HUD()
ARCADE_GAMES_POSTFX_DRAW()
SCGW_DRAW_FACADE()
ENDPROC
// ------------------------------ RUNNING ------------------------------
/// PURPOSE:
/// Draws the game while in play
PROC SCGW_DRAW_GAME_RUNNING()
SCGW_DRAW_BACKGROUND()
SCGW_DRAW_MAP_TILES()
SCGW_DRAW_PLAYER_TRAILS()
SCGW_DRAW_PLAYER_BULLETS()
SCGW_DRAW_PICKUPS()
SCGW_DRAW_PLAYERS()
SCGW_DRAW_VEHICLES()
SCGW_DRAW_EXPLOSIONS()
SCGW_DRAW_FLYOVERS()
SCGW_DRAW_RESPAWN_TEXT()
SCGW_DRAW_DAMAGE_BORDER()
SCGW_DRAW_COUNTDOWN()
SCGW_DRAW_SUDDEN_DEATH()
SCGW_DRAW_TOP_HUD()
ARCADE_GAMES_POSTFX_DRAW()
SCGW_DRAW_FACADE()
ENDPROC
// ------------------------------ ROUND/GAME END SCREEN ------------------------------
/// PURPOSE:
/// Draws the round result screen
PROC SCGW_DRAW_ROUND_END_SCREEN()
SCGW_DRAW_BACKGROUND()
SCGW_DRAW_MAP_TILES()
SCGW_DRAW_PLAYER_TRAILS()
SCGW_DRAW_ROUND_WINNER()
SCGW_DRAW_TOP_HUD()
ARCADE_GAMES_POSTFX_DRAW()
SCGW_DRAW_FACADE()
ENDPROC
/// PURPOSE:
/// Draws the final game result screen
PROC SCGW_DRAW_GAME_END_SCREEN()
SCGW_DRAW_BACKGROUND()
SCGW_DRAW_MAP_TILES()
SCGW_DRAW_PLAYER_TRAILS()
SCGW_DRAW_GAME_WINNER()
SCGW_DRAW_TOP_HUD()
ARCADE_GAMES_POSTFX_DRAW()
SCGW_DRAW_FACADE()
ENDPROC