USING "degenatron_games_using.sch" USING "degenatron_games_common.sch" USING "degenatron_games_animation.sch" CONST_FLOAT cfDG_DEFENDER_GROUND_BASE_HEIGHT 150.0 CONST_FLOAT cfDG_DEFENDER_GROUND_ROCK_WIDTH 932.0 CONST_FLOAT cfDG_DEFENDER_GROUND_ROCK_HEIGHT 262.0 CONST_INT ciDG_DEFENDER_GROUND_ROCK_AMOUNT 3 CONST_FLOAT cfDG_DEFENDER_PLAYER_HEIGHT 110.4175532 CONST_FLOAT cfDG_DEFENDER_PLAYER_WIDTH 140.0 CONST_INT ciDG_DEFENDER_PLAYER_SPEED 1500 CONST_FLOAT cfDG_DEFENDER_PLAYER_SCREEN_RATE_SPEED 1.0 CONST_FLOAT cfDG_DEFENDER_ENEMY_HEIGHT 86.75664894 CONST_FLOAT cfDG_DEFENDER_ENEMY_WIDTH 110.0 CONST_INT ciDG_DEFENDER_ENEMY_SPEED 110 CONST_FLOAT cfDG_DEFENDER_OBJECTIVE_HEIGHT 70.98271277 CONST_FLOAT cfDG_DEFENDER_OBJECTIVE_WIDTH 90.0 CONST_INT cfDG_DEFENDER_OBJECTIVE_SPEED 100 CONST_INT ciDG_DEFENDER_OBJECTIVE_SCORE 50 CONST_INT ciDG_DEFENDER_MAX_LEVEL 24 CONST_INT ciDG_DEFENDER_MAX_ENEMY_AMOUNT 160 CONST_INT ciDG_DEFENDER_MAX_OBJECTIVE_AMOUNT 150 CONST_FLOAT cfDG_DEFENDER_PLAYER_MIN_SCREEN_POS 0.45 CONST_FLOAT cfDG_DEFENDER_PLAYER_MAX_SCREEN_POS 0.55 CONST_INT ciDG_DEFENDER_SCORE_DECREMENT_TIME_MAX 2500 CONST_INT ciDG_DEFENDER_SCORE_DECREMENT_TIME_MIN 500 CONST_INT ciDG_DEFENDER_SCORE_DECREMENT_TIME_STEP 100 CONST_FLOAT cfDG_DEFENDER_PLAYER_SPEED_MULTIPLIER_MAX 3.0 CONST_FLOAT cfDG_DEFENDER_PLAYER_SPEED_MULTIPLIER_MIN 1.0 CONST_FLOAT cfDG_DEFENDER_PLAYER_SPEED_MULTIPLIER_STEP 0.05 CONST_INT ciDG_DEFENDER_PLAYER_DEAD_FLASHES 2 ENUM DG_DEFENDER_STATE_LEVEL DG_DEFENDER_STATE_LEVEL_INIT, DG_DEFENDER_STATE_LEVEL_UPDATE, DG_DEFENDER_STATE_LEVEL_COMPLETED, DG_DEFENDER_STATE_LEVEL_DEAD, DG_DEFENDER_STATE_LEVEL_WAIT_TIME, DG_DEFENDER_STATE_LEVEL_END ENDENUM FUNC STRING DG_DEFENDER_STATE_LEVEL_TO_STRING(DG_DEFENDER_STATE_LEVEL eEnum) SWITCH eEnum CASE DG_DEFENDER_STATE_LEVEL_INIT RETURN "LEVEL_INIT" CASE DG_DEFENDER_STATE_LEVEL_UPDATE RETURN "LEVEL_UPDATE" CASE DG_DEFENDER_STATE_LEVEL_COMPLETED RETURN "LEVEL_COMPLETED" CASE DG_DEFENDER_STATE_LEVEL_DEAD RETURN "LEVEL_DEAD" CASE DG_DEFENDER_STATE_LEVEL_WAIT_TIME RETURN "LEVEL_WAIT_TIME" CASE DG_DEFENDER_STATE_LEVEL_END RETURN "LEVEL_END" ENDSWITCH RETURN "***INVALID***" ENDFUNC STRUCT DG_DEFENDER_PLAYER_DATA VECTOR_2D vPlayerGamePos VECTOR_2D vPlayerDirection VECTOR_2D vPlayerScreenPos VECTOR_2D vPlayerScreenPosRate VECTOR_2D vPlayerGameAcceleration ENDSTRUCT STRUCT DG_DEFENDER_ENEMY_DATA VECTOR_2D vEnemyGamePos VECTOR_2D vEnemyDirection VECTOR_2D vEnemyScreenPos BOOL bCollision ENDSTRUCT STRUCT DG_DEFENDER_OBJECTIVE_DATA VECTOR_2D vObjectiveGamePos VECTOR_2D vObjectiveDirection VECTOR_2D vObjectiveScreenPos BOOL bCollision BOOL bActive = TRUE ENDSTRUCT STRUCT DG_DEFENDER_LEVEL_DATA INT iMapTiles INT iEnemiesAmount INT iObjectivesAmount INT iScoreTimer INT iScoreTimerMax FLOAT fPlayerSpeedMultiplier BOOL bObjectiveJustCaptured DG_DEFENDER_STATE_LEVEL eLevelState ENDSTRUCT STRUCT DG_DEFENDER_DATA INT iRocksMap[ciDG_DEFENDER_GROUND_ROCK_AMOUNT] DG_DEFENDER_PLAYER_DATA sPlayerData DG_DEFENDER_ENEMY_DATA sEnemyData[ciDG_DEFENDER_MAX_ENEMY_AMOUNT] DG_DEFENDER_OBJECTIVE_DATA sObjectiveData[2*ciDG_DEFENDER_MAX_LEVEL] DG_DEFENDER_LEVEL_DATA sLevelData BOOL bUpdateFirstFrameDone = FALSE BOOL bKeepFaithAward = TRUE INT iScoreTimerDecrementMax = ciDG_DEFENDER_SCORE_DECREMENT_TIME_MAX INT iScoreTimerDecrementMin = ciDG_DEFENDER_SCORE_DECREMENT_TIME_MIN INT iScoreTimerDecrementStep = ciDG_DEFENDER_SCORE_DECREMENT_TIME_STEP FLOAT fPlayerSpeedMultiplayerMax = cfDG_DEFENDER_PLAYER_SPEED_MULTIPLIER_MAX FLOAT fPlayerSpeedMultiplayerMin = cfDG_DEFENDER_PLAYER_SPEED_MULTIPLIER_MIN FLOAT fPlayerSpeedMultiplayerStep = cfDG_DEFENDER_PLAYER_SPEED_MULTIPLIER_STEP #IF IS_DEBUG_BUILD BOOL bWidgetSetLevel INT iWidgetEnemySelected INT iWidgetObjectiveSelected #ENDIF ENDSTRUCT DG_DEFENDER_DATA sDGDefenderData //**************************************************// //* DATA ACCESSORS - DEFENDER OF THE FAITH *// //**************************************************// // MAP // FUNC FLOAT DG_DEFENDER_GET_MAP_TILE_SIZE RETURN cfDG_DEFENDER_GROUND_ROCK_WIDTH*3 ENDFUNC FUNC FLOAT DG_DEFENDER_GET_MAP_SIZE RETURN DG_DEFENDER_GET_MAP_TILE_SIZE()*sDGDefenderData.sLevelData.iMapTiles ENDFUNC // GROUND // FUNC FLOAT DG_DEFENDER_GET_GROUND_HEIGHT RETURN cfDG_DEFENDER_GROUND_BASE_HEIGHT ENDFUNC FUNC VECTOR_2D DG_DEFENDER_GROUND_POSITION VECTOR_2D groundPosition = DEGENATRON_GAMES_GET_SCREEN_CENTER() groundPosition.y += DEGENATRON_GAMES_GET_SCREEN_HEIGHT()/2 //- DG_DEFENDER_GET_GROUND_HEIGHT()*0.4 RETURN groundPosition ENDFUNC FUNC VECTOR_2D DG_DEFENDER_GROUND_SIZE RETURN INIT_VECTOR_2D(DEGENATRON_GAMES_GET_SCREEN_WIDTH(),DG_DEFENDER_GET_GROUND_HEIGHT()) ENDFUNC // ROCKS // FUNC FLOAT DG_DEFENDER_GET_GROUND_ROCK_WIDTH RETURN cfDG_DEFENDER_GROUND_ROCK_WIDTH //DEGENATRON_GAMES_GET_SCREEN_WIDTH()/(ciDG_DEFENDER_GROUND_ROCK_AMOUNT-2) ENDFUNC FUNC FLOAT DG_DEFENDER_GET_GROUND_ROCK_HEIGHT RETURN cfDG_DEFENDER_GROUND_ROCK_HEIGHT //DEGENATRON_GAMES_GET_SCREEN_WIDTH()/(ciDG_DEFENDER_GROUND_ROCK_AMOUNT-2) ENDFUNC FUNC VECTOR_2D DG_DEFENDER_GET_GROUND_ROCK_SIZE RETURN INIT_VECTOR_2D(DG_DEFENDER_GET_GROUND_ROCK_WIDTH(),DG_DEFENDER_GET_GROUND_ROCK_HEIGHT()) ENDFUNC FUNC VECTOR_2D DG_DEFENDER_GET_ROCK_POSITION(INT iRock) VECTOR_2D screenCenter = DEGENATRON_GAMES_GET_SCREEN_CENTER() VECTOR_2D screenSize = DEGENATRON_GAMES_GET_SCREEN_SIZE() // VECTOR_2D groundSize = DG_DEFENDER_GROUND_SIZE() VECTOR_2D rockSize = DG_DEFENDER_GET_GROUND_ROCK_SIZE() VECTOR_2D rockPosition rockPosition.x = screenCenter.x - screenSize.x/2 + (rockSize.x*iRock + sDGDefenderData.sPlayerData.vPlayerGamePos.x)%DG_DEFENDER_GET_MAP_TILE_SIZE() rockPosition.y = screenCenter.y + screenSize.y/2 - rockSize.y/2 RETURN rockPosition ENDFUNC // PLAYER // FUNC FLOAT DG_DEFENDER_GET_PLAYER_HEIGHT RETURN cfDG_DEFENDER_PLAYER_HEIGHT ENDFUNC FUNC FLOAT DG_DEFENDER_GET_PLAYER_WIDTH RETURN cfDG_DEFENDER_PLAYER_WIDTH ENDFUNC FUNC VECTOR_2D DG_DEFENDER_GET_PLAYER_SIZE RETURN INIT_VECTOR_2D(DG_DEFENDER_GET_PLAYER_WIDTH(),DG_DEFENDER_GET_PLAYER_HEIGHT()) ENDFUNC FUNC VECTOR_2D DG_DEFENDER_GET_PLAYER_POSITION() RETURN sDGDefenderData.sPlayerData.vPlayerGamePos ENDFUNC FUNC VECTOR_2D DG_DEFENDER_GET_PLAYER_SCREEN_POSITION() RETURN sDGDefenderData.sPlayerData.vPlayerScreenPos ENDFUNC // ENEMY // FUNC FLOAT DG_DEFENDER_GET_ENEMY_HEIGHT RETURN cfDG_DEFENDER_ENEMY_HEIGHT ENDFUNC FUNC FLOAT DG_DEFENDER_GET_ENEMY_WIDTH RETURN cfDG_DEFENDER_ENEMY_WIDTH ENDFUNC FUNC VECTOR_2D DG_DEFENDER_GET_ENEMY_SIZE RETURN INIT_VECTOR_2D(DG_DEFENDER_GET_ENEMY_WIDTH(),DG_DEFENDER_GET_ENEMY_HEIGHT()) ENDFUNC FUNC VECTOR_2D DG_DEFENDER_GET_ENEMY_POSITION(INT iEnemy) RETURN sDGDefenderData.sEnemyData[iEnemy].vEnemyGamePos ENDFUNC FUNC VECTOR_2D DG_DEFENDER_GET_ENEMY_SCREEN_POSITION(INT iEnemy) RETURN sDGDefenderData.sEnemyData[iEnemy].vEnemyScreenPos ENDFUNC // OBJECTIVE // FUNC FLOAT DG_DEFENDER_GET_OBJECTIVE_HEIGHT RETURN cfDG_DEFENDER_OBJECTIVE_HEIGHT ENDFUNC FUNC FLOAT DG_DEFENDER_GET_OBJECTIVE_WIDTH RETURN cfDG_DEFENDER_OBJECTIVE_WIDTH ENDFUNC FUNC VECTOR_2D DG_DEFENDER_GET_OBJECTIVE_SIZE RETURN INIT_VECTOR_2D(DG_DEFENDER_GET_OBJECTIVE_WIDTH(),DG_DEFENDER_GET_OBJECTIVE_HEIGHT()) ENDFUNC FUNC VECTOR_2D DG_DEFENDER_GET_OBJECTIVE_POSITION(INT iObjective) RETURN sDGDefenderData.sObjectiveData[iObjective].vObjectiveGamePos ENDFUNC FUNC VECTOR_2D DG_DEFENDER_GET_OBJECTIVE_SCREEN_POSITION(INT iObjective) RETURN sDGDefenderData.sObjectiveData[iObjective].vObjectiveScreenPos ENDFUNC FUNC BOOL DG_DEFENDER_GET_OBJECTIVE_IS_ACTIVE(INT iObjective) RETURN sDGDefenderData.sObjectiveData[iObjective].bActive ENDFUNC //**************************************************// //* DRAW - DEFENDER OF THE FAITH *// //**************************************************// PROC DG_DEFENDER_DRAW_PIXELSPACE_RECT(VECTOR_2D vCenter, VECTOR_2D vScale, RGBA_COLOUR_STRUCT rgba, BOOL bLoopTerrain = FALSE, BOOL bAvoidAberrationFX = FALSE) unused_parameter(bLoopTerrain) DEGENATRON_GAMES_DRAW_PIXELSPACE_RECT(vCenter, vScale, rgba,bAvoidAberrationFX) IF vCenter.x > DG_DEFENDER_GET_MAP_TILE_SIZE() - vScale.x/2 DEGENATRON_GAMES_DRAW_PIXELSPACE_RECT(ADD_VECTOR_2D(vCenter,INIT_VECTOR_2D(-DG_DEFENDER_GET_MAP_TILE_SIZE(),0)), vScale, rgba,bAvoidAberrationFX) ENDIF // ENDIF ENDPROC PROC DG_DEFENDER_DRAW_PIXELSPACE_SPRITE(DEGENATRON_GAMES_TEXT_ITEM eTexture, VECTOR_2D vCenter, VECTOR_2D vScale, RGBA_COLOUR_STRUCT rgba, BOOL bLoopTerrain = FALSE, BOOL bAvoidAberrationFX = FALSE) unused_parameter(bLoopTerrain) DEGENATRON_GAMES_DRAW_PIXELSPACE_SPRITE(eTexture, vCenter, vScale,0.0, rgba,bAvoidAberrationFX) IF bLoopTerrain IF vCenter.x > DG_DEFENDER_GET_MAP_TILE_SIZE() - vScale.x/2 DEGENATRON_GAMES_DRAW_PIXELSPACE_SPRITE(eTexture, ADD_VECTOR_2D(vCenter,INIT_VECTOR_2D(-DG_DEFENDER_GET_MAP_TILE_SIZE(),0)), vScale,0.0, rgba,bAvoidAberrationFX) ENDIF ENDIF ENDPROC PROC DG_DEFENDER_DRAW_PLAYER() IF sDegenatronGamesData.sGameData.bPlayerIsDead VECTOR_2D vPlayerSize = DG_DEFENDER_GET_PLAYER_SIZE() VECTOR_2D vPlayerPos = DG_DEFENDER_GET_PLAYER_SCREEN_POSITION() VECTOR_2D vSquareSize VECTOR_2D vSquarePos RGBA_COLOUR_STRUCT color IF sDegenatronGamesData.sGameData.iFlashTime/(ciDEGENATRON_GAMES_PLAYER_FLASH_TIME/4)%2 = 0 color = sDegenatronGamesData.rgbaWhite ELSE color = sDegenatronGamesData.rgbaRed ENDIF IF sDegenatronGamesData.sGameData.iFlashTime < ciDEGENATRON_GAMES_PLAYER_FLASH_TIME/2 vSquareSize.x = vPlayerSize.x*0.35 vSquareSize.y = vPlayerSize.y*0.35 vSquarePos.x = vPlayerPos.x - vPlayerSize.x*0.25 vSquarePos.y = vPlayerPos.y + vPlayerSize.y*0.25 DG_DEFENDER_DRAW_PIXELSPACE_SPRITE(DEGENATRON_GAMES_TEXT_ITEM_SQUARE_02_SOLID,vSquarePos, vSquareSize, color) vSquareSize.x = vPlayerSize.x*0.15 vSquareSize.y = vPlayerSize.y*0.15 vSquarePos.x = vPlayerPos.x - vPlayerSize.x*0.3 vSquarePos.y = vPlayerPos.y - vPlayerSize.y*0.2 DG_DEFENDER_DRAW_PIXELSPACE_SPRITE(DEGENATRON_GAMES_TEXT_ITEM_SQUARE_04_SOLID,vSquarePos, vSquareSize, color) vSquarePos.x = vPlayerPos.x + vPlayerSize.x*0.3 vSquarePos.y = vPlayerPos.y - vPlayerSize.y*0.3 DG_DEFENDER_DRAW_PIXELSPACE_SPRITE(DEGENATRON_GAMES_TEXT_ITEM_SQUARE_04_SOLID,vSquarePos, vSquareSize, color) vSquarePos.x = vPlayerPos.x + vPlayerSize.x*0.2 vSquarePos.y = vPlayerPos.y + vPlayerSize.y*0.3 DG_DEFENDER_DRAW_PIXELSPACE_SPRITE(DEGENATRON_GAMES_TEXT_ITEM_SQUARE_04_SOLID,vSquarePos, vSquareSize, color) ELIF sDegenatronGamesData.sGameData.iFlashTime < ciDEGENATRON_GAMES_PLAYER_FLASH_TIME vSquareSize.x = vPlayerSize.x*0.25 vSquareSize.y = vPlayerSize.y*0.25 vSquarePos.x = vPlayerPos.x vSquarePos.y = vPlayerPos.y DG_DEFENDER_DRAW_PIXELSPACE_SPRITE(DEGENATRON_GAMES_TEXT_ITEM_SQUARE_03_SOLID,vSquarePos, vSquareSize, color) vSquareSize.x = vPlayerSize.x*0.15 vSquareSize.y = vPlayerSize.y*0.15 vSquarePos.x = vPlayerPos.x - vPlayerSize.x*0.3 vSquarePos.y = vPlayerPos.y DG_DEFENDER_DRAW_PIXELSPACE_SPRITE(DEGENATRON_GAMES_TEXT_ITEM_SQUARE_04_SOLID,vSquarePos, vSquareSize, color) vSquarePos.x = vPlayerPos.x + vPlayerSize.x*0.3 vSquarePos.y = vPlayerPos.y DG_DEFENDER_DRAW_PIXELSPACE_SPRITE(DEGENATRON_GAMES_TEXT_ITEM_SQUARE_04_SOLID,vSquarePos, vSquareSize, color) vSquarePos.x = vPlayerPos.x vSquarePos.y = vPlayerPos.y - vPlayerSize.y*0.3 DG_DEFENDER_DRAW_PIXELSPACE_SPRITE(DEGENATRON_GAMES_TEXT_ITEM_SQUARE_04_SOLID,vSquarePos, vSquareSize, color) vSquarePos.x = vPlayerPos.x vSquarePos.y = vPlayerPos.y + vPlayerSize.y*0.3 DG_DEFENDER_DRAW_PIXELSPACE_SPRITE(DEGENATRON_GAMES_TEXT_ITEM_SQUARE_04_SOLID,vSquarePos, vSquareSize, color) vSquareSize.x = vPlayerSize.x*0.1 vSquareSize.y = vPlayerSize.y*0.1 vSquarePos.x = vPlayerPos.x - vPlayerSize.x*0.1 vSquarePos.y = vPlayerPos.y - vPlayerSize.y*0.4 DG_DEFENDER_DRAW_PIXELSPACE_SPRITE(DEGENATRON_GAMES_TEXT_ITEM_SQUARE_04_SOLID,vSquarePos, vSquareSize, color) vSquarePos.x = vPlayerPos.x + vPlayerSize.x*0.25 vSquarePos.y = vPlayerPos.y - vPlayerSize.y*0.45 DG_DEFENDER_DRAW_PIXELSPACE_SPRITE(DEGENATRON_GAMES_TEXT_ITEM_SQUARE_04_SOLID,vSquarePos, vSquareSize, color) vSquarePos.x = vPlayerPos.x + vPlayerSize.x*0.35 vSquarePos.y = vPlayerPos.y + vPlayerSize.y*0.4 DG_DEFENDER_DRAW_PIXELSPACE_SPRITE(DEGENATRON_GAMES_TEXT_ITEM_SQUARE_04_SOLID,vSquarePos, vSquareSize, color) vSquarePos.x = vPlayerPos.x - vPlayerSize.x*0.4 vSquarePos.y = vPlayerPos.y + vPlayerSize.y*0.34 DG_DEFENDER_DRAW_PIXELSPACE_SPRITE(DEGENATRON_GAMES_TEXT_ITEM_SQUARE_04_SOLID,vSquarePos, vSquareSize, color) ENDIF ELSE DG_DEFENDER_DRAW_PIXELSPACE_SPRITE(DEGENATRON_GAMES_TEXT_ITEM_SQUARE_01_SOLID,DG_DEFENDER_GET_PLAYER_SCREEN_POSITION(), DG_DEFENDER_GET_PLAYER_SIZE(), sDegenatronGamesData.rgbaRed) ENDIF ENDPROC PROC DG_DEFENDER_DRAW_ENEMY(INT iEnemy) IF sDegenatronGamesData.sGameData.bPlayerIsDead EXIT ENDIF VECTOR_2D vPosition = DG_DEFENDER_GET_ENEMY_SCREEN_POSITION(iEnemy) VECTOR_2D vSize = DG_DEFENDER_GET_ENEMY_SIZE() DG_DEFENDER_DRAW_PIXELSPACE_SPRITE(DEGENATRON_GAMES_TEXT_ITEM_SQUARE_02_SOLID,vPosition, DG_DEFENDER_GET_ENEMY_SIZE(), sDegenatronGamesData.rgbaCyan,DEFAULT) IF vPosition.x < vSize.x/2 OR vPosition.x > DEGENATRON_GAMES_GET_SCREEN_WIDTH() - vSize.x/2 DG_DEFENDER_DRAW_PIXELSPACE_SPRITE(DEGENATRON_GAMES_TEXT_ITEM_SQUARE_02_SOLID,vPosition, DG_DEFENDER_GET_ENEMY_SIZE(), sDegenatronGamesData.rgbaCyan) ENDIF ENDPROC PROC DG_DEFENDER_DRAW_ENEMIES INT iEnemy REPEAT sDGDefenderData.sLevelData.iEnemiesAmount iEnemy DG_DEFENDER_DRAW_ENEMY(iEnemy) ENDREPEAT ENDPROC PROC DG_DEFENDER_DRAW_OBJECTIVE(INT iObjective) IF DG_DEFENDER_GET_OBJECTIVE_IS_ACTIVE(iObjective) DG_DEFENDER_DRAW_PIXELSPACE_SPRITE(DEGENATRON_GAMES_TEXT_ITEM_SQUARE_03_SOLID,DG_DEFENDER_GET_OBJECTIVE_SCREEN_POSITION(iObjective), DG_DEFENDER_GET_OBJECTIVE_SIZE(), sDegenatronGamesData.rgbaGreen) ENDIF ENDPROC PROC DG_DEFENDER_DRAW_OBJECTIVES INT iObjective REPEAT sDGDefenderData.sLevelData.iObjectivesAmount iObjective DG_DEFENDER_DRAW_OBJECTIVE(iObjective) ENDREPEAT ENDPROC PROC DG_DEFENDER_DRAW_BACKGROUND() DG_DEFENDER_DRAW_PIXELSPACE_RECT(DEGENATRON_GAMES_GET_SCREEN_CENTER(), DEGENATRON_GAMES_GET_SCREEN_SIZE(), sDegenatronGamesData.rgbaBlack,DEFAULT,TRUE) IF sDegenatronGamesData.sGameData.bPlayerIsDead sDegenatronGamesData.sGameData.iFlashTime += DEGENATRON_GAMES_FRAME_TIME() IF NOT sDegenatronGamesData.sGameData.bFlashedOnce DG_DEFENDER_DRAW_PIXELSPACE_RECT(DEGENATRON_GAMES_GET_SCREEN_CENTER(), DEGENATRON_GAMES_GET_SCREEN_SIZE(), sDegenatronGamesData.rgbaWhite) sDegenatronGamesData.sGameData.bFlashedOnce = TRUE ELIF NOT sDegenatronGamesData.sGameData.bFlashedTwice AND sDegenatronGamesData.sGameData.iFlashTime > ciDEGENATRON_GAMES_PLAYER_FLASH_TIME/2 DG_DEFENDER_DRAW_PIXELSPACE_RECT(DEGENATRON_GAMES_GET_SCREEN_CENTER(), DEGENATRON_GAMES_GET_SCREEN_SIZE(), sDegenatronGamesData.rgbaWhite) sDegenatronGamesData.sGameData.bFlashedTwice = TRUE ENDIF ENDIF IF sDGDefenderData.sLevelData.bObjectiveJustCaptured sDegenatronGamesData.sGameData.iFlashTime += DEGENATRON_GAMES_FRAME_TIME() IF NOT sDegenatronGamesData.sGameData.bFlashedOnce DG_DEFENDER_DRAW_PIXELSPACE_RECT(DEGENATRON_GAMES_GET_SCREEN_CENTER(), DEGENATRON_GAMES_GET_SCREEN_SIZE(), sDegenatronGamesData.rgbaGreen) sDegenatronGamesData.sGameData.bFlashedOnce = TRUE ELIF NOT sDegenatronGamesData.sGameData.bFlashedTwice AND sDegenatronGamesData.sGameData.iFlashTime > ciDEGENATRON_GAMES_PLAYER_FLASH_TIME/2 DG_DEFENDER_DRAW_PIXELSPACE_RECT(DEGENATRON_GAMES_GET_SCREEN_CENTER(), DEGENATRON_GAMES_GET_SCREEN_SIZE(), sDegenatronGamesData.rgbaGreen) sDegenatronGamesData.sGameData.bFlashedTwice = TRUE ENDIF ENDIF ENDPROC PROC DG_DEFENDER_DRAW_ROCKS() //DRAW ROCKS INT iRock REPEAT ciDG_DEFENDER_GROUND_ROCK_AMOUNT iRock DEGENATRON_GAMES_TEXT_ITEM eRock eRock = INT_TO_ENUM(DEGENATRON_GAMES_TEXT_ITEM, ENUM_TO_INT(DEGENATRON_GAMES_TEXT_ITEM_DEFENDER_SCENE_01)+iRock) DG_DEFENDER_DRAW_PIXELSPACE_SPRITE(eRock,DG_DEFENDER_GET_ROCK_POSITION(iRock), DG_DEFENDER_GET_GROUND_ROCK_SIZE(), sDegenatronGamesData.rgbaBrown, TRUE) ENDREPEAT //DRAW GROUND DG_DEFENDER_DRAW_PIXELSPACE_RECT(DG_DEFENDER_GROUND_POSITION(), DG_DEFENDER_GROUND_SIZE(), sDegenatronGamesData.rgbaBrown,DEFAULT) ENDPROC PROC DG_DEFENDER_CLIENT_STATE_DRAW() DG_DEFENDER_DRAW_BACKGROUND() DEGENATRON_GAMES_DRAW_SCORE_BAR(TRUE,TRUE) SWITCH sDGDefenderData.sLevelData.eLevelState CASE DG_DEFENDER_STATE_LEVEL_INIT BREAK CASE DG_DEFENDER_STATE_LEVEL_UPDATE CASE DG_DEFENDER_STATE_LEVEL_COMPLETED CASE DG_DEFENDER_STATE_LEVEL_DEAD CASE DG_DEFENDER_STATE_LEVEL_WAIT_TIME DG_DEFENDER_DRAW_ROCKS() IF sDGDefenderData.bUpdateFirstFrameDone DG_DEFENDER_DRAW_PLAYER() DG_DEFENDER_DRAW_ENEMIES() DG_DEFENDER_DRAW_OBJECTIVES() ELSE sDGDefenderData.bUpdateFirstFrameDone = TRUE ENDIF DEGENATRON_GAMES_DRAW_FAIL_SUCCESS_TEXT() BREAK CASE DG_DEFENDER_STATE_LEVEL_END BREAK ENDSWITCH ENDPROC //**************************************************// //* UPDATE - DEFENDER OF THE FAITH *// //**************************************************// FUNC FLOAT EASE_IN_OUT_EXPO(FLOAT t) IF T < 0.5 RETURN (POW( 2, 16 * t ) - 1) / 510 ELSE RETURN 1 - 0.5 * POW( 2, -16 * (t - 0.5) ) ENDIF ENDFUNC FUNC FLOAT EASE_IN_OUT_SINE(FLOAT t) IF t < 0.5 RETURN 2 * t * t ELSE RETURN t * (4 - 2 * t) - 1 ENDIF ENDFUNC FUNC BOOL DG_DEFENDER_CHECK_ENEMY_COLLISION(INT iEnemy, BOOL bForSpawn = FALSE) VECTOR_2D playerScreenPosition = DG_DEFENDER_GET_PLAYER_SCREEN_POSITION() VECTOR_2D playerSize = MULTIPLY_VECTOR_2D(DG_DEFENDER_GET_PLAYER_SIZE(), 1.0+2.0*BOOL_TO_INT(bForSpawn)) VECTOR_2D enemyScreenPosition = DG_DEFENDER_GET_ENEMY_SCREEN_POSITION(iEnemy) VECTOR_2D enemySize = DG_DEFENDER_GET_ENEMY_SIZE() IF playerScreenPosition.x-playerSize.x/2 > enemyScreenPosition.x+enemySize.x/2 OR playerScreenPosition.x+playerSize.x/2 < enemyScreenPosition.x-enemySize.x/2 OR playerScreenPosition.y-playerSize.y/2 > enemyScreenPosition.y+enemySize.y/2 OR playerScreenPosition.y+playerSize.y/2 < enemyScreenPosition.y-enemySize.y/2 RETURN FALSE ENDIF RETURN TRUE ENDFUNC FUNC BOOL DG_DEFENDER_CHECK_OBJECTIVE_COLLISION(INT iObjective, BOOL bForSpawn = FALSE) VECTOR_2D playerScreenPosition = DG_DEFENDER_GET_PLAYER_SCREEN_POSITION() VECTOR_2D playerSize = MULTIPLY_VECTOR_2D(DG_DEFENDER_GET_PLAYER_SIZE(), 1.0+2.0*BOOL_TO_INT(bForSpawn)) VECTOR_2D objectiveScreenPosition = DG_DEFENDER_GET_OBJECTIVE_SCREEN_POSITION(iObjective) VECTOR_2D objectiveSize = DG_DEFENDER_GET_OBJECTIVE_SIZE() IF playerScreenPosition.x-playerSize.x/2 > objectiveScreenPosition.x+objectiveSize.x/2 OR playerScreenPosition.x+playerSize.x/2 < objectiveScreenPosition.x-objectiveSize.x/2 OR playerScreenPosition.y-playerSize.y/2 > objectiveScreenPosition.y+objectiveSize.y/2 OR playerScreenPosition.y+playerSize.y/2 < objectiveScreenPosition.y-objectiveSize.y/2 RETURN FALSE ENDIF RETURN TRUE ENDFUNC FUNC BOOL DG_DEFENDER_CHECK_OBJECTIVE_ENEMY_COLLISION(INT iObjective, INT iEnemy) VECTOR_2D enemyScreenPosition = DG_DEFENDER_GET_ENEMY_SCREEN_POSITION(iEnemy) VECTOR_2D enemySize = DG_DEFENDER_GET_ENEMY_SIZE() VECTOR_2D objectiveScreenPosition = DG_DEFENDER_GET_OBJECTIVE_SCREEN_POSITION(iObjective) VECTOR_2D objectiveSize = DG_DEFENDER_GET_OBJECTIVE_SIZE() IF enemyScreenPosition.x-enemySize.x/2 > objectiveScreenPosition.x+objectiveSize.x/2 OR enemyScreenPosition.x+enemySize.x/2 < objectiveScreenPosition.x-objectiveSize.x/2 OR enemyScreenPosition.y-enemySize.y/2 > objectiveScreenPosition.y+objectiveSize.y/2 OR enemyScreenPosition.y+enemySize.y/2 < objectiveScreenPosition.y-objectiveSize.y/2 RETURN FALSE ENDIF RETURN TRUE ENDFUNC PROC DG_DEFENDER_UPDATE_COLLISIONS() INT iEnemy REPEAT sDGDefenderData.sLevelData.iEnemiesAmount iEnemy sDGDefenderData.sEnemyData[iEnemy].bCollision = DG_DEFENDER_CHECK_ENEMY_COLLISION(iEnemy) ENDREPEAT INT iObjective REPEAT sDGDefenderData.sLevelData.iObjectivesAmount iObjective IF DG_DEFENDER_GET_OBJECTIVE_IS_ACTIVE(iObjective) sDGDefenderData.sObjectiveData[iObjective].bCollision = DG_DEFENDER_CHECK_OBJECTIVE_COLLISION(iObjective) ENDIF ENDREPEAT ENDPROC PROC DG_DEFENDER_UPDATE_PLAYER() VECTOR_2D padInput padInput.x = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_LEFT) - GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT) - GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_X) padInput.y = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_UP) - GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_DOWN) - GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_Y) padInput.x = CLAMP(padInput.x,-1.0,1.0) padInput.y = CLAMP(padInput.y,-1.0,1.0) IF sDegenatronGamesData.sGameData.iLevel = 1 IF padInput.x > 0.0 OR padInput.y < 0.0 OR padInput.y > 0.0 CDEBUG1LN(DEBUG_MINIGAME, "[DEGENATRON_GAMES] DG_DEFENDER_UPDATE_PLAYER - Keep The Faith Challenge Failed - padInput.x ",padInput.x," padInput.y ",padInput.y) sDGDefenderData.bKeepFaithAward = FALSE ENDIF ENDIF IF padInput.x != 0.0 ARCADE_GAMES_SOUND_PLAY_LOOP(ARCADE_GAMES_SOUND_DEGENATRON_TICKY_FLY_LOOP) ELSE ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_DEGENATRON_TICKY_FLY_LOOP) ENDIF sDGDefenderData.sPlayerData.vPlayerGameAcceleration.x = CLAMP(sDGDefenderData.sPlayerData.vPlayerGameAcceleration.x + padInput.x*DEGENATRON_GAMES_FRAME_TIME()/500,-1.0,1.0) // 2 seconds to go full accel sDGDefenderData.sPlayerData.vPlayerGameAcceleration.y = padInput.y IF sDGDefenderData.sPlayerData.vPlayerGameAcceleration.x <= 0.3 AND sDGDefenderData.sPlayerData.vPlayerGameAcceleration.x > 0.0 IF sDGDefenderData.sPlayerData.vPlayerDirection.x > 0.0 sDGDefenderData.sPlayerData.vPlayerDirection.x -= DEGENATRON_GAMES_FRAME_TIME()/500.0 sDGDefenderData.sPlayerData.vPlayerDirection.x = CLAMP(sDGDefenderData.sPlayerData.vPlayerDirection.x,0.0,1.0) ELSE sDGDefenderData.sPlayerData.vPlayerDirection.x = 0.0 ENDIF ELIF sDGDefenderData.sPlayerData.vPlayerGameAcceleration.x >= -0.3 AND sDGDefenderData.sPlayerData.vPlayerGameAcceleration.x < 0.0 IF sDGDefenderData.sPlayerData.vPlayerDirection.x < 0.0 sDGDefenderData.sPlayerData.vPlayerDirection.x += DEGENATRON_GAMES_FRAME_TIME()/500.0 sDGDefenderData.sPlayerData.vPlayerDirection.x = CLAMP(sDGDefenderData.sPlayerData.vPlayerDirection.x,-1.0,0.0) ELSE sDGDefenderData.sPlayerData.vPlayerDirection.x = 0.0 ENDIF ELIF sDGDefenderData.sPlayerData.vPlayerGameAcceleration.x <= 0.5 AND sDGDefenderData.sPlayerData.vPlayerGameAcceleration.x > 0.3 IF sDGDefenderData.sPlayerData.vPlayerDirection.x < 0.2 sDGDefenderData.sPlayerData.vPlayerDirection.x += DEGENATRON_GAMES_FRAME_TIME()/500.0 sDGDefenderData.sPlayerData.vPlayerDirection.x = CLAMP(sDGDefenderData.sPlayerData.vPlayerDirection.x,-1.0,0.2) ELIF sDGDefenderData.sPlayerData.vPlayerDirection.x > 0.2 sDGDefenderData.sPlayerData.vPlayerDirection.x -= DEGENATRON_GAMES_FRAME_TIME()/500.0 sDGDefenderData.sPlayerData.vPlayerDirection.x = CLAMP(sDGDefenderData.sPlayerData.vPlayerDirection.x,0.2,1.0) ELSE sDGDefenderData.sPlayerData.vPlayerDirection.x = 0.2 ENDIF ELIF sDGDefenderData.sPlayerData.vPlayerGameAcceleration.x >= -0.5 AND sDGDefenderData.sPlayerData.vPlayerGameAcceleration.x < -0.3 IF sDGDefenderData.sPlayerData.vPlayerDirection.x > -0.2 sDGDefenderData.sPlayerData.vPlayerDirection.x -= DEGENATRON_GAMES_FRAME_TIME()/500.0 sDGDefenderData.sPlayerData.vPlayerDirection.x = CLAMP(sDGDefenderData.sPlayerData.vPlayerDirection.x,-0.2,1.0) ELIF sDGDefenderData.sPlayerData.vPlayerDirection.x < -0.2 sDGDefenderData.sPlayerData.vPlayerDirection.x += DEGENATRON_GAMES_FRAME_TIME()/500.0 sDGDefenderData.sPlayerData.vPlayerDirection.x = CLAMP(sDGDefenderData.sPlayerData.vPlayerDirection.x,-1.0,-0.2) ELSE sDGDefenderData.sPlayerData.vPlayerDirection.x = -0.2 ENDIF ELIF sDGDefenderData.sPlayerData.vPlayerGameAcceleration.x > 0.5 IF sDGDefenderData.sPlayerData.vPlayerDirection.x < 1.0 sDGDefenderData.sPlayerData.vPlayerDirection.x += DEGENATRON_GAMES_FRAME_TIME()/500.0 sDGDefenderData.sPlayerData.vPlayerDirection.x = CLAMP(sDGDefenderData.sPlayerData.vPlayerDirection.x,0.2,1.0) ELSE sDGDefenderData.sPlayerData.vPlayerDirection.x = 1.0 ENDIF ELIF sDGDefenderData.sPlayerData.vPlayerGameAcceleration.x < -0.5 IF sDGDefenderData.sPlayerData.vPlayerDirection.x > -1.0 sDGDefenderData.sPlayerData.vPlayerDirection.x -= DEGENATRON_GAMES_FRAME_TIME()/500.0 sDGDefenderData.sPlayerData.vPlayerDirection.x = CLAMP(sDGDefenderData.sPlayerData.vPlayerDirection.x,-1.0,-0.2) ELSE sDGDefenderData.sPlayerData.vPlayerDirection.x = -1.0 ENDIF ENDIF sDGDefenderData.sPlayerData.vPlayerDirection.y = sDGDefenderData.sPlayerData.vPlayerGameAcceleration.y sDGDefenderData.sPlayerData.vPlayerGamePos.x += sDGDefenderData.sPlayerData.vPlayerDirection.x * ciDG_DEFENDER_PLAYER_SPEED*sDGDefenderData.sLevelData.fPlayerSpeedMultiplier * DEGENATRON_GAMES_FRAME_TIME()/1000.0 sDGDefenderData.sPlayerData.vPlayerGamePos.x = sDGDefenderData.sPlayerData.vPlayerGamePos.x%DG_DEFENDER_GET_MAP_SIZE() IF sDGDefenderData.sPlayerData.vPlayerGamePos.x < 0 sDGDefenderData.sPlayerData.vPlayerGamePos.x += DG_DEFENDER_GET_MAP_SIZE() ENDIF sDGDefenderData.sPlayerData.vPlayerGamePos.y += sDGDefenderData.sPlayerData.vPlayerDirection.y * ciDG_DEFENDER_PLAYER_SPEED * DEGENATRON_GAMES_FRAME_TIME()/1000.0 sDGDefenderData.sPlayerData.vPlayerGamePos.y = CLAMP(sDGDefenderData.sPlayerData.vPlayerGamePos.y,0,DEGENATRON_GAMES_GET_SCREEN_HEIGHT()) // UPDATE SCREEN POSITION // VECTOR_2D screenCenter = DEGENATRON_GAMES_GET_SCREEN_CENTER() VECTOR_2D screenSize = DEGENATRON_GAMES_GET_SCREEN_SIZE() IF sDGDefenderData.sPlayerData.vPlayerGameAcceleration.x >= 0 sDGDefenderData.sPlayerData.vPlayerScreenPosRate.x = CLAMP(sDGDefenderData.sPlayerData.vPlayerScreenPosRate.x + cfDG_DEFENDER_PLAYER_SCREEN_RATE_SPEED*DEGENATRON_GAMES_FRAME_TIME()/500.0,-1.0,1.0) ELSE sDGDefenderData.sPlayerData.vPlayerScreenPosRate.x = CLAMP(sDGDefenderData.sPlayerData.vPlayerScreenPosRate.x - cfDG_DEFENDER_PLAYER_SCREEN_RATE_SPEED*DEGENATRON_GAMES_FRAME_TIME()/500.0,-1.0,1.0) ENDIF sDGDefenderData.sPlayerData.vPlayerScreenPosRate.y = CLAMP(sDGDefenderData.sPlayerData.vPlayerGamePos.y/DEGENATRON_GAMES_GET_SCREEN_HEIGHT(),0.0,1.0) sDGDefenderData.sPlayerData.vPlayerScreenPos.x = screenCenter.x - screenSize.x/2 + DEGENATRON_GAMES_GET_SCREEN_WIDTH()*(cfDG_DEFENDER_PLAYER_MIN_SCREEN_POS + EASE_IN_OUT_EXPO((sDGDefenderData.sPlayerData.vPlayerScreenPosRate.x+1)/2.0)*(CFDG_DEFENDER_PLAYER_MAX_SCREEN_POS-CFDG_DEFENDER_PLAYER_MIN_SCREEN_POS)) sDGDefenderData.sPlayerData.vPlayerScreenPos.y = screenCenter.y + screenSize.y/2 - cfDG_DEFENDER_PLAYER_HEIGHT/2.0 - (DEGENATRON_GAMES_GET_SCREEN_HEIGHT()-cfDG_DEFENDER_PLAYER_HEIGHT-ciDEGENATRON_GAMES_SCORE_HEIGHT)*EASE_IN_OUT_SINE(sDGDefenderData.sPlayerData.vPlayerScreenPosRate.y) ENDPROC PROC DG_DEFENDER_UPDATE_ENEMY(INT iEnemy) VECTOR_2D enemySize = DG_DEFENDER_GET_ENEMY_SIZE() VECTOR_2D enemyPosition = DG_DEFENDER_GET_ENEMY_POSITION(iEnemy) VECTOR_2D newPosition newPosition = ADD_VECTOR_2D(enemyPosition, MULTIPLY_VECTOR_2D(NORMALISE_VECTOR_2D(sDGDefenderData.sEnemyData[iEnemy].vEnemyDirection),(ciDG_DEFENDER_ENEMY_SPEED*DEGENATRON_GAMES_FRAME_TIME()/1000.0))) IF newPosition.y > DEGENATRON_GAMES_GET_SCREEN_HEIGHT() - enemySize.y/2 - ciDEGENATRON_GAMES_SCORE_HEIGHT sDGDefenderData.sEnemyData[iEnemy].vEnemyDirection.y = -ABSF(sDGDefenderData.sEnemyData[iEnemy].vEnemyDirection.y) newPosition = ADD_VECTOR_2D(enemyPosition, NORMALISE_VECTOR_2D(sDGDefenderData.sEnemyData[iEnemy].vEnemyDirection)) ELIF newPosition.y < 0.0 + enemySize.y/2 sDGDefenderData.sEnemyData[iEnemy].vEnemyDirection.y = ABSF(sDGDefenderData.sEnemyData[iEnemy].vEnemyDirection.y) newPosition = ADD_VECTOR_2D(enemyPosition, NORMALISE_VECTOR_2D(sDGDefenderData.sEnemyData[iEnemy].vEnemyDirection)) ENDIF newPosition.x = newPosition.x%DG_DEFENDER_GET_MAP_SIZE() IF newPosition.x < 0 newPosition.x += DG_DEFENDER_GET_MAP_SIZE() ENDIF sDGDefenderData.sEnemyData[iEnemy].vEnemyGamePos = newPosition // UPDATE SCREEN POSITION // VECTOR_2D screenCenter = DEGENATRON_GAMES_GET_SCREEN_CENTER() VECTOR_2D screenSize = DEGENATRON_GAMES_GET_SCREEN_SIZE() sDGDefenderData.sEnemyData[iEnemy].vEnemyScreenPos.x = screenCenter.x - screenSize.x/2 + (enemyPosition.x + sDGDefenderData.sPlayerData.vPlayerGamePos.x)%DG_DEFENDER_GET_MAP_SIZE() sDGDefenderData.sEnemyData[iEnemy].vEnemyScreenPos.y = screenCenter.y + screenSize.y/2 - enemyPosition.y ENDPROC PROC DG_DEFENDER_UPDATE_OBJECTIVE(INT iObjective) VECTOR_2D objectiveSize = DG_DEFENDER_GET_OBJECTIVE_SIZE() VECTOR_2D objectivePosition = DG_DEFENDER_GET_OBJECTIVE_POSITION(iObjective) VECTOR_2D newPosition newPosition = ADD_VECTOR_2D(objectivePosition, MULTIPLY_VECTOR_2D(NORMALISE_VECTOR_2D(sDGDefenderData.sObjectiveData[iObjective].vObjectiveDirection),(cfDG_DEFENDER_OBJECTIVE_SPEED*DEGENATRON_GAMES_FRAME_TIME()/1000.0))) IF newPosition.y > DEGENATRON_GAMES_GET_SCREEN_HEIGHT() - objectiveSize.y/2 - ciDEGENATRON_GAMES_SCORE_HEIGHT sDGDefenderData.sObjectiveData[iObjective].vObjectiveDirection.y = -ABSF(sDGDefenderData.sObjectiveData[iObjective].vObjectiveDirection.y) newPosition = ADD_VECTOR_2D(objectivePosition, NORMALISE_VECTOR_2D(sDGDefenderData.sObjectiveData[iObjective].vObjectiveDirection)) ELIF newPosition.y < 0.0 + objectiveSize.y/2 sDGDefenderData.sObjectiveData[iObjective].vObjectiveDirection.y = ABSF(sDGDefenderData.sObjectiveData[iObjective].vObjectiveDirection.y) newPosition = ADD_VECTOR_2D(objectivePosition, NORMALISE_VECTOR_2D(sDGDefenderData.sObjectiveData[iObjective].vObjectiveDirection)) ENDIF newPosition.x = newPosition.x%DG_DEFENDER_GET_MAP_SIZE() IF newPosition.x < 0 newPosition.x += DG_DEFENDER_GET_MAP_SIZE() ENDIF sDGDefenderData.sObjectiveData[iObjective].vObjectiveGamePos = newPosition // UPDATE SCREEN POSITION // VECTOR_2D screenCenter = DEGENATRON_GAMES_GET_SCREEN_CENTER() VECTOR_2D screenSize = DEGENATRON_GAMES_GET_SCREEN_SIZE() sDGDefenderData.sObjectiveData[iObjective].vObjectiveScreenPos.x = screenCenter.x - screenSize.x/2 + (objectivePosition.x + sDGDefenderData.sPlayerData.vPlayerGamePos.x)%DG_DEFENDER_GET_MAP_SIZE() sDGDefenderData.sObjectiveData[iObjective].vObjectiveScreenPos.y = screenCenter.y + screenSize.y/2 - objectivePosition.y ENDPROC PROC DG_DEFENDER_UPDATE_ENEMIES() INT iEnemy REPEAT sDGDefenderData.sLevelData.iEnemiesAmount iEnemy DG_DEFENDER_UPDATE_ENEMY(iEnemy) ENDREPEAT ENDPROC PROC DG_DEFENDER_UPDATE_OBJECTIVES() INT iObjective REPEAT sDGDefenderData.sLevelData.iObjectivesAmount iObjective IF DG_DEFENDER_GET_OBJECTIVE_IS_ACTIVE(iObjective) DG_DEFENDER_UPDATE_OBJECTIVE(iObjective) ENDIF ENDREPEAT ENDPROC PROC DG_DEFENDER_UPDATE_LEVEL() INT iEnemy REPEAT sDGDefenderData.sLevelData.iEnemiesAmount iEnemy IF sDGDefenderData.sEnemyData[iEnemy].bCollision ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_DEGENATRON_EXPLODE) sDegenatronGamesData.sGameData.bPlayerIsDead = TRUE sDegenatronGamesData.bShouldDoHeavyShake = TRUE AND sDegenatronGamesData.iMachineBashed = 0 sDegenatronGamesData.sGameData.iFlashTime = 0 sDegenatronGamesData.sGameData.bFlashedOnce = FALSE sDegenatronGamesData.sGameData.bFlashedTwice = FALSE EXIT ENDIF ENDREPEAT INT iObjective REPEAT sDGDefenderData.sLevelData.iObjectivesAmount iObjective IF DG_DEFENDER_GET_OBJECTIVE_IS_ACTIVE(iObjective) IF sDGDefenderData.sObjectiveData[iObjective].bCollision ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_DEGENATRON_1POINT) sDGDefenderData.sObjectiveData[iObjective].bActive = FALSE sDegenatronGamesData.sGameData.iObjectives-- sDegenatronGamesData.bShouldDoMidShake = TRUE AND sDegenatronGamesData.iMachineBashed = 0 IF sDegenatronGamesData.sGameData.iObjectives = 0 ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_DEGENATRON_GENERATE) sDGDefenderData.sLevelData.bObjectiveJustCaptured = TRUE sDegenatronGamesData.sGameData.iFlashTime = 0 sDegenatronGamesData.sGameData.bFlashedOnce = FALSE sDegenatronGamesData.sGameData.bFlashedTwice = FALSE ENDIF sDegenatronGamesData.sGameData.iScore += ciDG_DEFENDER_OBJECTIVE_SCORE sDegenatronGamesData.sTelemetry.kills++ ENDIF ENDIF ENDREPEAT IF sDGDefenderData.sLevelData.bObjectiveJustCaptured IF sDegenatronGamesData.sGameData.bFlashedOnce AND sDegenatronGamesData.sGameData.bFlashedTwice sDegenatronGamesData.sGameData.iFlashTime = 0 sDGDefenderData.sLevelData.bObjectiveJustCaptured = FALSE sDegenatronGamesData.sGameData.bFlashedOnce = FALSE sDegenatronGamesData.sGameData.bFlashedTwice = FALSE ENDIF ENDIF sDGDefenderData.sLevelData.iScoreTimer -= DEGENATRON_GAMES_FRAME_TIME() IF sDGDefenderData.sLevelData.iScoreTimer < 0 IF sDegenatronGamesData.sGameData.iScore > 0 sDegenatronGamesData.sGameData.iScore-- ENDIF sDGDefenderData.sLevelData.iScoreTimer += sDGDefenderData.sLevelData.iScoreTimerMax ENDIF ENDPROC PROC DG_DEFENDER_UPDATE_LEVEL_STATE() SWITCH sDGDefenderData.sLevelData.eLevelState CASE DG_DEFENDER_STATE_LEVEL_INIT sDGDefenderData.sLevelData.eLevelState = DG_DEFENDER_STATE_LEVEL_UPDATE BREAK CASE DG_DEFENDER_STATE_LEVEL_UPDATE IF sDegenatronGamesData.sGameData.bPlayerIsDead sDGDefenderData.sLevelData.eLevelState = DG_DEFENDER_STATE_LEVEL_DEAD ENDIF IF sDegenatronGamesData.sGameData.iObjectives = 0 sDGDefenderData.sLevelData.eLevelState = DG_DEFENDER_STATE_LEVEL_COMPLETED ENDIF #IF IS_DEBUG_BUILD IF sDGDefenderData.bWidgetSetLevel sDGDefenderData.bWidgetSetLevel = FALSE sDGDefenderData.sLevelData.eLevelState = DG_DEFENDER_STATE_LEVEL_INIT ENDIF #ENDIF BREAK CASE DG_DEFENDER_STATE_LEVEL_COMPLETED sDGDefenderData.sLevelData.eLevelState = DG_DEFENDER_STATE_LEVEL_WAIT_TIME BREAK CASE DG_DEFENDER_STATE_LEVEL_DEAD sDGDefenderData.sLevelData.eLevelState = DG_DEFENDER_STATE_LEVEL_WAIT_TIME BREAK CASE DG_DEFENDER_STATE_LEVEL_WAIT_TIME IF sDegenatronGamesData.sGameData.iWaitTime > ciDEGENATRON_GAMES_WAIT_TIME_DEAD IF sDegenatronGamesData.sGameData.bPlayerIsDead IF sDegenatronGamesData.sGameData.bFlashedOnce AND sDegenatronGamesData.sGameData.bFlashedTwice AND sDegenatronGamesData.sGameData.iFlashTime > ciDEGENATRON_GAMES_PLAYER_FLASH_TIME IF sDegenatronGamesData.sGameData.iLifes = 0 sDGDefenderData.sLevelData.eLevelState = DG_DEFENDER_STATE_LEVEL_END ELSE sDGDefenderData.sLevelData.eLevelState = DG_DEFENDER_STATE_LEVEL_INIT ENDIF ENDIF ELSE sDGDefenderData.sLevelData.eLevelState = DG_DEFENDER_STATE_LEVEL_INIT ENDIF ENDIF BREAK CASE DG_DEFENDER_STATE_LEVEL_END sDGDefenderData.sLevelData.eLevelState = DG_DEFENDER_STATE_LEVEL_INIT BREAK ENDSWITCH ENDPROC //**************************************************// //* DEBUG INFO - DEFENDER OF THE FAITH *// //**************************************************// #IF IS_DEBUG_BUILD PROC __DG_DEFENDER_PRINT_DEBUG_LEVEL_INFO INT iLine = 0 DEBUG_TEXT_INT_IN_SCREEN("iMapTiles ",sDGDefenderData.sLevelData.iMapTiles,0.16,0.05+0.01*iLine) iLine++ DEBUG_TEXT_INT_IN_SCREEN("iEnemiesAmount ",sDGDefenderData.sLevelData.iEnemiesAmount,0.16,0.05+0.01*iLine) iLine++ DEBUG_TEXT_INT_IN_SCREEN("iObjectivesAmount ",sDGDefenderData.sLevelData.iObjectivesAmount,0.16,0.05+0.01*iLine) iLine++ DEBUG_TEXT_STRING_IN_SCREEN("eLevelState ",DG_DEFENDER_STATE_LEVEL_TO_STRING(sDGDefenderData.sLevelData.eLevelState),0.16,0.05+0.01*iLine) iLine++ ENDPROC PROC __DG_DEFENDER_PRINT_DEBUG_PLAYER_INFO INT iLine = 0 DEBUG_TEXT_VECTOR_2D_IN_SCREEN("vPlayerGamePos ",sDGDefenderData.sPlayerData.vPlayerGamePos,0.31,0.05+0.01*iLine) iLine++ DEBUG_TEXT_VECTOR_2D_IN_SCREEN("vPlayerGameAcceleration ",sDGDefenderData.sPlayerData.vPlayerGameAcceleration,0.31,0.05+0.01*iLine) iLine++ DEBUG_TEXT_VECTOR_2D_IN_SCREEN("vPlayerDirection ",sDGDefenderData.sPlayerData.vPlayerDirection,0.31,0.05+0.01*iLine) iLine++ DEBUG_TEXT_VECTOR_2D_IN_SCREEN("vPlayerScreenPosRate ",sDGDefenderData.sPlayerData.vPlayerScreenPosRate,0.31,0.05+0.01*iLine) iLine++ DEBUG_TEXT_VECTOR_2D_IN_SCREEN("vPlayerScreenPos ",sDGDefenderData.sPlayerData.vPlayerScreenPos,0.31,0.05+0.01*iLine) iLine++ ENDPROC PROC __DG_DEFENDER_PRINT_DEBUG_ENEMIES_INFO INT iEnemy INT iLine = 0 REPEAT sDGDefenderData.sLevelData.iEnemiesAmount iEnemy TEXT_LABEL_63 output output = "enemy pos " output += iEnemy INT r = 255 INT g = 255*BOOL_TO_INT(NOT sDGDefenderData.sEnemyData[iEnemy].bCollision) INT b = 255*BOOL_TO_INT(NOT sDGDefenderData.sEnemyData[iEnemy].bCollision) DEBUG_TEXT_VECTOR_2D_IN_SCREEN(output,sDGDefenderData.sEnemyData[iEnemy].vEnemyGamePos,0.46,0.05+0.01*iLine,r,g,b) iLine++ ENDREPEAT ENDPROC PROC __DG_DEFENDER_PRINT_DEBUG_OBJECTIVES_INFO INT iObjective INT iLine = 0 REPEAT sDGDefenderData.sLevelData.iObjectivesAmount iObjective TEXT_LABEL_63 output output = "objective " output += iObjective INT r = 255 INT g = 255*BOOL_TO_INT(NOT sDGDefenderData.sObjectiveData[iObjective].bCollision) INT b = 255*BOOL_TO_INT(NOT sDGDefenderData.sObjectiveData[iObjective].bCollision) DEBUG_TEXT_VECTOR_2D_IN_SCREEN(output,sDGDefenderData.sObjectiveData[iObjective].vObjectiveGamePos,0.61,0.05+0.01*iLine,r,g,b) iLine++ ENDREPEAT ENDPROC #ENDIF //**************************************************// //* INIT - DEFENDER OF THE FAITH *// //**************************************************// PROC DG_DEFENDER_INIT_LEVEL(INT iLevel) IF iLevel > ciDG_DEFENDER_MAX_LEVEL iLevel = ciDG_DEFENDER_MAX_LEVEL ENDIF sDGDefenderData.sLevelData.iMapTiles = FLOOR(2+TO_FLOAT(iLevel)*0.5) sDGDefenderData.sLevelData.iEnemiesAmount = FLOOR(3+2*TO_FLOAT(iLevel)*1.5) sDGDefenderData.sLevelData.iObjectivesAmount = 2*iLevel sDGDefenderData.sLevelData.iScoreTimerMax = CLAMP_INT(sDGDefenderData.iScoreTimerDecrementMax-sDGDefenderData.iScoreTimerDecrementStep*iLevel,sDGDefenderData.iScoreTimerDecrementMin,sDGDefenderData.iScoreTimerDecrementMax) sDGDefenderData.sLevelData.fPlayerSpeedMultiplier = CLAMP(sDGDefenderData.fPlayerSpeedMultiplayerMin+sDGDefenderData.fPlayerSpeedMultiplayerStep*iLevel,sDGDefenderData.fPlayerSpeedMultiplayerMin,sDGDefenderData.fPlayerSpeedMultiplayerMax) sDegenatronGamesData.sGameData.iObjectives = sDGDefenderData.sLevelData.iObjectivesAmount sDegenatronGamesData.sGameData.iFlashTime = 0 sDegenatronGamesData.sGameData.iWaitTime = 0 sDegenatronGamesData.sGameData.bFlashedOnce = FALSE sDegenatronGamesData.sGameData.bFlashedTwice = FALSE sDegenatronGamesData.sGameData.bPlayerIsDead = FALSE sDGDefenderData.sLevelData.bObjectiveJustCaptured = FALSE sDGDefenderData.bUpdateFirstFrameDone = FALSE sDGDefenderData.sLevelData.iScoreTimer = sDGDefenderData.sLevelData.iScoreTimerMax sDegenatronGamesData.sTelemetry.level = iLevel ENDPROC PROC DG_DEFENDER_INIT_PLAYER() sDGDefenderData.sPlayerData.vPlayerGamePos = DEGENATRON_GAMES_GET_SCREEN_CENTER() sDGDefenderData.sPlayerData.vPlayerScreenPos = DEGENATRON_GAMES_GET_SCREEN_CENTER() sDGDefenderData.sPlayerData.vPlayerScreenPosRate = INIT_VECTOR_2D(0.55,0.5) sDGDefenderData.sPlayerData.vPlayerGameAcceleration = INIT_VECTOR_2D(0.0,0.0) sDGDefenderData.sPlayerData.vPlayerDirection = INIT_VECTOR_2D(0.0,0.0) ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_DEGENATRON_ARP1) ENDPROC PROC DG_DEFENDER_INIT_ENEMIES() VECTOR_2D enemySize = DG_DEFENDER_GET_ENEMY_SIZE() INT iEnemy REPEAT sDGDefenderData.sLevelData.iEnemiesAmount iEnemy sDGDefenderData.sEnemyData[iEnemy].vEnemyGamePos = INIT_VECTOR_2D(GET_RANDOM_FLOAT_IN_RANGE(400,DG_DEFENDER_GET_MAP_SIZE()-400),GET_RANDOM_FLOAT_IN_RANGE(0,DEGENATRON_GAMES_GET_SCREEN_HEIGHT() - enemySize.y/2 - ciDEGENATRON_GAMES_SCORE_HEIGHT)) sDGDefenderData.sEnemyData[iEnemy].vEnemyDirection = INIT_VECTOR_2D(GET_RANDOM_FLOAT_IN_RANGE(-1,1),GET_RANDOM_FLOAT_IN_RANGE(-1,1)) sDGDefenderData.sEnemyData[iEnemy].bCollision = FALSE CDEBUG1LN(DEBUG_MINIGAME, "[DEGENATRON_GAMES] DG_DEFENDER_INIT_ENEMIES - iEnemy ",iEnemy," vEnemyGamePos ",sDGDefenderData.sEnemyData[iEnemy].vEnemyGamePos.x,",",sDGDefenderData.sEnemyData[iEnemy].vEnemyGamePos.y) ENDREPEAT ENDPROC PROC DG_DEFENDER_INIT_OBJECTIVES() VECTOR_2D objectiveSize = DG_DEFENDER_GET_OBJECTIVE_SIZE() INT iObjective REPEAT sDGDefenderData.sLevelData.iObjectivesAmount iObjective sDGDefenderData.sObjectiveData[iObjective].vObjectiveGamePos = INIT_VECTOR_2D(GET_RANDOM_FLOAT_IN_RANGE(400,DG_DEFENDER_GET_MAP_SIZE()-400),GET_RANDOM_FLOAT_IN_RANGE(0,DEGENATRON_GAMES_GET_SCREEN_HEIGHT() - objectiveSize.y/2 - ciDEGENATRON_GAMES_SCORE_HEIGHT)) sDGDefenderData.sObjectiveData[iObjective].vObjectiveDirection = INIT_VECTOR_2D(GET_RANDOM_FLOAT_IN_RANGE(-1,1),GET_RANDOM_FLOAT_IN_RANGE(-1,1)) sDGDefenderData.sObjectiveData[iObjective].bActive = TRUE sDGDefenderData.sObjectiveData[iObjective].bCollision = FALSE CDEBUG1LN(DEBUG_MINIGAME, "[DEGENATRON_GAMES] DG_DEFENDER_INIT_ENEMIES - iObjective ",iObjective," vObjectiveGamePos ",sDGDefenderData.sObjectiveData[iObjective].vObjectiveGamePos.x,",",sDGDefenderData.sObjectiveData[iObjective].vObjectiveGamePos.y) ENDREPEAT ENDPROC PROC DG_DEFENDER_INIT_BACKGROUND() sDGDefenderData.iRocksMap[0] = 0 sDGDefenderData.iRocksMap[1] = 0 sDGDefenderData.iRocksMap[2] = 0 ENDPROC PROC DG_DEFENDER_LEVEL_INIT() DG_DEFENDER_INIT_LEVEL(sDegenatronGamesData.sGameData.iLevel) DG_DEFENDER_INIT_PLAYER() DG_DEFENDER_INIT_ENEMIES() DG_DEFENDER_INIT_OBJECTIVES() DG_DEFENDER_INIT_BACKGROUND() ENDPROC PROC DG_DEFENDER_LEVEL_UPDATE() DG_DEFENDER_UPDATE_PLAYER() DG_DEFENDER_UPDATE_ENEMIES() DG_DEFENDER_UPDATE_OBJECTIVES() DG_DEFENDER_UPDATE_COLLISIONS() DG_DEFENDER_UPDATE_LEVEL() ENDPROC PROC DG_DEFENDER_CLIENT_STATE_UPDATE() SWITCH sDGDefenderData.sLevelData.eLevelState CASE DG_DEFENDER_STATE_LEVEL_INIT DG_DEFENDER_LEVEL_INIT() DEGENATRON_GAMES_ANIMATION_SET_STATE(DEGENATRON_GAMES_ANIMATION_STATE_PLAYING) BREAK CASE DG_DEFENDER_STATE_LEVEL_UPDATE DG_DEFENDER_LEVEL_UPDATE() DEGENATRON_GAMES_ANIMATION_SET_STATE(DEGENATRON_GAMES_ANIMATION_STATE_PLAYING) BREAK CASE DG_DEFENDER_STATE_LEVEL_COMPLETED ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_DEGENATRON_TICKY_FLY_LOOP) sDegenatronGamesData.sGameData.iLevel++ DEGENATRON_GAMES_ANIMATION_SET_STATE(DEGENATRON_GAMES_ANIMATION_STATE_LEVEL_COMPLETE) IF sDGDefenderData.bKeepFaithAward DEGENATRON_GAMES_SET_CHALLENGE_COMPLETED(DEGENATRON_GAMES_CHALLENGE_BIT_KEEP_THE_FAITH) ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TSHIRT_HELP(ARCADE_GAME_TSHIRTS_DEGENATRON_RIGHT_KIND_OF_FAITH) sDGDefenderData.bKeepFaithAward = FALSE ENDIF BREAK CASE DG_DEFENDER_STATE_LEVEL_DEAD ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_DEGENATRON_TICKY_FLY_LOOP) sDegenatronGamesData.sGameData.iLifes-- IF sDegenatronGamesData.sGameData.iLifes > 0 DEGENATRON_GAMES_ANIMATION_SET_STATE(DEGENATRON_GAMES_ANIMATION_STATE_DEAD) ELSE ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_DEGENATRON_MUSIC_MAIN_LOOP) ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_DEGENATRON_MUSIC_FAIL) DEGENATRON_GAMES_ANIMATION_SET_STATE(DEGENATRON_GAMES_ANIMATION_STATE_GAMEOVER) ENDIF BREAK CASE DG_DEFENDER_STATE_LEVEL_WAIT_TIME sDegenatronGamesData.sGameData.iWaitTime += DEGENATRON_GAMES_FRAME_TIME() BREAK CASE DG_DEFENDER_STATE_LEVEL_END DEGENATRON_GAMES_ANIMATION_SET_STATE(DEGENATRON_GAMES_ANIMATION_STATE_PLAYING) BREAK ENDSWITCH sDegenatronGamesData.sTelemetry.score = sDegenatronGamesData.sGameData.iScore IF sDegenatronGamesData.sGameData.iScore >= g_sMPTunables.iCH_ARCADE_GAMES_DG_DEFENDER_GLITCH_SCORE AND sDegenatronGamesData.iMachineBashed != 0 ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TSHIRT_HELP(ARCADE_GAME_TSHIRTS_DEGENATRON_PSYCHONAUT) SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_AWARD_GLITCHED_DEGENATRON_TSHIRT, TRUE) ENDIF DG_DEFENDER_UPDATE_LEVEL_STATE() #IF IS_DEBUG_BUILD IF sDegenatronGamesData.bShowHelp __DG_DEFENDER_PRINT_DEBUG_LEVEL_INFO() __DG_DEFENDER_PRINT_DEBUG_PLAYER_INFO() __DG_DEFENDER_PRINT_DEBUG_ENEMIES_INFO() __DG_DEFENDER_PRINT_DEBUG_OBJECTIVES_INFO() ENDIF #ENDIF ENDPROC #IF IS_DEBUG_BUILD PROC DG_DEFENDER_DEBUG_CREATE_WIDGETS START_WIDGET_GROUP("Defender of the Faith") ADD_WIDGET_INT_SLIDER("LEVEL",sDegenatronGamesData.sGameData.iLevel,0,ciDG_DEFENDER_MAX_LEVEL,1) ADD_WIDGET_BOOL("Set Level",sDGDefenderData.bWidgetSetLevel) ADD_WIDGET_INT_SLIDER("Max Time Decrement",sDGDefenderData.iScoreTimerDecrementMax,0,5000,1) ADD_WIDGET_INT_SLIDER("Min Time Decrement",sDGDefenderData.iScoreTimerDecrementMin,0,5000,1) ADD_WIDGET_INT_SLIDER("Step Time Decrement",sDGDefenderData.iScoreTimerDecrementStep,0,5000,1) ADD_WIDGET_FLOAT_SLIDER("Max Player Speed Multiplier",sDGDefenderData.fPlayerSpeedMultiplayerMax,0,5.0,0.1) ADD_WIDGET_FLOAT_SLIDER("Min Player Speed Multiplier",sDGDefenderData.fPlayerSpeedMultiplayerMin,0,5.0,0.1) ADD_WIDGET_FLOAT_SLIDER("Step Player Speed Multiplier",sDGDefenderData.fPlayerSpeedMultiplayerStep,0,5.0,0.01) STOP_WIDGET_GROUP() ENDPROC PROC DG_DEFENDER_DEBUG_UPDATE_WIDGETS ENDPROC #ENDIF