8060 lines
323 KiB
XML
Executable File
8060 lines
323 KiB
XML
Executable File
USING "wizard_arcade_using.sch"
|
|
USING "wizard_arcade_drawing.sch"
|
|
|
|
/// PURPOSE:
|
|
/// Updates the values used for animating sprite sequences
|
|
PROC TWS_UPDATE_ANIM_FRAMES()
|
|
|
|
//Slow anim update
|
|
sPlayerData.iSlowFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
|
|
sPlayerData.iSlowUpdateFrames = FLOOR(sPlayerData.iSlowFrameTimeCounter / cfTWS_SLOW_ANIM_FRAME_TIME)
|
|
sPlayerData.iSlowFrameTimeCounter -= ROUND(cfTWS_SLOW_ANIM_FRAME_TIME * sPlayerData.iSlowUpdateFrames)
|
|
|
|
//Default anim update
|
|
sPlayerData.iDefaultFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
|
|
sPlayerData.iDefaultUpdateFrames = FLOOR(sPlayerData.iDefaultFrameTimeCounter / cfTWS_FAST_ANIM_FRAME_TIME)
|
|
sPlayerData.iDefaultFrameTimeCounter -= ROUND(cfTWS_FAST_ANIM_FRAME_TIME * sPlayerData.iDefaultUpdateFrames)
|
|
|
|
INT i
|
|
FOR i = 0 TO ciTWS_MAX_ENEMIES -1
|
|
|
|
//Slow anim update
|
|
sEnemyData[i].iSlowFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
|
|
sEnemyData[i].iSlowUpdateFrames = FLOOR(sEnemyData[i].iSlowFrameTimeCounter / cfTWS_SLOW_ANIM_FRAME_TIME)
|
|
sEnemyData[i].iSlowFrameTimeCounter -= ROUND(cfTWS_SLOW_ANIM_FRAME_TIME * sEnemyData[i].iSlowUpdateFrames)
|
|
|
|
//Default anim update
|
|
sEnemyData[i].iDefaultFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
|
|
sEnemyData[i].iDefaultUpdateFrames = FLOOR(sEnemyData[i].iDefaultFrameTimeCounter / cfTWS_FAST_ANIM_FRAME_TIME)
|
|
sEnemyData[i].iDefaultFrameTimeCounter -= ROUND(cfTWS_FAST_ANIM_FRAME_TIME * sEnemyData[i].iDefaultUpdateFrames)
|
|
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO ciTWS_MAX_ITEMS -1
|
|
|
|
//Slow anim update
|
|
sItemData[i].iSlowFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
|
|
sItemData[i].iSlowUpdateFrames = FLOOR(sItemData[i].iSlowFrameTimeCounter / cfTWS_SLOW_ANIM_FRAME_TIME)
|
|
sItemData[i].iSlowFrameTimeCounter -= ROUND(cfTWS_SLOW_ANIM_FRAME_TIME * sItemData[i].iSlowUpdateFrames)
|
|
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO ciTWS_MAX_FX -1
|
|
|
|
//Slow anim update
|
|
sFXData[i].iSlowFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
|
|
sFXData[i].iSlowUpdateFrames = FLOOR(sFXData[i].iSlowFrameTimeCounter / cfTWS_FAST_ANIM_FRAME_TIME)
|
|
sFXData[i].iSlowFrameTimeCounter -= ROUND(cfTWS_FAST_ANIM_FRAME_TIME * sFXData[i].iSlowUpdateFrames)
|
|
|
|
ENDFOR
|
|
|
|
//Slow anim update
|
|
sHUDData[TWS_HUD_DIALOGUE_FRAME].iSlowFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
|
|
sHUDData[TWS_HUD_DIALOGUE_FRAME].iSlowUpdateFrames = FLOOR(sHUDData[TWS_HUD_DIALOGUE_FRAME].iSlowFrameTimeCounter / cfTWS_SLOW_ANIM_FRAME_TIME)
|
|
sHUDData[TWS_HUD_DIALOGUE_FRAME].iSlowFrameTimeCounter -= ROUND(cfTWS_SLOW_ANIM_FRAME_TIME * sHUDData[TWS_HUD_DIALOGUE_FRAME].iSlowUpdateFrames)
|
|
|
|
//Default anim update
|
|
sTWSData.iGlobalDefaultFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
|
|
sTWSData.iGlobalDefaultUpdateFrames = FLOOR(sTWSData.iGlobalDefaultFrameTimeCounter / cfTWS_FAST_ANIM_FRAME_TIME)
|
|
sTWSData.iGlobalDefaultFrameTimeCounter -= ROUND(cfTWS_FAST_ANIM_FRAME_TIME * sTWSData.iGlobalDefaultUpdateFrames)
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE eNewState)
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [JS] TWS_SET_CLIENT_STATE - State changed from ",
|
|
TWS_DEBUG_GET_TWS_ARCADE_CLIENT_STATE_AS_STRING(sTWSData.eClientState), " to ", TWS_DEBUG_GET_TWS_ARCADE_CLIENT_STATE_AS_STRING(eNewState))
|
|
|
|
sTWSData.eClientState = eNewState
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_INIT_TELEMETRY(BOOL bResetTime = FALSE)
|
|
|
|
CPRINTLN(DEBUG_MINIGAME, "TWS - Initialising data for telemetry. Reset time? ", bResetTime)
|
|
|
|
sTWSData.sTelemetry.challenges = 0
|
|
|
|
sTWSData.sTelemetry.gameType = HASH("ARCADE_CABINET_CH_WIZARDS_SLEVE")
|
|
|
|
sTWSData.sTelemetry.kills = 0
|
|
sTWSData.sTelemetry.level = 0
|
|
sTWSData.sTelemetry.matchId = -1
|
|
sTWSData.sTelemetry.numPlayers = 1
|
|
sTWSData.sTelemetry.powerUps = 0
|
|
sTWSData.sTelemetry.reward = 0
|
|
sTWSData.sTelemetry.score = 0
|
|
|
|
IF bResetTime
|
|
sTWSData.sTelemetry.timePlayed = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_COLLECT_DATA_FOR_TELEMETRY_AFTER_LEVEL(BOOL bExitingGame = FALSE)
|
|
|
|
CPRINTLN(DEBUG_MINIGAME, "TWS - Collecting data for telemetry.")
|
|
|
|
sTWSData.sTelemetry.score = sPlayerData.iScore // NOT sPlayerData.iHighestScore as we want the score for the last play
|
|
|
|
sTWSData.sTelemetry.timePlayed = GET_GAME_TIMER() - sTWSData.sTelemetry.timePlayed
|
|
IF IS_BITMASK_ENUM_AS_ENUM_SET(sTWSData.eChallengeFlags,TWS_CHALLENGE_BIT_FEELIN_GROGGY)
|
|
AND IS_BITMASK_ENUM_AS_ENUM_SET(sTWSData.eChallengeFlags,TWS_CHALLENGE_BIT_COIN_PURSE_PLATINUM)
|
|
AND IS_BITMASK_ENUM_AS_ENUM_SET(sTWSData.eChallengeFlags,TWS_CHALLENGE_BIT_COIN_PURSE_PLATINUM)
|
|
sTWSData.sTelemetry.reward = ARCADE_GAME_GET_TROPHY_ID_FOR_TELEMETRY(ARCADE_GAME_TROPHY_WIZARDS_RUIN)
|
|
ENDIF
|
|
|
|
sTWSData.sTelemetry.challenges = sTWSData.iChallengesBitsetForTelemetry
|
|
|
|
sTWSData.sTelemetry.matchId = BOOL_TO_INT(bExitingGame)
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_SEND_TELEMETRY()
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] The Wizard's Sleeve Sending Telemetry")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] challenges ",sTWSData.sTelemetry.challenges)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_FEELIN_GROGGY: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_FEELIN_GROGGY)))
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_PLATINUM_SWORD_BRONZE: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_PLATINUM_SWORD_BRONZE)))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_PLATINUM_SWORD_SILVER: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_PLATINUM_SWORD_SILVER)))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_PLATINUM_SWORD_GOLD: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_PLATINUM_SWORD_GOLD)))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_PLATINUM_SWORD_PLATINUM: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_PLATINUM_SWORD_PLATINUM)))
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_COIN_PURSE_BRONZE: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_COIN_PURSE_BRONZE)))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_COIN_PURSE_SILVER: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_COIN_PURSE_SILVER)))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_COIN_PURSE_GOLD: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_COIN_PURSE_GOLD)))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_COIN_PURSE_PLATINUM: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_COIN_PURSE_PLATINUM)))
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] gameType ",sTWSData.sTelemetry.gameType)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] kills ",sTWSData.sTelemetry.kills)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] level ",sTWSData.sTelemetry.level)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] matchId ",sTWSData.sTelemetry.matchId)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] numPlayers ",sTWSData.sTelemetry.numPlayers)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] powerUps ",sTWSData.sTelemetry.powerUps)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] reward ",sTWSData.sTelemetry.reward)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] score ",sTWSData.sTelemetry.score)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] timePlayed ",sTWSData.sTelemetry.timePlayed)
|
|
|
|
IF PLAYER_ID() != INVALID_PLAYER_INDEX()
|
|
SWITCH GET_SIMPLE_INTERIOR_TYPE_LOCAL_PLAYER_IS_IN()
|
|
CASE SIMPLE_INTERIOR_TYPE_AUTO_SHOP
|
|
sTWSData.sTelemetry.location = HASH("SIMPLE_INTERIOR_TYPE_AUTO_SHOP")
|
|
BREAK
|
|
CASE SIMPLE_INTERIOR_TYPE_ARCADE
|
|
sTWSData.sTelemetry.location = HASH("SIMPLE_INTERIOR_TYPE_ARCADE")
|
|
BREAK
|
|
|
|
#IF FEATURE_FIXER
|
|
CASE SIMPLE_INTERIOR_TYPE_FIXER_HQ
|
|
sTWSData.sTelemetry.location = HASH("SIMPLE_INTERIOR_TYPE_FIXER_HQ")
|
|
BREAK
|
|
#ENDIF
|
|
|
|
DEFAULT
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[RUIN] [TWS_SEND_TELEMETRY not in valid property, setting sRoadArcadeTelemetry.location = 0")
|
|
sTWSData.sTelemetry.location = 0
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MINIGAME, "[RUIN] [TWS_SEND_TELEMETRY] Invalid Player ID, setting sTWSData.sTelemetry.location = 0")
|
|
sTWSData.sTelemetry.location = 0
|
|
ENDIF
|
|
|
|
PLAYSTATS_ARCADE_CABINET(sTWSData.sTelemetry)
|
|
ENDPROC
|
|
|
|
PROC TWS_SET_PLAYER_STATE(TWS_PLAYER_STATE eState)
|
|
|
|
CDEBUG2LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] Player changing from state ",sPlayerData.ePlayerState," to state ",eState)
|
|
sPlayerData.ePlayerState = eState
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,0.0)
|
|
sPlayerData.fShadowXOffset = 0.0
|
|
|
|
SWITCH sPlayerData.iLevel
|
|
CASE 1
|
|
SWITCH sPlayerData.ePlayerState
|
|
CASE TWS_IDLE
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_IDLE_WIDTH, cfTWS_PLAYER_IDLE_HEIGHT)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_WALK
|
|
CASE TWS_INTRO
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_WALK_WIDTH, cfTWS_PLAYER_WALK_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-10.0)
|
|
BREAK
|
|
CASE TWS_ATTACK
|
|
CASE TWS_ATTACK_DOUBLE
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_ATTACK_WIDTH, cfTWS_PLAYER_ATTACK_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(76.0,0.0)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_ATTACK_LOW
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_ATTACK_LOW_WIDTH, cfTWS_PLAYER_ATTACK_LOW_HEIGHT)
|
|
BREAK
|
|
CASE TWS_CHARGE
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_CHARGE_WIDTH, cfTWS_PLAYER_CHARGE_HEIGHT)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_SUPERATTACK
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_EVOLVING_WIDTH, cfTWS_PLAYER_EVOLVING_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-72.0)
|
|
BREAK
|
|
CASE TWS_FALL
|
|
CASE TWS_FALL_HIGH
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_HURT_FALL_1_WIDTH, cfTWS_PLAYER_HURT_FALL_1_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-60.0)
|
|
BREAK
|
|
CASE TWS_FALL_2
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_HURT_FALL_2_WIDTH, cfTWS_PLAYER_HURT_FALL_2_HEIGHT)
|
|
BREAK
|
|
CASE TWS_FLAT
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_HURT_FLAT_WIDTH, cfTWS_PLAYER_HURT_FLAT_HEIGHT)
|
|
BREAK
|
|
CASE TWS_DEAD
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_HURT_FLAT_WIDTH, cfTWS_PLAYER_HURT_FLAT_HEIGHT)
|
|
BREAK
|
|
CASE TWS_GETTING_UP
|
|
CASE TWS_STUN
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_HURT_GETUP_1_WIDTH, cfTWS_PLAYER_HURT_GETUP_1_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(-60.0,0.0)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_JUMP_START
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_JUMP_WIDTH, cfTWS_PLAYER_JUMP_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-40.0)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_JUMP_ASCEND
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-40.0)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_JUMP_CREST
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_JUMP_WIDTH, cfTWS_PLAYER_JUMP_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-40.0)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_JUMP_DESCEND
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_JUMP_WIDTH, cfTWS_PLAYER_JUMP_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-40.0)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_JUMP_END
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_JUMP_WIDTH, cfTWS_PLAYER_JUMP_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-40.0)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_JUMP_ATTACK
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_JUMP_ATTACK_WIDTH, cfTWS_PLAYER_JUMP_ATTACK_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-20.0)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_JUMP_ATTACK_DESCEND
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_JUMP_ATTACK_WIDTH, cfTWS_PLAYER_JUMP_ATTACK_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-20.0)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_EVOLVING
|
|
CASE TWS_EVOLVING_2
|
|
CASE TWS_EVOLVING_3
|
|
CASE TWS_EVOLVING_4
|
|
CASE TWS_EVOLVING_5
|
|
CASE TWS_EVOLVING_6
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_EVOLVING_WIDTH, cfTWS_PLAYER_EVOLVING_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-72.0)
|
|
BREAK
|
|
CASE TWS_FALL_INFINITE
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_JUMP_WIDTH, cfTWS_PLAYER_JUMP_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-40.0)
|
|
BREAK
|
|
CASE TWS_FALL_HOLE_1
|
|
CASE TWS_FALL_HOLE_2
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_JUMP_HOLE_WIDTH, cfTWS_PLAYER_JUMP_HOLE_HEIGHT)
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
CASE 2
|
|
SWITCH sPlayerData.ePlayerState
|
|
CASE TWS_IDLE
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_IDLE_WIDTH, cfTWS_PLAYER_2_IDLE_HEIGHT)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_WALK
|
|
CASE TWS_INTRO
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_WALK_WIDTH, cfTWS_PLAYER_2_WALK_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(00.0,10.0)
|
|
BREAK
|
|
CASE TWS_ATTACK
|
|
CASE TWS_ATTACK_DOUBLE
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_ATTACK_WIDTH, cfTWS_PLAYER_2_ATTACK_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(50.0,0.0)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_ATTACK_LOW
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_ATTACK_LOW_WIDTH, cfTWS_PLAYER_2_ATTACK_LOW_HEIGHT)
|
|
BREAK
|
|
CASE TWS_CHARGE
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_CHARGE_WIDTH, cfTWS_PLAYER_2_CHARGE_HEIGHT)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_SUPERATTACK
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_EVOLVING_WIDTH, cfTWS_PLAYER_2_EVOLVING_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(8.0,-64.0)
|
|
BREAK
|
|
CASE TWS_FALL
|
|
CASE TWS_FALL_HIGH
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_HURT_FALL_1_WIDTH, cfTWS_PLAYER_2_HURT_FALL_1_HEIGHT)
|
|
BREAK
|
|
CASE TWS_FALL_2
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_HURT_FALL_2_WIDTH, cfTWS_PLAYER_2_HURT_FALL_2_HEIGHT)
|
|
BREAK
|
|
CASE TWS_FLAT
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_HURT_FLAT_WIDTH, cfTWS_PLAYER_2_HURT_FLAT_HEIGHT)
|
|
BREAK
|
|
CASE TWS_DEAD
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_HURT_FLAT_WIDTH, cfTWS_PLAYER_2_HURT_FLAT_HEIGHT)
|
|
BREAK
|
|
CASE TWS_GETTING_UP
|
|
CASE TWS_STUN
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_HURT_GETUP_1_WIDTH, cfTWS_PLAYER_2_HURT_GETUP_1_HEIGHT)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_JUMP_START
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_JUMP_WIDTH, cfTWS_PLAYER_2_JUMP_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-32.0)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_JUMP_ASCEND
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-32.0)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_JUMP_CREST
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_JUMP_WIDTH, cfTWS_PLAYER_2_JUMP_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-32.0)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_JUMP_DESCEND
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_JUMP_WIDTH, cfTWS_PLAYER_2_JUMP_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-32.0)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_JUMP_END
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_JUMP_WIDTH, cfTWS_PLAYER_2_JUMP_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-32.0)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_JUMP_ATTACK
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_JUMP_ATTACK_WIDTH, cfTWS_PLAYER_2_JUMP_ATTACK_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-4.0)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_JUMP_ATTACK_DESCEND
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_JUMP_ATTACK_WIDTH, cfTWS_PLAYER_2_JUMP_ATTACK_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-4.0)
|
|
sPlayerData.fShadowXOffset = -20.0
|
|
BREAK
|
|
CASE TWS_EVOLVING
|
|
CASE TWS_EVOLVING_2
|
|
CASE TWS_EVOLVING_3
|
|
CASE TWS_EVOLVING_4
|
|
CASE TWS_EVOLVING_5
|
|
CASE TWS_EVOLVING_6
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_EVOLVING_WIDTH, cfTWS_PLAYER_2_EVOLVING_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(-8.0,-64.0)
|
|
BREAK
|
|
CASE TWS_FALL_INFINITE
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_JUMP_WIDTH, cfTWS_PLAYER_2_JUMP_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-40.0)
|
|
BREAK
|
|
CASE TWS_FALL_HOLE_1
|
|
CASE TWS_FALL_HOLE_2
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_JUMP_HOLE_WIDTH, cfTWS_PLAYER_JUMP_HOLE_HEIGHT)
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
CASE 3
|
|
SWITCH sPlayerData.ePlayerState
|
|
CASE TWS_IDLE
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_IDLE_WIDTH, cfTWS_PLAYER_3_IDLE_HEIGHT)
|
|
sPlayerData.fShadowXOffset = -30.0
|
|
BREAK
|
|
CASE TWS_WALK
|
|
CASE TWS_INTRO
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_WALK_WIDTH, cfTWS_PLAYER_3_WALK_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,5.0)
|
|
BREAK
|
|
CASE TWS_ATTACK
|
|
CASE TWS_ATTACK_DOUBLE
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_ATTACK_WIDTH, cfTWS_PLAYER_3_ATTACK_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(48.0,-44.0)
|
|
sPlayerData.fShadowXOffset = -30.0
|
|
BREAK
|
|
CASE TWS_ATTACK_LOW
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_ATTACK_LOW_WIDTH, cfTWS_PLAYER_3_ATTACK_LOW_HEIGHT)
|
|
BREAK
|
|
CASE TWS_CHARGE
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_CHARGE_WIDTH, cfTWS_PLAYER_3_CHARGE_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(56.0, 0.0)
|
|
sPlayerData.fShadowXOffset = -30.0
|
|
BREAK
|
|
CASE TWS_SUPERATTACK
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_EVOLVING_WIDTH, cfTWS_PLAYER_3_EVOLVING_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-96.0)
|
|
sPlayerData.fShadowXOffset = -30.0
|
|
BREAK
|
|
CASE TWS_FALL
|
|
CASE TWS_FALL_HIGH
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_HURT_FALL_1_WIDTH, cfTWS_PLAYER_3_HURT_FALL_1_HEIGHT)
|
|
BREAK
|
|
CASE TWS_FALL_2
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_HURT_FALL_2_WIDTH, cfTWS_PLAYER_3_HURT_FALL_2_HEIGHT)
|
|
BREAK
|
|
CASE TWS_FLAT
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_HURT_FLAT_WIDTH, cfTWS_PLAYER_3_HURT_FLAT_HEIGHT)
|
|
BREAK
|
|
CASE TWS_DEAD
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_HURT_FLAT_WIDTH, cfTWS_PLAYER_3_HURT_FLAT_HEIGHT)
|
|
BREAK
|
|
CASE TWS_GETTING_UP
|
|
CASE TWS_STUN
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_HURT_GETUP_1_WIDTH, cfTWS_PLAYER_3_HURT_GETUP_1_HEIGHT)
|
|
BREAK
|
|
CASE TWS_JUMP_START
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_JUMP_WIDTH, cfTWS_PLAYER_3_JUMP_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-24.0)
|
|
sPlayerData.fShadowXOffset = -30.0
|
|
BREAK
|
|
CASE TWS_JUMP_ASCEND
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-24.0)
|
|
sPlayerData.fShadowXOffset = -30.0
|
|
BREAK
|
|
CASE TWS_JUMP_CREST
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_JUMP_WIDTH, cfTWS_PLAYER_3_JUMP_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-24.0)
|
|
sPlayerData.fShadowXOffset = -30.0
|
|
BREAK
|
|
CASE TWS_JUMP_DESCEND
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_JUMP_WIDTH, cfTWS_PLAYER_3_JUMP_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-24.0)
|
|
sPlayerData.fShadowXOffset = -30.0
|
|
BREAK
|
|
CASE TWS_JUMP_END
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_JUMP_WIDTH, cfTWS_PLAYER_3_JUMP_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-24.0)
|
|
sPlayerData.fShadowXOffset = -30.0
|
|
BREAK
|
|
CASE TWS_JUMP_ATTACK
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_JUMP_ATTACK_WIDTH, cfTWS_PLAYER_3_JUMP_ATTACK_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-60.0)
|
|
sPlayerData.fShadowXOffset = -30.0
|
|
BREAK
|
|
CASE TWS_JUMP_ATTACK_DESCEND
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_JUMP_ATTACK_WIDTH, cfTWS_PLAYER_3_JUMP_ATTACK_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-60.0)
|
|
sPlayerData.fShadowXOffset = -30.0
|
|
BREAK
|
|
CASE TWS_EVOLVING
|
|
CASE TWS_EVOLVING_2
|
|
CASE TWS_EVOLVING_3
|
|
CASE TWS_EVOLVING_4
|
|
CASE TWS_EVOLVING_5
|
|
CASE TWS_EVOLVING_6
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_EVOLVING_WIDTH, cfTWS_PLAYER_3_EVOLVING_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-96.0)
|
|
sPlayerData.fShadowXOffset = -30.0
|
|
BREAK
|
|
CASE TWS_FALL_INFINITE
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_JUMP_WIDTH, cfTWS_PLAYER_3_JUMP_HEIGHT)
|
|
sPlayerData.vSpriteOffset = INIT_VECTOR_2D(0.0,-40.0)
|
|
BREAK
|
|
CASE TWS_FALL_HOLE_1
|
|
CASE TWS_FALL_HOLE_2
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_JUMP_HOLE_WIDTH, cfTWS_PLAYER_JUMP_HOLE_HEIGHT)
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
FUNC BOOL TWS_CAN_BOSS_BE_HIT_AGAIN()
|
|
|
|
IF sEnemyData[sTWSData.iBossEnemyIndex].eEnemyState != TWS_ENEMY_IDLE
|
|
AND sEnemyData[sTWSData.iBossEnemyIndex].eEnemyState != TWS_ENEMY_LANDING
|
|
AND sEnemyData[sTWSData.iBossEnemyIndex].eEnemyState != TWS_ENEMY_FALL
|
|
AND sEnemyData[sTWSData.iBossEnemyIndex].eEnemyState != TWS_ENEMY_FALL_OVER_1
|
|
AND sEnemyData[sTWSData.iBossEnemyIndex].eEnemyState != TWS_ENEMY_FALL_OVER_2
|
|
AND sEnemyData[sTWSData.iBossEnemyIndex].eEnemyState != TWS_ENEMY_STUN
|
|
AND sEnemyData[sTWSData.iBossEnemyIndex].eEnemyState != TWS_ENEMY_GETTING_UP
|
|
AND sEnemyData[sTWSData.iBossEnemyIndex].eEnemyState != TWS_ENEMY_TELEPORT_IN
|
|
AND sEnemyData[sTWSData.iBossEnemyIndex].eEnemyState != TWS_ENEMY_TELEPORT_OUT
|
|
AND sEnemyData[sTWSData.iBossEnemyIndex].eEnemyState != TWS_ENEMY_TELEPORTING
|
|
AND (
|
|
NOT sPlayerData.bIsAttacking
|
|
OR (sPlayerData.iLevel < 3 AND sPlayerData.bIsAttacking AND sPlayerData.iSpriteAnimFrame > ciTWS_ATTACK_ANIM_FRAMES)
|
|
OR (sPlayerData.iLevel >= 3 AND sPlayerData.bIsAttacking AND sPlayerData.iSpriteAnimFrame > ciTWS_ATTACK_EXTENDED_ANIM_FRAMES)
|
|
)
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC TWS_CHECK_PLAYER_COLLIDING_WITH_ENEMY()
|
|
|
|
|
|
INT i
|
|
FLOAT fFactor = 1.0
|
|
|
|
|
|
FOR i = 0 TO ciTWS_MAX_ENEMIES -1
|
|
|
|
IF sEnemyData[i].bIsActive
|
|
|
|
IF i = sTWSData.iBossEnemyIndex
|
|
OR sEnemyData[i].eEnemyType = TWS_ENEMY_KNIGHT
|
|
IF sEnemyData[i].bIsHit AND TWS_CAN_BOSS_BE_HIT_AGAIN()
|
|
sEnemyData[i].bIsHit = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sPlayerData.vSpritePos.X < (sEnemyData[i].vSpritePos.x + sEnemyData[i].vSpriteSize.X + sEnemyData[i].vSpriteOffset.X)
|
|
AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteOffset.X + sPlayerData.vSpriteSize.X*fFactor) > sEnemyData[i].vSpritePos.X
|
|
AND sPlayerData.vSpritePos.Y < (sEnemyData[i].vSpritePos.Y + sEnemyData[i].vSpriteSize.Y + sEnemyData[i].vSpriteOffset.Y)
|
|
AND (sPlayerData.vSpriteSize.Y + sPlayerData.vSpritePos.Y + sPlayerData.vSpriteOffset.Y) > sEnemyData[i].vSpritePos.Y
|
|
AND ((NOT sPlayerData.bIsJumping AND ABSF((sPlayerData.vSpritePos.Y + sPlayerData.vSpriteSize.Y) - (sEnemyData[i].vSpritePos.Y + sEnemyData[i].vSpriteSize.Y + sEnemyData[i].vSpriteOffset.Y)) < TWS_GET_Z_WIDTH_FOR_ENEMY_TYPE(sEnemyData[i].eEnemyType))
|
|
OR (sPlayerData.bIsJumping AND ABSF((sPlayerData.vInitialJumpPos.Y + sPlayerData.vSpriteSize.Y) - (sEnemyData[i].vSpritePos.Y + sEnemyData[i].vSpriteSize.Y + sEnemyData[i].vSpriteOffset.Y)) < TWS_GET_Z_WIDTH_FOR_ENEMY_TYPE(sEnemyData[i].eEnemyType)))
|
|
|
|
IF sEnemyData[i].bIsHit = FALSE AND sPlayerData.bIsAttacking
|
|
AND NOT (sEnemyData[i].eEnemyState = TWS_ENEMY_ATTACK AND sEnemyData[i].iSpriteAnimFrame >= sEnemyData[i].iAttackFrame)
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_STUN
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING
|
|
|
|
IF (sEnemyData[i].vSpritePos.x < sPlayerData.vSpritePos.x AND sPlayerData.bFacingLeft)
|
|
OR (sEnemyData[i].vSpritePos.x >= sPlayerData.vSpritePos.x AND NOT sPlayerData.bFacingLeft)
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] : Player hit enemy! (", i,")")
|
|
|
|
sEnemyData[i].bIsHit = TRUE
|
|
sPlayerData.bIsHit = FALSE
|
|
|
|
IF sPlayerData.bIsCharging
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_DASH_HIT)
|
|
ELIF sPlayerData.bIsJumping
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_JUMP_KICK_HIT)
|
|
ELIF sPlayerData.bAttackIsLow
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_KICK_HIT)
|
|
ELIF sPlayerData.bAttackIsDouble
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_LONG_HIT)
|
|
ELSE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_SHORT_HIT)
|
|
ENDIF
|
|
|
|
IF i = sTWSData.iBossEnemyIndex
|
|
IF sEnemyData[i].eEnemyState = TWS_ENEMY_IDLE
|
|
|
|
IF sEnemyData[i].eEnemyType = TWS_ENEMY_BOSS_SPIDER
|
|
sEnemyData[i].fHealth -= (0.015 * sPlayerData.iLevel + BOOL_TO_INT(sPlayerData.bIsJumping)*0.02)
|
|
ELSE
|
|
sEnemyData[i].fHealth -= (0.05 * sPlayerData.iLevel + BOOL_TO_INT(sPlayerData.bIsJumping)*0.02)
|
|
ENDIF
|
|
|
|
ELIF sEnemyData[i].eEnemyState = TWS_ENEMY_LANDING
|
|
|
|
IF sEnemyData[i].eEnemyType = TWS_ENEMY_BOSS_SPIDER
|
|
sEnemyData[i].fHealth = CLAMP(sEnemyData[i].fHealth - 0.015 * sPlayerData.iLevel + BOOL_TO_INT(sPlayerData.bIsJumping)*0.02, 0.015, 1.0)
|
|
ELSE
|
|
sEnemyData[i].fHealth = CLAMP(sEnemyData[i].fHealth - 0.05 * sPlayerData.iLevel + BOOL_TO_INT(sPlayerData.bIsJumping)*0.02, 0.015, 1.0)
|
|
ENDIF
|
|
|
|
ELIF sEnemyData[i].eEnemyState != TWS_ENEMY_STUN
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_1
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_2
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_3
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_4
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_5
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_6
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_7
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_8
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DEAD
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_EXPLODING
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_FALL
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_FLAT
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_TELEPORT_IN
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_TELEPORT_OUT
|
|
|
|
IF sEnemyData[i].eEnemyType = TWS_ENEMY_BOSS_AMAZON
|
|
sEnemyData[i].fHealth = CLAMP(sEnemyData[i].fHealth - 0.015 * sPlayerData.iLevel, 0.015, 1.0)
|
|
ELSE
|
|
sEnemyData[i].fHealth = CLAMP(sEnemyData[i].fHealth - 0.01 * sPlayerData.iLevel, 0.015, 1.0)
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_MINIGAME, "Boss hit (Minor damage: ",sEnemyData[i].fHealth, ")")
|
|
ENDIF
|
|
ELSE
|
|
SWITCH sEnemyData[i].iEnemySize
|
|
CASE 0
|
|
sEnemyData[i].fHealth -= (0.15 + BOOL_TO_INT(sPlayerData.bIsCharging)*0.05 + BOOL_TO_INT(sPlayerData.bIsJumping)*0.025) * sPlayerData.iLevel
|
|
BREAK
|
|
CASE 1
|
|
sEnemyData[i].fHealth -= (0.1 + BOOL_TO_INT(sPlayerData.bIsCharging)*0.05 + BOOL_TO_INT(sPlayerData.bIsJumping)*0.025) * sPlayerData.iLevel
|
|
BREAK
|
|
CASE 2
|
|
sEnemyData[i].fHealth -= (0.05 + BOOL_TO_INT(sPlayerData.bIsCharging)*0.05 + BOOL_TO_INT(sPlayerData.bIsJumping)*0.025) * sPlayerData.iLevel
|
|
BREAK
|
|
CASE 3
|
|
sEnemyData[i].fHealth -= (0.05 + BOOL_TO_INT(sPlayerData.bIsCharging)*0.05 + BOOL_TO_INT(sPlayerData.bIsJumping)*0.025) * sPlayerData.iLevel
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].bIsAttacking
|
|
ARCADE_GAMES_SOUND_STOP(TWS_GET_ATTACK_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType))
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].fHealth <= 0.0
|
|
|
|
sEnemyData[i].fHealth = 0.0
|
|
|
|
IF sTWSData.iBossEnemyIndex != i
|
|
IF sPlayerData.bFacingLeft
|
|
TWS_SPAWN_FALLING_ITEMS(INIT_VECTOR_2D(sPlayerData.vSpritePos.x - cfGAME_SCREEN_WIDTH/4 + GET_RANDOM_FLOAT_IN_RANGE(-5.0, 5.0)*20, cfBASE_SCREEN_HEIGHT/4*3 + GET_RANDOM_FLOAT_IN_RANGE(-5.0, 5.0)*20), sEnemyData[i].eEnemyType)
|
|
ELSE
|
|
TWS_SPAWN_FALLING_ITEMS(INIT_VECTOR_2D(sPlayerData.vSpritePos.x + cfGAME_SCREEN_WIDTH/4 + GET_RANDOM_FLOAT_IN_RANGE(-5.0, 5.0)*20, cfBASE_SCREEN_HEIGHT/4*3 + GET_RANDOM_FLOAT_IN_RANGE(-5.0, 5.0)*20), sEnemyData[i].eEnemyType)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
TWS_ADD_SCORE_FOR_KILL(sEnemyData[i].eEnemyType)
|
|
|
|
ENDIF
|
|
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x - sEnemyData[i].vSpriteSize.x/2, sPlayerData.vSpritePos.Y), TWS_GET_FX_HIT(TRUE, i), sPlayerData.vSpritePos.Y + sPlayerData.vSpriteSize.Y + 50.0)
|
|
|
|
ENDIF
|
|
|
|
ELIF NOT sPlayerData.bIsInvincible
|
|
AND NOT TWS_HAS_BOSS_BATTLE_FINISHED()
|
|
AND NOT TWS_ENEMY_ATTACKS_WITH_PROJECTILE(i)
|
|
AND sPlayerData.bIsInvincible = FALSE
|
|
AND sPlayerData.bIsHit = FALSE
|
|
AND sPlayerData.bIsEvolving = FALSE
|
|
AND sPlayerData.bIsUsingMagic = FALSE
|
|
AND sPlayerData.bIsCharging = FALSE
|
|
AND sPlayerData.bAttackIsDouble = FALSE
|
|
AND sPlayerData.bIsAttacking = FALSE
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_STUN
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DEAD
|
|
AND ((sEnemyData[i].eEnemyState = TWS_ENEMY_ATTACK AND sEnemyData[i].iSpriteAnimFrame >= sEnemyData[i].iAttackFrame-1)
|
|
OR TWS_ENEMY_CAUSES_DAMAGE_ON_MOVEMENT(i)
|
|
OR sEnemyData[i].eEnemyType = TWS_ENEMY_BOSS_SPIDER AND sEnemyData[i].bIsAttacking AND NOT sPlayerData.bIsJumping
|
|
OR sEnemyData[i].eEnemyType = TWS_ENEMY_BOSS_AMAZON AND sEnemyData[i].bIsAttacking)
|
|
|
|
sPlayerData.bIsHit = TRUE
|
|
IF sEnemyData[i].eEnemyType = TWS_ENEMY_BRUTE OR sEnemyData[i].eEnemyType = TWS_ENEMY_BRUTE_AXE OR sEnemyData[i].eEnemyType = TWS_ENEMY_BOULDER
|
|
OR sEnemyData[i].eEnemyType = TWS_ENEMY_KNIGHT OR sTWSData.iBossEnemyIndex = i
|
|
sPlayerData.bIsFalling = TRUE
|
|
ENDIF
|
|
|
|
sPlayerData.fHealth = CLAMP(sPlayerData.fHealth - 0.25 + (0.05*sPlayerData.iLevel), 0.0, 1.0)
|
|
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] : Player was jumping? (", sPlayerData.bIsJumping,")")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] : Player was attacking? (", sPlayerData.bIsAttacking,")")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] : Player was hit -20! (", i,")")
|
|
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sPlayerData.vSpritePos.x - sPlayerData.vSpriteSize.x/1.5, sEnemyData[i].vSpritePos.Y), TWS_GET_FX_HIT(FALSE, i), sPlayerData.vSpritePos.Y + sPlayerData.vSpriteSize.Y + 50.0)
|
|
|
|
IF sEnemyData[i].vSpritePos.x < sPlayerData.vSpritePos.x AND NOT sPlayerData.bFacingLeft
|
|
sPlayerData.bFacingLeft = TRUE
|
|
ELIF sEnemyData[i].vSpritePos.x > sPlayerData.vSpritePos.x AND sPlayerData.bFacingLeft
|
|
sPlayerData.bFacingLeft = FALSE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_ACTIVATE_ITEM(INT iItemIndex)
|
|
|
|
TWS_CREATE_FX(sItemData[iItemIndex].vSpritePos, TWS_FX_PICKUP, -100)
|
|
|
|
SWITCH sItemData[iItemIndex].eItemType
|
|
CASE TWS_ITEM_HP_SMA
|
|
sTWSData.sTelemetry.powerUps ++
|
|
sPlayerData.fHealth = CLAMP(sPlayerData.fHealth + 0.25, 0.0, 1.0)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PICKUP_HP)
|
|
|
|
BREAK
|
|
CASE TWS_ITEM_HP_MED
|
|
sTWSData.sTelemetry.powerUps ++
|
|
sPlayerData.fHealth = CLAMP(sPlayerData.fHealth + 0.5, 0.0, 1.0)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PICKUP_HP)
|
|
|
|
BREAK
|
|
CASE TWS_ITEM_HP_LAR
|
|
sTWSData.sTelemetry.powerUps ++
|
|
IF sPlayerData.fHealth >= 1.0
|
|
sPlayerData.iLifes ++
|
|
ELSE
|
|
sPlayerData.fHealth = CLAMP(sPlayerData.fHealth + 1.0, 0.0, 1.0)
|
|
ENDIF
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PICKUP_HP_BIG)
|
|
|
|
BREAK
|
|
CASE TWS_ITEM_MP_SMA
|
|
sTWSData.sTelemetry.powerUps ++
|
|
sPlayerData.fMagic = CLAMP(sPlayerData.fMagic + 0.25, 0.0, 1.0)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PICKUP_MP)
|
|
IF sPlayerData.fMagic >= 1.0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_MANA_FULL)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ITEM_MP_MED
|
|
sTWSData.sTelemetry.powerUps ++
|
|
sPlayerData.fMagic = CLAMP(sPlayerData.fMagic + 0.5, 0.0, 1.0)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PICKUP_MP)
|
|
IF sPlayerData.fMagic >= 1.0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_MANA_FULL)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ITEM_MP_LAR
|
|
sTWSData.sTelemetry.powerUps ++
|
|
sPlayerData.fMagic = CLAMP(sPlayerData.fMagic + 1.0, 0.0, 1.0)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PICKUP_MP_BIG)
|
|
IF sPlayerData.fMagic >= 1.0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_MANA_FULL)
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_ITEM_1UP
|
|
sPlayerData.iLifes ++
|
|
sTWSData.sTelemetry.powerUps ++
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PICKUP_EXTRA_LIFE)
|
|
BREAK
|
|
DEFAULT
|
|
sPlayerData.iScore += (TWS_GET_SCORE_BONUS_FOR_GOLD_TYPE(sItemData[iItemIndex].eItemType))
|
|
IF sPlayerData.iScore > sPlayerData.iHighestScore
|
|
sPlayerData.iHighestScore = sPlayerData.iScore
|
|
ENDIF
|
|
sPlayerData.iTreasures += (TWS_GET_SCORE_BONUS_FOR_GOLD_TYPE(sItemData[iItemIndex].eItemType))
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PICKUP_GOLD)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
TWS_RESET_ITEM_VARIABLES(iItemIndex)
|
|
TWS_REMOVE_DRAW_CALL(TWS_ENTITY_ITEM, iItemIndex)
|
|
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_CHECK_PLAYER_COLLIDING_WITH_ITEMS()
|
|
|
|
INT i
|
|
|
|
FOR i = 0 TO ciTWS_MAX_ITEMS -1
|
|
|
|
IF (sPlayerData.vSpritePos.X < (sItemData[i].vSpritePos.x + sItemData[i].vSpriteSize.x) AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteSize.X) > sItemData[i].vSpritePos.x
|
|
AND sPlayerData.vSpritePos.Y < (sItemData[i].vSpritePos.Y + sItemData[i].vSpriteSize.Y) AND (sPlayerData.vSpriteSize.Y + sPlayerData.vSpritePos.Y) > sItemData[i].vSpritePos.Y)
|
|
|
|
IF sItemData[i].bIsHit = FALSE
|
|
sItemData[i].bIsHit = TRUE
|
|
TWS_ACTIVATE_ITEM(i)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_ACTIVATE_TRAP(INT iTrapIndex)
|
|
|
|
SWITCH sTrapsData[iTrapIndex].eType
|
|
CASE TWS_TRAP_FALL
|
|
IF sPlayerData.ePlayerState != TWS_FALL_INFINITE AND sPlayerData.ePlayerState != TWS_GETTING_UP AND sPlayerData.ePlayerState != TWS_DEAD
|
|
CDEBUG3LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] : HIT TRAP")
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
TWS_SET_PLAYER_STATE(TWS_FALL_INFINITE)
|
|
sPlayerData.bIsJumping = TRUE
|
|
sPlayerData.fJumpAcceleration = 0.0
|
|
sPlayerData.vInitialJumpPos.y = cfBASE_SCREEN_HEIGHT*2
|
|
ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_PLAYER_WALK_LOOP)
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_TRAP_HOLE
|
|
IF sPlayerData.ePlayerState != TWS_FALL_INFINITE AND sPlayerData.ePlayerState != TWS_GETTING_UP
|
|
CDEBUG3LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] : HIT TRAP")
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
TWS_SET_PLAYER_STATE(TWS_FALL_HOLE_1)
|
|
sPlayerData.vSpritePos = INIT_VECTOR_2D(sTrapsData[iTrapIndex].vSpritePos.x, sTrapsData[iTrapIndex].vSpritePos.y - 150.0)
|
|
ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_PLAYER_WALK_LOOP)
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_TRAP_STALAGTITE
|
|
IF sTrapsData[iTrapIndex].bIsWorking
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_STALACTITE_CRACK)
|
|
sTrapsData[iTrapIndex].bIsWorking = FALSE
|
|
ENDIF
|
|
|
|
IF sTrapsData[iTrapIndex].vSpritePos2.y < sTrapsData[iTrapIndex].vSpritePos.y - sTrapsData[iTrapIndex].vSpriteSize.y
|
|
|
|
sTrapsData[iTrapIndex].vSpritePos2.y = sTrapsData[iTrapIndex].vSpritePos2.y +@ cfTWS_VERTICAL_MOVEMENT_STALACTITES
|
|
IF sTrapsData[iTrapIndex].vSpritePos2.y >= sTrapsData[iTrapIndex].vSpritePos.y - sTrapsData[iTrapIndex].vSpriteSize.y
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_STALACTITE_LAND)
|
|
ENDIF
|
|
|
|
IF VECTOR_2D_DIST(sPlayerData.vSpritePos, INIT_VECTOR_2D(sTrapsData[iTrapIndex].vSpritePos.x, sTrapsData[iTrapIndex].vSpritePos.y - sPlayerData.vSpriteSize.y)) < 75.0
|
|
AND (sPlayerData.vSpritePos.X < (sTrapsData[iTrapIndex].vSpritePos2.x + sTrapsData[iTrapIndex].vSpriteSize.x) AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteSize.X) > sTrapsData[iTrapIndex].vSpritePos2.x
|
|
AND sPlayerData.vSpritePos.Y < (sTrapsData[iTrapIndex].vSpritePos2.Y + sTrapsData[iTrapIndex].vSpriteSize.Y) AND (sPlayerData.vSpriteSize.Y + sPlayerData.vSpritePos.Y) > sTrapsData[iTrapIndex].vSpritePos2.Y)
|
|
AND sPlayerData.ePlayerState != TWS_FALL_INFINITE AND sPlayerData.ePlayerState != TWS_GETTING_UP
|
|
AND TWS_CAN_PLAYER_BE_HURT(TRUE)
|
|
|
|
sPlayerData.bIsHit = TRUE
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
sPlayerData.fHealth = CLAMP(sPlayerData.fHealth - 0.1, 0.0, 1.0)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] : Player was hit by stalactite -10!")
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_CHECK_PLAYER_COLLIDING_WITH_TRAPS()
|
|
|
|
|
|
INT i
|
|
FOR i = 0 TO ciTWS_MAX_TRAPS -1
|
|
|
|
IF sTrapsData[i].bIsActive
|
|
SWITCH sTrapsData[i].eType
|
|
CASE TWS_TRAP_FALL
|
|
|
|
IF (sPlayerData.vSpritePos.Y + sPlayerData.vSpriteOffset.Y) > sTrapsData[i].vSpritePos.Y
|
|
AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteOffset.X) > (sTrapsData[i].vSpritePos.x - sTrapsData[i].vSpriteSize.x)
|
|
AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteOffset.X) < (sTrapsData[i].vSpritePos.x + sTrapsData[i].vSpriteSize.x)
|
|
TWS_ACTIVATE_TRAP(i)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_TRAP_HOLE
|
|
|
|
IF (sPlayerData.vSpritePos.X - sPlayerData.vSpriteSize.y < (sTrapsData[i].vSpritePos.x + sTrapsData[i].vSpriteSize.x) AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteSize.X * cfTWS_RESCALE_FACTOR) > sTrapsData[i].vSpritePos.x
|
|
AND sPlayerData.vSpritePos.Y - sPlayerData.vSpriteSize.y < (sTrapsData[i].vSpritePos.Y + sTrapsData[i].vSpriteSize.Y) AND (sPlayerData.vSpriteSize.Y * cfTWS_RESCALE_FACTOR + sPlayerData.vSpritePos.Y) > sTrapsData[i].vSpritePos.Y)
|
|
AND VECTOR_2D_DIST(sPlayerData.vSpritePos, INIT_VECTOR_2D(sTrapsData[i].vSpritePos.x, sTrapsData[i].vSpritePos.y - sPlayerData.vSpriteSize.y)) < 30.0
|
|
AND NOT sPlayerData.bIsJumping
|
|
TWS_ACTIVATE_TRAP(i)
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_TRAP_STALAGTITE
|
|
|
|
IF sTrapsData[i].bIsActive
|
|
IF NOT sTrapsData[i].bIsWorking OR VECTOR_2D_DIST(sPlayerData.vSpritePos, INIT_VECTOR_2D(sTrapsData[i].vSpritePos.x, sTrapsData[i].vSpritePos.y - sPlayerData.vSpriteSize.y)) < 50.0
|
|
TWS_ACTIVATE_TRAP(i)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_TASK_PLAYER_TO_MOVE_TO_CENTER()
|
|
|
|
TWS_RESET_PLAYER_VARIABLES()
|
|
sPlayerData.bIsMovingToCenter = TRUE
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_TASK_PLAYER_TO_MOVE_OUT_OFF_SCREEN()
|
|
|
|
TWS_RESET_PLAYER_VARIABLES()
|
|
sPlayerData.bIsMovingOutOfScreen = TRUE
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_TASK_PLAYER_TO_MOVE_LEFT()
|
|
|
|
TWS_RESET_PLAYER_VARIABLES()
|
|
sPlayerData.bIsMovingLeft = TRUE
|
|
|
|
ENDPROC
|
|
PROC TWS_HANDLE_SCREEN_EFFECTS()
|
|
|
|
IF sTWSData.eCurrentLevel = TWS_CASTLE
|
|
IF NOT TWS_IS_CAMERA_SHAKE_ACTIVE() AND TWS_IS_ENEMY_OF_TYPE_ON_SCREEN(TWS_ENEMY_BOULDER)
|
|
TWS_ACTIVATE_CAMERA_SHAKE(TRUE)
|
|
|
|
ELIF TWS_IS_CAMERA_SHAKE_ACTIVE() AND NOT TWS_IS_ENEMY_OF_TYPE_ON_SCREEN(TWS_ENEMY_BOULDER)
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_HANDLE_PLAYER_MOVEMENT()
|
|
|
|
BOOL bLeft, bRight, bUp, bDown, bAttack, bJump, bSuperAttack, bEvolve, bCharge
|
|
|
|
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_LB)
|
|
CPRINTLN(DEBUG_MINIGAME, "ENEMIES?: ", TWS_IS_ANY_ENEMY_ON_SCREEN(TRUE))
|
|
ENDIF
|
|
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
|
|
IF sTWSData.eLevelStage <= TWS_LEVEL_BOSS_FIGHT
|
|
AND sTWSData.eLevelStage != TWS_LEVEL_DIALOGUE_PRE_FIGHT
|
|
|
|
bLeft = IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_LEFT)// OR GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_X)
|
|
bRight = IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT)
|
|
bUp = IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_UP)
|
|
bDown = IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_DOWN)
|
|
bJump = IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE)
|
|
bAttack = IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LEFT)
|
|
bCharge = IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN)
|
|
bSuperAttack = IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT)
|
|
bEvolve = IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_UP)
|
|
|
|
IF (bLeft OR bRight OR bUp OR bDown)
|
|
IF NOT sTWSData.bShowedTextHelp[TWS_TH_MOVE]
|
|
sTWSData.bShowedTextHelp[TWS_TH_MOVE] = TRUE
|
|
ELIF ARCADE_GAMES_HELP_TEXT_IS_THIS_BEING_DISPLAYED(ARCADE_GAMES_HELP_TEXT_ENUM_TWR_HELP_MOVE)
|
|
ARCADE_GAMES_HELP_TEXT_CLEAR()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF sPlayerData.bIsMovingToCenter
|
|
|
|
IF sPlayerData.vSpritePos.x < sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - 25
|
|
bRight = TRUE
|
|
ELIF sPlayerData.vSpritePos.X > sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + 25
|
|
bLeft = TRUE
|
|
ENDIF
|
|
|
|
IF sPlayerData.vSpritePos.Y < cfBASE_SCREEN_HEIGHT/2 - 25
|
|
bDown = TRUE
|
|
ELIF sPlayerData.vSpritePos.Y > cfBASE_SCREEN_HEIGHT*0.6 + 25
|
|
bUp = TRUE
|
|
ENDIF
|
|
|
|
ELIF sPlayerData.bIsMovingLeft
|
|
|
|
IF sPlayerData.vSpritePos.X > sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfBASE_SCREEN_WIDTH*0.2
|
|
bLeft = TRUE
|
|
ENDIF
|
|
|
|
IF sPlayerData.vSpritePos.Y < cfBASE_SCREEN_HEIGHT*0.6 - 25
|
|
bDown = TRUE
|
|
ELIF sPlayerData.vSpritePos.Y > cfBASE_SCREEN_HEIGHT*0.6 + 25
|
|
bUp = TRUE
|
|
ENDIF
|
|
|
|
IF sPlayerData.vSpritePos.x < sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfBASE_SCREEN_WIDTH*0.2
|
|
AND sPlayerData.vSpritePos.Y > cfBASE_SCREEN_HEIGHT*0.6 - 25
|
|
sPlayerData.bIsMovingLeft = FALSE
|
|
sPlayerData.bFacingLeft = FALSE
|
|
ENDIF
|
|
|
|
ELIF sPlayerData.bIsMovingOutOfScreen
|
|
|
|
IF sPlayerData.vSpritePos.x < sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfBASE_SCREEN_WIDTH/2 // + sPlayerData.vSpriteSize.x
|
|
bRight = TRUE
|
|
ELSE
|
|
sPlayerData.bIsMovingOutOfScreen = FALSE
|
|
TWS_SET_PLAYER_STATE(TWS_IDLE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ELSE
|
|
IF sTWSData.eLevelStage <= TWS_LEVEL_BOSS_FIGHT
|
|
AND sTWSData.eLevelStage != TWS_LEVEL_DIALOGUE_PRE_FIGHT
|
|
|
|
FLOAT fAxisThresholdMod = 0.5
|
|
|
|
bLeft = IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_LEFT)// OR GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_X)
|
|
bRight = IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT)
|
|
bUp = IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_UP)
|
|
bDown = IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_DOWN)
|
|
bAttack = IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RRIGHT)
|
|
bJump = IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RDOWN)
|
|
bSuperAttack = IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RUP)
|
|
bEvolve = IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RB)
|
|
bCharge = IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RLEFT)
|
|
|
|
// Joystick
|
|
FLOAT fRightStickX = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_X)
|
|
FLOAT fRightStickY = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_Y)
|
|
|
|
IF fRightStickX < -cfSTICK_THRESHOLD * fAxisThresholdMod
|
|
bLeft = TRUE
|
|
ELIF fRightStickX > cfSTICK_THRESHOLD * fAxisThresholdMod
|
|
bRight = TRUE
|
|
ENDIF
|
|
|
|
IF fRightStickY < -cfSTICK_THRESHOLD * fAxisThresholdMod
|
|
bUp = TRUE
|
|
ELIF fRightStickY > cfSTICK_THRESHOLD * fAxisThresholdMod
|
|
bDown = TRUE
|
|
ENDIF
|
|
|
|
IF (bLeft OR bRight OR bUp OR bDown)
|
|
IF NOT sTWSData.bShowedTextHelp[TWS_TH_MOVE]
|
|
sTWSData.bShowedTextHelp[TWS_TH_MOVE] = TRUE
|
|
ELIF ARCADE_GAMES_HELP_TEXT_IS_THIS_BEING_DISPLAYED(ARCADE_GAMES_HELP_TEXT_ENUM_TWR_HELP_MOVE)
|
|
ARCADE_GAMES_HELP_TEXT_CLEAR()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF sPlayerData.bIsMovingToCenter
|
|
|
|
IF sPlayerData.vSpritePos.x < sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - 25
|
|
bRight = TRUE
|
|
ELIF sPlayerData.vSpritePos.X > sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + 25
|
|
bLeft = TRUE
|
|
ENDIF
|
|
|
|
IF sPlayerData.vSpritePos.Y < cfBASE_SCREEN_HEIGHT/2 - 25
|
|
bDown = TRUE
|
|
ELIF sPlayerData.vSpritePos.Y > cfBASE_SCREEN_HEIGHT*0.6 + 25
|
|
bUp = TRUE
|
|
ENDIF
|
|
|
|
ELIF sPlayerData.bIsMovingLeft
|
|
|
|
IF sPlayerData.vSpritePos.X > sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfBASE_SCREEN_WIDTH*0.2
|
|
bLeft = TRUE
|
|
ENDIF
|
|
|
|
IF sPlayerData.vSpritePos.Y < cfBASE_SCREEN_HEIGHT*0.6 - 25
|
|
bDown = TRUE
|
|
ELIF sPlayerData.vSpritePos.Y > cfBASE_SCREEN_HEIGHT*0.6 + 25
|
|
bUp = TRUE
|
|
ENDIF
|
|
|
|
IF sPlayerData.vSpritePos.x < sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfBASE_SCREEN_WIDTH*0.2
|
|
AND sPlayerData.vSpritePos.Y > cfBASE_SCREEN_HEIGHT*0.6 - 25
|
|
sPlayerData.bIsMovingLeft = FALSE
|
|
sPlayerData.bFacingLeft = FALSE
|
|
ENDIF
|
|
|
|
ELIF sPlayerData.bIsMovingOutOfScreen
|
|
|
|
IF sPlayerData.vSpritePos.x < sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfBASE_SCREEN_WIDTH/2 // + sPlayerData.vSpriteSize.x
|
|
bRight = TRUE
|
|
ELSE
|
|
sPlayerData.bIsMovingOutOfScreen = FALSE
|
|
TWS_SET_PLAYER_STATE(TWS_IDLE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Rotate player
|
|
IF sPlayerData.ePlayerState != TWS_INTRO AND sPlayerData.ePlayerState != TWS_FALL AND sPlayerData.ePlayerState != TWS_FALL_2 AND sPlayerData.ePlayerState != TWS_FLAT AND NOT sPlayerData.bIsEvolving
|
|
|
|
IF bLeft AND NOT sPlayerData.bIsAttacking AND NOT sPlayerData.bFacingLeft// AND GET_GAME_TIMER() - sPlayerData.iTimeSinceLastDirectionChange > ciTWS_ROTATE_PLAYER_DELAY
|
|
sPlayerData.bFacingLeft = TRUE
|
|
|
|
ELIF bRight AND NOT sPlayerData.bIsAttacking AND sPlayerData.bFacingLeft// AND GET_GAME_TIMER() - sPlayerData.iTimeSinceLastDirectionChange > ciTWS_ROTATE_PLAYER_DELAY
|
|
sPlayerData.bFacingLeft = FALSE
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sPlayerData.ePlayerState = TWS_INTRO
|
|
sPlayerData.bIsMoving = TRUE
|
|
sPlayerData.vSpritePos.x = sPlayerData.vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER
|
|
EXIT
|
|
ENDIF
|
|
|
|
sPlayerData.bIsMoving = (bLeft OR bRight OR bUp OR bDown) AND NOT sPlayerData.bIsUsingMagic AND NOT sPlayerData.bIsEvolving
|
|
|
|
TWS_CHECK_PLAYER_COLLIDING_WITH_ENEMY()
|
|
TWS_CHECK_PLAYER_COLLIDING_WITH_ITEMS()
|
|
TWS_CHECK_PLAYER_COLLIDING_WITH_TRAPS()
|
|
|
|
// Charge
|
|
IF bCharge AND sPlayerData.fMagic >= 0.3 AND GET_GAME_TIMER() - sPlayerData.iLastCharge > 1000 AND NOT sPlayerData.bIsAttacking AND NOT sPlayerData.bIsUsingMagic AND NOT sPlayerData.bIsHit AND NOT sPlayerData.bIsCharging
|
|
sPlayerData.bIsCharging = TRUE
|
|
|
|
IF NOT sTWSData.bShowedTextHelp[TWS_TH_DASH]
|
|
sTWSData.bShowedTextHelp[TWS_TH_DASH] = TRUE
|
|
ELIF ARCADE_GAMES_HELP_TEXT_IS_THIS_BEING_DISPLAYED(ARCADE_GAMES_HELP_TEXT_ENUM_TWR_HELP_DASH)
|
|
ARCADE_GAMES_HELP_TEXT_CLEAR()
|
|
ENDIF
|
|
ELIF bCharge AND sPlayerData.fMagic < 0.3
|
|
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_MANA_EMPTY)
|
|
|
|
ENDIF
|
|
|
|
// Superattack
|
|
IF bSuperAttack AND sPlayerData.fMagic >= 0.04 AND NOT sPlayerData.bIsAttacking AND NOT sPlayerData.bIsJumping AND NOT sPlayerData.bIsCharging AND NOT sPlayerData.bIsUsingMagic AND NOT sPlayerData.bIsHit
|
|
sPlayerData.bIsUsingMagic = TRUE
|
|
|
|
IF NOT sTWSData.bShowedTextHelp[TWS_TH_MAGIC]
|
|
sTWSData.bShowedTextHelp[TWS_TH_MAGIC] = TRUE
|
|
ELIF ARCADE_GAMES_HELP_TEXT_IS_THIS_BEING_DISPLAYED(ARCADE_GAMES_HELP_TEXT_ENUM_TWR_HELP_MAGIC)
|
|
ARCADE_GAMES_HELP_TEXT_CLEAR()
|
|
ENDIF
|
|
|
|
ELIF bSuperAttack AND sPlayerData.fMagic < 0.04
|
|
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_MANA_EMPTY)
|
|
|
|
ENDIF
|
|
|
|
// Evolution
|
|
IF NOT sTWSData.bIsHardCoreMode AND bEvolve AND sPlayerData.iLevel < 3 AND sPlayerData.fMagic >= 1.0 AND NOT sPlayerData.bIsAttacking AND NOT sPlayerData.bIsCharging AND NOT sPlayerData.bIsUsingMagic AND NOT sPlayerData.bIsHit
|
|
sPlayerData.bIsEvolving = TRUE
|
|
sPlayerData.bIsUsingMagic = TRUE
|
|
|
|
IF NOT sTWSData.bShowedTextHelp[TWS_TH_EVOLUTION]
|
|
sTWSData.bShowedTextHelp[TWS_TH_EVOLUTION] = TRUE
|
|
ELIF ARCADE_GAMES_HELP_TEXT_IS_THIS_BEING_DISPLAYED(ARCADE_GAMES_HELP_TEXT_ENUM_TWR_HELP_EVOLUTION)
|
|
ARCADE_GAMES_HELP_TEXT_CLEAR()
|
|
ENDIF
|
|
|
|
ELIF bEvolve AND sPlayerData.fMagic < 1.0
|
|
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_MANA_EMPTY)
|
|
|
|
ENDIF
|
|
|
|
IF bAttack AND sPlayerData.bIsAttacking AND NOT sPlayerData.bAttackIsLow AND NOT sPlayerData.bAttackIsDouble AND NOT sPlayerData.bIsCharging AND NOT sPlayerData.bIsEvolving AND GET_GAME_TIMER() - sPlayerData.iTimeSinceLastAttack > 100
|
|
sPlayerData.bAttackIsDouble = TRUE
|
|
sPlayerData.iTimeSinceLastAttack = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
//Attack
|
|
IF bAttack AND NOT sPlayerData.bIsAttacking AND NOT sPlayerData.bIsHit AND NOT sPlayerData.bIsEvolving
|
|
sPlayerData.bIsAttacking = TRUE
|
|
IF NOT sPlayerData.bIsJumping AND TWS_IS_ENEMY_SMALL(TWS_GET_CLOSEST_ENEMY())
|
|
sPlayerData.bAttackIsLow = TRUE
|
|
ELIF sPlayerData.bIsJumping
|
|
IF NOT sTWSData.bShowedTextHelp[TWS_TH_JUMP_ATTACK]
|
|
sTWSData.bShowedTextHelp[TWS_TH_JUMP_ATTACK] = TRUE
|
|
ELIF ARCADE_GAMES_HELP_TEXT_IS_THIS_BEING_DISPLAYED(ARCADE_GAMES_HELP_TEXT_ENUM_TWR_HELP_JUMP_ATTACK)
|
|
ARCADE_GAMES_HELP_TEXT_CLEAR()
|
|
ENDIF
|
|
ENDIF
|
|
sPlayerData.iTimeSinceLastAttack = GET_GAME_TIMER()
|
|
|
|
IF NOT sTWSData.bShowedTextHelp[TWS_TH_ATTACK]
|
|
sTWSData.bShowedTextHelp[TWS_TH_ATTACK] = TRUE
|
|
ELIF ARCADE_GAMES_HELP_TEXT_IS_THIS_BEING_DISPLAYED(ARCADE_GAMES_HELP_TEXT_ENUM_TWR_HELP_ATTACK)
|
|
ARCADE_GAMES_HELP_TEXT_CLEAR()
|
|
ENDIF
|
|
|
|
ELIF bJump AND NOT sPlayerData.bIsFalling AND NOT sPlayerData.bIsJumping AND NOT sPlayerData.bIsHit AND NOT sPlayerData.bIsCharging AND NOT sPlayerData.bIsEvolving AND NOT sPlayerData.bIsUsingMagic
|
|
CDEBUG2LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] : Player started to jump")
|
|
sPlayerData.bIsJumping = TRUE
|
|
sPlayerData.vInitialJumpPos.Y = sPlayerData.vSpritePos.Y
|
|
sPlayerData.fJumpAcceleration = ciTWS_JUMP_ACCELERATION
|
|
|
|
sPlayerData.vSpritePos.y = sPlayerData.vSpritePos.y -@ sPlayerData.fJumpAcceleration
|
|
sPlayerData.fJumpAcceleration = sPlayerData.fJumpAcceleration +@ ciTWS_GRAVITY
|
|
|
|
IF NOT sTWSData.bShowedTextHelp[TWS_TH_JUMP]
|
|
sTWSData.bShowedTextHelp[TWS_TH_JUMP] = TRUE
|
|
ELIF ARCADE_GAMES_HELP_TEXT_IS_THIS_BEING_DISPLAYED(ARCADE_GAMES_HELP_TEXT_ENUM_TWR_HELP_JUMP)
|
|
ARCADE_GAMES_HELP_TEXT_CLEAR()
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF sPlayerData.bIsJumping AND sPlayerData.vSpritePos.y < sPlayerData.vInitialJumpPos.y
|
|
CDEBUG2LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] : Player jumping, reducing acceleration")
|
|
sPlayerData.vSpritePos.y = sPlayerData.vSpritePos.y -@ sPlayerData.fJumpAcceleration
|
|
IF sPlayerData.vSpritePos.y > sPlayerData.vInitialJumpPos.y
|
|
sPlayerData.vSpritePos.y = sPlayerData.vInitialJumpPos.y
|
|
ENDIF
|
|
sPlayerData.fJumpAcceleration = sPlayerData.fJumpAcceleration +@ ciTWS_GRAVITY
|
|
ENDIF
|
|
|
|
IF NOT sPlayerData.bIsHit
|
|
AND NOT sPlayerData.bIsUsingMagic
|
|
AND NOT sPlayerData.bIsCharging
|
|
AND NOT sPlayerData.bIsEvolving
|
|
AND NOT (NOT sPlayerData.bIsJumping AND sPlayerData.bIsAttacking)
|
|
AND sPlayerData.ePlayerState != TWS_INTRO
|
|
AND sPlayerData.ePlayerState != TWS_FALL_INFINITE
|
|
AND sPlayerData.ePlayerState != TWS_FALL_HOLE_1
|
|
AND sPlayerData.ePlayerState != TWS_FALL_HOLE_2
|
|
AND sPlayerData.ePlayerState != TWS_FALL_HIGH
|
|
AND sPlayerData.ePlayerState != TWS_FALL
|
|
AND sPlayerData.ePlayerState != TWS_FALL_2
|
|
AND sPlayerData.ePlayerState != TWS_FLAT
|
|
AND sPlayerData.ePlayerState != TWS_GETTING_UP
|
|
AND sPlayerData.ePlayerState != TWS_DEAD
|
|
|
|
//Movement
|
|
IF bLeft
|
|
AND ((sPlayerData.vSpritePos.x > 400 AND sTWSData.eLevelStage < TWS_LEVEL_BOSS_FIGHT AND NOT sTWSData.bLockedScreen AND sTWSData.eCurrentLevel != TWS_CASTLE)
|
|
OR (sPlayerData.vSpritePos.Y > 605 AND sPlayerData.vSpritePos.x > 530 AND sTWSData.eLevelStage < TWS_LEVEL_BOSS_FIGHT AND NOT sTWSData.bLockedScreen AND sTWSData.eCurrentLevel = TWS_CASTLE)
|
|
OR (sPlayerData.vSpritePos.Y <= 605 AND sPlayerData.vSpritePos.x > 780 AND sTWSData.eLevelStage < TWS_LEVEL_BOSS_FIGHT AND NOT sTWSData.bLockedScreen AND sTWSData.eCurrentLevel = TWS_CASTLE)
|
|
OR (sTWSData.eLevelStage >= TWS_LEVEL_BOSS_FIGHT AND sPlayerData.vSpritePos.x > sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpriteWidth*0.45)
|
|
OR (sTWSData.bLockedScreen AND sPlayerData.vSpritePos.x > sTWSData.fLockedScreenPos - cfGAME_SCREEN_WIDTH*0.45))
|
|
|
|
sPlayerData.vSpritePos.x = sPlayerData.vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER
|
|
sPlayerData.vInitialJumpPos.x = sPlayerData.vInitialJumpPos.x -@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER
|
|
|
|
ELIF bRight AND (
|
|
(NOT sTWSData.bLockedScreen AND sPlayerData.vSpritePos.x < sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpriteWidth*0.45 OR sPlayerData.bIsMovingOutOfScreen)
|
|
OR (sTWSData.bLockedScreen AND sPlayerData.vSpritePos.x < sTWSData.fLockedScreenPos + cfGAME_SCREEN_WIDTH*0.45)
|
|
)
|
|
|
|
sPlayerData.vSpritePos.x = sPlayerData.vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER
|
|
sPlayerData.vInitialJumpPos.x = sPlayerData.vInitialJumpPos.x +@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER
|
|
|
|
ENDIF
|
|
|
|
IF bUp
|
|
AND ((sPlayerData.vSpritePos.Y > 520 AND sTWSData.eLevelStage < TWS_LEVEL_BOSS_FIGHT AND sTWSData.eCurrentLevel != TWS_CASTLE)
|
|
OR (sPlayerData.vSpritePos.X > 760.0 AND sPlayerData.vSpritePos.Y > 500 AND sTWSData.eLevelStage < TWS_LEVEL_BOSS_FIGHT AND sTWSData.eCurrentLevel = TWS_CASTLE)
|
|
OR (sPlayerData.vSpritePos.X <= 760.0 AND sPlayerData.vSpritePos.Y > 605 AND sTWSData.eLevelStage < TWS_LEVEL_BOSS_FIGHT AND sTWSData.eCurrentLevel = TWS_CASTLE)
|
|
OR (sTWSData.eLevelStage >= TWS_LEVEL_BOSS_FIGHT AND sTWSData.eCurrentLevel != TWS_CASTLE AND sPlayerData.vSpritePos.Y > 580)
|
|
OR (sTWSData.eLevelStage >= TWS_LEVEL_BOSS_FIGHT AND sTWSData.eCurrentLevel = TWS_CASTLE AND sPlayerData.vSpritePos.Y > 400))
|
|
|
|
sPlayerData.vSpritePos.y = sPlayerData.vSpritePos.y -@ cfTWS_VERTICAL_MOVEMENT_PLAYER
|
|
sPlayerData.vInitialJumpPos.y = sPlayerData.vInitialJumpPos.y -@ cfTWS_VERTICAL_MOVEMENT_PLAYER
|
|
|
|
ELIF bDown AND sPlayerData.vSpritePos.y < 850.0
|
|
|
|
sPlayerData.vSpritePos.y = sPlayerData.vSpritePos.y +@ cfTWS_VERTICAL_MOVEMENT_PLAYER
|
|
sPlayerData.vInitialJumpPos.y = sPlayerData.vInitialJumpPos.y +@ cfTWS_VERTICAL_MOVEMENT_PLAYER
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_PERFORM_SUPERATTACK()
|
|
|
|
INT iDrawCallIndex, iRandom
|
|
VECTOR_2D vPos
|
|
|
|
IF NOT sFXData[0].bActive
|
|
|
|
sFXData[0].bActive = TRUE
|
|
sFXData[0].eType = TWS_FX_SWORD_LIGHTNING
|
|
sFXData[0].vSpritePos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 10, sPlayerData.vSpritePos.Y - sPlayerData.vSpriteSize.Y*2 - 40)
|
|
|
|
iDrawCallIndex = TWS_GET_NEXT_EMPTY_SLOT_FOR_DRAW_CALL()
|
|
CPRINTLN(DEBUG_MINIGAME, "CREATE FX IN SLOT ",iDrawCallIndex)
|
|
sTWSData.sDrawCalls[iDrawCallIndex].eType = TWS_ENTITY_FX
|
|
sTWSData.sDrawCalls[iDrawCallIndex].iIndex = 0
|
|
|
|
sTWSData.sDrawCalls[iDrawCallIndex].fZIndex = sFXData[0].vSpritePos.Y + sFXData[0].vSpriteSize.y
|
|
|
|
ENDIF
|
|
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 20)
|
|
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_MAGIC_NUKE_SMALL_BLAST)
|
|
|
|
SWITCH sPlayerData.iLevel
|
|
|
|
// Random explosions on screen
|
|
CASE 1
|
|
|
|
iRandom = GET_RANDOM_INT_IN_RANGE(0,9)
|
|
|
|
SWITCH iRandom
|
|
CASE 0
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 300.0, sPlayerData.vSpritePos.y - 100.0)
|
|
BREAK
|
|
CASE 1
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 300.0, sPlayerData.vSpritePos.y - 100.0)
|
|
BREAK
|
|
CASE 2
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 150.0, sPlayerData.vSpritePos.y)
|
|
BREAK
|
|
CASE 3
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 150.0, sPlayerData.vSpritePos.y)
|
|
BREAK
|
|
CASE 4
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 300.0, sPlayerData.vSpritePos.y + 100.0)
|
|
BREAK
|
|
CASE 5
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 300.0, sPlayerData.vSpritePos.y + 100.0)
|
|
BREAK
|
|
CASE 6
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 450.0, sPlayerData.vSpritePos.y)
|
|
BREAK
|
|
CASE 7
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 450.0, sPlayerData.vSpritePos.y)
|
|
BREAK
|
|
CASE 8
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 80.0, sPlayerData.vSpritePos.y + 100.0)
|
|
BREAK
|
|
CASE 9
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 80.0, sPlayerData.vSpritePos.y + 100.0)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
BREAK
|
|
|
|
// Explosions with a defined pattern T
|
|
CASE 2
|
|
SWITCH sPlayerData.iSuperAttackStage
|
|
CASE 0
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 100.0, sPlayerData.vSpritePos.y)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x, sPlayerData.vSpritePos.y + 100.0)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 100.0, sPlayerData.vSpritePos.y)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
sPlayerData.iSuperAttackStage ++
|
|
|
|
BREAK
|
|
CASE 1
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 250.0, sPlayerData.vSpritePos.y)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x, sPlayerData.vSpritePos.y + 250.0)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 250.0, sPlayerData.vSpritePos.y)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
sPlayerData.iSuperAttackStage ++
|
|
|
|
BREAK
|
|
CASE 2
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 400.0, sPlayerData.vSpritePos.y)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x, sPlayerData.vSpritePos.y + 400.0)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 400.0, sPlayerData.vSpritePos.y)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
sPlayerData.iSuperAttackStage ++
|
|
|
|
BREAK
|
|
CASE 3
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 550.0, sPlayerData.vSpritePos.y)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x, sPlayerData.vSpritePos.y + 550.0)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 550.0, sPlayerData.vSpritePos.y)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
sPlayerData.iSuperAttackStage = 0
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
// Explosions on the enemies on screen
|
|
CASE 3
|
|
|
|
SWITCH sPlayerData.iSuperAttackStage
|
|
CASE 0
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 200.0, sPlayerData.vSpritePos.y - 150)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 300.0, sPlayerData.vSpritePos.y)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 200.0, sPlayerData.vSpritePos.y + 150)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 200.0, sPlayerData.vSpritePos.y - 150)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 300.0, sPlayerData.vSpritePos.y)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 200.0, sPlayerData.vSpritePos.y + 150)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
sPlayerData.iSuperAttackStage ++
|
|
BREAK
|
|
CASE 1
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 330.0, sPlayerData.vSpritePos.y - 150)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 430.0, sPlayerData.vSpritePos.y)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 330.0, sPlayerData.vSpritePos.y + 150)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 330.0, sPlayerData.vSpritePos.y - 150)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 430.0, sPlayerData.vSpritePos.y)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 330.0, sPlayerData.vSpritePos.y + 150)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
sPlayerData.iSuperAttackStage ++
|
|
BREAK
|
|
CASE 2
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 480.0, sPlayerData.vSpritePos.y - 150)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 580.0, sPlayerData.vSpritePos.y)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 480.0, sPlayerData.vSpritePos.y + 150)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 480.0, sPlayerData.vSpritePos.y - 150)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 580.0, sPlayerData.vSpritePos.y)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 480.0, sPlayerData.vSpritePos.y + 150)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
sPlayerData.iSuperAttackStage ++
|
|
BREAK
|
|
CASE 3
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 580.0, sPlayerData.vSpritePos.y - 150)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 680.0, sPlayerData.vSpritePos.y)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x + 580.0, sPlayerData.vSpritePos.y + 150)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 580.0, sPlayerData.vSpritePos.y - 150)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 680.0, sPlayerData.vSpritePos.y)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
vPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - 580.0, sPlayerData.vSpritePos.y + 150)
|
|
TWS_CREATE_FX(vPos, TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
sPlayerData.iSuperAttackStage = 0
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
INT i, j
|
|
FOR i = 0 TO ciTWS_MAX_ENEMIES -1
|
|
FOR j = 1 TO ciTWS_MAX_FX -1
|
|
IF sEnemyData[i].bIsActive AND sEnemyData[i].eEnemyState != TWS_ENEMY_INACTIVE AND sFXData[j].eType = TWS_FX_SUPERATTACK_EXPLOSION AND sFXData[j].bActive AND sEnemyData[i].fHealth > 0.0 AND VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sFXData[j].vSpritePos) < 300.0
|
|
|
|
sEnemyData[i].bIsHit = TRUE
|
|
|
|
IF sPlayerData.iLevel = 3
|
|
IF i = sTWSData.iBossEnemyIndex
|
|
IF sEnemyData[i].eEnemyState = TWS_ENEMY_IDLE
|
|
sEnemyData[i].fHealth = CLAMP(sEnemyData[i].fHealth - 0.025, 0.015, 1.0)
|
|
|
|
ELIF sEnemyData[i].eEnemyState = TWS_ENEMY_LANDING
|
|
sEnemyData[i].fHealth = CLAMP(sEnemyData[i].fHealth - 0.025, 0.015, 1.0)
|
|
|
|
ELIF sEnemyData[i].eEnemyState != TWS_ENEMY_STUN
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_1
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_2
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_3
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_4
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_5
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_6
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_7
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_8
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_EXPLODING
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_FALL
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_FLAT
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_TELEPORT_IN
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_TELEPORT_OUT
|
|
|
|
sEnemyData[i].fHealth = CLAMP(sEnemyData[i].fHealth - 0.01, 0.015, 1.0)
|
|
CPRINTLN(DEBUG_MINIGAME, "Boss hit (Minor damage: ",sEnemyData[i].fHealth, ")")
|
|
ENDIF
|
|
ELSE
|
|
sEnemyData[i].fHealth -= 1.0
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_MINIGAME, "Player damaged enemy ",i," with magic. Enemy health: ", sEnemyData[i].fHealth)
|
|
|
|
IF sEnemyData[i].fHealth <= 0.0
|
|
IF sTWSData.iBossEnemyIndex != i
|
|
IF sPlayerData.bFacingLeft
|
|
TWS_SPAWN_FALLING_ITEMS(INIT_VECTOR_2D(sPlayerData.vSpritePos.x - cfGAME_SCREEN_WIDTH/4 + GET_RANDOM_FLOAT_IN_RANGE(-5.0, 5.0)*20, cfBASE_SCREEN_HEIGHT/4*3 + GET_RANDOM_FLOAT_IN_RANGE(-5.0, 5.0)*20), sEnemyData[i].eEnemyType)
|
|
ELSE
|
|
TWS_SPAWN_FALLING_ITEMS(INIT_VECTOR_2D(sPlayerData.vSpritePos.x + cfGAME_SCREEN_WIDTH/4 + GET_RANDOM_FLOAT_IN_RANGE(-5.0, 5.0)*20, cfBASE_SCREEN_HEIGHT/4*3 + GET_RANDOM_FLOAT_IN_RANGE(-5.0, 5.0)*20), sEnemyData[i].eEnemyType)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
TWS_ADD_SCORE_FOR_KILL(sEnemyData[i].eEnemyType)
|
|
ENDIF
|
|
|
|
ELSE
|
|
IF i = sTWSData.iBossEnemyIndex
|
|
IF sEnemyData[i].eEnemyState = TWS_ENEMY_IDLE
|
|
sEnemyData[i].fHealth = CLAMP(sEnemyData[i].fHealth - 0.025, 0.000, 1.0)
|
|
|
|
ELIF sEnemyData[i].eEnemyState = TWS_ENEMY_LANDING
|
|
sEnemyData[i].fHealth = CLAMP(sEnemyData[i].fHealth - 0.025, 0.015, 1.0)
|
|
|
|
ELIF sEnemyData[i].eEnemyState != TWS_ENEMY_STUN
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_1
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_2
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_3
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_4
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_5
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_6
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_7
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_DYING_8
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_EXPLODING
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_FALL
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_FLAT
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_TELEPORT_IN
|
|
AND sEnemyData[i].eEnemyState != TWS_ENEMY_TELEPORT_OUT
|
|
|
|
sEnemyData[i].fHealth = CLAMP(sEnemyData[i].fHealth - 0.01, 0.015, 1.0)
|
|
CPRINTLN(DEBUG_MINIGAME, "Boss hit (Minor damage: ",sEnemyData[i].fHealth, ")")
|
|
ENDIF
|
|
ELSE
|
|
sEnemyData[i].fHealth -= 0.2
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_MINIGAME, "Player damaged enemy ",i," with magic. Enemy health: ", sEnemyData[i].fHealth)
|
|
|
|
IF sEnemyData[i].fHealth <= 0.0
|
|
IF sTWSData.iBossEnemyIndex != i
|
|
IF sPlayerData.bFacingLeft
|
|
TWS_SPAWN_FALLING_ITEMS(INIT_VECTOR_2D(sPlayerData.vSpritePos.x - cfGAME_SCREEN_WIDTH/4 + GET_RANDOM_FLOAT_IN_RANGE(-5.0, 5.0)*20, cfBASE_SCREEN_HEIGHT/4*3 + GET_RANDOM_FLOAT_IN_RANGE(-5.0, 5.0)*20), sEnemyData[i].eEnemyType)
|
|
ELSE
|
|
TWS_SPAWN_FALLING_ITEMS(INIT_VECTOR_2D(sPlayerData.vSpritePos.x + cfGAME_SCREEN_WIDTH/4 + GET_RANDOM_FLOAT_IN_RANGE(-5.0, 5.0)*20, cfBASE_SCREEN_HEIGHT/4*3 + GET_RANDOM_FLOAT_IN_RANGE(-5.0, 5.0)*20), sEnemyData[i].eEnemyType)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
TWS_ADD_SCORE_FOR_KILL(sEnemyData[i].eEnemyType)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDFOR
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_INCREMENT_ANIM_FRAME_FOR_PLAYER()
|
|
|
|
SWITCH sPlayerData.ePlayerState
|
|
|
|
// 10 FPS
|
|
CASE TWS_IDLE
|
|
CASE TWS_EVOLVING
|
|
CASE TWS_EVOLVING_2
|
|
CASE TWS_EVOLVING_3
|
|
CASE TWS_EVOLVING_4
|
|
CASE TWS_EVOLVING_5
|
|
CASE TWS_EVOLVING_6
|
|
|
|
sPlayerData.iSpriteAnimFrame += sPlayerData.iSlowUpdateFrames
|
|
BREAK
|
|
|
|
// 15 FPS
|
|
CASE TWS_INTRO
|
|
CASE TWS_WALK
|
|
CASE TWS_SUPERATTACK
|
|
CASE TWS_ATTACK
|
|
CASE TWS_ATTACK_DOUBLE
|
|
CASE TWS_ATTACK_LOW
|
|
CASE TWS_CHARGE
|
|
CASE TWS_FALL_HOLE_1
|
|
CASE TWS_FALL_HOLE_2
|
|
CASE TWS_FALL
|
|
CASE TWS_FALL_HIGH
|
|
CASE TWS_FALL_2
|
|
CASE TWS_FLAT
|
|
CASE TWS_STUN
|
|
CASE TWS_DEAD
|
|
CASE TWS_GETTING_UP
|
|
CASE TWS_JUMP_ATTACK
|
|
CASE TWS_JUMP_ATTACK_DESCEND
|
|
CASE TWS_JUMP_START
|
|
CASE TWS_JUMP_ASCEND
|
|
CASE TWS_JUMP_CREST
|
|
CASE TWS_JUMP_DESCEND
|
|
CASE TWS_JUMP_END
|
|
CASE TWS_FALL_INFINITE
|
|
|
|
sPlayerData.iSpriteAnimFrame += sPlayerData.iDefaultUpdateFrames
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
PROC TWS_RESET_PLAYER_AFTER_DYING(BOOL bFalling = FALSE)
|
|
|
|
IF sTWSData.eLevelStage != TWS_LEVEL_PLAYING
|
|
AND sTWSData.eLevelStage != TWS_LEVEL_BOSS_FIGHT
|
|
EXIT
|
|
ENDIF
|
|
|
|
// Lifes
|
|
sPlayerData.iLifes --
|
|
|
|
CPRINTLN(DEBUG_MINIGAME, "Wizard's Ruin - Player died and has now ", sPlayerData.iLifes, " lives left.")
|
|
|
|
IF sPlayerData.iLifes <= 0
|
|
|
|
DEGENATRON_GAMES_ANIMATION_SET_STATE(DEGENATRON_GAMES_ANIMATION_STATE_GAMEOVER)
|
|
sTWSData.eLevelStage = TWS_LEVEL_DEAD
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
sHUDData[TWS_HUD_GAMEOVER].bActive = TRUE
|
|
EXIT
|
|
|
|
ELSE
|
|
DEGENATRON_GAMES_ANIMATION_SET_STATE(DEGENATRON_GAMES_ANIMATION_STATE_DEAD)
|
|
ENDIF
|
|
|
|
// Health
|
|
sPlayerData.fHealth = 1.0
|
|
|
|
// Evolution
|
|
IF sPlayerData.iLevel > 1
|
|
sPlayerData.iLevel --
|
|
ENDIF
|
|
|
|
TWS_RESET_PLAYER_VARIABLES()
|
|
|
|
IF sTWSData.eLevelStage = TWS_LEVEL_PLAYING
|
|
// Move player to level start
|
|
IF bFalling
|
|
IF sTWSData.bLockedScreen
|
|
|
|
sPlayerData.vSpritePos = INIT_VECTOR_2D(sTWSData.fLockedScreenPos, -300)
|
|
sPlayerData.vInitialJumpPos = INIT_VECTOR_2D(sTWSData.fLockedScreenPos, cfBASE_SCREEN_HEIGHT*0.55)
|
|
ELSE
|
|
|
|
sPlayerData.vSpritePos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - cfBASE_SCREEN_WIDTH*0.25, -300)
|
|
sPlayerData.vInitialJumpPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x - cfBASE_SCREEN_WIDTH*0.25, cfBASE_SCREEN_HEIGHT*0.55)
|
|
ENDIF
|
|
|
|
sPlayerData.bIsJumping = TRUE
|
|
TWS_SET_PLAYER_STATE(TWS_FALL_HIGH)
|
|
|
|
ELSE
|
|
sPlayerData.vSpritePos = INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2)
|
|
TWS_SET_PLAYER_STATE(TWS_GETTING_UP)
|
|
TWS_FADE_IN()
|
|
ENDIF
|
|
|
|
ELIF sTWSData.eLevelStage = TWS_LEVEL_BOSS_FIGHT
|
|
sPlayerData.bFacingLeft = FALSE
|
|
TWS_RESET_BOSS_FIGHT()
|
|
TWS_SET_PLAYER_STATE(TWS_INTRO)
|
|
sPlayerData.vSpritePos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfGAME_SCREEN_WIDTH*0.6, cfBASE_SCREEN_HEIGHT/3*2)
|
|
// TWS_FADE_IN()
|
|
ENDIF
|
|
|
|
// Frames
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_HANDLE_PLAYER_STATE()
|
|
|
|
TWS_INCREMENT_ANIM_FRAME_FOR_PLAYER()
|
|
|
|
IF sPlayerData.bIsInvincible AND GET_GAME_TIMER() - sPlayerData.iStunTime > ciTWS_INVINCIBLE_AFTER_HIT_TIME
|
|
sPlayerData.bIsInvincible = FALSE
|
|
sPlayerData.iStunTime = 0
|
|
ENDIF
|
|
|
|
SWITCH sPlayerData.ePlayerState
|
|
CASE TWS_IDLE
|
|
|
|
IF sPlayerData.iSpriteAnimFrame >= ciTWS_IDLE_ANIM_FRAMES
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF sPlayerData.bIsAttacking
|
|
IF sPlayerData.bAttackIsLow
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_KICK_SWIPE, sPlayerData.iLevel)
|
|
TWS_SET_PLAYER_STATE(TWS_ATTACK_LOW)
|
|
ELSE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_SHORT_SWIPE, sPlayerData.iLevel)
|
|
TWS_SET_PLAYER_STATE(TWS_ATTACK)
|
|
ENDIF
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_MELEE, sPlayerData.iLevel)
|
|
sPlayerData.bIsInvincible = FALSE
|
|
|
|
ENDIF
|
|
|
|
IF sPlayerData.bIsCharging
|
|
TWS_SET_PLAYER_STATE(TWS_CHARGE)
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
sPlayerData.bIsAttacking = TRUE
|
|
sPlayerData.bIsInvincible = FALSE
|
|
sPlayerData.iStunTime = GET_GAME_TIMER()
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_DASH_SWIPE, sPlayerData.iLevel)
|
|
ENDIF
|
|
|
|
IF NOT sPlayerData.bIsInvincible AND sPlayerData.bIsHit
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
|
|
IF NOT sPlayerData.bIsJumping
|
|
sPlayerData.vInitialJumpPos = sPlayerData.vSpritePos
|
|
ENDIF
|
|
IF sPlayerData.bIsFalling OR sPlayerData.fHealth < 0.01
|
|
TWS_SET_PLAYER_STATE(TWS_FALL)
|
|
ELSE
|
|
sPlayerData.iStunTime = GET_GAME_TIMER()
|
|
TWS_SET_PLAYER_STATE(TWS_STUN)
|
|
ENDIF
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_HIT_BY_ENEMY, sPlayerData.iLevel)
|
|
|
|
ENDIF
|
|
|
|
IF sPlayerData.bIsMoving
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
TWS_SET_PLAYER_STATE(TWS_WALK)
|
|
ARCADE_GAMES_SOUND_PLAY_LOOP(ARCADE_GAMES_SOUND_TWR_PLAYER_WALK_LOOP)
|
|
ENDIF
|
|
|
|
IF sPlayerData.bIsJumping
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_JUMP, sPlayerData.iLevel)
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
TWS_SET_PLAYER_STATE(TWS_JUMP_START)
|
|
ENDIF
|
|
|
|
IF sPlayerData.bIsEvolving AND sPlayerData.iLevel < 3
|
|
IF sPlayerData.bIsUsingMagic
|
|
sPlayerData.fMagic = 0.0
|
|
sPlayerData.bIsUsingMagic = FALSE
|
|
ENDIF
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
sPlayerData.bIsInvincible = TRUE
|
|
ARCADE_GAMES_AUDIO_SCENE_START(TWR_AUDIO_SCENE_TRANSFORMATION)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_LEVEL_UP_SWORD, sPlayerData.iLevel)
|
|
TWS_SET_PLAYER_STATE(TWS_EVOLVING)
|
|
|
|
ELIF sPlayerData.bIsUsingMagic
|
|
sPlayerData.bIsInvincible = FALSE
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
sPlayerData.iStunTime = GET_GAME_TIMER()
|
|
TWS_ACTIVATE_CAMERA_SHAKE(TRUE)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_MAGIC_NUKE_CAST, sPlayerData.iLevel)
|
|
TWS_SET_PLAYER_STATE(TWS_SUPERATTACK)
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_INTRO
|
|
|
|
IF sPlayerData.iSpriteAnimFrame >= ciTWS_WALK_ANIM_FRAMES
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF ARCADE_GAMES_SOUND_HAS_FINISHED(ARCADE_GAMES_SOUND_TWR_PLAYER_WALK_LOOP)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_WALK_LOOP)
|
|
ENDIF
|
|
|
|
IF sTWSData.eLevelStage != TWS_LEVEL_BOSS_FIGHT AND sPlayerData.vSpritePos.x >= cfBASE_SCREEN_WIDTH/2
|
|
OR sTWSData.eLevelStage = TWS_LEVEL_BOSS_FIGHT AND sPlayerData.vSpritePos.x >= sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos
|
|
sPlayerData.bIsMoving = FALSE
|
|
sPlayerData.bIsInvincible = FALSE
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
IF sTWSData.eCurrentLevel != TWS_FOREST_INTRO
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_LEVEL_BEGIN)
|
|
ENDIF
|
|
ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_PLAYER_WALK_LOOP)
|
|
TWS_SET_PLAYER_STATE(TWS_IDLE)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_WALK
|
|
|
|
IF sPlayerData.iSpriteAnimFrame >= ciTWS_WALK_ANIM_FRAMES
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF sPlayerData.bIsAttacking
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_PLAYER_WALK_LOOP)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_MELEE, sPlayerData.iLevel)
|
|
IF sPlayerData.bAttackIsLow
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_KICK_SWIPE, sPlayerData.iLevel)
|
|
TWS_SET_PLAYER_STATE(TWS_ATTACK_LOW)
|
|
ELSE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_SHORT_SWIPE, sPlayerData.iLevel)
|
|
TWS_SET_PLAYER_STATE(TWS_ATTACK)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sPlayerData.bIsCharging
|
|
TWS_SET_PLAYER_STATE(TWS_CHARGE)
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
sPlayerData.bIsAttacking = TRUE
|
|
sPlayerData.bIsInvincible = FALSE
|
|
sPlayerData.iStunTime = GET_GAME_TIMER()
|
|
ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_PLAYER_WALK_LOOP)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_DASH_SWIPE, sPlayerData.iLevel)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_MELEE, sPlayerData.iLevel)
|
|
ENDIF
|
|
|
|
IF sPlayerData.bIsHit
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
IF NOT sPlayerData.bIsJumping OR sPlayerData.fHealth < 0.01
|
|
sPlayerData.vInitialJumpPos = sPlayerData.vSpritePos
|
|
ENDIF
|
|
IF sPlayerData.bIsFalling OR sPlayerData.fHealth < 0.01
|
|
TWS_SET_PLAYER_STATE(TWS_FALL)
|
|
ELSE
|
|
sPlayerData.iStunTime = GET_GAME_TIMER()
|
|
TWS_SET_PLAYER_STATE(TWS_STUN)
|
|
ENDIF
|
|
ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_PLAYER_WALK_LOOP)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_HIT_BY_ENEMY, sPlayerData.iLevel)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_HURT, sPlayerData.iLevel)
|
|
ENDIF
|
|
|
|
IF NOT sPlayerData.bIsMoving
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_PLAYER_WALK_LOOP)
|
|
TWS_SET_PLAYER_STATE(TWS_IDLE)
|
|
ENDIF
|
|
|
|
IF sPlayerData.bIsJumping
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_JUMP, sPlayerData.iLevel)
|
|
ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_PLAYER_WALK_LOOP)
|
|
TWS_SET_PLAYER_STATE(TWS_JUMP_START)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_EVOLVING
|
|
|
|
IF sPlayerData.iSpriteAnimFrame >= ciTWS_EVOLVING_ANIM_FRAMES
|
|
sPlayerData.iStunTime = GET_GAME_TIMER()
|
|
TWS_SET_PLAYER_STATE(TWS_EVOLVING_2)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
// Brief pause with the sword up
|
|
CASE TWS_EVOLVING_2
|
|
|
|
IF GET_GAME_TIMER() - sPlayerData.iStunTime > 750
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
IF sPlayerData.iLevel < 3
|
|
TWS_SET_PLAYER_STATE(TWS_EVOLVING_3)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_LEVEL_UP_SCREEN, sPlayerData.iLevel)
|
|
ELSE
|
|
sPlayerData.iLevel ++
|
|
sPlayerData.iStunTime = GET_GAME_TIMER()
|
|
TWS_SET_PLAYER_STATE(TWS_EVOLVING_4)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
// Chest anim
|
|
CASE TWS_EVOLVING_3
|
|
IF sPlayerData.iSpriteAnimFrame >= ciTWS_EVOLVING_CHEST_ANIM_FRAMES
|
|
sPlayerData.iSpriteAnimFrame = ciTWS_EVOLVING_ANIM_FRAMES
|
|
sPlayerData.iLevel ++
|
|
sPlayerData.iSuperAttackStage = sPlayerData.iLevel
|
|
sPlayerData.iStunTime = GET_GAME_TIMER()
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_LEVEL_UP_IG, sPlayerData.iLevel)
|
|
TWS_SET_PLAYER_STATE(TWS_EVOLVING_4)
|
|
ENDIF
|
|
BREAK
|
|
|
|
// After anim
|
|
CASE TWS_EVOLVING_4
|
|
|
|
IF SIN(GET_GAME_TIMER()/0.5) > 0.0
|
|
AND sPlayerData.iLevel < sPlayerData.iSuperAttackStage
|
|
sPlayerData.iLevel ++
|
|
TWS_SET_PLAYER_STATE(TWS_EVOLVING_4)
|
|
|
|
ELIF SIN(GET_GAME_TIMER()/0.5) < 0.0
|
|
AND sPlayerData.iLevel = sPlayerData.iSuperAttackStage
|
|
sPlayerData.iLevel --
|
|
TWS_SET_PLAYER_STATE(TWS_EVOLVING_4)
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - sPlayerData.iStunTime > 500
|
|
|
|
sPlayerData.iLevel = sPlayerData.iSuperAttackStage
|
|
TWS_SET_PLAYER_STATE(TWS_EVOLVING_4)
|
|
|
|
sPlayerData.iSuperAttackStage = 0
|
|
|
|
IF sPlayerData.iLevel < 3
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sPlayerData.vSpritePos.x, sPlayerData.vSpritePos.Y - 20), TWS_FX_CLOTHES, sPlayerData.vSpritePos.y + sPlayerData.vSpriteSize.y + 20.0)
|
|
ENDIF
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_LEVEL_UP, sPlayerData.iLevel)
|
|
|
|
sPlayerData.iStunTime = GET_GAME_TIMER()
|
|
TWS_SET_PLAYER_STATE(TWS_EVOLVING_5)
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_EVOLVING_5
|
|
IF GET_GAME_TIMER() - sPlayerData.iStunTime > 500
|
|
TWS_SET_PLAYER_STATE(TWS_EVOLVING_6)
|
|
sPlayerData.iSpriteAnimFrame = 3
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_EVOLVING_6
|
|
|
|
sPlayerData.iSpriteAnimFrame -= 2 * sPlayerData.iSlowUpdateFrames
|
|
IF sPlayerData.iSpriteAnimFrame <= 0
|
|
sPlayerData.bIsEvolving = FALSE
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
sPlayerData.bIsHit = FALSE
|
|
sPlayerData.bIsInvincible = FALSE
|
|
ARCADE_GAMES_AUDIO_SCENE_STOP(TWR_AUDIO_SCENE_TRANSFORMATION)
|
|
TWS_SET_PLAYER_STATE(TWS_IDLE)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_SUPERATTACK
|
|
|
|
IF sPlayerData.iSpriteAnimFrame >= ciTWS_EVOLVING_ANIM_FRAMES -1
|
|
sPlayerData.iSpriteAnimFrame = ciTWS_EVOLVING_ANIM_FRAMES -1
|
|
ENDIF
|
|
|
|
IF sPlayerData.iSpriteAnimFrame >= ciTWS_EVOLVING_ANIM_FRAMES/2 AND GET_GAME_TIMER() - sPlayerData.iStunTime > (250 - (50 * sPlayerData.iLevel))
|
|
sPlayerData.iStunTime = GET_GAME_TIMER()
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT sTWSData.bInfiniteMagic
|
|
#ENDIF
|
|
sPlayerData.fMagic = CLAMP(sPlayerData.fMagic - 0.075 - (0.025*sPlayerData.iLevel), 0.0, 1.0)
|
|
IF sPlayerData.fMagic <= 0.0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_MANA_EMPTY)
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD
|
|
ENDIF
|
|
#ENDIF
|
|
TWS_PERFORM_SUPERATTACK()
|
|
ENDIF
|
|
|
|
IF NOT TWS_IS_PLAYER_USING_MAGIC() OR sPlayerData.fMagic < 0.05
|
|
sPlayerData.bIsUsingMagic = FALSE
|
|
sPlayerData.iSuperAttackStage = 0
|
|
sFXData[0].bActive = FALSE
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_MAGIC_SCREEN_NUKE, sPlayerData.iLevel)
|
|
TWS_SET_PLAYER_STATE(TWS_IDLE)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ATTACK
|
|
|
|
IF NOT sPlayerData.bAttackIsDouble AND sPlayerData.iSpriteAnimFrame >= ciTWS_ATTACK_SIMPLE_ANIM_FRAMES
|
|
sPlayerData.bIsAttacking = FALSE
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
|
|
ELSE
|
|
|
|
IF (sPlayerData.iLevel < 3 AND sPlayerData.bAttackIsDouble AND sPlayerData.iSpriteAnimFrame >= ciTWS_DOUBLE_ATTACK_START_FRAME)
|
|
OR (sPlayerData.iLevel >= 3 AND sPlayerData.bAttackIsDouble AND sPlayerData.iSpriteAnimFrame >= ciTWS_DOUBLE_ATTACK_EXTENDED_FRAME)
|
|
TWS_SET_PLAYER_STATE(TWS_ATTACK_DOUBLE)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_LONG_SWIPE, sPlayerData.iLevel)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF !sPlayerData.bIsAttacking
|
|
sPlayerData.bAttackIsDouble = FALSE
|
|
sPlayerData.bAttackIsLow = FALSE
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
TWS_SET_PLAYER_STATE(TWS_IDLE)
|
|
ENDIF
|
|
|
|
IF sPlayerData.bIsJumping
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
sPlayerData.bIsAttacking = FALSE
|
|
sPlayerData.bAttackIsDouble = FALSE
|
|
sPlayerData.bAttackIsLow = FALSE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_JUMP, sPlayerData.iLevel)
|
|
TWS_SET_PLAYER_STATE(TWS_JUMP_START)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ATTACK_DOUBLE
|
|
|
|
IF (sPlayerData.iLevel < 3 AND sPlayerData.bAttackIsDouble AND sPlayerData.iSpriteAnimFrame >= ciTWS_ATTACK_ANIM_FRAMES)
|
|
OR (sPlayerData.iLevel >= 3 AND sPlayerData.bAttackIsDouble AND sPlayerData.iSpriteAnimFrame >= ciTWS_ATTACK_EXTENDED_ANIM_FRAMES)
|
|
sPlayerData.bIsAttacking = FALSE
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF !sPlayerData.bIsAttacking
|
|
sPlayerData.bAttackIsDouble = FALSE
|
|
sPlayerData.bAttackIsLow = FALSE
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
TWS_SET_PLAYER_STATE(TWS_IDLE)
|
|
ENDIF
|
|
|
|
IF sPlayerData.bIsJumping
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
sPlayerData.bIsAttacking = FALSE
|
|
sPlayerData.bAttackIsDouble = FALSE
|
|
sPlayerData.bAttackIsLow = FALSE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_JUMP, sPlayerData.iLevel)
|
|
TWS_SET_PLAYER_STATE(TWS_JUMP_START)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ATTACK_LOW
|
|
|
|
IF sPlayerData.iSpriteAnimFrame >= ciTWS_ATTACK_SIMPLE_ANIM_FRAMES
|
|
sPlayerData.bIsAttacking = FALSE
|
|
sPlayerData.bAttackIsLow = FALSE
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF !sPlayerData.bIsAttacking
|
|
sPlayerData.bAttackIsDouble = FALSE
|
|
sPlayerData.bAttackIsLow = FALSE
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
TWS_SET_PLAYER_STATE(TWS_IDLE)
|
|
ENDIF
|
|
|
|
IF sPlayerData.bIsJumping
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_JUMP, sPlayerData.iLevel)
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
sPlayerData.bIsAttacking = FALSE
|
|
sPlayerData.bAttackIsDouble = FALSE
|
|
sPlayerData.bAttackIsLow = FALSE
|
|
TWS_SET_PLAYER_STATE(TWS_JUMP_START)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_CHARGE
|
|
|
|
IF sPlayerData.iSpriteAnimFrame >= ciTWS_DASH_ANIM_FRAMES
|
|
sPlayerData.iSpriteAnimFrame = ciTWS_DASH_ANIM_FRAMES - 1
|
|
ENDIF
|
|
|
|
IF sPlayerData.iSpriteAnimFrame >= ciTWS_DASH_START_ANIM_FRAME
|
|
IF sPlayerData.bFacingLeft
|
|
sPlayerData.vSpritePos.x = sPlayerData.vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER*2
|
|
ELSE
|
|
sPlayerData.vSpritePos.x = sPlayerData.vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER*2
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - sPlayerData.iStunTime > 500
|
|
sPlayerData.bIsCharging = FALSE
|
|
sPlayerData.bIsAttacking = FALSE
|
|
sPlayerData.bAttackIsDouble = FALSE
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
sPlayerData.iLastCharge = GET_GAME_TIMER()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT sTWSData.bInfiniteMagic
|
|
#ENDIF
|
|
sPlayerData.fMagic -= 0.30
|
|
IF sPlayerData.fMagic <= 0.0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_MANA_EMPTY)
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
TWS_SET_PLAYER_STATE(TWS_IDLE)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_FALL_HOLE_1
|
|
|
|
IF sPlayerData.iSpriteAnimFrame >= ciTWS_FALL_HOLE_ANIM_FRAMES
|
|
|
|
sPlayerData.iStunTime = GET_GAME_TIMER()
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_FALL_TO_DEATH, sPlayerData.iLevel)
|
|
TWS_SET_PLAYER_STATE(TWS_FALL_HOLE_2)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_FALL_HOLE_2
|
|
|
|
IF GET_GAME_TIMER() - sPlayerData.iStunTime > 1000
|
|
sPlayerData.vSpritePos.y = 2000
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] Player fell in hole.")
|
|
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
TWS_SET_PLAYER_STATE(TWS_DEAD)
|
|
|
|
IF sPlayerData.iLifes <= 1
|
|
TWS_FADE_OUT()
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_STUN
|
|
|
|
IF GET_GAME_TIMER() - sPlayerData.iStunTime > 500
|
|
sPlayerData.bIsHit = FALSE
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
TWS_SET_PLAYER_STATE(TWS_IDLE)
|
|
sPlayerData.iStunTime = GET_GAME_TIMER()
|
|
sPlayerData.bIsInvincible = TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_FALL
|
|
|
|
IF VECTOR_2D_DIST(sPlayerData.vInitialJumpPos, sPlayerData.vSpritePos) < 260.0
|
|
IF sPlayerData.bFacingLeft
|
|
sPlayerData.vSpritePos.x = sPlayerData.vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER*1.25
|
|
ELSE
|
|
sPlayerData.vSpritePos.x = sPlayerData.vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER*1.25
|
|
ENDIF
|
|
ELSE
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
TWS_SET_PLAYER_STATE(TWS_FALL_2)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_FALL_HIGH
|
|
|
|
IF sPlayerData.vSpritePos.y >= sPlayerData.vInitialJumpPos.y
|
|
TWS_ACTIVATE_CAMERA_SHAKE(TRUE)
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
sPlayerData.bIsJumping = FALSE
|
|
TWS_SET_PLAYER_STATE(TWS_FALL_2)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_FALL_2
|
|
|
|
IF sPlayerData.iSpriteAnimFrame != 0
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
TWS_SET_PLAYER_STATE(TWS_FLAT)
|
|
sPlayerData.iStunTime = GET_GAME_TIMER()
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_BODYFALL, sPlayerData.iLevel)
|
|
IF sPlayerData.iLevel > 1
|
|
TWS_ACTIVATE_CAMERA_SHAKE(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_FLAT
|
|
|
|
IF GET_GAME_TIMER() - sPlayerData.iStunTime > 250 AND TWS_IS_CAMERA_SHAKE_ACTIVE()
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
ENDIF
|
|
|
|
IF sPlayerData.fHealth <= 0.01
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] Player died.")
|
|
// TWS_FADE_OUT()
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_DEATH, sPlayerData.iLevel)
|
|
sPlayerData.bIsInvincible = TRUE
|
|
sPlayerData.bIsFalling = FALSE
|
|
TWS_SET_PLAYER_STATE(TWS_DEAD)
|
|
|
|
ELSE
|
|
IF GET_GAME_TIMER() - sPlayerData.iStunTime > 1000
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
sPlayerData.bIsFalling = FALSE
|
|
TWS_SET_PLAYER_STATE(TWS_GETTING_UP)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_DEAD
|
|
|
|
IF TWS_IS_SCREEN_FADED_OUT()
|
|
TWS_RESET_PLAYER_AFTER_DYING()
|
|
|
|
ELIF NOT TWS_IS_SCREEN_FADING_OUT() AND GET_GAME_TIMER() - sPlayerData.iStunTime > 1000
|
|
TWS_RESET_PLAYER_AFTER_DYING(TRUE)
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_GETTING_UP
|
|
|
|
IF (sPlayerData.iLevel < 3 AND sPlayerData.iSpriteAnimFrame >= ciTWS_GETTING_UP_ANIM_FRAMES)
|
|
OR (sPlayerData.iLevel >= 3 AND sPlayerData.iSpriteAnimFrame >= ciTWS_GETTING_UP_EXTENDED_ANIM_FRAMES)
|
|
|
|
sPlayerData.bIsHit = FALSE
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
TWS_SET_PLAYER_STATE(TWS_IDLE)
|
|
sPlayerData.iStunTime = GET_GAME_TIMER()
|
|
sPlayerData.bIsInvincible = TRUE
|
|
|
|
ELSE
|
|
SWITCH sPlayerData.iLevel
|
|
CASE 1
|
|
SWITCH sPlayerData.iSpriteAnimFrame
|
|
CASE 0
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_HURT_GETUP_1_WIDTH, cfTWS_PLAYER_HURT_GETUP_1_HEIGHT)
|
|
BREAK
|
|
CASE 1
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_HURT_GETUP_2_WIDTH, cfTWS_PLAYER_HURT_GETUP_2_HEIGHT)
|
|
BREAK
|
|
CASE 2
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_HURT_GETUP_3_WIDTH, cfTWS_PLAYER_HURT_GETUP_3_HEIGHT)
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
CASE 2
|
|
SWITCH sPlayerData.iSpriteAnimFrame
|
|
CASE 0
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_HURT_GETUP_1_WIDTH, cfTWS_PLAYER_2_HURT_GETUP_1_HEIGHT)
|
|
BREAK
|
|
CASE 1
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_HURT_GETUP_2_WIDTH, cfTWS_PLAYER_2_HURT_GETUP_2_HEIGHT)
|
|
BREAK
|
|
CASE 2
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_2_HURT_GETUP_3_WIDTH, cfTWS_PLAYER_2_HURT_GETUP_3_HEIGHT)
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
CASE 3
|
|
SWITCH sPlayerData.iSpriteAnimFrame
|
|
CASE 0
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_HURT_GETUP_1_WIDTH, cfTWS_PLAYER_3_HURT_GETUP_1_HEIGHT)
|
|
BREAK
|
|
CASE 1
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_HURT_GETUP_2_WIDTH, cfTWS_PLAYER_3_HURT_GETUP_2_HEIGHT)
|
|
BREAK
|
|
CASE 2
|
|
sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_3_HURT_GETUP_3_WIDTH, cfTWS_PLAYER_3_HURT_GETUP_3_HEIGHT)
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_JUMP_ATTACK
|
|
|
|
IF sPlayerData.iSpriteAnimFrame >= ciTWS_JUMP_KICK_ANIM_FRAMES
|
|
sPlayerData.iSpriteAnimFrame = ciTWS_JUMP_KICK_ANIM_FRAMES-1
|
|
ENDIF
|
|
|
|
IF sPlayerData.fJumpAcceleration <= 0
|
|
TWS_SET_PLAYER_STATE(TWS_JUMP_ATTACK_DESCEND)
|
|
sPlayerData.iSpriteAnimFrame = 2
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_JUMP_ATTACK_DESCEND
|
|
|
|
IF sPlayerData.vSpritePos.y >= sPlayerData.vInitialJumpPos.y
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_JUMP_LAND, sPlayerData.iLevel)
|
|
TWS_SET_PLAYER_STATE(TWS_JUMP_END)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_JUMP_START
|
|
|
|
IF sPlayerData.iSpriteAnimFrame >= 1
|
|
TWS_SET_PLAYER_STATE(TWS_JUMP_ASCEND)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_JUMP_ASCEND
|
|
|
|
IF sPlayerData.fJumpAcceleration <= 5
|
|
TWS_SET_PLAYER_STATE(TWS_JUMP_CREST)
|
|
ENDIF
|
|
|
|
IF sPlayerData.bIsAttacking
|
|
TWS_SET_PLAYER_STATE(TWS_JUMP_ATTACK)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_JUMP_KICK_SWIPE, sPlayerData.iLevel)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_MELEE, sPlayerData.iLevel)
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_JUMP_CREST
|
|
|
|
IF sPlayerData.fJumpAcceleration <= 0
|
|
TWS_SET_PLAYER_STATE(TWS_JUMP_DESCEND)
|
|
ENDIF
|
|
|
|
IF sPlayerData.bIsAttacking
|
|
TWS_SET_PLAYER_STATE(TWS_JUMP_ATTACK)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_JUMP_KICK_SWIPE, sPlayerData.iLevel)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_MELEE, sPlayerData.iLevel)
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_JUMP_DESCEND
|
|
|
|
IF sPlayerData.vSpritePos.y >= sPlayerData.vInitialJumpPos.y
|
|
IF sPlayerData.iLevel > 2
|
|
TWS_ACTIVATE_CAMERA_SHAKE(TRUE)
|
|
ENDIF
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_JUMP_LAND, sPlayerData.iLevel)
|
|
TWS_SET_PLAYER_STATE(TWS_JUMP_END)
|
|
ENDIF
|
|
|
|
IF sPlayerData.bIsAttacking
|
|
TWS_SET_PLAYER_STATE(TWS_JUMP_ATTACK)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_JUMP_KICK_SWIPE, sPlayerData.iLevel)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_MELEE, sPlayerData.iLevel)
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_JUMP_END
|
|
|
|
IF (sPlayerData.bIsAttacking AND sPlayerData.iSpriteAnimFrame >= ciTWS_JUMP_END_ANIM_FRAMES) OR sPlayerData.iSpriteAnimFrame >= ciTWS_JUMP_ANIM_FRAMES
|
|
IF sPlayerData.iLevel > 2
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
ENDIF
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
sPlayerData.bIsJumping = FALSE
|
|
sPlayerData.bIsAttacking = FALSE
|
|
TWS_SET_PLAYER_STATE(TWS_IDLE)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_FALL_INFINITE
|
|
|
|
IF sPlayerData.vSpritePos.y >= cfBASE_SCREEN_HEIGHT*2
|
|
sPlayerData.bIsJumping = FALSE
|
|
sPlayerData.iSpriteAnimFrame = 0
|
|
sPlayerData.vSpritePos.y = 2000.0
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] Player fell in cliff.")
|
|
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_FALL_TO_DEATH, sPlayerData.iLevel)
|
|
TWS_SET_PLAYER_STATE(TWS_DEAD)
|
|
|
|
IF sPlayerData.iLifes <= 1
|
|
TWS_FADE_OUT()
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL TWS_IS_PLAYER_USING_FINAL_ATTACK()
|
|
|
|
IF sPlayerData.bIsAttacking AND sPlayerData.bAttackIsDouble AND sPlayerData.iSpriteAnimFrame >= ciTWS_FINAL_ATTACK_ANIM_FRAMES
|
|
CPRINTLN(DEBUG_MINIGAME, "Player is using Final Attack")
|
|
RETURN TRUE
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC TWS_INCREMENT_ANIM_FRAME_FOR_ENEMY(INT iIndex)
|
|
|
|
SWITCH sEnemyData[iIndex].eEnemyType
|
|
|
|
// 10 FPS
|
|
CASE TWS_ENEMY_BAT
|
|
CASE TWS_ENEMY_GRUNT
|
|
CASE TWS_ENEMY_GRUNT_SWORD
|
|
CASE TWS_ENEMY_GRUNT_SPEAR
|
|
CASE TWS_ENEMY_GRUNT_FIRESPEAR
|
|
CASE TWS_ENEMY_GRUNT_FIRESWORD
|
|
CASE TWS_ENEMY_GRUNT_CASTER
|
|
CASE TWS_ENEMY_GRUNT_CROSSBOW
|
|
CASE TWS_ENEMY_BRUTE
|
|
CASE TWS_ENEMY_BRUTE_AXE
|
|
CASE TWS_ENEMY_SPIDER
|
|
CASE TWS_ENEMY_SNAKE
|
|
CASE TWS_ENEMY_SLIME
|
|
CASE TWS_ENEMY_KNIGHT
|
|
CASE TWS_ENEMY_LEPRECHAUN
|
|
CASE TWS_ENEMY_BOSS_SPIDER
|
|
CASE TWS_ENEMY_BOSS_AMAZON
|
|
CASE TWS_ENEMY_BOSS_KNIGHT
|
|
CASE TWS_ENEMY_FAKE_WIZARD
|
|
CASE TWS_ENEMY_DIALOGUE_WIZARD
|
|
CASE TWS_ENEMY_BOSS_WIZARD
|
|
CASE TWS_ENEMY_BOULDER
|
|
|
|
sEnemyData[iIndex].iSpriteAnimFrame += sEnemyData[iIndex].iSlowUpdateFrames
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_FAIRY
|
|
sEnemyData[iIndex].iSpriteAnimFrame += sEnemyData[iIndex].iDefaultUpdateFrames
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
PROC TWS_HANDLE_ENEMY_STATE()
|
|
|
|
INT i
|
|
FOR i = 0 TO ciTWS_MAX_ENEMIES - 1
|
|
|
|
IF sEnemyData[i].bIsActive
|
|
|
|
TWS_INCREMENT_ANIM_FRAME_FOR_ENEMY(i)
|
|
|
|
SWITCH sEnemyData[i].eEnemyType
|
|
|
|
CASE TWS_ENEMY_BOSS_WIZARD
|
|
SWITCH sEnemyData[i].eEnemyState
|
|
|
|
|
|
CASE TWS_ENEMY_INACTIVE
|
|
IF sTWSData.eLevelStage >= TWS_LEVEL_BOSS_FIGHT
|
|
// Choose position
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos, cfBASE_SCREEN_HEIGHT/3)
|
|
sEnemyData[i].eNextState = TWS_ENEMY_SPECIAL_ATTACK
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_WIZARD_VOCAL_DIALOGUE, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_TELEPORTING)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_TELEPORT_OUT
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_WIZARD_TELEPORT_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].vSpritePos = INIT_VECTOR_2D(-5000.0,-5000.0)
|
|
CPRINTLN(DEBUG_MINIGAME, "Real Wizard warping!")
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_TELEPORTING)
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_ENEMY_TELEPORTING
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > 1000
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].vSpritePos = sEnemyData[i].vTargetPos
|
|
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_WIZARD_TELEPORT_IN, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_TELEPORT_IN)
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_ENEMY_TELEPORT_IN
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_WIZARD_TELEPORT_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
sEnemyData[i].bIsHit = FALSE
|
|
CPRINTLN(DEBUG_MINIGAME, "Real Wizard warping in!")
|
|
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_WIZARD_VOCAL_DIALOGUE, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
IF sEnemyData[i].eNextState = TWS_ENEMY_SPECIAL_ATTACK
|
|
OR sEnemyData[i].eNextState = TWS_ENEMY_SPECIAL_ATTACK_2
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_WIZARD_CAST_SPELL, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
ENDIF
|
|
TWS_SET_ENEMY_STATE(i, sEnemyData[i].eNextState)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_SPECIAL_ATTACK
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ATTACK_EXTENDED_ANIM_FRAMES
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_WIZARD_CAST_SPELL, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > 1000
|
|
|
|
IF sPlayerData.bIsJumping
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sPlayerData.vSpritePos.x,sPlayerData.vInitialJumpPos.y + sPlayerData.vSpriteSize.y - cfTWS_FX_WIZARD_PILLAR_HEIGHT), TWS_FX_MAGIC_COLUMN)
|
|
ELSE
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sPlayerData.vSpritePos.x,sPlayerData.vSpritePos.y + sPlayerData.vSpriteSize.y - cfTWS_FX_WIZARD_PILLAR_HEIGHT), TWS_FX_MAGIC_COLUMN)
|
|
ENDIF
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_BOSS_WIZARD_FLAME_PILLAR)
|
|
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].fProgressToTarget += 0.25
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].fProgressToTarget >= 1.0
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfGAME_SCREEN_WIDTH/2 + sEnemyData[i].vSpriteSize.x, sPlayerData.vSpritePos.y)
|
|
sEnemyData[i].eNextState = TWS_ENEMY_SPECIAL_ATTACK_2
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_WIZARD_TELEPORT_OUT, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_TELEPORT_OUT)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_SPECIAL_ATTACK_2
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ATTACK_EXTENDED_ANIM_FRAMES
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_WIZARD_CAST_SPELL, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > 100
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_BOSS_WIZARD_FIRE_FLAMES)
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x + (sEnemyData[i].fProgressToTarget * 1000), sEnemyData[i].vSpritePos.Y + sEnemyData[i].vSpriteSize.y - cfTWS_FX_WIZARD_FIRE_HEIGHT), TWS_FX_MAGIC_FIRE)
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].fProgressToTarget += 0.1
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].fProgressToTarget >= 1.0
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
|
|
// Spawn fakes
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + GET_RANDOM_FLOAT_IN_RANGE(-cfGAME_SCREEN_WIDTH/3, cfGAME_SCREEN_WIDTH/3), cfBASE_SCREEN_HEIGHT/2 + GET_RANDOM_FLOAT_IN_RANGE(-cfGAME_SCREEN_HEIGHT/3, cfGAME_SCREEN_HEIGHT/3))
|
|
sEnemyData[i].eNextState = TWS_ENEMY_IDLE
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(-5000, 0), TWS_ENEMY_FAKE_WIZARD)
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(-6000, 0), TWS_ENEMY_FAKE_WIZARD)
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(-7000, 0), TWS_ENEMY_FAKE_WIZARD)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_WIZARD_TELEPORT_OUT, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_TELEPORT_OUT)
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_IDLE
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_IDLE_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > 5000
|
|
CPRINTLN(DEBUG_MINIGAME, "Real Wizard starting to invoque magic pillars!")
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos, cfBASE_SCREEN_HEIGHT/3)
|
|
sEnemyData[i].eNextState = TWS_ENEMY_SPECIAL_ATTACK
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_WIZARD_TELEPORT_OUT, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_TELEPORT_OUT)
|
|
|
|
ELIF sEnemyData[i].bIsHit
|
|
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_WIZARD_VOCAL_HURT, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_STUN
|
|
|
|
sEnemyData[i].vSpritePos.x += SIN(GET_GAME_TIMER()/0.4)
|
|
|
|
IF sEnemyData[i].fHealth <= 0.0
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
TWS_ACTIVATE_CAMERA_SHAKE(TRUE)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_EXPLODING)
|
|
|
|
ELIF GET_GAME_TIMER() - sEnemyData[i].iTimer > 300
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsHit = FALSE
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos, cfBASE_SCREEN_HEIGHT/3)
|
|
sEnemyData[i].eNextState = TWS_ENEMY_SPECIAL_ATTACK
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_WIZARD_TELEPORT_OUT, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_TELEPORT_OUT)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_EXPLODING
|
|
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x + SIN(GET_GAME_TIMER()/0.4)
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_WIZARD_DYING_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].fProgressToTarget >= 1.0
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_WIZARD_DEATH_FINAL, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING)
|
|
|
|
ELIF GET_GAME_TIMER() - sEnemyData[i].iTimer > 200
|
|
|
|
sEnemyData[i].fProgressToTarget += 0.05
|
|
|
|
TWS_CREATE_FX(
|
|
INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x + GET_RANDOM_FLOAT_IN_RANGE(-sEnemyData[i].vSpriteSize.x, sEnemyData[i].vSpriteSize.x),
|
|
sEnemyData[i].vSpritePos.y + GET_RANDOM_FLOAT_IN_RANGE(-sEnemyData[i].vSpriteSize.y, sEnemyData[i].vSpriteSize.y)),
|
|
TWS_FX_SUPERATTACK_EXPLOSION)
|
|
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_BOSS_WIZARD_DEATH_BLASTS)
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_DYING
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_WIZARD_DEATH_FLASH_ANIM_FRAMES
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING_2)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_DYING_2
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_WIZARD_DEATH_ANIM_FRAMES
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_WIZARD_VOCAL_KILLED, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].iSpriteAnimFrame = ciTWS_WIZARD_DEATH_FLASH_ANIM_FRAMES
|
|
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING_3)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_DYING_3
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_WIZARD_DEATH_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DEAD)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_DEAD
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_DIALOGUE_WIZARD
|
|
CASE TWS_ENEMY_FAKE_WIZARD
|
|
SWITCH sEnemyData[i].eEnemyState
|
|
|
|
|
|
CASE TWS_ENEMY_INACTIVE
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_IDLE_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].eEnemyType = TWS_ENEMY_FAKE_WIZARD AND GET_GAME_TIMER() - sEnemyData[i].iTimer > 1500
|
|
OR sEnemyData[i].eEnemyType = TWS_ENEMY_DIALOGUE_WIZARD AND sTWSData.eGrogEncounterState >= TWS_GROG_LEAVES
|
|
|
|
// Choose position
|
|
IF sEnemyData[i].eEnemyType = TWS_ENEMY_FAKE_WIZARD
|
|
sEnemyData[i].vSpritePos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + GET_RANDOM_FLOAT_IN_RANGE(-cfGAME_SCREEN_WIDTH/3, cfGAME_SCREEN_WIDTH/3), cfBASE_SCREEN_HEIGHT/2 + GET_RANDOM_FLOAT_IN_RANGE(-cfGAME_SCREEN_HEIGHT/3, cfGAME_SCREEN_HEIGHT/3))
|
|
ELSE
|
|
sEnemyData[i].vSpritePos = INIT_VECTOR_2D(sTWSData.fLockedScreenPos + 500, cfBASE_SCREEN_HEIGHT/2)
|
|
ENDIF
|
|
sEnemyData[i].eNextState = TWS_ENEMY_IDLE
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_WIZARD_TELEPORT_IN, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_TELEPORT_IN)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_TELEPORT_OUT
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_WIZARD_TELEPORT_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_INACTIVE)
|
|
TWS_RESET_ENEMY_VARIABLES(i)
|
|
TWS_REMOVE_DRAW_CALL(TWS_ENTITY_ENEMY, i)
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_ENEMY_TELEPORT_IN
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_WIZARD_TELEPORT_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
TWS_SET_ENEMY_STATE(i, sEnemyData[i].eNextState)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_IDLE
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_IDLE_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].eEnemyType = TWS_ENEMY_FAKE_WIZARD AND (GET_GAME_TIMER() - sEnemyData[i].iTimer > 4000 OR sEnemyData[i].bIsHit OR sEnemyData[sTWSData.iBossEnemyIndex].fHealth <= 0.0)
|
|
OR sEnemyData[i].eEnemyType = TWS_ENEMY_DIALOGUE_WIZARD AND (sTWSData.eGrogEncounterState >= TWS_FIGHT_START)
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos, cfBASE_SCREEN_HEIGHT/3)
|
|
sEnemyData[i].eNextState = TWS_ENEMY_SPECIAL_ATTACK
|
|
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_WIZARD_TELEPORT_OUT, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
|
|
IF sEnemyData[i].eEnemyType = TWS_ENEMY_FAKE_WIZARD AND sEnemyData[i].bIsHit
|
|
IF sPlayerData.bFacingLeft
|
|
TWS_SPAWN_FALLING_ITEMS(INIT_VECTOR_2D(sPlayerData.vSpritePos.x - cfGAME_SCREEN_WIDTH/4 + GET_RANDOM_FLOAT_IN_RANGE(-5.0, 5.0)*20, cfBASE_SCREEN_HEIGHT/4*3 + GET_RANDOM_FLOAT_IN_RANGE(-5.0, 5.0)*20), TWS_ENEMY_FAKE_WIZARD)
|
|
ELSE
|
|
TWS_SPAWN_FALLING_ITEMS(INIT_VECTOR_2D(sPlayerData.vSpritePos.x + cfGAME_SCREEN_WIDTH/4 + GET_RANDOM_FLOAT_IN_RANGE(-5.0, 5.0)*20, cfBASE_SCREEN_HEIGHT/4*3 + GET_RANDOM_FLOAT_IN_RANGE(-5.0, 5.0)*20), TWS_ENEMY_FAKE_WIZARD)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_TELEPORT_OUT)
|
|
ENDIF
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_BOSS_KNIGHT
|
|
CASE TWS_ENEMY_KNIGHT
|
|
SWITCH sEnemyData[i].eEnemyState
|
|
|
|
CASE TWS_ENEMY_INACTIVE
|
|
|
|
IF sTWSData.eLevelStage >= TWS_LEVEL_BOSS_FIGHT
|
|
OR ABSF(sEnemyData[i].vSpritePos.x - sPlayerData.vSpritePos.x) < cfGAME_SCREEN_WIDTH*0.35
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_AGGRO, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_GO_UP)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_GO_UP
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_KNIGHT_STAND_ANIM_FRAMES
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_DRAW_SWORD, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
|
|
IF sTWSData.eLevelStage >= TWS_LEVEL_BOSS_FIGHT
|
|
IF sTWSData.eLevelStage >= TWS_LEVEL_BOSS_FIGHT AND sEnemyData[i].vSpritePos.X < sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfGAME_SCREEN_WIDTH*0.1
|
|
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfGAME_SCREEN_WIDTH*0.1, cfGAME_SCREEN_HEIGHT/3*2)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ELIF sTWSData.eLevelStage >= TWS_LEVEL_BOSS_FIGHT AND sEnemyData[i].vSpritePos.X > sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfGAME_SCREEN_WIDTH*0.1
|
|
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfGAME_SCREEN_WIDTH*0.1, cfGAME_SCREEN_HEIGHT/3*2)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ELIF sEnemyData[i].vSpritePos.Y > cfGAME_SCREEN_HEIGHT/3*2
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, cfGAME_SCREEN_HEIGHT/3*2)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ELSE
|
|
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, cfGAME_SCREEN_HEIGHT/2)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_ATTACK_VOCAL, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_ATTACK_SLAM, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_SPECIAL_ATTACK)
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF sTWSData.bLockedScreen AND sEnemyData[i].vSpritePos.X < sTWSData.fLockedScreenPos - cfGAME_SCREEN_WIDTH*0.1
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sTWSData.fLockedScreenPos + cfGAME_SCREEN_WIDTH*0.1, cfGAME_SCREEN_HEIGHT/3*2)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ELIF sTWSData.bLockedScreen AND sEnemyData[i].vSpritePos.X > sTWSData.fLockedScreenPos + cfGAME_SCREEN_WIDTH*0.1
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sTWSData.fLockedScreenPos - cfGAME_SCREEN_WIDTH*0.1, cfGAME_SCREEN_HEIGHT/3*2)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ELIF sEnemyData[i].vSpritePos.Y > cfGAME_SCREEN_HEIGHT/3*2
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, cfGAME_SCREEN_HEIGHT/3*2)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ELSE
|
|
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, cfGAME_SCREEN_HEIGHT/2)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_ATTACK_VOCAL, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_ATTACK_SLAM, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_SPECIAL_ATTACK)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_WALK
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_WALK_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sEnemyData[i].vTargetPos) < 50.0
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_ATTACK_VOCAL, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_ATTACK_SLAM, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_SPECIAL_ATTACK)
|
|
|
|
ELSE
|
|
|
|
TWS_MOVE_ENEMY(i, 30.0)
|
|
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].fHealth <= 0.0
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
|
|
IF sEnemyData[i].fHealth <= 0.01
|
|
TWS_ACTIVATE_CAMERA_SHAKE(TRUE)
|
|
sEnemyData[i].fHealth = 0.0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_DEATH, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING_1)
|
|
ELSE
|
|
CPRINTLN(DEBUG_MINIGAME, "HIT! ",sEnemyData[i].fHealth)
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_PAIN, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_SPECIAL_ATTACK
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= 10
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].fProgressToTarget = 0.2
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.X, sPlayerData.vSpritePos.y + sPlayerData.vSpriteSize.y - cfTWS_FX_KNIGHT_SWORD_HEIGHT)
|
|
TWS_ACTIVATE_CAMERA_SHAKE(TRUE)
|
|
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_SPECIAL_ATTACK_2)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_SPECIAL_ATTACK_2
|
|
|
|
IF sEnemyData[i].fProgressToTarget >= 1.2
|
|
sEnemyData[i].iSpriteAnimFrame = 10
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_STAND_UP, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_SPECIAL_ATTACK_3)
|
|
|
|
ELIF GET_GAME_TIMER() - sEnemyData[i].iTimer > 100
|
|
|
|
TWS_CREATE_FX(LERP_VECTOR_2D(INIT_VECTOR_2D(sEnemyData[i].vSpritePos.X, sEnemyData[i].vSpritePos.y + sEnemyData[i].vSpriteSize.y - cfTWS_FX_KNIGHT_SWORD_HEIGHT), sEnemyData[i].vTargetPos, sEnemyData[i].fProgressToTarget),
|
|
TWS_FX_SWORD)
|
|
|
|
sEnemyData[i].fProgressToTarget += 0.2
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_SPECIAL_ATTACK_3
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_BOSS_KNIGHT_SLAM_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
|
|
IF sEnemyData[i].iNumberOfAttacksInARow > 1
|
|
sEnemyData[i].iNumberOfAttacksInARow = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
ELSE
|
|
sEnemyData[i].iNumberOfAttacksInARow++
|
|
|
|
IF sEnemyData[i].fHealth <= 0.0
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
|
|
IF sEnemyData[i].fHealth <= 0.01
|
|
TWS_ACTIVATE_CAMERA_SHAKE(TRUE)
|
|
sEnemyData[i].fHealth = 0.0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_DEATH, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING_1)
|
|
ELSE
|
|
CPRINTLN(DEBUG_MINIGAME, "HIT! ",sEnemyData[i].fHealth)
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_PAIN, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) < 250.0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_ATTACK_SLASH, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_ATTACK)
|
|
|
|
ELSE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_ATTACK_VOCAL, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_ATTACK_SLAM, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_SPECIAL_ATTACK)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_IDLE
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_IDLE_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF (sTWSData.eLevelStage >= TWS_LEVEL_BOSS_FIGHT AND GET_GAME_TIMER() - sEnemyData[i].iTimer > 1500)
|
|
OR (sTWSData.eLevelStage < TWS_LEVEL_BOSS_FIGHT AND GET_GAME_TIMER() - sEnemyData[i].iTimer > 2000)
|
|
OR sEnemyData[i].eNextState = TWS_ENEMY_SPECIAL_ATTACK
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iNumberOfAttacksInARow = 0
|
|
sEnemyData[i].eNextState = TWS_ENEMY_IDLE
|
|
|
|
IF sTWSData.eLevelStage >= TWS_LEVEL_BOSS_FIGHT
|
|
IF sEnemyData[i].vSpritePos.X < sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfGAME_SCREEN_WIDTH*0.1
|
|
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfGAME_SCREEN_WIDTH*0.1, cfGAME_SCREEN_HEIGHT/2)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ELIF sEnemyData[i].vSpritePos.X > sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfGAME_SCREEN_WIDTH*0.1
|
|
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfGAME_SCREEN_WIDTH*0.1, cfGAME_SCREEN_HEIGHT/2)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ELIF sEnemyData[i].vSpritePos.Y > cfGAME_SCREEN_HEIGHT/3
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, cfGAME_SCREEN_HEIGHT/2)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ELSE
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) < 450.0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_ATTACK_SLASH, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_ATTACK)
|
|
ELSE
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_ATTACK_VOCAL, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_ATTACK_SLAM, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_SPECIAL_ATTACK)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF sTWSData.bLockedScreen AND sEnemyData[i].vSpritePos.X < sTWSData.fLockedScreenPos - cfGAME_SCREEN_WIDTH*0.1
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sTWSData.fLockedScreenPos + cfGAME_SCREEN_WIDTH*0.1, cfGAME_SCREEN_HEIGHT/2)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ELIF sTWSData.bLockedScreen AND sEnemyData[i].vSpritePos.X > sTWSData.fLockedScreenPos + cfGAME_SCREEN_WIDTH*0.1
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sTWSData.fLockedScreenPos - cfGAME_SCREEN_WIDTH*0.1, cfGAME_SCREEN_HEIGHT/2)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ELIF sEnemyData[i].vSpritePos.Y > cfGAME_SCREEN_HEIGHT/3
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, cfGAME_SCREEN_HEIGHT/2)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ELSE
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) < 450.0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_ATTACK_SLASH, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_ATTACK)
|
|
ELSE
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_ATTACK_VOCAL, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_ATTACK_SLAM, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_SPECIAL_ATTACK)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELIF sEnemyData[i].bIsHit OR sEnemyData[i].fHealth <= 0.0
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
|
|
IF sEnemyData[i].fHealth <= 0.01
|
|
TWS_ACTIVATE_CAMERA_SHAKE(TRUE)
|
|
sEnemyData[i].fHealth = 0.0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_DEATH, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING_1)
|
|
ELSE
|
|
CPRINTLN(DEBUG_MINIGAME, "HIT! ",sEnemyData[i].fHealth)
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_PAIN, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_ATTACK
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_ATTACK_ANIM_FRAMES
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
|
|
IF sEnemyData[i].iNumberOfAttacksInARow > 0
|
|
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_ATTACK_VOCAL, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_ATTACK_SLAM, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_SPECIAL_ATTACK)
|
|
|
|
ELSE
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_GO_UP)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].fHealth <= 0.0
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
|
|
IF sEnemyData[i].fHealth <= 0.01
|
|
TWS_ACTIVATE_CAMERA_SHAKE(TRUE)
|
|
sEnemyData[i].fHealth = 0.0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_DEATH, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING_1)
|
|
ELSE
|
|
CPRINTLN(DEBUG_MINIGAME, "HIT! ",sEnemyData[i].fHealth)
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_PAIN, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_STUN
|
|
|
|
sEnemyData[i].vSpritePos.x += SIN(GET_GAME_TIMER()/0.4)
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > 200
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
IF sEnemyData[i].iNumberOfAttacksInARow > 3
|
|
sEnemyData[i].iNumberOfAttacksInARow = 0
|
|
sEnemyData[i].vInitialPos = sEnemyData[i].vSpritePos
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_KNOCKBACK, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
|
|
IF sTWSData.eLevelStage >= TWS_LEVEL_BOSS_FIGHT
|
|
IF sEnemyData[i].fHealth > 0.55
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + GET_RANDOM_FLOAT_IN_RANGE(-500.0, -300.0), GET_RANDOM_FLOAT_IN_RANGE(-50.0, -250.0)), TWS_ENEMY_FAIRY)
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + GET_RANDOM_FLOAT_IN_RANGE(-300.0, 0.0), GET_RANDOM_FLOAT_IN_RANGE(-50.0, -250.0)), TWS_ENEMY_FAIRY)
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + GET_RANDOM_FLOAT_IN_RANGE(0.0, 300.0), GET_RANDOM_FLOAT_IN_RANGE(-50.0, -250.0)), TWS_ENEMY_FAIRY)
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + GET_RANDOM_FLOAT_IN_RANGE(300.0, 500.0), GET_RANDOM_FLOAT_IN_RANGE(-50.0, -250.0)), TWS_ENEMY_FAIRY)
|
|
|
|
ELIF sEnemyData[i].fHealth > 0.35
|
|
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfBASE_SCREEN_WIDTH/2.0, GET_RANDOM_FLOAT_IN_RANGE(550.0, 750.0)), TWS_ENEMY_GRUNT_SPEAR, TRUE)
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfBASE_SCREEN_WIDTH/2.0, GET_RANDOM_FLOAT_IN_RANGE(550.0, 750.0)), TWS_ENEMY_GRUNT_SPEAR, TRUE)
|
|
|
|
ELSE
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + GET_RANDOM_FLOAT_IN_RANGE(-500.0, -300.0), GET_RANDOM_FLOAT_IN_RANGE(-50.0, -250.0)), TWS_ENEMY_FAIRY)
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + GET_RANDOM_FLOAT_IN_RANGE(-300.0, 0.0), GET_RANDOM_FLOAT_IN_RANGE(-50.0, -250.0)), TWS_ENEMY_FAIRY)
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + GET_RANDOM_FLOAT_IN_RANGE(0.0, 300.0), GET_RANDOM_FLOAT_IN_RANGE(-50.0, -250.0)), TWS_ENEMY_FAIRY)
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + GET_RANDOM_FLOAT_IN_RANGE(300.0, 500.0), GET_RANDOM_FLOAT_IN_RANGE(-50.0, -250.0)), TWS_ENEMY_FAIRY)
|
|
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfBASE_SCREEN_WIDTH/2.0, GET_RANDOM_FLOAT_IN_RANGE(550.0, 750.0)), TWS_ENEMY_GRUNT_SWORD, TRUE)
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfBASE_SCREEN_WIDTH/2.0, GET_RANDOM_FLOAT_IN_RANGE(550.0, 750.0)), TWS_ENEMY_GRUNT_SWORD, TRUE)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
sEnemyData[i].eNextState = TWS_ENEMY_SPECIAL_ATTACK
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FALL_OVER_1)
|
|
ELSE
|
|
sEnemyData[i].iNumberOfAttacksInARow ++
|
|
sEnemyData[i].bIsHit = FALSE
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_FALL_OVER_1
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame > 2
|
|
sEnemyData[i].iSpriteAnimFrame = 2
|
|
ENDIF
|
|
|
|
IF sTWSData.bLockedScreen
|
|
|
|
IF ABSF(sEnemyData[i].vSpritePos.x - sEnemyData[i].vInitialPos.x) < (200.0 * sPlayerData.iLevel)
|
|
AND sEnemyData[i].vSpritePos.X > sTWSData.fLockedScreenPos - cfGAME_SCREEN_WIDTH*0.45
|
|
AND sEnemyData[i].vSpritePos.X < sTWSData.fLockedScreenPos + cfGAME_SCREEN_WIDTH*0.45
|
|
|
|
IF sEnemyData[i].vSpritePos.x < sPlayerData.vSpritePos.x
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY
|
|
ELSE
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY
|
|
ENDIF
|
|
ELSE
|
|
sEnemyData[i].bIsFalling = FALSE
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_GETTING_UP)
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF ABSF(sEnemyData[i].vSpritePos.x - sEnemyData[i].vInitialPos.x) < (200.0 * sPlayerData.iLevel)
|
|
AND sEnemyData[i].vSpritePos.X > sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfGAME_SCREEN_WIDTH*0.45
|
|
AND sEnemyData[i].vSpritePos.X < sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfGAME_SCREEN_WIDTH*0.45
|
|
|
|
IF sEnemyData[i].vSpritePos.x < sPlayerData.vSpritePos.x
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY
|
|
ELSE
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY
|
|
ENDIF
|
|
ELSE
|
|
sEnemyData[i].bIsFalling = FALSE
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_GETTING_UP)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_GETTING_UP
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_BOSS_KNIGHT_HURT_ANIM_FRAMES
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsHit = FALSE
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_DYING_1
|
|
IF sEnemyData[i].iSpriteAnimFrame >= 2
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x - sEnemyData[i].vSpriteSize.x, sEnemyData[i].vSpritePos.y + 50), TWS_FX_SWORD_DROP)
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x + sEnemyData[i].vSpriteSize.x, sEnemyData[i].vSpritePos.y + 50), TWS_FX_COD_DROP)
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING_2)
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_ENEMY_DYING_2
|
|
IF sEnemyData[i].iSpriteAnimFrame >= 3
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING_3)
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_ENEMY_DYING_3
|
|
IF sEnemyData[i].iSpriteAnimFrame >= 5
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING_4)
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_ENEMY_DYING_4
|
|
IF sEnemyData[i].iSpriteAnimFrame >= 6
|
|
TWS_ACTIVATE_CAMERA_SHAKE(TRUE)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING_5)
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_ENEMY_DYING_5
|
|
IF sEnemyData[i].iSpriteAnimFrame >= 8
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING_6)
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_ENEMY_DYING_6
|
|
IF sEnemyData[i].iSpriteAnimFrame >= 9
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_BODYFALL, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING_7)
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_ENEMY_DYING_7
|
|
IF sEnemyData[i].iSpriteAnimFrame >= 10
|
|
TWS_ACTIVATE_CAMERA_SHAKE(TRUE)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING_8)
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_ENEMY_DYING_8
|
|
IF sEnemyData[i].iSpriteAnimFrame >= 11
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DEAD)
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_ENEMY_DEAD
|
|
|
|
IF sTWSData.eLevelStage < TWS_LEVEL_BOSS_FIGHT AND GET_GAME_TIMER() - sEnemyData[i].iTimer > 2000
|
|
IF sTWSData.bLockedScreen AND sEnemyData[i].bIsBattleEnemy
|
|
sTWSData.iNumberOfEnemiesKilledInBattle ++
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
TWS_RESET_ENEMY_VARIABLES(i)
|
|
TWS_REMOVE_DRAW_CALL(TWS_ENTITY_ENEMY, i)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_BOSS_AMAZON
|
|
SWITCH sEnemyData[i].eEnemyState
|
|
|
|
|
|
CASE TWS_ENEMY_INACTIVE
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_IDLE_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
IF sTWSData.eLevelStage >= TWS_LEVEL_BOSS_FIGHT
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_AMAZON_AGGRO, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_IDLE
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_IDLE_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].bIsHit
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_ACTIVATE_CAMERA_SHAKE(TRUE)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_AMAZON_PAIN, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
IF sEnemyData[i].fHealth > 0.0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ELSE
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FALL)
|
|
ENDIF
|
|
|
|
ELIF (sEnemyData[i].fProgressToTarget = 0.0 AND GET_GAME_TIMER() - sEnemyData[i].iTimer > 1000)
|
|
OR (sEnemyData[i].fProgressToTarget > 0.0 AND GET_GAME_TIMER() - sEnemyData[i].iTimer > 500)
|
|
OR sEnemyData[i].eNextState = TWS_ENEMY_ATTACK
|
|
|
|
IF sEnemyData[i].eNextState = TWS_ENEMY_ATTACK
|
|
sEnemyData[i].eNextState = TWS_ENEMY_IDLE
|
|
ENDIF
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
|
|
IF sEnemyData[i].vSpritePos.X < sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfGAME_SCREEN_WIDTH*0.4
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfGAME_SCREEN_WIDTH*0.4, sPlayerData.vSpritePos.y)
|
|
IF sPlayerData.bIsJumping
|
|
sEnemyData[i].vTargetPos.y = sPlayerData.vInitialJumpPos.y
|
|
ENDIF
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ELIF sEnemyData[i].vSpritePos.X > sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfGAME_SCREEN_WIDTH*0.4
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfGAME_SCREEN_WIDTH*0.4, sPlayerData.vSpritePos.y)
|
|
IF sPlayerData.bIsJumping
|
|
sEnemyData[i].vTargetPos.y = sPlayerData.vInitialJumpPos.y
|
|
ENDIF
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ELIF sEnemyData[i].vSpritePos.Y > cfGAME_SCREEN_HEIGHT*0.75
|
|
OR ABSF(sEnemyData[i].vSpritePos.Y - sPlayerData.vSpritePos.y) > 100.0
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sPlayerData.vSpritePos.y)
|
|
IF sPlayerData.bIsJumping
|
|
sEnemyData[i].vTargetPos.y = sPlayerData.vInitialJumpPos.y
|
|
ENDIF
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ELSE
|
|
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_ATTACK_LOAD)
|
|
sEnemyData[i].fProgressToTarget += 0.35
|
|
ENDIF
|
|
|
|
ELIF sEnemyData[i].fProgressToTarget > 0.0
|
|
AND VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) <= 300.0
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_AMAZON_ATTACK_STAB, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_SPECIAL_ATTACK_2)
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_WALK
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_WALK_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sEnemyData[i].vTargetPos) < 50.0
|
|
IF sPlayerData.ePlayerState != TWS_INTRO
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_ATTACK_LOAD)
|
|
sEnemyData[i].fProgressToTarget += 0.35
|
|
ENDIF
|
|
ELSE
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sEnemyData[i].vTargetPos.Y)) > 30.0 AND sEnemyData[i].vTargetPos.y < sEnemyData[i].vSpritePos.y
|
|
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y -@ cfTWS_VERTICAL_MOVEMENT_ENEMY
|
|
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sEnemyData[i].vTargetPos.Y)) > 30.0 AND sEnemyData[i].vTargetPos.Y > sEnemyData[i].vSpritePos.Y
|
|
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y +@ cfTWS_VERTICAL_MOVEMENT_ENEMY
|
|
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vTargetPos.x, sEnemyData[i].vSpritePos.Y)) > 30.0 AND sEnemyData[i].vTargetPos.X < sEnemyData[i].vSpritePos.X
|
|
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*0.75
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vTargetPos.x, sEnemyData[i].vSpritePos.Y)) > 30.0 AND sEnemyData[i].vTargetPos.X > sEnemyData[i].vSpritePos.X
|
|
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*0.75
|
|
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_ATTACK_LOAD
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_DASH_START_ANIM_FRAME - 1
|
|
sEnemyData[i].iSpriteAnimFrame = ciTWS_DASH_START_ANIM_FRAME - 1
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > 500 AND sPlayerData.ePlayerState != TWS_INTRO
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
|
|
IF sPlayerData.vSpritePos.x < sEnemyData[i].vSpritePos.x
|
|
sEnemyData[i].bIsMoving = TRUE
|
|
ELSE
|
|
sEnemyData[i].bIsMoving = FALSE
|
|
ENDIF
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_AMAZON_ATTACK_THRUST, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_ATTACK_HIT)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_ATTACK_HIT
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_DASH_START_ANIM_FRAME
|
|
IF sEnemyData[i].bIsMoving = TRUE
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER*4
|
|
ELSE
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER*4
|
|
ENDIF
|
|
sEnemyData[i].iSpriteAnimFrame = ciTWS_DASH_START_ANIM_FRAME
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > 800
|
|
OR (NOT sEnemyData[i].bIsMoving AND sEnemyData[i].vSpritePos.x >= sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfBASE_SCREEN_WIDTH*0.3)
|
|
OR (sEnemyData[i].bIsMoving AND sEnemyData[i].vSpritePos.x <= sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfBASE_SCREEN_WIDTH*0.3)
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
|
|
IF sEnemyData[i].fProgressToTarget >= 1.0
|
|
sEnemyData[i].fProgressToTarget = ciTWS_JUMP_ACCELERATION*1.5
|
|
sEnemyData[i].vShadowOffset.y = sEnemyData[i].vSpritePos.y + TWS_GET_ENEMY_SHADOW_Y_POSITION(TWS_ENEMY_BOSS_AMAZON)
|
|
sEnemyData[i].vInitialPos.y = sEnemyData[i].vSpritePos.y
|
|
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y -@ sEnemyData[i].fProgressToTarget
|
|
sEnemyData[i].fProgressToTarget = sEnemyData[i].fProgressToTarget +@ ciTWS_GRAVITY
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_GO_UP)
|
|
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_AMAZON_ATTACK_JUMP, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
ELSE
|
|
sEnemyData[i].fProgressToTarget += 0.35
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_GO_UP
|
|
|
|
|
|
IF sPlayerData.vSpritePos.y > sEnemyData[i].vInitialPos.y + 15.0
|
|
sEnemyData[i].vShadowOffset.y = sEnemyData[i].vShadowOffset.y +@ cfTWS_VERTICAL_MOVEMENT_PLAYER
|
|
sEnemyData[i].vInitialPos.y = sEnemyData[i].vInitialPos.y +@ cfTWS_VERTICAL_MOVEMENT_PLAYER
|
|
|
|
ELIF sPlayerData.vSpritePos.y < sEnemyData[i].vInitialPos.y - 15.0
|
|
sEnemyData[i].vShadowOffset.y = sEnemyData[i].vShadowOffset.y -@ cfTWS_VERTICAL_MOVEMENT_PLAYER
|
|
sEnemyData[i].vInitialPos.y = sEnemyData[i].vInitialPos.y -@ cfTWS_VERTICAL_MOVEMENT_PLAYER
|
|
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].fProgressToTarget > 0.0
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y -@ sEnemyData[i].fProgressToTarget
|
|
sEnemyData[i].fProgressToTarget = sEnemyData[i].fProgressToTarget +@ ciTWS_GRAVITY
|
|
|
|
ELSE
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
IF sPlayerData.vSpritePos.x < sEnemyData[i].vSpritePos.x
|
|
sEnemyData[i].bIsMoving = TRUE
|
|
ELSE
|
|
sEnemyData[i].bIsMoving = FALSE
|
|
ENDIF
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_SPECIAL_ATTACK)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_SPECIAL_ATTACK
|
|
|
|
IF sEnemyData[i].vSpritePos.y < sEnemyData[i].vInitialPos.y
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y -@ sEnemyData[i].fProgressToTarget
|
|
sEnemyData[i].fProgressToTarget = sEnemyData[i].fProgressToTarget +@ ciTWS_GRAVITY
|
|
|
|
IF sEnemyData[i].bIsMoving = TRUE
|
|
IF sEnemyData[i].vSpritePos.x > sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfBASE_SCREEN_WIDTH*0.4
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER*2
|
|
ENDIF
|
|
ELSE
|
|
IF sEnemyData[i].vSpritePos.x < sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfBASE_SCREEN_WIDTH*0.4
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER*2
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
sEnemyData[i].vShadowOffset.y = 0.0
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_AMAZON_JUMP_LAND, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_LANDING)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_SPECIAL_ATTACK_2
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_ATTACK_ANIM_FRAMES-1
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
|
|
sEnemyData[i].fProgressToTarget = ciTWS_JUMP_ACCELERATION*2.0
|
|
sEnemyData[i].vShadowOffset.y = sEnemyData[i].vSpritePos.y + TWS_GET_ENEMY_SHADOW_Y_POSITION(TWS_ENEMY_BOSS_AMAZON)
|
|
sEnemyData[i].vInitialPos.y = sEnemyData[i].vSpritePos.y
|
|
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y -@ sEnemyData[i].fProgressToTarget
|
|
sEnemyData[i].fProgressToTarget = sEnemyData[i].fProgressToTarget +@ ciTWS_GRAVITY
|
|
|
|
IF sEnemyData[i].vSpritePos.x < sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfGAME_SCREEN_WIDTH*0.4, sEnemyData[i].vSpritePos.y)
|
|
sEnemyData[i].bIsMoving = FALSE
|
|
ELSE
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfGAME_SCREEN_WIDTH*0.4, sEnemyData[i].vSpritePos.y)
|
|
sEnemyData[i].bIsMoving = TRUE
|
|
ENDIF
|
|
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_TELEPORT_IN)
|
|
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_AMAZON_ATTACK_JUMP, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_TELEPORT_IN
|
|
|
|
|
|
IF sEnemyData[i].fProgressToTarget > 0.0
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y -@ sEnemyData[i].fProgressToTarget
|
|
sEnemyData[i].fProgressToTarget = sEnemyData[i].fProgressToTarget +@ ciTWS_GRAVITY
|
|
|
|
IF ABSF(sEnemyData[i].vSpritePos.x - sEnemyData[i].vTargetPos.x) > 20.0
|
|
IF sEnemyData[i].bIsMoving = TRUE
|
|
IF sEnemyData[i].vSpritePos.x > sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfBASE_SCREEN_WIDTH*0.4
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER*2
|
|
ENDIF
|
|
ELSE
|
|
IF sEnemyData[i].vSpritePos.x < sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfBASE_SCREEN_WIDTH*0.4
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER*2
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_TELEPORT_OUT)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_TELEPORT_OUT
|
|
|
|
|
|
IF sEnemyData[i].vSpritePos.y < sEnemyData[i].vInitialPos.y
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y -@ sEnemyData[i].fProgressToTarget
|
|
sEnemyData[i].fProgressToTarget = sEnemyData[i].fProgressToTarget +@ ciTWS_GRAVITY
|
|
|
|
IF ABSF(sEnemyData[i].vSpritePos.x - sEnemyData[i].vTargetPos.x) > 20.0
|
|
IF sEnemyData[i].bIsMoving = TRUE
|
|
IF sEnemyData[i].vSpritePos.x > sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfBASE_SCREEN_WIDTH*0.4
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER*2
|
|
ENDIF
|
|
ELSE
|
|
IF sEnemyData[i].vSpritePos.x < sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfBASE_SCREEN_WIDTH*0.4
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER*2
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
sEnemyData[i].vShadowOffset.y = 0.0
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_AMAZON_JUMP_LAND, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_LANDING)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_LANDING
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > 500
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsHit = FALSE
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_STUN
|
|
|
|
sEnemyData[i].vSpritePos.x += SIN(GET_GAME_TIMER()/0.4)
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > ciTWS_ENEMIES_STUN_TIME
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
|
|
sEnemyData[i].fProgressToTarget = ciTWS_JUMP_ACCELERATION*2.0
|
|
sEnemyData[i].vShadowOffset.y = sEnemyData[i].vSpritePos.y
|
|
sEnemyData[i].vInitialPos.y = sEnemyData[i].vSpritePos.y
|
|
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y -@ sEnemyData[i].fProgressToTarget
|
|
sEnemyData[i].fProgressToTarget = sEnemyData[i].fProgressToTarget +@ ciTWS_GRAVITY
|
|
|
|
IF sEnemyData[i].vSpritePos.x < sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfGAME_SCREEN_WIDTH*0.4, sEnemyData[i].vSpritePos.y)
|
|
sEnemyData[i].bIsMoving = FALSE
|
|
ELSE
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfGAME_SCREEN_WIDTH*0.4, sEnemyData[i].vSpritePos.y)
|
|
sEnemyData[i].bIsMoving = TRUE
|
|
ENDIF
|
|
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_TELEPORT_IN)
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_AMAZON_ATTACK_JUMP, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
|
|
sEnemyData[i].eNextState = TWS_ENEMY_ATTACK
|
|
sEnemyData[i].bIsHit = FALSE
|
|
|
|
IF sEnemyData[i].fHealth > 0.5
|
|
|
|
FLOAT fPostionY
|
|
fPostionY = sPlayerData.vSpritePos.y
|
|
IF sPlayerData.bIsJumping
|
|
fPostionY = sPlayerData.vInitialJumpPos.y
|
|
ENDIF
|
|
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfBASE_SCREEN_WIDTH*0.5, fPostionY + 30), TWS_ENEMY_SNAKE, TRUE)
|
|
IF GET_RANDOM_BOOL()
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfBASE_SCREEN_WIDTH*0.6, CLAMP(fPostionY, 730, 900) + 50), TWS_ENEMY_SNAKE, TRUE)
|
|
ELSE
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfBASE_SCREEN_WIDTH*0.6, CLAMP(fPostionY, 730, 900) - 50), TWS_ENEMY_SNAKE, TRUE)
|
|
ENDIF
|
|
|
|
ELIF sEnemyData[i].fHealth > 0.3
|
|
|
|
IF sPlayerData.vSpritePos.x < sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfGAME_SCREEN_WIDTH*0.25, -50), TWS_ENEMY_SLIME)
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfGAME_SCREEN_WIDTH*0.35, -50), TWS_ENEMY_SLIME)
|
|
ELSE
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfGAME_SCREEN_WIDTH*0.35, -50), TWS_ENEMY_SLIME)
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfGAME_SCREEN_WIDTH*0.25, -50), TWS_ENEMY_SLIME)
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
FLOAT fPostionY
|
|
fPostionY = sPlayerData.vSpritePos.y
|
|
IF sPlayerData.bIsJumping
|
|
fPostionY = sPlayerData.vInitialJumpPos.y
|
|
ENDIF
|
|
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfBASE_SCREEN_WIDTH*0.5, fPostionY + 30), TWS_ENEMY_SNAKE, TRUE)
|
|
|
|
IF GET_RANDOM_BOOL()
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfBASE_SCREEN_WIDTH*0.6, CLAMP(fPostionY, 730, 900) + 80), TWS_ENEMY_SNAKE, TRUE)
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfBASE_SCREEN_WIDTH*0.6, CLAMP(fPostionY, 730, 900) + 80), TWS_ENEMY_SNAKE, TRUE)
|
|
ELSE
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfBASE_SCREEN_WIDTH*0.6, CLAMP(fPostionY, 730, 900) - 80), TWS_ENEMY_SNAKE, TRUE)
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfBASE_SCREEN_WIDTH*0.6, CLAMP(fPostionY, 730, 900) - 80), TWS_ENEMY_SNAKE, TRUE)
|
|
ENDIF
|
|
|
|
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_FALL
|
|
|
|
IF ABSF(sEnemyData[i].vSpritePos.x - sPlayerData.vSpritePos.x) < (350.0 * sPlayerData.iLevel)
|
|
|
|
IF sEnemyData[i].vSpritePos.x < sPlayerData.vSpritePos.x
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*2
|
|
ELSE
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*2
|
|
ENDIF
|
|
ELSE
|
|
TWS_ACTIVATE_CAMERA_SHAKE(TRUE)
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].bIsFalling = FALSE
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FLAT)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_AMAZON_BODYFALL, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_FLAT
|
|
|
|
IF sEnemyData[i].fHealth > 0.0 AND GET_GAME_TIMER() - sEnemyData[i].iTimer > 1000
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_GETTING_UP)
|
|
|
|
ELIF sEnemyData[i].fHealth <= 0.0 AND GET_GAME_TIMER() - sEnemyData[i].iTimer > 1000
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_AMAZON_DEATH, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DEAD)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_GETTING_UP
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_GETTINGUP_ANIM_FRAMES
|
|
|
|
sEnemyData[i].bIsHit = FALSE
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
|
|
sEnemyData[i].fProgressToTarget = ciTWS_JUMP_ACCELERATION*2.0
|
|
sEnemyData[i].vShadowOffset.y = sEnemyData[i].vSpritePos.y
|
|
sEnemyData[i].vInitialPos.y = sEnemyData[i].vSpritePos.y
|
|
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y -@ sEnemyData[i].fProgressToTarget
|
|
sEnemyData[i].fProgressToTarget = sEnemyData[i].fProgressToTarget +@ ciTWS_GRAVITY
|
|
|
|
IF sEnemyData[i].vSpritePos.x < sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfGAME_SCREEN_WIDTH*0.75, sEnemyData[i].vSpritePos.y)
|
|
sEnemyData[i].bIsMoving = FALSE
|
|
ELSE
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfGAME_SCREEN_WIDTH*0.75, sEnemyData[i].vSpritePos.y)
|
|
sEnemyData[i].bIsMoving = TRUE
|
|
ENDIF
|
|
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_TELEPORT_IN)
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
CASE TWS_ENEMY_BOSS_SPIDER
|
|
|
|
SWITCH sEnemyData[i].eEnemyState
|
|
|
|
CASE TWS_ENEMY_INACTIVE
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_IDLE_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF sTWSData.eLevelStage >= TWS_LEVEL_BOSS_FIGHT
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_SPIDER_AGGRO, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
ARCADE_GAMES_SOUND_PLAY_LOOP(ARCADE_GAMES_SOUND_TWR_BOSS_SPIDER_CLIMB_LOOP)
|
|
sEnemyData[i].vShadowOffset.y = 660.0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_GLIDE_DOWN)
|
|
ENDIF
|
|
|
|
BREAK
|
|
// Boss comes in
|
|
CASE TWS_ENEMY_GLIDE_DOWN
|
|
|
|
IF sEnemyData[i].vSpritePos.y <= 500.0
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y +@ cfTWS_VERTICAL_MOVEMENT_ENEMY
|
|
ELSE
|
|
ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_BOSS_SPIDER_CLIMB_LOOP)
|
|
sEnemyData[i].vTargetPos = sEnemyData[i].vSpritePos
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_SPIT_1)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
// Boss spits creating puddles of venom
|
|
CASE TWS_ENEMY_SPIT_1
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_BOSS_SPIDER_SPIT_ANIM_FRAMES/2
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > 1000
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x - 50.0, sEnemyData[i].vSpritePos.Y + 80.0), TWS_FX_BOSS_SPIDER_SPIT, sEnemyData[i].vSpritePos.Y + sEnemyData[i].vSpriteSize.Y + 50.0)
|
|
|
|
INT j
|
|
FOR j = 0 TO 2
|
|
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sPlayerData.vSpritePos.x + GET_RANDOM_FLOAT_IN_RANGE( -500.0, 500.0), CLAMP(sPlayerData.vSpritePos.Y + GET_RANDOM_FLOAT_IN_RANGE(-50.0, 300.0), 700, cfBASE_SCREEN_HEIGHT)), TWS_FX_VENOM_PUDDLE, 0)
|
|
|
|
ENDFOR
|
|
|
|
TWS_ACTIVATE_CAMERA_SHAKE(TRUE)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_SPIDER_ATTACK_SPIT, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_SPIT_2)
|
|
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_ENEMY_SPIT_2
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_BOSS_SPIDER_SPIT_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 2
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > ciTWS_BOSS_ATTACK_TIME
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos - cfGAME_SCREEN_WIDTH*0.4, -50), TWS_ENEMY_SPIDER)
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfGAME_SCREEN_WIDTH*0.4, -50), TWS_ENEMY_SPIDER)
|
|
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_SPIT_3)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_SPIT_3
|
|
|
|
sEnemyData[i].iSpriteAnimFrame -= 2* sEnemyData[i].iSlowUpdateFrames
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame <= 0
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
// Boss can be attacked for some seconds or certain damage
|
|
CASE TWS_ENEMY_IDLE
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_IDLE_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].bIsHit
|
|
sEnemyData[i].fProgressToTarget += 0.34
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsHit = FALSE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_SPIDER_PAIN, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
|
|
ELIF sEnemyData[i].fProgressToTarget >= 1.0 OR GET_GAME_TIMER() - sEnemyData[i].iTimer > 3500
|
|
|
|
IF sEnemyData[i].fHealth <= 0.0
|
|
sEnemyData[i].fHealth = 0.025
|
|
ENDIF
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_ATTACK_LOAD)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
// Boss attacks
|
|
CASE TWS_ENEMY_ATTACK_LOAD
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_BOSS_SPIDER_ATTACK_LOAD_ANIM_FRAMES -1
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_ATTACK_WAIT)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_ATTACK_WAIT
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > 1000
|
|
sEnemyData[i].iSpriteAnimFrame = ciTWS_BOSS_SPIDER_ATTACK_LOAD_ANIM_FRAMES
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_SPIDER_ATTACK_HIT, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_ATTACK_HIT)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_ATTACK_HIT
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_BOSS_SPIDER_ATTACK_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_SPIDER_CLIMB_UP, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
ARCADE_GAMES_SOUND_PLAY_LOOP(ARCADE_GAMES_SOUND_TWR_BOSS_SPIDER_CLIMB_LOOP)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_GO_UP)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
// Boss disappears
|
|
CASE TWS_ENEMY_GO_UP
|
|
|
|
IF sEnemyData[i].vSpritePos.y > -300.0
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y -@ cfTWS_VERTICAL_MOVEMENT_ENEMY
|
|
ELSE
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x, sPlayerData.vSpritePos.Y - 900.0 )
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_BOSS_SPIDER_CLIMB_LOOP)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FALL_OVER_1)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
// Boss disappears
|
|
CASE TWS_ENEMY_FALL_OVER_1
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sEnemyData[i].vTargetPos) > 5.0
|
|
|
|
sEnemyData[i].vSpritePos = LERP_VECTOR_2D(sEnemyData[i].vSpritePos, sEnemyData[i].vTargetPos, sEnemyData[i].fProgressToTarget) //INIT_VECTOR_2D(LERP_FLOAT(sEnemyData[i].vSpritePos.x, sEnemyData[i].vTargetPos.x, sEnemyData[i].fProgressToTarget),sPlayerData.vSpritePos.y - sEnemyData[i].fShadowDistance)
|
|
|
|
IF sPlayerData.bIsJumping
|
|
sEnemyData[i].vShadowOffset.y = LERP_FLOAT(sEnemyData[i].vShadowOffset.y, sPlayerData.vInitialJumpPos.Y + sPlayerData.vSpriteSize.y, sEnemyData[i].fProgressToTarget)
|
|
ELSE
|
|
sEnemyData[i].vShadowOffset.y = LERP_FLOAT(sEnemyData[i].vShadowOffset.y, sPlayerData.vSpritePos.Y + sPlayerData.vSpriteSize.y, sEnemyData[i].fProgressToTarget)
|
|
ENDIF
|
|
|
|
sEnemyData[i].fProgressToTarget += 0.0015
|
|
|
|
ELSE
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_SPIDER_ATTACK_DROP, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FALL_OVER_2)
|
|
ENDIF
|
|
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_FALL_OVER_2
|
|
|
|
IF sEnemyData[i].vSpritePos.y < sPlayerData.vSpritePos.y
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y +@ cfTWS_VERTICAL_MOVEMENT_ENEMY*4
|
|
ELSE
|
|
sEnemyData[i].vTargetPos = sEnemyData[i].vSpritePos
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
TWS_ACTIVATE_CAMERA_SHAKE(TRUE)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_SPIDER_ATTACK_DROP_LAND, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_LANDING)
|
|
ENDIF
|
|
BREAK
|
|
|
|
// Boss lands on player
|
|
CASE TWS_ENEMY_LANDING
|
|
|
|
IF sEnemyData[i].fHealth <= 0.0
|
|
sEnemyData[i].fHealth = 0.025
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > 1500
|
|
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
sEnemyData[i].bIsHit = FALSE
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos, -300)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_SPIDER_CLIMB_UP, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
ARCADE_GAMES_SOUND_PLAY_LOOP(ARCADE_GAMES_SOUND_TWR_BOSS_SPIDER_CLIMB_LOOP)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
// Boss walks to default position
|
|
CASE TWS_ENEMY_WALK
|
|
|
|
IF sEnemyData[i].vSpritePos.y < 300.0
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sEnemyData[i].vTargetPos) > 5.0
|
|
|
|
sEnemyData[i].vSpritePos = LERP_VECTOR_2D(sEnemyData[i].vSpritePos, sEnemyData[i].vTargetPos, sEnemyData[i].fProgressToTarget) //INIT_VECTOR_2D(LERP_FLOAT(sEnemyData[i].vSpritePos.x, sEnemyData[i].vTargetPos.x, sEnemyData[i].fProgressToTarget),sEnemyData[i].vSpritePos.y)
|
|
sEnemyData[i].vShadowOffset.y = LERP_FLOAT(sEnemyData[i].vShadowOffset.y, 660.0 , sEnemyData[i].fProgressToTarget)
|
|
sEnemyData[i].fProgressToTarget += 0.0025
|
|
|
|
ELSE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_SPIDER_CLIMB_DOWN, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_GLIDE_DOWN)
|
|
ENDIF
|
|
|
|
ELSE
|
|
sEnemyData[i].vSpritePos.y -= 10.0
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_STUN
|
|
|
|
sEnemyData[i].vSpritePos.x += SIN(GET_GAME_TIMER()/0.4)
|
|
|
|
IF sEnemyData[i].fHealth <= 0.0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_ACTIVATE_CAMERA_SHAKE(TRUE)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_SPIDER_DEATH, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_EXPLODING)
|
|
|
|
ELIF GET_GAME_TIMER() - sEnemyData[i].iTimer > 500
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].vSpritePos = sEnemyData[i].vTargetPos
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_EXPLODING
|
|
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ SIN(GET_GAME_TIMER()/0.4)
|
|
|
|
IF sEnemyData[i].fProgressToTarget >= 1.0
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_BOSS_SPIDER_DEATH_FINAL, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING)
|
|
|
|
ELIF GET_GAME_TIMER() - sEnemyData[i].iTimer > 200
|
|
|
|
sEnemyData[i].fProgressToTarget += 0.05
|
|
|
|
TWS_CREATE_FX(
|
|
INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x + GET_RANDOM_FLOAT_IN_RANGE(-sEnemyData[i].vSpriteSize.x, sEnemyData[i].vSpriteSize.x),
|
|
sEnemyData[i].vSpritePos.y + GET_RANDOM_FLOAT_IN_RANGE(-sEnemyData[i].vSpriteSize.y, sEnemyData[i].vSpriteSize.y)),
|
|
TWS_FX_VENOM_HIT)
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_DYING
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_BOSS_SPIDER_DYING_ANIM_FRAMES
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DEAD)
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_DEAD
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_GRUNT
|
|
|
|
SWITCH sEnemyData[i].eEnemyState
|
|
CASE TWS_ENEMY_IDLE
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_IDLE_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF ABSF(sEnemyData[i].vSpritePos.x - sPlayerData.vSpritePos.x) < cfGAME_SCREEN_WIDTH/2
|
|
AND VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) > 80.0
|
|
OR sEnemyData[i].bIsBattleEnemy
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
IF sPlayerData.bIsJumping
|
|
IF sPlayerData.ePlayerState != TWS_FALL_INFINITE
|
|
sEnemyData[i].vTargetPos = sPlayerData.vInitialJumpPos
|
|
ENDIF
|
|
ELSE
|
|
sEnemyData[i].vTargetPos = sPlayerData.vSpritePos
|
|
ENDIF
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sEnemyData[i].vInitialPos) = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_AGGRO_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
ENDIF
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) <= 80.0
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_ATTACK_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_ATTACK)
|
|
|
|
ENDIF
|
|
|
|
IF TWS_IS_ENEMY_HIT_OR_DEAD(i)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_UNICORN_PAIN, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
sEnemyData[i].vTargetPos = sEnemyData[i].vSpritePos
|
|
IF sPlayerData.bIsJumping OR sPlayerData.bIsCharging OR sEnemyData[i].fHealth <= 0.01 OR TWS_IS_PLAYER_USING_FINAL_ATTACK()
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
sEnemyData[i].vInitialPos = sEnemyData[i].vSpritePos
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FALL)
|
|
ELSE
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_WALK
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sEnemyData[i].vTargetPos) < 100.0
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_ATTACK_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_ATTACK)
|
|
|
|
ELIF NOT sEnemyData[i].bIsBattleEnemy AND ABSF(sEnemyData[i].vTargetPos.X - sPlayerData.vSpritePos.x) >= cfGAME_SCREEN_WIDTH*0.6
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
|
|
ELIF sEnemyData[i].iSpriteAnimFrame >= 4
|
|
|
|
// IF distance to Y > 50 AND Y is higher
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sEnemyData[i].vTargetPos.Y)) > 50.0 AND sEnemyData[i].vTargetPos.y < sEnemyData[i].vSpritePos.y
|
|
OR sTWSData.bLockedScreen AND VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sEnemyData[i].vTargetPos.Y)) > 25.0 AND sEnemyData[i].vTargetPos.y < sEnemyData[i].vSpritePos.y
|
|
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y -@ cfTWS_VERTICAL_MOVEMENT_ENEMY
|
|
|
|
// IF distance to Y > 50 AND Y is lower
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sEnemyData[i].vTargetPos.Y)) > 50.0 AND sEnemyData[i].vTargetPos.Y > sEnemyData[i].vSpritePos.Y
|
|
OR sTWSData.bLockedScreen AND VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sEnemyData[i].vTargetPos.Y)) > 25.0 AND sEnemyData[i].vTargetPos.y > sEnemyData[i].vSpritePos.y
|
|
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y +@ cfTWS_VERTICAL_MOVEMENT_ENEMY
|
|
|
|
// IF distance to X > 50 AND X is on the left
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vTargetPos.x, sEnemyData[i].vSpritePos.Y)) > 50.0 AND sEnemyData[i].vTargetPos.X < sEnemyData[i].vSpritePos.X
|
|
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY
|
|
|
|
// IF distance to X > 50 AND X is on the right
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vTargetPos.x, sEnemyData[i].vSpritePos.Y)) > 50.0 AND sEnemyData[i].vTargetPos.X > sEnemyData[i].vSpritePos.X
|
|
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_WALK_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ELIF sEnemyData[i].iSpriteAnimFrame = 2 AND ARCADE_GAMES_SOUND_HAS_FINISHED(ARCADE_GAMES_SOUND_TWR_UNICORN_JUMP)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_UNICORN_JUMP, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
ENDIF
|
|
|
|
IF TWS_IS_ENEMY_HIT_OR_DEAD(i)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_UNICORN_PAIN, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].vTargetPos = sEnemyData[i].vSpritePos
|
|
|
|
IF sPlayerData.bIsJumping OR sPlayerData.bIsCharging OR sEnemyData[i].fHealth <= 0.01 OR TWS_IS_PLAYER_USING_FINAL_ATTACK()
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
sEnemyData[i].vInitialPos = sEnemyData[i].vSpritePos
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FALL)
|
|
ELSE
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_ATTACK
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_ATTACK_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
ENDIF
|
|
|
|
IF TWS_IS_ENEMY_HIT_OR_DEAD(i)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_UNICORN_PAIN, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
sEnemyData[i].vTargetPos = sEnemyData[i].vSpritePos
|
|
|
|
IF sPlayerData.bIsJumping OR sPlayerData.bIsCharging OR sEnemyData[i].fHealth <= 0.01 OR TWS_IS_PLAYER_USING_FINAL_ATTACK()
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
sEnemyData[i].vInitialPos = sEnemyData[i].vSpritePos
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FALL)
|
|
ELSE
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_FALL
|
|
|
|
IF ABSF(sEnemyData[i].vSpritePos.x - sEnemyData[i].vInitialPos.x) < (350.0 * sPlayerData.iLevel)
|
|
|
|
IF sEnemyData[i].vSpritePos.x < sPlayerData.vSpritePos.x
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*2
|
|
ELSE
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*2
|
|
ENDIF
|
|
ELSE
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].bIsFalling = FALSE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_UNICORN_JUMP, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FLAT)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_FLAT
|
|
|
|
IF sEnemyData[i].fHealth > 0.0 AND GET_GAME_TIMER() - sEnemyData[i].iTimer > 1000
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_GETTING_UP)
|
|
|
|
ELIF sEnemyData[i].fHealth <= 0.0 AND GET_GAME_TIMER() - sEnemyData[i].iTimer > 1000
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_UNICORN_DEATH, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
|
|
IF sTWSData.bLockedScreen AND sEnemyData[i].bIsBattleEnemy
|
|
sTWSData.iNumberOfEnemiesKilledInBattle ++
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
TWS_RESET_ENEMY_VARIABLES(i)
|
|
TWS_REMOVE_DRAW_CALL(TWS_ENTITY_ENEMY, i)
|
|
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_GETTING_UP
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_GETTINGUP_ANIM_FRAMES
|
|
|
|
sEnemyData[i].bIsHit = FALSE
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_STUN
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > ciTWS_ENEMIES_STUN_TIME
|
|
sEnemyData[i].bIsHit = FALSE
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
ENDIF
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_GRUNT_SWORD
|
|
CASE TWS_ENEMY_GRUNT_SPEAR
|
|
CASE TWS_ENEMY_GRUNT_FIRESWORD
|
|
CASE TWS_ENEMY_GRUNT_FIRESPEAR
|
|
|
|
SWITCH sEnemyData[i].eEnemyState
|
|
CASE TWS_ENEMY_IDLE
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_IDLE_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF ABSF(sEnemyData[i].vSpritePos.x - sPlayerData.vSpritePos.x) < cfGAME_SCREEN_WIDTH/2 AND VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) > 50.0
|
|
OR sEnemyData[i].bIsBattleEnemy
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
IF sPlayerData.bIsJumping
|
|
sEnemyData[i].vTargetPos = sPlayerData.vInitialJumpPos
|
|
ELSE
|
|
sEnemyData[i].vTargetPos = sPlayerData.vSpritePos
|
|
ENDIF
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sEnemyData[i].vInitialPos) = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_AGGRO_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
ENDIF
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) <= 50.0
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_ATTACK_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_ATTACK)
|
|
|
|
ENDIF
|
|
|
|
IF TWS_IS_ENEMY_HIT_OR_DEAD(i)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_PAIN_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].vTargetPos = sEnemyData[i].vSpritePos
|
|
|
|
IF sPlayerData.bIsJumping OR sPlayerData.bIsCharging OR sEnemyData[i].fHealth <= 0.01 OR TWS_IS_PLAYER_USING_FINAL_ATTACK()
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
sEnemyData[i].vInitialPos = sEnemyData[i].vSpritePos
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FALL)
|
|
ELSE
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_WALK
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sEnemyData[i].vTargetPos) < 100.0
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_ATTACK_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_ATTACK)
|
|
|
|
ELIF NOT sEnemyData[i].bIsBattleEnemy AND ABSF(sEnemyData[i].vTargetPos.X - sPlayerData.vSpritePos.x) >= cfGAME_SCREEN_WIDTH*0.6
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
|
|
ELSE
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sEnemyData[i].vTargetPos.Y)) > 50.0 AND sEnemyData[i].vTargetPos.y < sEnemyData[i].vSpritePos.y
|
|
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y -@ cfTWS_VERTICAL_MOVEMENT_ENEMY
|
|
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sEnemyData[i].vTargetPos.Y)) > 50.0 AND sEnemyData[i].vTargetPos.Y > sEnemyData[i].vSpritePos.Y
|
|
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y +@ cfTWS_VERTICAL_MOVEMENT_ENEMY
|
|
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vTargetPos.x, sEnemyData[i].vSpritePos.Y)) > 50.0 AND sEnemyData[i].vTargetPos.X < sEnemyData[i].vSpritePos.X
|
|
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vTargetPos.x, sEnemyData[i].vSpritePos.Y)) > 50.0 AND sEnemyData[i].vTargetPos.X > sEnemyData[i].vSpritePos.X
|
|
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_WALK_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF TWS_IS_ENEMY_HIT_OR_DEAD(i)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_PAIN_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].vTargetPos = sEnemyData[i].vSpritePos
|
|
|
|
IF sPlayerData.bIsJumping OR sPlayerData.bIsCharging OR sEnemyData[i].fHealth <= 0.01 OR TWS_IS_PLAYER_USING_FINAL_ATTACK()
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
sEnemyData[i].vInitialPos = sEnemyData[i].vSpritePos
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FALL)
|
|
ELSE
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_ATTACK
|
|
|
|
IF (sEnemyData[i].eEnemyType = TWS_ENEMY_GRUNT_FIRESWORD AND sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_LONG_ATTACK_ANIM_FRAMES)
|
|
OR (sEnemyData[i].eEnemyType = TWS_ENEMY_GRUNT_FIRESPEAR AND sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_SHORT_ATTACK_ANIM_FRAMES)
|
|
OR (sEnemyData[i].eEnemyType = TWS_ENEMY_GRUNT_SWORD AND sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_LONG_ATTACK_ANIM_FRAMES)
|
|
OR (sEnemyData[i].eEnemyType = TWS_ENEMY_GRUNT_SPEAR AND sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_SHORT_ATTACK_ANIM_FRAMES)
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
ENDIF
|
|
|
|
IF TWS_IS_ENEMY_HIT_OR_DEAD(i)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_PAIN_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
sEnemyData[i].vTargetPos = sEnemyData[i].vSpritePos
|
|
|
|
IF sPlayerData.bIsJumping OR sPlayerData.bIsCharging OR sEnemyData[i].fHealth <= 0.01 OR TWS_IS_PLAYER_USING_FINAL_ATTACK()
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
sEnemyData[i].vInitialPos = sEnemyData[i].vSpritePos
|
|
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FALL)
|
|
ELSE
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_FALL
|
|
|
|
IF ABSF(sEnemyData[i].vSpritePos.x - sEnemyData[i].vInitialPos.x) < (350.0 * sPlayerData.iLevel)
|
|
|
|
IF sEnemyData[i].vSpritePos.x < sPlayerData.vSpritePos.x
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*2
|
|
ELSE
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*2
|
|
ENDIF
|
|
ELSE
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].bIsFalling = FALSE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_BODYFALL_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FLAT)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_FLAT
|
|
|
|
IF sEnemyData[i].fHealth > 0.0 AND GET_GAME_TIMER() - sEnemyData[i].iTimer > 1000
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_GETTING_UP)
|
|
|
|
ELIF sEnemyData[i].fHealth <= 0.0 AND GET_GAME_TIMER() - sEnemyData[i].iTimer > 1000
|
|
|
|
IF sTWSData.bLockedScreen AND sEnemyData[i].bIsBattleEnemy
|
|
sTWSData.iNumberOfEnemiesKilledInBattle ++
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
TWS_RESET_ENEMY_VARIABLES(i)
|
|
TWS_REMOVE_DRAW_CALL(TWS_ENTITY_ENEMY, i)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_GETTING_UP
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_GETTINGUP_ANIM_FRAMES
|
|
|
|
sEnemyData[i].bIsHit = FALSE
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_STUN
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > ciTWS_ENEMIES_STUN_TIME
|
|
sEnemyData[i].bIsHit = FALSE
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
ENDIF
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_BRUTE
|
|
CASE TWS_ENEMY_BRUTE_AXE
|
|
|
|
SWITCH sEnemyData[i].eEnemyState
|
|
CASE TWS_ENEMY_IDLE
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_IDLE_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF ABSF(sEnemyData[i].vSpritePos.x - sPlayerData.vSpritePos.x) < cfGAME_SCREEN_WIDTH/2 AND VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) > 50.0
|
|
OR sEnemyData[i].bIsBattleEnemy
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
IF sPlayerData.bIsJumping
|
|
IF sPlayerData.ePlayerState != TWS_FALL_INFINITE
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sPlayerData.vInitialJumpPos.x, sPlayerData.vInitialJumpPos.y - sPlayerData.vSpriteSize.y/2)
|
|
ENDIF
|
|
ELSE
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.x, sPlayerData.vSpritePos.y - sPlayerData.vSpriteSize.y/2)
|
|
ENDIF
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sEnemyData[i].vInitialPos) = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_AGGRO_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
ENDIF
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) < 400.0
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_ATTACK_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_ATTACK)
|
|
ENDIF
|
|
|
|
IF TWS_IS_ENEMY_HIT_OR_DEAD(i)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_PAIN_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].vTargetPos = sEnemyData[i].vSpritePos
|
|
IF sPlayerData.bIsJumping OR sPlayerData.bIsCharging OR sEnemyData[i].fHealth <= 0.01 OR TWS_IS_PLAYER_USING_FINAL_ATTACK()
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
sEnemyData[i].vInitialPos = sEnemyData[i].vSpritePos
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FALL)
|
|
ELSE
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_WALK
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sEnemyData[i].vTargetPos) < 200.0
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_ATTACK_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_ATTACK)
|
|
|
|
ELIF NOT sEnemyData[i].bIsBattleEnemy AND ABSF(sEnemyData[i].vTargetPos.X - sPlayerData.vSpritePos.x) >= cfGAME_SCREEN_WIDTH*0.6
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
|
|
ELSE
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sEnemyData[i].vTargetPos.Y)) > 30.0 AND sEnemyData[i].vTargetPos.y < sEnemyData[i].vSpritePos.y
|
|
OR sTWSData.bLockedScreen AND VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sEnemyData[i].vTargetPos.Y)) > 15.0 AND sEnemyData[i].vTargetPos.y < sEnemyData[i].vSpritePos.y
|
|
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y -@ cfTWS_VERTICAL_MOVEMENT_ENEMY
|
|
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sEnemyData[i].vTargetPos.Y)) > 30.0 AND sEnemyData[i].vTargetPos.Y > sEnemyData[i].vSpritePos.Y
|
|
OR sTWSData.bLockedScreen AND VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sEnemyData[i].vTargetPos.Y)) > 15.0 AND sEnemyData[i].vTargetPos.y > sEnemyData[i].vSpritePos.y
|
|
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y +@ cfTWS_VERTICAL_MOVEMENT_ENEMY
|
|
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vTargetPos.x, sEnemyData[i].vSpritePos.Y)) > 30.0 AND sEnemyData[i].vTargetPos.X < sEnemyData[i].vSpritePos.X
|
|
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*0.75
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vTargetPos.x, sEnemyData[i].vSpritePos.Y)) > 30.0 AND sEnemyData[i].vTargetPos.X > sEnemyData[i].vSpritePos.X
|
|
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*0.75
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_WALK_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF TWS_IS_ENEMY_HIT_OR_DEAD(i)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_PAIN_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].vTargetPos = sEnemyData[i].vSpritePos
|
|
IF sPlayerData.bIsJumping OR sPlayerData.bIsCharging OR sEnemyData[i].fHealth <= 0.01 OR TWS_IS_PLAYER_USING_FINAL_ATTACK()
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
sEnemyData[i].vInitialPos = sEnemyData[i].vSpritePos
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FALL)
|
|
ELSE
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_ATTACK
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_ATTACK_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
ENDIF
|
|
|
|
IF TWS_IS_ENEMY_HIT_OR_DEAD(i)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_PAIN_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
sEnemyData[i].vTargetPos = sEnemyData[i].vSpritePos
|
|
|
|
IF sPlayerData.bIsJumping OR sPlayerData.bIsCharging OR sEnemyData[i].fHealth <= 0.01 OR TWS_IS_PLAYER_USING_FINAL_ATTACK()
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
sEnemyData[i].vInitialPos = sEnemyData[i].vSpritePos
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FALL)
|
|
ELSE
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_FALL
|
|
|
|
IF ABSF(sEnemyData[i].vSpritePos.x - sEnemyData[i].vInitialPos.x) < (300.0 * sPlayerData.iLevel)
|
|
|
|
IF sEnemyData[i].vSpritePos.x < sPlayerData.vSpritePos.x
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*2
|
|
ELSE
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*2
|
|
ENDIF
|
|
ELSE
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].bIsFalling = FALSE
|
|
TWS_ACTIVATE_CAMERA_SHAKE(TRUE)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_BODYFALL_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FLAT)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_FLAT
|
|
|
|
IF TWS_IS_CAMERA_SHAKE_ACTIVE() AND GET_GAME_TIMER() - sEnemyData[i].iTimer > 250
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].fHealth > 0 AND GET_GAME_TIMER() - sEnemyData[i].iTimer > 1000
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_GETTING_UP)
|
|
|
|
ELIF sEnemyData[i].fHealth <= 0.0 AND GET_GAME_TIMER() - sEnemyData[i].iTimer > 1000
|
|
|
|
IF sTWSData.bLockedScreen AND sEnemyData[i].bIsBattleEnemy
|
|
sTWSData.iNumberOfEnemiesKilledInBattle ++
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
TWS_RESET_ENEMY_VARIABLES(i)
|
|
TWS_REMOVE_DRAW_CALL(TWS_ENTITY_ENEMY, i)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_GETTING_UP
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_GETTINGUP_ANIM_FRAMES
|
|
|
|
sEnemyData[i].bIsHit = FALSE
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_STUN
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > ciTWS_ENEMIES_STUN_TIME
|
|
sEnemyData[i].bIsHit = FALSE
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
ENDIF
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_BAT
|
|
CASE TWS_ENEMY_FAIRY
|
|
SWITCH sEnemyData[i].eEnemyState
|
|
CASE TWS_ENEMY_IDLE
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_FLY_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF ABSF(sEnemyData[i].vSpritePos.x - sPlayerData.vSpritePos.x) < 800.0
|
|
OR sEnemyData[i].bIsBattleEnemy
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_GLIDE_DOWN)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_AGGRO_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_ENEMY_GLIDE_DOWN
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_FLY_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y +@ cfTWS_VERTICAL_MOVEMENT_ENEMY*2
|
|
|
|
IF sEnemyData[i].vSpritePos.y > cfBASE_SCREEN_HEIGHT/3*2 - cfTWS_BAT_FLY_HEIGHT
|
|
|
|
sEnemyData[i].vShadowOffset.y = 0.0
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
sEnemyData[i].iTimer = 0
|
|
sEnemyData[i].vInitialPos = sEnemyData[i].vSpritePos
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sEnemyData[i].vInitialPos.X - 50, cfBASE_SCREEN_HEIGHT/3*2)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_ATTACK_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_WALK
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_FLY_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].bIsHit
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_DEATH_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DEAD)
|
|
ENDIF
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sEnemyData[i].vTargetPos) > 50.0
|
|
|
|
sEnemyData[i].vSpritePos = LERP_VECTOR_2D(sEnemyData[i].vSpritePos, sEnemyData[i].vTargetPos, sEnemyData[i].fProgressToTarget)
|
|
|
|
sEnemyData[i].fProgressToTarget += 0.0025
|
|
|
|
ELSE
|
|
FLOAT fOffset
|
|
IF sEnemyData[i].vSpritePos.X < sPlayerData.vSpritePos.X
|
|
fOffset = 300 + GET_RANDOM_FLOAT_IN_RANGE(-50.0, 50.0)
|
|
ELSE
|
|
fOffset = -300 + GET_RANDOM_FLOAT_IN_RANGE(-50.0, 50.0)
|
|
ENDIF
|
|
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) > cfGAME_SCREEN_WIDTH/2 OR sPlayerData.ePlayerState = TWS_DEAD
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sEnemyData[i].vTargetPos.X + GET_RANDOM_FLOAT_IN_RANGE(-100.0, 100.0), sEnemyData[i].vTargetPos.Y + GET_RANDOM_FLOAT_IN_RANGE(-20.0, 20.0))
|
|
ELSE
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sPlayerData.vSpritePos.X + fOffset, sPlayerData.vSpritePos.Y)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].vSpritePos.y < cfBASE_SCREEN_HEIGHT/3*2 - cfTWS_BAT_FLY_HEIGHT AND sEnemyData[i].vShadowOffset.y = 0.0
|
|
sEnemyData[i].vShadowOffset.y = cfBASE_SCREEN_HEIGHT/3*2
|
|
|
|
ELIF sEnemyData[i].vSpritePos.y > cfBASE_SCREEN_HEIGHT/3*2 - cfTWS_BAT_FLY_HEIGHT AND sEnemyData[i].vShadowOffset.y != 0.0
|
|
sEnemyData[i].vShadowOffset.y = 0.0
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_DEAD
|
|
|
|
IF sEnemyData[i].iTimer = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].vSpritePos.X < sPlayerData.vSpritePos.X
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*2
|
|
ELSE
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*2
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > 500
|
|
IF sTWSData.bLockedScreen AND sEnemyData[i].bIsBattleEnemy
|
|
sTWSData.iNumberOfEnemiesKilledInBattle ++
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
TWS_RESET_ENEMY_VARIABLES(i)
|
|
TWS_REMOVE_DRAW_CALL(TWS_ENTITY_ENEMY, i)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_SLIME
|
|
SWITCH sEnemyData[i].eEnemyState
|
|
CASE TWS_ENEMY_INVISIBLE
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_IDLE_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF (ABSF(sEnemyData[i].vSpritePos.x -sPlayerData.vSpritePos.x) < cfGAME_SCREEN_WIDTH AND sEnemyData[i].vSpritePos.y > 0)
|
|
OR (ABSF(sEnemyData[i].vSpritePos.x -sPlayerData.vSpritePos.x) < 400 AND sEnemyData[i].vSpritePos.y <= 0)
|
|
OR sEnemyData[i].bIsBattleEnemy
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sEnemyData[i].vInitialPos) = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_AGGRO_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
ENDIF
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_GLIDE_DOWN)
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_ENEMY_IDLE
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_IDLE_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= 3 AND sEnemyData[i].iSpriteAnimFrame < 7 AND sEnemyData[i].vShadowOffset.y = -1.0
|
|
sEnemyData[i].vShadowOffset.y = 1.0
|
|
ELIF sEnemyData[i].iSpriteAnimFrame < 3 AND sEnemyData[i].iSpriteAnimFrame >= 7 AND sEnemyData[i].vShadowOffset.y = 1.0
|
|
sEnemyData[i].vShadowOffset.y = -1.0
|
|
ENDIF
|
|
|
|
IF (VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) < 600.0 OR sEnemyData[i].bIsBattleEnemy)
|
|
AND VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) > 100.0
|
|
sEnemyData[i].vInitialPos = sEnemyData[i].vSpritePos
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
sEnemyData[i].vTargetPos = sPlayerData.vSpritePos
|
|
IF sPlayerData.bIsJumping
|
|
sEnemyData[i].vTargetPos = sPlayerData.vInitialJumpPos
|
|
ENDIF
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
ENDIF
|
|
|
|
IF TWS_IS_ENEMY_HIT_OR_DEAD(i)
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_PAIN_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
|
|
IF sEnemyData[i].fHealth <= 0.01
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
sEnemyData[i].vInitialPos = sEnemyData[i].vSpritePos
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_DEATH_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING)
|
|
ELSE
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_GLIDE_DOWN
|
|
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y +@ cfTWS_VERTICAL_MOVEMENT_ENEMY*4
|
|
|
|
IF (NOT sPlayerData.bIsJumping AND sEnemyData[i].vSpritePos.y > sPlayerData.vSpritePos.y)
|
|
OR (sPlayerData.bIsJumping AND sEnemyData[i].vSpritePos.y > sPlayerData.vInitialJumpPos.y)
|
|
|
|
sEnemyData[i].vInitialPos = sEnemyData[i].vSpritePos
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
sEnemyData[i].vTargetPos = sPlayerData.vSpritePos
|
|
IF sPlayerData.bIsJumping
|
|
sEnemyData[i].vTargetPos = sPlayerData.vInitialJumpPos
|
|
ENDIF
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_WALK
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_WALK_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_ATTACK_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
ENDIF
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sEnemyData[i].vTargetPos) < 100.0
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
|
|
ELIF sEnemyData[i].iSpriteAnimFrame >= 3 AND sEnemyData[i].iSpriteAnimFrame < 7
|
|
|
|
TWS_MOVE_ENEMY(i, 30)
|
|
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= 3 AND sEnemyData[i].iSpriteAnimFrame < 7 AND sEnemyData[i].vShadowOffset.y = -1.0
|
|
sEnemyData[i].vShadowOffset.y = 1.0
|
|
ELIF sEnemyData[i].iSpriteAnimFrame < 3 AND sEnemyData[i].iSpriteAnimFrame >= 7 AND sEnemyData[i].vShadowOffset.y = 1.0
|
|
sEnemyData[i].vShadowOffset.y = -1.0
|
|
ENDIF
|
|
|
|
IF TWS_IS_ENEMY_HIT_OR_DEAD(i)
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_PAIN_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
|
|
IF sEnemyData[i].fHealth <= 0.01
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
sEnemyData[i].vInitialPos = sEnemyData[i].vSpritePos
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_DEATH_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING)
|
|
ELSE
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_STUN
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > ciTWS_ENEMIES_STUN_TIME
|
|
sEnemyData[i].bIsHit = FALSE
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_DYING
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_SLIME_DEATH_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DEAD)
|
|
IF sTWSData.bLockedScreen AND sEnemyData[i].bIsBattleEnemy
|
|
sTWSData.iNumberOfEnemiesKilledInBattle ++
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
TWS_RESET_ENEMY_VARIABLES(i)
|
|
TWS_REMOVE_DRAW_CALL(TWS_ENTITY_ENEMY, i)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_DEAD
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_GRUNT_CROSSBOW
|
|
CASE TWS_ENEMY_GRUNT_CASTER
|
|
SWITCH sEnemyData[i].eEnemyState
|
|
CASE TWS_ENEMY_IDLE
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_IDLE_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF NOT sEnemyData[i].bIsAttacking
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) < 400.0
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
|
|
IF sPlayerData.bIsJumping
|
|
|
|
IF sEnemyData[i].vSpritePos.x < sPlayerData.vSpritePos.x
|
|
|
|
IF sEnemyData[i].vSpritePos.x - 250 < sBackgroundTilesData[0].fSpritePos
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[1].fSpritePos, sPlayerData.vInitialJumpPos.y)
|
|
ELIF NOT sEnemyData[i].bIsBattleEnemy
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x - 250, sPlayerData.vInitialJumpPos.y)
|
|
ENDIF
|
|
ELSE
|
|
|
|
IF sEnemyData[i].vSpritePos.x + 250 > sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-2].fSpritePos, sPlayerData.vInitialJumpPos.y)
|
|
ELIF NOT sEnemyData[i].bIsBattleEnemy
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x + 250, sPlayerData.vInitialJumpPos.y)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
IF sEnemyData[i].vSpritePos.x < sPlayerData.vSpritePos.x
|
|
IF sEnemyData[i].vSpritePos.x - 250 < sBackgroundTilesData[0].fSpritePos
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[1].fSpritePos, sPlayerData.vSpritePos.y)
|
|
ELIF NOT sEnemyData[i].bIsBattleEnemy
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x - 250, sPlayerData.vSpritePos.y)
|
|
ENDIF
|
|
ELSE
|
|
IF sEnemyData[i].vSpritePos.x + 250 > sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-2].fSpritePos, sPlayerData.vSpritePos.y)
|
|
ELIF NOT sEnemyData[i].bIsBattleEnemy
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x + 250, sPlayerData.vSpritePos.y)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sEnemyData[i].vInitialPos) = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_AGGRO_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
ENDIF
|
|
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) < 800.0
|
|
OR ABSF(sEnemyData[i].vSpritePos.y - sPlayerData.vSpritePos.y) > 50
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
|
|
IF sPlayerData.bIsJumping
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sPlayerData.vInitialJumpPos.y)
|
|
ELSE
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sPlayerData.vSpritePos.y)
|
|
ENDIF
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ENDIF
|
|
|
|
ELIF (sEnemyData[i].eEnemyType = TWS_ENEMY_GRUNT_CASTER AND GET_GAME_TIMER() - sEnemyData[i].iTimer > 1000)
|
|
OR (sEnemyData[i].eEnemyType = TWS_ENEMY_GRUNT_CROSSBOW AND GET_GAME_TIMER() - sEnemyData[i].iTimer > 1200)
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_ATTACK)
|
|
ENDIF
|
|
|
|
IF TWS_IS_ENEMY_HIT_OR_DEAD(i)
|
|
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_PAIN_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].vTargetPos = sEnemyData[i].vSpritePos
|
|
|
|
IF sPlayerData.bIsJumping OR sPlayerData.bIsCharging OR sEnemyData[i].fHealth <= 0.0 OR TWS_IS_PLAYER_USING_FINAL_ATTACK()
|
|
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
|
|
IF sEnemyData[i].eEnemyType = TWS_ENEMY_GRUNT_CASTER
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_DEATH_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING)
|
|
ELSE
|
|
sEnemyData[i].vInitialPos = sEnemyData[i].vSpritePos
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FALL)
|
|
ENDIF
|
|
ELSE
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_WALK
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sEnemyData[i].vTargetPos) < 50.0
|
|
AND TWS_IS_ENEMY_ON_SCREEN(i)
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
sEnemyData[i].fProgressToTarget = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
|
|
ELSE
|
|
|
|
TWS_MOVE_ENEMY(i, 30)
|
|
|
|
ENDIF
|
|
|
|
IF (sEnemyData[i].eEnemyType = TWS_ENEMY_GRUNT_CASTER AND sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_WALK_ANIM_FRAMES/2)
|
|
OR (sEnemyData[i].eEnemyType = TWS_ENEMY_GRUNT_CROSSBOW AND sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_WALK_ANIM_FRAMES)
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF TWS_IS_ENEMY_HIT_OR_DEAD(i)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_PAIN_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
sEnemyData[i].vTargetPos = sEnemyData[i].vSpritePos
|
|
|
|
IF sPlayerData.bIsJumping OR sPlayerData.bIsCharging OR sEnemyData[i].fHealth <= 0.0 OR TWS_IS_PLAYER_USING_FINAL_ATTACK()
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
IF sEnemyData[i].eEnemyType = TWS_ENEMY_GRUNT_CASTER
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_DEATH_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING)
|
|
ELSE
|
|
sEnemyData[i].vInitialPos = sEnemyData[i].vSpritePos
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FALL)
|
|
ENDIF
|
|
ELSE
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_ATTACK
|
|
|
|
IF (sEnemyData[i].eEnemyType = TWS_ENEMY_GRUNT_CASTER AND sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_LONG_ATTACK_ANIM_FRAMES-1)
|
|
OR (sEnemyData[i].eEnemyType = TWS_ENEMY_GRUNT_CROSSBOW AND sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_LONG_ATTACK_ANIM_FRAMES)
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].fProgressToTarget = 0
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
|
|
ELIF (sEnemyData[i].eEnemyType = TWS_ENEMY_GRUNT_CASTER AND sEnemyData[i].iSpriteAnimFrame = 4 AND sEnemyData[i].fProgressToTarget <= 0)
|
|
IF sEnemyData[i].vSpritePos.x < sPlayerData.vSpritePos.x
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sEnemyData[i].vSpritePos.y - 60), TWS_FX_FIREBALL_RIGHT, sEnemyData[i].vSpritePos.y + sEnemyData[i].vSpriteSize.y)
|
|
ELSE
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sEnemyData[i].vSpritePos.y - 60), TWS_FX_FIREBALL_LEFT, sEnemyData[i].vSpritePos.y + sEnemyData[i].vSpriteSize.y)
|
|
ENDIF
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_ATTACK_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].fProgressToTarget ++
|
|
|
|
ELIF (sEnemyData[i].eEnemyType = TWS_ENEMY_GRUNT_CROSSBOW AND sEnemyData[i].iSpriteAnimFrame = 2 AND sEnemyData[i].fProgressToTarget <= 0)
|
|
IF sEnemyData[i].vSpritePos.x < sPlayerData.vSpritePos.x
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sEnemyData[i].vSpritePos.y - 75), TWS_FX_ARROW_RIGHT, sEnemyData[i].vSpritePos.y + sEnemyData[i].vSpriteSize.y)
|
|
ELSE
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sEnemyData[i].vSpritePos.y - 75), TWS_FX_ARROW_LEFT, sEnemyData[i].vSpritePos.y + sEnemyData[i].vSpriteSize.y)
|
|
ENDIF
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_ATTACK_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].fProgressToTarget ++
|
|
|
|
ENDIF
|
|
|
|
IF TWS_IS_ENEMY_HIT_OR_DEAD(i)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_PAIN_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
sEnemyData[i].vTargetPos = sEnemyData[i].vSpritePos
|
|
|
|
IF sPlayerData.bIsJumping OR sPlayerData.bIsCharging OR sEnemyData[i].fHealth <= 0.0 OR TWS_IS_PLAYER_USING_FINAL_ATTACK()
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
IF sEnemyData[i].eEnemyType = TWS_ENEMY_GRUNT_CASTER
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_DEATH_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING)
|
|
ELSE
|
|
sEnemyData[i].vInitialPos = sEnemyData[i].vSpritePos
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FALL)
|
|
ENDIF
|
|
ELSE
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_FALL
|
|
|
|
IF ABSF(sEnemyData[i].vSpritePos.x - sEnemyData[i].vInitialPos.x) < (350.0 * sPlayerData.iLevel)
|
|
|
|
IF sEnemyData[i].vSpritePos.x < sPlayerData.vSpritePos.x
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*2
|
|
ELSE
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*2
|
|
ENDIF
|
|
ELSE
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].bIsFalling = FALSE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_BODYFALL_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FLAT)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_FLAT
|
|
|
|
IF sEnemyData[i].fHealth > 0.0 AND GET_GAME_TIMER() - sEnemyData[i].iTimer > 1000
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_GETTING_UP)
|
|
|
|
ELIF sEnemyData[i].fHealth <= 0.0 AND GET_GAME_TIMER() - sEnemyData[i].iTimer > 1000
|
|
|
|
IF sTWSData.bLockedScreen AND sEnemyData[i].bIsBattleEnemy
|
|
sTWSData.iNumberOfEnemiesKilledInBattle ++
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
TWS_RESET_ENEMY_VARIABLES(i)
|
|
TWS_REMOVE_DRAW_CALL(TWS_ENTITY_ENEMY, i)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_GETTING_UP
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_GETTINGUP_ANIM_FRAMES
|
|
|
|
sEnemyData[i].bIsHit = FALSE
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_STUN
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > ciTWS_ENEMIES_STUN_TIME
|
|
sEnemyData[i].bIsHit = FALSE
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_DYING
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_CASTER_DYING_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
sEnemyData[i].bIsActive = FALSE
|
|
TWS_ACTIVATE_CAMERA_SHAKE(FALSE)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_INVISIBLE)
|
|
ENDIF
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_LEPRECHAUN
|
|
SWITCH sEnemyData[i].eEnemyState
|
|
CASE TWS_ENEMY_INVISIBLE
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) < 400.0 OR sEnemyData[i].bIsBattleEnemy
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_LEPRECHAUN_JUMP_LAND, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_GO_UP)
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_ENEMY_GO_UP
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_LEPRECHAUN_SPAWN_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_IDLE
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_IDLE_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) < 600.0 AND VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) > 50.0
|
|
OR sEnemyData[i].bIsBattleEnemy
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
IF sPlayerData.bIsJumping
|
|
sEnemyData[i].vTargetPos = sPlayerData.vInitialJumpPos
|
|
ELSE
|
|
sEnemyData[i].vTargetPos = sPlayerData.vSpritePos
|
|
ENDIF
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) < 400.0
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_ATTACK_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_ATTACK)
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].bIsHit
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_PAIN_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].vTargetPos = sEnemyData[i].vSpritePos
|
|
IF sPlayerData.bIsJumping OR sPlayerData.bIsCharging OR sEnemyData[i].fHealth <= 0.0 OR TWS_IS_PLAYER_USING_FINAL_ATTACK()
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FALL)
|
|
ELSE
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_WALK
|
|
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sEnemyData[i].vTargetPos) < 600.0
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_ATTACK)
|
|
|
|
ELIF sEnemyData[i].iSpriteAnimFrame >= 3
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sEnemyData[i].vTargetPos.Y)) > 30.0 AND sEnemyData[i].vTargetPos.y < sEnemyData[i].vSpritePos.y
|
|
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y -@ cfTWS_VERTICAL_MOVEMENT_ENEMY
|
|
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sEnemyData[i].vTargetPos.Y)) > 30.0 AND sEnemyData[i].vTargetPos.Y > sEnemyData[i].vSpritePos.Y
|
|
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y +@ cfTWS_VERTICAL_MOVEMENT_ENEMY
|
|
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vTargetPos.x, sEnemyData[i].vSpritePos.Y)) > 30.0 AND sEnemyData[i].vTargetPos.X < sEnemyData[i].vSpritePos.X
|
|
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vTargetPos.x, sEnemyData[i].vSpritePos.Y)) > 30.0 AND sEnemyData[i].vTargetPos.X > sEnemyData[i].vSpritePos.X
|
|
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_LEPRECHAUN_WALK_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_LEPRECHAUN_JUMP_LAND, TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].bIsHit
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_PAIN_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].vTargetPos = sEnemyData[i].vSpritePos
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FALL)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_ATTACK
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_EXTRA_LONG_ATTACK_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
|
|
ELIF sEnemyData[i].iSpriteAnimFrame = ciTWS_ENEMY_LONG_ATTACK_ANIM_FRAMES AND sEnemyData[i].fProgressToTarget = 0.0
|
|
IF sEnemyData[i].vSpritePos.x < sPlayerData.vSpritePos.x
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x + cfTWS_LEPRECHAUN_COINS_WIDTH * cfTWS_RESCALE_FACTOR, sEnemyData[i].vSpritePos.y), TWS_FX_COINS_RIGHT)
|
|
ELSE
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x - cfTWS_LEPRECHAUN_COINS_WIDTH * cfTWS_RESCALE_FACTOR, sEnemyData[i].vSpritePos.y), TWS_FX_COINS_LEFT)
|
|
ENDIF
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_ATTACK_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].fProgressToTarget ++
|
|
ENDIF
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) > 600.0
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
sEnemyData[i].vTargetPos = sEnemyData[i].vSpritePos
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].bIsHit
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_PAIN_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
sEnemyData[i].vTargetPos = sEnemyData[i].vSpritePos
|
|
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FALL)
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_FALL
|
|
|
|
IF ABSF(sEnemyData[i].vSpritePos.x - sPlayerData.vSpritePos.x) < (300.0 * sPlayerData.iLevel)
|
|
|
|
IF sEnemyData[i].vSpritePos.x < sPlayerData.vSpritePos.x
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*2
|
|
ELSE
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*2
|
|
ENDIF
|
|
ELSE
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].bIsFalling = FALSE
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_DYING
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_LEPRECHAUN_DYING_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
IF sTWSData.bLockedScreen AND sEnemyData[i].bIsBattleEnemy
|
|
sTWSData.iNumberOfEnemiesKilledInBattle ++
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
TWS_RESET_ENEMY_VARIABLES(i)
|
|
TWS_REMOVE_DRAW_CALL(TWS_ENTITY_ENEMY, i)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_SNAKE
|
|
SWITCH sEnemyData[i].eEnemyState
|
|
CASE TWS_ENEMY_IDLE
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_IDLE_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF ABSF(sEnemyData[i].vSpritePos.x - sPlayerData.vSpritePos.x) < cfBASE_SCREEN_WIDTH/2
|
|
OR sEnemyData[i].bIsBattleEnemy
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_AGGRO_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_WALK
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_SNAKE_IDLE_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY
|
|
|
|
IF sEnemyData[i].bIsHit
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_DEATH_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].vTargetPos = sEnemyData[i].vSpritePos
|
|
sEnemyData[i].bIsFalling = TRUE
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_FALL)
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].vSpritePos.x < -cfBASE_SCREEN_WIDTH/2
|
|
sEnemyData[i].bIsActive = FALSE
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_INVISIBLE)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_FALL
|
|
|
|
IF ABSF(sEnemyData[i].vSpritePos.x - sEnemyData[i].vTargetPos.x) < (200.0 * sPlayerData.iLevel)
|
|
|
|
IF sEnemyData[i].vSpritePos.x < sPlayerData.vSpritePos.x
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*2
|
|
ELSE
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*2
|
|
ENDIF
|
|
ELSE
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
sEnemyData[i].bIsFalling = FALSE
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DYING)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_DYING
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > 1000
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
IF sTWSData.bLockedScreen AND sEnemyData[i].bIsBattleEnemy
|
|
sTWSData.iNumberOfEnemiesKilledInBattle ++
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
TWS_RESET_ENEMY_VARIABLES(i)
|
|
TWS_REMOVE_DRAW_CALL(TWS_ENTITY_ENEMY, i)
|
|
ENDIF
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_BOULDER
|
|
SWITCH sEnemyData[i].eEnemyState
|
|
CASE TWS_ENEMY_INVISIBLE
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_IDLE_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF ABSF(sEnemyData[i].vSpritePos.x - sPlayerData.vSpritePos.x) < cfBASE_SCREEN_WIDTH/2
|
|
OR sEnemyData[i].bIsBattleEnemy
|
|
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
sEnemyData[i].fProgressToTarget = 0.0
|
|
IF NOT TWS_IS_CAMERA_SHAKE_ACTIVE()
|
|
TWS_ACTIVATE_CAMERA_SHAKE(TRUE)
|
|
ENDIF
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_WALK
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_BOULDER_WALK_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ARCADE_GAMES_SOUND_PLAY_LOOP(ARCADE_GAMES_SOUND_TWR_BOULDER_BOUNCE)
|
|
ENDIF
|
|
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY
|
|
ARCADE_GAMES_SOUND_SET_VARIABLE(ARCADE_GAMES_SOUND_TWR_BOULDER_BOUNCE, "Screen_Position", TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
|
|
IF sEnemyData[i].vSpritePos.x < -cfBASE_SCREEN_WIDTH/2 OR (sEnemyData[i].bIsBattleEnemy AND sEnemyData[i].vSpritePos.x < sTWSData.fLockedScreenPos - cfBASE_SCREEN_WIDTH/2)
|
|
|
|
ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_BOULDER_BOUNCE)
|
|
|
|
IF sTWSData.bLockedScreen AND sEnemyData[i].bIsBattleEnemy
|
|
sTWSData.iNumberOfEnemiesKilledInBattle ++
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
TWS_RESET_ENEMY_VARIABLES(i)
|
|
TWS_REMOVE_DRAW_CALL(TWS_ENTITY_ENEMY, i)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_SPIDER
|
|
SWITCH sEnemyData[i].eEnemyState
|
|
|
|
CASE TWS_ENEMY_INACTIVE
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_IDLE_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF ABSF(sEnemyData[i].vSpritePos.x - sPlayerData.vSpritePos.x) < cfGAME_SCREEN_WIDTH/2.0
|
|
OR sEnemyData[i].bIsBattleEnemy
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_AGGRO_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_GLIDE_DOWN)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_IDLE
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_IDLE_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) < 600.0 AND VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) > 50.0
|
|
|
|
IF sEnemyData[i].vSpritePos.X <= sEnemyData[i].vTargetPos.X
|
|
sEnemyData[i].vTargetPos.X = sPlayerData.vSpritePos.X + 400
|
|
|
|
ELIF sEnemyData[i].vSpritePos.X >= sEnemyData[i].vTargetPos.X
|
|
sEnemyData[i].vTargetPos.X = sPlayerData.vSpritePos.X - 400
|
|
ENDIF
|
|
|
|
sEnemyData[i].iTimer = 0
|
|
sEnemyData[i].vInitialPos = sEnemyData[i].vSpritePos
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].bIsHit
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_PAIN_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_GLIDE_DOWN
|
|
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y +@ cfTWS_VERTICAL_MOVEMENT_ENEMY
|
|
|
|
IF sEnemyData[i].vSpritePos.y > cfBASE_SCREEN_HEIGHT/2
|
|
sEnemyData[i].vShadowOffset.y = 0.0
|
|
sEnemyData[i].iTimer = 0
|
|
sEnemyData[i].vInitialPos = sEnemyData[i].vSpritePos
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
sEnemyData[i].bIsAttacking = TRUE
|
|
sEnemyData[i].vTargetPos = INIT_VECTOR_2D(sEnemyData[i].vInitialPos.X, cfBASE_SCREEN_HEIGHT/2)
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_WALK)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_WALK
|
|
|
|
IF sEnemyData[i].iSpriteAnimFrame >= ciTWS_ENEMY_WALK_ANIM_FRAMES
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
// CPRINTLN(DEBUG_MINIGAME, "sEnemyData[i].vTargetPos.X ",sEnemyData[i].vTargetPos.X)
|
|
// CPRINTLN(DEBUG_MINIGAME, "sEnemyData[i].vSpritePos.x ",sEnemyData[i].vSpritePos.x)
|
|
// CPRINTLN(DEBUG_MINIGAME, "sPlayerData.vSpritePos.x ",sPlayerData.vSpritePos.x)
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) < 700
|
|
OR sEnemyData[i].bIsBattleEnemy
|
|
|
|
IF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sPlayerData.vSpritePos.Y + sPlayerData.vSpriteSize.Y/2)) > 30.0 AND sPlayerData.vSpritePos.y + sPlayerData.vSpriteSize.Y/2 < sEnemyData[i].vSpritePos.y
|
|
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y -@ cfTWS_VERTICAL_MOVEMENT_ENEMY/2
|
|
|
|
ELIF VECTOR_2D_DIST(sEnemyData[i].vSpritePos, INIT_VECTOR_2D(sEnemyData[i].vSpritePos.x, sPlayerData.vSpritePos.Y + sPlayerData.vSpriteSize.Y/2)) > 30.0 AND sPlayerData.vSpritePos.Y + sPlayerData.vSpriteSize.Y/2 > sEnemyData[i].vSpritePos.Y
|
|
sEnemyData[i].vSpritePos.y = sEnemyData[i].vSpritePos.y +@ cfTWS_VERTICAL_MOVEMENT_ENEMY/2
|
|
|
|
ELIF sEnemyData[i].vSpritePos.X >= sEnemyData[i].vTargetPos.X
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY/2
|
|
|
|
IF sEnemyData[i].vSpritePos.X <= sEnemyData[i].vTargetPos.X
|
|
sEnemyData[i].vTargetPos.X = sPlayerData.vSpritePos.X + 400
|
|
ENDIF
|
|
|
|
ELIF sEnemyData[i].vSpritePos.X <= sEnemyData[i].vTargetPos.X
|
|
sEnemyData[i].vSpritePos.x = sEnemyData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY/2
|
|
|
|
IF sEnemyData[i].vSpritePos.X >= sEnemyData[i].vTargetPos.X
|
|
sEnemyData[i].vTargetPos.X = sPlayerData.vSpritePos.X - 400
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF sEnemyData[i].bIsHit
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_PAIN_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
sEnemyData[i].bIsAttacking = FALSE
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_STUN)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_ENEMY_STUN
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > ciTWS_ENEMIES_STUN_TIME OR sEnemyData[i].fHealth <= 0
|
|
iF sEnemyData[i].fHealth <= 0.0
|
|
sEnemyData[i].iTimer = GET_GAME_TIMER()
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_DEATH_SOUND_FOR_ENEMY(sEnemyData[i].eEnemyType), TWS_GET_SOUND_POSITION_FOR_ENEMY(i))
|
|
IF sTWSData.bLockedScreen AND sEnemyData[i].bIsBattleEnemy
|
|
sTWSData.iNumberOfEnemiesKilledInBattle ++
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_DEAD)
|
|
ELSE
|
|
sEnemyData[i].bIsHit = FALSE
|
|
sEnemyData[i].iSpriteAnimFrame = 0
|
|
TWS_SET_ENEMY_STATE(i, TWS_ENEMY_IDLE)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_DEAD
|
|
|
|
IF GET_GAME_TIMER() - sEnemyData[i].iTimer > 3000
|
|
TWS_RESET_ENEMY_VARIABLES(i)
|
|
TWS_REMOVE_DRAW_CALL(TWS_ENTITY_ENEMY, i)
|
|
ENDIF
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
ENDPROC
|
|
|
|
PROC TWS_HANDLE_ITEM_STATE()
|
|
|
|
INT i
|
|
FOR i = 0 TO ciTWS_MAX_ITEMS - 1
|
|
|
|
IF sItemData[i].bIsActive AND sItemData[i].bIsHit
|
|
|
|
sItemData[i].iSpriteAnimFrame += sItemData[i].iSlowUpdateFrames
|
|
IF sItemData[i].iSpriteAnimFrame >= ciTWS_FX_ITEM_ANIM_FRAMES
|
|
sItemData[i].bIsActive = FALSE
|
|
ENDIF
|
|
|
|
ELIF sItemData[i].bIsActive AND sItemData[i].bFalling AND sItemData[i].vSpritePos.y < sItemData[i].vSpriteFallPos.y
|
|
|
|
sItemData[i].vSpritePos.y += 30.0
|
|
|
|
IF sItemData[i].vSpritePos.y >= sItemData[i].vSpriteFallPos.y
|
|
sItemData[i].bFalling = FALSE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_HANDLE_FX()
|
|
|
|
INT i
|
|
FOR i = 0 TO ciTWS_MAX_FX - 1
|
|
IF sFXData[i].bActive
|
|
sFXData[i].iSpriteBlastAnimFrame += sFXData[i].iSlowUpdateFrames
|
|
SWITCH sFXData[i].eType
|
|
CASE TWS_FX_SWORD_LIGHTNING
|
|
IF sFXData[i].iSpriteBlastAnimFrame >= ciTWS_FX_SWORD_LIGHTNING_ANIM_FRAMES
|
|
sFXData[i].iSpriteBlastAnimFrame = 0
|
|
ENDIF
|
|
IF NOT sPlayerData.bIsUsingMagic
|
|
sFXData[i].bActive = FALSE
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_FX_SUPERATTACK_EXPLOSION
|
|
IF sFXData[i].iSpriteBlastAnimFrame >= ciTWS_FX_SUPERATTACK_EXPLOSION_ANIM_FRAMES
|
|
sFXData[i].iSpriteBlastAnimFrame = 0
|
|
sFXData[i].bActive = FALSE
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_FX_SMALL_HIT
|
|
CASE TWS_FX_LARGE_HIT
|
|
IF sFXData[i].iSpriteBlastAnimFrame >= ciTWS_FX_HIT_ANIM_FRAMES
|
|
sFXData[i].iSpriteBlastAnimFrame = 0
|
|
sFXData[i].bActive = FALSE
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_FX_VENOM_HIT
|
|
CASE TWS_FX_BLOOD_HIT
|
|
CASE TWS_FX_PICKUP
|
|
IF sFXData[i].iSpriteBlastAnimFrame >= ciTWS_FX_HIT_VENOM_ANIM_FRAMES
|
|
sFXData[i].iSpriteBlastAnimFrame = 0
|
|
sFXData[i].bActive = FALSE
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_FX_SWORD_DROP
|
|
|
|
IF sFXData[i].iSpriteBlastAnimFrame >= ciTWS_FX_KNIGHT_SWORD_DROP_ANIM_FRAMES
|
|
sFXData[i].iSpriteBlastAnimFrame = ciTWS_FX_KNIGHT_SWORD_DROP_ANIM_FRAMES-1
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_FX_HELP
|
|
IF sTWSData.eLevelStage >= TWS_LEVEL_FINAL_DIALOGUE
|
|
sFXData[i].bActive = FALSE
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_FX_COD_DROP
|
|
|
|
IF sFXData[i].iSpriteBlastAnimFrame >= ciTWS_FX_KNIGHT_COD_DROP_ANIM_FRAMES
|
|
sFXData[i].iSpriteBlastAnimFrame = ciTWS_FX_KNIGHT_COD_DROP_ANIM_FRAMES-1
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_FX_BOSS_SPIDER_SPIT
|
|
|
|
IF sFXData[i].iSpriteBlastAnimFrame >= ciTWS_FX_BOSS_SPIDER_SPIT_ANIM_FRAMES
|
|
sFXData[i].iSpriteBlastAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - sFXData[i].iTimer > ciTWS_BOSS_ATTACK_TIME
|
|
sFXData[i].bActive = FALSE
|
|
sFXData[i].iTimer = 0
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_FX_MAGIC_COLUMN
|
|
|
|
IF GET_GAME_TIMER() - sFXData[i].iTimer < ciTWS_MAGIC_COLUMN_INTRO_TIME
|
|
|
|
IF sFXData[i].iSpriteBlastAnimFrame >= ciTWS_FX_WIZARD_PILLAR_DAMAGE_ANIM_FRAMES -1
|
|
sFXData[i].iSpriteBlastAnimFrame = ciTWS_FX_WIZARD_PILLAR_DAMAGE_ANIM_FRAMES -2
|
|
ENDIF
|
|
|
|
ELSE
|
|
IF sFXData[i].iSpriteBlastAnimFrame >= ciTWS_FX_WIZARD_PILLAR_ANIM_FRAMES
|
|
sFXData[i].iSpriteBlastAnimFrame = 0
|
|
sFXData[i].bActive = FALSE
|
|
|
|
ELIF sPlayerData.bIsJumping
|
|
|
|
IF sFXData[i].iSpriteBlastAnimFrame > ciTWS_FX_WIZARD_PILLAR_DAMAGE_ANIM_FRAMES
|
|
ELIF sPlayerData.vSpritePos.X < (sFXData[i].vSpritePos.x + sFXData[i].vSpriteSize.X)
|
|
AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteSize.X) > sFXData[i].vSpritePos.X
|
|
AND sPlayerData.vSpritePos.Y < (sFXData[i].vSpritePos.Y + sFXData[i].vSpriteSize.Y)
|
|
AND (sPlayerData.vSpriteSize.Y + sPlayerData.vSpritePos.Y) > sFXData[i].vSpritePos.Y
|
|
AND ABSF((sPlayerData.vInitialJumpPos.Y + sPlayerData.vSpriteSize.Y) - (sFXData[i].vSpritePos.Y + sFXData[i].vSpriteSize.Y)) < 50.0
|
|
AND TWS_CAN_PLAYER_BE_HURT()
|
|
sPlayerData.bIsHit = TRUE
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
sPlayerData.fHealth = CLAMP(sPlayerData.fHealth - 0.1, 0.0, 1.0)
|
|
ENDIF
|
|
ELSE
|
|
|
|
IF sFXData[i].iSpriteBlastAnimFrame > ciTWS_FX_WIZARD_PILLAR_DAMAGE_ANIM_FRAMES
|
|
ELIF sPlayerData.vSpritePos.X < (sFXData[i].vSpritePos.x + sFXData[i].vSpriteSize.X)
|
|
AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteSize.X) > sFXData[i].vSpritePos.X
|
|
AND sPlayerData.vSpritePos.Y < (sFXData[i].vSpritePos.Y + sFXData[i].vSpriteSize.Y)
|
|
AND (sPlayerData.vSpriteSize.Y + sPlayerData.vSpritePos.Y) > sFXData[i].vSpritePos.Y
|
|
AND ABSF((sPlayerData.vSpritePos.Y + sPlayerData.vSpriteSize.Y) - (sFXData[i].vSpritePos.Y + sFXData[i].vSpriteSize.Y)) < 50.0
|
|
AND TWS_CAN_PLAYER_BE_HURT()
|
|
sPlayerData.bIsHit = TRUE
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
sPlayerData.fHealth = CLAMP(sPlayerData.fHealth - 0.1, 0.0, 1.0)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_FX_MAGIC_FIRE
|
|
|
|
IF sFXData[i].iSpriteBlastAnimFrame >= ciTWS_FX_WIZARD_FIRE_ANIM_FRAMES
|
|
sFXData[i].iSpriteBlastAnimFrame = 0
|
|
sFXData[i].bActive = FALSE
|
|
|
|
ELIF sPlayerData.bIsJumping
|
|
|
|
IF sPlayerData.vSpritePos.X < (sFXData[i].vSpritePos.x + sFXData[i].vSpriteSize.X)
|
|
AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteSize.X) > sFXData[i].vSpritePos.X
|
|
AND sPlayerData.vSpritePos.Y < (sFXData[i].vSpritePos.Y + sFXData[i].vSpriteSize.Y)
|
|
AND (sPlayerData.vSpriteSize.Y + sPlayerData.vSpritePos.Y) > sFXData[i].vSpritePos.Y
|
|
AND ABSF((sPlayerData.vInitialJumpPos.Y + sPlayerData.vSpriteSize.Y) - (sFXData[i].vSpritePos.Y + sFXData[i].vSpriteSize.Y)) < 65.0
|
|
AND TWS_CAN_PLAYER_BE_HURT()
|
|
sPlayerData.bIsHit = TRUE
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
sPlayerData.fHealth = CLAMP(sPlayerData.fHealth - 0.1, 0.0, 1.0)
|
|
ENDIF
|
|
ELSE
|
|
|
|
IF sPlayerData.vSpritePos.X < (sFXData[i].vSpritePos.x + sFXData[i].vSpriteSize.X)
|
|
AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteSize.X) > sFXData[i].vSpritePos.X
|
|
AND sPlayerData.vSpritePos.Y < (sFXData[i].vSpritePos.Y + sFXData[i].vSpriteSize.Y)
|
|
AND (sPlayerData.vSpriteSize.Y + sPlayerData.vSpritePos.Y) > sFXData[i].vSpritePos.Y
|
|
AND ABSF((sPlayerData.vSpritePos.Y + sPlayerData.vSpriteSize.Y) - (sFXData[i].vSpritePos.Y + sFXData[i].vSpriteSize.Y)) < 65.0
|
|
AND TWS_CAN_PLAYER_BE_HURT()
|
|
sPlayerData.bIsHit = TRUE
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
sPlayerData.fHealth = CLAMP(sPlayerData.fHealth - 0.1, 0.0, 1.0)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_FX_TRAP_SPEAR
|
|
|
|
IF sFXData[i].iTimer = 0 AND sFXData[i].iSpriteBlastAnimFrame >= ciTWS_TRAP_SPEAR_ANIM_FRAMES
|
|
sFXData[i].iSpriteBlastAnimFrame = ciTWS_TRAP_SPEAR_ANIM_FRAMES-1
|
|
IF TWS_IS_FX_ON_SCREEN(i) AND ARCADE_GAMES_SOUND_HAS_FINISHED(ARCADE_GAMES_SOUND_TWR_SPIKE_DOWN)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_SPIKE_DOWN, TWS_GET_SOUND_POSITION_FOR_FX(i))
|
|
ENDIF
|
|
sFXData[i].iTimer = GET_GAME_TIMER()
|
|
|
|
ELIF sFXData[i].iTimer > 0
|
|
|
|
sFXData[i].iSpriteBlastAnimFrame -= (sFXData[i].iSlowUpdateFrames*2)
|
|
|
|
IF sFXData[i].iSpriteBlastAnimFrame <= 0
|
|
sFXData[i].iSpriteBlastAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() - sFXData[i].iTimer > 1000
|
|
sFXData[i].iTimer = 0
|
|
IF TWS_IS_FX_ON_SCREEN(i) AND ARCADE_GAMES_SOUND_HAS_FINISHED(ARCADE_GAMES_SOUND_TWR_SPIKE_UP)
|
|
TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND_TWR_SPIKE_UP, TWS_GET_SOUND_POSITION_FOR_FX(i))
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sPlayerData.bIsJumping
|
|
IF sPlayerData.vSpritePos.X < (sFXData[i].vSpritePos.x + sFXData[i].vSpriteSize.X)
|
|
AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteSize.X) > sFXData[i].vSpritePos.X
|
|
AND sPlayerData.vSpritePos.Y < (sFXData[i].vSpritePos.Y + sFXData[i].vSpriteSize.Y)
|
|
AND (sPlayerData.vSpriteSize.Y + sPlayerData.vSpritePos.Y) > sFXData[i].vSpritePos.Y
|
|
AND ABSF((sPlayerData.vInitialJumpPos.Y + sPlayerData.vSpriteSize.Y) - (sFXData[i].vSpritePos.Y + sFXData[i].vSpriteSize.Y)) < 20.0*sFXData[i].iSpriteBlastAnimFrame
|
|
AND TWS_CAN_PLAYER_BE_HURT()
|
|
|
|
sPlayerData.bIsHit = TRUE
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
sPlayerData.fHealth = CLAMP(sPlayerData.fHealth - 0.1, 0.0, 1.0)
|
|
|
|
ENDIF
|
|
ELSE
|
|
IF sPlayerData.vSpritePos.X < (sFXData[i].vSpritePos.x + sFXData[i].vSpriteSize.X)
|
|
AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteSize.X) > sFXData[i].vSpritePos.X
|
|
AND sPlayerData.vSpritePos.Y < (sFXData[i].vSpritePos.Y + sFXData[i].vSpriteSize.Y)
|
|
AND (sPlayerData.vSpriteSize.Y + sPlayerData.vSpritePos.Y) > sFXData[i].vSpritePos.Y
|
|
AND ABSF((sPlayerData.vSpritePos.Y + sPlayerData.vSpriteSize.Y) - (sFXData[i].vSpritePos.Y + sFXData[i].vSpriteSize.Y)) < 20.0*sFXData[i].iSpriteBlastAnimFrame
|
|
AND TWS_CAN_PLAYER_BE_HURT()
|
|
|
|
sPlayerData.bIsHit = TRUE
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
sPlayerData.fHealth = CLAMP(sPlayerData.fHealth - 0.1, 0.0, 1.0)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_FX_SWORD
|
|
|
|
IF sFXData[i].iSpriteBlastAnimFrame >= ciTWS_FX_KNIGHT_SWORD_ANIM_FRAMES
|
|
sFXData[i].iSpriteBlastAnimFrame = 0
|
|
sFXData[i].bActive = FALSE
|
|
|
|
ELIF sPlayerData.bIsJumping
|
|
|
|
IF sPlayerData.vSpritePos.X < (sFXData[i].vSpritePos.x + sFXData[i].vSpriteSize.X)
|
|
AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteSize.X) > sFXData[i].vSpritePos.X
|
|
AND sPlayerData.vSpritePos.Y < (sFXData[i].vSpritePos.Y + sFXData[i].vSpriteSize.Y)
|
|
AND (sPlayerData.vSpriteSize.Y + sPlayerData.vSpritePos.Y) > sFXData[i].vSpritePos.Y
|
|
AND ABSF((sPlayerData.vInitialJumpPos.Y + sPlayerData.vSpriteSize.Y) - (sFXData[i].vSpritePos.Y + sFXData[i].vSpriteSize.Y)) < 100.0
|
|
AND TWS_CAN_PLAYER_BE_HURT()
|
|
sPlayerData.bIsHit = TRUE
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
sPlayerData.fHealth = CLAMP(sPlayerData.fHealth - 0.1, 0.0, 1.0)
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF sPlayerData.vSpritePos.X < (sFXData[i].vSpritePos.x + sFXData[i].vSpriteSize.X)
|
|
AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteSize.X) > sFXData[i].vSpritePos.X
|
|
AND sPlayerData.vSpritePos.Y < (sFXData[i].vSpritePos.Y + sFXData[i].vSpriteSize.Y)
|
|
AND (sPlayerData.vSpriteSize.Y + sPlayerData.vSpritePos.Y) > sFXData[i].vSpritePos.Y
|
|
AND ABSF((sPlayerData.vSpritePos.Y + sPlayerData.vSpriteSize.Y) - (sFXData[i].vSpritePos.Y + sFXData[i].vSpriteSize.Y)) < 100.0
|
|
AND TWS_CAN_PLAYER_BE_HURT()
|
|
sPlayerData.bIsHit = TRUE
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
sPlayerData.fHealth = CLAMP(sPlayerData.fHealth - 0.1, 0.0, 1.0)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_FX_ARROW_LEFT
|
|
|
|
sFXData[i].vSpritePos.x = sFXData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*1.2
|
|
|
|
IF sFXData[i].vSpritePos.x < sPlayerData.vSpritePos.x - cfBASE_SCREEN_WIDTH
|
|
sFXData[i].iSpriteBlastAnimFrame = 0
|
|
sFXData[i].bActive = FALSE
|
|
|
|
ELIF (sPlayerData.vSpritePos.X - sPlayerData.vSpriteSize.y < (sFXData[i].vSpritePos.x + cfTWS_GRUNT_CROSSBOW_ARROW_WIDTH) AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteSize.X) > sFXData[i].vSpritePos.x
|
|
AND sPlayerData.vSpritePos.Y - sPlayerData.vSpriteSize.y < (sFXData[i].vSpritePos.Y + cfTWS_GRUNT_CROSSBOW_ARROW_HEIGHT) AND (sPlayerData.vSpriteSize.Y/2 + sPlayerData.vSpritePos.Y) > sFXData[i].vSpritePos.Y)
|
|
AND ABSF((sPlayerData.vSpritePos.Y + sPlayerData.vSpriteSize.Y) - (sFXData[i].vSpritePos.Y + cfTWS_FX_ARROW_HEIGHT_TO_GROUND)) < 75.0
|
|
|
|
sFXData[i].bActive = FALSE
|
|
TWS_CREATE_FX(sFXData[i].vSpritePos, TWS_FX_SMALL_HIT)
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
|
|
IF TWS_CAN_PLAYER_BE_HURT()
|
|
sPlayerData.bIsHit = TRUE
|
|
sPlayerData.fHealth = CLAMP(sPlayerData.fHealth - 0.1, 0.0, 1.0)
|
|
ELSE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_WEAPON_DEFLECT_ARROW)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_FX_ARROW_RIGHT
|
|
|
|
sFXData[i].vSpritePos.x = sFXData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*1.2
|
|
|
|
IF sFXData[i].vSpritePos.x > sPlayerData.vSpritePos.x + cfBASE_SCREEN_WIDTH
|
|
sFXData[i].iSpriteBlastAnimFrame = 0
|
|
sFXData[i].bActive = FALSE
|
|
|
|
ELIF (sPlayerData.vSpritePos.X - sPlayerData.vSpriteSize.y < (sFXData[i].vSpritePos.x + cfTWS_GRUNT_CROSSBOW_ARROW_WIDTH) AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteSize.X) > sFXData[i].vSpritePos.x
|
|
AND sPlayerData.vSpritePos.Y - sPlayerData.vSpriteSize.y < (sFXData[i].vSpritePos.Y + cfTWS_GRUNT_CROSSBOW_ARROW_HEIGHT) AND (sPlayerData.vSpriteSize.Y/2 + sPlayerData.vSpritePos.Y) > sFXData[i].vSpritePos.Y)
|
|
AND ABSF((sPlayerData.vSpritePos.Y + sPlayerData.vSpriteSize.Y) - (sFXData[i].vSpritePos.Y + cfTWS_FX_ARROW_HEIGHT_TO_GROUND)) < 75.0
|
|
|
|
sFXData[i].bActive = FALSE
|
|
TWS_CREATE_FX(sFXData[i].vSpritePos, TWS_FX_SMALL_HIT)
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
|
|
IF TWS_CAN_PLAYER_BE_HURT()
|
|
sPlayerData.bIsHit = TRUE
|
|
sPlayerData.fHealth = CLAMP(sPlayerData.fHealth - 0.1, 0.0, 1.0)
|
|
ELSE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_WEAPON_DEFLECT_ARROW)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_FX_CLOTHES
|
|
|
|
sFXData[i].vSpritePos.y += 1.0
|
|
IF sFXData[i].vSpritePos.y >= sPlayerData.vSpritePos.y
|
|
sFXData[i].iSpriteBlastAnimFrame = 0
|
|
sFXData[i].bActive = FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_FX_FIREBALL_LEFT
|
|
|
|
IF sFXData[i].iSpriteBlastAnimFrame >= ciTWS_FX_FIREBALL_ANIM_FRAMES
|
|
sFXData[i].iSpriteBlastAnimFrame = 0
|
|
ENDIF
|
|
|
|
sFXData[i].vSpritePos.x = sFXData[i].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*1.2
|
|
|
|
IF sFXData[i].vSpritePos.x < sPlayerData.vSpritePos.x - cfBASE_SCREEN_WIDTH
|
|
sFXData[i].iSpriteBlastAnimFrame = 0
|
|
sFXData[i].bActive = FALSE
|
|
|
|
ELIF (sPlayerData.vSpritePos.X - sPlayerData.vSpriteSize.y < (sFXData[i].vSpritePos.x + cfTWS_GRUNT_CASTER_FIREBALL_WIDTH) AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteSize.X) > sFXData[i].vSpritePos.x
|
|
AND sPlayerData.vSpritePos.Y - sPlayerData.vSpriteSize.y < (sFXData[i].vSpritePos.Y + cfTWS_GRUNT_CASTER_FIREBALL_HEIGHT) AND (sPlayerData.vSpriteSize.Y/2 + sPlayerData.vSpritePos.Y) > sFXData[i].vSpritePos.Y)
|
|
AND ABSF((sPlayerData.vSpritePos.Y + sPlayerData.vSpriteSize.Y) - (sFXData[i].vSpritePos.Y + cfTWS_FX_ARROW_HEIGHT_TO_GROUND)) < 75.0
|
|
|
|
sFXData[i].bActive = FALSE
|
|
TWS_CREATE_FX(sFXData[i].vSpritePos, TWS_FX_LARGE_HIT)
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
|
|
IF TWS_CAN_PLAYER_BE_HURT()
|
|
sPlayerData.bIsHit = TRUE
|
|
sPlayerData.fHealth = CLAMP(sPlayerData.fHealth - 0.2, 0.0, 1.0)
|
|
ELSE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_WEAPON_DEFLECT_FIREBALL)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_FX_FIREBALL_RIGHT
|
|
|
|
IF sFXData[i].iSpriteBlastAnimFrame >= ciTWS_FX_FIREBALL_ANIM_FRAMES
|
|
sFXData[i].iSpriteBlastAnimFrame = 0
|
|
ENDIF
|
|
|
|
sFXData[i].vSpritePos.x = sFXData[i].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*1.2
|
|
|
|
IF sFXData[i].vSpritePos.x > sPlayerData.vSpritePos.x + cfBASE_SCREEN_WIDTH
|
|
sFXData[i].iSpriteBlastAnimFrame = 0
|
|
sFXData[i].bActive = FALSE
|
|
|
|
ELIF (sPlayerData.vSpritePos.X - sPlayerData.vSpriteSize.y < (sFXData[i].vSpritePos.x + cfTWS_GRUNT_CASTER_FIREBALL_WIDTH) AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteSize.X) > sFXData[i].vSpritePos.x
|
|
AND sPlayerData.vSpritePos.Y - sPlayerData.vSpriteSize.y < (sFXData[i].vSpritePos.Y + cfTWS_GRUNT_CASTER_FIREBALL_HEIGHT) AND (sPlayerData.vSpriteSize.Y/2 + sPlayerData.vSpritePos.Y) > sFXData[i].vSpritePos.Y)
|
|
AND ABSF((sPlayerData.vSpritePos.Y + sPlayerData.vSpriteSize.Y) - (sFXData[i].vSpritePos.Y + cfTWS_FX_ARROW_HEIGHT_TO_GROUND)) < 75.0
|
|
|
|
sFXData[i].bActive = FALSE
|
|
TWS_CREATE_FX(sFXData[i].vSpritePos, TWS_FX_LARGE_HIT)
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
|
|
IF TWS_CAN_PLAYER_BE_HURT()
|
|
sPlayerData.bIsHit = TRUE
|
|
sPlayerData.fHealth = CLAMP(sPlayerData.fHealth - 0.2, 0.0, 1.0)
|
|
ELSE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_WEAPON_DEFLECT_FIREBALL)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_FX_COINS_LEFT
|
|
|
|
IF sFXData[i].iSpriteBlastAnimFrame >= ciTWS_FX_COINS_ANIM_FRAMES
|
|
sFXData[i].iSpriteBlastAnimFrame = 0
|
|
sFXData[i].bActive = FALSE
|
|
|
|
ELIF (sPlayerData.vSpritePos.X - sPlayerData.vSpriteSize.y < (sFXData[i].vSpritePos.x + cfTWS_LEPRECHAUN_COINS_WIDTH) AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteSize.X * cfTWS_RESCALE_FACTOR) > sFXData[i].vSpritePos.x
|
|
AND sPlayerData.vSpritePos.Y - sPlayerData.vSpriteSize.y < (sFXData[i].vSpritePos.Y + cfTWS_LEPRECHAUN_COINS_HEIGHT) AND (sPlayerData.vSpriteSize.Y * cfTWS_RESCALE_FACTOR + sPlayerData.vSpritePos.Y) > sFXData[i].vSpritePos.Y)
|
|
AND TWS_CAN_PLAYER_BE_HURT()
|
|
AND sFXData[i].iSpriteBlastAnimFrame = 3
|
|
sFXData[i].bActive = FALSE
|
|
sPlayerData.bIsHit = TRUE
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
sPlayerData.fHealth = CLAMP(sPlayerData.fHealth - 0.1, 0.0, 1.0)
|
|
TWS_CREATE_FX(sFXData[i].vSpritePos, TWS_FX_SMALL_HIT)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_FX_COINS_RIGHT
|
|
|
|
IF sFXData[i].iSpriteBlastAnimFrame >= ciTWS_FX_COINS_ANIM_FRAMES
|
|
sFXData[i].iSpriteBlastAnimFrame = 0
|
|
sFXData[i].bActive = FALSE
|
|
|
|
ELIF (sPlayerData.vSpritePos.X - sPlayerData.vSpriteSize.y < (sFXData[i].vSpritePos.x + cfTWS_LEPRECHAUN_COINS_WIDTH) AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteSize.X * cfTWS_RESCALE_FACTOR) > sFXData[i].vSpritePos.x
|
|
AND sPlayerData.vSpritePos.Y - sPlayerData.vSpriteSize.y < (sFXData[i].vSpritePos.Y + cfTWS_LEPRECHAUN_COINS_HEIGHT) AND (sPlayerData.vSpriteSize.Y * cfTWS_RESCALE_FACTOR + sPlayerData.vSpritePos.Y) > sFXData[i].vSpritePos.Y)
|
|
AND TWS_CAN_PLAYER_BE_HURT()
|
|
AND sFXData[i].iSpriteBlastAnimFrame = 3
|
|
sFXData[i].bActive = FALSE
|
|
sPlayerData.bIsHit = TRUE
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
sPlayerData.fHealth = CLAMP(sPlayerData.fHealth - 0.1, 0.0, 1.0)
|
|
TWS_CREATE_FX(sFXData[i].vSpritePos, TWS_FX_SMALL_HIT)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_FX_VENOM_PUDDLE
|
|
|
|
IF GET_GAME_TIMER() - sFXData[i].iTimer < ciTWS_MAGIC_COLUMN_INTRO_TIME
|
|
|
|
IF sFXData[i].iSpriteBlastAnimFrame >= 2
|
|
sFXData[i].iSpriteBlastAnimFrame = 1
|
|
ENDIF
|
|
|
|
ELIF GET_GAME_TIMER() - sFXData[i].iTimer < ciTWS_BOSS_ATTACK_TIME
|
|
|
|
IF sFXData[i].iSpriteBlastAnimFrame >= ciTWS_FX_BOSS_SPIDER_VENOM_ANIM_FRAMES
|
|
sFXData[i].iSpriteBlastAnimFrame = ciTWS_FX_BOSS_SPIDER_VENOM_ANIM_FRAMES - 1
|
|
ENDIF
|
|
|
|
IF sFXData[i].iSpriteBlastAnimFrame > ciTWS_FX_WIZARD_PILLAR_DAMAGE_ANIM_FRAMES
|
|
ELIF sPlayerData.vSpritePos.X < (sFXData[i].vSpritePos.x + sFXData[i].vSpriteSize.X)
|
|
AND (sPlayerData.vSpritePos.X + sPlayerData.vSpriteSize.X) > sFXData[i].vSpritePos.X
|
|
AND sPlayerData.vSpritePos.Y < (sFXData[i].vSpritePos.Y + sFXData[i].vSpriteSize.Y)
|
|
AND (sPlayerData.vSpriteSize.Y + sPlayerData.vSpritePos.Y) > sFXData[i].vSpritePos.Y
|
|
AND ABSF((sPlayerData.vSpritePos.Y + sPlayerData.vSpriteSize.Y) - (sFXData[i].vSpritePos.Y + sFXData[i].vSpriteSize.Y)) < 50.0
|
|
AND TWS_CAN_PLAYER_BE_HURT()
|
|
sPlayerData.bIsHit = TRUE
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 10)
|
|
sPlayerData.fHealth = CLAMP(sPlayerData.fHealth - 0.1, 0.0, 1.0)
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
sFXData[i].iSpriteBlastAnimFrame -= 2* sFXData[i].iSlowUpdateFrames
|
|
IF sFXData[i].iSpriteBlastAnimFrame < 0
|
|
sFXData[i].iSpriteBlastAnimFrame = 0
|
|
sFXData[i].bActive = FALSE
|
|
sFXData[i].iTimer = 0
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_FX_GROG_BUBBLE
|
|
IF sFXData[i].iSpriteBlastAnimFrame >= ciTWS_FX_HIT_VENOM_ANIM_FRAMES
|
|
sFXData[i].iSpriteBlastAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF sTWSData.eGrogEncounterState < TWS_GROG_LEAVES AND sFXData[i].vSpritePos.y < cfBASE_SCREEN_HEIGHT*0.6
|
|
sFXData[i].vSpritePos.y = sFXData[i].vSpritePos.y +@ cfTWS_VERTICAL_MOVEMENT_ENEMY * 2
|
|
ELIF (sTWSData.eGrogEncounterState >= TWS_GROG_LEAVES AND sFXData[i].vSpritePos.y > -150)
|
|
sFXData[i].vSpritePos.y = sFXData[i].vSpritePos.y -@ cfTWS_VERTICAL_MOVEMENT_ENEMY * 2
|
|
ELIF sTWSData.eGrogEncounterState >= TWS_GROG_LEAVES AND sFXData[i].vSpritePos.y <= -150
|
|
sFXData[i].bActive = FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF sFXData[i].bActive = FALSE
|
|
TWS_REMOVE_DRAW_CALL(TWS_ENTITY_FX, i)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
ENDPROC
|
|
|
|
FUNC ARCADE_GAMES_SOUND TWS_GET_CHARACTER_SPEECH_BUBBLE_SOUND(INT iLine)
|
|
|
|
SWITCH iLine
|
|
CASE 1
|
|
CASE 5
|
|
CASE 7
|
|
CASE 9
|
|
CASE 12
|
|
CASE 16
|
|
CASE 18
|
|
CASE 21
|
|
RETURN ARCADE_GAMES_SOUND_TWR_SPEECH_BUBBLE_THOG
|
|
CASE 17
|
|
CASE 19
|
|
CASE 20
|
|
RETURN ARCADE_GAMES_SOUND_TWR_SPEECH_BUBBLE_WIZARD
|
|
CASE 0
|
|
CASE 2
|
|
CASE 3
|
|
RETURN ARCADE_GAMES_SOUND_TWR_SPEECH_BUBBLE_MAN_01
|
|
CASE 13
|
|
RETURN ARCADE_GAMES_SOUND_TWR_SPEECH_BUBBLE_MAN_02
|
|
CASE 4
|
|
CASE 6
|
|
CASE 8
|
|
CASE 10
|
|
RETURN ARCADE_GAMES_SOUND_TWR_SPEECH_BUBBLE_WOMAN_01
|
|
CASE 11
|
|
RETURN ARCADE_GAMES_SOUND_TWR_SPEECH_BUBBLE_WOMAN_02
|
|
CASE 14
|
|
RETURN ARCADE_GAMES_SOUND_TWR_SPEECH_BUBBLE_WOMAN_03
|
|
CASE 15
|
|
RETURN ARCADE_GAMES_SOUND_TWR_SPEECH_BUBBLE_WOMAN_04
|
|
DEFAULT
|
|
RETURN ARCADE_GAMES_SOUND_TWR_SPEECH_BUBBLE_GROG
|
|
|
|
ENDSWITCH
|
|
|
|
ENDFUNC
|
|
|
|
PROC TWS_START_DIALOGUE(INT iStartingLine, INT iFinalLine)
|
|
|
|
sHUDData[TWS_HUD_DIALOGUE_FRAME].bRendering = TRUE
|
|
sHUDData[TWS_HUD_DIALOGUE_FRAME].bActive = TRUE
|
|
sTWSData.iCurrentDialogue = iStartingLine
|
|
sTWSData.iLastDialogue = iFinalLine
|
|
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(TWS_GET_CHARACTER_SPEECH_BUBBLE_SOUND(iStartingLine))
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_END_DIALOGUE()
|
|
|
|
sHUDData[TWS_HUD_DIALOGUE_FRAME].bActive = FALSE
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL HAS_CURRENT_DIALOGUE_ENDED()
|
|
RETURN sTWSData.iCurrentDialogue > sTWSData.iLastDialogue
|
|
|
|
ENDFUNC
|
|
|
|
PROC TWS_HANDLE_DIALOGUE()
|
|
|
|
IF sTWSData.iCurrentDialogue < sTWSData.iLastDialogue AND TWS_IS_ANY_ACCEPT_BUTTON_PRESSED()
|
|
sTWSData.iCurrentDialogue ++
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(TWS_GET_CHARACTER_SPEECH_BUBBLE_SOUND(sTWSData.iCurrentDialogue))
|
|
|
|
ELIF TWS_IS_ANY_ACCEPT_BUTTON_PRESSED()
|
|
sTWSData.iCurrentDialogue ++
|
|
TWS_END_DIALOGUE()
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
|
|
PROC TWS_HANDLE_HUD()
|
|
|
|
IF sHUDData[TWS_HUD_START].bActive
|
|
IF sHUDData[TWS_HUD_START].vSpritePos.x > (cfBASE_SCREEN_WIDTH + 500)
|
|
sHUDData[TWS_HUD_START].bActive= FALSE
|
|
ELIF sHUDData[TWS_HUD_START].vSpritePos.x < (cfBASE_SCREEN_WIDTH/2 - 100) OR sHUDData[TWS_HUD_START].vSpritePos.x > (cfBASE_SCREEN_WIDTH/2 + 100)
|
|
IF sHUDData[TWS_HUD_START].vSpritePos.x <= - 100 AND sTWSData.eCurrentLevel != TWS_FOREST_INTRO
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_STAGE_START_SHING)
|
|
ENDIF
|
|
|
|
sHUDData[TWS_HUD_START].vSpritePos.x += 30
|
|
|
|
IF NOT sHUDData[TWS_HUD_START].bPlayedSoundAttacked AND sHUDData[TWS_HUD_START].vSpritePos.x >= cfBASE_SCREEN_WIDTH/2 - 100 AND sTWSData.eCurrentLevel != TWS_FOREST_INTRO
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_STAGE_START_HIT)
|
|
sHUDData[TWS_HUD_START].bPlayedSoundAttacked = TRUE
|
|
ENDIF
|
|
ELSE
|
|
sHUDData[TWS_HUD_START].vSpritePos.x += 4
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sHUDData[TWS_HUD_GAMEOVER].bActive
|
|
IF sHUDData[TWS_HUD_GAMEOVER].vSpritePos.x > (cfBASE_SCREEN_WIDTH + 500)
|
|
sHUDData[TWS_HUD_GAMEOVER].bActive= FALSE
|
|
ELIF sHUDData[TWS_HUD_GAMEOVER].vSpritePos.x < (cfBASE_SCREEN_WIDTH/2 - 100) OR sHUDData[TWS_HUD_GAMEOVER].vSpritePos.x > (cfBASE_SCREEN_WIDTH/2 + 100)
|
|
|
|
IF sHUDData[TWS_HUD_GAMEOVER].vSpritePos.x <= - 100
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_STAGE_START_SHING)
|
|
ENDIF
|
|
|
|
sHUDData[TWS_HUD_GAMEOVER].vSpritePos.x += 30
|
|
|
|
IF NOT sHUDData[TWS_HUD_GAMEOVER].bPlayedSoundAttacked AND sHUDData[TWS_HUD_GAMEOVER].vSpritePos.x >= cfBASE_SCREEN_WIDTH/2 - 100
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_STAGE_START_HIT)
|
|
sHUDData[TWS_HUD_GAMEOVER].bPlayedSoundAttacked = TRUE
|
|
ENDIF
|
|
|
|
ELSE
|
|
sHUDData[TWS_HUD_GAMEOVER].vSpritePos.x += 4
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sHUDData[TWS_HUD_END].bActive
|
|
IF sHUDData[TWS_HUD_END].vSpritePos.x < cfBASE_SCREEN_WIDTH/2
|
|
sHUDData[TWS_HUD_END].vSpritePos.x += 30
|
|
IF sHUDData[TWS_HUD_END].vSpritePos.x >= cfBASE_SCREEN_WIDTH/2
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_STAGE_START_HIT)
|
|
ENDIF
|
|
IF NOT sHUDData[TWS_HUD_END].bPlayedSoundAttacked AND sHUDData[TWS_HUD_END].vSpritePos.x >= cfBASE_SCREEN_WIDTH/2
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_STAGE_START_HIT)
|
|
sHUDData[TWS_HUD_END].bPlayedSoundAttacked = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sTWSData.eLevelStage = TWS_LEVEL_PLAYING
|
|
sHUDData[TWS_HUD_GO_ARROW].bActive = TRUE
|
|
|
|
IF sTWSData.bLockedScreen OR TWS_ARE_ENEMIES_IN_RANGE()
|
|
sHUDData[TWS_HUD_GO_ARROW].bActive = FALSE
|
|
sHUDData[TWS_HUD_GO_ARROW].iSlowUpdateFrames = 0
|
|
ENDIF
|
|
|
|
IF sHUDData[TWS_HUD_GO_ARROW].bActive AND sHUDData[TWS_HUD_START].bActive = FALSE
|
|
IF SIN(GET_GAME_TIMER()/2.0) > 0.0
|
|
IF sHUDData[TWS_HUD_GO_ARROW].bRendering = FALSE AND sHUDData[TWS_HUD_GO_ARROW].iSlowUpdateFrames < 3
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_STAGE_GO)
|
|
sHUDData[TWS_HUD_GO_ARROW].iSlowUpdateFrames ++
|
|
ENDIF
|
|
sHUDData[TWS_HUD_GO_ARROW].bRendering = TRUE
|
|
ELSE
|
|
sHUDData[TWS_HUD_GO_ARROW].bRendering = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELIF sHUDData[TWS_HUD_GO_ARROW].bActive
|
|
sHUDData[TWS_HUD_GO_ARROW].bActive = FALSE
|
|
|
|
ENDIF
|
|
|
|
IF sHUDData[TWS_HUD_DIALOGUE_FRAME].bActive
|
|
IF sHUDData[TWS_HUD_DIALOGUE_FRAME].iSpriteBlastAnimFrame < ciTWS_DIALOGUE_FRAME_ANIM_FRAMES -1
|
|
sHUDData[TWS_HUD_DIALOGUE_FRAME].iSpriteBlastAnimFrame += sHUDData[TWS_HUD_DIALOGUE_FRAME].iSlowUpdateFrames
|
|
ENDIF
|
|
ELIF NOT sHUDData[TWS_HUD_DIALOGUE_FRAME].bActive
|
|
IF sHUDData[TWS_HUD_DIALOGUE_FRAME].iSpriteBlastAnimFrame > 0
|
|
sHUDData[TWS_HUD_DIALOGUE_FRAME].iSpriteBlastAnimFrame -= sHUDData[TWS_HUD_DIALOGUE_FRAME].iSlowUpdateFrames
|
|
ELIF sHUDData[TWS_HUD_DIALOGUE_FRAME].iSpriteBlastAnimFrame = 0
|
|
sHUDData[TWS_HUD_DIALOGUE_FRAME].bRendering = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL TWS_HANDLE_FIB_WARNING()
|
|
|
|
SWITCH sTWSData.eFIBState
|
|
CASE TWS_FIB_FADEIN
|
|
TWS_FADE_IN(TRUE)
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
sTWSData.eFIBState = TWS_FIB_DISPLAY
|
|
BREAK
|
|
|
|
CASE TWS_FIB_DISPLAY
|
|
IF TWS_IS_SCREEN_FADED_IN() AND GET_GAME_TIMER() - sTWSData.iGameTimer > 4000
|
|
sTWSData.eFIBState = TWS_FIB_FADEOUT
|
|
TWS_FADE_OUT()
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_FIB_FADEOUT
|
|
IF TWS_IS_SCREEN_FADED_OUT()
|
|
sTWSData.eFIBState = TWS_FIB_FADEIN
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL TWS_HANDLE_PIXTRO_LOGO()
|
|
|
|
SWITCH sTWSData.ePixtroState
|
|
CASE TWS_PIXTRO_START
|
|
|
|
ARCADE_DRAW_PIXELSPACE_RECT(INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_HEIGHT), sTWSData.rgbaBlack)
|
|
|
|
TWS_START_MOVIE(sTWSData.bmIDPixtroIntro,"_Pixtro_Intro_80s_2")
|
|
TWS_DRAW_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_PIXTRO_LOGO)
|
|
sTWSData.ePixtroState = TWS_PIXTRO_PLAYING
|
|
BREAK
|
|
|
|
CASE TWS_PIXTRO_PLAYING
|
|
|
|
ARCADE_DRAW_PIXELSPACE_RECT(INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_HEIGHT), sTWSData.rgbaBlack)
|
|
|
|
IF TWS_DRAW_MOVIE(sTWSData.bmIDPixtroIntro, cfGAME_SCREEN_WIDTH/1264.0 ,1.0)
|
|
TWS_DRAW_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_PIXTRO_LOGO)
|
|
sTWSData.ePixtroState = TWS_PIXTRO_START
|
|
RETURN TRUE
|
|
ENDIF
|
|
TWS_DRAW_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_PIXTRO_LOGO)
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL TWS_HANDLE_TITLE_ANIM()
|
|
|
|
sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame += sTWSData.iGlobalDefaultUpdateFrames
|
|
|
|
SWITCH sTWSData.sCutsceneData.eTitleCutsceneStage
|
|
|
|
CASE TWS_TITLE_ANIM_STRIKE_1
|
|
IF sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame >= ciTWS_TITLE_ANIM_STRIKE_FRAMES
|
|
sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_INTRO_THUNDER)
|
|
TRIGGER_MUSIC_EVENT("ARCADE_WR_THEME_START")
|
|
sTWSData.sCutsceneData.eTitleCutsceneStage = TWS_TITLE_ANIM_STRIKE_1_PAUSE
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_TITLE_ANIM_STRIKE_1_PAUSE
|
|
IF sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame >= ciTWS_TITLE_ANIM_PAUSE_FRAMES
|
|
sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_INTRO_THUNDER)
|
|
sTWSData.sCutsceneData.eTitleCutsceneStage = TWS_TITLE_ANIM_STRIKE_2
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_TITLE_ANIM_STRIKE_2
|
|
IF sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame >= ciTWS_TITLE_ANIM_STRIKE_FRAMES
|
|
sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame = 0
|
|
sTWSData.sCutsceneData.eTitleCutsceneStage = TWS_TITLE_ANIM_STRIKE_2_PAUSE
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_TITLE_ANIM_STRIKE_2_PAUSE
|
|
IF sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame >= ciTWS_TITLE_ANIM_PAUSE_FRAMES
|
|
sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_INTRO_DOUBLE_THUNDER)
|
|
sTWSData.sCutsceneData.eTitleCutsceneStage = TWS_TITLE_ANIM_FINAL_STRIKE
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_TITLE_ANIM_FINAL_STRIKE
|
|
IF sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame >= ciTWS_TITLE_ANIM_FINAL_FRAMES
|
|
sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame = 0
|
|
sTWSData.sCutsceneData.eTitleCutsceneStage = TWS_TITLE_ANIM_STRIKE_1
|
|
TWS_FADE_IN(TRUE)
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF TWS_IS_ANY_ACCEPT_BUTTON_PRESSED()
|
|
sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame = 0
|
|
sTWSData.sCutsceneData.eTitleCutsceneStage = TWS_TITLE_ANIM_STRIKE_1
|
|
TWS_FADE_IN(TRUE)
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL TWS_HANDLE_TITLE_SCREEN()
|
|
|
|
BOOL bLeft, bRight
|
|
INT iCurrentOption
|
|
FLOAT fRightStickX = 0.0
|
|
FLOAT fAxisThresholdMod = 0.5
|
|
|
|
IF (sTWSData.eCurrentMenuOption = TWS_MENU_BEGIN_ADVENTURE AND sTWSData.iMenuOptionSpriteAnim != ciTWS_MENU_OPTIONS_BEGIN_FRAME)
|
|
OR (sTWSData.eCurrentMenuOption = TWS_MENU_LEADERBOARD AND sTWSData.iMenuOptionSpriteAnim != ciTWS_MENU_OPTIONS_LEADERBOARD_FRAME)
|
|
OR (sTWSData.eCurrentMenuOption = TWS_MENU_GROG_MODE AND sTWSData.iMenuOptionSpriteAnim != ciTWS_MENU_OPTIONS_GROG_FRAME)
|
|
IF sTWSData.bMenuOptionMovingToRight
|
|
sTWSData.iMenuOptionSpriteAnim += sTWSData.iGlobalDefaultUpdateFrames
|
|
ELSE
|
|
sTWSData.iMenuOptionSpriteAnim -= sTWSData.iGlobalDefaultUpdateFrames
|
|
ENDIF
|
|
|
|
IF sTWSData.iMenuOptionSpriteAnim < 0
|
|
sTWSData.iMenuOptionSpriteAnim = 14
|
|
ELIF sTWSData.iMenuOptionSpriteAnim >= 15
|
|
sTWSData.iMenuOptionSpriteAnim = 0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH sTWSData.eTitleStage
|
|
CASE TWS_TITLE_PRESS_START
|
|
IF TWS_IS_ANY_ACCEPT_BUTTON_PRESSED()
|
|
sTWSData.eTitleStage = TWS_TITLE_SELECT_OPTION
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_MENU_SELECT)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_TITLE_SELECT_OPTION
|
|
|
|
// Joystick
|
|
bLeft = IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_LEFT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LEFT)
|
|
bRight = IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT)
|
|
fRightStickX = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_X)
|
|
|
|
IF fRightStickX < -cfSTICK_THRESHOLD * fAxisThresholdMod AND GET_GAME_TIMER() - sTWSData.iGameTimer > 150
|
|
bLeft = TRUE
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
|
|
ELIF fRightStickX > cfSTICK_THRESHOLD * fAxisThresholdMod AND GET_GAME_TIMER() - sTWSData.iGameTimer > 150
|
|
bRight = TRUE
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
|
|
ENDIF
|
|
|
|
IF bLeft
|
|
|
|
iCurrentOption = ENUM_TO_INT(sTWSData.eCurrentMenuOption) -1
|
|
IF iCurrentOption < 0
|
|
iCurrentOption = ENUM_TO_INT(TWS_MAX_MENU_OPTIONS) -1
|
|
ELSE
|
|
iCurrentOption = iCurrentOption % ENUM_TO_INT(TWS_MAX_MENU_OPTIONS)
|
|
ENDIF
|
|
|
|
sTWSData.eCurrentMenuOption = INT_TO_ENUM(TWS_MENU_OPTION, iCurrentOption)
|
|
sTWSData.bMenuOptionMovingToRight = FALSE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_MENU_NAVIGATE)
|
|
|
|
ELIF bRight
|
|
|
|
iCurrentOption = (ENUM_TO_INT(sTWSData.eCurrentMenuOption) + 1) % ENUM_TO_INT(TWS_MAX_MENU_OPTIONS)
|
|
sTWSData.eCurrentMenuOption = INT_TO_ENUM(TWS_MENU_OPTION, iCurrentOption)
|
|
sTWSData.bMenuOptionMovingToRight = TRUE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_MENU_NAVIGATE)
|
|
|
|
ELIF TWS_IS_ANY_ACCEPT_BUTTON_PRESSED()
|
|
|
|
IF sTWSData.eCurrentMenuOption = TWS_MENU_GROG_MODE AND NOT sTWSData.bNormalModeIsCompleted
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_WEAPON_DEFLECT_ARROW)
|
|
ELSE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_MENU_SELECT)
|
|
sTWSData.eTitleStage = TWS_TITLE_OPTION_BLINKING
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_TITLE_OPTION_BLINKING
|
|
IF GET_GAME_TIMER() - sTWSData.iGameTimer > 1000
|
|
sTWSData.eTitleStage = TWS_TITLE_FADE
|
|
TWS_FADE_OUT()
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_TITLE_FADE
|
|
IF TWS_IS_SCREEN_FADED_OUT()
|
|
sTWSData.eTitleStage = TWS_TITLE_PRESS_START
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
PROC TWS_INIT_MENU_VARIABLES()
|
|
|
|
sTWSData.fMenuBackgroundPosX[0] = cfTWS_MENU_BACKGROUND_TILE_WIDTH/2
|
|
sTWSData.fMenuBackgroundPosX[1] = sTWSData.fMenuBackgroundPosX[0] + cfTWS_MENU_BACKGROUND_TILE_WIDTH
|
|
|
|
sTWSData.rgbaFade.iA = 0
|
|
|
|
IF GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_ARCADE_GROG_MODE_DEACTIVATED)
|
|
CPRINTLN(DEBUG_MINIGAME, "TWS - Grog mode is unlocked!")
|
|
sTWSData.bNormalModeIsCompleted = TRUE
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL TWS_HANDLE_CUTSCENE_UPDATE()
|
|
|
|
IF NOT sTWSData.sCutsceneData.bShouldCutscenePlay
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
IF TWS_IS_ANY_ACCEPT_BUTTON_PRESSED() AND (TWS_IS_SCREEN_FADED_IN() OR sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame > 0) AND sTWSData.eCurrentLevel != TWS_CASTLE_OUTRO
|
|
AND sTWSData.sCutsceneData.eGameplayCutsceneStage != TWS_CUTSCENE_FADE_OUT
|
|
sTWSData.sCutsceneData.iMaxCutsceneFrame = sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame
|
|
sTWSData.sCutsceneData.eGameplayCutsceneStage = TWS_CUTSCENE_FADE_OUT
|
|
TRIGGER_MUSIC_EVENT("ARCADE_WR_FADE")
|
|
ENDIF
|
|
|
|
SWITCH sTWSData.sCutsceneData.eGameplayCutsceneStage
|
|
|
|
CASE TWS_CUTSCENE_PAUSE
|
|
|
|
CDEBUG3LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] : TIMER: ",GET_GAME_TIMER() - sTWSData.iGameTimer, " FADE:", sTWSData.rgbaFade.iA)
|
|
IF GET_GAME_TIMER() - sTWSData.iGameTimer >= ciTWS_CUTSCENE_SHOT_TIME
|
|
sTWSData.sCutsceneData.eGameplayCutsceneStage = TWS_CUTSCENE_FADE_IN
|
|
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_CUTSCENE_FADE_IN
|
|
|
|
IF TWS_IS_SCREEN_FADED_IN()
|
|
|
|
TEXT_LABEL_15 sSubtitles
|
|
IF sTWSData.eCurrentLevel = TWS_FOREST_INTRO
|
|
sSubtitles = "TWR_INTRO_S"
|
|
ELSE
|
|
sSubtitles = "TWR_OUTRO_S"
|
|
ENDIF
|
|
sSubtitles += (sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame)+1
|
|
PRINT_NOW(sSubtitles, 3000, 1)
|
|
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
sTWSData.sCutsceneData.eGameplayCutsceneStage = TWS_CUTSCENE_PLAYING
|
|
ELIF NOT TWS_IS_SCREEN_FADING_IN()
|
|
IF sTWSData.eCurrentLevel = TWS_FOREST_INTRO
|
|
SWITCH sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame
|
|
CASE 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_SLIDESHOW_01)
|
|
BREAK
|
|
CASE 1
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_SLIDESHOW_02)
|
|
BREAK
|
|
CASE 2
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_SLIDESHOW_03)
|
|
BREAK
|
|
CASE 3
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_SLIDESHOW_04)
|
|
BREAK
|
|
CASE 4
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_SLIDESHOW_05)
|
|
BREAK
|
|
CASE 5
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_SLIDESHOW_06)
|
|
BREAK
|
|
CASE 6
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_SLIDESHOW_07)
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
SWITCH sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame
|
|
CASE 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_SLIDESHOW_END_01)
|
|
BREAK
|
|
CASE 1
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_SLIDESHOW_END_02)
|
|
BREAK
|
|
CASE 2
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_SLIDESHOW_END_03)
|
|
BREAK
|
|
CASE 3
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_SLIDESHOW_END_04)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
TWS_FADE_IN()
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_CUTSCENE_PLAYING
|
|
|
|
IF GET_GAME_TIMER() - sTWSData.iGameTimer >= ciTWS_CUTSCENE_SHOT_TIME
|
|
sTWSData.sCutsceneData.eGameplayCutsceneStage = TWS_CUTSCENE_FADE_OUT
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_CUTSCENE_FADE_OUT
|
|
|
|
IF TWS_IS_SCREEN_FADED_OUT()
|
|
IF sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame >= sTWSData.sCutsceneData.iMaxCutsceneFrame -1
|
|
sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame = 0
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
sTWSData.sCutsceneData.eGameplayCutsceneStage = TWS_CUTSCENE_PAUSE
|
|
TRIGGER_MUSIC_EVENT("ARCADE_WR_FADE")
|
|
RETURN TRUE
|
|
ELSE
|
|
sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame ++
|
|
sTWSData.sCutsceneData.eGameplayCutsceneStage = TWS_CUTSCENE_FADE_IN
|
|
|
|
ENDIF
|
|
|
|
ELIF NOT TWS_IS_SCREEN_FADING_OUT()
|
|
|
|
TWS_FADE_OUT()
|
|
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL TWS_HANDLE_MAP_SCREEN_UPDATE()
|
|
|
|
IF (NOT TWS_SHOULD_DISPLAY_MAP_IN_THIS_LEVEL()
|
|
OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RDOWN)
|
|
OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_SELECT)
|
|
OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RRIGHT))
|
|
AND sTWSData.sCutsceneData.eGameplayCutsceneStage != TWS_CUTSCENE_FADE_OUT
|
|
|
|
IF TWS_SHOULD_DISPLAY_MAP_IN_THIS_LEVEL() AND sTWSData.sCutsceneData.eGameplayCutsceneStage = TWS_CUTSCENE_PAUSE
|
|
SWITCH sTWSData.eCurrentLevel
|
|
CASE TWS_FOREST_INTRO
|
|
CASE TWS_FOREST
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_MAP_FOREST)
|
|
ARCADE_GAMES_SOUND_PLAY_LOOP(ARCADE_GAMES_SOUND_TWR_AMBIENCE_LOOP_FOREST)
|
|
TRIGGER_MUSIC_EVENT("ARCADE_WR_FOREST_START")
|
|
BREAK
|
|
CASE TWS_SWAMP
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_MAP_SWAMP)
|
|
ARCADE_GAMES_SOUND_PLAY_LOOP(ARCADE_GAMES_SOUND_TWR_AMBIENCE_LOOP_SWAMP)
|
|
TRIGGER_MUSIC_EVENT("ARCADE_WR_SWAMP_START")
|
|
BREAK
|
|
CASE TWS_CAVES
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_MAP_CAVE)
|
|
ARCADE_GAMES_SOUND_PLAY_LOOP(ARCADE_GAMES_SOUND_TWR_AMBIENCE_LOOP_CAVES)
|
|
TRIGGER_MUSIC_EVENT("ARCADE_WR_LABRYNTH_START")
|
|
BREAK
|
|
CASE TWS_CASTLE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_MAP_WIZARD_TOWER)
|
|
ARCADE_GAMES_SOUND_PLAY_LOOP(ARCADE_GAMES_SOUND_TWR_AMBIENCE_LOOP_CASTLE)
|
|
TRIGGER_MUSIC_EVENT("ARCADE_WR_CASTLE_START")
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
TWS_FADE_OUT()
|
|
|
|
sTWSData.sCutsceneData.eGameplayCutsceneStage = TWS_CUTSCENE_FADE_OUT
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_MINIGAME, "Wizards Ruin - Updating map screen: ", sTWSData.sCutsceneData.eGameplayCutsceneStage, " | Is screen faded: ", TWS_IS_SCREEN_FADED_OUT())
|
|
|
|
SWITCH sTWSData.sCutsceneData.eGameplayCutsceneStage
|
|
|
|
CASE TWS_CUTSCENE_PAUSE
|
|
IF GET_GAME_TIMER() - sTWSData.iGameTimer > 2000
|
|
sTWSData.sCutsceneData.eGameplayCutsceneStage = TWS_CUTSCENE_FADE_IN
|
|
SWITCH sTWSData.eCurrentLevel
|
|
CASE TWS_FOREST_INTRO
|
|
CASE TWS_FOREST
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_MAP_FOREST)
|
|
ARCADE_GAMES_SOUND_PLAY_LOOP(ARCADE_GAMES_SOUND_TWR_AMBIENCE_LOOP_FOREST)
|
|
TRIGGER_MUSIC_EVENT("ARCADE_WR_FOREST_START")
|
|
BREAK
|
|
CASE TWS_SWAMP
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_MAP_SWAMP)
|
|
ARCADE_GAMES_SOUND_PLAY_LOOP(ARCADE_GAMES_SOUND_TWR_AMBIENCE_LOOP_SWAMP)
|
|
TRIGGER_MUSIC_EVENT("ARCADE_WR_SWAMP_START")
|
|
BREAK
|
|
CASE TWS_CAVES
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_MAP_CAVE)
|
|
ARCADE_GAMES_SOUND_PLAY_LOOP(ARCADE_GAMES_SOUND_TWR_AMBIENCE_LOOP_CAVES)
|
|
TRIGGER_MUSIC_EVENT("ARCADE_WR_LABRYNTH_START")
|
|
BREAK
|
|
CASE TWS_CASTLE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_MAP_WIZARD_TOWER)
|
|
ARCADE_GAMES_SOUND_PLAY_LOOP(ARCADE_GAMES_SOUND_TWR_AMBIENCE_LOOP_CASTLE)
|
|
TRIGGER_MUSIC_EVENT("ARCADE_WR_CASTLE_START")
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_CUTSCENE_FADE_IN
|
|
|
|
IF TWS_IS_SCREEN_FADED_IN()
|
|
sTWSData.sCutsceneData.eGameplayCutsceneStage = TWS_CUTSCENE_PLAYING
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
ELIF NOT TWS_IS_SCREEN_FADING_IN()
|
|
TWS_FADE_IN()
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_CUTSCENE_PLAYING
|
|
|
|
IF GET_GAME_TIMER() - sTWSData.iGameTimer > 2000
|
|
TWS_FADE_OUT()
|
|
sTWSData.sCutsceneData.eGameplayCutsceneStage = TWS_CUTSCENE_FADE_OUT
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE TWS_CUTSCENE_FADE_OUT
|
|
IF TWS_IS_SCREEN_FADED_OUT()
|
|
TWS_FADE_IN()
|
|
sTWSData.sCutsceneData.eGameplayCutsceneStage = TWS_CUTSCENE_PAUSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC TWS_ENEMY_TYPE TWS_GET_RANDOM_BATTLE_ENEMY(INT iSize)
|
|
|
|
SWITCH sTWSData.eCurrentLevel
|
|
CASE TWS_FOREST
|
|
INT iRandomEnemy
|
|
|
|
IF iSize = 0
|
|
iRandomEnemy = GET_RANDOM_INT_IN_RANGE(0,2)
|
|
ELIF iSize = 1
|
|
iRandomEnemy = GET_RANDOM_INT_IN_RANGE(2,5)
|
|
ELSE
|
|
iRandomEnemy = GET_RANDOM_INT_IN_RANGE(0,4)
|
|
ENDIF
|
|
SWITCH iRandomEnemy
|
|
CASE 0
|
|
RETURN TWS_ENEMY_LEPRECHAUN
|
|
CASE 1
|
|
RETURN TWS_ENEMY_FAIRY
|
|
CASE 2
|
|
RETURN TWS_ENEMY_GRUNT_SPEAR
|
|
CASE 3
|
|
RETURN TWS_ENEMY_GRUNT_SWORD
|
|
CASE 4
|
|
RETURN TWS_ENEMY_GRUNT_CROSSBOW
|
|
ENDSWITCH
|
|
BREAK
|
|
CASE TWS_SWAMP
|
|
|
|
IF iSize = 0
|
|
iRandomEnemy = GET_RANDOM_INT_IN_RANGE(0,1)
|
|
ELIF iSize = 1
|
|
iRandomEnemy = GET_RANDOM_INT_IN_RANGE(1,3)
|
|
ELSE
|
|
iRandomEnemy = GET_RANDOM_INT_IN_RANGE(1,5)
|
|
ENDIF
|
|
SWITCH iRandomEnemy
|
|
CASE 0
|
|
RETURN TWS_ENEMY_SLIME
|
|
CASE 1
|
|
RETURN TWS_ENEMY_GRUNT_SWORD
|
|
CASE 2
|
|
RETURN TWS_ENEMY_BRUTE_AXE
|
|
CASE 3
|
|
RETURN TWS_ENEMY_GRUNT_SPEAR
|
|
CASE 4
|
|
RETURN TWS_ENEMY_BRUTE_AXE
|
|
ENDSWITCH
|
|
BREAK
|
|
CASE TWS_CAVES
|
|
|
|
IF iSize = 0
|
|
IF GET_RANDOM_BOOL()
|
|
RETURN TWS_ENEMY_SPIDER
|
|
ELSE
|
|
RETURN TWS_ENEMY_SPIDER
|
|
ENDIF
|
|
ELSE
|
|
IF GET_RANDOM_BOOL()
|
|
RETURN TWS_ENEMY_GRUNT
|
|
ELSE
|
|
RETURN TWS_ENEMY_BRUTE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE TWS_CASTLE
|
|
|
|
IF iSize = 0
|
|
iRandomEnemy = GET_RANDOM_INT_IN_RANGE(0,1)
|
|
ELIF iSize = 1
|
|
iRandomEnemy = GET_RANDOM_INT_IN_RANGE(0,3)
|
|
ELIF iSize = 2
|
|
iRandomEnemy = GET_RANDOM_INT_IN_RANGE(3,5)
|
|
ELSE
|
|
iRandomEnemy = GET_RANDOM_INT_IN_RANGE(3,5)
|
|
ENDIF
|
|
SWITCH iRandomEnemy
|
|
CASE 0
|
|
RETURN TWS_ENEMY_BAT
|
|
CASE 1
|
|
CASE 2
|
|
RETURN TWS_ENEMY_BOULDER
|
|
CASE 3
|
|
RETURN TWS_ENEMY_GRUNT_FIRESPEAR
|
|
CASE 4
|
|
RETURN TWS_ENEMY_GRUNT_FIRESWORD
|
|
CASE 5
|
|
RETURN TWS_ENEMY_GRUNT_CASTER
|
|
ENDSWITCH
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN TWS_ENEMY_GRUNT
|
|
|
|
ENDFUNC
|
|
|
|
PROC TWS_HANDLE_BATTLE_POINTS()
|
|
|
|
IF sTWSData.bLockedScreen
|
|
|
|
IF sTWSData.bExitingLockedScreen
|
|
|
|
IF sPlayerData.vSpritePos.x > sTWSData.fLockedScreenPos
|
|
sTWSData.fLockedScreenPos = sTWSData.fLockedScreenPos +@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER*2
|
|
ELSE
|
|
sTWSData.fLockedScreenPos = sTWSData.fLockedScreenPos -@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER*2
|
|
ENDIF
|
|
|
|
IF sPlayerData.vSpritePos.x > sTWSData.fLockedScreenPos -@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER*2
|
|
AND sPlayerData.vSpritePos.x < sTWSData.fLockedScreenPos +@ cfTWS_HORIZONTAL_MOVEMENT_PLAYER*2
|
|
|
|
sTWSData.bExitingLockedScreen = FALSE
|
|
sTWSData.bLockedScreen = FALSE
|
|
sTWSData.iNumberOfEnemiesKilledInBattle = 0
|
|
sTWSData.iNumberOfEnemiesSpawnedInBattle = 0
|
|
ENDIF
|
|
|
|
ELIF sTWSData.iNumberOfEnemiesKilledInBattle >= sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].iEnemies
|
|
|
|
sTWSData.bExitingLockedScreen = TRUE
|
|
sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].bActive = FALSE
|
|
|
|
ELIF sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].bSpawnEnemies
|
|
AND NOT TWS_IS_ANY_ENEMY_ON_SCREEN(TRUE)
|
|
AND GET_GAME_TIMER() - sTWSData.iGameTimer > ciTWS_BATTLE_SECURITY_TIME_LIMIT
|
|
|
|
CPRINTLN(DEBUG_MINIGAME, "TWS - LOCKED BATTLE - WARNING! Something wrong happened in battle. Current battle: ", sTWSData.iNumberOfEnemiesSpawnedInBattle, " enemies spawned. ", sTWSData.iNumberOfEnemiesKilledInBattle, " enemies killed. ",sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].iEnemies, " is the objective.")
|
|
CPRINTLN(DEBUG_MINIGAME, "TWS - LOCKED BATTLE - Unlocking battle!")
|
|
sTWSData.iNumberOfEnemiesSpawnedInBattle = sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].iEnemies
|
|
sTWSData.iNumberOfEnemiesKilledInBattle = sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].iEnemies
|
|
|
|
ELIF sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].bSpawnEnemies AND GET_GAME_TIMER() - sTWSData.iBattleTimer > sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].iSpawnTime AND sTWSData.iNumberOfEnemiesSpawnedInBattle < sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].iEnemies
|
|
|
|
CPRINTLN(DEBUG_MINIGAME, "TWS - LOCKED BATTLE - Current battle: ", sTWSData.iNumberOfEnemiesSpawnedInBattle, " enemies spawned. ", sTWSData.iNumberOfEnemiesKilledInBattle, " enemies killed. ",sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].iEnemies, " is the objective. Spawning one of size ", sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].iEnemySize)
|
|
|
|
TWS_ENEMY_TYPE enemyType
|
|
FLOAT spawnY
|
|
|
|
IF sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].iEnemySize = 0
|
|
|
|
enemyType = TWS_GET_RANDOM_BATTLE_ENEMY(sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].iEnemySize)
|
|
spawnY = GET_RANDOM_FLOAT_IN_RANGE(550.0,850.0)
|
|
|
|
IF enemyType = TWS_ENEMY_FAIRY
|
|
OR enemyType = TWS_ENEMY_SLIME
|
|
OR enemyType = TWS_ENEMY_BAT
|
|
spawnY = -50
|
|
ENDIF
|
|
|
|
IF TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sTWSData.fLockedScreenPos + GET_RANDOM_FLOAT_IN_RANGE(-600, 600), spawnY), enemyType, TRUE)
|
|
sTWSData.iNumberOfEnemiesSpawnedInBattle++
|
|
sTWSData.iBattleTimer = GET_GAME_TIMER()
|
|
CPRINTLN(DEBUG_MINIGAME, "TWS - LOCKED BATTLE - Spawned a ", TWS_ENEMY_TYPE_TO_STRING(enemyType), "(",sTWSData.iNumberOfEnemiesSpawnedInBattle,"/",sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].iEnemies,").")
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
CPRINTLN(DEBUG_MINIGAME, "TWS - LOCKED BATTLE - Size: ",sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].iEnemySize)
|
|
|
|
int iSide = 1
|
|
IF sTWSData.iNumberOfEnemiesSpawnedInBattle % 2 = 0
|
|
iSide = -1
|
|
ENDIF
|
|
|
|
enemyType = TWS_GET_RANDOM_BATTLE_ENEMY(sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].iEnemySize)
|
|
CPRINTLN(DEBUG_MINIGAME, "TWS - LOCKED BATTLE - Random enemy is a ", TWS_ENEMY_TYPE_TO_STRING(enemyType))
|
|
|
|
IF sTWSData.eCurrentLevel = TWS_CAVES
|
|
spawnY = cfBASE_SCREEN_HEIGHT*0.55
|
|
ELSE
|
|
spawnY = GET_RANDOM_FLOAT_IN_RANGE(550.0,850.0)
|
|
ENDIF
|
|
|
|
SWITCH enemyType
|
|
|
|
CASE TWS_ENEMY_FAIRY
|
|
CASE TWS_ENEMY_SLIME
|
|
CASE TWS_ENEMY_BAT
|
|
|
|
spawnY = -50
|
|
|
|
IF TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sTWSData.fLockedScreenPos + GET_RANDOM_FLOAT_IN_RANGE(-600, 600), spawnY), enemyType, TRUE)
|
|
sTWSData.iNumberOfEnemiesSpawnedInBattle++
|
|
sTWSData.iBattleTimer = GET_GAME_TIMER()
|
|
CPRINTLN(DEBUG_MINIGAME, "TWS - LOCKED BATTLE - Spawned a ", TWS_ENEMY_TYPE_TO_STRING(enemyType), "(",sTWSData.iNumberOfEnemiesSpawnedInBattle,"/",sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].iEnemies,").")
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_BRUTE
|
|
CASE TWS_ENEMY_BRUTE_AXE
|
|
IF sPlayerData.bIsJumping
|
|
spawnY = sPlayerData.vInitialJumpPos.y - 30.0
|
|
ELSE
|
|
spawnY = sPlayerData.vSpritePos.y - 30.0
|
|
ENDIF
|
|
|
|
IF TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sTWSData.fLockedScreenPos + cfGAME_SCREEN_WIDTH*0.6*iSide, spawnY), enemyType, TRUE)
|
|
sTWSData.iNumberOfEnemiesSpawnedInBattle++
|
|
sTWSData.iBattleTimer = GET_GAME_TIMER()
|
|
CPRINTLN(DEBUG_MINIGAME, "TWS - LOCKED BATTLE - Spawned a ", TWS_ENEMY_TYPE_TO_STRING(enemyType), "(",sTWSData.iNumberOfEnemiesSpawnedInBattle,"/",sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].iEnemies,").")
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_GRUNT
|
|
CASE TWS_ENEMY_GRUNT_CROSSBOW
|
|
CASE TWS_ENEMY_GRUNT_FIRESPEAR
|
|
CASE TWS_ENEMY_GRUNT_SPEAR
|
|
CASE TWS_ENEMY_GRUNT_FIRESWORD
|
|
CASE TWS_ENEMY_GRUNT_SWORD
|
|
IF sPlayerData.bIsJumping
|
|
spawnY = sPlayerData.vInitialJumpPos.y - 30.0
|
|
ELSE
|
|
spawnY = sPlayerData.vSpritePos.y - 30.0
|
|
ENDIF
|
|
|
|
IF TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sTWSData.fLockedScreenPos + cfGAME_SCREEN_WIDTH*0.6*iSide, spawnY), enemyType, TRUE)
|
|
sTWSData.iNumberOfEnemiesSpawnedInBattle++
|
|
sTWSData.iBattleTimer = GET_GAME_TIMER()
|
|
CPRINTLN(DEBUG_MINIGAME, "TWS - LOCKED BATTLE - Spawned a ", TWS_ENEMY_TYPE_TO_STRING(enemyType), "(",sTWSData.iNumberOfEnemiesSpawnedInBattle,"/",sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].iEnemies,").")
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_ENEMY_BOULDER
|
|
iSide = 1
|
|
|
|
IF TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sTWSData.fLockedScreenPos + cfGAME_SCREEN_WIDTH*0.6*iSide, spawnY), enemyType, TRUE)
|
|
sTWSData.iNumberOfEnemiesSpawnedInBattle++
|
|
sTWSData.iBattleTimer = GET_GAME_TIMER()
|
|
CPRINTLN(DEBUG_MINIGAME, "TWS - LOCKED BATTLE - Spawned a ", TWS_ENEMY_TYPE_TO_STRING(enemyType), "(",sTWSData.iNumberOfEnemiesSpawnedInBattle,"/",sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].iEnemies,").")
|
|
ENDIF
|
|
|
|
BREAK
|
|
DEFAULT
|
|
|
|
IF TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sTWSData.fLockedScreenPos + cfGAME_SCREEN_WIDTH*0.6*iSide, spawnY), enemyType, TRUE)
|
|
sTWSData.iNumberOfEnemiesSpawnedInBattle++
|
|
sTWSData.iBattleTimer = GET_GAME_TIMER()
|
|
CPRINTLN(DEBUG_MINIGAME, "TWS - LOCKED BATTLE - Spawned a ", TWS_ENEMY_TYPE_TO_STRING(enemyType), "(",sTWSData.iNumberOfEnemiesSpawnedInBattle,"/",sTWSData.sLockedBattles[sTWSData.iCurrentLockedBattle].iEnemies,").")
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
// Check if player arrived to one of the battle points to lock screen
|
|
INT i
|
|
FOR i = 0 TO ciTWS_MAX_LOCKED_BATTLES-1
|
|
|
|
IF sTWSData.sLockedBattles[i].bActive AND sTWSData.sLockedBattles[i].iTile != -1 AND sPlayerData.vSpritePos.x > sBackgroundTilesData[sTWSData.sLockedBattles[i].iTile].fSpritePos
|
|
|
|
CPRINTLN(DEBUG_MINIGAME, "TWS - LOCKED BATTLE - Init Battle. ID: ",i, " Number of enemies to spawn: ", sTWSData.sLockedBattles[i].iEnemies)
|
|
sTWSData.bLockedScreen = TRUE
|
|
sTWSData.bExitingLockedScreen = FALSE
|
|
|
|
sTWSData.iCurrentLockedBattle = i
|
|
sTWSData.iNumberOfEnemiesKilledInBattle = 0
|
|
sTWSData.iNumberOfEnemiesSpawnedInBattle = 0
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
|
|
sTWSData.fLockedScreenPos = sPlayerData.vSpritePos.x
|
|
|
|
BREAKLOOP
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_INIT_HELP_TEXT_VARIABLES()
|
|
|
|
sTWSData.iHelpTextTimer = GET_GAME_TIMER()
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_HANDLE_HELP_TEXTS()
|
|
|
|
IF sTWSData.eCurrentLevel = TWS_FOREST
|
|
|
|
IF NOT sTWSData.bShowedTextHelp[TWS_TH_MOVE]
|
|
IF GET_GAME_TIMER() - sTWSData.iHelpTextTimer > 4000
|
|
ARCADE_GAMES_HELP_TEXT_PRINT(ARCADE_GAMES_HELP_TEXT_ENUM_TWR_HELP_MOVE)
|
|
sTWSData.bShowedTextHelp[TWS_TH_MOVE] = TRUE
|
|
CPRINTLN(DEBUG_MINIGAME, "TWR - Help Text TWS_TH_MOVE activated")
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT sTWSData.bShowedTextHelp[TWS_TH_ATTACK]
|
|
IF TWS_IS_ANY_ENEMY_ON_SCREEN() AND sTWSData.bShowedTextHelp[TWS_TH_MOVE]
|
|
ARCADE_GAMES_HELP_TEXT_PRINT(ARCADE_GAMES_HELP_TEXT_ENUM_TWR_HELP_ATTACK)
|
|
sTWSData.bShowedTextHelp[TWS_TH_ATTACK] = TRUE
|
|
CPRINTLN(DEBUG_MINIGAME, "TWR - Help Text TWS_TH_ATTACK activated")
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT sTWSData.bShowedTextHelp[TWS_TH_JUMP]
|
|
IF TWS_IS_ENEMY_OF_TYPE_ON_SCREEN(TWS_ENEMY_LEPRECHAUN) AND sTWSData.bShowedTextHelp[TWS_TH_ATTACK]
|
|
ARCADE_GAMES_HELP_TEXT_PRINT(ARCADE_GAMES_HELP_TEXT_ENUM_TWR_HELP_JUMP)
|
|
sTWSData.bShowedTextHelp[TWS_TH_JUMP] = TRUE
|
|
CPRINTLN(DEBUG_MINIGAME, "TWR - Help Text TWS_TH_JUMP activated")
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT sTWSData.bShowedTextHelp[TWS_TH_DASH]
|
|
IF sPlayerData.fMagic > 0.25 AND sTWSData.bShowedTextHelp[TWS_TH_JUMP]
|
|
ARCADE_GAMES_HELP_TEXT_PRINT(ARCADE_GAMES_HELP_TEXT_ENUM_TWR_HELP_DASH)
|
|
sTWSData.bShowedTextHelp[TWS_TH_DASH] = TRUE
|
|
CPRINTLN(DEBUG_MINIGAME, "TWR - Help Text MoTWS_TH_DASHve activated")
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT sTWSData.bShowedTextHelp[TWS_TH_JUMP_ATTACK]
|
|
IF TWS_IS_ENEMY_OF_TYPE_ON_SCREEN(TWS_ENEMY_FAIRY) AND sTWSData.bShowedTextHelp[TWS_TH_DASH]
|
|
ARCADE_GAMES_HELP_TEXT_PRINT(ARCADE_GAMES_HELP_TEXT_ENUM_TWR_HELP_JUMP_ATTACK)
|
|
sTWSData.bShowedTextHelp[TWS_TH_JUMP_ATTACK] = TRUE
|
|
CPRINTLN(DEBUG_MINIGAME, "TWR - Help Text TWS_TH_JUMP_ATTACK activated")
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT sTWSData.bShowedTextHelp[TWS_TH_MAGIC]
|
|
IF TWS_IS_ANY_ENEMY_ON_SCREEN() AND sPlayerData.fMagic > 0.50 AND sTWSData.bShowedTextHelp[TWS_TH_JUMP_ATTACK]
|
|
ARCADE_GAMES_HELP_TEXT_PRINT(ARCADE_GAMES_HELP_TEXT_ENUM_TWR_HELP_MAGIC)
|
|
sTWSData.bShowedTextHelp[TWS_TH_MAGIC] = TRUE
|
|
CPRINTLN(DEBUG_MINIGAME, "TWR - Help Text TWS_TH_MAGIC activated")
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT sTWSData.bShowedTextHelp[TWS_TH_EVOLUTION]
|
|
IF sPlayerData.fMagic >= 1.0 AND sTWSData.bShowedTextHelp[TWS_TH_MAGIC]
|
|
ARCADE_GAMES_HELP_TEXT_PRINT(ARCADE_GAMES_HELP_TEXT_ENUM_TWR_HELP_EVOLUTION, 10000)
|
|
sTWSData.bShowedTextHelp[TWS_TH_EVOLUTION] = TRUE
|
|
CPRINTLN(DEBUG_MINIGAME, "TWR - Help Text TWS_TH_EVOLUTION activated")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_HANDLE_AWARDS()
|
|
|
|
TWS_SET_CHALLENGE_VALUE(TWS_CHALLENGE_BIT_PLATINUM_SWORD_PLATINUM, sPlayerData.iScore)
|
|
TWS_SET_CHALLENGE_VALUE(TWS_CHALLENGE_BIT_COIN_PURSE_PLATINUM, sPlayerData.iTreasures)
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL TWS_HANDLE_LEVEL_UPDATE()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
IF sTWSData.bShouldReloadLevel
|
|
|
|
ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_AMBIENCE_LOOP_FOREST)
|
|
ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_AMBIENCE_LOOP_SWAMP)
|
|
ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_AMBIENCE_LOOP_CAVES)
|
|
ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_AMBIENCE_LOOP_CASTLE)
|
|
|
|
sTWSData.eCurrentLevel = INT_TO_ENUM(TWS_LEVEL, sTWSData.iReloadLevel)
|
|
sTWSData.bShouldReloadLevel = FALSE
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
#ENDIF
|
|
|
|
SWITCH sTWSData.eLevelStage
|
|
|
|
CASE TWS_LEVEL_PLAYING
|
|
|
|
TWS_HANDLE_HELP_TEXTS()
|
|
|
|
IF TWS_IS_NPC_CUTSCENE_LEVEL() AND sPlayerData.ePlayerState != TWS_INTRO
|
|
|
|
sHUDData[TWS_HUD_END].bActive = FALSE
|
|
|
|
SWITCH sTWSData.eCurrentLevel
|
|
CASE TWS_FOREST_INTRO
|
|
TWS_START_DIALOGUE(0, 3)
|
|
BREAK
|
|
ENDSWITCH
|
|
sTWSData.eLevelStage = TWS_LEVEL_FINAL_DIALOGUE
|
|
|
|
ELIF sPlayerData.vSpritePos.x > sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos
|
|
|
|
PREPARE_MUSIC_EVENT("ARCADE_WR_STAGE_END")
|
|
TRIGGER_MUSIC_EVENT("ARCADE_WR_BOSS_START")
|
|
|
|
IF sTWSData.eCurrentLevel = TWS_CASTLE AND NOT sTWSData.bIsHardCoreMode
|
|
|
|
TRIGGER_MUSIC_EVENT("ARCADE_WR_WIZARD_FIGHT_START")
|
|
sTWSData.eLevelStage = TWS_LEVEL_DIALOGUE_PRE_FIGHT
|
|
sTWSData.eGrogEncounterState = TWS_LOCK_SCREEN
|
|
|
|
ELIF sTWSData.eCurrentLevel = TWS_CASTLE AND sTWSData.bIsHardCoreMode
|
|
|
|
TRIGGER_MUSIC_EVENT("ARCADE_WR_WIZARD_FIGHT_START")
|
|
sTWSData.eLevelStage = TWS_LEVEL_BOSS_FIGHT
|
|
|
|
ELIF sTWSData.eCurrentLevel != TWS_CASTLE
|
|
|
|
sTWSData.eLevelStage = TWS_LEVEL_BOSS_FIGHT
|
|
|
|
ENDIF
|
|
|
|
TWS_KILL_ALL_ENEMIES()
|
|
|
|
ELSE
|
|
TWS_HANDLE_BATTLE_POINTS()
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_LEVEL_DIALOGUE_PRE_FIGHT
|
|
|
|
SWITCH sTWSData.eGrogEncounterState
|
|
|
|
CASE TWS_LOCK_SCREEN
|
|
|
|
sTWSData.bLockedScreen = TRUE
|
|
sTWSData.fLockedScreenPos = sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos
|
|
|
|
TWS_TASK_PLAYER_TO_MOVE_LEFT()
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos, -50), TWS_FX_GROG_BUBBLE, 600)
|
|
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
sTWSData.eGrogEncounterState = TWS_GROG_DESCENDS
|
|
|
|
BREAK
|
|
|
|
CASE TWS_GROG_DESCENDS
|
|
|
|
IF NOT sPlayerData.bIsMovingLeft AND GET_GAME_TIMER() - sTWSData.iGameTimer > 1000
|
|
TWS_START_DIALOGUE(21,21)
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
sTWSData.eGrogEncounterState = TWS_THOG_DIALOGUE_1
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_THOG_DIALOGUE_1
|
|
|
|
IF HAS_CURRENT_DIALOGUE_ENDED() AND GET_GAME_TIMER() - sTWSData.iGameTimer > 1000
|
|
TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sTWSData.fLockedScreenPos + 500, - 500), TWS_ENEMY_DIALOGUE_WIZARD)
|
|
TWS_START_DIALOGUE(17,18)
|
|
sTWSData.eGrogEncounterState = TWS_GROG_LEAVES
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_GROG_LEAVES
|
|
|
|
IF HAS_CURRENT_DIALOGUE_ENDED()
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
sTWSData.eGrogEncounterState = TWS_FIGHT_START
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_FIGHT_START
|
|
|
|
IF NOT TWS_IS_ANY_ENEMY_ON_SCREEN() AND GET_GAME_TIMER() - sTWSData.iGameTimer > 1000
|
|
|
|
sTWSData.eLevelStage = TWS_LEVEL_BOSS_FIGHT
|
|
sTWSData.bLockedScreen = FALSE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
CASE TWS_LEVEL_BOSS_FIGHT
|
|
|
|
IF sEnemyData[sTWSData.iBossEnemyIndex].fHealth <= 0.0 AND sEnemyData[sTWSData.iBossEnemyIndex].eEnemyState = TWS_ENEMY_DEAD
|
|
|
|
TWS_KILL_ALL_ENEMIES()
|
|
|
|
TWS_HANDLE_AWARDS()
|
|
|
|
TWS_TASK_PLAYER_TO_MOVE_TO_CENTER()
|
|
sTWSData.eLevelStage = TWS_LEVEL_LEADERBOARD
|
|
|
|
sTWSData.iHealthPoints = ROUND(sPlayerData.fHealth*10)*1000
|
|
sTWSData.iLivesPoints = sPlayerData.iLifes*1000
|
|
sTWSData.iBattleTimer = sPlayerData.iScore + (ROUND(sPlayerData.fHealth*10)*1000 +(sPlayerData.iLifes*1000))
|
|
|
|
sHUDData[TWS_HUD_END].bActive = TRUE
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_STAGE_START_SHING)
|
|
TRIGGER_MUSIC_EVENT("ARCADE_WR_STAGE_END")
|
|
|
|
DEGENATRON_GAMES_ANIMATION_SET_STATE(DEGENATRON_GAMES_ANIMATION_STATE_WIN)
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_LEVEL_LEADERBOARD
|
|
|
|
IF sTWSData.iHealthPoints > 0
|
|
OR sTWSData.iLivesPoints > 0
|
|
|
|
IF sTWSData.iHealthPoints >= 50
|
|
sTWSData.iHealthPoints -= 50
|
|
sPlayerData.iScore += 50
|
|
|
|
ELIF sTWSData.iHealthPoints > 0
|
|
sTWSData.iHealthPoints --
|
|
sPlayerData.iScore ++
|
|
|
|
ELIF sTWSData.iLivesPoints >= 50
|
|
sTWSData.iLivesPoints -= 50
|
|
sPlayerData.iScore += 50
|
|
|
|
ELIF sTWSData.iLivesPoints > 0
|
|
sTWSData.iLivesPoints --
|
|
sPlayerData.iScore ++
|
|
ENDIF
|
|
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_SCORE_COUNT)
|
|
|
|
IF TWS_IS_ANY_ACCEPT_BUTTON_PRESSED()
|
|
|
|
IF sTWSData.iHealthPoints > 0
|
|
sPlayerData.iScore += sTWSData.iHealthPoints
|
|
sTWSData.iHealthPoints = 0
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_SCORE_COMPLETE)
|
|
|
|
ELSE
|
|
sTWSData.iHealthPoints = 0
|
|
sTWSData.iLivesPoints = 0
|
|
sPlayerData.iScore = sTWSData.iBattleTimer
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_TWR_SCORE_COMPLETE)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF sPlayerData.iScore > sPlayerData.iHighestScore
|
|
sPlayerData.iHighestScore = sPlayerData.iScore
|
|
ENDIF
|
|
|
|
ELIF TWS_IS_ANY_ACCEPT_BUTTON_PRESSED() AND GET_GAME_TIMER() - sTWSData.iGameTimer > 1000
|
|
|
|
sHUDData[TWS_HUD_END].bActive = FALSE
|
|
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
|
|
TWS_FADE_IN()
|
|
|
|
IF NOT sTWSData.bIsHardCoreMode
|
|
SWITCH sTWSData.eCurrentLevel
|
|
CASE TWS_FOREST
|
|
TWS_START_DIALOGUE(4, 7)
|
|
BREAK
|
|
CASE TWS_SWAMP
|
|
TWS_START_DIALOGUE(8, 12)
|
|
BREAK
|
|
CASE TWS_CAVES
|
|
TWS_START_DIALOGUE(13, 16)
|
|
BREAK
|
|
CASE TWS_CASTLE
|
|
TWS_START_DIALOGUE(19, 20)
|
|
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_ARCADE_GROG_MODE_DEACTIVATED, TRUE)
|
|
BREAK
|
|
ENDSWITCH
|
|
sTWSData.eLevelStage = TWS_LEVEL_FINAL_DIALOGUE
|
|
|
|
ELSE
|
|
sTWSData.eLevelStage = TWS_LEVEL_FADING
|
|
TWS_FADE_OUT()
|
|
TWS_TASK_PLAYER_TO_MOVE_OUT_OFF_SCREEN()
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_LEVEL_FINAL_DIALOGUE
|
|
|
|
IF HAS_CURRENT_DIALOGUE_ENDED()
|
|
|
|
IF sTWSData.eCurrentLevel >= TWS_CASTLE
|
|
sTWSData.eGrogEncounterState = TWS_LOCK_SCREEN
|
|
sTWSData.eLevelStage = TWS_LEVEL_DIALOGUE_POST_FIGHT
|
|
|
|
ELSE
|
|
|
|
sTWSData.eLevelStage = TWS_LEVEL_FADING
|
|
TWS_FADE_OUT()
|
|
TWS_TASK_PLAYER_TO_MOVE_OUT_OFF_SCREEN()
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_LEVEL_DIALOGUE_POST_FIGHT
|
|
|
|
SWITCH sTWSData.eGrogEncounterState
|
|
|
|
CASE TWS_LOCK_SCREEN
|
|
|
|
TWS_TASK_PLAYER_TO_MOVE_LEFT()
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos, -50), TWS_FX_GROG_BUBBLE, 600)
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
sTWSData.eGrogEncounterState = TWS_GROG_DESCENDS
|
|
|
|
BREAK
|
|
|
|
CASE TWS_GROG_DESCENDS
|
|
|
|
IF NOT sPlayerData.bIsMovingLeft AND GET_GAME_TIMER() - sTWSData.iGameTimer > 1000
|
|
TWS_START_DIALOGUE(21,21)
|
|
sTWSData.iGameTimer = GET_GAME_TIMER()
|
|
sTWSData.eGrogEncounterState = TWS_THOG_DIALOGUE_1
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_THOG_DIALOGUE_1
|
|
|
|
IF HAS_CURRENT_DIALOGUE_ENDED() AND GET_GAME_TIMER() - sTWSData.iGameTimer > 2000
|
|
|
|
TWS_FADE_OUT()
|
|
sTWSData.eLevelStage = TWS_LEVEL_FADING
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
|
|
CASE TWS_LEVEL_DEAD
|
|
|
|
IF GET_GAME_TIMER() - sTWSData.iGameTimer > 3000
|
|
|
|
TWS_FADE_OUT()
|
|
|
|
sHUDData[TWS_HUD_GAMEOVER].bActive = FALSE
|
|
sTWSData.eLevelStage = TWS_LEVEL_FADING
|
|
|
|
TRIGGER_MUSIC_EVENT("ARCADE_WR_STOP")
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TWS_LEVEL_FADING
|
|
|
|
IF TWS_IS_SCREEN_FADED_OUT()
|
|
sTWSData.eLevelStage = TWS_LEVEL_COMPLETE
|
|
TWS_STOP_ALL_SOUND_LOOPS()
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TWS_LEVEL_COMPLETE
|
|
|
|
IF GET_GAME_TIMER() - sTWSData.iGameTimer > 1000
|
|
|
|
sTWSData.eCurrentLevel = INT_TO_ENUM(TWS_LEVEL, (ENUM_TO_INT(sTWSData.eCurrentLevel) + 1) % ENUM_TO_INT(TWS_MAX_LEVELS))
|
|
|
|
IF sTWSData.eCurrentLevel > TWS_CASTLE_OUTRO
|
|
sTWSData.eCurrentLevel = TWS_CASTLE_OUTRO
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
PROC TWS_PROCESS_CLIENT_STATE_INIT()
|
|
|
|
// Global flag indicating the player is engaged in arcade game
|
|
g_bIsPlayerPlayingWizardsRuin = TRUE
|
|
|
|
ARCADE_CABINET_COMMON_INITIALIZATION()
|
|
|
|
ARCADE_GAMES_POSTFX_INIT(CASINO_ARCADE_GAME_THE_WIZARDS_RUIN)
|
|
ARCADE_GAMES_SOUND_INIT(CASINO_ARCADE_GAME_THE_WIZARDS_RUIN)
|
|
|
|
TWS_INIT_COLOUR_STRUCTS()
|
|
|
|
TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_REQUESTING_ASSETS)
|
|
ENDPROC
|
|
|
|
PROC TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS()
|
|
|
|
IF NOT ARCADE_GAMES_POSTFX_REQUESTING_ASSETS()
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT ARCADE_GAMES_SOUND_REQUESTING_AUDIO_BANK("DLC_HEIST3/H3_ArcMac_Wiz_01")
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT ARCADE_GAMES_SOUND_REQUESTING_AUDIO_BANK("DLC_HEIST3/H3_ArcMac_Wiz_02")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPWizardsSleeveBackgrounds12")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPWizardsSleeveBackgrounds12")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPWizardsSleeveBackgrounds12")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPWizardsSleeveBackgrounds34")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPWizardsSleeveBackgrounds34")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPWizardsSleeveBackgrounds34")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPWizardsSleeveCharacters")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPWizardsSleeveCharacters")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPWizardsSleeveCharacters")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPWizardsSleeveEnemies1a")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPWizardsSleeveEnemies1a")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPWizardsSleeveEnemies1a")
|
|
EXIT
|
|
ENDIF
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPWizardsSleeveEnemies1b")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPWizardsSleeveEnemies1b")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPWizardsSleeveEnemies1b")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPWizardsSleeveEnemies2")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPWizardsSleeveEnemies2")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPWizardsSleeveEnemies2")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPWizardsSleeveEnemies3a")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPWizardsSleeveEnemies3a")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPWizardsSleeveEnemies3a")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPWizardsSleeveEnemies3b")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPWizardsSleeveEnemies3b")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPWizardsSleeveEnemies3b")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPWizardsSleeveEnemies4a")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPWizardsSleeveEnemies4a")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPWizardsSleeveEnemies4a")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPWizardsSleeveEnemies4b")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPWizardsSleeveEnemies4b")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPWizardsSleeveEnemies4b")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPWizardsSleeveFacade")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPWizardsSleeveFacade")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPWizardsSleeveFacade")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPWizardsSleeveGrog")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPWizardsSleeveGrog")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPWizardsSleeveGrog")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPWizardsSleeveHUDAndScreen")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPWizardsSleeveHUDAndScreen")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPWizardsSleeveHUDAndScreen")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPWizardsSleeveHUDAndScreen2")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPWizardsSleeveHUDAndScreen2")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPWizardsSleeveHUDAndScreen")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPWizardsSleeveIntro")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPWizardsSleeveIntro")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPWizardsSleeveIntro")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPWizardsSleeveIntroMenu")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPWizardsSleeveIntroMenu")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPWizardsSleeveIntroMenu")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPWizardsSleeveItemsAndFX")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPWizardsSleeveItemsAndFX")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPWizardsSleeveItemsAndFX")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPWizardsSleeveThog12")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPWizardsSleeveThog12")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPWizardsSleeveThog12")
|
|
EXIT
|
|
ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPWizardsSleeveThog3NPC")
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED("MPWizardsSleeveThog3NPC")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPWizardsSleeveThog3NPC")
|
|
EXIT
|
|
ENDIF
|
|
|
|
TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_FIB_WARNING)
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_PROCESS_CLIENT_STATE_FIB_WARNING()
|
|
|
|
TWS_DRAW_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_FIB_WARNING)
|
|
|
|
IF TWS_HANDLE_FIB_WARNING()
|
|
TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_PIXTRO_LOGO)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_PROCESS_CLIENT_STATE_PIXTRO_LOGO()
|
|
|
|
IF TWS_HANDLE_PIXTRO_LOGO()
|
|
TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_INIT_MENU)
|
|
TWS_INIT_TELEMETRY(TRUE)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_PROCESS_CLIENT_STATE_INIT_MENU()
|
|
|
|
TWS_INIT_MENU_VARIABLES()
|
|
|
|
ARCADE_GAMES_AUDIO_SCENE_START(TWR_AUDIO_SCENE_MENU)
|
|
ARCADE_GAMES_AUDIO_SCENE_STOP(TWR_AUDIO_SCENE_GAMEPLAY)
|
|
|
|
TWS_DRAW_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_INIT_MENU)
|
|
TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_TITLE_ANIM)
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_PROCESS_CLIENT_STATE_TITLE_ANIM()
|
|
|
|
TWS_DRAW_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_TITLE_ANIM)
|
|
|
|
IF TWS_HANDLE_TITLE_ANIM()
|
|
TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_TITLE_SCREEN)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_PROCESS_CLIENT_STATE_TITLE_SCREEN()
|
|
|
|
TWS_DRAW_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_TITLE_SCREEN)
|
|
|
|
IF TWS_HANDLE_TITLE_SCREEN()
|
|
|
|
SWITCH sTWSData.eCurrentMenuOption
|
|
CASE TWS_MENU_BEGIN_ADVENTURE
|
|
TWS_INIT_NORMAL_MODE()
|
|
TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_INIT_LEVEL)
|
|
BREAK
|
|
CASE TWS_MENU_LEADERBOARD
|
|
TWS_FADE_IN()
|
|
TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_LEADERBOARD)
|
|
BREAK
|
|
CASE TWS_MENU_GROG_MODE
|
|
TWS_INIT_HARDCORE_MODE()
|
|
TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_INIT_LEVEL)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
// Process INIT LEVEL
|
|
PROC TWS_PROCESS_CLIENT_STATE_INIT_LEVEL()
|
|
|
|
TWS_CLEANUP_VARIABLES()
|
|
|
|
TWS_INIT_PLAYERS()
|
|
|
|
TWS_INIT_FAR_BACKGROUND()
|
|
|
|
TWS_INIT_BACKGROUND()
|
|
|
|
TWS_INIT_FOREGROUND()
|
|
|
|
TWS_INIT_NPCS()
|
|
|
|
TWS_INIT_ENEMIES()
|
|
|
|
TWS_INIT_LOCKED_BATTLES()
|
|
|
|
TWS_INIT_TRAPS()
|
|
|
|
TWS_INIT_ITEMS()
|
|
|
|
TWS_INIT_HUD_ITEMS()
|
|
|
|
TWS_INIT_LEVEL_VARIABLES()
|
|
|
|
TWS_QUICK_SORT_ENTITIES(sTWSData.sDrawCalls, 0, ciTWS_MAX_DRAW_CALLS-1)
|
|
|
|
TWS_DRAW_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_INIT_LEVEL)
|
|
|
|
ARCADE_GAMES_HELP_TEXT_CLEAR()
|
|
|
|
ARCADE_GAMES_AUDIO_SCENE_STOP(TWR_AUDIO_SCENE_MENU)
|
|
ARCADE_GAMES_AUDIO_SCENE_START(TWR_AUDIO_SCENE_GAMEPLAY)
|
|
|
|
IF sTWSData.bIsHardCoreMode
|
|
TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_MAP_SCREEN)
|
|
ELSE
|
|
TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_INTRO_CUTSCENE)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_PROCESS_CLIENT_STATE_INTRO_CUTSCENE()
|
|
|
|
TWS_DRAW_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_INTRO_CUTSCENE)
|
|
|
|
IF TWS_HANDLE_CUTSCENE_UPDATE()
|
|
TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_MAP_SCREEN)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_PROCESS_CLIENT_STATE_OUTRO_CUTSCENE()
|
|
|
|
TWS_DRAW_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_OUTRO_CUTSCENE)
|
|
|
|
IF TWS_HANDLE_CUTSCENE_UPDATE()
|
|
ARCADE_GAMES_AUDIO_SCENE_STOP(TWR_AUDIO_SCENE_GAMEPLAY)
|
|
ARCADE_GAMES_AUDIO_SCENE_START(TWR_AUDIO_SCENE_MENU)
|
|
|
|
TWS_FADE_IN()
|
|
TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_LEADERBOARD)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_PROCESS_CLIENT_STATE_MAP_SCREEN()
|
|
|
|
TWS_DRAW_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_MAP_SCREEN)
|
|
|
|
IF TWS_HANDLE_MAP_SCREEN_UPDATE()
|
|
TWS_INIT_HELP_TEXT_VARIABLES()
|
|
TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_PLAYING)
|
|
DEGENATRON_GAMES_ANIMATION_SET_STATE(DEGENATRON_GAMES_ANIMATION_STATE_PLAYING)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_PROCESS_CLIENT_STATE_LEADERBOARD()
|
|
|
|
ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY(sPlayerData.iScore)
|
|
|
|
TWS_DRAW_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_LEADERBOARD)
|
|
|
|
IF NOT sAGLeaderboardData.bEditing AND TWS_IS_CANCEL_BUTTON_PRESSED()
|
|
TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_INIT_MENU)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_PROCESS_CLIENT_STATE_PLAYING()
|
|
|
|
TWS_HANDLE_PLAYER_MOVEMENT()
|
|
TWS_HANDLE_PLAYER_STATE()
|
|
TWS_HANDLE_ENEMY_STATE()
|
|
TWS_HANDLE_ITEM_STATE()
|
|
TWS_HANDLE_FX()
|
|
TWS_HANDLE_SCREEN_EFFECTS()
|
|
TWS_HANDLE_HUD()
|
|
TWS_HANDLE_DIALOGUE()
|
|
|
|
TWS_RELEASE_FINISHED_SOUNDS()
|
|
TWS_UPDATE_Z_INDEXES()
|
|
TWS_DRAW_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_PLAYING)
|
|
|
|
IF TWS_HANDLE_LEVEL_UPDATE()
|
|
|
|
IF sPlayerData.iLifes <= 0
|
|
sTWSData.eCurrentLevel = TWS_FOREST_INTRO
|
|
|
|
ARCADE_GAMES_AUDIO_SCENE_STOP(TWR_AUDIO_SCENE_GAMEPLAY)
|
|
ARCADE_GAMES_AUDIO_SCENE_START(TWR_AUDIO_SCENE_MENU)
|
|
TRIGGER_MUSIC_EVENT("ARCADE_WR_THEME_START")
|
|
TWS_FADE_IN()
|
|
TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_LEADERBOARD)
|
|
DEGENATRON_GAMES_ANIMATION_SET_STATE(DEGENATRON_GAMES_ANIMATION_STATE_IDLE)
|
|
|
|
TWS_COLLECT_DATA_FOR_TELEMETRY_AFTER_LEVEL(TRUE)
|
|
TWS_SEND_TELEMETRY()
|
|
|
|
ELIF sTWSData.eCurrentLevel = TWS_CASTLE_OUTRO
|
|
|
|
IF sTWSData.bIsHardCoreMode
|
|
TWS_SET_CHALLENGE_VALUE(TWS_CHALLENGE_BIT_FEELIN_GROGGY, 1)
|
|
TWS_FADE_IN()
|
|
|
|
ARCADE_GAMES_AUDIO_SCENE_STOP(TWR_AUDIO_SCENE_GAMEPLAY)
|
|
ARCADE_GAMES_AUDIO_SCENE_START(TWR_AUDIO_SCENE_MENU)
|
|
|
|
TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_LEADERBOARD)
|
|
|
|
ELSE
|
|
sTWSData.bNormalModeIsCompleted = TRUE
|
|
sTWSData.sCutsceneData.bShouldCutscenePlay = TRUE
|
|
TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_OUTRO_CUTSCENE)
|
|
ENDIF
|
|
|
|
TRIGGER_MUSIC_EVENT("ARCADE_WR_THEME_START")
|
|
DEGENATRON_GAMES_ANIMATION_SET_STATE(DEGENATRON_GAMES_ANIMATION_STATE_WIN_BIG)
|
|
|
|
TWS_COLLECT_DATA_FOR_TELEMETRY_AFTER_LEVEL(TRUE)
|
|
TWS_SEND_TELEMETRY()
|
|
|
|
ELSE
|
|
|
|
TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_INIT_LEVEL)
|
|
DEGENATRON_GAMES_ANIMATION_SET_STATE(DEGENATRON_GAMES_ANIMATION_STATE_IDLE)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_CLEANUP_AND_EXIT_CLIENT()
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[Wizards Ruin] [JS] - EXAMPLE_CLEANUP_AND_EXIT_CLIENT - Cleaning up and terminating the script")
|
|
|
|
g_bIsPlayerPlayingWizardsRuin = FALSE
|
|
|
|
ARCADE_GAMES_AUDIO_SCENE_STOP(TWR_AUDIO_SCENE_MENU)
|
|
ARCADE_GAMES_AUDIO_SCENE_STOP(TWR_AUDIO_SCENE_GAMEPLAY)
|
|
|
|
TWS_CLEAN_UP_MOVIE(sTWSData.bmIDPixtroIntro)
|
|
|
|
TRIGGER_MUSIC_EVENT("ARCADE_WR_STOP")
|
|
|
|
ARCADE_GAMES_HELP_TEXT_CLEAR()
|
|
|
|
sDGAnimationData.sArcadeCabinetAnimEvent.bLoopAnim = FALSE
|
|
PLAY_ARCADE_CABINET_ANIMATION(sDGAnimationData.sArcadeCabinetAnimEvent, ARCADE_CABINET_ANIM_CLIP_EXIT)
|
|
|
|
ARCADE_CABINET_COMMON_CLEANUP()
|
|
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPWizardsSleeveGrog")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPWizardsSleeveEnemies1a")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPWizardsSleeveEnemies1b")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPWizardsSleeveEnemies2")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPWizardsSleeveEnemies3a")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPWizardsSleeveEnemies3b")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPWizardsSleeveEnemies4a")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPWizardsSleeveEnemies4b")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPWizardsSleeveBackgrounds12")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPWizardsSleeveBackgrounds34")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPWizardsSleeveCharacters")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPWizardsSleeveHUDAndScreen")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPWizardsSleeveHUDAndScreen2")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPWizardsSleeveItemsAndFX")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPWizardsSleeveIntro")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPWizardsSleeveIntroMenu")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPWizardsSleeveFacade")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPWizardsSleeveThog12")
|
|
SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED("MPWizardsSleeveThog3NPC")
|
|
|
|
ARCADE_GAMES_SOUND_RELEASE_AUDIO_BANK("DLC_HEIST3/H3_ArcMac_Wiz_01")
|
|
ARCADE_GAMES_SOUND_RELEASE_AUDIO_BANK("DLC_HEIST3/H3_ArcMac_Wiz_02")
|
|
|
|
TERMINATE_THIS_MULTIPLAYER_THREAD_NO_ARGS()
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_PROCESS_CLIENT_STATE_MACHINE()
|
|
|
|
SWITCH sTWSData.eClientState
|
|
|
|
CASE TWS_ARCADE_CLIENT_STATE_INIT
|
|
|
|
TWS_PROCESS_CLIENT_STATE_INIT()
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ARCADE_CLIENT_STATE_REQUESTING_ASSETS
|
|
|
|
TWS_PROCESS_CLIENT_STATE_REQUESTING_ASSETS()
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ARCADE_CLIENT_STATE_FIB_WARNING
|
|
|
|
TWS_PROCESS_CLIENT_STATE_FIB_WARNING()
|
|
BREAK
|
|
|
|
CASE TWS_ARCADE_CLIENT_STATE_PIXTRO_LOGO
|
|
|
|
TWS_PROCESS_CLIENT_STATE_PIXTRO_LOGO()
|
|
BREAK
|
|
|
|
CASE TWS_ARCADE_CLIENT_STATE_INIT_MENU
|
|
|
|
TWS_PROCESS_CLIENT_STATE_INIT_MENU()
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ARCADE_CLIENT_STATE_TITLE_ANIM
|
|
|
|
TWS_PROCESS_CLIENT_STATE_TITLE_ANIM()
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ARCADE_CLIENT_STATE_TITLE_SCREEN
|
|
|
|
TWS_PROCESS_CLIENT_STATE_TITLE_SCREEN()
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ARCADE_CLIENT_STATE_INIT_LEVEL
|
|
|
|
TWS_PROCESS_CLIENT_STATE_INIT_LEVEL()
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ARCADE_CLIENT_STATE_INTRO_CUTSCENE
|
|
|
|
TWS_PROCESS_CLIENT_STATE_INTRO_CUTSCENE()
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ARCADE_CLIENT_STATE_MAP_SCREEN
|
|
|
|
TWS_PROCESS_CLIENT_STATE_MAP_SCREEN()
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ARCADE_CLIENT_STATE_PLAYING
|
|
|
|
TWS_PROCESS_CLIENT_STATE_PLAYING()
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ARCADE_CLIENT_STATE_OUTRO_CUTSCENE
|
|
|
|
TWS_PROCESS_CLIENT_STATE_OUTRO_CUTSCENE()
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ARCADE_CLIENT_STATE_LEADERBOARD
|
|
|
|
TWS_PROCESS_CLIENT_STATE_LEADERBOARD()
|
|
|
|
BREAK
|
|
|
|
CASE TWS_ARCADE_CLIENT_STATE_CLEANUP
|
|
|
|
TWS_CLEANUP_AND_EXIT_CLIENT()
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
PROC TWS_DEBUG_SET_PARENT_WIDGET_GROUP(WIDGET_GROUP_ID parentWidgetGroup)
|
|
|
|
sTWSData.widgetGroup = parentWidgetGroup
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_DEBUG_CREATE_WIDGETS()
|
|
|
|
IF sTWSData.bDebugCreatedWidgets
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF sTWSData.widgetGroup = NULL
|
|
EXIT
|
|
ENDIF
|
|
|
|
SET_CURRENT_WIDGET_GROUP(sTWSData.widgetGroup)
|
|
START_WIDGET_GROUP("TWS Arcade Widgets")
|
|
ADD_WIDGET_INT_READ_ONLY("iRectsDrawnThisFrame", iRectsDrawnThisFrame)
|
|
ADD_WIDGET_INT_READ_ONLY("iSpritesDrawnThisFrame", iSpritesDrawnThisFrame)
|
|
ADD_WIDGET_INT_READ_ONLY("iDebugLinesDrawnThisFrame", iDebugLinesDrawnThisFrame)
|
|
ADD_WIDGET_BOOL("Invincible player", sPlayerData.bIsInvincible)
|
|
ADD_WIDGET_BOOL("Infinite magic", sTWSData.bInfiniteMagic)
|
|
ADD_WIDGET_FLOAT_SLIDER("Magic Points", sPlayerData.fMagic, 0.0, 1.0, 0.05)
|
|
ADD_WIDGET_FLOAT_SLIDER("Health Points", sPlayerData.fHealth, 0.0, 1.0, 0.1)
|
|
ADD_WIDGET_INT_SLIDER("Player Lifes", sPlayerData.iLifes, 1, 10, 1)
|
|
ADD_WIDGET_INT_SLIDER("Player Level", sPlayerData.iLevel, 1, 8, 1)
|
|
ADD_WIDGET_INT_SLIDER("Player Score", sPlayerData.iScore, 0, 999999, 10)
|
|
ADD_WIDGET_INT_SLIDER("Player Treasures", sPlayerData.iTreasures, 0, 999999, 10)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Player Pos X", sPlayerData.vSpritePos.x)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Player Pos Y", sPlayerData.vSpritePos.Y)
|
|
ADD_WIDGET_FLOAT_SLIDER("Set Player Pos X", sPlayerData.vSpritePos.x, 0.0, 20000.0, 100.0)
|
|
ADD_WIDGET_INT_SLIDER("Current Enemies Killed in Locked Screen", sTWSData.iNumberOfEnemiesKilledInBattle, 0, 99, 1)
|
|
ADD_WIDGET_INT_SLIDER("Current Enemies Spawned in Locked Screen", sTWSData.iNumberOfEnemiesSpawnedInBattle, 0, 99, 1)
|
|
ADD_WIDGET_INT_SLIDER("Debug Go to Stage", sTWSData.iReloadLevel, 0, 4, 1)
|
|
ADD_WIDGET_BOOL("Reload selected stage",sTWSData.bShouldReloadLevel)
|
|
ADD_WIDGET_BOOL("Unlock Grog Mode",sTWSData.bNormalModeIsCompleted)
|
|
ADD_WIDGET_BOOL("Is Grog Mode",sTWSData.bIsHardCoreMode)
|
|
ADD_WIDGET_BOOL("Clear challenges",sTWSData.bChallengeCompleted[0])
|
|
ADD_WIDGET_BOOL("Challenge Feelin' Groggy",sTWSData.bChallengeCompleted[1])
|
|
ADD_WIDGET_BOOL("Challenge Platinum Sword",sTWSData.bChallengeCompleted[2])
|
|
ADD_WIDGET_BOOL("Challenge Coin Purse",sTWSData.bChallengeCompleted[3])
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Render")
|
|
ADD_WIDGET_BOOL("bBlockDrawing", g_bBlockArcadeCabinetDrawing)
|
|
ADD_WIDGET_BOOL("g_bMinimizeArcadeCabinetDrawing", g_bMinimizeArcadeCabinetDrawing)
|
|
ADD_WIDGET_INT_READ_ONLY("iRectsDrawnThisFrame", iRectsDrawnThisFrame)
|
|
ADD_WIDGET_INT_READ_ONLY("iSpritesDrawnThisFrame", iSpritesDrawnThisFrame)
|
|
ADD_WIDGET_INT_READ_ONLY("iDebugLinesDrawnThisFrame", iDebugLinesDrawnThisFrame)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
|
|
ARCADE_GAMES_POSTFX_WIDGET_CREATE()
|
|
ARCADE_GAMES_SOUND_WIDGET_CREATE()
|
|
ARCADE_GAMES_LEADERBOARD_WIDGET_CREATE()
|
|
|
|
CLEAR_CURRENT_WIDGET_GROUP(sTWSData.widgetGroup)
|
|
|
|
sTWSData.bDebugCreatedWidgets = TRUE
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Dumps the current state of the game to the logs
|
|
/// Automatically called when a bug is entered
|
|
PROC TWS_DEBUG_DUMP_DATA_TO_LOGS()
|
|
|
|
ARCADE_CABINET_DUMP_DATA_TO_CONSOLE()
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [JS] TWS_DEBUG_DUMP_DATA_TO_LOGS - Dumping data...")
|
|
|
|
//General
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [JS] ----- GENERAL -----")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS_ARCADE] [JS] eClientState = ", TWS_DEBUG_GET_TWS_ARCADE_CLIENT_STATE_AS_STRING(sTWSData.eClientState))
|
|
|
|
ENDPROC
|
|
|
|
PROC TWS_DEBUG_PROCESSING()
|
|
|
|
TWS_DEBUG_CREATE_WIDGETS()
|
|
|
|
IF sTWSData.bChallengeCompleted[0]
|
|
TWS_RESET_CHALLENGES()
|
|
sTWSData.bChallengeCompleted[0] = FALSE
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] challenges ",sTWSData.iChallengesBitsetForTelemetry)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_FEELIN_GROGGY: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_FEELIN_GROGGY)))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_PLATINUM_SWORD: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_PLATINUM_SWORD_PLATINUM)))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_COIN_PURSE: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_COIN_PURSE_PLATINUM)))
|
|
ENDIF
|
|
IF sTWSData.bChallengeCompleted[1]
|
|
TWS_SET_CHALLENGE_COMPLETED(TWS_CHALLENGE_BIT_FEELIN_GROGGY)
|
|
SET_BIT(sTWSData.iChallengesBitsetForTelemetry, ENUM_TO_INT(TWS_CHALLENGE_BIT_FEELIN_GROGGY))
|
|
sTWSData.bChallengeCompleted[1] = FALSE
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] challenges ",sTWSData.iChallengesBitsetForTelemetry)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_FEELIN_GROGGY: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_FEELIN_GROGGY)))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_PLATINUM_SWORD: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_PLATINUM_SWORD_PLATINUM)))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_COIN_PURSE: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_COIN_PURSE_PLATINUM)))
|
|
ENDIF
|
|
IF sTWSData.bChallengeCompleted[2]
|
|
TWS_SET_CHALLENGE_COMPLETED(TWS_CHALLENGE_BIT_PLATINUM_SWORD_PLATINUM)
|
|
SET_BIT(sTWSData.iChallengesBitsetForTelemetry, ENUM_TO_INT(TWS_CHALLENGE_BIT_PLATINUM_SWORD_PLATINUM))
|
|
sTWSData.bChallengeCompleted[2] = FALSE
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] challenges ",sTWSData.iChallengesBitsetForTelemetry)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_FEELIN_GROGGY: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_FEELIN_GROGGY)))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_PLATINUM_SWORD: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_PLATINUM_SWORD_PLATINUM)))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_COIN_PURSE: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_COIN_PURSE_PLATINUM)))
|
|
ENDIF
|
|
IF sTWSData.bChallengeCompleted[3]
|
|
TWS_SET_CHALLENGE_COMPLETED(TWS_CHALLENGE_BIT_COIN_PURSE_PLATINUM)
|
|
SET_BIT(sTWSData.iChallengesBitsetForTelemetry, ENUM_TO_INT(TWS_CHALLENGE_BIT_COIN_PURSE_PLATINUM))
|
|
sTWSData.bChallengeCompleted[3] = FALSE
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] challenges ",sTWSData.iChallengesBitsetForTelemetry)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_FEELIN_GROGGY: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_FEELIN_GROGGY)))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_PLATINUM_SWORD: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_PLATINUM_SWORD_PLATINUM)))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[WIZARDS RUIN] - TWS_CHALLENGE_BIT_COIN_PURSE: ",IS_BIT_SET(sTWSData.iChallengesBitsetForTelemetry,ENUM_TO_INT(TWS_CHALLENGE_BIT_COIN_PURSE_PLATINUM)))
|
|
ENDIF
|
|
|
|
IF sTWSData.bDebugCreatedWidgets
|
|
|
|
ARCADE_GAMES_POSTFX_WIDGET_UPDATE()
|
|
ARCADE_GAMES_SOUND_WIDGET_UPDATE()
|
|
ARCADE_GAMES_LEADERBOARD_WIDGET_UPDATE()
|
|
|
|
//If a bug is entered dump all data to the console.
|
|
IF IS_KEYBOARD_KEY_PRESSED(KEY_SPACE)
|
|
OR IS_KEYBOARD_KEY_PRESSED(KEY_RBRACKET)
|
|
TWS_DEBUG_DUMP_DATA_TO_LOGS()
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
#ENDIF
|
|
|
|
/// PURPOSE:
|
|
/// Returns true if the game should quit
|
|
/// Processes holding a button to quit
|
|
/// RETURNS:
|
|
///
|
|
FUNC BOOL TWS_SHOULD_QUIT_NOW()
|
|
|
|
IF g_bForceQuitPenthouseArcadeMachines
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS] TWS_SHOULD_QUIT_NOW - g_bForceQuitPenthouseArcadeMachines")
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_DOING_HELI_DOCK_CUTSCENE(GET_PLAYER_INDEX())
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS] TWS_SHOULD_QUIT_NOW - IS_PLAYER_DOING_HELI_DOCK_CUTSCENE")
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
IF IS_LOCAL_PLAYER_WALKING_IN_OR_OUT_OF_SIMPLE_INTERIOR()
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS] TWS_SHOULD_QUIT_NOW - IS_LOCAL_PLAYER_WALKING_IN_OR_OUT_OF_SIMPLE_INTERIOR")
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
IF SHOULD_KICK_PLAYER_FROM_ANY_ARCADE_GAME()
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS] TWS_SHOULD_QUIT_NOW - SHOULD_KICK_PLAYER_FROM_ANY_ARCADE_GAME")
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
CONTROL_ACTION CA_Quit = INPUT_FRONTEND_CANCEL
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
CA_Quit = INPUT_FRONTEND_DELETE
|
|
ENDIF
|
|
|
|
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, CA_Quit)
|
|
OR (IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, CA_Quit))
|
|
DRAW_GENERIC_METER(ciTWS_HOLD_TO_QUIT_TIME - ABSI(NATIVE_TO_INT(GET_NETWORK_TIME()) - sTWSData.iQuitTime), ciTWS_HOLD_TO_QUIT_TIME, "DEG_GAME_QUIT")
|
|
ELSE
|
|
DRAW_GENERIC_METER(0, ciTWS_HOLD_TO_QUIT_TIME, "DEG_GAME_QUIT")
|
|
ENDIF
|
|
|
|
IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, CA_Quit)
|
|
|
|
IF sTWSData.iQuitTime = -HIGHEST_INT
|
|
sTWSData.iQuitTime = NATIVE_TO_INT(GET_NETWORK_TIME()) + ciTWS_HOLD_TO_QUIT_TIME
|
|
ENDIF
|
|
|
|
//DRAW_GENERIC_METER(ciIAP_HOLD_TO_QUIT_TIME - (sIAPData.iQuitTime - NATIVE_TO_INT(GET_NETWORK_TIME())), ciIAP_HOLD_TO_QUIT_TIME, "IAP_EXIT", HUD_COLOUR_RED, -1, HUDORDER_TOP)
|
|
|
|
IF NATIVE_TO_INT(GET_NETWORK_TIME()) > sTWSData.iQuitTime
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TWS] TWS_SHOULD_QUIT_NOW - Button Held")
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
ELIF sTWSData.iQuitTime != -HIGHEST_INT
|
|
sTWSData.iQuitTime = -HIGHEST_INT
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Run every frame before the client state machine is processed
|
|
PROC TWS_PRE_UPDATE()
|
|
|
|
IF sTWSData.eClientState >= TWS_ARCADE_CLIENT_STATE_CLEANUP
|
|
// Cleaning up, don't do anything
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT IS_SKYSWOOP_AT_GROUND()
|
|
OR TWS_SHOULD_QUIT_NOW()
|
|
TWS_SET_CLIENT_STATE(TWS_ARCADE_CLIENT_STATE_CLEANUP)
|
|
EXIT
|
|
ENDIF
|
|
|
|
TWS_UPDATE_ANIM_FRAMES()
|
|
|
|
ARCADE_GAMES_LEADERBOARD_PROCESS_EVENTS()
|
|
ARCADE_GAMES_LEADERBOARD_LOAD(CASINO_ARCADE_GAME_THE_WIZARDS_RUIN)
|
|
|
|
BOOL bIsPlaying = sTWSData.eClientState >= TWS_ARCADE_CLIENT_STATE_PLAYING
|
|
ARCADE_CABINET_COMMON_EVERY_FRAME_PROCESSING(bIsPlaying)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Run every frame after the client state machine is processed
|
|
PROC TWS_POST_UPDATE()
|
|
|
|
//Hide help text every frame unless this minigame wants to show some
|
|
//See x:\gta5\script\dev_ng\shared\include\public\invade_persuade_main.sch IAP_SHOULD_ALLOW_HELP_TEXT_THIS_FRAME()
|
|
//Hide help text every frame unless this minigame wants to show some
|
|
IF NOT ARCADE_GAMES_HELP_TEXT_SHOULD_ALLOW_THIS_FRAME()
|
|
HIDE_HELP_TEXT_THIS_FRAME()
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Call every frame to run the minigame
|
|
PROC PROCESS_TWS_ARCADE()
|
|
|
|
TWS_PRE_UPDATE()
|
|
|
|
TWS_PROCESS_CLIENT_STATE_MACHINE()
|
|
|
|
DEGENATRON_GAMES_ANIMATION_UPDATE()
|
|
|
|
TWS_POST_UPDATE()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
TWS_DEBUG_PROCESSING()
|
|
#ENDIF
|
|
|
|
ENDPROC
|