2012 lines
80 KiB
XML
Executable File
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
|