Files
gtav-src/script/dev_ng/shared/include/public/degenatron_games_defender.sch
2025-09-29 00:52:08 +02:00

968 lines
46 KiB
Scheme
Executable File

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