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