USING "invade_persuade_using.sch" USING "arcade_games_postfx.sch" // ------------------------------ HELPERS ------------------------------ /// PURPOSE: /// Draws a black rectangle over the entire screen PROC IAP_DRAW_FULL_SCREEN_RECT(RGBA_COLOUR_STRUCT &rgba) #IF IS_DEBUG_BUILD IF g_bMinimizeArcadeCabinetDrawing DRAW_RECT(g_fMinimizeArcadeCabinetCentreX, g_fMinimizeArcadeCabinetCentreY, g_fMinimizeArcadeCabinetCentreScale, g_fMinimizeArcadeCabinetCentreScale, 0, 0, 0, 255) ELIF !g_bBlockArcadeCabinetDrawing #ENDIF DRAW_RECT(cfSCREEN_CENTER, cfSCREEN_CENTER, 1, 1, rgba.iR, rgba.iG, rgba.iB, rgba.iA) #IF IS_DEBUG_BUILD ENDIF #ENDIF ENDPROC /// PURPOSE: /// Draws stTextLabel in the center of the screen PROC IAP_DRAW_CENTER_TEXT(STRING stTextLabel) //Title Text SET_TEXT_SCALE(cfIAP_CENTER_TEXT_SCALE, cfIAP_CENTER_TEXT_SCALE) SET_TEXT_COLOUR(255, 255, 255, 255) SET_TEXT_CENTRE(TRUE) SET_TEXT_FONT(FONT_STANDARD) BEGIN_TEXT_COMMAND_DISPLAY_TEXT(stTextLabel) END_TEXT_COMMAND_DISPLAY_TEXT(cfSCREEN_CENTER, cfSCREEN_CENTER) ENDPROC /// PURPOSE: /// Returns the alpha for flashing damage effects and text this frame /// RETURNS: /// FUNC INT IAP_GET_FLASHING_ALPHA() RETURN ROUND(ABSF(TAN(TO_FLOAT(GET_GAME_TIMER()))) * 255) ENDFUNC /// PURPOSE: /// Draws the facade at the edges of the screen PROC IAP_DRAW_FACADE() ARCADE_CABINET_DRAW_SPRITE("MPInvPersMessages", "facade", cfSCREEN_CENTER, cfSCREEN_CENTER, 1.0, 1.0, 0.0, sIAPData.sColours.rgbaSprite) ENDPROC /// PURPOSE: /// Draws a coloured border around the play area PROC IAP_DRAW_SCREEN_BORDER(RGBA_COLOUR_STRUCT rgba) rgba.iA = ROUND(ABSF(TAN(TO_FLOAT(GET_GAME_TIMER()))) * 50) + 150 ARCADE_CABINET_DRAW_SPRITE("MpInvPersHud", "border", cfSCREEN_CENTER + 0.002604167, cfSCREEN_CENTER, 1.0, 1.0, 0.0, rgba) ENDPROC // ------------------------------ TEXT ------------------------------ /// PURPOSE: /// Draws a number using the pixel font sprites /// PARAMS: /// vPos - Position the number string starts or ends at /// bRightAlign - If the number end at the the vPos or start there /// bDollarSign - If true a $ will go before the number /// bSmall - Text drawn at half size /// iMaxDigits - Number of digits drawn, max = ciIAP_FONT_MAX_DIGITS, 0s will be added to pad number up to this value /// IF iMaxDigits is set to ciIAP_FONT_DIGIT_COUNT it will show the number exactly PROC IAP_DRAW_NUMBER_FROM_POS(INT iNumber, VECTOR_2D vPos, RGBA_COLOUR_STRUCT rgba, BOOL bRightAlign = FALSE, BOOL bDollarSign = FALSE, BOOL bSmall = FALSE, INT iMaxDigits = ciIAP_FONT_MAX_DIGITS) TEXT_LABEL_15 tl15Digits[ciIAP_FONT_MAX_DIGITS] INT i INT iCurrentValue = iNumber INT iCommaBS VECTOR_2D vScale = INIT_VECTOR_2D(PICK_FLOAT(bSmall, cfIAP_FONT_SCALE_SMALL_X, cfIAP_FONT_SCALE_LARGE_X), PICK_FLOAT(bSmall, cfIAP_FONT_SCALE_SMALL_Y, cfIAP_FONT_SCALE_LARGE_Y)) VECTOR_2D vCommaScale = INIT_VECTOR_2D(PICK_FLOAT(bSmall, cfIAP_FONT_COMMA_SCALE_SMALL_X, cfIAP_FONT_COMMA_SCALE_LARGE_X), PICK_FLOAT(bSmall, cfIAP_FONT_COMMA_SCALE_SMALL_Y, cfIAP_FONT_COMMA_SCALE_LARGE_Y)) BOOL bBailWhenAllDrawn = (iMaxDigits = ciIAP_FONT_DIGIT_COUNT) IF bBailWhenAllDrawn iMaxDigits = ciIAP_FONT_MAX_DIGITS ENDIF FOR i = 0 TO ciIAP_FONT_MAX_DIGITS - 1 tl15Digits[i] = "number_" tl15Digits[i] += (iCurrentValue % 10) iCurrentValue /=10 IF iCurrentValue > 0 AND (i + 1) % 3 = 0 SET_BIT(iCommaBS, i) ENDIF IF bBailWhenAllDrawn AND iCurrentValue = 0 iMaxDigits = i + 1 BREAKLOOP ENDIF ENDFOR FLOAT fCurrentX = vPos.x IF bRightAlign fCurrentX -= (vScale.x/2) FOR i = 0 TO iMaxDigits - 1 ARCADE_CABINET_DRAW_SPRITE("MPInvPersHud", tl15Digits[i], fCurrentX, vPos.y, vScale.x, vScale.y, 0.0, rgba) IF IS_BIT_SET(iCommaBS, i) fCurrentX -= (vCommaScale.x) ARCADE_CABINET_DRAW_SPRITE("MPInvPersHud", "comma", fCurrentX, vPos.y, vCommaScale.x, vCommaScale.y, 0.0, rgba) ENDIF fCurrentX -= (vScale.x) ENDFOR IF bDollarSign ARCADE_CABINET_DRAW_SPRITE("MPInvPersHud", "dollar", fCurrentX, vPos.y, vScale.x, vScale.y, 0.0, rgba) ENDIF ELSE fCurrentX += (vScale.x/2) IF bDollarSign ARCADE_CABINET_DRAW_SPRITE("MPInvPersHud", "dollar", fCurrentX, vPos.y, vScale.x, vScale.y, 0.0, rgba) fCurrentX += (vScale.x) ENDIF FOR i = iMaxDigits - 1 TO 0 STEP -1 IF IS_BIT_SET(iCommaBS, i) ARCADE_CABINET_DRAW_SPRITE("MPInvPersHud", "comma", fCurrentX, vPos.y, vCommaScale.x, vCommaScale.y, 0.0, rgba) fCurrentX += (vCommaScale.x) ENDIF ARCADE_CABINET_DRAW_SPRITE("MPInvPersHud", tl15Digits[i], fCurrentX, vPos.y, vScale.x, vScale.y, 0.0, rgba) fCurrentX += (vScale.x) ENDFOR ENDIF ENDPROC // ------------------------------ HUD ------------------------------ /// PURPOSE: /// Draws the lives display on the top HUD PROC IAP_DRAW_LIVES_HUD() VECTOR_2D vScale = INIT_VECTOR_2D(cfIAP_LIVES_HUD_SCALE_X, cfIAP_LIVES_HUD_SCALE_Y) VECTOR_2D vPos = INIT_VECTOR_2D(cfIAP_LIVES_HUD_POS_X, cfIAP_HUD_Y) ARCADE_CABINET_DRAW_SPRITE("MPInvPersHud", "lives", vPos.x, vPos.y, vScale.x, vScale.y, 0.0, sIAPData.sColours.rgbaSprite) INT iLives = sIAPData.sPlayerTank.iLives IF sIAPData.sPlayerTank.iLives < 0 iLives = 0 ENDIF IAP_DRAW_NUMBER_FROM_POS(iLives, INIT_VECTOR_2D(vPos.x + cfIAP_LIVES_TEXT_OFFSET_X, vPos.y + cfIAP_LIVES_TEXT_OFFSET_Y), sIAPData.sColours.rgbaHudText, FALSE, FALSE, FALSE, 2) ENDPROC /// PURPOSE: /// Draws the health display on the top HUD PROC IAP_DRAW_HEALTH_HUD() VECTOR_2D vScale = INIT_VECTOR_2D(cfIAP_HEALTH_HUD_SCALE_X, cfIAP_HEALTH_HUD_SCALE_Y) VECTOR_2D vPos = INIT_VECTOR_2D(cfIAP_HEALTH_HUD_POS_X, cfIAP_HUD_Y) ARCADE_CABINET_DRAW_SPRITE("MPInvPersHud", "health", vPos.x, vPos.y, vScale.x, vScale.y, 0.0, sIAPData.sColours.rgbaSprite) IF sIAPData.sPlayerTank.iDisplayHealth < sIAPData.sPlayerTank.iHealth sIAPData.sPlayerTank.iDisplayHealth = CLAMP_INT(sIAPData.sPlayerTank.iDisplayHealth + sIAPData.iUpdateFrames30FPS, 0, sIAPData.sPlayerTank.iHealth) ELIF sIAPData.sPlayerTank.iDisplayHealth > sIAPData.sPlayerTank.iHealth sIAPData.sPlayerTank.iDisplayHealth = CLAMP_INT(sIAPData.sPlayerTank.iDisplayHealth - sIAPData.iUpdateFrames30FPS, sIAPData.sPlayerTank.iHealth, ciIAP_MAX_HEALTH) ENDIF INT i IF NOT IS_BIT_SET(sIAPData.sPlayerTank.iPlayerTankBitset, ciIAP_PLAYER_TANK_BS_SHIELD_ACTIVE) RGBA_COLOUR_STRUCT healthRgba IF sIAPData.sPlayerTank.iDisplayHealth > 1 INIT_RGBA_STRUCT(healthRgba, 154, 255, 0, 255) ELSE INIT_RGBA_STRUCT(healthRgba, 246, 8, 21, 255) ENDIF vPos.x = cfIAP_HEALTH_SEGMENT_START_POS_X vScale = INIT_VECTOR_2D(cfIAP_HEALTH_SEGMENT_HUD_SCALE_X, cfIAP_HEALTH_SEGMENT_HUD_SCALE_Y) FOR i = 0 TO sIAPData.sPlayerTank.iDisplayHealth - 1 FLOAT fPosX = vPos.x + (i * cfIAP_HEALTH_SEGMENT_OFFSET_X) + (vScale.x / 2) ARCADE_CABINET_DRAW_SPRITE("MPInvPersHud", "healthsegment", fPosX, vPos.y, vScale.x, vScale.y, 0.0, healthRgba) ENDFOR ELSE ARCADE_CABINET_DRAW_SPRITE("MPInvPersHud", "shield_ui", cfIAP_HEALTH_SHIELD_HUD_POS_X, vPos.y, cfIAP_HEALTH_SHIELD_HUD_SCALE_X, cfIAP_HEALTH_SHIELD_HUD_SCALE_Y, 0.0, sIAPData.sColours.rgbaSprite) ENDIF ENDPROC /// PURPOSE: /// Draws the score display on the top HUD PROC IAP_DRAW_SCORE_HUD() VECTOR_2D vScale = INIT_VECTOR_2D(cfIAP_SCORE_HUD_SCALE_X, cfIAP_SCORE_HUD_SCALE_Y) VECTOR_2D vPos = INIT_VECTOR_2D(cfIAP_SCORE_HUD_POS_X, cfIAP_HUD_Y) ARCADE_CABINET_DRAW_SPRITE("MPInvPersHud", "score", vPos.x, vPos.y, vScale.x, vScale.y, 0.0, sIAPData.sColours.rgbaSprite) IAP_DRAW_NUMBER_FROM_POS(sIAPData.iScoreToShow, INIT_VECTOR_2D(cfIAP_LIVES_TEXT_WRAP_MAX, vPos.y + cfIAP_SCORE_TEXT_OFFSET_Y), sIAPData.sColours.rgbaHudText, TRUE, FALSE, FALSE, ciIAP_FONT_DIGIT_COUNT) ENDPROC /// PURPOSE: /// Draws the distance display on the top HUD PROC IAP_DRAW_DISTANCE_HUD() VECTOR_2D vScale = INIT_VECTOR_2D(cfIAP_DISTANCE_HUD_SCALE_X, cfIAP_DISTANCE_HUD_SCALE_Y) VECTOR_2D vPos = INIT_VECTOR_2D(cfIAP_DISTANCE_HUD_POS_X, cfIAP_HUD_Y) TEXT_LABEL_63 tl63Sprite = "distance" IF sIAPData.sCurrentStageData.fStageDistance = ciIAP_STAGE_INFINITE_LENGTH tl63Sprite += "_inf" ENDIF ARCADE_CABINET_DRAW_SPRITE("MPInvPersHud", tl63Sprite, vPos.x, vPos.y, vScale.x, vScale.y, 0.0, sIAPData.sColours.rgbaSprite) INT iDistanceTravelled = FLOOR(sIAPData.fDistanceTravelled / cfIAP_DISTANCE_CONVERSION) IF sIAPData.eCurrentStage = IAP_STAGE_MOON IAP_DRAW_NUMBER_FROM_POS(iDistanceTravelled * 1000, INIT_VECTOR_2D(vPos.x + cfIAP_DISTANCE_TEXT_BEST_OFFSET_X, vPos.y + cfIAP_DISTANCE_TEXT_OFFSET_Y), sIAPData.sColours.rgbaHudText, TRUE, FALSE, TRUE, ciIAP_FONT_DIGIT_COUNT) IAP_DRAW_NUMBER_FROM_POS(sIAPData.iCachedMaxMoonDistance * 1000, INIT_VECTOR_2D(vPos.x + cfIAP_DISTANCE_TEXT_OFFSET_X, vPos.y + cfIAP_DISTANCE_TEXT_OFFSET_Y), sIAPData.sColours.rgbaHudText, TRUE, FALSE, TRUE, ciIAP_FONT_DIGIT_COUNT) ELSE IAP_DRAW_NUMBER_FROM_POS(iDistanceTravelled * 1000, INIT_VECTOR_2D(vPos.x + cfIAP_DISTANCE_TEXT_OFFSET_X, vPos.y + cfIAP_DISTANCE_TEXT_OFFSET_Y), sIAPData.sColours.rgbaHudText, TRUE, FALSE, TRUE, ciIAP_FONT_DIGIT_COUNT) ENDIF IF sIAPData.sCurrentStageData.fStageDistance != ciIAP_STAGE_INFINITE_LENGTH FLOAT fAlpha = (sIAPData.fDistanceTravelled / cfIAP_DISTANCE_CONVERSION) / sIAPData.sCurrentStageData.fStageDistance IF fAlpha > 1.0 fAlpha = 1.0 ENDIF FLOAT fRectX = LERP_FLOAT(vPos.x + cfIAP_DISTANCE_RECT_POS_X - (cfIAP_DISTANCE_BAR_HUD_SCALE_X/ 2), vPos.x + cfIAP_DISTANCE_RECT_POS_X, fAlpha) FLOAT fRectScaleX = LERP_FLOAT(0, cfIAP_DISTANCE_BAR_HUD_SCALE_X, fAlpha) ARCADE_CABINET_DRAW_SPRITE("MPInvPersHud", "distancearrow", fRectX + (fRectScaleX/2), vPos.y, cfIAP_DISTANCE_ARROW_HUD_SCALE_X, cfIAP_DISTANCE_ARROW_HUD_SCALE_Y, 0.0, sIAPData.sColours.rgbaSprite) RGBA_COLOUR_STRUCT rgba INIT_RGBA_STRUCT(rgba, 154, 255, 0, 125) DRAW_RECT_FROM_VECTOR_2D(INIT_VECTOR_2D(fRectX, vPos.y + cfIAP_DISTANCE_RECT_POS_Y), INIT_VECTOR_2D(fRectScaleX, cfIAP_DISTANCE_BAR_HUD_SCALE_Y), rgba) ENDIF ENDPROC /// PURPOSE: /// Draws the top HUD bar PROC IAP_DRAW_HUD() IAP_DRAW_LIVES_HUD() IAP_DRAW_HEALTH_HUD() IAP_DRAW_SCORE_HUD() IAP_DRAW_DISTANCE_HUD() ENDPROC // ------------------------------ FLOATING TEXT ------------------------------ PROC IAP_DRAW_FLOATING_TEXT_AT_POSITION(STRING stLabel, FLOAT fX, FLOAT fY, INT iIntToDisplay = HIGHEST_INT) INT fTextAlpha = IAP_GET_FLASHING_ALPHA() SET_TEXT_SCALE(0.5, 0.5) SET_TEXT_COLOUR(255, 255, 255, fTextAlpha) SET_TEXT_CENTRE(TRUE) SET_TEXT_FONT(FONT_STYLE_PRICEDOWN) IF fTextAlpha > 200 SET_TEXT_DROP_SHADOW() ENDIF BEGIN_TEXT_COMMAND_DISPLAY_TEXT(stLabel) IF iIntToDisplay != HIGHEST_INT ADD_TEXT_COMPONENT_INTEGER(iIntToDisplay) ENDIF END_TEXT_COMMAND_DISPLAY_TEXT(fX, fY) ENDPROC /// PURPOSE: /// Draws flashign floating text above the player's tank PROC IAP_DRAW_ABOVE_PLAYER_TEXT() IF NATIVE_TO_INT(GET_NETWORK_TIME()) > sIAPData.sPlayerTank.sAbovePlayerText.iStartTime + ciIAP_ABOVE_PLAYER_TEXT_DURATION EXIT ENDIF FLOAT fAlpha = TO_FLOAT(NATIVE_TO_INT(GET_NETWORK_TIME()) - sIAPData.sPlayerTank.sAbovePlayerText.iStartTime) / ciIAP_ABOVE_PLAYER_TEXT_DURATION IAP_DRAW_FLOATING_TEXT_AT_POSITION(sIAPData.sPlayerTank.sAbovePlayerText.tl63Text, sIAPData.sPlayerTank.vPosition.x + cfIAP_TURRET_OFFSET_X, INTERP_FLOAT(sIAPData.sPlayerTank.vPosition.y + cfIAP_ABOVE_PLAYER_TEXT_START_OFFSET, sIAPData.sPlayerTank.vPosition.y + cfIAP_ABOVE_PLAYER_TEXT_END_OFFSET, fAlpha, INTERPTYPE_SMOOTHSTEP)) ENDPROC /// PURPOSE: /// Draws all score text at their onscreen positions PROC IAP_DRAW_SCORE_TEXT() INT i FOR i = 0 TO ciIAP_MAX_SCORE_TEXT - 1 IF NATIVE_TO_INT(GET_NETWORK_TIME()) > sIAPData.sScoreText[i].iStartTime + ciIAP_SCORE_TEXT_DURATION RELOOP ENDIF FLOAT fAlpha = TO_FLOAT(NATIVE_TO_INT(GET_NETWORK_TIME()) - sIAPData.sScoreText[i].iStartTime) / ciIAP_SCORE_TEXT_DURATION FLOAT fX = sIAPData.sScoreText[i].vPos.x IF fX < (cfIAP_FACADE_WIDTH * 1.1) RELOOP ENDIF IAP_DRAW_FLOATING_TEXT_AT_POSITION("IAP_SCORE", fX, INTERP_FLOAT(sIAPData.sScoreText[i].vPos.y + cfIAP_SCORE_TEXT_START_OFFSET, sIAPData.sScoreText[i].vPos.y + cfIAP_SCORE_TEXT_END_OFFSET, fAlpha, INTERPTYPE_SMOOTHSTEP), sIAPData.sScoreText[i].iScore) ENDFOR ENDPROC // ------------------------------ STAGE ------------------------------ /// PURPOSE: /// Draws the current stage PROC IAP_DRAW_STAGE() INT i FLOAT fXOffset //Background Colour IAP_DRAW_FULL_SCREEN_RECT(sIAPData.sCurrentStageData.rgbaStageBackground) FOR i = 0 TO sIAPData.sCurrentStageData.iMaxActiveBackgroundSprites - 1 fXOffset = sIAPData.sCurrentStageData.vBackgroundSpriteScale.x * i ARCADE_CABINET_DRAW_SPRITE(sIAPData.stLoadedStageTextureDictionary, sIAPData.sCurrentStageData.stBackgroundSprite, sIAPData.sParallax.fBackgroundPosX + fXOffset, sIAPData.sCurrentStageData.fBackgroundYPos + cfIAP_BACKGROUND_Y_OFFSET, sIAPData.sCurrentStageData.vBackgroundSpriteScale.x, sIAPData.sCurrentStageData.vBackgroundSpriteScale.y, 0.0, sIAPData.sColours.rgbaSprite) ENDFOR FOR i = 0 TO sIAPData.sCurrentStageData.iMaxActiveMidground1Sprites - 1 fXOffset = sIAPData.sCurrentStageData.vMidground1SpriteScale.x * i ARCADE_CABINET_DRAW_SPRITE(sIAPData.stLoadedStageTextureDictionary, sIAPData.sCurrentStageData.stMidground1Sprite, sIAPData.sParallax.fMidground1PosX + fXOffset, sIAPData.sCurrentStageData.fMidground1YPos + cfIAP_MIDGROUND1_Y_OFFSET, sIAPData.sCurrentStageData.vMidground1SpriteScale.x, sIAPData.sCurrentStageData.vMidground1SpriteScale.y, 0.0, sIAPData.sColours.rgbaSprite) ENDFOR FOR i = 0 TO sIAPData.sCurrentStageData.iMaxActiveMidground2Sprites - 1 fXOffset = sIAPData.sCurrentStageData.vMidground2SpriteScale.x * i ARCADE_CABINET_DRAW_SPRITE(sIAPData.stLoadedStageTextureDictionary, sIAPData.sCurrentStageData.stMidground2Sprite, sIAPData.sParallax.fMidground2PosX + fXOffset, sIAPData.sCurrentStageData.fMidground2YPos + cfIAP_MIDGROUND2_Y_OFFSET, sIAPData.sCurrentStageData.vMidground2SpriteScale.x, sIAPData.sCurrentStageData.vMidground2SpriteScale.y, 0.0, sIAPData.sColours.rgbaSprite) ENDFOR FOR i = 0 TO sIAPData.sCurrentStageData.iMaxActiveMidground3Sprites - 1 fXOffset = sIAPData.sCurrentStageData.vMidground3SpriteScale.x * i ARCADE_CABINET_DRAW_SPRITE(sIAPData.stLoadedStageTextureDictionary, sIAPData.sCurrentStageData.stMidground3Sprite, sIAPData.sParallax.fMidground3PosX + fXOffset, sIAPData.sCurrentStageData.fMidground3YPos + cfIAP_MIDGROUND3_Y_OFFSET, sIAPData.sCurrentStageData.vMidground3SpriteScale.x, sIAPData.sCurrentStageData.vMidground3SpriteScale.y, 0.0, sIAPData.sColours.rgbaSprite) ENDFOR FOR i = 0 TO sIAPData.sCurrentStageData.iMaxActiveForegroundSprites - 1 IF sIAPData.sParallax.iActiveForegroundSpriteIndexes[i] = ciIAP_PARALLAX_PITFALL VECTOR_2D vScale = sIAPData.sObjectData[ENUM_TO_INT(IAP_GET_CURRENT_STAGE_PITFALL_INDEX())].vSpriteScale IF IAP_IS_RECT_COMPLETELY_OUTSIDE_OF_GAME_AREA(INIT_VECTOR_2D(sIAPData.sParallax.fForegroundPosX[i], sIAPData.sCurrentStageData.fForegroundYPos), vScale) RELOOP ENDIF #IF IS_DEBUG_BUILD IF sIAPData.sDebugStruct.bDrawCollisionDebug FLOAT fX = (sIAPData.sParallax.fForegroundPosX[i] - (vScale.x/2)) + IAP_GET_CURRENT_STAGE_PITFALL_GROUND_WIDTH_LEFT() DRAW_DEBUG_LINE_2D_FROM_VECTOR_2D(INIT_VECTOR_2D(fX, sIAPData.sCurrentStageData.fBaseY), INIT_VECTOR_2D(fX, 1.0), sIAPData.sColours.rgbaDamage) fX = (sIAPData.sParallax.fForegroundPosX[i] + (vScale.x / 2)) - IAP_GET_CURRENT_STAGE_PITFALL_GROUND_WIDTH_RIGHT() DRAW_DEBUG_LINE_2D_FROM_VECTOR_2D(INIT_VECTOR_2D(fX, sIAPData.sCurrentStageData.fBaseY), INIT_VECTOR_2D(fX, 1.0), sIAPData.sColours.rgbaDamage) ENDIF #ENDIF ARCADE_CABINET_DRAW_SPRITE(sIAPData.stLoadedStageTextureDictionary, sIAPData.sObjectData[ENUM_TO_INT(IAP_GET_CURRENT_STAGE_PITFALL_INDEX())].stSpritePrefix, sIAPData.sParallax.fForegroundPosX[i], sIAPData.sObjectData[ENUM_TO_INT(IAP_GET_CURRENT_STAGE_PITFALL_INDEX())].fBaseYOffset, vScale.x, vScale.y, 0.0, sIAPData.sColours.rgbaSprite) RELOOP ENDIF IF sIAPData.sParallax.iActiveForegroundSpriteIndexes[i] = ciIAP_PARALLAX_RAISED_LEDGE VECTOR_2D vScale = sIAPData.sObjectData[ENUM_TO_INT(IAP_GET_CURRENT_STAGE_LEDGE_INDEX())].vSpriteScale IF IAP_IS_RECT_COMPLETELY_OUTSIDE_OF_GAME_AREA(INIT_VECTOR_2D(sIAPData.sParallax.fForegroundPosX[i], sIAPData.sCurrentStageData.fForegroundYPos), vScale) RELOOP ENDIF ARCADE_CABINET_DRAW_SPRITE(sIAPData.stLoadedStageTextureDictionary, sIAPData.sObjectData[ENUM_TO_INT(IAP_GET_CURRENT_STAGE_LEDGE_INDEX())].stSpritePrefix, sIAPData.sParallax.fForegroundPosX[i], sIAPData.sObjectData[ENUM_TO_INT(IAP_GET_CURRENT_STAGE_LEDGE_INDEX())].fBaseYOffset, vScale.x, vScale.y, 0.0, sIAPData.sColours.rgbaSprite) RELOOP ENDIF IF IAP_IS_RECT_COMPLETELY_OUTSIDE_OF_GAME_AREA(INIT_VECTOR_2D(sIAPData.sParallax.fForegroundPosX[i], sIAPData.sCurrentStageData.fForegroundYPos), sIAPData.sCurrentStageData.vForegroundSpriteScale) RELOOP ENDIF ARCADE_CABINET_DRAW_SPRITE(sIAPData.stLoadedStageTextureDictionary, sIAPData.sCurrentStageData.stForegroundSprite, sIAPData.sParallax.fForegroundPosX[i], sIAPData.sCurrentStageData.fForegroundYPos, sIAPData.sCurrentStageData.vForegroundSpriteScale.x, sIAPData.sCurrentStageData.vForegroundSpriteScale.y, 0.0, sIAPData.sColours.rgbaSprite) ENDFOR ENDPROC /// PURPOSE: /// Draws the weather effects over the stage if the current stage supports them PROC IAP_DRAW_WEATHER() IF NOT IAP_DOES_CURRENT_STAGE_HAVE_WEATHER_EFFECTS() EXIT ENDIF INT i, j FOR i = 0 TO ciIAP_MAX_BLIZZARD_SPRITES_X - 1 FOR j = 0 TO ciIAP_MAX_BLIZZARD_SPRITES_Y - 1 ARCADE_CABINET_DRAW_SPRITE(sIAPData.stLoadedStageTextureDictionary, "blizzard", sIAPData.vBaseWeatherPos.x + (i * cfIAP_WEATHER_SPRITE_SCALE_X) + (cfIAP_WEATHER_SPRITE_SCALE_X / 2), sIAPData.vBaseWeatherPos.y - (j * cfIAP_WEATHER_SPRITE_SCALE_Y) - (cfIAP_WEATHER_SPRITE_SCALE_Y / 2), cfIAP_WEATHER_SPRITE_SCALE_X, cfIAP_WEATHER_SPRITE_SCALE_Y, 0.0, sIAPData.sColours.rgbaSprite) ENDFOR ENDFOR ENDPROC /// PURPOSE: /// Interps between rgba0 and rgba1 by fAlpha FUNC RGBA_COLOUR_STRUCT IAP_INTERP_COLOUR(RGBA_COLOUR_STRUCT rgba0, RGBA_COLOUR_STRUCT rgba1, FLOAT fAlpha) rgba0.iR = ROUND(TO_FLOAT(rgba1.iR - rgba0.iR) * fAlpha + rgba0.iR) rgba0.iG = ROUND(TO_FLOAT(rgba1.iG - rgba0.iG) * fAlpha + rgba0.iG) rgba0.iB = ROUND(TO_FLOAT(rgba1.iB - rgba0.iB) * fAlpha + rgba0.iB) rgba0.iA = ROUND(TO_FLOAT(rgba1.iA - rgba0.iA) * fAlpha + rgba0.iA) RETURN rgba0 ENDFUNC // ------------------------------ EXPLOSIONS ------------------------------ /// PURPOSE: /// Returns the sprite prefix for the explosion type FUNC STRING IAP_GET_EXPLOSION_SPRITE(IAP_EXPLOSION eExplosionType) SWITCH eExplosionType CASE IAP_EXPLOSION_MEDIUM RETURN "explosion_med" CASE IAP_EXPLOSION_SMOKE RETURN "tank_smoke" ENDSWITCH RETURN "INVALID EXPLOSION" ENDFUNC /// PURPOSE: /// Returns the max anim frame for the explosion type FUNC INT IAP_GET_EXPLOSION_MAX_ANIM_FRAME(IAP_EXPLOSION eExplosionType) SWITCH eExplosionType CASE IAP_EXPLOSION_MEDIUM RETURN ciIAP_EXPLOSION_FRAMES CASE IAP_EXPLOSION_SMOKE RETURN ciIAP_SMOKE_FRAMES ENDSWITCH RETURN 0 ENDFUNC /// PURPOSE: /// Returns the sprite scale for the explosion type FUNC VECTOR_2D IAP_GET_EXPLOSION_SCALE(IAP_EXPLOSION eExplosionType) SWITCH eExplosionType CASE IAP_EXPLOSION_MEDIUM RETURN INIT_VECTOR_2D(cfIAP_EXPLOSION_SPRITE_SCALE_X / 2, cfIAP_EXPLOSION_SPRITE_SCALE_Y / 2) CASE IAP_EXPLOSION_SMOKE RETURN INIT_VECTOR_2D(0.020833, 0.037037) ENDSWITCH RETURN INIT_VECTOR_2D(-1, -1) ENDFUNC /// PURPOSE: /// Draws all the explosions on screen PROC IAP_DRAW_EXPLOSIONS() INT i FOR i = 0 TO ciIAP_MAX_EXPLOSIONS - 1 IF sIAPData.sExplosions[i].iAnimFrame <= -1 RELOOP ENDIF TEXT_LABEL_63 tl63Sprite = IAP_GET_EXPLOSION_SPRITE(sIAPData.sExplosions[i].eExplosionType) VECTOR_2D vScale = IAP_GET_EXPLOSION_SCALE(sIAPData.sExplosions[i].eExplosionType) INT iMaxFrames = IAP_GET_EXPLOSION_MAX_ANIM_FRAME(sIAPData.sExplosions[i].eExplosionType) tl63Sprite += (sIAPData.sExplosions[i].iAnimFrame + 1) ARCADE_CABINET_DRAW_SPRITE("MPInvPersCommon", tl63Sprite, sIAPData.sExplosions[i].vPosition.x, sIAPData.sExplosions[i].vPosition.y, vScale.x, vScale.y, 0.0, sIAPData.sColours.rgbaSprite) sIAPData.sExplosions[i].iAnimFrame += sIAPData.iUpdateFrames15FPS IF sIAPData.sExplosions[i].iAnimFrame >= iMaxFrames sIAPData.sExplosions[i].iAnimFrame = -1 ENDIF ENDFOR ENDPROC /// PURPOSE: /// Draws a pattern on the screen with explosions PROC IAP_DRAW_NUKE_EXPLOSIONS(FLOAT fAlpha) IF fAlpha < 0.8 sIAPData.iNukeAnimFrame = 0 ELIF sIAPData.iNukeAnimFrame >= IAP_GET_EXPLOSION_MAX_ANIM_FRAME(IAP_EXPLOSION_MEDIUM) EXIT ENDIF //Star VECTOR_2D vScale = MULTIPLY_VECTOR_2D(IAP_GET_EXPLOSION_SCALE(IAP_EXPLOSION_MEDIUM), 2.0) vScale.x = INTERP_FLOAT(0, vScale.x, fAlpha, INTERPTYPE_ACCEL) vScale.y = INTERP_FLOAT(0, vScale.y, fAlpha, INTERPTYPE_ACCEL) TEXT_LABEL_63 tl63Sprite = IAP_GET_EXPLOSION_SPRITE(IAP_EXPLOSION_MEDIUM) tl63Sprite += (sIAPData.iNukeAnimFrame + 1) VECTOR_2D vStarPoints[10] //Top vStarPoints[0] = INIT_VECTOR_2D(cfSCREEN_CENTER +(( 0) * (1/cfBASE_SCREEN_WIDTH)), cfSCREEN_CENTER +(( -460) * (1/cfBASE_SCREEN_HEIGHT))) //Top Right vStarPoints[1] = INIT_VECTOR_2D(cfSCREEN_CENTER +(( 120) * (1/cfBASE_SCREEN_WIDTH)), cfSCREEN_CENTER +(( -120) * (1/cfBASE_SCREEN_HEIGHT))) //Right Point vStarPoints[2] = INIT_VECTOR_2D(cfSCREEN_CENTER +(( 480) * (1/cfBASE_SCREEN_WIDTH)), cfSCREEN_CENTER +(( -110) * (1/cfBASE_SCREEN_HEIGHT))) //Mid Right vStarPoints[3] = INIT_VECTOR_2D(cfSCREEN_CENTER +(( 195) * (1/cfBASE_SCREEN_WIDTH)), cfSCREEN_CENTER +(( 90) * (1/cfBASE_SCREEN_HEIGHT))) //Bottom Right Point vStarPoints[4] = INIT_VECTOR_2D(cfSCREEN_CENTER +(( 300) * (1/cfBASE_SCREEN_WIDTH)), cfSCREEN_CENTER +(( 460) * (1/cfBASE_SCREEN_HEIGHT))) //Bottom vStarPoints[5] = INIT_VECTOR_2D(cfSCREEN_CENTER +(( 0) * (1/cfBASE_SCREEN_WIDTH)), cfSCREEN_CENTER +((255) * (1/cfBASE_SCREEN_HEIGHT))) //Bottom Left Point vStarPoints[6] = INIT_VECTOR_2D(cfSCREEN_CENTER +(( -300) * (1/cfBASE_SCREEN_WIDTH)), cfSCREEN_CENTER +(( 460) * (1/cfBASE_SCREEN_HEIGHT))) //Mid Left vStarPoints[7] = INIT_VECTOR_2D(cfSCREEN_CENTER +(( -195) * (1/cfBASE_SCREEN_WIDTH)), cfSCREEN_CENTER +(( 90) * (1/cfBASE_SCREEN_HEIGHT))) //Left Point vStarPoints[8] = INIT_VECTOR_2D(cfSCREEN_CENTER +(( -480) * (1/cfBASE_SCREEN_WIDTH)), cfSCREEN_CENTER +(( -110) * (1/cfBASE_SCREEN_HEIGHT))) //Top Left vStarPoints[9] = INIT_VECTOR_2D(cfSCREEN_CENTER +(( -120) * (1/cfBASE_SCREEN_WIDTH)), cfSCREEN_CENTER +(( -120) * (1/cfBASE_SCREEN_HEIGHT))) VECTOR_2D vScreenCenter = INIT_VECTOR_2D(cfSCREEN_CENTER, cfSCREEN_CENTER) INT i FOR i = 0 TO COUNT_OF(vStarPoints) - 1 VECTOR_2D vPos = LERP_VECTOR_2D(vScreenCenter, vStarPoints[i], fAlpha) vPos.x = INTERP_FLOAT(vScreenCenter.x, vStarPoints[i].x, CLAMP(fAlpha, 0.0, 0.75), INTERPTYPE_DECEL) vPos.y = INTERP_FLOAT(vScreenCenter.y, vStarPoints[i].y, CLAMP(fAlpha, 0.0, 0.75), INTERPTYPE_DECEL) ARCADE_CABINET_DRAW_SPRITE("MPInvPersCommon", tl63Sprite, vPos.x, vPos.y, vScale.x, vScale.y, 0.0, sIAPData.sColours.rgbaSprite) ENDFOR IF fAlpha >= 0.8 sIAPData.iNukeAnimFrame += sIAPData.iUpdateFrames15FPS ENDIF ENDPROC /// PURPOSE: /// Draws the nuke effect over the stage if active PROC IAP_DRAW_NUKE() IF NOT IAP_IS_NUKE_ACTIVE() EXIT ENDIF FLOAT fAlpha RGBA_COLOUR_STRUCT rgba IF NOT HAS_NET_TIMER_EXPIRED(sIAPData.tdNukeTimer, ciIAP_PICKUP_NUKE_START_DURATION) fAlpha = TO_FLOAT(GET_NET_TIMER_DIFFERENCE_WITH_CURRENT_TIME(sIAPData.tdNukeTimer)) / ciIAP_PICKUP_NUKE_START_DURATION rgba = IAP_INTERP_COLOUR(sIAPData.sColours.rgbaDamage, sIAPData.sColours.rgbaSprite, fAlpha) rgba.iA = ROUND(INTERP_FLOAT(0, 255, fAlpha, INTERPTYPE_ACCEL)) IAP_DRAW_FULL_SCREEN_RECT(rgba) IAP_DRAW_NUKE_EXPLOSIONS(fAlpha) ELSE fAlpha = TO_FLOAT(GET_NET_TIMER_DIFFERENCE_WITH_CURRENT_TIME(sIAPData.tdNukeTimer) - ciIAP_PICKUP_NUKE_START_DURATION) / ciIAP_PICKUP_NUKE_DURATION rgba = IAP_INTERP_COLOUR(sIAPData.sColours.rgbaSprite, sIAPData.sColours.rgbaDamage, fAlpha) rgba.iA = ROUND(INTERP_FLOAT(255, 0, fAlpha, INTERPTYPE_DECEL)) IAP_DRAW_FULL_SCREEN_RECT(rgba) IAP_DRAW_NUKE_EXPLOSIONS(1.0) ENDIF ENDPROC // ------------------------------ PLAYER TANK ------------------------------ /// PURPOSE: /// Draws the player's tank exploding PROC IAP_DRAW_PLAYER_TANK_EXPLOSION() IF sIAPData.sPlayerTank.iTankBaseAnimFrame >= ciIAP_TANK_EXPLOSION_ANIM_FRAMES EXIT ENDIF IAP_DRAW_SCREEN_BORDER(sIAPData.sColours.rgbaDamage) TEXT_LABEL_63 tl63Sprite = "tank_death" tl63Sprite += (sIAPData.sPlayerTank.iTankBaseAnimFrame + 1) ARCADE_CABINET_DRAW_SPRITE(IAP_GET_PLAYER_TEXTURE_DICT(), tl63Sprite, sIAPData.sPlayerTank.vPosition.x, sIAPData.sPlayerTank.vPosition.y + cfIAP_PLAYER_TANK_EXPLOSION_OFFSET_Y, cfIAP_PLAYER_TANK_EXPLOSION_SCALE_X, cfIAP_PLAYER_TANK_EXPLOSION_SCALE_Y, 0.0, sIAPData.sColours.rgbaSprite) ENDPROC /// PURPOSE: /// Returns true if the player is flashing due to respawning, damage or healing FUNC BOOL IAP_SHOULD_PLAYER_TANK_FLASH() RETURN sIAPData.sPlayerTank.iLastDamagedTime + ciIAP_PLAYER_DAMAGE_RED_TIME > NATIVE_TO_INT(GET_NETWORK_TIME()) OR sIAPData.sPlayerTank.iLastHealedTime + ciIAP_PLAYER_HEAL_GREEN_TIME > NATIVE_TO_INT(GET_NETWORK_TIME()) OR sIAPData.sPlayerTank.iRespawnTime + ciIAP_PLAYER_RESPAWN_INVULN_TIME > NATIVE_TO_INT(GET_NETWORK_TIME()) ENDFUNC /// PURPOSE: /// Returns the scale of the current player tank body sprite FUNC VECTOR_2D IAP_GET_PLAYER_TANK_SPRITE_SCALE() IF IAP_IS_PLAYER_TANK_IN_AIR() RETURN INIT_VECTOR_2D(cfIAP_PLAYER_TANK_JUMP_SCALE_X, cfIAP_PLAYER_TANK_JUMP_SCALE_Y) ELSE RETURN INIT_VECTOR_2D(cfIAP_PLAYER_TANK_SCALE_X, cfIAP_PLAYER_TANK_SCALE_Y) ENDIF ENDFUNC /// PURPOSE: /// Draws the shield sprite behind the player tank PROC IAP_DRAW_PLAYER_TANK_SHIELD(RGBA_COLOUR_STRUCT rgba) TEXT_LABEL_63 tl63ShieldSprite = "tank_shield" tl63ShieldSprite += (sIAPData.sPlayerTank.iTankBaseAnimFrame + 1) FLOAT fShieldYOffset = PICK_FLOAT(IAP_IS_PLAYER_TANK_IN_AIR(), cfIAP_SHIELD_OFFSET_JUMPING_Y, cfIAP_SHIELD_OFFSET_DEFAULT_Y) ARCADE_CABINET_DRAW_SPRITE("MPInvPersCommon", tl63ShieldSprite, sIAPData.sPlayerTank.vPosition.x + cfIAP_SHIELD_OFFSET_X, sIAPData.sPlayerTank.vPosition.y + fShieldYOffset, cfIAP_SHIELD_SCALE_X, cfIAP_SHIELD_SCALE_Y, 0.0, rgba) ENDPROC /// PURPOSE: /// Returns the current sprite including anim frame for the player tank's turret FUNC TEXT_LABEL_63 IAP_GET_PLAYER_TANK_TURRET_SPRITE() TEXT_LABEL_63 tl63Turret SWITCH sIAPData.sPlayerTank.eWeaponType CASE IAP_PLAYER_WEAPON_DEFAULT tl63Turret = "turret_fire" tl63Turret += (sIAPData.sPlayerTank.iTankShootAnimFrame + 1) BREAK CASE IAP_PLAYER_WEAPON_FLAMETHROWER tl63Turret = "turret_flame" IF sIAPData.sPlayerTank.eTurretState = IAP_PLAYER_TURRET_STATE_SHOOTING tl63Turret += "2" ELSE tl63Turret += "1" ENDIF BREAK CASE IAP_PLAYER_WEAPON_ROCKET_LAUNCHER tl63Turret = "turret_rocket" tl63Turret += (sIAPData.sPlayerTank.iTankShootAnimFrame + 1) BREAK CASE IAP_PLAYER_WEAPON_PLASMA tl63Turret += "turret_beam" IF sIAPData.sPlayerTank.eTurretState = IAP_PLAYER_TURRET_STATE_SHOOTING tl63Turret += "_fire" tl63Turret += (sIAPData.sPlayerTank.iTankShootAnimFrame + 1) ENDIF BREAK ENDSWITCH RETURN tl63Turret ENDFUNC /// PURPOSE: /// Draws the player tank's turret PROC IAP_DRAW_PLAYER_TANK_TURRET(RGBA_COLOUR_STRUCT rgba) FLOAT fJumpOffset = PICK_FLOAT(IAP_IS_PLAYER_TANK_IN_AIR(), cfIAP_PLAYER_TANK_JUMP_SPRITE_OFFSET_Y, 0.0) VECTOR_2D vTurretCenter = INIT_VECTOR_2D(sIAPData.sPlayerTank.vPosition.x + cfIAP_TURRET_OFFSET_X, sIAPData.sPlayerTank.vPosition.y + cfIAP_TURRET_SPRITE_OFFSET_Y + fJumpOffset) vTurretCenter.x = ((vTurretCenter.x * cfBASE_SCREEN_WIDTH) - ((cfBASE_SCREEN_WIDTH - cfBASE_SCREEN_HEIGHT) / 2)) / cfBASE_SCREEN_HEIGHT VECTOR_2D vTurretSpriteCenter = ROTATE_VECTOR_2D_AROUND_VECTOR_2D(vTurretCenter, ADD_VECTOR_2D(vTurretCenter, INIT_VECTOR_2D(cfIAP_TURRET_SPRITE_OFFSET_X, 0)), sIAPData.sPlayerTank.iTurretDirection * cfIAP_TURRET_DIRECTION_INCREMENT) TEXT_LABEL_63 tl63Sprite = IAP_GET_PLAYER_TANK_TURRET_SPRITE() ARCADE_CABINET_DRAW_SPRITE_ROTATED(IAP_GET_PLAYER_TEXTURE_DICT(), tl63Sprite, vTurretSpriteCenter.x, vTurretSpriteCenter.y, cfIAP_TURRET_SCALE_X, cfIAP_TURRET_SCALE_Y, sIAPData.sPlayerTank.iTurretDirection * cfIAP_TURRET_DIRECTION_INCREMENT, rgba) ENDPROC //// PURPOSE: /// Draws the player tank and turret PROC IAP_DRAW_PLAYER_TANK() IF sIAPData.sPlayerTank.eTankState = IAP_PLAYER_TANK_STATE_EXPLODING IAP_DRAW_PLAYER_TANK_EXPLOSION() EXIT ENDIF RGBA_COLOUR_STRUCT rgba = sIAPData.sColours.rgbaSprite IF sIAPData.sPlayerTank.iLastDamagedTime + ciIAP_PLAYER_DAMAGE_RED_TIME > NATIVE_TO_INT(GET_NETWORK_TIME()) IAP_DRAW_SCREEN_BORDER(sIAPData.sColours.rgbaDamage) rgba = sIAPData.sColours.rgbaDamage ELIF sIAPData.sPlayerTank.iLastHealedTime + ciIAP_PLAYER_HEAL_GREEN_TIME > NATIVE_TO_INT(GET_NETWORK_TIME()) IAP_DRAW_SCREEN_BORDER(sIAPData.sColours.rgbaHeal) rgba = sIAPData.sColours.rgbaHeal ENDIF IF IAP_SHOULD_PLAYER_TANK_FLASH() rgba.iA = IAP_GET_FLASHING_ALPHA() ENDIF IF IS_BIT_SET(sIAPData.sPlayerTank.iPlayerTankBitset, ciIAP_PLAYER_TANK_BS_SHIELD_ACTIVE) IAP_DRAW_PLAYER_TANK_SHIELD(rgba) ENDIF IAP_DRAW_PLAYER_TANK_TURRET(rgba) VECTOR_2D vScale = IAP_GET_PLAYER_TANK_SPRITE_SCALE() TEXT_LABEL_63 stTankSprite = sIAPData.sPlayerTank.stTankSprite stTankSprite += (sIAPData.sPlayerTank.iTankBaseAnimFrame + 1) ARCADE_CABINET_DRAW_SPRITE(IAP_GET_PLAYER_TEXTURE_DICT(), stTankSprite, sIAPData.sPlayerTank.vPosition.x, sIAPData.sPlayerTank.vPosition.y, vScale.x, vScale.y, 0.0, rgba) ENDPROC // ------------------------------ PROJECTILES ------------------------------ /// PURPOSE: /// Draws a segment of the player's plasma beam /// PARAMS: /// iProjectileIndex - PROC IAP_DRAW_PLASMA_BEAM_SEGMENT(INT iProjectileIndex) VECTOR_2D vScale = sIAPData.sProjectileData[sIAPData.sPlayerTank.sProjectileInstances[iProjectileIndex].eProjectileType].vSpriteScale VECTOR_2D vPixelOrigin = ARCADE_CABINET_CONVERT_TO_VECTOR_2D_TO_PIXELSPACE(sIAPData.sPlayerTank.sProjectileInstances[iProjectileIndex].vOrigin) VECTOR_2D vPixelEnd = ARCADE_CABINET_CONVERT_TO_VECTOR_2D_TO_PIXELSPACE(sIAPData.sPlayerTank.sProjectileInstances[iProjectileIndex].vDirection) VECTOR_2D vMidPoint = ARCADE_CABINET_CONVERT_TO_VECTOR_2D_TO_SCREENSPACE(DIVIDE_VECTOR_2D(ADD_VECTOR_2D(vPixelOrigin,vPixelEnd), 2)) FLOAT fSin, fCos VECTOR_2D vFlatEnd IF NOT IS_FLOAT_IN_RANGE(sIAPData.sPlayerTank.sProjectileInstances[iProjectileIndex].fRotation, -cfARCADE_MINIGAME_FLOAT_TOLERANCE, cfARCADE_MINIGAME_FLOAT_TOLERANCE) fSin = SIN(sIAPData.sPlayerTank.sProjectileInstances[iProjectileIndex].fRotation) fCos = COS(sIAPData.sPlayerTank.sProjectileInstances[iProjectileIndex].fRotation) vFlatEnd = ROTATE_VECTOR_2D_AROUND_VECTOR_2D_PRECOMPUTE(vPixelOrigin, vPixelEnd, -fSin, fCos) ELSE vFlatEnd = vPixelEnd ENDIF vFlatEnd = ARCADE_CABINET_CONVERT_TO_VECTOR_2D_TO_SCREENSPACE(vFlatEnd) vMidPoint.x = ((vMidPoint.x * cfBASE_SCREEN_WIDTH) - ((cfBASE_SCREEN_WIDTH - cfBASE_SCREEN_HEIGHT) / 2)) / cfBASE_SCREEN_HEIGHT vFlatEnd.x = ((vFlatEnd.x * cfBASE_SCREEN_WIDTH) - ((cfBASE_SCREEN_WIDTH - cfBASE_SCREEN_HEIGHT) / 2)) / cfBASE_SCREEN_HEIGHT FLOAT vOriginX = ((sIAPData.sPlayerTank.sProjectileInstances[iProjectileIndex].vOrigin.x * cfBASE_SCREEN_WIDTH) - ((cfBASE_SCREEN_WIDTH - cfBASE_SCREEN_HEIGHT) / 2)) / cfBASE_SCREEN_HEIGHT FLOAT fScaleX = ABSF(vFlatEnd.x - vOriginX) //Background glow RGBA_COLOUR_STRUCT rgba = sIAPData.sColours.rgbaPlasma rgba.iA = ROUND(ABSF((TO_FLOAT(GET_GAME_TIMER()) * 0.1) % 1) * 100) + 155 ARCADE_CABINET_DRAW_SPRITE_ROTATED("MPInvPersCommon", "Beam_Glow_Tapered", vMidPoint.x, vMidPoint.y, vScale.y / 2, fScaleX, sIAPData.sPlayerTank.sProjectileInstances[iProjectileIndex].fRotation + 90, rgba) //Blue middle rgba.iA = ROUND(ABSF(TAN((TO_FLOAT(NATIVE_TO_INT(GET_NETWORK_TIME()) + sIAPData.sPlayerTank.sProjectileInstances[iProjectileIndex].iShotTime)) * 0.5)) * 180) + 75 ARCADE_CABINET_DRAW_SPRITE_ROTATED("MPInvPersCommon", "beam_middle", vMidPoint.x, vMidPoint.y, vScale.y, fScaleX, sIAPData.sPlayerTank.sProjectileInstances[iProjectileIndex].fRotation + 90, rgba) //White top rgba = sIAPData.sColours.rgbaSprite INIT_RGBA_STRUCT(rgba, 255, 255, 255, 255) rgba.iA = ROUND(ABSF(SIN(TO_FLOAT(NATIVE_TO_INT(GET_NETWORK_TIME()) + sIAPData.sPlayerTank.sProjectileInstances[iProjectileIndex].iShotTime))) * 155) + 100 ARCADE_CABINET_DRAW_SPRITE_ROTATED("MPInvPersCommon", "beam_top", vMidPoint.x, vMidPoint.y, vScale.y, fScaleX, sIAPData.sPlayerTank.sProjectileInstances[iProjectileIndex].fRotation + 90, rgba) //Contact point rgba = sIAPData.sColours.rgbaSprite IF sIAPData.sPlayerTank.sProjectileInstances[iProjectileIndex].vDirection.x > cfIAP_FACADE_WIDTH AND sIAPData.sPlayerTank.sProjectileInstances[iProjectileIndex].vDirection.x < 1 - cfIAP_FACADE_WIDTH AND sIAPData.sPlayerTank.sProjectileInstances[iProjectileIndex].vDirection.y > 0 TEXT_LABEL_63 tl63Sprite = sIAPData.sProjectileData[sIAPData.sPlayerTank.sProjectileInstances[iProjectileIndex].eProjectileType].stSprite IF sIAPData.sProjectileData[sIAPData.sPlayerTank.sProjectileInstances[iProjectileIndex].eProjectileType].iMaxAnimFrames > 0 tl63Sprite += (sIAPData.sPlayerTank.sProjectileInstances[iProjectileIndex].iAnimFrame + 1) ENDIF ARCADE_CABINET_DRAW_SPRITE("MPInvPersCommon", tl63Sprite, sIAPData.sPlayerTank.sProjectileInstances[iProjectileIndex].vDirection.x, sIAPData.sPlayerTank.sProjectileInstances[iProjectileIndex].vDirection.y, vScale.x, vScale.y, 0.0, rgba) ENDIF ENDPROC /// PURPOSE: /// Draws all of the player's projectiles PROC IAP_DRAW_PLAYER_PROJECTILES() INT i FOR i = 0 TO ciIAP_MAX_PLAYER_PROJECTILES - 1 IF sIAPData.sPlayerTank.sProjectileInstances[i].iShotTime = -HIGHEST_INT RELOOP ENDIF IF NATIVE_TO_INT(GET_NETWORK_TIME()) > sIAPData.sPlayerTank.sProjectileInstances[i].iShotTime + sIAPData.sProjectileData[sIAPData.sPlayerTank.sProjectileInstances[i].eProjectileType].iSpeed RELOOP ENDIF IF sIAPData.sPlayerTank.sProjectileInstances[i].eProjectileType = IAP_PROJECTILE_TYPE_PLASMA IAP_DRAW_PLASMA_BEAM_SEGMENT(i) RELOOP ENDIF TEXT_LABEL_63 tl63Sprite = sIAPData.sProjectileData[sIAPData.sPlayerTank.sProjectileInstances[i].eProjectileType].stSprite IF sIAPData.sProjectileData[sIAPData.sPlayerTank.sProjectileInstances[i].eProjectileType].iMaxAnimFrames > 0 tl63Sprite += (sIAPData.sPlayerTank.sProjectileInstances[i].iAnimFrame + 1) ENDIF VECTOR_2D vScale = sIAPData.sProjectileData[sIAPData.sPlayerTank.sProjectileInstances[i].eProjectileType].vSpriteScale FLOAT fRotation = sIAPData.sPlayerTank.sProjectileInstances[i].fRotation //Apply scale effect to flamethrower projectiles IF sIAPData.sPlayerTank.sProjectileInstances[i].eProjectileType = IAP_PROJECTILE_TYPE_FLAME FLOAT fAlpha = TO_FLOAT(NATIVE_TO_INT(GET_NETWORK_TIME()) - sIAPData.sPlayerTank.sProjectileInstances[i].iShotTime) / (sIAPData.sProjectileData[sIAPData.sPlayerTank.sProjectileInstances[i].eProjectileType].iSpeed * 0.75) IF fAlpha > 1.0 fAlpha = 1.0 ENDIF vScale.x = INTERP_FLOAT(vScale.x / 2, vScale.x, fAlpha, INTERPTYPE_ACCEL) vScale.y = INTERP_FLOAT(vScale.y / 2, vScale.y, fAlpha, INTERPTYPE_ACCEL) ENDIF ARCADE_CABINET_DRAW_SPRITE("MPInvPersCommon", tl63Sprite, sIAPData.sPlayerTank.sProjectileInstances[i].vThisFramePos.x, sIAPData.sPlayerTank.sProjectileInstances[i].vThisFramePos.y, vScale.x, vScale.y, fRotation, sIAPData.sColours.rgbaSprite) ENDFOR ENDPROC /// PURPOSE: /// Draws all enemy projectiles PROC IAP_DRAW_ENEMY_PROJECTILES() INT i FOR i = 0 TO ciIAP_MAX_ENEMY_PROJECTILES - 1 IF sIAPData.sEnemyProjectileInstances[i].iShotTime = -HIGHEST_INT RELOOP ENDIF IF NATIVE_TO_INT(GET_NETWORK_TIME()) > sIAPData.sEnemyProjectileInstances[i].iShotTime + sIAPData.sProjectileData[sIAPData.sEnemyProjectileInstances[i].eProjectileType].iSpeed RELOOP ENDIF TEXT_LABEL_63 tl63Sprite = sIAPData.sProjectileData[sIAPData.sEnemyProjectileInstances[i].eProjectileType].stSprite IF sIAPData.eCurrentStage = IAP_STAGE_MOON AND sIAPData.sEnemyProjectileInstances[i].eProjectileType = IAP_PROJECTILE_TYPE_FALLING_BARREL tl63Sprite += "_moon" ENDIF IF sIAPData.sProjectileData[sIAPData.sEnemyProjectileInstances[i].eProjectileType].iMaxAnimFrames > 0 tl63Sprite += (sIAPData.sEnemyProjectileInstances[i].iAnimFrame + 1) ENDIF ARCADE_CABINET_DRAW_SPRITE("MPInvPersCommon", tl63Sprite, sIAPData.sEnemyProjectileInstances[i].vThisFramePos.x, sIAPData.sEnemyProjectileInstances[i].vThisFramePos.y, sIAPData.sProjectileData[sIAPData.sEnemyProjectileInstances[i].eProjectileType].vSpriteScale.x, sIAPData.sProjectileData[sIAPData.sEnemyProjectileInstances[i].eProjectileType].vSpriteScale.y, sIAPData.sEnemyProjectileInstances[i].fRotation, sIAPData.sColours.rgbaSprite) ENDFOR ENDPROC // ------------------------------ OBJECTS ------------------------------ /// PURPOSE: /// Returns the RGBA colour for the given pickup's open effect /// PARAMS: FUNC RGBA_COLOUR_STRUCT IAP_GET_PICKUP_OPEN_EFFECT_COLOUR(IAP_OBJECT ePickupType) RGBA_COLOUR_STRUCT rgba SWITCH ePickupType CASE IAP_OBJECT_PICKUP_FLAMETHROWER INIT_RGBA_STRUCT(rgba, 255, 139, 63, 255) BREAK CASE IAP_OBJECT_PICKUP_ROCKETS INIT_RGBA_STRUCT(rgba, 139, 0, 255, 255) BREAK CASE IAP_OBJECT_PICKUP_HEALTH CASE IAP_OBJECT_PICKUP_LIFE CASE IAP_OBJECT_PICKUP_SCORE INIT_RGBA_STRUCT(rgba, 154, 255, 0, 255) BREAK CASE IAP_OBJECT_PICKUP_PLASMA INIT_RGBA_STRUCT(rgba, 24, 203, 247, 255) BREAK CASE IAP_OBJECT_PICKUP_ENEMY INIT_RGBA_STRUCT(rgba, 205, 0, 0, 255) BREAK CASE IAP_OBJECT_PICKUP_RANDOM INIT_RGBA_STRUCT(rgba, 244, 11, 225, 255) BREAK CASE IAP_OBJECT_PICKUP_SHIELD INIT_RGBA_STRUCT(rgba, 94, 250, 255, 255) BREAK CASE IAP_OBJECT_PICKUP_TRIPLE INIT_RGBA_STRUCT(rgba, 205, 0, 0, 255) BREAK CASE IAP_OBJECT_PICKUP_NUKE INIT_RGBA_STRUCT(rgba, 107, 150, 255, 255) BREAK ENDSWITCH RETURN rgba ENDFUNC /// PURPOSE: /// Returns the max anim frames for the object based on its current state FUNC INT IAP_GET_CURRENT_MAX_ANIM_FRAMES_FOR_OBJECT(INT iObjectIndex) //Special Cases IF sIAPData.sObjectInstances[iObjectIndex].iHealth = 0 IF sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].eObjectType = IAP_OBJECT_TYPE_PICKUP RETURN ciIAP_PICKUP_OPEN_FRAMES ENDIF RETURN ciIAP_EXPLOSION_FRAMES ENDIF IF sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].eObjectType = IAP_OBJECT_TYPE_PITFALL AND (sIAPData.sObjectInstances[iObjectIndex].iFlags & ciIAP_OBJECT_FLAG_PITFALL_CRUMBLING) != 0 RETURN ciIAP_PITFALL_CRUMBLE_ANIM_FRAMES ENDIF SWITCH sIAPData.sObjectInstances[iObjectIndex].eState CASE IAP_OBJECT_STATE_SHOOTING RETURN sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].iShootingAnimationFrames CASE IAP_OBJECT_STATE_DEFAULT CASE IAP_OBJECT_STATE_FALLING RETURN sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].iAnimationFrames ENDSWITCH RETURN 0 ENDFUNC /// PURPOSE: /// Returns the sprite prefix for the object based on its current state FUNC STRING IAP_GET_CURRENT_SPRITE_FOR_OBJECT(INT iObjectIndex) //Special Cases IF sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].eObjectType = IAP_OBJECT_TYPE_PITFALL AND (sIAPData.sObjectInstances[iObjectIndex].iFlags & ciIAP_OBJECT_FLAG_PITFALL_CRUMBLING) != 0 RETURN "pit_collapse" ENDIF IF sIAPData.sObjectInstances[iObjectIndex].iHealth = 0 IF sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].eObjectType = IAP_OBJECT_TYPE_PICKUP RETURN "crate_open" ENDIF RETURN "explosion_med" ENDIF SWITCH sIAPData.sObjectInstances[iObjectIndex].eState CASE IAP_OBJECT_STATE_SHOOTING RETURN sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].stShootingSpritePrefix CASE IAP_OBJECT_STATE_DEFAULT CASE IAP_OBJECT_STATE_FALLING RETURN sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].stSpritePrefix ENDSWITCH RETURN "INVALID STATE" ENDFUNC /// PURPOSE: /// Returns the sprite scale for the object based on its current state FUNC VECTOR_2D IAP_GET_CURRENT_SPRITE_SCALE_FOR_OBJECT(INT iObjectIndex) //Special Cases IF sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].eObjectType = IAP_OBJECT_TYPE_PITFALL AND (sIAPData.sObjectInstances[iObjectIndex].iFlags & ciIAP_OBJECT_FLAG_PITFALL_CRUMBLING) != 0 RETURN IAP_GET_CURRENT_STAGE_PITFALL_CRUMBLE_SCALE() ENDIF IF sIAPData.sObjectInstances[iObjectIndex].iHealth = 0 IF sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].eObjectType = IAP_OBJECT_TYPE_PICKUP RETURN INIT_VECTOR_2D(cfIAP_PICKUP_OPEN_EFFECT_SPRITE_SCALE_X, cfIAP_PICKUP_OPEN_EFFECT_SPRITE_SCALE_Y) ENDIF RETURN INIT_VECTOR_2D(cfIAP_EXPLOSION_SPRITE_SCALE_X, cfIAP_EXPLOSION_SPRITE_SCALE_Y) ENDIF RETURN INIT_VECTOR_2D(sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].vSpriteScale.x, sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].vSpriteScale.y) ENDFUNC /// PURPOSE: /// Returns the texture dictionary the object's current sprite is contained in FUNC STRING IAP_GET_TEXTURE_DICTIONARY_FOR_OBJECT(INT iObjectIndex) IF sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].eObjectType = IAP_OBJECT_TYPE_PITFALL AND (sIAPData.sObjectInstances[iObjectIndex].iFlags & ciIAP_OBJECT_FLAG_PITFALL_CRUMBLING) != 0 RETURN sIAPData.stLoadedStageTextureDictionary ENDIF IF sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].eObjectType = IAP_OBJECT_TYPE_PICKUP OR sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].eObjectType = IAP_OBJECT_TYPE_OIL RETURN "MpInvPersCommon" ENDIF IF sIAPData.sObjectInstances[iObjectIndex].iHealth = 0 RETURN "MPInvPersCommon" ENDIF RETURN sIAPData.stLoadedStageTextureDictionary ENDFUNC /// PURPOSE: /// Checks if the object should be drawn this frame /// False if it has died and finished exploding /// False if it is completely off screen FUNC BOOL IAP_SHOULD_DRAW_OBJECT_THIS_FRAME(INT iObjectIndex) IF sIAPData.sObjectInstances[iObjectIndex].iHealth = 0 AND sIAPData.sObjectInstances[iObjectIndex].iAnimFrame > IAP_GET_CURRENT_MAX_ANIM_FRAMES_FOR_OBJECT(iObjectIndex) //Explosion finished RETURN FALSE ENDIF IF IAP_IS_RECT_COMPLETELY_OUTSIDE_OF_GAME_AREA(sIAPData.sObjectInstances[iObjectIndex].vPosition, IAP_GET_CURRENT_SPRITE_SCALE_FOR_OBJECT(iObjectIndex)) RETURN FALSE ENDIF RETURN TRUE ENDFUNC /// PURPOSE: /// Returns the RGBA colour the object's sprite should be drawn with this frame FUNC RGBA_COLOUR_STRUCT IAP_GET_OBJECT_SPRITE_COLOUR(INT iObjectIndex) IF sIAPData.sObjectInstances[iObjectIndex].iHealth = 0 IF sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].eObjectType = IAP_OBJECT_TYPE_PICKUP RETURN IAP_GET_PICKUP_OPEN_EFFECT_COLOUR(sIAPData.sObjectInstances[iObjectIndex].eObjectType) ENDIF RETURN sIAPData.sColours.rgbaSprite ENDIF IF sIAPData.sObjectInstances[iObjectIndex].iLastDamagedTime + ciIAP_OBJECT_DAMAGE_RED_TIME > NATIVE_TO_INT(GET_NETWORK_TIME()) RGBA_COLOUR_STRUCT rgba IF sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].eObjectType = IAP_OBJECT_TYPE_OIL INIT_RGBA_STRUCT(rgba, 0, IAP_GET_FLASHING_ALPHA(), 0, 255) ELSE INIT_RGBA_STRUCT(rgba, 255, 0, 0, IAP_GET_FLASHING_ALPHA()) ENDIF RETURN rgba ENDIF RETURN sIAPData.sColours.rgbaSprite ENDFUNC /// PURPOSE: /// Draws the flag anim on top of a claimed oil stockpile PROC IAP_DRAW_OIL_FLAG(INT iObjectIndex) IF sIAPData.sObjectInstances[iObjectIndex].iLastDamagedTime = -HIGHEST_INT //Not claimed EXIT ENDIF TEXT_LABEL_63 tl63SpriteFlag = "capture_flag" IF IAP_GET_CURRENT_MAX_ANIM_FRAMES_FOR_OBJECT(iObjectIndex) > 0 tl63SpriteFlag += (sIAPData.sObjectInstances[iObjectIndex].iAnimFrame + 1) ENDIF VECTOR_2D vScale = IAP_GET_CURRENT_SPRITE_SCALE_FOR_OBJECT(iObjectIndex) ARCADE_CABINET_DRAW_SPRITE("MpInvPersCommon", tl63SpriteFlag, sIAPData.sObjectInstances[iObjectIndex].vPosition.x + (cfIAP_FLAG_SPRITE_SCALE_X / 2), sIAPData.sObjectInstances[iObjectIndex].vPosition.y - (vScale.y/2) - sIAPData.sObjectInstances[iObjectIndex].vDesiredPosition.y, cfIAP_FLAG_SPRITE_SCALE_X, cfIAP_FLAG_SPRITE_SCALE_Y, 0.0, sIAPData.sColours.rgbaSprite) ENDPROC /// PURPOSE: /// Draws all stage objects PROC IAP_DRAW_STAGE_OBJECTS() FLOAT fSinNumber = SIN(TO_FLOAT(GET_GAME_TIMER()) * 0.5) INT iObjectIndex FOR iObjectIndex = 0 TO ciIAP_MAX_ACTIVE_OBJECTS - 1 IF sIAPData.sObjectInstances[iObjectIndex].eObjectType = IAP_OBJECT_NONE RELOOP ENDIF IF sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].eObjectType = IAP_OBJECT_TYPE_LEDGE //Drawn as part of the stage RELOOP ENDIF IF sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].eObjectType = IAP_OBJECT_TYPE_PITFALL //Pitfall is as part of the stage IF (sIAPData.sObjectInstances[iObjectIndex].iFlags & ciIAP_OBJECT_FLAG_PITFALL_CRUMBLING) = 0 //No crumbling pit RELOOP ENDIF IF sIAPData.sObjectInstances[iObjectIndex].iAnimFrame >= IAP_GET_CURRENT_MAX_ANIM_FRAMES_FOR_OBJECT(iObjectIndex) //pit has crumbled RELOOP ENDIF ENDIF IF NOT IAP_SHOULD_DRAW_OBJECT_THIS_FRAME(iObjectIndex) RELOOP ENDIF STRING stTextureDict = IAP_GET_TEXTURE_DICTIONARY_FOR_OBJECT(iObjectIndex) VECTOR_2D vScale = IAP_GET_CURRENT_SPRITE_SCALE_FOR_OBJECT(iObjectIndex) RGBA_COLOUR_STRUCT rgba = IAP_GET_OBJECT_SPRITE_COLOUR(iObjectIndex) TEXT_LABEL_63 tl63Sprite = IAP_GET_CURRENT_SPRITE_FOR_OBJECT(iObjectIndex) IF sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].eObjectType = IAP_OBJECT_TYPE_OIL IAP_DRAW_OIL_FLAG(iObjectIndex) ELSE IF IAP_GET_CURRENT_MAX_ANIM_FRAMES_FOR_OBJECT(iObjectIndex) > 0 tl63Sprite += (sIAPData.sObjectInstances[iObjectIndex].iAnimFrame + 1) ENDIF ENDIF FLOAT fRotation = 0.0 VECTOR_2D vPos = sIAPData.sObjectInstances[iObjectIndex].vPosition IF sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].eObjectType = IAP_OBJECT_TYPE_PICKUP AND sIAPData.sObjectInstances[iObjectIndex].eState = IAP_OBJECT_STATE_FALLING //Rotate pickups back and forth while falling fRotation = (fSinNumber) * cfIAP_PICKUP_ROTATION VECTOR_2D vParachutePos = vPos vParachutePos.y -= (vScale.y / 2) + (cfIAP_PICKUP_PARACHUTE_SPRITE_SCALE_Y/2) vParachutePos = ARCADE_CABINET_CONVERT_TO_VECTOR_2D_TO_PIXELSPACE(vParachutePos) vParachutePos = ROTATE_VECTOR_2D_AROUND_VECTOR_2D(ARCADE_CABINET_CONVERT_TO_VECTOR_2D_TO_PIXELSPACE(vPos), vParachutePos, fRotation) vParachutePos = ARCADE_CABINET_CONVERT_TO_VECTOR_2D_TO_SCREENSPACE(vParachutePos) ARCADE_CABINET_DRAW_SPRITE(stTextureDict, "parachute", vParachutePos.x, vParachutePos.y, cfIAP_PICKUP_PARACHUTE_SPRITE_SCALE_X, cfIAP_PICKUP_PARACHUTE_SPRITE_SCALE_Y, fRotation, rgba) ENDIF IF sIAPData.sObjectData[ENUM_TO_INT(sIAPData.sObjectInstances[iObjectIndex].eObjectType)].eObjectType = IAP_OBJECT_TYPE_PITFALL AND (sIAPData.sObjectInstances[iObjectIndex].iFlags & ciIAP_OBJECT_FLAG_PITFALL_CRUMBLING) != 0 vPos = ADD_VECTOR_2D(vPos, IAP_GET_CURRENT_STAGE_PITFALL_CRUMBLE_OFFSET()) ENDIF ARCADE_CABINET_DRAW_SPRITE(stTextureDict, tl63Sprite, vPos.x, vPos.y, vScale.x, vScale.y, fRotation, rgba) ENDFOR ENDPROC // ------------------------------ MIDDLE TEXT SEQUENCES ------------------------------ /// PURPOSE: /// Updates the middle text anim frame by this frame's update PROC IAP_UPDATE_MIDDLE_TEXT_SEQUENCE_ANIM_FRAME() sIAPData.iMiddleTextAnimFrame += sIAPData.iUpdateFrames30FPS ENDPROC /// PURPOSE: /// Returns the sprite of the animated text sequence FUNC STRING IAP_GET_MIDDLE_TEXT_SEQUENCE_SPRITE(IAP_MIDDLE_TEXT_SEQ eSequence) SWITCH eSequence CASE IAP_MIDDLE_TEXT_SEQ_GET_READY RETURN "get ready_" CASE IAP_MIDDLE_TEXT_SEQ_GO RETURN "go_" CASE IAP_MIDDLE_TEXT_SEQ_GAMEOVER RETURN "gameover_" CASE IAP_MIDDLE_TEXT_SEQ_STAGE_CLEARED RETURN "stageclear_" DEFAULT RETURN "INVALID SEQUENCE" ENDSWITCH ENDFUNC /// PURPOSE: /// Returns the max frames of the animated text sequence FUNC INT IAP_GET_MIDDLE_TEXT_SEQUENCE_FRAMES(IAP_MIDDLE_TEXT_SEQ eSequence) SWITCH eSequence CASE IAP_MIDDLE_TEXT_SEQ_GET_READY RETURN ciIAP_GET_READY_MESSAGE_FRAMES CASE IAP_MIDDLE_TEXT_SEQ_GO RETURN ciIAP_GO_MESSAGE_FRAMES CASE IAP_MIDDLE_TEXT_SEQ_GAMEOVER RETURN ciIAP_GAMEOVER_MESSAGE_FRAMES CASE IAP_MIDDLE_TEXT_SEQ_STAGE_CLEARED RETURN ciIAP_STAGE_CLEARED_MESSAGE_FRAMES DEFAULT RETURN -1 ENDSWITCH ENDFUNC /// PURPOSE: /// Returns the scale of the animated text sequence FUNC VECTOR_2D IAP_GET_MIDDLE_TEXT_SEQUENCE_SCALE(IAP_MIDDLE_TEXT_SEQ eSequence) SWITCH eSequence CASE IAP_MIDDLE_TEXT_SEQ_GET_READY RETURN INIT_VECTOR_2D(cfIAP_GET_READY_MESSAGE_SCALE_X, cfIAP_GET_READY_MESSAGE_SCALE_Y) CASE IAP_MIDDLE_TEXT_SEQ_GO RETURN INIT_VECTOR_2D(cfIAP_GO_MESSAGE_SCALE_X, cfIAP_GO_MESSAGE_SCALE_Y) CASE IAP_MIDDLE_TEXT_SEQ_GAMEOVER RETURN INIT_VECTOR_2D(cfIAP_GAMEOVER_MESSAGE_SCALE_X, cfIAP_GAMEOVER_MESSAGE_SCALE_Y) CASE IAP_MIDDLE_TEXT_SEQ_STAGE_CLEARED RETURN INIT_VECTOR_2D(cfIAP_STAGE_CLEARED_MESSAGE_SCALE_X, cfIAP_STAGE_CLEARED_MESSAGE_SCALE_Y) DEFAULT RETURN INIT_VECTOR_2D(-1, -1) ENDSWITCH ENDFUNC /// PURPOSE: /// Returns the scale of the animated text sequence FUNC STRING IAP_GET_MIDDLE_TEXT_SEQUENCE_TEXTURE_DICT(IAP_MIDDLE_TEXT_SEQ eSequence) SWITCH eSequence CASE IAP_MIDDLE_TEXT_SEQ_GET_READY CASE IAP_MIDDLE_TEXT_SEQ_GO RETURN "MPInvPersMessages" CASE IAP_MIDDLE_TEXT_SEQ_GAMEOVER CASE IAP_MIDDLE_TEXT_SEQ_STAGE_CLEARED RETURN "MPInvPersMessages2" DEFAULT RETURN "INVALID SEQUENCE" ENDSWITCH ENDFUNC /// PURPOSE: /// Draws an animated text sequence in the center of the screen PROC IAP_DRAW_MIDDLE_TEXT_SEQUENCE(IAP_MIDDLE_TEXT_SEQ eSequence) INT iFrameToDraw = IAP_GET_MIDDLE_TEXT_SEQUENCE_FRAMES(eSequence) IF sIAPData.iMiddleTextAnimFrame > -1 AND sIAPData.iMiddleTextAnimFrame < IAP_GET_MIDDLE_TEXT_SEQUENCE_FRAMES(eSequence) iFrameToDraw = sIAPData.iMiddleTextAnimFrame + 1 ENDIF VECTOR_2D vScale = IAP_GET_MIDDLE_TEXT_SEQUENCE_SCALE(eSequence) TEXT_LABEL_63 tl63Sprite = IAP_GET_MIDDLE_TEXT_SEQUENCE_SPRITE(eSequence) tl63Sprite += iFrameToDraw FLOAT fYMod = 0.0 IF (eSequence = IAP_MIDDLE_TEXT_SEQ_STAGE_CLEARED OR eSequence = IAP_MIDDLE_TEXT_SEQ_GAMEOVER) AND sIAPData.iMiddleTextAnimFrame >= IAP_GET_MIDDLE_TEXT_SEQUENCE_FRAMES(eSequence) + ciIAP_STAGE_CLEAR_TALLY_DELAY_FRAMES + ciIAP_STAGE_CLEAR_SCALE_UP_FRAMES fYMod = -(cfIAP_STAGE_CLEARED_MESSAGE_SCALE_Y) ENDIF ARCADE_CABINET_DRAW_SPRITE(IAP_GET_MIDDLE_TEXT_SEQUENCE_TEXTURE_DICT(eSequence), tl63Sprite, cfSCREEN_CENTER, cfSCREEN_CENTER + fYMod, vScale.x, vScale.y, 0, sIAPData.sColours.rgbaSprite) IAP_UPDATE_MIDDLE_TEXT_SEQUENCE_ANIM_FRAME() ENDPROC /// PURPOSE: /// Draws text in the scoring tally values column PROC IAP_DRAW_SCORING_TALLY_TEXT_VALUE(INT iValue, FLOAT fYPos, BOOL bDollars = FALSE, INT iDigits = ciIAP_FONT_DIGIT_COUNT) IAP_DRAW_NUMBER_FROM_POS(iValue, INIT_VECTOR_2D(cfIAP_STAGE_CLEAR_TALLY_TEXT_VALUE_COLUMN_WRAP_MIN, fYPos), sIAPData.sColours.rgbaSprite, FALSE, bDollars, FALSE, iDigits) ENDPROC /// PURPOSE: /// Draws the end scoring tally and middle message BG PROC IAP_DRAW_OUTRO_SCORING_TALLY() VECTOR_2D vScale = INIT_VECTOR_2D(1.0, cfIAP_STAGE_CLEAR_BACKGROUND_MIN_Y) INT iMaxFrames = IAP_GET_MIDDLE_TEXT_SEQUENCE_FRAMES(IAP_MIDDLE_TEXT_SEQ_STAGE_CLEARED) BOOL bDrawTally = FALSE IF sIAPData.iMiddleTextAnimFrame < iMaxFrames vScale.y += ((cfIAP_STAGE_CLEAR_BACKGROUND_MID_Y - cfIAP_STAGE_CLEAR_BACKGROUND_MIN_Y) / iMaxFrames) * sIAPData.iMiddleTextAnimFrame ELIF sIAPData.iMiddleTextAnimFrame < iMaxFrames + ciIAP_STAGE_CLEAR_TALLY_DELAY_FRAMES vScale.y = cfIAP_STAGE_CLEAR_BACKGROUND_MID_Y ELIF sIAPData.iMiddleTextAnimFrame < iMaxFrames + ciIAP_STAGE_CLEAR_TALLY_DELAY_FRAMES + ciIAP_STAGE_CLEAR_SCALE_UP_FRAMES vScale.y = cfIAP_STAGE_CLEAR_BACKGROUND_MID_Y + ((cfIAP_STAGE_CLEAR_BACKGROUND_MAX_Y - cfIAP_STAGE_CLEAR_BACKGROUND_MID_Y) / ciIAP_STAGE_CLEAR_SCALE_UP_FRAMES) * (sIAPData.iMiddleTextAnimFrame - iMaxFrames - ciIAP_STAGE_CLEAR_TALLY_DELAY_FRAMES) ELSE vScale.y = cfIAP_STAGE_CLEAR_BACKGROUND_MAX_Y bDrawTally = TRUE ENDIF DRAW_RECT_FROM_VECTOR_2D(INIT_VECTOR_2D(cfSCREEN_CENTER, cfSCREEN_CENTER), ADD_VECTOR_2D(vScale, INIT_VECTOR_2D(0, cfIAP_STAGE_CLEAR_BORDER_Y)), sIAPData.sColours.rgbaScoringBorder) DRAW_RECT_FROM_VECTOR_2D(INIT_VECTOR_2D(cfSCREEN_CENTER, cfSCREEN_CENTER), vScale, sIAPData.sColours.rgbaScoringBg) IF NOT bDrawTally EXIT ENDIF FLOAT fY = cfIAP_STAGE_CLEAR_TALLY_TEXT_POS_Y //Armor ARCADE_CABINET_DRAW_SPRITE("MpInvPersHud", "title_armour", cfIAP_STAGE_CLEAR_TALLY_TEXT_TITLE_COLUMN_WRAP_MAX - (cfIAP_FONT_TITLE_SCALE_X/2), fY, cfIAP_FONT_TITLE_SCALE_X, cfIAP_FONT_TITLE_SCALE_Y, 0, sIAPData.sColours.rgbaScoringText) IAP_DRAW_SCORING_TALLY_TEXT_VALUE(sIAPData.iEndArmourToShow, fY) fY += cfIAP_STAGE_CLEAR_TALLY_TEXT_SPACING_Y //Lives ARCADE_CABINET_DRAW_SPRITE("MpInvPersHud", "title_lives", cfIAP_STAGE_CLEAR_TALLY_TEXT_TITLE_COLUMN_WRAP_MAX - (cfIAP_FONT_TITLE_SCALE_X/2), fY, cfIAP_FONT_TITLE_SCALE_X, cfIAP_FONT_TITLE_SCALE_Y, 0, sIAPData.sColours.rgbaScoringText) IAP_DRAW_SCORING_TALLY_TEXT_VALUE(sIAPData.iEndLivesToShow, fY) fY += cfIAP_STAGE_CLEAR_TALLY_TEXT_SPACING_Y //Distance ARCADE_CABINET_DRAW_SPRITE("MpInvPersHud", "title_distance", cfIAP_STAGE_CLEAR_TALLY_TEXT_TITLE_COLUMN_WRAP_MAX - (cfIAP_FONT_TITLE_SCALE_X/2), fY, cfIAP_FONT_TITLE_SCALE_X, cfIAP_FONT_TITLE_SCALE_Y, 0, sIAPData.sColours.rgbaScoringText) IAP_DRAW_SCORING_TALLY_TEXT_VALUE(sIAPData.iEndDistanceToShow * 1000, fY) fY += cfIAP_STAGE_CLEAR_TALLY_TEXT_SPACING_Y / 2 //Bar DRAW_RECT_FROM_VECTOR_2D(INIT_VECTOR_2D(cfSCREEN_CENTER + cfIAP_STAGE_CLEAR_TALLY_RECT_OFFSET_X, fY + cfIAP_STAGE_CLEAR_TALLY_RECT_OFFSET_Y), INIT_VECTOR_2D(cfIAP_STAGE_CLEAR_TALLY_RECT_WIDTH, cfIAP_STAGE_CLEAR_TALLY_RECT_HEIGHT), sIAPData.sColours.rgbaScoringText) fY += cfIAP_STAGE_CLEAR_TALLY_TEXT_SPACING_Y //Total ARCADE_CABINET_DRAW_SPRITE("MpInvPersHud", "title_total", cfIAP_STAGE_CLEAR_TALLY_TEXT_TITLE_COLUMN_WRAP_MAX - (cfIAP_FONT_TITLE_SCALE_X/2), fY, cfIAP_FONT_TITLE_SCALE_X, cfIAP_FONT_TITLE_SCALE_Y, 0, sIAPData.sColours.rgbaScoringText) IAP_DRAW_SCORING_TALLY_TEXT_VALUE(sIAPData.iScoreToShow, fY, TRUE) ENDPROC // ------------------------------ INTRO SCREENS ------------------------------ /// PURPOSE: /// Draws the intro movie and returns true when the intro movie has completed FUNC BOOL IAP_DRAW_DEGENETRON_INTRO_MOVIE() DRAW_BINK_MOVIE(sIAPData.binkDegenIntro, cfSCREEN_CENTER, cfSCREEN_CENTER, 1.0 * fAspectRatioModifier, 1.0, 0.0, 255, 255, 255, 255) ARCADE_GAMES_POSTFX_DRAW() IAP_DRAW_FACADE() IF GET_BINK_MOVIE_TIME(sIAPData.binkDegenIntro) >= 99.0 CDEBUG1LN(DEBUG_MINIGAME, "[IAP] [JS] IAP_DRAW_DEGENETRON_INTRO_MOVIE - stopping and releasing intro movie") STOP_BINK_MOVIE(sIAPData.binkDegenIntro) RELEASE_BINK_MOVIE(sIAPData.binkDegenIntro) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Draws the ron oil screen with opacity set to iAlpha PROC IAP_DRAW_RON_OIL_INTRO(INT iAlpha = 255) RGBA_COLOUR_STRUCT rgba IAP_DRAW_FULL_SCREEN_RECT(sIAPData.sColours.rgbaBlack) INIT_RGBA_STRUCT(rgba, 236, 109, 0, iAlpha) IAP_DRAW_FULL_SCREEN_RECT(rgba) DRAW_RECT_FROM_VECTOR_2D(INIT_VECTOR_2D(cfSCREEN_CENTER, cfSCREEN_CENTER), INIT_VECTOR_2D(cfIAP_PLAY_AREA_WIDTH, 1.0), sIAPData.sColours.rgbaBlack) rgba = sIAPData.sColours.rgbaSprite rgba.iA = iAlpha ARCADE_CABINET_DRAW_SPRITE("MpInvPersCommon", "ron_splash", cfSCREEN_CENTER, cfSCREEN_CENTER, cfIAP_PLAY_AREA_WIDTH, 1.0, 0, rgba) ARCADE_GAMES_POSTFX_DRAW() IAP_DRAW_FACADE() ENDPROC /// PURPOSE: /// Draws the ron oil screen with opacity set to iAlpha PROC IAP_DRAW_TITLE_SCREEN() DRAW_BINK_MOVIE(sIAPData.binkIntroLoop, cfSCREEN_CENTER, cfSCREEN_CENTER, 1.0 * fAspectRatioModifier, 1.0, 0.0, 255, 255, 255, 255) IF GET_CURRENT_LANGUAGE() != LANGUAGE_ENGLISH IF GET_BINK_MOVIE_TIME(sIAPData.binkIntroLoop) < 30.0 BEGIN_TEXT_COMMAND_PRINT("IAP_INTRO") END_TEXT_COMMAND_PRINT(1, TRUE) ENDIF ENDIF ARCADE_GAMES_POSTFX_DRAW() IAP_DRAW_FACADE() ENDPROC // ------------------------------ LOADING SCREEN ------------------------------ /// PURPOSE: /// Returns the loading screen background sprite for the current stage FUNC STRING IAP_GET_CURRENT_LOADING_SCREEN_BG_SPRITE() SWITCH sIAPData.eCurrentStage CASE IAP_STAGE_IRAQ RETURN "mission_select_screen1" CASE IAP_STAGE_RUSSIA RETURN "mission_select_screen2" CASE IAP_STAGE_CHINA RETURN "mission_select_screen3" CASE IAP_STAGE_CANADA RETURN "mission_select_screen4" CASE IAP_STAGE_MOON RETURN "mission_select_screen5" DEFAULT RETURN "INVALID STAGE" ENDSWITCH ENDFUNC /// PURPOSE: /// Returns the loading screen text sprite for the current stage FUNC STRING IAP_GET_CURRENT_LOADING_SCREEN_TEXT_SPRITE() SWITCH sIAPData.eCurrentStage CASE IAP_STAGE_IRAQ RETURN "lvl_text_1" CASE IAP_STAGE_RUSSIA RETURN "lvl_text_2" CASE IAP_STAGE_CHINA RETURN "lvl_text_3" CASE IAP_STAGE_CANADA RETURN "lvl_text_4" CASE IAP_STAGE_MOON RETURN "lvl_text_5" DEFAULT RETURN "INVALID STAGE" ENDSWITCH ENDFUNC /// PURPOSE: /// Returns the loading screen mission name sprite for the current stage FUNC STRING IAP_GET_CURRENT_LOADING_SCREEN_MISSION_NAME_SPRITE() SWITCH sIAPData.eCurrentStage CASE IAP_STAGE_IRAQ RETURN "lvl_name_1" CASE IAP_STAGE_RUSSIA RETURN "lvl_name_2" CASE IAP_STAGE_CHINA RETURN "lvl_name_3" CASE IAP_STAGE_CANADA RETURN "lvl_name_4" CASE IAP_STAGE_MOON RETURN "lvl_name_5" DEFAULT RETURN "INVALID STAGE" ENDSWITCH ENDFUNC /// PURPOSE: /// Returns the width of the loading screen mission name sprite for the current stage FUNC FLOAT GET_IAP_MISSION_NAME_WIDTH() SWITCH sIAPData.eCurrentStage CASE IAP_STAGE_IRAQ RETURN cfIAP_LOADING_TEXT_SCALE_X_IRAQ CASE IAP_STAGE_RUSSIA RETURN cfIAP_LOADING_TEXT_SCALE_X_RUSSIA CASE IAP_STAGE_CHINA RETURN cfIAP_LOADING_TEXT_SCALE_X_CHINA CASE IAP_STAGE_CANADA RETURN cfIAP_LOADING_TEXT_SCALE_X_CANADA CASE IAP_STAGE_MOON RETURN cfIAP_LOADING_TEXT_SCALE_X_MOON DEFAULT RETURN 0.0 ENDSWITCH ENDFUNC /// PURPOSE: /// Returns the loading screen country sprite for the current stage FUNC STRING IAP_GET_CURRENT_LOADING_SCREEN_COUNTRY_SPRITE() SWITCH sIAPData.eCurrentStage CASE IAP_STAGE_IRAQ RETURN "country_1" CASE IAP_STAGE_RUSSIA RETURN "country_2" CASE IAP_STAGE_CHINA RETURN "country_3" CASE IAP_STAGE_CANADA RETURN "country_4" CASE IAP_STAGE_MOON RETURN "country_5" DEFAULT RETURN "INVALID STAGE" ENDSWITCH ENDFUNC /// PURPOSE: /// Returns the texture dictionary the current stage's loading screen is in FUNC STRING IAP_GET_CURRENT_LOADING_SCREEN_TEXTURE_DICT() SWITCH sIAPData.eCurrentStage CASE IAP_STAGE_IRAQ CASE IAP_STAGE_RUSSIA CASE IAP_STAGE_CHINA CASE IAP_STAGE_CANADA RETURN "MpInvPersHud" CASE IAP_STAGE_MOON RETURN "MPInvPersCommon" DEFAULT RETURN "INVALID STAGE" ENDSWITCH ENDFUNC /// PURPOSE: /// Draws the flashing country on the loading screen PROC IAP_DRAW_LOADING_COUNTRY() VECTOR_2D vScale VECTOR_2D vPos SWITCH (sIAPData.eCurrentStage) CASE IAP_STAGE_IRAQ vScale = INIT_VECTOR_2D(0.016667, 0.029630) vPos = INIT_VECTOR_2D(0.542708, 0.329630) BREAK CASE IAP_STAGE_RUSSIA vScale = INIT_VECTOR_2D(0.158333, 0.088889) vPos = INIT_VECTOR_2D(0.602083, 0.266667) BREAK CASE IAP_STAGE_CHINA vScale = INIT_VECTOR_2D(0.075000, 0.088889) vPos = INIT_VECTOR_2D(0.617708, 0.322222) BREAK CASE IAP_STAGE_CANADA vScale = INIT_VECTOR_2D(0.100000, 0.096296) vPos = INIT_VECTOR_2D(0.384375, 0.257407) BREAK CASE IAP_STAGE_MOON vScale = INIT_VECTOR_2D(0.208333, 0.370370) vPos = INIT_VECTOR_2D(0.504167 + (0.000520833*2), 0.416667) BREAK ENDSWITCH vPos = ADD_VECTOR_2D(vPos, INIT_VECTOR_2D(-0.004166667, 0.005555556)) RGBA_COLOUR_STRUCT rgba = sIAPData.sColours.rgbaSprite rgba.iA = ROUND(INTERP_FLOAT(25, 255, ABSF(SIN(TO_FLOAT(GET_GAME_TIMER()) * cfIAP_LOADING_SCREEN_COUNTRY_FLASH_MOD)), INTERPTYPE_SMOOTHSTEP)) ARCADE_CABINET_DRAW_SPRITE(IAP_GET_CURRENT_LOADING_SCREEN_TEXTURE_DICT(), IAP_GET_CURRENT_LOADING_SCREEN_COUNTRY_SPRITE(), vPos.x, vPos.y, vScale.x, vScale.y, 0, rgba) IF GET_CURRENT_LANGUAGE() != LANGUAGE_ENGLISH TEXT_LABEL_15 tl15Desc = "IAP_STAGE_D_" tl15Desc += ENUM_TO_INT(sIAPData.eCurrentStage) BEGIN_TEXT_COMMAND_PRINT(tl15Desc) END_TEXT_COMMAND_PRINT(1, TRUE) ENDIF ENDPROC /// PURPOSE: /// Draws the stage loading screen PROC IAP_DRAW_STAGE_LOADING_SCREEN() IAP_DRAW_FULL_SCREEN_RECT(sIAPData.sColours.rgbaBlack) ARCADE_CABINET_DRAW_SPRITE(IAP_GET_CURRENT_LOADING_SCREEN_TEXTURE_DICT(), IAP_GET_CURRENT_LOADING_SCREEN_BG_SPRITE(), cfSCREEN_CENTER, cfSCREEN_CENTER, cfIAP_LOADING_SCREEN_SCALE_X, cfIAP_LOADING_SCREEN_SCALE_Y, 0, sIAPData.sColours.rgbaSprite) IAP_DRAW_LOADING_COUNTRY() ARCADE_GAMES_POSTFX_DRAW() IAP_DRAW_FACADE() ENDPROC // ------------------------------ STAGE INTRO ------------------------------ /// PURPOSE: /// Draws the stage intro PROC IAP_DRAW_STAGE_INTRO() IAP_DRAW_STAGE() IAP_DRAW_PLAYER_TANK() IAP_DRAW_WEATHER() IAP_DRAW_MIDDLE_TEXT_SEQUENCE(IAP_MIDDLE_TEXT_SEQ_GET_READY) ARCADE_GAMES_POSTFX_DRAW() IAP_DRAW_FACADE() ENDPROC // ------------------------------ RUNNING ------------------------------ /// PURPOSE: /// Draws the game while running PROC IAP_DRAW_STAGE_RUNNING() IAP_DRAW_STAGE() IAP_DRAW_STAGE_OBJECTS() IAP_DRAW_ENEMY_PROJECTILES() IAP_DRAW_PLAYER_PROJECTILES() IAP_DRAW_PLAYER_TANK() IAP_DRAW_EXPLOSIONS() IAP_DRAW_WEATHER() IAP_DRAW_NUKE() IAP_DRAW_ABOVE_PLAYER_TEXT() IAP_DRAW_SCORE_TEXT() IAP_DRAW_HUD() IF HAS_NET_TIMER_STARTED(sIAPData.tdStageTimer) AND NOT HAS_NET_TIMER_EXPIRED(sIAPData.tdStageTimer, ciIAP_GO_TIME) IAP_DRAW_MIDDLE_TEXT_SEQUENCE(IAP_MIDDLE_TEXT_SEQ_GO) ENDIF ARCADE_GAMES_POSTFX_DRAW() IAP_DRAW_FACADE() ENDPROC // ------------------------------ GAMEOVER ------------------------------ /// PURPOSE: /// Draws the gameover stage PROC IAP_DRAW_STAGE_GAMEOVER() IAP_DRAW_STAGE() IAP_DRAW_STAGE_OBJECTS() IAP_DRAW_PLAYER_TANK() IAP_DRAW_SCORE_TEXT() IAP_DRAW_WEATHER() IAP_DRAW_NUKE() IAP_DRAW_SCORE_TEXT() IAP_DRAW_HUD() IAP_DRAW_OUTRO_SCORING_TALLY() IAP_DRAW_MIDDLE_TEXT_SEQUENCE(IAP_MIDDLE_TEXT_SEQ_GAMEOVER) ARCADE_GAMES_POSTFX_DRAW() IAP_DRAW_FACADE() ENDPROC // ------------------------------ STAGE OUTRO ------------------------------ /// PURPOSE: /// Draws the stage outro PROC IAP_DRAW_STAGE_OUTRO() IAP_DRAW_STAGE() IAP_DRAW_STAGE_OBJECTS() IAP_DRAW_PLAYER_PROJECTILES() IAP_DRAW_PLAYER_TANK() IAP_DRAW_EXPLOSIONS() IAP_DRAW_WEATHER() IAP_DRAW_NUKE() IAP_DRAW_SCORE_TEXT() IAP_DRAW_HUD() IAP_DRAW_OUTRO_SCORING_TALLY() IAP_DRAW_MIDDLE_TEXT_SEQUENCE(IAP_MIDDLE_TEXT_SEQ_STAGE_CLEARED) ARCADE_GAMES_POSTFX_DRAW() IAP_DRAW_FACADE() ENDPROC // ------------------------------ LEADERBOARD ------------------------------ /// PURPOSE: /// Returns the string for the lbd position FUNC STRING IAP_GET_POSITION_STRING(INT iPosition) SWITCH iPosition CASE 0 RETURN "IAP_1ST" CASE 1 RETURN "IAP_2ND" CASE 2 RETURN "IAP_3RD" CASE 3 RETURN "IAP_4TH" CASE 4 RETURN "IAP_5TH" CASE 5 RETURN "IAP_6TH" CASE 6 RETURN "IAP_7TH" CASE 7 RETURN "IAP_8TH" CASE 8 RETURN "IAP_9TH" CASE 9 RETURN "IAP_10TH" ENDSWITCH RETURN "" ENDFUNC /// PURPOSE: /// Draws the leaderboard PROC IAP_DRAW_LEADERBOARD() DRAW_BINK_MOVIE(sIAPData.binkLeaderboard, cfSCREEN_CENTER, cfSCREEN_CENTER, 1.0 * fAspectRatioModifier, 1.0, 0.0, 255, 255, 255, 255) INT iUnpackedInitials[ciARCADE_CABINET_LEADERBOARD_INITIALS] FLOAT fY = cfIAP_LBD_STARTING_POS_Y INT iPositionLoop = 0 FOR iPositionLoop = 0 TO ciCASINO_ARCADE_LEADERBOARD_POSITIONS - 1 IF sIAPData.sLeaderboard[iPositionLoop].bPlayer AND (sIAPData.iCurrentInitial < ciARCADE_CABINET_LEADERBOARD_INITIALS - 1 OR SC_PROFANITY_GET_CHECK_IS_VALID(sIAPData.iLbdInitialProfanityToken)) ARCADE_UNPACK_LEADERBOARD_INITIALS(sIAPData.iInitials, iUnpackedInitials) ELSE ARCADE_UNPACK_LEADERBOARD_INITIALS(sIAPData.sLeaderboard[iPositionLoop].iInitials, iUnpackedInitials) ENDIF INT iAlpha = 255 IF sIAPData.sLeaderboard[iPositionLoop].bPlayer iAlpha = ROUND(ABSF(SIN(TO_FLOAT(NATIVE_TO_INT(GET_NETWORK_TIME())) * 0.5) * 80)) + 175 ENDIF //Position SET_TEXT_SCALE(cfIAP_LBD_TEXT_SCALE, cfIAP_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(cfIAP_LBD_POSITION_POS_X + cfIAP_DROP_SHADOW_OFFSET_X)) SET_TEXT_FONT(FONT_STYLE_PRICEDOWN) BEGIN_TEXT_COMMAND_DISPLAY_TEXT(IAP_GET_POSITION_STRING(iPositionLoop)) END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(cfSCREEN_CENTER), fY + cfIAP_DROP_SHADOW_OFFSET_Y) SET_TEXT_SCALE(cfIAP_LBD_TEXT_SCALE, cfIAP_LBD_TEXT_SCALE) SET_TEXT_COLOUR(255, 255, 255, iAlpha) SET_TEXT_RIGHT_JUSTIFY(TRUE) SET_TEXT_WRAP(APPLY_ASPECT_MOD_TO_X(0.0), APPLY_ASPECT_MOD_TO_X(cfIAP_LBD_POSITION_POS_X)) SET_TEXT_FONT(FONT_STYLE_PRICEDOWN) BEGIN_TEXT_COMMAND_DISPLAY_TEXT(IAP_GET_POSITION_STRING(iPositionLoop)) END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(cfSCREEN_CENTER), fY) //Initials SET_TEXT_SCALE(cfIAP_LBD_TEXT_SCALE, cfIAP_LBD_TEXT_SCALE) IF sIAPData.sLeaderboard[iPositionLoop].bPlayer AND sIAPData.iCurrentInitial = 0 SET_TEXT_COLOUR(sIAPData.sColours.rgbaScoringBorder.iR, sIAPData.sColours.rgbaScoringBorder.iG, sIAPData.sColours.rgbaScoringBorder.iB, 255) ELSE SET_TEXT_COLOUR(0, 0, 0, iAlpha) ENDIF SET_TEXT_RIGHT_JUSTIFY(TRUE) SET_TEXT_WRAP(APPLY_ASPECT_MOD_TO_X(0.0), APPLY_ASPECT_MOD_TO_X(cfIAP_LBD_INITIAL_1_POS_X + cfIAP_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 + cfIAP_DROP_SHADOW_OFFSET_Y) SET_TEXT_SCALE(cfIAP_LBD_TEXT_SCALE, cfIAP_LBD_TEXT_SCALE) IF sIAPData.sLeaderboard[iPositionLoop].bPlayer AND sIAPData.iCurrentInitial = 0 SET_TEXT_COLOUR(sIAPData.sColours.rgbaScoringText.iR, sIAPData.sColours.rgbaScoringText.iG, sIAPData.sColours.rgbaScoringText.iB, 255) ELSE SET_TEXT_COLOUR(255, 255, 255, iAlpha) ENDIF SET_TEXT_RIGHT_JUSTIFY(TRUE) SET_TEXT_WRAP(APPLY_ASPECT_MOD_TO_X(0.0), APPLY_ASPECT_MOD_TO_X(cfIAP_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(cfIAP_LBD_TEXT_SCALE, cfIAP_LBD_TEXT_SCALE) IF sIAPData.sLeaderboard[iPositionLoop].bPlayer AND sIAPData.iCurrentInitial = 1 SET_TEXT_COLOUR(sIAPData.sColours.rgbaScoringBorder.iR, sIAPData.sColours.rgbaScoringBorder.iG, sIAPData.sColours.rgbaScoringBorder.iB, 255) ELSE SET_TEXT_COLOUR(0, 0, 0, iAlpha) ENDIF SET_TEXT_RIGHT_JUSTIFY(TRUE) SET_TEXT_WRAP(APPLY_ASPECT_MOD_TO_X(0.0), APPLY_ASPECT_MOD_TO_X(cfIAP_LBD_INITIAL_2_POS_X + cfIAP_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 + cfIAP_DROP_SHADOW_OFFSET_Y) SET_TEXT_SCALE(cfIAP_LBD_TEXT_SCALE, cfIAP_LBD_TEXT_SCALE) IF sIAPData.sLeaderboard[iPositionLoop].bPlayer AND sIAPData.iCurrentInitial = 1 SET_TEXT_COLOUR(sIAPData.sColours.rgbaScoringText.iR, sIAPData.sColours.rgbaScoringText.iG, sIAPData.sColours.rgbaScoringText.iB, 255) ELSE SET_TEXT_COLOUR(255, 255, 255, iAlpha) ENDIF SET_TEXT_RIGHT_JUSTIFY(TRUE) SET_TEXT_WRAP(APPLY_ASPECT_MOD_TO_X(0.0), APPLY_ASPECT_MOD_TO_X(cfIAP_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(cfIAP_LBD_TEXT_SCALE, cfIAP_LBD_TEXT_SCALE) IF sIAPData.sLeaderboard[iPositionLoop].bPlayer AND sIAPData.iCurrentInitial = 2 SET_TEXT_COLOUR(sIAPData.sColours.rgbaScoringBorder.iR, sIAPData.sColours.rgbaScoringBorder.iG, sIAPData.sColours.rgbaScoringBorder.iB, 255) ELSE SET_TEXT_COLOUR(0, 0, 0, iAlpha) ENDIF SET_TEXT_RIGHT_JUSTIFY(TRUE) SET_TEXT_WRAP(APPLY_ASPECT_MOD_TO_X(0.0), APPLY_ASPECT_MOD_TO_X(cfIAP_LBD_INITIAL_3_POS_X + cfIAP_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 + cfIAP_DROP_SHADOW_OFFSET_Y) SET_TEXT_SCALE(cfIAP_LBD_TEXT_SCALE, cfIAP_LBD_TEXT_SCALE) IF sIAPData.sLeaderboard[iPositionLoop].bPlayer AND sIAPData.iCurrentInitial = 2 SET_TEXT_COLOUR(sIAPData.sColours.rgbaScoringText.iR, sIAPData.sColours.rgbaScoringText.iG, sIAPData.sColours.rgbaScoringText.iB, 255) ELSE SET_TEXT_COLOUR(255, 255, 255, iAlpha) ENDIF SET_TEXT_RIGHT_JUSTIFY(TRUE) SET_TEXT_WRAP(APPLY_ASPECT_MOD_TO_X(0.0), APPLY_ASPECT_MOD_TO_X(cfIAP_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(cfIAP_LBD_TEXT_SCALE, cfIAP_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(cfIAP_LBD_SCORE_POS_X + cfIAP_DROP_SHADOW_OFFSET_X)) SET_TEXT_FONT(FONT_STYLE_PRICEDOWN) BEGIN_TEXT_COMMAND_DISPLAY_TEXT("IAP_SCR") ADD_TEXT_COMPONENT_INTEGER(sIAPData.sLeaderboard[iPositionLoop].iScore) END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(cfSCREEN_CENTER), fY + cfIAP_DROP_SHADOW_OFFSET_Y) SET_TEXT_SCALE(cfIAP_LBD_TEXT_SCALE, cfIAP_LBD_TEXT_SCALE) SET_TEXT_COLOUR(255, 255, 255, iAlpha) SET_TEXT_RIGHT_JUSTIFY(TRUE) SET_TEXT_WRAP(APPLY_ASPECT_MOD_TO_X(0.0), APPLY_ASPECT_MOD_TO_X(cfIAP_LBD_SCORE_POS_X)) SET_TEXT_FONT(FONT_STYLE_PRICEDOWN) BEGIN_TEXT_COMMAND_DISPLAY_TEXT("IAP_SCR") ADD_TEXT_COMPONENT_INTEGER(sIAPData.sLeaderboard[iPositionLoop].iScore) END_TEXT_COMMAND_DISPLAY_TEXT(APPLY_ASPECT_MOD_TO_X(cfSCREEN_CENTER), fY) fY += cfIAP_LBD_SPACING_Y ENDFOR ARCADE_GAMES_POSTFX_DRAW() IAP_DRAW_FACADE() ENDPROC