4770 lines
199 KiB
XML
Executable File
4770 lines
199 KiB
XML
Executable File
USING "gunslinger_arcade_using.sch"
|
|
USING "gunslinger_arcade_drawing.sch"
|
|
USING "gunslinger_arcade_levels.sch"
|
|
USING "degenatron_games_movie.sch"
|
|
USING "net_arcade_cabinet.sch"
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Updates the values used for animating sprite sequences
|
|
PROC TLG_UPDATE_ANIM_FRAMES()
|
|
|
|
INT p, i
|
|
FOR p = 0 TO ciTLG_MAX_PLAYERS - 1
|
|
|
|
//Blast Slow anim update
|
|
FOR i = 0 TO ciTLG_MAX_PROJECTILES - 1
|
|
sTLGData.sPlayerData[p].sBulletData[i].iSlowFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
|
|
sTLGData.sPlayerData[p].sBulletData[i].iSlowUpdateFrames = FLOOR(sTLGData.sPlayerData[p].sBulletData[i].iSlowFrameTimeCounter / cfTLG_SLOW_ANIM_FRAME_TIME)
|
|
sTLGData.sPlayerData[p].sBulletData[i].iSlowFrameTimeCounter -= ROUND(cfTLG_SLOW_ANIM_FRAME_TIME * sTLGData.sPlayerData[p].sBulletData[i].iSlowUpdateFrames)
|
|
ENDFOR
|
|
|
|
ENDFOR
|
|
|
|
// Enemies
|
|
FOR i = 0 TO ciTLG_MAX_ENEMIES -1
|
|
|
|
//Slow anim update
|
|
sTLGData.sEnemyData[i].iSlowFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
|
|
sTLGData.sEnemyData[i].iSlowUpdateFrames = FLOOR(sTLGData.sEnemyData[i].iSlowFrameTimeCounter / cfTLG_SLOW_ANIM_FRAME_TIME)
|
|
sTLGData.sEnemyData[i].iSlowFrameTimeCounter -= ROUND(cfTLG_SLOW_ANIM_FRAME_TIME * sTLGData.sEnemyData[i].iSlowUpdateFrames)
|
|
|
|
//Default anim update
|
|
sTLGData.sEnemyData[i].iDefaultFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
|
|
sTLGData.sEnemyData[i].iDefaultUpdateFrames = FLOOR(sTLGData.sEnemyData[i].iDefaultFrameTimeCounter / cfTLG_DEFAULT_ANIM_FRAME_TIME)
|
|
sTLGData.sEnemyData[i].iDefaultFrameTimeCounter -= ROUND(cfTLG_DEFAULT_ANIM_FRAME_TIME * sTLGData.sEnemyData[i].iDefaultUpdateFrames)
|
|
|
|
IF sTLGData.sEnemyData[i].iEnemyType = TLG_OUTHOUSE_ENEMY
|
|
OR sTLGData.sEnemyData[i].iEnemyType = TLG_COFFIN_ENEMY
|
|
IF sTLGData.sEnemyData[i].eState = TLG_ACTIVE
|
|
IF sTLGData.sEnemyData[i].iSpriteAnimFrame = ciTLG_MAX_OUTHOUSE_ENEMY_ANIM_FRAMES -2
|
|
sTLGData.sEnemyData[i].iSlowFrameTimeCounter = 0
|
|
sTLGData.sEnemyData[i].iSlowFrameTimeCounter = 0
|
|
sTLGData.sEnemyData[i].iSlowUpdateFrames = 0
|
|
|
|
sTLGData.sEnemyData[i].iDefaultFrameTimeCounter = 0
|
|
sTLGData.sEnemyData[i].iDefaultUpdateFrames = 0
|
|
sTLGData.sEnemyData[i].iDefaultFrameTimeCounter = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO ciTLG_MAX_HOSTAGES -1
|
|
|
|
//Slow anim update
|
|
sTLGData.sHostageData[i].iSlowFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
|
|
sTLGData.sHostageData[i].iSlowUpdateFrames = FLOOR(sTLGData.sHostageData[i].iSlowFrameTimeCounter / cfTLG_SLOW_ANIM_FRAME_TIME)
|
|
sTLGData.sHostageData[i].iSlowFrameTimeCounter -= ROUND(cfTLG_SLOW_ANIM_FRAME_TIME * sTLGData.sHostageData[i].iSlowUpdateFrames)
|
|
|
|
//Default anim update
|
|
sTLGData.sHostageData[i].iDefaultFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
|
|
sTLGData.sHostageData[i].iDefaultUpdateFrames = FLOOR(sTLGData.sHostageData[i].iDefaultFrameTimeCounter / cfTLG_DEFAULT_ANIM_FRAME_TIME)
|
|
sTLGData.sHostageData[i].iDefaultFrameTimeCounter -= ROUND(cfTLG_DEFAULT_ANIM_FRAME_TIME * sTLGData.sHostageData[i].iDefaultUpdateFrames)
|
|
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO ciTLG_MAX_FX -1
|
|
|
|
//Slow anim update
|
|
sTLGData.sFXData[i].iSlowFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
|
|
sTLGData.sFXData[i].iSlowUpdateFrames = FLOOR(sTLGData.sFXData[i].iSlowFrameTimeCounter / cfTLG_SLOW_ANIM_FRAME_TIME)
|
|
sTLGData.sFXData[i].iSlowFrameTimeCounter -= ROUND(cfTLG_SLOW_ANIM_FRAME_TIME * sTLGData.sFXData[i].iSlowUpdateFrames)
|
|
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO ciTLG_MAX_COVER - 1
|
|
IF sTLGData.sCoverData[i].bIsAnimated
|
|
AND sTLGData.sCoverData[i].iHitCount > 0
|
|
//Slow anim update
|
|
sTLGData.sCoverData[i].iSlowFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
|
|
sTLGData.sCoverData[i].iSlowUpdateFrames = FLOOR(sTLGData.sCoverData[i].iSlowFrameTimeCounter / cfTLG_SLOW_ANIM_FRAME_TIME)
|
|
sTLGData.sCoverData[i].iSlowFrameTimeCounter -= ROUND(cfTLG_SLOW_ANIM_FRAME_TIME * sTLGData.sCoverData[i].iSlowUpdateFrames)
|
|
|
|
//Default anim update
|
|
sTLGData.sCoverData[i].iDefaultFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
|
|
sTLGData.sCoverData[i].iDefaultUpdateFrames = FLOOR(sTLGData.sCoverData[i].iDefaultFrameTimeCounter / cfTLG_DEFAULT_ANIM_FRAME_TIME)
|
|
sTLGData.sCoverData[i].iDefaultFrameTimeCounter -= ROUND(cfTLG_DEFAULT_ANIM_FRAME_TIME * sTLGData.sCoverData[i].iDefaultUpdateFrames)
|
|
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO ciTLG_MAX_ENEMY_PROJECTILES - 1
|
|
sTLGData.sEnemyProjectiles[i].iSlowFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
|
|
sTLGData.sEnemyProjectiles[i].iSlowUpdateFrames = FLOOR(sTLGData.sEnemyProjectiles[i].iSlowFrameTimeCounter / cfTLG_SLOW_ANIM_FRAME_TIME)
|
|
sTLGData.sEnemyProjectiles[i].iSlowFrameTimeCounter -= ROUND(cfTLG_SLOW_ANIM_FRAME_TIME * sTLGData.sEnemyProjectiles[i].iSlowUpdateFrames)
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
|
|
|
|
PROC TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE eNewState)
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] {DSW} TLG_SET_LOCAL_STATE - State changed from ",
|
|
TLG_DEBUG_GET_TLG_ARCADE_CLIENT_STATE_AS_STRING(sTLGData.eClientState), " to ", TLG_DEBUG_GET_TLG_ARCADE_CLIENT_STATE_AS_STRING(eNewState))
|
|
|
|
sTLGData.eClientState = eNewState
|
|
|
|
// IF eNewState = TLG_ARCADE_CLIENT_STATE_LEVEL_SELECTION_MENU // relaced by TLG_AUDIO_EFFECT_PLAYER_START
|
|
// TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_SELECT_STAGE)
|
|
// ENDIF
|
|
ENDPROC
|
|
|
|
|
|
|
|
|
|
PROC TLG_RESET_ALL_ENEMY_THROWN_PROJECTLES()
|
|
INT i
|
|
REPEAT ciTLG_MAX_ENEMY_PROJECTILES i
|
|
TLG_RESET_ENEMY_THROWN_PROJECTILE(i)
|
|
ENDREPEAT
|
|
|
|
sTLGData.iNumberOfThrownEnemyProjectiles = 0
|
|
ENDPROC
|
|
|
|
PROC RESET_ENEMIES()
|
|
INT i = 0
|
|
FOR i = 0 TO ciTLG_MAX_ENEMIES -1
|
|
RESET_ENEMY(i)
|
|
ENDFOR
|
|
ENDPROC
|
|
|
|
|
|
PROC TLG_RESET_ALL_COVER()
|
|
INT i
|
|
FOR i = 0 TO ciTLG_MAX_COVER -1
|
|
TLG_RESET_COVER(i)
|
|
ENDFOR
|
|
sTLGData.iNumberOfProps = 0
|
|
ENDPROC
|
|
|
|
|
|
|
|
PROC TLG_RESET_ITEMS()
|
|
INT i
|
|
FOR i = 0 TO ciTLG_MAX_ITEMS -1
|
|
TLG_RESET_ITEM(i)
|
|
ENDFOR
|
|
|
|
sTLGData.iNumberOfItems = 0
|
|
ENDPROC
|
|
PROC TLG_CLEANUP_VARIABLES()
|
|
|
|
sTLGData.sPlayerData[0].fHealth = 1.0
|
|
// sTLGData.sPlayerData[0].iWeapon = 0
|
|
// sTLGData.sPlayerData[0].iAmmo = ciTLG_PLAYER_START_AMMO
|
|
|
|
TLG_INIT_PLAYER_WEAPON()
|
|
|
|
sTLGData.sPlayerData[0].iHitCountdown = 0
|
|
|
|
sTLGData.iCurrentActiveEnemies[0] = 0
|
|
sTLGData.iCurrentActiveEnemies[1] = 0
|
|
sTLGData.iCurrentActiveEnemies[2] = 0
|
|
|
|
sTLGData.bFadingOut = FALSE
|
|
|
|
sTLGData.eLevelStage = TLG_FADING_IN
|
|
|
|
INT i
|
|
TLG_RESET_ALL_COVER()
|
|
|
|
RESET_ENEMIES()
|
|
|
|
TLG_RESET_ALL_ENEMY_THROWN_PROJECTLES()
|
|
|
|
sTLGData.iNumberOfEnemies = 0
|
|
|
|
TLG_RESET_HOSTAGES()
|
|
|
|
FOR i = 0 TO ciTLG_MAX_BACKGROUND_ELEMS - 1
|
|
sTLGData.sBackgroundData[i].bRendering = FALSE
|
|
ENDFOR
|
|
sTLGData.iNumberOfBackgroundElements = 0
|
|
|
|
TLG_RESET_ITEMS()
|
|
|
|
|
|
FOR i = 0 TO ciTLG_MAX_FX - 1
|
|
sTLGData.sFXData[i].bActive = FALSE
|
|
ENDFOR
|
|
|
|
TLG_RESET_LOCAL_PLAYER_SCORE_FOR_CURRENT_LEVEL()
|
|
ENDPROC
|
|
|
|
|
|
PROC TLG_CHECK_PLAYER_RETURNING_TO_MENU(BOOL bReturnToTitle = TRUE, BOOL bAllowAccept = FALSE, BOOL bIsLeaderboard = FALSE, BOOL bUseTimeOut = FALSE)
|
|
BOOL bShouldReturn
|
|
BOOL bTimeExpired
|
|
IF bUseTimeOut
|
|
IF sTLGData.iReturnToMenuTimeout = 0
|
|
sTLGData.iReturnToMenuTimeout = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
bTimeExpired = (bUseTimeOut AND (GET_GAME_TIMER() - sTLGData.iReturnToMenuTimeout > 10000))
|
|
IF NOT bIsLeaderboard
|
|
bShouldReturn = IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) OR (bAllowAccept AND IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT))
|
|
ELSE
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
bShouldReturn = IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
|
|
ELSE
|
|
bShouldReturn = IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bShouldReturn
|
|
OR bTimeExpired
|
|
#IF IS_DEBUG_BUILD
|
|
IF bTimeExpired
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_CHECK_PLAYER_RETURNING_TO_MENU] {dsw} Time expired - bReturnToTitle: ", bReturnToTitle, " bAllowAccept: ", bAllowAccept, " bIsLeaderboard: ",bIsLeaderboard, " bUseTimeOut: ",bUseTimeOut)
|
|
DEBUG_PRINTCALLSTACK()
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_MENU_BACK)
|
|
|
|
|
|
TLG_CLEANUP_VARIABLES()
|
|
|
|
IF bReturnToTitle
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_TITLE_SCREEN)
|
|
sTLGData.iReturnToMenuTimeout = 0
|
|
ELSE
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_LEVEL_SELECTION_MENU)
|
|
sTLGData.iReturnToMenuTimeout = 0
|
|
ENDIF
|
|
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC INT TLG_GET_NEXT_FX_INDEX()
|
|
|
|
INT i
|
|
FOR i = 0 TO ciTLG_MAX_FX -1
|
|
IF sTLGData.sFXData[i].bActive = FALSE
|
|
RETURN i
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
RETURN 0
|
|
|
|
ENDFUNC
|
|
|
|
PROC TWS_CREATE_FX(VECTOR_2D vPos, TLG_FX_TYPE eType, INT iLane)
|
|
|
|
INT iIndex = TLG_GET_NEXT_FX_INDEX()
|
|
|
|
sTLGData.sFXData[iIndex].vSpritePos = vPos
|
|
sTLGData.sFXData[iIndex].eFXType = eType
|
|
IF iLane = ciTLG_LANE_POPUP_LHS
|
|
OR iLane = ciTLG_LANE_POPUP_RHS
|
|
iLane= ciTLG_LANE_BACKGROUND
|
|
ENDIF
|
|
sTLGData.sFXData[iIndex].iLane = iLane
|
|
sTLGData.sFXData[iIndex].iSpriteBlastAnimFrame = 0
|
|
sTLGData.sFXData[iIndex].bActive = TRUE
|
|
|
|
ENDPROC
|
|
|
|
PROC TLG_ACTIVATE_ITEM(INT iIndex)
|
|
#IF IS_DEBUG_BUILD
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ACTIVATE_ITEM] {DSW} Called. Item: ", iIndex, " Type: ", TLG_GET_COLLECTIBLE_TYPE_AS_STRING(sTLGData.sItemData[iIndex].eItemType), " Pos: ", sTLGData.sItemData[iIndex].vSpritePos.x, ", ", sTLGData.sItemData[iIndex].vSpritePos.y)
|
|
#ENDIF
|
|
// INT iInClip
|
|
// INT iTotal
|
|
INT iRand
|
|
TLG_PLAYER_WEAPON_DATA weaponData
|
|
SWITCH sTLGData.sItemData[iIndex].eItemType
|
|
|
|
CASE TLG_MACHINE_GUN_AMMO
|
|
// sTLGData.sPlayerData[0].iWeapon = 1
|
|
// sTLGData.sPlayerData[0].iAmmo = 1000
|
|
TLG_SET_PLAYER_SPECIAL_WEAPON(TLG_PLAYER_WEAPON_GATLING)
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_GATLING_GUN)
|
|
sTLGData.sItemData[iIndex].bRendering = FALSE
|
|
sTLGData.sItemData[iIndex].iRenderAfterWarpCount = 0
|
|
BREAK
|
|
|
|
CASE TLG_HEALTH
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PICKUP_HEALTH)
|
|
sTLGData.sPlayerData[0].fHealth = CLAMP(sTLGData.sPlayerData[0].fHealth + 0.5, 0.0, 1.0)
|
|
sTLGData.sItemData[iIndex].bRendering = FALSE
|
|
sTLGData.sItemData[iIndex].iRenderAfterWarpCount = 0
|
|
BREAK
|
|
|
|
CASE TLG_REVOLVER_AMMO
|
|
weaponData = TLG_GET_PLAYER_WEAPON_DATA(TLG_PLAYER_WEAPON_PISTOL)
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_NEW_GUN)
|
|
|
|
|
|
sTLGData.sPlayerData[0].weaponData[TLG_PLAYER_WEAPON_TYPE_DEFAULT].iAmmoInClip = weaponData.iClipSize
|
|
sTLGData.sPlayerData[0].weaponData[TLG_PLAYER_WEAPON_TYPE_DEFAULT].iTotalAmmo = weaponData.iMaxAmmo
|
|
|
|
sTLGData.sItemData[iIndex].bRendering = FALSE
|
|
sTLGData.sItemData[iIndex].iRenderAfterWarpCount = 0
|
|
BREAK
|
|
|
|
CASE TLG_RIFLE_AMMO
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_RIFLE)
|
|
TLG_SET_PLAYER_SPECIAL_WEAPON(TLG_PLAYER_WEAPON_RIFLE)
|
|
sTLGData.sItemData[iIndex].bRendering = FALSE
|
|
sTLGData.sItemData[iIndex].iRenderAfterWarpCount = 0
|
|
BREAK
|
|
|
|
CASE TLG_SHOTGUN_AMMO
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_SHOTGUN)
|
|
TLG_SET_PLAYER_SPECIAL_WEAPON(TLG_PLAYER_WEAPON_SHOTGUN)
|
|
sTLGData.sItemData[iIndex].bRendering = FALSE
|
|
sTLGData.sItemData[iIndex].iRenderAfterWarpCount = 0
|
|
BREAK
|
|
|
|
CASE TLG_SHERIFF
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PICKUP_SHERIFF)
|
|
TLG_SET_PLAYER_BIT(TLG_PLAYER_BIT_INVULNERABILE)
|
|
sTLGData.sPlayerData[0].iInvulnerableTimer = GET_GAME_TIMER()
|
|
sTLGData.sItemData[iIndex].bRendering = FALSE
|
|
sTLGData.sItemData[iIndex].iRenderAfterWarpCount = 0
|
|
|
|
TLG_START_AUDIO_SCENE(TLG_AUDIO_SCENE_POWERUP_ACTIVE)
|
|
TLG_PLAY_SOUND_NO_POSITION(TLG_AUDIO_EFFECT_POWERUP)
|
|
BREAK
|
|
|
|
CASE TLG_SNAKE_OIL
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PICKUP_SNAKE_OIL)
|
|
iRand = GET_RANDOM_INT_IN_RANGE(0, 5)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] {DSW} [TLG_ACTIVATE_ITEM] TLG_SNAKE_OIL - ", iRand)
|
|
SWITCH iRand
|
|
CASE 0
|
|
//-- Restore health
|
|
sTLGData.sPlayerData[0].fHealth = 1.0
|
|
BREAK
|
|
|
|
CASE 1
|
|
//-- Damage player
|
|
TLG_DAMAGE_PLAYER(TLG_DAMAGE_PLAYER_TYPE_SNAKE_OIL)
|
|
BREAK
|
|
|
|
CASE 2
|
|
//-- Hide reticule
|
|
TLG_SET_PLAYER_BIT(TLG_PLAYER_BIT_HIDE_RETICULE)
|
|
sTLGData.sPlayerData[0].iHideReticuleTimer = GET_GAME_TIMER()
|
|
|
|
TLG_START_AUDIO_SCENE(TLG_AUDIO_SCENE_POWERUP_ACTIVE)
|
|
TLG_PLAY_SOUND_NO_POSITION(TLG_AUDIO_EFFECT_POWERDOWN)
|
|
BREAK
|
|
|
|
CASE 3
|
|
//-- Invulnerable
|
|
TLG_SET_PLAYER_BIT(TLG_PLAYER_BIT_INVULNERABILE)
|
|
TLG_START_AUDIO_SCENE(TLG_AUDIO_SCENE_POWERUP_ACTIVE)
|
|
TLG_PLAY_SOUND_NO_POSITION(TLG_AUDIO_EFFECT_POWERUP)
|
|
sTLGData.sPlayerData[0].iInvulnerableTimer = GET_GAME_TIMER()
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
sTLGData.sItemData[iIndex].bRendering = FALSE
|
|
sTLGData.sItemData[iIndex].iRenderAfterWarpCount = 0
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
TLG_INCREASE_POWERUPS_COLLECTED_FOR_CURRENT_LEVEL()
|
|
ENDPROC
|
|
|
|
FUNC BOOL TLG_CHECK_FOR_HEADSHOT(VECTOR_2D vSpriteTL, VECTOR_2D vBullet, INT iLane, TLG_ENEMY_TYPES etype)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] {DSW} [TLG_CHECK_FOR_HEADSHOT] ")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] {DSW} [TLG_CHECK_FOR_HEADSHOT] Lane: ", iLane)
|
|
|
|
FLOAT fAbsfDist = ABSF(vBullet.Y - vSpriteTL.y)
|
|
FLOAT fYMin, fYMax
|
|
|
|
IF etype != TLG_OUTHOUSE_ENEMY
|
|
AND etype != TLG_COFFIN_ENEMY
|
|
SWITCH iLane
|
|
CASE 0 // Back of screen
|
|
fYMin = cfTLG_HEADSHOT_LANE0_MIN_Y
|
|
fYMax = cfTLG_HEADSHOT_LANE0_MAX_Y
|
|
BREAK
|
|
|
|
CASE 1 // Middle of screen
|
|
fYMin = cfTLG_HEADSHOT_LANE1_MIN_Y
|
|
fYMax = cfTLG_HEADSHOT_LANE1_MAX_Y
|
|
BREAK
|
|
|
|
CASE 2 // Front of screen
|
|
fYMin = cfTLG_HEADSHOT_LANE2_MIN_Y
|
|
fYMax = cfTLG_HEADSHOT_LANE2_MAX_Y
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
IF etype = TLG_OUTHOUSE_ENEMY
|
|
fYMin = cfTLG_HEADSHOT_OUTHOUSE_MIN_Y
|
|
fyMax = cfTLG_HEADSHOT_OUTHOUSE_MAX_Y
|
|
ELSE
|
|
fYMin = cfTLG_HEADSHOT_COFFIN_MIN_Y
|
|
fyMax = cfTLG_HEADSHOT_COFFIN_MAX_Y
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fAbsfDist = ABSF(vBullet.Y - vSpriteTL.y)
|
|
IF fAbsfDist >= fYMin
|
|
AND fAbsfDist <= fYMax
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] {DSW} [TLG_CHECK_FOR_HEADSHOT] HEADSHOT!")
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] {DSW} [TLG_CHECK_FOR_HEADSHOT] No Headshot - Diff: ", fAbsfDist, " Min: ", fYMin, " Max : ", fYMax)
|
|
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC TLG_PLAY_AUDIO_FOR_SHOT_COVER(INT iCover)
|
|
TLG_ASSET_TYPES eType = sTLGData.sCoverData[iCover].eType
|
|
VECTOR_2D vPos = sTLGData.sCoverData[iCover].vSpritePos
|
|
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_PLAY_AUDIO_FOR_SHOT_COVER] [TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER] {dsw} Cover ", iCover, " Type: ", TLG_GET_ASSET_TYPE_AS_STRING(sTLGData.sCoverData[iCover].eType))
|
|
#ENDIF
|
|
|
|
SWITCH eType
|
|
|
|
CASE TLG_ASSET_CACTUS_1
|
|
CASE TLG_ASSET_CACTUS_2
|
|
CASE TLG_ASSET_CACTUS_3
|
|
CASE TLG_ASSET_CACTUS_4
|
|
CASE TLG_ASSET_CACTUS_5
|
|
CASE TLG_ASSET_CACTUS_6
|
|
CASE TLG_ASSET_CACTUS_7
|
|
CASE TLG_ASSET_CACTUS_8
|
|
CASE TLG_ASSET_CACTUS_9
|
|
CASE TLG_ASSET_CACTUS_10
|
|
CASE TLG_ASSET_CACTUS_11
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_BULLET_HIT_CACTUS, vPos)
|
|
BREAK
|
|
|
|
CASE TLG_ASSET_CRATE_1
|
|
CASE TLG_ASSET_BUILDING_1
|
|
CASE TLG_ASSET_BUILDING_2
|
|
CASE TLG_ASSET_BUILDING_3
|
|
CASE TLG_ASSET_BUILDING_4
|
|
CASE TLG_ASSET_BUILDING_5
|
|
CASE TLG_ASSET_BUILDING_6
|
|
CASE TLG_ASSET_BUILDING_7
|
|
CASE TLG_ASSET_BUILDING_8
|
|
CASE TLG_ASSET_FENCE
|
|
CASE TLG_ASSET_FENCE_SMALL
|
|
CASE TLG_ASSET_FOREST_TREE_1
|
|
CASE TLG_ASSET_FOREST_TREE_2
|
|
CASE TLG_ASSET_STACKED_CRATES_1
|
|
CASE TLG_ASSET_STACKED_CRATES_2
|
|
CASE TLG_ASSET_SPECIAL_TNT_CRATE
|
|
CASE TLG_ASSET_SPECIAL_TNT_BARREL_1
|
|
CASE TLG_ASSET_SPECIAL_TNT_BARREL_2
|
|
CASE TLG_ASSET_BARRELS
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_BULLET_HIT_BARREL, vPos)
|
|
BREAK
|
|
|
|
CASE TLG_ASSET_GRASS
|
|
CASE TLG_ASSET_BUSH_1
|
|
CASE TLG_ASSET_BUSH_2
|
|
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_BULLET_HIT_BUSH, vPos)
|
|
BREAK
|
|
|
|
CASE TLG_ASSET_BIG_TOMB
|
|
CASE TLG_ASSET_TOMBSTONE_1
|
|
CASE TLG_ASSET_TOMBSTONE_2
|
|
CASE TLG_ASSET_TOMBSTONE_3
|
|
CASE TLG_ASSET_TOMBSTONE_4
|
|
CASE TLG_ASSET_TOMBSTONE_5
|
|
CASE TLG_ASSET_ROCK_SMALL
|
|
CASE TLG_ASSET_ROCK_LARGE
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_BULLET_HIT_ROCK, vPos)
|
|
BREAK
|
|
|
|
CASE TLG_ASSET_COFFIN
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_BULLET_HIT_COFFIN, vPos)
|
|
BREAK
|
|
|
|
CASE TLG_ASSET_OUTHOUSE
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_BULLET_HIT_LATRINE, vPos)
|
|
BREAK
|
|
|
|
DEFAULT
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_BULLET_HIT_GENERIC, vPos)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
FUNC INT TLG_GET_NUMBER_OF_PICKUPS_PLACED_INSIDE_COFFINS_FOR_CURRENT_SCREEN()
|
|
INT i
|
|
INT iCount
|
|
FOR i = 0 TO ciTLG_MAX_COVER - 1
|
|
IF sTLGData.sCoverData[i].bRendering
|
|
IF sTLGData.sCoverData[i].eType = TLG_ASSET_COFFIN
|
|
IF TLG_IS_POSITION_ON_SCREEN(sTLGData.sCoverData[i].vSpritePos)
|
|
IF sTLGData.sCoverData[i].bSpawnedPickup
|
|
iCount++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
RETURN iCount
|
|
ENDFUNC
|
|
PROC TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER( INT iCover, INT iPlayer, INT iProjectile, BOOL &bProcessedThisFrame )
|
|
IF bProcessedThisFrame
|
|
EXIT
|
|
ENDIF
|
|
|
|
INT iRandom
|
|
INT iPlaced
|
|
VECTOR_2D vPickupLoc
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].bHitObject = TRUE
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].iTimeOfHit = GET_GAME_TIMER()
|
|
sTLGData.sCoverData[iCover].iHitCount++
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER] {dsw} Cover ", iCover, " Shot. Hit count: ", sTLGData.sCoverData[iCover].iHitCount, " Lane: ", sTLGData.sCoverData[iCover].iCoverLane, " Type: ", TLG_GET_ASSET_TYPE_AS_STRING(sTLGData.sCoverData[iCover].eType), " Special? ", sTLGData.sCoverData[iCover].bIsSpecialCover)
|
|
#ENDIF
|
|
|
|
IF sTLGData.sCoverData[iCover].bIsSpecialCover
|
|
sTLGData.sCoverData[iCover].bRendering = FALSE
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_EXP_GENERIC, sTLGData.sCoverData[iCover].vSpritePos)
|
|
|
|
TWS_CREATE_FX(sTLGData.sCoverData[iCover].vSpritePos, TLG_FX_EXPLOSION, sTLGData.sCoverData[iCover].iCoverLane)
|
|
|
|
//-- When we explode a TNT barrel, replace it with another at same spot, but don't render until after it's warped around again
|
|
IF sTLGData.sCoverData[iCover].eType = TLG_ASSET_SPECIAL_TNT_BARREL_1
|
|
OR sTLGData.sCoverData[iCover].eType = TLG_ASSET_SPECIAL_TNT_CRATE
|
|
TLG_ADD_COVER_TO_LIST(sTLGData.sCoverData[iCover].vSpritePos, sTLGData.sCoverData[iCover].eType, sTLGData.sCoverData[iCover].iCoverLane, DEFAULT, sTLGData.sCoverData[iCover].iScreen, DEFAULT, 1)
|
|
ENDIF
|
|
|
|
TLG_KILL_ALL_ENEMIES_IN_RANGE(sTLGData.sCoverData[iCover].vSpritePos)
|
|
TLG_ADD_TO_LOCAL_PLAYER_SCORE(TLG_SCORE_TYPE_SCENERY)
|
|
|
|
ELIF sTLGData.sCoverData[iCover].bIsAnimated
|
|
|
|
IF sTLGData.sCoverData[iCover].bRendering
|
|
IF sTLGData.sCoverData[iCover].eType = TLG_ASSET_CRATE_1
|
|
IF sTLGData.sCoverData[iCover].iHitCount > 2
|
|
sTLGData.sCoverData[iCover].bRendering = FALSE
|
|
TWS_CREATE_FX(sTLGData.sCoverData[iCover].vSpritePos, TLG_FX_LOOT_CRATE, 1)
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER] Crate ", iCover, " Spawing pickup here: ", sTLGData.sCoverData[iCover].vSpritePos.x, ", ", sTLGData.sCoverData[iCover].vSpritePos.y)
|
|
IF TLG_GET_CURRENT_LEVEL() = TLG_LEVEL_DESERT
|
|
TLG_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(sTLGData.sCoverData[iCover].vSpritePos.x, sTLGData.sCoverData[iCover].vSpritePos.y), TLG_HEALTH, ciTLG_LANE_FOREGROUND)
|
|
ELIF TLG_GET_CURRENT_LEVEL() = TLG_LEVEL_TOWN
|
|
TLG_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(sTLGData.sCoverData[iCover].vSpritePos.x, sTLGData.sCoverData[iCover].vSpritePos.y), TLG_SHERIFF, sTLGData.sCoverData[iCover].iCoverLane)
|
|
ENDIF
|
|
ENDIF
|
|
ELIF sTLGData.sCoverData[iCover].eType = TLG_ASSET_OUTHOUSE
|
|
IF NOT sTLGData.sCoverData[iCover].bSpawnedPickup
|
|
IF sTLGData.sCoverData[iCover].iHitCount > 0
|
|
sTLGData.sCoverData[iCover].bSpawnedPickup = TRUE
|
|
vPickupLoc = sTLGData.sCoverData[iCover].vSpritePos
|
|
vPickupLoc.x += cfTLG_PICKUP_OUTHOUSE_OFFSET_X
|
|
vPickupLoc.y += cfTLG_PICKUP_OUTHOUSE_OFFSET_Y
|
|
TLG_ADD_ITEM_TO_LIST(vPickupLoc, TLG_REVOLVER_AMMO, ciTLG_LANE_FOREGROUND)
|
|
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER] Spawned ammo inside outhouse ", iCover)
|
|
sTLGData.sCoverData[iCover].bSpawnedPickup = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF sTLGData.sCoverData[iCover].eType = TLG_ASSET_COFFIN
|
|
IF NOT sTLGData.sCoverData[iCover].bSpawnedPickup
|
|
IF sTLGData.sCoverData[iCover].iHitCount > 0
|
|
// sTLGData.sCoverData[iCover].bSpawnedPickup = TRUE
|
|
vPickupLoc = sTLGData.sCoverData[iCover].vSpritePos
|
|
vPickupLoc.x += cfTLG_PICKUP_COFFIN_OFFSET_X
|
|
vPickupLoc.y += cfTLG_PICKUP_COFFIN_OFFSET_Y
|
|
|
|
// N.B Pickups in foreground lane (i.e. those in coffins / outhouses) wil not warp, and will vanish when off screne
|
|
|
|
iRandom = GET_RANDOM_INT_IN_RANGE(0, 8)
|
|
|
|
//-- If we're stopping on screen 2 in the graveyard level, want to force either a gatling gun pickup or a health
|
|
//-- pickup
|
|
IF TLG_GET_CURRENT_LEVEL() = TLG_LEVEL_GRAVEYARD
|
|
IF TLG_IS_LEVEL_STOPPED()
|
|
OR TLG_IS_MOVING_LEVEL_ABOUT_TO_STOP()
|
|
iPlaced = TLG_GET_NUMBER_OF_PICKUPS_PLACED_INSIDE_COFFINS_FOR_CURRENT_SCREEN()
|
|
IF iPlaced = 0
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER] Graveyard level - stopped - haven't placed any pickups inside coffin forcing gatling gun")
|
|
iRandom = 8
|
|
ELIF iPlaced = 1
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER] Graveyard level - stopped - placed 1 pickupinside coffin forcing health")
|
|
iRandom = 5
|
|
ELSE
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER] Placed too many inside coffin - iPlaced: ", iPlaced)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH iRandom
|
|
CASE 0 TLG_ADD_ITEM_TO_LIST(vPickupLoc, TLG_RIFLE_AMMO, ciTLG_LANE_FOREGROUND, DEFAULT, 0.75) BREAK
|
|
CASE 1 TLG_ADD_ITEM_TO_LIST(vPickupLoc, TLG_SHOTGUN_AMMO, ciTLG_LANE_FOREGROUND, DEFAULT, 0.75) BREAK
|
|
CASE 2 TLG_ADD_ITEM_TO_LIST(vPickupLoc, TLG_REVOLVER_AMMO, ciTLG_LANE_FOREGROUND, DEFAULT, 0.75) BREAK
|
|
CASE 3 TLG_ADD_ITEM_TO_LIST(vPickupLoc, TLG_HEALTH, ciTLG_LANE_FOREGROUND, DEFAULT, 0.75) BREAK
|
|
CASE 4 TLG_ADD_ITEM_TO_LIST(vPickupLoc, TLG_SHERIFF, ciTLG_LANE_FOREGROUND, DEFAULT, 0.75) BREAK
|
|
CASE 5 TLG_ADD_ITEM_TO_LIST(vPickupLoc, TLG_SNAKE_OIL, ciTLG_LANE_FOREGROUND, DEFAULT, 0.75) BREAK
|
|
CASE 8 TLG_ADD_ITEM_TO_LIST(vPickupLoc, TLG_MACHINE_GUN_AMMO, ciTLG_LANE_FOREGROUND, DEFAULT, 0.75) BREAK
|
|
ENDSWITCH
|
|
|
|
|
|
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER] Spawned ammo inside outhouse ", iCover)
|
|
sTLGData.sCoverData[iCover].bSpawnedPickup = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
TLG_PLAY_AUDIO_FOR_SHOT_COVER(iCover)
|
|
|
|
bProcessedThisFrame = TRUE
|
|
ENDPROC
|
|
|
|
FUNC INT TLG_GET_AMOUNT_ENEMY_HAS_BEEN_DAMAGED(INT iEnemy, BOOL bHeadshot)
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [TLG_GET_AMOUNT_ENEMY_HAS_BEEN_DAMAGED] {dsw} ")
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [TLG_GET_AMOUNT_ENEMY_HAS_BEEN_DAMAGED] {dsw} Enemy ", iEnemy, " Shot at least once. Lane: ", sTLGData.sEnemyData[iEnemy].iEnemyLane, " Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[iEnemy].iEnemyType), " Headshot? ", bHeadshot)
|
|
#ENDIF
|
|
|
|
INT iBaseDamage
|
|
INT iRand
|
|
IF bHeadshot
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [TLG_GET_AMOUNT_ENEMY_HAS_BEEN_DAMAGED] {dsw} was headshot. Damage: ", TLG_GET_ENEMY_START_HEALTH_FOR_TYPE(sTLGData.sEnemyData[iEnemy].iEnemyType))
|
|
RETURN TLG_GET_ENEMY_START_HEALTH_FOR_TYPE(sTLGData.sEnemyData[iEnemy].iEnemyType)
|
|
ENDIF
|
|
|
|
IF sTLGData.sEnemyData[iEnemy].iEnemyType = TLG_OUTHOUSE_ENEMY
|
|
OR sTLGData.sEnemyData[iEnemy].iEnemyType = TLG_COFFIN_ENEMY
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [TLG_GET_AMOUNT_ENEMY_HAS_BEEN_DAMAGED] {dsw} Coffinb / outhouse enemy. Damage: ", TLG_GET_ENEMY_START_HEALTH_FOR_TYPE(sTLGData.sEnemyData[iEnemy].iEnemyType))
|
|
RETURN TLG_GET_ENEMY_START_HEALTH_FOR_TYPE(sTLGData.sEnemyData[iEnemy].iEnemyType)
|
|
ENDIF
|
|
|
|
IF sTLGData.sEnemyData[iEnemy].iEnemyLane = ciTLG_LANE_FOREGROUND
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [TLG_GET_AMOUNT_ENEMY_HAS_BEEN_DAMAGED] {dsw} Foreground enemy. Damage: ", TLG_GET_ENEMY_START_HEALTH_FOR_TYPE(sTLGData.sEnemyData[iEnemy].iEnemyType))
|
|
RETURN TLG_GET_ENEMY_START_HEALTH_FOR_TYPE(sTLGData.sEnemyData[iEnemy].iEnemyType)
|
|
ENDIF
|
|
|
|
TLG_PLAYER_WEAPON weapon = TLG_GET_PLAYER_CURRENT_WEAPON()
|
|
TLG_PLAYER_WEAPON_DATA data = TLG_GET_PLAYER_WEAPON_DATA(weapon)
|
|
iBaseDamage = data.iMinDamagePerShot
|
|
|
|
IF sTLGData.sPlayerData[0].weaponType = TLG_PLAYER_WEAPON_TYPE_DEFAULT
|
|
iRand = GET_RANDOM_INT_IN_RANGE(0, 4)
|
|
iBaseDamage += iRand
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [TLG_GET_AMOUNT_ENEMY_HAS_BEEN_DAMAGED] {dsw} Player has pistol. Damage: ", iBaseDamage)
|
|
RETURN iBaseDamage
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [TLG_GET_AMOUNT_ENEMY_HAS_BEEN_DAMAGED] {dsw} Player has weapon: ", TLG_GET_PLAYER_WEAPON_AS_STRING(weapon), " Returning: ", data.iMinDamagePerShot)
|
|
#ENDIF
|
|
|
|
RETURN data.iMinDamagePerShot
|
|
ENDFUNC
|
|
|
|
PROC TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_ENEMY( INT iEnemy, INT iPlayer, INT iProjectile, VECTOR_2D vSpriteTopLeft, VECTOR_2D vBulletPos )
|
|
BOOL bHeadshot
|
|
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].bHit = TRUE
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].iTimeOfHit = GET_GAME_TIMER()
|
|
|
|
IF NOT sTLGData.sEnemyData[iEnemy].bShotAtLeastOnce
|
|
sTLGData.sEnemyData[iEnemy].bShotAtLeastOnce = TRUE
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_ENEMY] {dsw} Enemy ", iEnemy, " Shot at least once. Lane: ", sTLGData.sEnemyData[iEnemy].iEnemyLane, " Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[iEnemy].iEnemyType))
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
IF sTLGData.sEnemyData[iEnemy].iEnemyType != TLG_OUTHOUSE_ENEMY
|
|
AND sTLGData.sEnemyData[iEnemy].iEnemyType != TLG_COFFIN_ENEMY
|
|
bHeadshot = TLG_CHECK_FOR_HEADSHOT( vSpriteTopLeft, vBulletPos, sTLGData.sEnemyData[iEnemy].iEnemyLane, sTLGData.sEnemyData[iEnemy].iEnemyType )
|
|
sTLGData.sEnemyData[iEnemy].iHealth -= TLG_GET_AMOUNT_ENEMY_HAS_BEEN_DAMAGED(iEnemy, bHeadshot)
|
|
IF sTLGData.sEnemyData[iEnemy].iHealth > 0
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_BULLET_HIT_BODY, sTLGData.sEnemyData[iEnemy].vSpritePos)
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_ENEMY_INJURED, sTLGData.sEnemyData[iEnemy].vSpritePos)
|
|
TLG_INCREASE_ENEMY_HIT_COUNT_FOR_CURRENT_LEVEL()
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Enemy ", iEnemy, " Has been injured. New Health: ", sTLGData.sEnemyData[iEnemy].iHealth, " Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[iEnemy].iEnemyType))
|
|
#ENDIF
|
|
ELSE
|
|
|
|
IF bHeadshot
|
|
AND NOT TLG_IS_BEAR(iEnemy)
|
|
IF NOT TLG_IS_HELP_TEXT_BIT_SET(TLG_HELP_TEXT_BIT_AT_LEAST_ONE_HEADSHOT)
|
|
TLG_SET_HELP_TEXT_BIT(TLG_HELP_TEXT_BIT_AT_LEAST_ONE_HEADSHOT)
|
|
ENDIF
|
|
TLG_ADD_TO_LOCAL_PLAYER_SCORE( TLG_SCORE_TYPE_ENEMY_HEADSHOT )
|
|
TLG_INCREASE_ENEMY_HEADSHOT_COUNT_FOR_CURRENT_LEVEL()
|
|
TLG_INCREASE_ENEMY_HIT_COUNT_FOR_CURRENT_LEVEL()
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_SHOOT_HEADSHOT)
|
|
ELSE
|
|
TLG_ADD_TO_LOCAL_PLAYER_SCORE( TLG_SCORE_TYPE_ENEMY )
|
|
TLG_INCREASE_ENEMY_HIT_COUNT_FOR_CURRENT_LEVEL()
|
|
ENDIF
|
|
|
|
IF sTLGData.sEnemyData[iEnemy].iEnemyType = TLG_CART_1
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_EXP_CART, sTLGData.sEnemyData[iEnemy].vSpritePos)
|
|
ELIF TLG_IS_BEAR(iEnemy)
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_BEAR_DEATH, sTLGData.sEnemyData[iEnemy].vSpritePos)
|
|
ELSE
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_BULLET_HIT_BODY, sTLGData.sEnemyData[iEnemy].vSpritePos)
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_ENEMY_DEAD, sTLGData.sEnemyData[iEnemy].vSpritePos)
|
|
ENDIF
|
|
sTLGData.sEnemyData[iEnemy].eState = TLG_DYING
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Enemy ", iEnemy, " set as Dying as iHealth <= 0. Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[iEnemy].iEnemyType))
|
|
#ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT sTLGData.sEnemyData[iEnemy].bOuthouseAudio
|
|
IF sTLGData.sEnemyData[iEnemy].iEnemyType = TLG_OUTHOUSE_ENEMY
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_PLAYER_SHOOT_OUTHOUSE, sTLGData.sEnemyData[iEnemy].vSpritePos)
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_BULLET_HIT_FART, sTLGData.sEnemyData[iEnemy].vSpritePos)
|
|
ELIF sTLGData.sEnemyData[iEnemy].iEnemyType = TLG_COFFIN_ENEMY
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_SHOOT_COFFIN)
|
|
ENDIF
|
|
sTLGData.sEnemyData[iEnemy].bOuthouseAudio = TRUE
|
|
ENDIF
|
|
|
|
//-- Need to handle enemies hiding in outhouses differently
|
|
IF sTLGData.sEnemyData[iEnemy].iSpriteAnimFrame = ciTLG_MAX_OUTHOUSE_ENEMY_ANIM_FRAMES - 2
|
|
sTLGData.sEnemyData[iEnemy].iHealth -= 10
|
|
bHeadshot = TLG_CHECK_FOR_HEADSHOT( vSpriteTopLeft, vBulletPos, sTLGData.sEnemyData[iEnemy].iEnemyLane, sTLGData.sEnemyData[iEnemy].iEnemyType )
|
|
IF bHeadshot
|
|
TLG_ADD_TO_LOCAL_PLAYER_SCORE( TLG_SCORE_TYPE_ENEMY_HEADSHOT )
|
|
TLG_INCREASE_ENEMY_HIT_COUNT_FOR_CURRENT_LEVEL()
|
|
TLG_INCREASE_ENEMY_HEADSHOT_COUNT_FOR_CURRENT_LEVEL()
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_SHOOT_HEADSHOT)
|
|
ELSE
|
|
TLG_ADD_TO_LOCAL_PLAYER_SCORE( TLG_SCORE_TYPE_ENEMY )
|
|
TLG_INCREASE_ENEMY_HIT_COUNT_FOR_CURRENT_LEVEL()
|
|
ENDIF
|
|
IF sTLGData.sEnemyData[iEnemy].iHealth <= 0
|
|
sTLGData.sEnemyData[iEnemy].eState = TLG_DYING
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} OUTHOUSE Enemy ", iEnemy, " set as Dying as iHealth <= 0. Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[iEnemy].iEnemyType))
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_HOSTAGE( INT iHostage, INT iPlayer, INT iProjectile, BOOL &bProcessedThisFrame )
|
|
IF bProcessedThisFrame
|
|
EXIT
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_HOSTAGE] {dsw} Hit hostage", iHostage, " Type: ", TLG_GET_HOSTAGE_TYPE_AS_STRING(sTLGData.sHostageData[iHostage].eHostageType))
|
|
#ENDIF
|
|
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].bHit = TRUE
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].iTimeOfHit = GET_GAME_TIMER()
|
|
|
|
sTLGData.sHostageData[iHostage].iHealth -= 10
|
|
|
|
IF NOT sTLGData.sHostageData[iHostage].bDying = TRUE
|
|
IF sTLGData.sHostageData[iHostage].iHealth <= 0
|
|
sTLGData.sHostageData[iHostage].bDying = TRUE
|
|
|
|
TLG_PLAY_HOSTAGE_DEAD_AUDIO(sTLGData.sHostageData[iHostage].eHostageType, sTLGData.sHostageData[iHostage].vSpritePos)
|
|
|
|
IF sTLGData.sHostageData[iHostage].eHostageType = TLG_EAGLE
|
|
OR sTLGData.sHostageData[iHostage].eHostageType = TLG_VULTURE
|
|
TLG_INCREASE_BIRDS_SHOT_COUNT_FOR_CURRENT_LEVEL()
|
|
TLG_ADD_TO_LOCAL_PLAYER_SCORE(TLG_SCORE_TYPE_ANIMAL)
|
|
TWS_CREATE_FX( sTLGData.sHostageData[iHostage].vSpritePos, TLG_FX_FEATHERS, 0)
|
|
ELIF sTLGData.sHostageData[iHostage].eHostageType = TLG_BAT
|
|
TLG_INCREASE_BIRDS_SHOT_COUNT_FOR_CURRENT_LEVEL()
|
|
TLG_ADD_TO_LOCAL_PLAYER_SCORE(TLG_SCORE_TYPE_ANIMAL)
|
|
|
|
ELIF sTLGData.sHostageData[iHostage].eHostageType = TLG_BAT
|
|
OR sTLGData.sHostageData[iHostage].eHostageType = TLG_MOUSE
|
|
OR sTLGData.sHostageData[iHostage].eHostageType = TLG_SCORPION
|
|
TLG_ADD_TO_LOCAL_PLAYER_SCORE(TLG_SCORE_TYPE_ANIMAL)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
bProcessedThisFrame = TRUE
|
|
ENDPROC
|
|
|
|
PROC TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_ITEM( INT iItem, INT iPlayer, INT iProjectile,BOOL &bProcessedThisFrame )
|
|
IF bProcessedThisFrame
|
|
EXIT
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_ITEM] {dsw} Hit item", iItem, " Type: ", TLG_GET_COLLECTIBLE_TYPE_AS_STRING(sTLGData.sItemData[iItem].eItemType))
|
|
#ENDIF
|
|
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].bHit = TRUE
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].iTimeOfHit = GET_GAME_TIMER()
|
|
|
|
sTLGData.sItemData[iItem].bShot = TRUE
|
|
|
|
TLG_ACTIVATE_ITEM(iItem)
|
|
|
|
bProcessedThisFrame = TRUE
|
|
ENDPROC
|
|
|
|
PROC TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_THROWN_WEAPON( INT iWeapon, INT iPlayer, INT iProjectile , BOOL &bProcessedThisFrame)
|
|
IF bProcessedThisFrame
|
|
EXIT
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_THROWN_WEAPON] {dsw} Hit thrown weapon ", iWeapon, " Type: ", TLG_GET_ENEMY_THROWN_PROJECTILE_TYPE_AS_STRING(sTLGData.sEnemyProjectiles[iWeapon].eType))
|
|
#ENDIF
|
|
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].bHit = TRUE
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].iTimeOfHit = GET_GAME_TIMER()
|
|
|
|
sTLGData.sEnemyProjectiles[iWeapon].eState = TLG_ENEMY_PROJECTILE_STATE_EXPLODE
|
|
TWS_CREATE_FX(sTLGData.sEnemyProjectiles[iWeapon].vSpritePos, TLG_FX_ENEMY_TNT_EXP, 1)
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 20)
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_EXP_DYNAMITE, sTLGData.sEnemyProjectiles[iWeapon].vSpritePos)
|
|
|
|
//TLG_KILL_ALL_ENEMIES_IN_AREA(sTLGData.sEnemyProjectiles[iWeapon].vSpritePos, INIT_VECTOR_2D(cfTLG_SPRITE_ENEMY_THROWN_EXPLOSION_LARGE_WIDTH, cfTLG_SPRITE_ENEMY_THROWN_EXPLOSION_LARGE_HEIGHT), 2.0)
|
|
TLG_KILL_ALL_ENEMIES_IN_RANGE(sTLGData.sEnemyProjectiles[iWeapon].vSpritePos)
|
|
|
|
bProcessedThisFrame = TRUE
|
|
ENDPROC
|
|
|
|
|
|
PROC HANDLE_PLAYER_BULLET_COLLISION(INT iPlayer, INT iProjectile)
|
|
|
|
IF NOT sTLGData.sPlayerData[iPlayer].bHasJustShot
|
|
EXIT
|
|
ENDIF
|
|
|
|
|
|
INT i
|
|
TLG_PLAYER_WEAPON_DATA weaponData
|
|
weaponData = TLG_GET_PLAYER_WEAPON_DATA(TLG_GET_PLAYER_CURRENT_WEAPON())
|
|
|
|
FLOAT fSpreadModifier = weaponData.fSpreadModifier
|
|
|
|
INT iMaxEnemyImpacts = weaponData.iMaxEnemyImpacts
|
|
|
|
|
|
FLOAT fDistance, fDistanceX, fDistanceY, x1, x2, y1, y2 // Top-left & Bottom-right corners of collision
|
|
VECTOR_2D vBulletPos = INIT_VECTOR_2D(sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.X, sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.Y)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] Called. Player Weapon: ", TLG_GET_PLAYER_WEAPON_AS_STRING(TLG_GET_PLAYER_CURRENT_WEAPON()), " Bullet Pos: ", vBulletPos.x, ", ", vBulletPos.y)
|
|
#ENDIF
|
|
|
|
BOOL bHitSomething = FALSE
|
|
|
|
INT iEnemyHit[ciTLG_MAX_ENEMY_SHOT_AT_ONCE]
|
|
INT iCurrentNumberOfEnemyHit = 0
|
|
|
|
FOR i = 0 TO ciTLG_MAX_ENEMY_SHOT_AT_ONCE -1
|
|
iEnemyHit[i] = -1
|
|
ENDFOR
|
|
|
|
INT iCoverHit = -1
|
|
INT iHostageHit = -1
|
|
INT iItemHit = -1
|
|
INT iThrownHit = -1
|
|
|
|
FLOAT fModifier
|
|
FLOAT fWidth
|
|
FLOAT fHeight
|
|
FOR i = 0 TO ciTLG_MAX_COVER -1
|
|
|
|
IF sTLGData.sCoverData[i].bRendering
|
|
fModifier = TLG_GET_COVER_SIZE_MODIFIER_FOR_COLLISION_CHECK(sTLGData.sCoverData[i].eType)
|
|
fWidth = sTLGData.sCoverData[i].fCoverWidth * fModifier
|
|
fHeight = sTLGData.sCoverData[i].fCoverHeight * fModifier
|
|
|
|
x1 = sTLGData.sCoverData[i].vSpritePos.x - (fWidth/2)
|
|
y1 = sTLGData.sCoverData[i].vSpritePos.y - (fHeight/2)
|
|
|
|
x2 = sTLGData.sCoverData[i].vSpritePos.x + (fWidth/2)
|
|
y2 = sTLGData.sCoverData[i].vSpritePos.y + (fHeight/2)
|
|
|
|
IF (sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.X > x1 AND sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.X < x2
|
|
AND sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.Y > y1 AND sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.Y < y2)
|
|
IF iCoverHit = -1
|
|
OR sTLGData.sCoverData[i].iCoverLane > sTLGData.sCoverData[iCoverHit].iCoverLane
|
|
OR (sTLGData.sCoverData[i].bIsSpecialCover AND NOT sTLGData.sCoverData[iCoverHit].bIsSpecialCover)
|
|
OR (sTLGData.sCoverData[i].bIsAnimated AND NOT sTLGData.sCoverData[iCoverHit].bIsAnimated)
|
|
bHitSomething = TRUE
|
|
iCoverHit = i
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Potential Cover hit: ",i, " Lane: ", sTLGData.sCoverData[i].iCoverLane, " Type: ", TLG_GET_ASSET_TYPE_AS_STRING(sTLGData.sCoverData[i].eType), " Modifier: ", fModifier)
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Potential Cover hit: ",i, " Bullet: ",vBulletPos.x, ", ", vBulletPos.y, " Point1: ", x1, ", ", y1, " Point 2: ",x2, ", ", y2)
|
|
#ENDIF
|
|
// TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER(i,iPlayer, iProjectile )
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
BOOL bBulletHitEnemyCoordCheck
|
|
FLOAT fSpreadDistanceX
|
|
FLOAT fSpreadDistanceY
|
|
FOR i = 0 TO ciTLG_MAX_ENEMIES -1
|
|
|
|
bBulletHitEnemyCoordCheck = FALSE
|
|
IF sTLGData.sEnemyData[i].eState = TLG_SHOOTING
|
|
OR sTLGData.sEnemyData[i].eState = TLG_ACTIVE
|
|
IF sTLGData.sEnemyData[i].iHealth > 0
|
|
|
|
x1 = sTLGData.sEnemyData[i].vSpritePos.x - (sTLGData.sEnemyData[i].vSize.x/2)
|
|
y1 = sTLGData.sEnemyData[i].vSpritePos.y - (sTLGData.sEnemyData[i].vSize.y/2)
|
|
|
|
x2 = sTLGData.sEnemyData[i].vSpritePos.x + (sTLGData.sEnemyData[i].vSize.x/2)
|
|
y2 = sTLGData.sEnemyData[i].vSpritePos.y + (sTLGData.sEnemyData[i].vSize.y/2)
|
|
|
|
IF fSpreadModifier = 1.0
|
|
IF (vBulletPos.X > x1 AND vBulletPos.X < x2
|
|
AND vBulletPos.Y > y1 AND vBulletPos.Y < y2)
|
|
bBulletHitEnemyCoordCheck = TRUE
|
|
ENDIF
|
|
ELSE
|
|
fSpreadDistanceX = sTLGData.sEnemyData[i].vSpritePos.x - vBulletPos.X
|
|
fSpreadDistanceY = sTLGData.sEnemyData[i].vSpritePos.Y - vBulletPos.Y
|
|
IF ((fSpreadDistanceX * fSpreadDistanceX) + (fSpreadDistanceY * fSpreadDistanceY ) < (fSpreadModifier * fSpreadModifier))
|
|
bBulletHitEnemyCoordCheck = TRUE
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Potential Enemy SPREAD hit: ",i, " fSpreadModifier: ", fSpreadModifier, " Current weapon: ", TLG_GET_PLAYER_WEAPON_AS_STRING(TLG_GET_PLAYER_CURRENT_WEAPON()))
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bBulletHitEnemyCoordCheck
|
|
IF iMaxEnemyImpacts = 1
|
|
IF iEnemyHit[iCurrentNumberOfEnemyHit] = -1
|
|
OR sTLGData.sEnemyData[i].iEnemyLane > sTLGData.sEnemyData[iEnemyHit[iCurrentNumberOfEnemyHit]].iEnemyLane
|
|
OR sTLGData.sEnemyData[iEnemyHit[iCurrentNumberOfEnemyHit]].iEnemyType = TLG_OUTHOUSE_ENEMY // update to enemy in front of enemy in outshouse
|
|
OR sTLGData.sEnemyData[iEnemyHit[iCurrentNumberOfEnemyHit]].iEnemyType = TLG_COFFIN_ENEMY
|
|
bHitSomething = TRUE
|
|
iEnemyHit[iCurrentNumberOfEnemyHit] = i
|
|
iCurrentNumberOfEnemyHit++
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Potential Enemy hit: ",i, " Lane: ", sTLGData.sEnemyData[i].iEnemyLane, " Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[i].iEnemyType))
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Potential Enemy hit: ",i, " Bullet: ",vBulletPos.x, ", ", vBulletPos.y, " Point1: ", x1, ", ", y1, " Point2: ",x2, ", ", y2)
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Number of Potential Enemy hits: ", iCurrentNumberOfEnemyHit, " Max with weapon: ", iMaxEnemyImpacts, " Weapon: ", TLG_GET_PLAYER_WEAPON_AS_STRING(TLG_GET_PLAYER_CURRENT_WEAPON()))
|
|
#ENDIF
|
|
// TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_ENEMY(i,iPlayer, iProjectile, INIT_VECTOR_2D(x1, y1), vBulletPos )
|
|
ENDIF
|
|
ELSE
|
|
IF iCurrentNumberOfEnemyHit < iMaxEnemyImpacts
|
|
IF iEnemyHit[iCurrentNumberOfEnemyHit] = -1
|
|
bHitSomething = TRUE
|
|
iEnemyHit[iCurrentNumberOfEnemyHit] = i
|
|
iCurrentNumberOfEnemyHit++
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Potential Enemy hit: ",i, " Lane: ", sTLGData.sEnemyData[i].iEnemyLane, " Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[i].iEnemyType))
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Potential Enemy hit: ",i, " Bullet: ",vBulletPos.x, ", ", vBulletPos.y, " Point1: ", x1, ", ", y1, " Point2: ",x2, ", ", y2)
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Number of Potential Enemy hits: ", iCurrentNumberOfEnemyHit, " Max with weapon: ", iMaxEnemyImpacts, " Weapon: ", TLG_GET_PLAYER_WEAPON_AS_STRING(TLG_GET_PLAYER_CURRENT_WEAPON()))
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO ciTLG_MAX_HOSTAGES -1
|
|
|
|
IF sTLGData.sHostageData[i].iHealth > 0
|
|
x1 = sTLGData.sHostageData[i].vSpritePos.x - (sTLGData.sHostageData[i].vSize.x/2)
|
|
y1 = sTLGData.sHostageData[i].vSpritePos.y - (sTLGData.sHostageData[i].vSize.y/2)
|
|
|
|
x2 = sTLGData.sHostageData[i].vSpritePos.x + (sTLGData.sHostageData[i].vSize.x/2)
|
|
y2 = sTLGData.sHostageData[i].vSpritePos.y + (sTLGData.sHostageData[i].vSize.y/2)
|
|
|
|
IF (sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.X > x1 AND sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.X < x2
|
|
AND sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.Y > y1 AND sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.Y < y2)
|
|
IF iHostageHit = -1
|
|
OR sTLGData.sHostageData[i].iHostageLane > sTLGData.sHostageData[iHostageHit].iHostageLane
|
|
// TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_HOSTAGE(i,iPlayer, iProjectile )
|
|
iHostageHit = i
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Potential Hostage hit: ",i, " Lane: ", sTLGData.sHostageData[i].iHostageLane, " Type: ", TLG_GET_HOSTAGE_TYPE_AS_STRING(sTLGData.sHostageData[i].eHostageType))
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO ciTLG_MAX_ITEMS -1
|
|
|
|
IF NOT sTLGData.sItemData[i].bShot
|
|
IF sTLGData.sItemData[i].bRendering
|
|
fDistanceX = sTLGData.sPlayerData[iPlayer].vSpriteMarkerPos.x - sTLGData.sItemData[i].vSpritePos.x
|
|
fDistanceY = sTLGData.sPlayerData[iPlayer].vSpriteMarkerPos.y - sTLGData.sItemData[i].vSpritePos.y
|
|
fDistance = SQRT(fDistanceX * fDistanceX + fDistanceY * fDistanceY)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Checking item: ", i, " Type: ", TLG_GET_COLLECTIBLE_TYPE_AS_STRING(sTLGData.sItemData[i].eItemType), " Pos: ", sTLGData.sItemData[i].vSpritePos.x, ", ", sTLGData.sItemData[i].vSpritePos.y, " Rendering: ", sTLGData.sItemData[i].bRendering, " Dist from bullet : ", fDistance)
|
|
#ENDIF
|
|
|
|
IF fDistance < 60
|
|
IF iItemHit = -1
|
|
OR sTLGData.sItemData[i].iLane > sTLGData.sItemData[iItemHit].iLane
|
|
// TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_ITEM(i,iPlayer, iProjectile )
|
|
iItemHit = i
|
|
bHitSomething = TRUE
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Potential Item hit: ",i, " Lane: ", sTLGData.sItemData[i].iLane, " Type: ", TLG_GET_COLLECTIBLE_TYPE_AS_STRING(sTLGData.sItemData[i].eItemType))
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Not checking item as bShot Item: ",i, " Lane: ", sTLGData.sItemData[i].iLane, " Type: ", TLG_GET_COLLECTIBLE_TYPE_AS_STRING(sTLGData.sItemData[i].eItemType), " Pos: ", sTLGData.sItemData[i].vSpritePos.x, ", ", sTLGData.sItemData[i].vSpritePos.y)
|
|
#ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
VECTOR_2D v2ProjSize
|
|
FOR i = 0 TO ciTLG_MAX_ENEMY_PROJECTILES -1
|
|
IF sTLGData.sEnemyProjectiles[i].eType = TLG_ENEMY_PROJECTILE_DYNAMITE
|
|
IF sTLGData.sEnemyProjectiles[i].eState = TLG_ENEMY_PROJECTILE_STATE_AIRBORNE
|
|
SWITCH sTLGData.sEnemyProjectiles[i].iSpriteAnimFrame
|
|
CASE 0 v2ProjSize = INIT_VECTOR_2D(ciTLG_DYNAMITE_SMALL_WIDTH, ciTLG_DYNAMITE_SMALL_HEIGHT) BREAK
|
|
CASE 1 v2ProjSize = INIT_VECTOR_2D(ciTLG_DYNAMITE_SMALL_WIDTH, ciTLG_DYNAMITE_SMALL_HEIGHT) BREAK
|
|
CASE 2 v2ProjSize = INIT_VECTOR_2D(ciTLG_DYNAMITE_MEDIUM_WIDTH, ciTLG_DYNAMITE_MEDIUM_HEIGHT) BREAK
|
|
CASE 3 v2ProjSize = INIT_VECTOR_2D(ciTLG_DYNAMITE_MEDIUM_WIDTH, ciTLG_DYNAMITE_MEDIUM_HEIGHT) BREAK
|
|
CASE 4 v2ProjSize = INIT_VECTOR_2D(ciTLG_DYNAMITE_LARGE_WIDTH, ciTLG_DYNAMITE_LARGE_HEIGHT) BREAK
|
|
CASE 5 v2ProjSize = INIT_VECTOR_2D(ciTLG_DYNAMITE_LARGE_WIDTH, ciTLG_DYNAMITE_LARGE_HEIGHT) BREAK
|
|
ENDSWITCH
|
|
|
|
x1 = sTLGData.sEnemyProjectiles[i].vSpritePos.x - (v2ProjSize.x/2)
|
|
y1 = sTLGData.sEnemyProjectiles[i].vSpritePos.y - (v2ProjSize.y/2)
|
|
|
|
x2 = sTLGData.sEnemyProjectiles[i].vSpritePos.x + (v2ProjSize.x/2)
|
|
y2 = sTLGData.sEnemyProjectiles[i].vSpritePos.y + (v2ProjSize.y/2)
|
|
|
|
IF (sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.X > x1 AND sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.X < x2
|
|
AND sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.Y > y1 AND sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.Y < y2)
|
|
IF iThrownHit = -1
|
|
// TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_THROWN_WEAPON(i, iPlayer, iProjectile)
|
|
iThrownHit = i
|
|
bHitSomething = TRUE
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Potential thrown weapon hit: ",i, " Lane: ", sTLGData.sEnemyProjectiles[i].iLane, " Type: ", TLG_GET_ENEMY_THROWN_PROJECTILE_TYPE_AS_STRING(sTLGData.sEnemyProjectiles[i].eType))
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
|
|
|
|
//-- Figure out what we actually hit.
|
|
|
|
|
|
IF iThrownHit = -1 AND iCoverHit = -1 AND iItemHit = -1 AND iEnemyHit[0] = -1 AND iHostageHit = -1
|
|
//-- Didn't hit anything
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_BULLET_HIT_GENERIC, vBulletPos)
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION]")
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Something's been shot....")
|
|
IF iThrownHit = -1
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} iThrownHit: ", iThrownHit)
|
|
ELSE
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} iThrownHit: ", iThrownHit, " Lane: N/A Type: ", TLG_GET_ENEMY_THROWN_PROJECTILE_TYPE_AS_STRING(sTLGData.sEnemyProjectiles[iThrownHit].eType))
|
|
ENDIF
|
|
|
|
IF iCoverHit = -1
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} iCoverHit: ", iCoverHit)
|
|
ELSE
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} iCoverHit: ", iCoverHit, " Lane: ", sTLGData.sCoverData[iCoverHit].iCoverLane, " Type: ", TLG_GET_ASSET_TYPE_AS_STRING(sTLGData.sCoverData[iCoverHit].eType))
|
|
ENDIF
|
|
|
|
IF iItemHit = -1
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} iItemHit: ", iItemHit)
|
|
ELSE
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} iItemHit: ", iItemHit, " Lane: ", sTLGData.sItemData[iItemHit].iLane, " Type: ", TLG_GET_COLLECTIBLE_TYPE_AS_STRING(sTLGData.sItemData[iItemHit].eItemType))
|
|
ENDIF
|
|
|
|
i = 0
|
|
FOR i = 0 TO iCurrentNumberOfEnemyHit - 1
|
|
IF iEnemyHit[i] = -1
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} iEnemyHit[", i, "]: ", iEnemyHit[i])
|
|
ELSE
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} iEnemyHit[", i, "]: ", iEnemyHit[i], " Lane: ", sTLGData.sEnemyData[iEnemyHit[i]].iEnemyLane, " Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[iEnemyHit[i]].iEnemyType))
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
IF iHostageHit = -1
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} iHostageHit: ", iHostageHit)
|
|
ELSE
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} iHostageHit: ", iHostageHit, " Lane: ", sTLGData.sHostageData[iHostageHit].iHostageLane, " Type: ", TLG_GET_HOSTAGE_TYPE_AS_STRING(sTLGData.sHostageData[iHostageHit].eHostageType))
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION]")
|
|
|
|
#ENDIF
|
|
|
|
BOOL bProcessedHitCoverThisFrame = FALSE
|
|
BOOL bProcessedHitItemsThisFrame = FALSE
|
|
BOOL bProcessedHitHostagesThisFrame = FALSE
|
|
BOOL bProcessedHitThrownObjectsThisFrame = FALSE
|
|
i = 0
|
|
|
|
|
|
// For any given lane, Cover > Items > Enemy > Hostages
|
|
|
|
IF iThrownHit >= 0
|
|
//-- Hit thrown explosive
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_THROWN_WEAPON(iThrownHit, iPlayer, iProjectile, bProcessedHitThrownObjectsThisFrame)
|
|
ENDIF
|
|
|
|
IF iCurrentNumberOfEnemyHit = 0
|
|
iCurrentNumberOfEnemyHit = 1
|
|
ENDIF
|
|
|
|
|
|
FOR i = 0 TO iCurrentNumberOfEnemyHit - 1
|
|
|
|
|
|
//-- If we've hit a foreground enemy, go with that
|
|
IF iEnemyHit[i] > -1 AND sTLGData.sEnemyData[iEnemyHit[i]].iEnemyLane = ciTLG_LANE_FOREGROUND
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_ENEMY(iEnemyHit[i], iPlayer, iProjectile, INIT_VECTOR_2D(sTLGData.sEnemyData[iEnemyHit[i]].vSpritePos.x - (sTLGData.sEnemyData[iEnemyHit[i]].vSize.x/2), sTLGData.sEnemyData[iEnemyHit[i]].vSpritePos.y - (sTLGData.sEnemyData[iEnemyHit[i]].vSize.y/2)), vBulletPos)
|
|
ELIF iHostageHit > -1 AND sTLGData.sHostageData[iHostageHit].iHostageLane = ciTLG_LANE_FOREGROUND
|
|
//-- Hit a mouse or a scorpion - go with that
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_HOSTAGE(iHostageHit,iPlayer, iProjectile, bProcessedHitHostagesThisFrame )
|
|
ELIF iItemHit > -1 AND sTLGData.sItemData[iItemHit].iLane = ciTLG_LANE_FOREGROUND
|
|
//-- Hit a foreground item - generally a pickup hidden in an out house
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_ITEM(iItemHit,iPlayer, iProjectile, bProcessedHitItemsThisFrame )
|
|
ELIF iEnemyHit[i] > -1 AND sTLGData.sEnemyData[iEnemyHit[i]].bIsPopup
|
|
//-- Enemy peds that 'pop up' behind buildings can always be hit
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_ENEMY(iEnemyHit[i], iPlayer, iProjectile, INIT_VECTOR_2D(sTLGData.sEnemyData[iEnemyHit[i]].vSpritePos.x - (sTLGData.sEnemyData[iEnemyHit[i]].vSize.x/2), sTLGData.sEnemyData[iEnemyHit[i]].vSpritePos.y - (sTLGData.sEnemyData[iEnemyHit[i]].vSize.y/2)), vBulletPos)
|
|
ELSE
|
|
IF iCoverHit > -1
|
|
IF sTLGData.sCoverData[iCoverHit].iCoverLane = ciTLG_LANE_MIDDLE
|
|
AND NOT TLG_CAN_SHOOT_THROUGH_COVER(iCoverHit)
|
|
//-- Hit cover in middle lane
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER(iCoverHit, iPlayer, iProjectile, bProcessedHitCoverThisFrame)
|
|
ELIF sTLGData.sCoverData[iCoverHit].iCoverLane = ciTLG_LANE_BACKGROUND
|
|
OR TLG_CAN_SHOOT_THROUGH_COVER(iCoverHit)
|
|
//-- Background cover hit, check if anything in front of it
|
|
IF iItemHit > -1 AND sTLGData.sItemData[iItemHit].iLane = ciTLG_LANE_MIDDLE
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_ITEM(iItemHit,iPlayer, iProjectile, bProcessedHitItemsThisFrame )
|
|
ELIF iEnemyHit[i] > -1 AND ( sTLGData.sEnemyData[iEnemyHit[i]].iEnemyLane = ciTLG_LANE_MIDDLE OR TLG_CAN_SHOOT_THROUGH_COVER(iCoverHit))
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_ENEMY(iEnemyHit[i], iPlayer, iProjectile, INIT_VECTOR_2D(sTLGData.sEnemyData[iEnemyHit[i]].vSpritePos.x - (sTLGData.sEnemyData[iEnemyHit[i]].vSize.x/2), sTLGData.sEnemyData[iEnemyHit[i]].vSpritePos.y - (sTLGData.sEnemyData[iEnemyHit[i]].vSize.y/2)), vBulletPos)
|
|
ELIF iEnemyHit[i] > -1 AND ( sTLGData.sEnemyData[iEnemyHit[i]].iEnemyLane = ciTLG_LANE_BACKGROUND)
|
|
//-- Be generous with peds sticking their heads above cover
|
|
fModifier = TLG_GET_COVER_SIZE_MODIFIER_FOR_COLLISION_CHECK(sTLGData.sCoverData[iCoverHit].eType)
|
|
fHeight = sTLGData.sCoverData[iCoverHit].fCoverHeight * fModifier
|
|
IF sTLGData.sCoverData[iCoverHit].vSpritePos.y - (fHeight /2.0) < (sTLGData.sEnemyData[iEnemyHit[i]].vSpritePos.y + (sTLGData.sEnemyData[iEnemyHit[i]].vSize.y / 2.0))
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Setting Enemy ", iEnemyHit[i], " as hit instead of cover ", iCoverHit, " because...")
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] Cover Y offset ", sTLGData.sCoverData[iCoverHit].vSpritePos.y - (fHeight /2.0), " > Enemy Y offset ", sTLGData.sEnemyData[iEnemyHit[i]].vSpritePos.y - (sTLGData.sEnemyData[iEnemyHit[i]].vSize.y / 2.0))
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_ENEMY(iEnemyHit[i], iPlayer, iProjectile, INIT_VECTOR_2D(sTLGData.sEnemyData[iEnemyHit[i]].vSpritePos.x - (sTLGData.sEnemyData[iEnemyHit[i]].vSize.x/2), sTLGData.sEnemyData[iEnemyHit[i]].vSpritePos.y - (sTLGData.sEnemyData[iEnemyHit[i]].vSize.y/2)), vBulletPos)
|
|
ELSE
|
|
CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Not overriding cover ", iCoverHit, " with Enemy ", iEnemyHit[i], " Val 1 ",sTLGData.sCoverData[iCoverHit].vSpritePos.y - (fHeight /2.0), " > Val 2 ", sTLGData.sEnemyData[iEnemyHit[i]].vSpritePos.y - (sTLGData.sEnemyData[iEnemyHit[i]].vSize.y / 2.0))
|
|
ENDIF
|
|
|
|
ELIF iHostageHit > -1 AND sTLGData.sHostageData[iHostageHit].iHostageLane = ciTLG_LANE_MIDDLE
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_HOSTAGE(iHostageHit,iPlayer, iProjectile, bProcessedHitHostagesThisFrame )
|
|
ELSE
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER(iCoverHit, iPlayer, iProjectile, bProcessedHitCoverThisFrame)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF iItemHit > -1
|
|
IF sTLGData.sItemData[iItemHit].iLane = ciTLG_LANE_MIDDLE
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_ITEM(iItemHit,iPlayer, iProjectile, bProcessedHitItemsThisFrame )
|
|
ELIF sTLGData.sItemData[iItemHit].iLane = ciTLG_LANE_BACKGROUND
|
|
IF iEnemyHit[i] > -1 AND sTLGData.sEnemyData[iEnemyHit[i]].iEnemyLane = ciTLG_LANE_MIDDLE
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_ENEMY(iEnemyHit[i], iPlayer, iProjectile, INIT_VECTOR_2D(sTLGData.sEnemyData[iEnemyHit[i]].vSpritePos.x - (sTLGData.sEnemyData[iEnemyHit[i]].vSize.x/2), sTLGData.sEnemyData[iEnemyHit[i]].vSpritePos.y - (sTLGData.sEnemyData[iEnemyHit[i]].vSize.y/2)), vBulletPos)
|
|
ELIF iHostageHit > -1 AND sTLGData.sHostageData[iHostageHit].iHostageLane = ciTLG_LANE_MIDDLE
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_HOSTAGE(iHostageHit,iPlayer, iProjectile, bProcessedHitHostagesThisFrame )
|
|
ELSE
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_ITEM(iItemHit,iPlayer, iProjectile, bProcessedHitItemsThisFrame )
|
|
ENDIF
|
|
ENDIF
|
|
ELIF iEnemyHit[i] > -1
|
|
IF sTLGData.sEnemyData[iEnemyHit[i]].iEnemyLane = ciTLG_LANE_MIDDLE
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_ENEMY(iEnemyHit[i], iPlayer, iProjectile, INIT_VECTOR_2D(sTLGData.sEnemyData[iEnemyHit[i]].vSpritePos.x - (sTLGData.sEnemyData[iEnemyHit[i]].vSize.x/2), sTLGData.sEnemyData[iEnemyHit[i]].vSpritePos.y - (sTLGData.sEnemyData[iEnemyHit[i]].vSize.y/2)), vBulletPos)
|
|
ELIF sTLGData.sEnemyData[iEnemyHit[i]].iEnemyLane = ciTLG_LANE_BACKGROUND
|
|
IF iHostageHit > -1 AND sTLGData.sHostageData[iHostageHit].iHostageLane = ciTLG_LANE_MIDDLE
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_HOSTAGE(iHostageHit,iPlayer, iProjectile, bProcessedHitHostagesThisFrame )
|
|
ELSE
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_ENEMY(iEnemyHit[i], iPlayer, iProjectile, INIT_VECTOR_2D(sTLGData.sEnemyData[iEnemyHit[i]].vSpritePos.x - (sTLGData.sEnemyData[iEnemyHit[i]].vSize.x/2), sTLGData.sEnemyData[iEnemyHit[i]].vSpritePos.y - (sTLGData.sEnemyData[iEnemyHit[i]].vSize.y/2)), vBulletPos)
|
|
ENDIF
|
|
ENDIF
|
|
ELIF iHostageHit > -1
|
|
IF sTLGData.sHostageData[iHostageHit].iHostageLane = ciTLG_LANE_FOREGROUND
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_HOSTAGE(iHostageHit,iPlayer, iProjectile, bProcessedHitHostagesThisFrame )
|
|
ELIF sTLGData.sHostageData[iHostageHit].iHostageLane = ciTLG_LANE_MIDDLE
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_HOSTAGE(iHostageHit,iPlayer, iProjectile, bProcessedHitHostagesThisFrame )
|
|
ELIF sTLGData.sHostageData[iHostageHit].iHostageLane = ciTLG_LANE_BACKGROUND
|
|
TLG_HANDLE_PLAYER_BULLET_COLLISION_WITH_HOSTAGE(iHostageHit,iPlayer, iProjectile, bProcessedHitHostagesThisFrame )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
IF NOT bHitSomething
|
|
IF TLG_GET_PLAYER_SUCESSIVE_HITS() != 1
|
|
TLG_RESET_PLAYER_SUCCESSIVE_HITS()
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC TWS_ACTIVATE_MENU_OPTION(TLG_MENU_OPTIONS eOption)
|
|
/*
|
|
TLG_LEVEL_DESERT
|
|
TLG_LEVEL_TOWN,
|
|
TLG_LEVEL_FOREST,
|
|
TLG_LEVEL_MINE,
|
|
TLG_LEVEL_GRAVEYARD,
|
|
*/
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] TWS_ACTIVATE_MENU_OPTION ")
|
|
|
|
SWITCH eOption
|
|
CASE TLG_START
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_START)
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_BULLET_HIT_START)
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_LEVEL_SELECTION_MENU)
|
|
BREAK
|
|
|
|
CASE TLG_SCORES
|
|
IF NOT TLG_SHOULD_SKIP_LEADERBOARD()
|
|
TLG_INIT_BACKGROUND(TLG_LEVEL_DESERT)
|
|
TLG_INIT_COVER_POINTS(TLG_LEVEL_DESERT)
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_BULLET_HIT_OPTION)
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_VIEW_LEADERBOARD)
|
|
// TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_EDIT_LEADERBOARD)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TLG_WANTED_1
|
|
|
|
sTLGData.eCurrentLevel = TLG_LEVEL_DESERT
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_SELECT_STAGE)
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_CHOOSE_LVL1_GOSPEL_GANGSTERS)
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_INIT_LEVEL)
|
|
|
|
BREAK
|
|
CASE TLG_WANTED_2
|
|
|
|
sTLGData.eCurrentLevel = TLG_LEVEL_TOWN
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_SELECT_STAGE)
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_CHOOSE_LVL2_BUCKLE_BUNNIES)
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_INIT_LEVEL)
|
|
|
|
|
|
BREAK
|
|
CASE TLG_WANTED_3
|
|
|
|
sTLGData.eCurrentLevel = TLG_LEVEL_FOREST
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_SELECT_STAGE)
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_CHOOSE_LVL3_HILLBILLY_HOODLUMS)
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_INIT_LEVEL)
|
|
|
|
|
|
BREAK
|
|
CASE TLG_WANTED_4
|
|
|
|
sTLGData.eCurrentLevel = TLG_LEVEL_MINE
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_SELECT_STAGE)
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_CHOOSE_LVL4_RUCKUS_RANGERS)
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_INIT_LEVEL)
|
|
|
|
|
|
BREAK
|
|
CASE TLG_WANTED_5
|
|
|
|
sTLGData.eCurrentLevel = TLG_LEVEL_GRAVEYARD
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_SELECT_STAGE)
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_CHOOSE_LVL5_BARREL_FEVER_BOYS)
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_INIT_LEVEL)
|
|
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
PROC HANDLE_PLAYER_BULLET_IN_MENU(INT iPlayer, INT iProjectile)
|
|
|
|
IF NOT sTLGData.sPlayerData[iPlayer].bHasJustShot
|
|
EXIT
|
|
ENDIF
|
|
|
|
INT i
|
|
FLOAT x1, x2, y1, y2 // Top-left & Bottom-right corners of collision
|
|
|
|
|
|
BOOL bHitSomething
|
|
FOR i = 0 TO ciTLG_MAX_MENU_OPTIONS-1
|
|
|
|
IF sTLGData.sMenuOptionsData[i].eClientState = sTLGData.eClientState
|
|
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].bHit = TRUE
|
|
|
|
x1 = sTLGData.sMenuOptionsData[i].vSpritePos.x - (sTLGData.sMenuOptionsData[i].vSize.x/2)
|
|
y1 = sTLGData.sMenuOptionsData[i].vSpritePos.y - (sTLGData.sMenuOptionsData[i].vSize.y/2)
|
|
|
|
x2 = sTLGData.sMenuOptionsData[i].vSpritePos.x + (sTLGData.sMenuOptionsData[i].vSize.x/2)
|
|
y2 = sTLGData.sMenuOptionsData[i].vSpritePos.y + (sTLGData.sMenuOptionsData[i].vSize.y/2)
|
|
|
|
// IF sTLGData.sMenuOptionsData[i].eMenuOption = TLG_START
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] {DSW} [HANDLE_PLAYER_BULLET_IN_MENU] ")
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] {DSW} [HANDLE_PLAYER_BULLET_IN_MENU] Sprite Pos X: ", sTLGData.sMenuOptionsData[i].vSpritePos.x, " Pos Y: ",sTLGData.sMenuOptionsData[i].vSpritePos.y)
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] {DSW} [HANDLE_PLAYER_BULLET_IN_MENU] Sprite Size X: ", sTLGData.sMenuOptionsData[i].vSize.x, " Size Y: ", sTLGData.sMenuOptionsData[i].vSize.y)
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] {DSW} [HANDLE_PLAYER_BULLET_IN_MENU] Sprite (x1, y1) : ", x1, " , ", y1, " (x2, y2): ", x2, ", ", y2)
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] {DSW} [HANDLE_PLAYER_BULLET_IN_MENU] Bullet x: ", sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.X, " y: ", sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.y)
|
|
//
|
|
//
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] {DSW} [HANDLE_PLAYER_BULLET_IN_MENU] ")
|
|
// ENDIF
|
|
|
|
IF (sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.X > x1 AND sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.X < x2
|
|
AND sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.Y > y1 AND sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.Y < y2)
|
|
bHitSomething = TRUE
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[iProjectile].iTimeOfHit = GET_GAME_TIMER()
|
|
IF TLG_IS_MENU_OPTION_UNLOCKED(sTLGData.sMenuOptionsData[i].eMenuOption)
|
|
TWS_ACTIVATE_MENU_OPTION(sTLGData.sMenuOptionsData[i].eMenuOption)
|
|
ELSE
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_STAGE_LOCKED)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
IF NOT bHitSomething
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_BULLET_HIT_MISS)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC TLG_CHECK_PLAYER_HOVERING_ENEMY()
|
|
|
|
FLOAT distanceX, distanceY, fDistance
|
|
INT iPlayer, i
|
|
|
|
FOR iPlayer = 0 TO ciTLG_MAX_PLAYERS - 1
|
|
|
|
sTLGData.sPlayerData[iPlayer].bHoveringEnemy = FALSE
|
|
|
|
FOR i = 0 TO ciTLG_MAX_ENEMIES -1
|
|
|
|
IF (sTLGData.sEnemyData[i].eState = TLG_ACTIVE OR sTLGData.sEnemyData[i].eState = TLG_SHOOTING) AND sTLGData.sEnemyData[i].iHealth > 0
|
|
distanceX = sTLGData.sPlayerData[iPlayer].vSpriteMarkerPos.x - sTLGData.sEnemyData[i].vSpritePos.x
|
|
distanceY = sTLGData.sPlayerData[iPlayer].vSpriteMarkerPos.y - sTLGData.sEnemyData[i].vSpritePos.y
|
|
fDistance = SQRT(distanceX * distanceX + distanceY * distanceY)
|
|
|
|
IF fDistance < 150
|
|
sTLGData.sPlayerData[iPlayer].bHoveringEnemy = TRUE
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
FOR i = 0 TO ciTLG_MAX_ITEMS -1
|
|
|
|
IF NOT sTLGData.sItemData[i].bShot
|
|
IF sTLGData.sItemData[i].bRendering
|
|
distanceX = sTLGData.sPlayerData[iPlayer].vSpriteMarkerPos.x - sTLGData.sItemData[i].vSpritePos.x
|
|
distanceY = sTLGData.sPlayerData[iPlayer].vSpriteMarkerPos.y - sTLGData.sItemData[i].vSpritePos.y
|
|
fDistance = SQRT(distanceX * distanceX + distanceY * distanceY)
|
|
|
|
IF fDistance < 150
|
|
sTLGData.sPlayerData[iPlayer].bHoveringEnemy = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
ENDFOR
|
|
ENDPROC
|
|
|
|
PROC TLG_CHECK_PLAYER_HOVERING_MENU_OPTION()
|
|
|
|
FLOAT x1, x2, y1, y2 // Top-left & Bottom-right corners of collision
|
|
|
|
INT iPlayer, i
|
|
FOR iPlayer = 0 TO ciTLG_MAX_PLAYERS - 1
|
|
|
|
FOR i = 0 TO ciTLG_MAX_MENU_OPTIONS-1
|
|
|
|
IF sTLGData.sMenuOptionsData[i].eClientState = sTLGData.eClientState
|
|
|
|
x1 = sTLGData.sMenuOptionsData[i].vSpritePos.x - (sTLGData.sMenuOptionsData[i].vSize.x/2)
|
|
y1 = sTLGData.sMenuOptionsData[i].vSpritePos.y - (sTLGData.sMenuOptionsData[i].vSize.y/2)
|
|
|
|
x2 = sTLGData.sMenuOptionsData[i].vSpritePos.x + (sTLGData.sMenuOptionsData[i].vSize.x/2)
|
|
y2 = sTLGData.sMenuOptionsData[i].vSpritePos.y + (sTLGData.sMenuOptionsData[i].vSize.y/2)
|
|
|
|
IF (sTLGData.sPlayerData[iPlayer].vSpriteMarkerPos.x > x1 AND sTLGData.sPlayerData[iPlayer].vSpriteMarkerPos.x < x2
|
|
AND sTLGData.sPlayerData[iPlayer].vSpriteMarkerPos.y > y1 AND sTLGData.sPlayerData[iPlayer].vSpriteMarkerPos.Y < y2)
|
|
|
|
sTLGData.sPlayerData[iPlayer].bHoveringEnemy = TRUE
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
|
|
PROC TLG_HANDLE_RETICULE_MOVEMENT()
|
|
IF TLG_IS_PLAYER_PLAYING()
|
|
IF TLG_GET_LOCAL_PLAYER_HEALTH() <= 0.0
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
FLOAT fAxisThresholdMod = cfIAP_CONTROLLER_AXIS_THRESHOLD_MOD
|
|
|
|
FLOAT fLeftLimit = 305.0.0
|
|
FLOAT fRightLimit = cfRIGHT_SCREEN_LIMIT
|
|
FLOAT fDownLimit = 80.0
|
|
FLOAT fUpLimit = 995.0
|
|
|
|
IF NOT IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
// Controller
|
|
FLOAT fRightStickX = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_X)
|
|
FLOAT fRightStickY = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_Y)
|
|
FLOAT fLeftStickX = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_X)
|
|
FLOAT fLeftStickY = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_Y)
|
|
|
|
fAxisThresholdMod = 0.5
|
|
|
|
BOOL bMovingLeft = (fRightStickX < -cfSTICK_THRESHOLD * fAxisThresholdMod) OR (fLeftStickX < -cfSTICK_THRESHOLD * fAxisThresholdMod)
|
|
BOOL bMovingRight = (fRightStickX > cfSTICK_THRESHOLD * fAxisThresholdMod) OR (fLeftStickX > cfSTICK_THRESHOLD * fAxisThresholdMod)
|
|
BOOL bMovingDown = (fRightStickY < -cfSTICK_THRESHOLD * fAxisThresholdMod) OR fLeftStickY < -cfSTICK_THRESHOLD * fAxisThresholdMod
|
|
BOOL bMovingUp = (fRightStickY > cfSTICK_THRESHOLD * fAxisThresholdMod) OR (fLeftStickY > cfSTICK_THRESHOLD * fAxisThresholdMod)
|
|
|
|
|
|
//Reticule 1
|
|
IF bMovingLeft AND sTLGData.sPlayerData[0].vSpriteMarkerPos.x >= fLeftLimit // 0.0
|
|
sTLGData.sPlayerData[0].vSpriteMarkerPos.x -= (30 - (BOOL_TO_INT(sTLGData.sPlayerData[0].bHoveringEnemy) * 15)) * TLG_GET_DEFAULT_TIMESTEP()
|
|
IF sTLGData.sPlayerData[0].vSpriteMarkerPos.x < fLeftLimit
|
|
sTLGData.sPlayerData[0].vSpriteMarkerPos.x = fLeftLimit
|
|
ENDIF
|
|
ELIF bMovingRight AND sTLGData.sPlayerData[0].vSpriteMarkerPos.x <= fRightLimit
|
|
sTLGData.sPlayerData[0].vSpriteMarkerPos.x += (30 - (BOOL_TO_INT(sTLGData.sPlayerData[0].bHoveringEnemy) * 15)) * TLG_GET_DEFAULT_TIMESTEP()
|
|
IF sTLGData.sPlayerData[0].vSpriteMarkerPos.x > fRightLimit
|
|
sTLGData.sPlayerData[0].vSpriteMarkerPos.x = fRightLimit
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bMovingDown AND sTLGData.sPlayerData[0].vSpriteMarkerPos.y >= fDownLimit //20.0
|
|
sTLGData.sPlayerData[0].vSpriteMarkerPos.y -= (30 - (BOOL_TO_INT(sTLGData.sPlayerData[0].bHoveringEnemy) * 15)) * TLG_GET_DEFAULT_TIMESTEP()
|
|
IF sTLGData.sPlayerData[0].vSpriteMarkerPos.y < fDownLimit
|
|
sTLGData.sPlayerData[0].vSpriteMarkerPos.y = fDownLimit
|
|
ENDIF
|
|
ELIF bMovingUp AND sTLGData.sPlayerData[0].vSpriteMarkerPos.y <= fUpLimit
|
|
sTLGData.sPlayerData[0].vSpriteMarkerPos.y += (30 - (BOOL_TO_INT(sTLGData.sPlayerData[0].bHoveringEnemy) * 15)) * TLG_GET_DEFAULT_TIMESTEP()
|
|
IF sTLGData.sPlayerData[0].vSpriteMarkerPos.y > fUpLimit
|
|
sTLGData.sPlayerData[0].vSpriteMarkerPos.y = fUpLimit
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
|
|
//-- Mouse
|
|
FLOAT fMouseX= GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_CURSOR_X)
|
|
FLOAT fMouseY= GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_CURSOR_Y)
|
|
|
|
VECTOR_2D vTopLeft = INIT_VECTOR_2D(fLeftLimit, fUpLimit)
|
|
VECTOR_2D vBottomRight = INIT_VECTOR_2D(fRightLimit, fDownLimit)
|
|
|
|
FLOAT fXAxisPlay = vBottomRight.x - vTopLeft.x
|
|
FLOAT fYAxisPlay = vTopLeft.Y - vBottomRight.y
|
|
|
|
sTLGData.sPlayerData[0].vSpriteMarkerPos = INIT_VECTOR_2D(vTopLeft.x + (fMouseX * fXAxisPlay), vBottomRight.y + (fMouseY * fYAxisPlay))
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC TLG_HANDLE_PLAYER_MOVEMENT()
|
|
|
|
|
|
|
|
TLG_CHECK_PLAYER_HOVERING_ENEMY()
|
|
|
|
TLG_HANDLE_RETICULE_MOVEMENT()
|
|
|
|
ENDPROC
|
|
|
|
PROC TLG_HANDLE_PLAYER_ABILITIES()
|
|
IF TLG_IS_PLAYER_BIT_SET(TLG_PLAYER_BIT_INVULNERABILE)
|
|
IF GET_GAME_TIMER() - sTLGData.sPlayerData[0].iInvulnerableTimer > ciTLG_INVULNERABILTY_TIME
|
|
TLG_CLEAR_PLAYER_BIT(TLG_PLAYER_BIT_INVULNERABILE)
|
|
TLG_STOP_SOUND(TLG_AUDIO_EFFECT_POWERUP)
|
|
TLG_STOP_AUDIO_SCENE(TLG_AUDIO_SCENE_POWERUP_ACTIVE)
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PICKUP_RUN_OUT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF TLG_IS_PLAYER_BIT_SET(TLG_PLAYER_BIT_HIDE_RETICULE)
|
|
IF GET_GAME_TIMER() - sTLGData.sPlayerData[0].iHideReticuleTimer > ciTLG_HIDE_RETICULE_TIME
|
|
TLG_CLEAR_PLAYER_BIT(TLG_PLAYER_BIT_HIDE_RETICULE)
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PICKUP_RUN_OUT)
|
|
TLG_STOP_SOUND(TLG_AUDIO_EFFECT_POWERDOWN)
|
|
TLG_STOP_AUDIO_SCENE(TLG_AUDIO_SCENE_POWERUP_ACTIVE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL TLG_CAN_ENEMY_SHOOT_GUN(INT iEnemy)
|
|
IF sTLGData.sEnemyData[iEnemy].vSpritePos.x >= cfRIGHT_SCREEN_LIMIT
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
IF sTLGData.sEnemyData[iEnemy].vSpritePos.x <= 300.0
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
IF sTLGData.sEnemyData[iEnemy].iEnemyType = TLG_THROWING_ENEMY_1
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
IF sTLGData.sEnemyData[iEnemy].iEnemyType = TLG_THROWING_ENEMY_1
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
IF sTLGData.sEnemyData[iEnemy].iEnemyType = TLG_FOREGROUND_ENEMY_BEAR
|
|
RETURN FALSE
|
|
ENDIF
|
|
// TLG_ADD_ENEMY_TO_LIST(1398.0, 446.875, 357.875,
|
|
|
|
FLOAT fPosY
|
|
FLOAT fLocToCheck
|
|
IF sTLGData.sEnemyData[iEnemy].bIsPopup
|
|
fPosY = sTLGData.sEnemyData[iEnemy].vSpritePos.y
|
|
fLocToCheck = sTLGData.sEnemyData[iEnemy].fStoppingX + 10.0
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_CAN_ENEMY_SHOOT_GUN] [TLG_ACTIVE] [dsw] Enemy ", iEnemy, " Is popup Y Pos: ",fPosY, "> ? ", fLocToCheck)
|
|
IF fPosY > fLocToCheck
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_CAN_ENEMY_SHOOT_GUN] [TLG_ACTIVE] [dsw] Enemy ", iEnemy, " FALSE")
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_CAN_ENEMY_SHOOT_GUN] [TLG_ACTIVE] [dsw] Enemy ", iEnemy, " TRUE")
|
|
ENDIF
|
|
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
PROC TLG_HANDLE_POPUP_ENEMY(INT iEnemy)
|
|
IF NOT sTLGData.sEnemyData[iEnemy].bIsPopup
|
|
EXIT
|
|
ENDIF
|
|
|
|
|
|
IF sTLGData.sEnemyData[iEnemy].iPopUpTime = 0
|
|
IF sTLGData.sEnemyData[iEnemy].vSpritePos.y > sTLGData.sEnemyData[iEnemy].fStoppingX
|
|
sTLGData.sEnemyData[iEnemy].vSpritePos.y -= 4.0
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_ACTIVE] [TLG_HANDLE_POPUP_ENEMY] Enemy ", iEnemy, " Going up Y pos ", sTLGData.sEnemyData[iEnemy].vSpritePos.y, " Stop ", sTLGData.sEnemyData[iEnemy].fStoppingX)
|
|
ELSE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_ACTIVE] [TLG_HANDLE_POPUP_ENEMY] Enemy ", iEnemy, " Finished up, grabbing time")
|
|
sTLGData.sEnemyData[iEnemy].iPopUpTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELSE
|
|
IF GET_GAME_TIMER() - sTLGData.sEnemyData[iEnemy].iPopUpTime > 5000
|
|
IF sTLGData.sEnemyData[iEnemy].vSpritePos.y < sTLGData.sEnemyData[iEnemy].vStartPos.y
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_ACTIVE] [TLG_HANDLE_POPUP_ENEMY] Enemy ", iEnemy, " Going dowm Y pos ", sTLGData.sEnemyData[iEnemy].vSpritePos.y, " Stop ", sTLGData.sEnemyData[iEnemy].vStartPos.y)
|
|
sTLGData.sEnemyData[iEnemy].vSpritePos.y += 4.0
|
|
ELSE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_ACTIVE] [TLG_HANDLE_POPUP_ENEMY] Enemy ", iEnemy, " FINISHED Going dowm Y pos ", sTLGData.sEnemyData[iEnemy].vSpritePos.y, " Stop ", sTLGData.sEnemyData[iEnemy].vStartPos.y)
|
|
IF GET_GAME_TIMER() - sTLGData.sEnemyData[iEnemy].iPopUpTime > 8000
|
|
sTLGData.sEnemyData[iEnemy].iPopUpTime = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
PROC TLG_INIT_THROWN_ENEMY_PROJECTILE(TLG_ENEMY_PROJECTILE_TYPES eType, VECTOR_2D vInitialPos)
|
|
#IF IS_DEBUG_BUILD
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_INIT_THROWN_ENEMY_PROJECTILE] Called, type: ", TLG_GET_ENEMY_THROWN_PROJECTILE_TYPE_AS_STRING(eType), " Initial pos: ",vInitialPos.x, ", ", vInitialPos.y)
|
|
#ENDIF
|
|
|
|
IF sTLGData.iNumberOfThrownEnemyProjectiles > ciTLG_MAX_ENEMY_PROJECTILES - 1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_INIT_THROWN_ENEMY_PROJECTILE] Too many projectiles - exiting ")
|
|
EXIT
|
|
ENDIF
|
|
|
|
sTLGData.sEnemyProjectiles[sTLGData.iNumberOfThrownEnemyProjectiles].eState = TLG_ENEMY_PROJECTILE_STATE_AIRBORNE
|
|
sTLGData.sEnemyProjectiles[sTLGData.iNumberOfThrownEnemyProjectiles].eType = eType
|
|
sTLGData.sEnemyProjectiles[sTLGData.iNumberOfThrownEnemyProjectiles].vSpritePos = vInitialPos
|
|
ENDPROC
|
|
|
|
PROC TLG_HANDLE_THROWN_ENEMY_PROJECTILES()
|
|
INT i
|
|
|
|
|
|
REPEAT ciTLG_MAX_ENEMY_PROJECTILES i
|
|
SWITCH sTLGData.sEnemyProjectiles[i].eState
|
|
CASE TLG_ENEMY_PROJECTILE_STATE_AIRBORNE
|
|
sTLGData.sEnemyProjectiles[i].iSpriteAnimFrame += sTLGData.sEnemyProjectiles[i].iSlowUpdateFrames
|
|
IF sTLGData.sEnemyProjectiles[i].iSpriteAnimFrame >= ciTLG_MAX_ENEMY_THROWN_DYNAMITE_ANIM_FRAMES
|
|
sTLGData.sEnemyProjectiles[i].eState = TLG_ENEMY_PROJECTILE_STATE_EXPLODE
|
|
TLG_DAMAGE_PLAYER(TLG_DAMAGE_PLAYER_TYPE_DYNAMITE)
|
|
TWS_CREATE_FX(sTLGData.sEnemyProjectiles[i].vSpritePos, TLG_FX_ENEMY_TNT_EXP, 1)
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 20)
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_EXP_DYNAMITE, sTLGData.sEnemyProjectiles[i].vSpritePos)
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TLG_ENEMY_PROJECTILE_STATE_EXPLODE
|
|
TLG_RESET_ENEMY_THROWN_PROJECTILE(i)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
FUNC BOOL TLG_CAN_ENEMY_STOP_TO_CHECK_FOR_COVER(INT iEnemy)
|
|
IF sTLGData.sEnemyData[iEnemy].bIsPopup
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
IF sTLGData.sEnemyData[iEnemy].bThrownProjectile
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL TLG_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN(INT iEnemy)
|
|
VECTOR_2D vPos = sTLGData.sEnemyData[iEnemy].vSpritePos
|
|
VECTOR_2D vSize = sTLGData.sEnemyData[iEnemy].vSize
|
|
FLOAT fScale = TLG_GET_ENEMY_TYPE_SCALE_FOR_LANE(sTLGData.sEnemyData[iEnemy].iEnemyType, sTLGData.sEnemyData[iEnemy].iEnemyLane)
|
|
BOOL bFromLeft = sTLGData.sEnemyData[iEnemy].bReverse
|
|
BOOL bThrownProjectile = sTLGData.sEnemyData[iEnemy].bThrownProjectile
|
|
|
|
TLG_ENEMY_TYPES eType = sTLGData.sEnemyData[iEnemy].iEnemyType
|
|
|
|
|
|
IF eType = TLG_COFFIN_ENEMY
|
|
IF TLG_IS_LEVEL_BIT_SET_FOR_CURRENT_LEVEL(TLG_LEVELS_BIT_STOPPED)
|
|
IF NOT sTLGData.sEnemyData[iEnemy].bAppearedOnscreen
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN] {dsw} True Enemy ", iEnemy, " Is coffin, level stopped, not on screen. Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[iEnemy].iEnemyType))
|
|
#ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sTLGData.sEnemyData[iEnemy].eState = TLG_ACTIVE
|
|
IF NOT sTLGData.sEnemyData[iEnemy].bAppearedOnscreen
|
|
RETURN FALSE
|
|
ELIF sTLGData.sEnemyData[iEnemy].iEnemyType = TLG_OUTHOUSE_ENEMY
|
|
OR sTLGData.sEnemyData[iEnemy].iEnemyType = TLG_COFFIN_ENEMY
|
|
IF NOT sTLGData.sEnemyData[iEnemy].bShotAtLeastOnce
|
|
IF NOT TLG_IS_LEVEL_STOPPED()
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF vPos.x <( cfLEFT_SCREEN_LIMIT - ( vSize.x * fScale) )
|
|
//-- Enemy is off the left hand side of the screen
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN] {dsw} True Enemy ", iEnemy, " Off LHS Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[iEnemy].iEnemyType), " Pos x ", vPos.x)
|
|
#ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
|
|
IF bFromLeft AND bThrownProjectile AND vPos.x > ( cfRIGHT_SCREEN_LIMIT + ( vSize.x * fScale) )
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN] {dsw} True Enemy ", iEnemy, " Thrown projectile, off rhs Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[iEnemy].iEnemyType), " Pos x ", vPos.x)
|
|
#ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
IF bFromLeft AND sTLGData.sEnemyData[iEnemy].bAppearedOnscreen AND vPos.x > cfBASE_SCREEN_WIDTH * 2.0
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN] {dsw} True Enemy ", iEnemy, " From lhs, far off rhs Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[iEnemy].iEnemyType), " Pos x ", vPos.x)
|
|
#ENDIF
|
|
RETURN TRUE
|
|
ENDIF
|
|
// #IF IS_DEBUG_BUILD
|
|
// IF eType = TLG_COFFIN_ENEMY OR eType = TLG_OUTHOUSE_ENEMY
|
|
// CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN]")
|
|
// CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN] Enemy ", iEnemy, " Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(eType), " State: ", TLG_GET_ENEMY_STATE_AS_STRING(sTLGData.sEnemyData[iEnemy].eState) )
|
|
// CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN] Pos: ", vPos.x, ", ", vPos.y, " Ever on screen? ", sTLGData.sEnemyData[iEnemy].bAppearedOnscreen, " Shot? ", sTLGData.sEnemyData[iEnemy].bShotAtLeastOnce)
|
|
// CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN] Level stopped? ", TLG_IS_LEVEL_STOPPED())
|
|
// CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN]")
|
|
//
|
|
// ENDIF
|
|
// #ENDIF
|
|
|
|
IF TLG_IS_LEVEL_STOPPED()
|
|
IF sTLGData.sEnemyData[iEnemy].eState = TLG_SHOOTING
|
|
OR (( eType = TLG_COFFIN_ENEMY OR eType = TLG_OUTHOUSE_ENEMY)
|
|
AND sTLGData.sEnemyData[iEnemy].eState = TLG_ACTIVE)
|
|
|
|
IF vPos.x > ( cfRIGHT_SCREEN_LIMIT )
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN] {dsw} True Enemy ", iEnemy, " Level stopped, off rhs Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[iEnemy].iEnemyType), " Pos x ", vPos.x)
|
|
#ENDIF
|
|
RETURN TRUE
|
|
ELIF vPos.x <= ( 300.0 )
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN] {dsw} True Enemy ", iEnemy, " Level stopped, off lhs Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[iEnemy].iEnemyType), " Pos x ", vPos.x)
|
|
#ENDIF
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL TLG_SHOULD_FORCE_DOORS_OPEN(INT iEnemyCover)
|
|
IF sTLGData.sEnemyData[iEnemyCover].iRenderAfterWarpedCount = 0
|
|
IF sTLGData.sEnemyData[iEnemyCover].iWarpedForMovingLevelCount > 0
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF sTLGData.sEnemyData[iEnemyCover].iWarpedForMovingLevelCount > sTLGData.sEnemyData[iEnemyCover].iRenderAfterWarpedCount
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
|
|
|
|
|
|
PROC TLG_HANDLE_ENEMIES()
|
|
|
|
INT iCurrentGameTime = GET_GAME_TIMER()
|
|
INT iBlockingCover
|
|
INT i//, j
|
|
VECTOR_2D vThrow
|
|
FLOAT fXpos
|
|
|
|
// FLOAT fCoverWidth
|
|
// FLOAT fScale
|
|
FOR i = 0 TO ciTLG_MAX_ENEMIES - 1
|
|
iBlockingCover = -1
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_ACTIVE] [dsw]")
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_ACTIVE] [dsw] Processing Enemy: ",i)
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_ACTIVE] [dsw] State: ", TLG_GET_ENEMY_STATE_AS_STRING(sTLGData.sEnemyData[i].eState), " Lane: ",sTLGData.sEnemyData[i].iEnemyLane, " Type:", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[i].iEnemyType))
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_ACTIVE] [dsw] Active in stage: ", sTLGData.sEnemyData[i].iLevelStage, " Current stage:", TLG_GET_CURRENT_LEVEL_STAGE())
|
|
#ENDIF
|
|
|
|
IF NOT sTLGData.sEnemyData[i].bAppearedOnscreen
|
|
IF sTLGData.sEnemyData[i].eState = TLG_ACTIVE
|
|
OR sTLGData.sEnemyData[i].eState = TLG_SHOOTING
|
|
OR sTLGData.sEnemyData[i].eState = TLG_DYING
|
|
fXpos = sTLGData.sEnemyData[i].vSpritePos.x
|
|
IF fXPos > cfLEFT_SCREEN_LIMIT AND fXPos < cfRIGHT_SCREEN_LIMIT
|
|
#IF IS_DEBUG_BUILD
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_ACTIVE] [dsw] Enemy: ",i, " Appeared on screen. Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[i].iEnemyType), " State: ", TLG_GET_ENEMY_STATE_AS_STRING(sTLGData.sEnemyData[i].eState), " Lane: ", sTLGData.sEnemyData[i].iEnemyLane)
|
|
#ENDIF
|
|
|
|
sTLGData.sEnemyData[i].bAppearedOnscreen = TRUE
|
|
|
|
IF TLG_IS_BEAR(i)
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_BEAR_APPEAR, sTLGData.sEnemyData[i].vSpritePos)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH sTLGData.sEnemyData[i].eState
|
|
|
|
CASE TLG_ACTIVE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
// CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_IS_COVER_SUITABLE_FOR_ENEMY_TO_USE] {dsw} Start of Active Enemy ", i, " Staggered count: ", sTLGData.iStaggeredOnScreenViableCoverCount)
|
|
#ENDIF
|
|
|
|
IF sTLGData.sEnemyData[i].iEnemyType = TLG_CART_1
|
|
sTLGData.sEnemyData[i].iSpriteAnimFrame = 0
|
|
ELIF sTLGData.sEnemyData[i].iEnemyType = TLG_OUTHOUSE_ENEMY
|
|
OR sTLGData.sEnemyData[i].iEnemyType = TLG_COFFIN_ENEMY
|
|
IF sTLGData.sEnemyData[i].bShotAtLeastOnce
|
|
sTLGData.sEnemyData[i].iSpriteAnimFrame += sTLGData.sEnemyData[i].iSlowUpdateFrames
|
|
IF sTLGData.sEnemyData[i].iSpriteAnimFrame > ciTLG_MAX_OUTHOUSE_ENEMY_ANIM_FRAMES - 2
|
|
sTLGData.sEnemyData[i].iSpriteAnimFrame = ciTLG_MAX_OUTHOUSE_ENEMY_ANIM_FRAMES - 2
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
sTLGData.sEnemyData[i].iSpriteAnimFrame += sTLGData.sEnemyData[i].iSlowUpdateFrames
|
|
IF sTLGData.sEnemyData[i].iSpriteAnimFrame >= ciTLG_MAX_ANIM_FRAMES
|
|
sTLGData.sEnemyData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// IF sTLGData.sEnemyData[i].iEnemyType != TLG_CART_1 AND sTLGData.sEnemyData[i].iSpriteAnimFrame >= ciTLG_MAX_ANIM_FRAMES
|
|
// sTLGData.sEnemyData[i].iSpriteAnimFrame = 0
|
|
// ELIF sTLGData.sEnemyData[i].iEnemyType = TLG_CART_1
|
|
// sTLGData.sEnemyData[i].iSpriteAnimFrame = 0
|
|
// ENDIF
|
|
|
|
IF sTLGData.sEnemyData[i].iHealth <= 0
|
|
sTLGData.sEnemyData[i].eState = TLG_DYING
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] {dsw} Enemy ", i, " set as Dying as iHealth <= 0. Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[i].iEnemyType))
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
IF sTLGData.sEnemyData[i].iEnemyType != TLG_OUTHOUSE_ENEMY
|
|
AND sTLGData.sEnemyData[i].iEnemyType != TLG_COFFIN_ENEMY
|
|
IF NOT sTLGData.sEnemyData[i].bIsPopup
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [dsw] [TLG_IS_COVER_SUITABLE_FOR_ENEMY_TO_USE] Enemy ",i , " Comparing sprite x ", sTLGData.sEnemyData[i].vSpritePos.x, " wih stopping x ", sTLGData.sEnemyData[i].fStoppingX)
|
|
IF sTLGData.sEnemyData[i].vSpritePos.x >= sTLGData.sEnemyData[i].fStoppingX -10
|
|
AND sTLGData.sEnemyData[i].vSpritePos.x <= sTLGData.sEnemyData[i].fStoppingX +10
|
|
//-- If the enemy is about to stop and shoot then check the stop location isn't behind a big bit of cover
|
|
#IF IS_DEBUG_BUILD
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [dsw] [TLG_IS_COVER_SUITABLE_FOR_ENEMY_TO_USE] Enemy ",i , " Stopping position ",sTLGData.sEnemyData[i].fStoppingX, " Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[i].iEnemyType))
|
|
#ENDIF
|
|
|
|
IF TLG_IS_COORD_BLOCKED_BY_COVER(sTLGData.sEnemyData[i].iEnemyLane, sTLGData.sEnemyData[i].fStoppingX, iBlockingCover)
|
|
AND NOT sTLGData.sEnemyData[i].bThrownProjectile
|
|
|
|
SET_ENEMY_NEW_STOPPING_POINT_AFTER_BLOCKED_COVER(i, iBlockingCover)
|
|
|
|
|
|
ELSE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [dsw] Not blocked. Enemy ", i, " Stopping at x pos ", sTLGData.sEnemyData[i].vSpritePos.x)
|
|
sTLGData.sEnemyData[i].eState = TLG_SHOOTING
|
|
sTLGData.sEnemyData[i].iTimeOfLastShot = GET_GAME_TIMER()
|
|
ENDIF
|
|
ELSE
|
|
//-- If the ped is stiil on their way to their stopping loc, stop if they happen to pass some suitable cover
|
|
IF sTLGData.sEnemyData[i].eState = TLG_ACTIVE
|
|
AND NOT sTLGData.sEnemyData[i].bThrownProjectile
|
|
IF TLG_IS_COVER_SUITABLE_FOR_ENEMY_TO_USE(sTLGData.iViableOnScreenEnemyCoverPoints[sTLGData.iStaggeredOnScreenViableCoverCount], i)
|
|
sTLGData.sEnemyData[i].eState = TLG_SHOOTING
|
|
sTLGData.sEnemyData[i].iTimeOfLastShot = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
SWITCH sTLGData.sEnemyData[i].iEnemyLane
|
|
CASE 2
|
|
IF sTLGData.sEnemyData[i].bReverse
|
|
sTLGData.sEnemyData[i].vSpritePos.x += TLG_GET_ENEMY_FOREGROUND_UPDATE(TRUE)
|
|
ELSE
|
|
sTLGData.sEnemyData[i].vSpritePos.x -= TLG_GET_ENEMY_FOREGROUND_UPDATE(FALSE)
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF sTLGData.sEnemyData[i].bReverse
|
|
sTLGData.sEnemyData[i].vSpritePos.x += TLG_GET_ENEMY_MIDDLE_UPDATE(TRUE)
|
|
ELSE
|
|
sTLGData.sEnemyData[i].vSpritePos.x -= TLG_GET_ENEMY_MIDDLE_UPDATE(FALSE)
|
|
ENDIF
|
|
BREAK
|
|
CASE 0
|
|
IF sTLGData.sEnemyData[i].bReverse
|
|
sTLGData.sEnemyData[i].vSpritePos.x += TLG_GET_ENEMY_BACKGROUND_UPDATE(TRUE)
|
|
ELSE
|
|
sTLGData.sEnemyData[i].vSpritePos.x -= TLG_GET_ENEMY_BACKGROUND_UPDATE(FALSE)
|
|
ENDIF
|
|
BREAK
|
|
|
|
|
|
ENDSWITCH
|
|
|
|
// #IF IS_DEBUG_BUILD
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_ACTIVE] [dsw] Enemy: ",i, " Lane: ",sTLGData.sEnemyData[i].iEnemyLane, " Type:", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[i].iEnemyType), " New Pos: ", sTLGData.sEnemyData[i].vSpritePos.x)
|
|
// #ENDIF
|
|
ELSE
|
|
// #IF IS_DEBUG_BUILD
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_ACTIVE] [OUTHOUSE_WARP] [dsw] Enemy: ",i, " Is outhouse Lane: ",sTLGData.sEnemyData[i].iEnemyLane, " Type:", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[i].iEnemyType), " State: ", TLG_GET_ENEMY_STATE_AS_STRING(sTLGData.sEnemyData[i].eState))
|
|
// #ENDIF
|
|
|
|
//-- Outhouse enemies - wait until door is off before shooting
|
|
IF sTLGData.sEnemyData[i].iSpriteAnimFrame = ciTLG_MAX_OUTHOUSE_ENEMY_ANIM_FRAMES - 2
|
|
sTLGData.sEnemyData[i].eState = TLG_SHOOTING
|
|
sTLGData.sEnemyData[i].iTimeOfLastShot = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
BOOL bForceOpenDoors
|
|
IF IS_MOVING_LEVEL() AND sTLGData.sEnemyData[i].iEnemyLane != 2
|
|
sTLGData.sEnemyData[i].vSpritePos.x -= TLG_GET_OUTHOUSE_UPDATE()
|
|
|
|
FLOAT fEnemyScaleMulti
|
|
|
|
//-- If the outhouse doors haven't been shot off, and it's gonbe off the screen LHS, warp it back so
|
|
//-- It'll appear
|
|
fEnemyScaleMulti = TLG_GET_ENEMY_TYPE_SCALE_FOR_LANE(sTLGData.sEnemyData[i].iEnemyType, sTLGData.sEnemyData[i].iEnemyLane)
|
|
|
|
IF sTLGData.sEnemyData[i].vSpritePos.x <= 0
|
|
IF sTLGData.sEnemyData[i].iEnemyType = TLG_OUTHOUSE_ENEMY
|
|
IF sTLGData.sEnemyData[i].vSpritePos.x < 200
|
|
sTLGData.sEnemyData[i].vSpritePos.x = cfBASE_SCREEN_WIDTH + (( sTLGData.sEnemyData[i].vSize.x * fEnemyScaleMulti)/2.0)
|
|
sTLGData.sEnemyData[i].iWarpedForMovingLevelCount++
|
|
ENDIF
|
|
ELIF sTLGData.sEnemyData[i].iEnemyType = TLG_COFFIN_ENEMY
|
|
sTLGData.sEnemyData[i].vSpritePos.x = TLG_GET_OFFSET_FOR_ELEMENT_WARP_FOR_CURRENT_LEVEL()
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_ACTIVE] [OUTHOUSE_WARP] [dsw] Enemy: ",i, " Warped")
|
|
sTLGData.sEnemyData[i].iWarpedForMovingLevelCount++
|
|
ENDIF
|
|
ELSE
|
|
|
|
IF NOT sTLGData.sEnemyData[i].bShotAtLeastOnce
|
|
IF TLG_SHOULD_FORCE_DOORS_OPEN(i)
|
|
|
|
//-- Have the outhouse enemies shoot their doors off if the player hasn't done it
|
|
//-- Will happen if they've gone off the screen LHS at least once
|
|
//-- Wait until they're halfway between the centre of the screen and the rhs limit
|
|
FLOAT fPosToCheck
|
|
fPosToCheck = (cfBASE_SCREEN_WIDTH / 2.0) + ((cfBASE_SCREEN_WIDTH - cfRIGHT_SCREEN_LIMIT))
|
|
IF sTLGData.sEnemyData[i].vSpritePos.x - ((sTLGData.sEnemyData[i].vSize.x * TLG_GET_ENEMY_TYPE_SCALE_FOR_LANE(TLG_OUTHOUSE_ENEMY, sTLGData.sEnemyData[i].iEnemyLane)/2.0)) < fPosToCheck
|
|
bForceOpenDoors = TRUE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [TLG_HANDLE_ENEMIES] Outhouse enemy ", i, " Forcing doors open. Sprite x: ", sTLGData.sEnemyData[i].vSpritePos.x, " < ", fPosToCheck)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ELSE
|
|
//-- If it's a stationary stage, wait until the outhouse is on screen and start a timer to determine
|
|
//-- If the doors should be forced open
|
|
IF NOT sTLGData.sEnemyData[i].bShotAtLeastOnce
|
|
IF TLG_IS_CURRENT_LEVEL_STAGE_STATIONARY()
|
|
IF sTLGData.sEnemyData[i].vSpritePos.x < cfRIGHT_SCREEN_LIMIT
|
|
IF sTLGData.sEnemyData[i].iOnScreenTime = 0
|
|
sTLGData.sEnemyData[i].iOnScreenTime = GET_GAME_TIMER()
|
|
ELSE
|
|
IF GET_GAME_TIMER() - sTLGData.sEnemyData[i].iOnScreenTime > 15000
|
|
bForceOpenDoors = TRUE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [TLG_HANDLE_ENEMIES] Outhouse enemy ", i, " Forcing doors open as stationary & time expired")
|
|
ELIF TLG_GET_FINAL_STAGE_IN_CURRENT_LEVEL() = TLG_GET_CURRENT_LEVEL_STAGE()
|
|
IF TLG_GET_TOTAL_NUMBER_OF_ENEMIES_ALIVE() = 1
|
|
bForceOpenDoors = TRUE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [TLG_HANDLE_ENEMIES] Outhouse enemy ", i, " Forcing doors open as stationary, final stage and everyone else dead")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bForceOpenDoors
|
|
sTLGData.sEnemyData[i].bShotAtLeastOnce = TRUE
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_ENEMY_RIFLE_FIRE, sTLGData.sEnemyData[i].vSpritePos)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sTLGData.sEnemyData[i].eState = TLG_ACTIVE
|
|
IF TLG_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN(i)
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] {dsw} Enemy ", i, " Active but went outside the limits and is being set as inactive. Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[i].iEnemyType))
|
|
#ENDIF
|
|
sTLGData.sEnemyData[i].eState = TLG_INACTIVE
|
|
|
|
IF sTLGData.sEnemyData[i].iEnemyType != TLG_OUTHOUSE_ENEMY
|
|
AND sTLGData.sEnemyData[i].iEnemyType != TLG_COFFIN_ENEMY
|
|
sTLGData.iCurrentActiveEnemies[sTLGData.sEnemyData[i].iEnemyLane]--
|
|
ENDIF
|
|
|
|
IF sTLGData.iCurrentActiveEnemies[sTLGData.sEnemyData[i].iEnemyLane] < 0
|
|
sTLGData.iCurrentActiveEnemies[sTLGData.sEnemyData[i].iEnemyLane] = 0
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] {dsw} iCurrentActiveEnemies in lane ", sTLGData.sEnemyData[i].iEnemyLane, " < 0 (1)")
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TLG_SHOOTING
|
|
|
|
IF IS_MOVING_LEVEL() AND sTLGData.sEnemyData[i].iEnemyLane != 2
|
|
sTLGData.sEnemyData[i].vSpritePos.x -= TLG_GET_ENEMY_SHOOTING_UPDATE()
|
|
ENDIF
|
|
|
|
IF TLG_CAN_ENEMY_SHOOT_GUN(i)
|
|
IF iCurrentGameTime - sTLGData.sEnemyData[i].iTimeOfLastShot > ciTLG_ENEMY_TIME_TO_SHOOT - (ENUM_TO_INT(sTLGData.eCurrentLevel) * 200)
|
|
sTLGData.sEnemyData[i].iTimeOfLastShot = GET_GAME_TIMER()
|
|
|
|
IF sTLGData.sEnemyData[i].iEnemyType != TLG_OUTHOUSE_ENEMY
|
|
AND sTLGData.sEnemyData[i].iEnemyType != TLG_COFFIN_ENEMY
|
|
IF sTLGData.sEnemyData[i].iEnemyLane = 2
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sTLGData.sEnemyData[i].vSpritePos.x + cfTLG_FG_ENEMY_1_X_OFFSET, sTLGData.sEnemyData[i].vSpritePos.Y + cfTLG_FG_ENEMY_1_Y_OFFSET), TLG_FX_ENEMY_SHOT, sTLGData.sEnemyData[i].iEnemyLane)
|
|
ELSE
|
|
IF sTLGData.sEnemyData[i].iEnemyType != TLG_THROWING_ENEMY_1
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sTLGData.sEnemyData[i].vSpritePos.x + cfTLG_BG_ENEMY_1_X_OFFSET, sTLGData.sEnemyData[i].vSpritePos.Y + cfTLG_BG_ENEMY_1_Y_OFFSET), TLG_FX_ENEMY_SHOT, sTLGData.sEnemyData[i].iEnemyLane)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
TWS_CREATE_FX(INIT_VECTOR_2D(sTLGData.sEnemyData[i].vSpritePos.x, sTLGData.sEnemyData[i].vSpritePos.Y), TLG_FX_ENEMY_SHOT, sTLGData.sEnemyData[i].iEnemyLane)
|
|
ENDIF
|
|
|
|
IF GET_PLAYER_TOTAL_AMMO_FOR_ALL_WEAPON_TYPES() <= 0
|
|
IF sTLGData.sPlayerData[0].iNoAmmoTimer = 0
|
|
sTLGData.sPlayerData[0].iNoAmmoTimer = GET_GAME_TIMER()
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_ARCADE] {DSW} Start iNoAmmoTimer")
|
|
ELSE
|
|
IF GET_GAME_TIMER() - sTLGData.sPlayerData[0].iNoAmmoTimer >= ciTLG_PLAYER_CRITICAL_DAMAGE_NO_AMMO_TIME
|
|
IF sTLGData.sPlayerData[0].fHealth > 0.05
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_ARCADE] {DSW} Forcing hit critical as ammo <=0")
|
|
sTLGData.sPlayerData[0].fHealth = 0.05
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF sTLGData.sPlayerData[0].iNoAmmoTimer != 0
|
|
sTLGData.sPlayerData[0].iNoAmmoTimer = 0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
TLG_DAMAGE_PLAYER(TLG_DAMAGE_PLAYER_TYPE_BULLET)
|
|
//-- Enemy firing audio
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_ENEMY_RIFLE_FIRE, sTLGData.sEnemyData[i].vSpritePos)
|
|
|
|
|
|
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_ARCADE] Player has been hit by enemy ", i, " Ped Pos: ", sTLGData.sEnemyData[i].vSpritePos.x, ", ", sTLGData.sEnemyData[i].vSpritePos.y, " lane: ", sTLGData.sEnemyData[i].iEnemyLane, " Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[i].iEnemyType), " Popup? ", sTLGData.sEnemyData[i].bIsPopup)
|
|
#ENDIF
|
|
ELSE
|
|
//-- Enemies 'laugh' just before they fire a critical shot
|
|
IF NOT sTLGData.sEnemyData[i].bPlayedCriticalWarningAudio
|
|
IF iCurrentGameTime - sTLGData.sEnemyData[i].iTimeOfLastShot > (ciTLG_ENEMY_TIME_TO_SHOOT - (ENUM_TO_INT(sTLGData.eCurrentLevel) * 200)) - 1000
|
|
IF TLG_GET_LOCAL_PLAYER_HEALTH() <= 0.1 AND TLG_GET_LOCAL_PLAYER_HEALTH() > 0.0
|
|
sTLGData.sEnemyData[i].bPlayedCriticalWarningAudio = TRUE
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_ENEMY_CRIT_WARNING, sTLGData.sEnemyData[i].vSpritePos)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF TLG_GET_LOCAL_PLAYER_HEALTH() > 0.4
|
|
sTLGData.sEnemyData[i].bPlayedCriticalWarningAudio = FALSE
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] {DSW} reset bPlayedCriticalWarningAudio for enemy ", i, " as player restored health")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//-- Audio for enemy cocking weapon
|
|
IF NOT sTLGData.sEnemyData[i].bPlayedAimAudio
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_ENEMY_RIFLE_AIM,sTLGData.sEnemyData[i].vSpritePos)
|
|
sTLGData.sEnemyData[i].bPlayedAimAudio = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELIF TLG_IS_BEAR(i)
|
|
IF iCurrentGameTime - sTLGData.sEnemyData[i].iTimeOfLastShot > ciTLG_ENEMY_TIME_TO_SHOOT - (ENUM_TO_INT(sTLGData.eCurrentLevel) * 200)
|
|
sTLGData.sEnemyData[i].iTimeOfLastShot = GET_GAME_TIMER()
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] {DSW} Bear ", i, " attacking ")
|
|
TLG_SET_LEVEL_BIT_FOR_CURRENT_LEVEL(TLG_LEVELS_BIT_DAMAGED_BY_BEAR)
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_BEAR_ATTACK, sTLGData.sEnemyData[i].vSpritePos)
|
|
sTLGData.iBearAttackTime = GET_GAME_TIMER()
|
|
TLG_DAMAGE_PLAYER(TLG_DAMAGE_PLAYER_TYPE_BEAR)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// IF sTLGData.sEnemyData[i].vSpritePos.x < cfLEFT_SCREEN_LIMIT - ( sTLGData.sEnemyData[i].vSize.x * TLG_GET_ENEMY_TYPE_SCALE_FOR_LANE(sTLGData.sEnemyData[i].iEnemyType, sTLGData.sEnemyData[i].iEnemyLane))
|
|
// OR (sTLGData.sEnemyData[i].bReverse AND sTLGData.sEnemyData[i].bThrownProjectile AND sTLGData.sEnemyData[i].vSpritePos.x > cfRIGHT_SCREEN_LIMIT - ( sTLGData.sEnemyData[i].vSize.x * TLG_GET_ENEMY_TYPE_SCALE_FOR_LANE(sTLGData.sEnemyData[i].iEnemyType, sTLGData.sEnemyData[i].iEnemyLane)))
|
|
IF TLG_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN(i)
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] {dsw} Enemy ", i, " went outside the limits and is being set as inactive. Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[i].iEnemyType))
|
|
#ENDIF
|
|
|
|
sTLGData.sEnemyData[i].eState = TLG_INACTIVE
|
|
|
|
IF sTLGData.sEnemyData[i].iEnemyType != TLG_OUTHOUSE_ENEMY
|
|
AND sTLGData.sEnemyData[i].iEnemyType != TLG_COFFIN_ENEMY
|
|
sTLGData.iCurrentActiveEnemies[sTLGData.sEnemyData[i].iEnemyLane]--
|
|
ENDIF
|
|
|
|
IF sTLGData.iCurrentActiveEnemies[sTLGData.sEnemyData[i].iEnemyLane] < 0
|
|
sTLGData.iCurrentActiveEnemies[sTLGData.sEnemyData[i].iEnemyLane] = 0
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] {dsw} iCurrentActiveEnemies in lane ", sTLGData.sEnemyData[i].iEnemyLane, " < 0 (2)")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sTLGData.sEnemyData[i].iEnemyType = TLG_THROWING_ENEMY_1
|
|
IF NOT sTLGData.sEnemyData[i].bThrownProjectile
|
|
sTLGData.sEnemyData[i].iSpriteAnimFrame += sTLGData.sEnemyData[i].iSlowUpdateFrames
|
|
IF sTLGData.sEnemyData[i].iSpriteAnimFrame > ciTLG_MAX_THROWING_FRAMES -2
|
|
sTLGData.sEnemyData[i].iSpriteAnimFrame = ciTLG_MAX_THROWING_FRAMES -2
|
|
sTLGData.sEnemyData[i].bThrownProjectile = TRUE
|
|
sTLGData.sEnemyData[i].iTimeOfLastShot = GET_GAME_TIMER()
|
|
vThrow = sTLGData.sEnemyData[i].vSpritePos
|
|
vThrow.x -= 23.75
|
|
vThrow.y -= 95.125
|
|
TLG_INIT_THROWN_ENEMY_PROJECTILE(TLG_ENEMY_PROJECTILE_DYNAMITE, vThrow)
|
|
TLG_PLAY_SOUND_AND_RELEASE(TLG_AUDIO_EFFECT_ENEMY_THROW_DYNAMITE, sTLGData.sEnemyData[i].vSpritePos)
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] {dsw} Enemy ", i, " Throwing projectile")
|
|
ENDIF
|
|
ELSE
|
|
IF GET_GAME_TIMER() - sTLGData.sEnemyData[i].iTimeOfLastShot > 1000
|
|
IF sTLGData.sEnemyData[i].bReverse
|
|
sTLGData.sEnemyData[i].fStoppingX = 1700.0
|
|
ELSE
|
|
sTLGData.sEnemyData[i].fStoppingX = 0.0
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] {dsw} Enemy ", i, " has thrown projectile and time expired. Running off screen")
|
|
sTLGData.sEnemyData[i].eState = TLG_ACTIVE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
TLG_HANDLE_POPUP_ENEMY(i)
|
|
BREAK
|
|
|
|
CASE TLG_DYING
|
|
IF IS_MOVING_LEVEL()
|
|
sTLGData.sEnemyData[i].vSpritePos.x -= TLG_GET_ENEMY_DYING_UPDATE()
|
|
ENDIF
|
|
|
|
VECTOR_2D vOuthousePos
|
|
IF sTLGData.sEnemyData[i].iEnemyType = TLG_CART_1
|
|
|
|
sTLGData.sEnemyData[i].iSpriteAnimFrame += sTLGData.sEnemyData[i].iSlowUpdateFrames
|
|
|
|
IF sTLGData.sEnemyData[i].iSpriteAnimFrame >= ciTLG_MAX_CART_ANIM_FRAMES
|
|
sTLGData.sEnemyData[i].eState = TLG_INACTIVE
|
|
|
|
IF sTLGData.sEnemyData[i].iEnemyType != TLG_OUTHOUSE_ENEMY
|
|
AND sTLGData.sEnemyData[i].iEnemyType != TLG_COFFIN_ENEMY
|
|
sTLGData.iCurrentActiveEnemies[sTLGData.sEnemyData[i].iEnemyLane]--
|
|
ENDIF
|
|
|
|
sTLGData.sEnemyData[i].iSpriteAnimFrame = 0
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] {dsw} Enemy ", i, " Cart set as inactive. Destroyed. Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[i].iEnemyType))
|
|
#ENDIF
|
|
|
|
IF sTLGData.iCurrentActiveEnemies[sTLGData.sEnemyData[i].iEnemyLane] < 0
|
|
sTLGData.iCurrentActiveEnemies[sTLGData.sEnemyData[i].iEnemyLane] = 0
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] {dsw} iCurrentActiveEnemies in lane ", sTLGData.sEnemyData[i].iEnemyLane, " < 0 (3)")
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
|
|
IF sTLGData.sEnemyData[i].iEnemyType != TLG_OUTHOUSE_ENEMY
|
|
AND sTLGData.sEnemyData[i].iEnemyType != TLG_COFFIN_ENEMY
|
|
SWITCH sTLGData.sEnemyData[i].iEnemyLane
|
|
CASE ciTLG_LANE_FOREGROUND
|
|
sTLGData.sEnemyData[i].vSpritePos.y -= 10
|
|
sTLGData.sEnemyData[i].iJumpDistance += 5
|
|
BREAK
|
|
CASE ciTLG_LANE_MIDDLE
|
|
sTLGData.sEnemyData[i].vSpritePos.y -= 10
|
|
sTLGData.sEnemyData[i].iJumpDistance += 10
|
|
BREAK
|
|
CASE ciTLG_LANE_BACKGROUND
|
|
CASE ciTLG_LANE_POPUP_LHS
|
|
CASE ciTLG_LANE_POPUP_RHS
|
|
sTLGData.sEnemyData[i].vSpritePos.y -= 2
|
|
sTLGData.sEnemyData[i].iJumpDistance += 5
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
// IF sTLGData.sEnemyData[i].iEnemyLane = 2
|
|
// #IF IS_DEBUG_BUILD
|
|
// CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_DYING] {dsw} Enemy ", i, " Lane 2. Jump Dist ",sTLGData.sEnemyData[i].iJumpDistance , ". Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[i].iEnemyType))
|
|
// #ENDIF
|
|
// ENDIF
|
|
IF sTLGData.sEnemyData[i].iEnemyType != TLG_OUTHOUSE_ENEMY
|
|
AND sTLGData.sEnemyData[i].iEnemyType != TLG_COFFIN_ENEMY
|
|
IF sTLGData.sEnemyData[i].iJumpDistance > 50
|
|
sTLGData.sEnemyData[i].eState = TLG_INACTIVE
|
|
|
|
|
|
IF sTLGData.iCurrentActiveEnemies[sTLGData.sEnemyData[i].iEnemyLane] > 0
|
|
sTLGData.iCurrentActiveEnemies[sTLGData.sEnemyData[i].iEnemyLane]--
|
|
ENDIF
|
|
|
|
//-- If it's a 'pop up' guy and the level is stationary, start a timer
|
|
//-- before the next 'pop up' ped can appear in the same spot
|
|
IF sTLGData.sEnemyData[i].iEnemyLane = ciTLG_LANE_POPUP_LHS
|
|
OR sTLGData.sEnemyData[i].iEnemyLane = ciTLG_LANE_POPUP_RHS
|
|
IF sTLGData.sEnemyData[i].bWaitUntilLevelStationary
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] {dsw} Enemy ", i, " Starting active timer for lane ",sTLGData.sEnemyData[i].iEnemyLane)
|
|
sTLGData.iTimeSinceEnemyActive[sTLGData.sEnemyData[i].iEnemyLane] = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] {dsw} Enemy ", i, " set as inactive as jump distamce ",sTLGData.sEnemyData[i].iJumpDistance , "> 50. Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[i].iEnemyType))
|
|
#ENDIF
|
|
ENDIF
|
|
ELSE
|
|
sTLGData.sEnemyData[i].iSpriteAnimFrame += sTLGData.sEnemyData[i].iSlowUpdateFrames
|
|
IF sTLGData.sEnemyData[i].iSpriteAnimFrame > ciTLG_MAX_OUTHOUSE_ENEMY_ANIM_FRAMES
|
|
sTLGData.sEnemyData[i].iSpriteAnimFrame = ciTLG_MAX_OUTHOUSE_ENEMY_ANIM_FRAMES
|
|
ENDIF
|
|
|
|
IF !TLG_IS_CURRENT_LEVEL_STAGE_STATIONARY()
|
|
IF (sTLGData.sEnemyData[i].vSpritePos.x + sTLGData.sEnemyData[i].vSize.x) < cfLEFT_SCREEN_LIMIT
|
|
sTLGData.sEnemyData[i].eState = TLG_INACTIVE
|
|
IF sTLGData.sEnemyData[i].iEnemyType = TLG_OUTHOUSE_ENEMY
|
|
vOuthousePos = INIT_VECTOR_2D(sTLGData.sEnemyData[i].vSpritePos.x + (cfBASE_SCREEN_WIDTH*2.0), 676.125)
|
|
TLG_ADD_COVER_TO_LIST(vOuthousePos, TLG_ASSET_OUTHOUSE, sTLGData.sEnemyData[i].iEnemyLane)
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] {dsw} Enemy ", i, " set as inactive as Outhouse and off screen ")
|
|
#ENDIF
|
|
ELSE
|
|
IF NOT TLG_IS_MOVING_LEVEL_ABOUT_TO_STOP()
|
|
AND NOT TLG_IS_LEVEL_STOPPED()
|
|
TLG_ADD_ENEMY_TO_LIST(sTLGData.sEnemyData[i].vSpritePos.x, sTLGData.sEnemyData[i].vSpritePos.y , sTLGData.sEnemyData[i].vSpritePos.x, 1, FALSE, TLG_COFFIN_ENEMY, DEFAULT, DEFAULT, DEFAULT, 1)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE TLG_WAITING
|
|
// IF sTLGData.iCurrentActiveEnemies[sTLGData.sEnemyData[i].iEnemyLane] != 1
|
|
// CPRINTLN(DEBUG_MINIGAME, "[TLG_ARCADE] {DSW} [TLG_HANDLE_ENEMIES] Active in lane ", sTLGData.sEnemyData[i].iEnemyLane, ": ", sTLGData.iCurrentActiveEnemies[sTLGData.sEnemyData[i].iEnemyLane])
|
|
// ENDIF
|
|
|
|
//-- Set enemy peds as active, depending on their parameters
|
|
IF sTLGData.iCurrentActiveEnemies[sTLGData.sEnemyData[i].iEnemyLane] < 1
|
|
OR sTLGData.sEnemyData[i].iEnemyType = TLG_OUTHOUSE_ENEMY
|
|
OR sTLGData.sEnemyData[i].iEnemyType = TLG_COFFIN_ENEMY
|
|
OR (sTLGData.sEnemyData[i].iEnemyType = TLG_CART_1 AND TLG_GET_CURRENT_LEVEL() = TLG_LEVEL_MINE)
|
|
|
|
|
|
IF sTLGData.sEnemyData[i].iLevelStage <= TLG_GET_CURRENT_LEVEL_STAGE()
|
|
IF sTLGData.sEnemyData[i].bWaitUntilLevelStationary
|
|
IF IS_MOVING_LEVEL()
|
|
//-- The ped only appears when the level is stationary, but it is still moving
|
|
RELOOP
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sTLGData.sEnemyData[i].bIsPopup
|
|
IF sTLGData.sEnemyData[i].bWaitUntilLevelStationary
|
|
|
|
IF sTLGData.iTimeSinceEnemyActive[sTLGData.sEnemyData[i].iEnemyLane] = 0
|
|
OR GET_GAME_TIMER() - sTLGData.iTimeSinceEnemyActive[sTLGData.sEnemyData[i].iEnemyLane] > 4000
|
|
//-- This ped 'pops-up' from behind scenery, but only when the level has stopped scrolling
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_ARCADE] {DSW} [TLG_HANDLE_ENEMIES] Setting as SHOOTING stationary pop up enemy ", i, " Lane: ", sTLGData.sEnemyData[i].iEnemyLane, " Is popup? ", sTLGData.sEnemyData[i].bIsPopup," Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[i].iEnemyType))
|
|
#ENDIF
|
|
|
|
sTLGData.iCurrentActiveEnemies[sTLGData.sEnemyData[i].iEnemyLane]++
|
|
sTLGData.sEnemyData[i].eState = TLG_SHOOTING
|
|
|
|
ENDIF
|
|
ELSE
|
|
|
|
//-- This ped pops up behind scenery while the level is moving
|
|
IF TOG_IS_ENEMY_ON_SCREEN(i, 10.0)
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_ARCADE] {DSW} [TLG_HANDLE_ENEMIES] Setting as SHOOTING moving pop up enemy ", i, " Lane: ", sTLGData.sEnemyData[i].iEnemyLane, " Is popup? ", sTLGData.sEnemyData[i].bIsPopup," Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[i].iEnemyType))
|
|
#ENDIF
|
|
|
|
|
|
sTLGData.iCurrentActiveEnemies[sTLGData.sEnemyData[i].iEnemyLane]++
|
|
sTLGData.sEnemyData[i].eState = TLG_SHOOTING
|
|
|
|
ENDIF
|
|
|
|
|
|
ENDIF
|
|
ELSE
|
|
IF sTLGData.sEnemyData[i].iRenderAfterWarpedCount = 0
|
|
OR sTLGData.sEnemyData[i].iRenderAfterWarpedCount = sTLGData.sEnemyData[i].iWarpedForMovingLevelCount
|
|
//-- This is a normal ped who runs into position from either the left or the right of the screev
|
|
IF sTLGData.sEnemyData[i].iEnemyType != TLG_OUTHOUSE_ENEMY
|
|
AND sTLGData.sEnemyData[i].iEnemyType != TLG_COFFIN_ENEMY
|
|
sTLGData.iCurrentActiveEnemies[sTLGData.sEnemyData[i].iEnemyLane]++
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_ARCADE] {DSW} [TLG_HANDLE_ENEMIES] Setting as TLG_ACTIVE enemy ", i, " Lane: ", sTLGData.sEnemyData[i].iEnemyLane, " Is popup? ", sTLGData.sEnemyData[i].bIsPopup," Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[i].iEnemyType), " Active in lane: ", sTLGData.iCurrentActiveEnemies[sTLGData.sEnemyData[i].iEnemyLane])
|
|
#ENDIF
|
|
sTLGData.sEnemyData[i].eState = TLG_ACTIVE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//-- Still want to update the positions of some 'inactive' enemies. generally for when we don't want them to appear from the start
|
|
IF IS_MOVING_LEVEL()
|
|
IF sTLGData.sEnemyData[i].bIsPopup
|
|
OR (TLG_GET_CURRENT_LEVEL() = TLG_LEVEL_MINE AND TLG_IS_GUN_CART(i))
|
|
OR sTLGData.sEnemyData[i].iRenderAfterWarpedCount > 0
|
|
IF NOT sTlgData.sEnemyData[i].bWaitUntilLevelStationary
|
|
sTLGData.sEnemyData[i].vSpritePos.x -= TLG_GET_ENEMY_WAITING_UPDATE()
|
|
ENDIF
|
|
|
|
IF sTLGData.sEnemyData[i].iRenderAfterWarpedCount > 0
|
|
IF sTLGData.sEnemyData[i].vSpritePos.x <= 0
|
|
sTLGData.sEnemyData[i].vSpritePos.x = TLG_GET_OFFSET_FOR_ELEMENT_WARP_FOR_CURRENT_LEVEL()
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_WAITING] [OUTHOUSE_WARP] [dsw] Enemy: ",i, " Warped")
|
|
sTLGData.sEnemyData[i].iWarpedForMovingLevelCount++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
// #IF IS_DEBUG_BUILD
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_HANDLE_ENEMIES] [TLG_ACTIVE] [dsw] Processing ENDFOR Enemy: ",i, " Max: ", ciTLG_MAX_ENEMIES, " Lane: ",sTLGData.sEnemyData[i].iEnemyLane, " Type:", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[i].iEnemyType), " State: ", TLG_GET_ENEMY_STATE_AS_STRING(sTLGData.sEnemyData[i].eState))
|
|
// #ENDIF
|
|
ENDFOR
|
|
|
|
|
|
//-- Need to clear that we've been attacked by a bear if all bears are dead (i,e, if there hasn't been an attack for a while)
|
|
//-- TLG_LEVELS_BIT_DAMAGED_BY_BEAR is used to determine if we should display the claw-attack sprite in TLG_DRAW_SHOT_FLASH
|
|
IF TLG_IS_LEVEL_BIT_SET_FOR_CURRENT_LEVEL(TLG_LEVELS_BIT_DAMAGED_BY_BEAR)
|
|
IF GET_GAME_TIMER() - sTLGData.iBearAttackTime > 3000
|
|
TLG_CLEAR_LEVEL_BIT_FOR_LEVEL(TLG_GET_CURRENT_LEVEL(),TLG_LEVELS_BIT_DAMAGED_BY_BEAR)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC TLG_HANDLE_HOSTAGES()
|
|
|
|
FLOAT fXPos
|
|
INT i
|
|
|
|
FOR i = 0 TO ciTLG_MAX_HOSTAGES - 1
|
|
IF sTLGData.sHostageData[i].bRendering
|
|
sTLGData.sHostageData[i].iSpriteAnimFrame += sTLGData.sHostageData[i].iSlowUpdateFrames
|
|
|
|
IF sTLGData.sHostageData[i].iHealth > 0
|
|
IF sTLGData.sHostageData[i].iSpriteAnimFrame >= ciTLG_MAX_ANIM_FRAMES
|
|
sTLGData.sHostageData[i].iSpriteAnimFrame = 0
|
|
ENDIF
|
|
|
|
IF sTLGData.sHostageData[i].bGoingBack = FALSE AND sTLGData.sHostageData[i].fStoppingX != 0.0
|
|
IF sTLGData.sHostageData[i].vSpritePos.x < sTLGData.sHostageData[i].fStoppingX
|
|
sTLGData.sHostageData[i].bGoingBack = TRUE
|
|
ELSE
|
|
sTLGData.sHostageData[i].vSpritePos.x -= TLG_GET_HOSTAGE_UPDATE()
|
|
ENDIF
|
|
ELSE
|
|
sTLGData.sHostageData[i].vSpritePos.x += TLG_GET_HOSTAGE_UPDATE()
|
|
ENDIF
|
|
|
|
|
|
fXPos = sTLGData.sHostageData[i].vSpritePos.x
|
|
IF NOT TLG_IS_HOSTAGE_BIT_SET(i, TLG_HOSTAGE_BIT_APPEARED_ONSCREEN)
|
|
IF fXPos > cfLEFT_SCREEN_LIMIT AND fXPos < cfRIGHT_SCREEN_LIMIT
|
|
//-- Appeared on screen
|
|
TLG_SET_HOSTAGE_BIT(i, TLG_HOSTAGE_BIT_APPEARED_ONSCREEN)
|
|
TLG_PLAY_HOSTAGE_HELP_AUDIO(sTLGData.sHostageData[i].eHostageType, sTLGData.sHostageData[i].vSpritePos)
|
|
ENDIF
|
|
ELSE
|
|
//-- Hostage is 'saved' if they appear on screen and then leaves the screen without being shot
|
|
IF sTLGData.sHostageData[i].eHostageType = TLG_GIRL
|
|
OR sTLGData.sHostageData[i].eHostageType = TLG_GUY
|
|
|
|
IF NOT TLG_IS_HOSTAGE_BIT_SET(i, TLG_HOSTAGE_BIT_SAVED)
|
|
IF fXPos < cfLEFT_SCREEN_LIMIT OR fXPos > cfRIGHT_SCREEN_LIMIT
|
|
//-- Left the screen
|
|
TLG_SET_HOSTAGE_BIT(i, TLG_HOSTAGE_BIT_SAVED)
|
|
TLG_PLAY_HOSTAGE_ESCAPE_AUDIO(sTLGData.sHostageData[i].eHostageType, sTLGData.sHostageData[i].vSpritePos)
|
|
TLG_INCREASE_HOSTAGES_SAVED_COUNT_FOR_CURRENT_LEVEL()
|
|
TLG_RESET_HOSTAGE(i)
|
|
|
|
RELOOP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELIF sTLGData.sHostageData[i].bDying
|
|
|
|
IF IS_MOVING_LEVEL()
|
|
sTLGData.sHostageData[i].vSpritePos.x -= TLG_GET_HOSTAGE_DYING_UPDATE()
|
|
ENDIF
|
|
|
|
IF sTLGData.sHostageData[i].iSpriteAnimFrame >= ciTLG_EXPLOSION_MAX_ANIM_FRAMES
|
|
sTLGData.sHostageData[i].bDying = FALSE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
|
|
PROC TLG_HANDLE_FX()
|
|
|
|
INT i
|
|
FOR i = 0 TO ciTLG_MAX_FX - 1
|
|
IF sTLGData.sFXData[i].bActive
|
|
|
|
sTLGData.sFXData[i].iSpriteBlastAnimFrame += sTLGData.sFXData[i].iSlowUpdateFrames
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_DRAW_BULLETS_AND_EFFECTS] {DSW} Frame: ", sTLGData.sFXData[i].iSpriteBlastAnimFrame)
|
|
IF IS_MOVING_LEVEL() AND sTLGData.eClientState = TLG_ARCADE_CLIENT_STATE_PLAYING
|
|
sTLGData.sFXData[i].vSpritePos.x -= TLG_GET_FX_UPDATE()
|
|
ENDIF
|
|
|
|
SWITCH sTLGData.sFXData[i].eFXType
|
|
CASE TLG_FX_ENEMY_SHOT
|
|
|
|
IF sTLGData.sFXData[i].iSpriteBlastAnimFrame >= ciTLG_ENEMY_SHOT_MAX_ANIM_FRAMES
|
|
sTLGData.sFXData[i].iSpriteBlastAnimFrame = 0
|
|
sTLGData.sFXData[i].bActive = FALSE
|
|
ENDIF
|
|
BREAK
|
|
CASE TLG_FX_EXPLOSION
|
|
|
|
IF sTLGData.sFXData[i].iSpriteBlastAnimFrame >= ciTLG_EXPLOSION_MAX_ANIM_FRAMES
|
|
sTLGData.sFXData[i].iSpriteBlastAnimFrame = 0
|
|
sTLGData.sFXData[i].bActive = FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TLG_FX_ENEMY_TNT_EXP
|
|
IF sTLGData.sFXData[i].iSpriteBlastAnimFrame >= ciTLG_MAX_ENEMY_THROWN_EXPLOSION_ANIM_FRAMES
|
|
sTLGData.sFXData[i].iSpriteBlastAnimFrame = 0
|
|
sTLGData.sFXData[i].bActive = FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TLG_FX_LOOT_CRATE
|
|
IF sTLGData.sFXData[i].iSpriteBlastAnimFrame >= ciTLG_MAX_LOOT_CRATE_FX_ANIM_FRAMES
|
|
sTLGData.sFXData[i].iSpriteBlastAnimFrame = 0
|
|
sTLGData.sFXData[i].bActive = FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TLG_FX_FEATHERS
|
|
IF sTLGData.sFXData[i].iSpriteBlastAnimFrame >= ciTLG_FEATHERS_MAX_ANIM_FRAMES
|
|
sTLGData.sFXData[i].iSpriteBlastAnimFrame = 0
|
|
sTLGData.sFXData[i].bActive = FALSE
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
//-- Handle gatling gun overheating
|
|
PROC TLG_PROCESS_GATLING_GUN_TEMP()
|
|
FLOAT fTimeOverHeat = cfTLG_GATLING_OVERHEAT_TIME_SECONDS
|
|
FLOAT fTimeCooldown = cfTLG_GATLING_COOLDOWN_TIME_SECONDS
|
|
|
|
BOOL bShooting
|
|
FLOAT fFrameTime = GET_FRAME_TIME()
|
|
|
|
IF TLG_GET_PLAYER_CURRENT_WEAPON() = TLG_PLAYER_WEAPON_GATLING
|
|
|
|
bSHooting = (IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RT) OR IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
|
|
AND TLG_GET_LOCAL_PLAYER_HEALTH() > 0.0)
|
|
|
|
IF TLG_IS_PLAYER_BIT_SET(TLG_PLAYER_BIT_GATLING_OVERHEAT)
|
|
IF NOT TLG_IS_PLAYER_BIT_SET(TLG_PLAYER_BIT_GATLING_STOPPED_SHOOTING)
|
|
IF NOT bSHooting
|
|
TLG_SET_PLAYER_BIT(TLG_PLAYER_BIT_GATLING_STOPPED_SHOOTING)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bSHooting
|
|
IF sTLGData.sPlayerData[0].iGatlingOverheatTime = 0
|
|
OR (GET_GAME_TIMER() - sTLGData.sPlayerData[0].iGatlingOverheatTime) > 100
|
|
sTLGData.sPlayerData[0].iGatlingOverheatTime = GET_GAME_TIMER()
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_SHOOT_GATLING_OVERHEAT)
|
|
ENDIF
|
|
|
|
IF NOT TLG_IS_PLAYER_BIT_SET(TLG_PLAYER_BIT_GATLING_STOPPED_SHOOTING)
|
|
sTLGData.sPlayerData[0].fGatlingGunTemp = 1.0
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
|
|
IF sTLGData.sPlayerData[0].fGatlingGunTemp > 0.0
|
|
sTLGData.sPlayerData[0].fGatlingGunTemp -= (1.0 / (fTimeCooldown/fFrameTime))
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_PROCESS_GATLING_GUN_TEMP] DECREASE sTLGData.sPlayerData[0].fGatlingGunTemp = ", sTLGData.sPlayerData[0].fGatlingGunTemp)
|
|
ELSE
|
|
sTLGData.sPlayerData[0].fGatlingGunTemp = 0.0
|
|
TLG_CLEAR_PLAYER_BIT(TLG_PLAYER_BIT_GATLING_OVERHEAT)
|
|
TLG_CLEAR_PLAYER_BIT(TLG_PLAYER_BIT_GATLING_STOPPED_SHOOTING)
|
|
ENDIF
|
|
|
|
EXIT
|
|
ENDIF
|
|
|
|
|
|
|
|
IF bSHooting
|
|
IF sTLGData.sPlayerData[0].fGatlingGunTemp < 1.0
|
|
|
|
IF NOT TLG_IS_PLAYER_BIT_SET(TLG_PLAYER_BIT_GATLING_OVERHEAT)
|
|
sTLGData.sPlayerData[0].fGatlingGunTemp += (1.0 / (fTimeOverHeat/fFrameTime))
|
|
|
|
IF sTLGData.sPlayerData[0].fGatlingGunTemp >= 1.0
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_GATLING_OVERHEAT)
|
|
TLG_SET_PLAYER_BIT(TLG_PLAYER_BIT_GATLING_OVERHEAT)
|
|
ENDIF
|
|
// ELSE
|
|
// IF sTLGData.sPlayerData[0].iGatlingOverheatTime = 0
|
|
// OR (GET_GAME_TIMER() - sTLGData.sPlayerData[0].iGatlingOverheatTime) > 100
|
|
// sTLGData.sPlayerData[0].iGatlingOverheatTime = GET_GAME_TIMER()
|
|
// TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_SHOOT_GATLING_OVERHEAT)
|
|
// ENDIF
|
|
ENDIF
|
|
ELSE
|
|
sTLGData.sPlayerData[0].fGatlingGunTemp = 1.0
|
|
ENDIF
|
|
ELSE
|
|
IF sTLGData.sPlayerData[0].fGatlingGunTemp > 0.0
|
|
sTLGData.sPlayerData[0].fGatlingGunTemp -= (1.0 / (fTimeCooldown/fFrameTime))
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_PROCESS_GATLING_GUN_TEMP] DECREASE sTLGData.sPlayerData[0].fGatlingGunTemp = ", sTLGData.sPlayerData[0].fGatlingGunTemp)
|
|
ELSE
|
|
sTLGData.sPlayerData[0].fGatlingGunTemp = 0.0
|
|
TLG_CLEAR_PLAYER_BIT(TLG_PLAYER_BIT_GATLING_OVERHEAT)
|
|
TLG_CLEAR_PLAYER_BIT(TLG_PLAYER_BIT_GATLING_STOPPED_SHOOTING)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF sTLGData.sPlayerData[0].fGatlingGunTemp != 0.0
|
|
sTLGData.sPlayerData[0].fGatlingGunTemp = 0.0
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BOOL TLG_PLAYER_SHOT(INT iPlayer, BOOL bIsMenu)
|
|
TLG_PLAYER_WEAPON_DATA weaponData
|
|
IF TLG_GET_PLAYER_AMMO_IN_CLIP_FOR_CURRENT_WEAPON() > 0
|
|
OR bIsMenu
|
|
IF TLG_IS_PLAYER_SHOOTING()
|
|
//-- Shoot pistol
|
|
IF TLG_GET_PLAYER_CURRENT_WEAPON() = GET_PLAYER_DEFAULT_WEAPON()
|
|
IF NOT bIsMenu
|
|
sTLGData.sPlayerData[0].weaponData[TLG_PLAYER_WEAPON_TYPE_DEFAULT].iLastShotTime = GET_GAME_TIMER()
|
|
ENDIF
|
|
RETURN TRUE
|
|
ELSE
|
|
|
|
IF TLG_GET_PLAYER_CURRENT_WEAPON() = TLG_PLAYER_WEAPON_SHOTGUN
|
|
OR TLG_GET_PLAYER_CURRENT_WEAPON() = TLG_PLAYER_WEAPON_RIFLE
|
|
weaponData = TLG_GET_PLAYER_WEAPON_DATA(TLG_GET_PLAYER_CURRENT_WEAPON())
|
|
IF sTLGData.sPlayerData[0].weaponData[TLG_PLAYER_WEAPON_TYPE_SPECIAL].iLastShotTime = 0
|
|
OR GET_GAME_TIMER() - sTLGData.sPlayerData[0].weaponData[TLG_PLAYER_WEAPON_TYPE_SPECIAL].iLastShotTime >= weaponData.iMinTimeBetweenShots
|
|
sTLGData.sPlayerData[0].weaponData[TLG_PLAYER_WEAPON_TYPE_SPECIAL].iLastShotTime = GET_GAME_TIMER()
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//--SHoot gatling gun
|
|
IF (TLG_GET_PLAYER_CURRENT_WEAPON() = TLG_PLAYER_WEAPON_GATLING
|
|
AND (IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RT)
|
|
OR IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) )
|
|
AND GET_GAME_TIMER() - sTLGData.sPlayerData[iPlayer].iLastProjectileTime > 100)
|
|
IF NOT TLG_IS_PLAYER_BIT_SET(TLG_PLAYER_BIT_GATLING_OVERHEAT)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC TLG_HANDLE_PLAYER_RELOADING()
|
|
TLG_PLAYER_WEAPON_TYPE weaponType = sTLGData.sPlayerData[0].weaponType
|
|
|
|
//-- Exit if the gun clip is full
|
|
IF NOT TLG_CAN_PLAYER_CURRNT_WEAPON_BE_RELOADED()
|
|
IF sTLGData.sPlayerData[0].bIsReloading[weaponType]
|
|
sTLGData.sPlayerData[0].bIsReloading[weaponType] = FALSE
|
|
ENDIF
|
|
|
|
IF sTLGData.sPlayerData[0].weaponData[weaponType].iReloadSingleBulletTime != 0
|
|
sTLGData.sPlayerData[0].weaponData[weaponType].iReloadSingleBulletTime = 0
|
|
ENDIF
|
|
|
|
IF TLG_IS_PLAYER_BIT_SET(TLG_PLAYER_BIT_RELOADED_FIRST_BULLET)
|
|
TLG_CLEAR_PLAYER_BIT(TLG_PLAYER_BIT_RELOADED_FIRST_BULLET)
|
|
ENDIF
|
|
|
|
EXIT
|
|
ENDIF
|
|
|
|
//-- Stop reloading if the player shoots after starting to reload.
|
|
IF TLG_GET_PLAYER_AMMO_IN_CLIP_FOR_CURRENT_WEAPON() > 0
|
|
IF TLG_PLAYER_SHOT(0, FALSE)
|
|
IF sTLGData.sPlayerData[0].bIsReloading[weaponType]
|
|
sTLGData.sPlayerData[0].bIsReloading[weaponType] = FALSE
|
|
ENDIF
|
|
|
|
IF sTLGData.sPlayerData[0].weaponData[weaponType].iReloadSingleBulletTime != 0
|
|
sTLGData.sPlayerData[0].weaponData[weaponType].iReloadSingleBulletTime = 0
|
|
ENDIF
|
|
|
|
IF TLG_IS_PLAYER_BIT_SET(TLG_PLAYER_BIT_RELOADED_FIRST_BULLET)
|
|
TLG_CLEAR_PLAYER_BIT(TLG_PLAYER_BIT_RELOADED_FIRST_BULLET)
|
|
ENDIF
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sTLGData.sPlayerData[0].bIsReloading[weaponType]
|
|
TLG_RELOAD_PLAYER_WEAPON()
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
|
|
PROC TLG_HANDLE_PLAYER_SHOOTING(INT iPlayer, BOOL bIsMenu = FALSE)
|
|
|
|
sTLGData.sPlayerData[iPlayer].bHasJustShot = FALSE
|
|
|
|
// PROCESS BULLETS
|
|
// IF ((TLG_GET_PLAYER_CURRENT_WEAPON() = GET_PLAYER_DEFAULT_WEAPON() AND TLG_IS_PLAYER_SHOOTING())
|
|
// OR (TLG_GET_PLAYER_CURRENT_WEAPON() = TLG_PLAYER_WEAPON_GATLING AND IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RT) AND GET_GAME_TIMER() - sTLGData.sPlayerData[iPlayer].iLastProjectileTime > 100))
|
|
// AND (TLG_GET_PLAYER_AMMO_IN_CLIP_FOR_CURRENT_WEAPON() > 0 AND iPlayer = 0 OR bIsMenu)
|
|
IF TLG_PLAYER_SHOT(iPlayer, bIsMenu)
|
|
IF bIsMenu
|
|
OR TLG_GET_LOCAL_PLAYER_HEALTH() > 0.0
|
|
|
|
sTLGData.sPlayerData[iPlayer].iLastProjectileTime = GET_GAME_TIMER()
|
|
|
|
CPRINTLN(DEBUG_MINIGAME, "TLG - Player shot.")
|
|
|
|
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 20)
|
|
sTLGData.sPlayerData[iPlayer].bHasJustShot = TRUE
|
|
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[sTLGData.sPlayerData[iPlayer].iProjectileIndex].vSpritePos = sTLGData.sPlayerData[iPlayer].vSpriteMarkerPos
|
|
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[sTLGData.sPlayerData[iPlayer].iProjectileIndex].iSpriteBlastAnimFrame = 0
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[sTLGData.sPlayerData[iPlayer].iProjectileIndex].bShot = TRUE
|
|
|
|
sTLGData.sPlayerData[iPlayer].iProjectileIndex = (sTLGData.sPlayerData[iPlayer].iProjectileIndex + 1) % ciTLG_MAX_PROJECTILES
|
|
ENDIF
|
|
|
|
IF NOT bIsMenu
|
|
IF TLG_GET_LOCAL_PLAYER_HEALTH() > 0.0
|
|
TLG_INCREASE_SHOT_FIRED_FOR_CURRENT_LEVEL()
|
|
TLG_HANDLE_PLAYER_SHOOTING_AUDIO()
|
|
TLG_REDUCE_PLAYER_AMMO_IN_CLIP()
|
|
ENDIF
|
|
ELSE
|
|
TLG_HANDLE_PLAYER_SHOOTING_AUDIO()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sTLGData.eClientState = TLG_ARCADE_CLIENT_STATE_PLAYING
|
|
IF TLG_GET_LOCAL_PLAYER_HEALTH() > 0.0
|
|
IF (IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RB)
|
|
OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL))
|
|
|
|
//-- Check for player reloading
|
|
IF NOT sTLGData.sPlayerData[0].bIsReloading[sTLGData.sPlayerData[0].weaponType]
|
|
sTLGData.sPlayerData[0].bIsReloading[sTLGData.sPlayerData[0].weaponType] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF TLG_GET_PLAYER_AMMO_IN_CLIP_FOR_CURRENT_WEAPON() = 0
|
|
AND NOT TLG_DOES_PLAYER_CURRENT_WEAPON_HAVE_INFINITE_AMMO()
|
|
IF TLG_GET_PLAYER_TOTAL_AMMO_IN_CURRENT_WEAPON(FALSE) > 0
|
|
//-- Check for player shootig empty weapon
|
|
IF TLG_IS_PLAYER_SHOOTING()
|
|
TLG_HANDLE_PLAYER_FIRING_EMPTY_WEAPON_AUDIO()
|
|
ENDIF
|
|
ELSE
|
|
IF sTLGData.sPlayerData[0].weaponType = TLG_PLAYER_WEAPON_TYPE_SPECIAL
|
|
TLG_SET_PLAYER_WEAPON_TYPE(TLG_PLAYER_WEAPON_TYPE_DEFAULT)
|
|
TLG_SET_PLAYER_SPECIAL_WEAPON(TLG_PLAYER_WEAPON_NONE, FALSE)
|
|
TLG_INIT_PLAYER_SPECIAL_WEAPON()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
INT i
|
|
FOR i = 0 TO ciTLG_MAX_PROJECTILES - 1
|
|
|
|
IF sTLGData.sPlayerData[iPlayer].sBulletData[i].bShot
|
|
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[i].iSpriteBlastAnimFrame += sTLGData.sPlayerData[iPlayer].sBulletData[i].iSlowUpdateFrames
|
|
|
|
IF bIsMenu
|
|
HANDLE_PLAYER_BULLET_IN_MENU(iPlayer, i)
|
|
ELSE
|
|
HANDLE_PLAYER_BULLET_COLLISION(iPlayer, i)
|
|
|
|
IF IS_MOVING_LEVEL()
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[i].vSpritePos.X -= TLG_GET_PROJECTILE_UPDATE()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sTLGData.sPlayerData[iPlayer].sBulletData[i].iSpriteBlastAnimFrame >= ciTLG_PLAYER_SHOT_MAX_ANIM_FRAMES
|
|
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[i].bShot = FALSE
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[i].bHit = FALSE
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[i].bHitObject = FALSE
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[i].bPlayedAudio = FALSE
|
|
sTLGData.sPlayerData[iPlayer].sBulletData[i].iSpriteBlastAnimFrame = 0
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
TLG_PROCESS_GATLING_GUN_TEMP()
|
|
ENDPROC
|
|
|
|
PROC TLG_PROCESS_MENU_CONTROLS()
|
|
|
|
// FLOAT fAxisThresholdMod = cfIAP_CONTROLLER_AXIS_THRESHOLD_MOD
|
|
//
|
|
// FLOAT fRightStickX = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_X)
|
|
// FLOAT fRightStickY = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_Y)
|
|
|
|
TLG_CHECK_PLAYER_HOVERING_MENU_OPTION()
|
|
|
|
// fAxisThresholdMod = 0.5
|
|
//
|
|
// //Reticule 1
|
|
// IF fRightStickX < -cfSTICK_THRESHOLD * fAxisThresholdMod AND sTLGData.sPlayerData[0].vSpriteMarkerPos.x > 0.0
|
|
// sTLGData.sPlayerData[0].vSpriteMarkerPos.x -= 30 - (BOOL_TO_INT(sTLGData.sPlayerData[0].bHoveringEnemy) * 15)
|
|
// ELIF fRightStickX > cfSTICK_THRESHOLD * fAxisThresholdMod AND sTLGData.sPlayerData[0].vSpriteMarkerPos.x < (cfBASE_SCREEN_WIDTH - 40)
|
|
// sTLGData.sPlayerData[0].vSpriteMarkerPos.x += 30 - (BOOL_TO_INT(sTLGData.sPlayerData[0].bHoveringEnemy) * 15)
|
|
// ENDIF
|
|
//
|
|
// IF fRightStickY < -cfSTICK_THRESHOLD * fAxisThresholdMod AND sTLGData.sPlayerData[0].vSpriteMarkerPos.y > 20.0
|
|
// sTLGData.sPlayerData[0].vSpriteMarkerPos.y -= 30 - (BOOL_TO_INT(sTLGData.sPlayerData[0].bHoveringEnemy) * 15)
|
|
// ELIF fRightStickY > cfSTICK_THRESHOLD * fAxisThresholdMod AND sTLGData.sPlayerData[0].vSpriteMarkerPos.y < (cfBASE_SCREEN_HEIGHT - 40)
|
|
// sTLGData.sPlayerData[0].vSpriteMarkerPos.y += 30 - (BOOL_TO_INT(sTLGData.sPlayerData[0].bHoveringEnemy) * 15)
|
|
// ENDIF
|
|
|
|
TLG_HANDLE_RETICULE_MOVEMENT()
|
|
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_ARCADE] RETICULE ", sTLGData.sPlayerData[0].vSpriteMarkerPos.x, ",", sTLGData.sPlayerData[0].vSpriteMarkerPos.y)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Levels are split up into stages. Generally when the level stops / starts moving a new stage ends / begins
|
|
/// RETURNS: True when all stages complete
|
|
///
|
|
FUNC BOOL TLG_MAINTAIN_PLAYER_CURRENT_LEVEL_PROGRESSION()
|
|
INT iNextScreen
|
|
SWITCH sTLGData.eCurrentLevel
|
|
CASE TLG_LEVEL_DESERT
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [GD] TLG_GET_CURRENT_LEVEL_STAGE() = ", TLG_GET_CURRENT_LEVEL_STAGE(), " TLG_GET_CURRENT_LEVEL_NUMBER_OF_STAGES() - 1 = ", TLG_GET_CURRENT_LEVEL_NUMBER_OF_STAGES() - 1)
|
|
IF TLG_GET_CURRENT_LEVEL_STAGE() = TLG_GET_CURRENT_LEVEL_NUMBER_OF_STAGES() - 1
|
|
IF TLG_GET_TOTAL_NUMBER_OF_ENEMIES_ALIVE() = 0
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_COMPLETE_LEVEL)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
SWITCH TLG_GET_CURRENT_LEVEL_STAGE()
|
|
CASE 0
|
|
IF TLG_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_CURRENT_STAGE() = 0
|
|
IF NOT TLG_IS_LEVEL_BIT_SET_FOR_CURRENT_LEVEL(TLG_LEVELS_BIT_SHOULD_STOP)
|
|
TLG_SET_LEVEL_BIT_FOR_CURRENT_LEVEL(TLG_LEVELS_BIT_SHOULD_STOP)
|
|
TLG_INCREASE_CURRENT_LEVEL_STAGE()
|
|
TLG_INIT_ENEMIES(1)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TLG_LEVEL_TOWN
|
|
IF TLG_GET_CURRENT_LEVEL_STAGE() = TLG_GET_CURRENT_LEVEL_NUMBER_OF_STAGES() - 1
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [GD] TLG_GET_CURRENT_LEVEL_STAGE() = ", TLG_GET_CURRENT_LEVEL_STAGE(), " TLG_GET_CURRENT_LEVEL_NUMBER_OF_STAGES() - 1 = ", TLG_GET_CURRENT_LEVEL_NUMBER_OF_STAGES() - 1)
|
|
IF TLG_GET_TOTAL_NUMBER_OF_ENEMIES_ALIVE() = 0
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_COMPLETE_LEVEL)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
SWITCH TLG_GET_CURRENT_LEVEL_STAGE()
|
|
CASE 0
|
|
IF TLG_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_CURRENT_STAGE() <= 3
|
|
IF NOT TLG_IS_LEVEL_BIT_SET_FOR_CURRENT_LEVEL(TLG_LEVELS_BIT_SHOULD_STOP)
|
|
TLG_SET_LEVEL_BIT_FOR_CURRENT_LEVEL(TLG_LEVELS_BIT_SHOULD_STOP)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
IF TLG_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_CURRENT_STAGE() = 0
|
|
TLG_CLEAR_LEVEL_BIT_FOR_LEVEL(TLG_LEVEL_TOWN, TLG_LEVELS_BIT_SHOULD_STOP)
|
|
TLG_CLEAR_LEVEL_BIT_FOR_LEVEL(TLG_LEVEL_TOWN, TLG_LEVELS_BIT_STOPPED)
|
|
TLG_RESET_ALL_COLLECTIBLE_ITEMS_NOT_ON_SCREEN()
|
|
iNextScreen = TLG_GET_SCREEN_TO_STOP_ON()
|
|
iNextScreen++
|
|
IF iNextScreen > 4
|
|
iNextScreen = 1
|
|
ENDIF
|
|
|
|
TLG_ADD_COVER_TO_LIST_FOR_SCREEN(TLG_ASSET_CRATE_1, iNextScreen)
|
|
|
|
// iNextScreen++
|
|
// IF iNextScreen > 4
|
|
// iNextScreen = 1
|
|
// ENDIF
|
|
//
|
|
// TLG_ADD_ITEM_TO_LIST_FOR_SCREEN(TLG_HEALTH, 1, iNextScreen)
|
|
//
|
|
// iNextScreen++
|
|
// IF iNextScreen > 4
|
|
// iNextScreen = 1
|
|
// ENDIF
|
|
//
|
|
// TLG_ADD_ITEM_TO_LIST_FOR_SCREEN(TLG_REVOLVER_AMMO, 1, iNextScreen)
|
|
|
|
TLG_RESET_SCREEN_TO_STOP_ON()
|
|
TLG_INCREASE_CURRENT_LEVEL_STAGE()
|
|
TLG_INIT_ENEMIES(2)
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF TLG_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_CURRENT_STAGE() = 0
|
|
IF NOT TLG_IS_LEVEL_BIT_SET_FOR_CURRENT_LEVEL(TLG_LEVELS_BIT_SHOULD_STOP)
|
|
TLG_SET_LEVEL_BIT_FOR_CURRENT_LEVEL(TLG_LEVELS_BIT_SHOULD_STOP)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TLG_LEVEL_FOREST
|
|
IF TLG_GET_CURRENT_LEVEL_STAGE() = TLG_GET_CURRENT_LEVEL_NUMBER_OF_STAGES() - 1
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [GD] TLG_GET_CURRENT_LEVEL_STAGE() = ", TLG_GET_CURRENT_LEVEL_STAGE(), " TLG_GET_CURRENT_LEVEL_NUMBER_OF_STAGES() - 1 = ", TLG_GET_CURRENT_LEVEL_NUMBER_OF_STAGES() - 1)
|
|
IF TLG_GET_TOTAL_NUMBER_OF_ENEMIES_ALIVE() = 0
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_COMPLETE_LEVEL)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
SWITCH TLG_GET_CURRENT_LEVEL_STAGE()
|
|
CASE 0
|
|
IF TLG_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_CURRENT_STAGE() <= 5
|
|
IF NOT TLG_IS_LEVEL_BIT_SET_FOR_CURRENT_LEVEL(TLG_LEVELS_BIT_SHOULD_STOP)
|
|
TLG_SET_LEVEL_BIT_FOR_CURRENT_LEVEL(TLG_LEVELS_BIT_SHOULD_STOP)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE TLG_LEVEL_MINE
|
|
IF TLG_GET_CURRENT_LEVEL_STAGE() = TLG_GET_CURRENT_LEVEL_NUMBER_OF_STAGES() - 1
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [GD] TLG_GET_CURRENT_LEVEL_STAGE() = ", TLG_GET_CURRENT_LEVEL_STAGE(), " TLG_GET_CURRENT_LEVEL_NUMBER_OF_STAGES() - 1 = ", TLG_GET_CURRENT_LEVEL_NUMBER_OF_STAGES() - 1)
|
|
IF TLG_GET_TOTAL_NUMBER_OF_ENEMIES_ALIVE() = 0
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_COMPLETE_LEVEL)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
SWITCH TLG_GET_CURRENT_LEVEL_STAGE()
|
|
CASE 0
|
|
IF TLG_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_CURRENT_STAGE() <= 5
|
|
IF NOT TLG_IS_LEVEL_BIT_SET_FOR_CURRENT_LEVEL(TLG_LEVELS_BIT_SHOULD_STOP)
|
|
TLG_SET_LEVEL_BIT_FOR_CURRENT_LEVEL(TLG_LEVELS_BIT_SHOULD_STOP)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
|
|
CASE TLG_LEVEL_GRAVEYARD
|
|
IF TLG_GET_CURRENT_LEVEL_STAGE() = TLG_GET_CURRENT_LEVEL_NUMBER_OF_STAGES() - 1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [GD] Enemies alive: ", TLG_GET_TOTAL_NUMBER_OF_ENEMIES_ALIVE() , " TLG_GET_CURRENT_LEVEL_STAGE() = ", TLG_GET_CURRENT_LEVEL_STAGE(), " TLG_GET_CURRENT_LEVEL_NUMBER_OF_STAGES() - 1 = ", TLG_GET_CURRENT_LEVEL_NUMBER_OF_STAGES() - 1)
|
|
IF TLG_GET_TOTAL_NUMBER_OF_ENEMIES_ALIVE() = 0
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_COMPLETE_LEVEL)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
SWITCH TLG_GET_CURRENT_LEVEL_STAGE()
|
|
CASE 0
|
|
IF TLG_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_CURRENT_STAGE() <= 5
|
|
IF NOT TLG_IS_LEVEL_BIT_SET_FOR_CURRENT_LEVEL(TLG_LEVELS_BIT_SHOULD_STOP)
|
|
TLG_SET_LEVEL_BIT_FOR_CURRENT_LEVEL(TLG_LEVELS_BIT_SHOULD_STOP)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC TLG_CHECK_PLAYER_PROGRESS()
|
|
|
|
IF sTLGData.eLevelStage = TLG_PLAY
|
|
|
|
IF TLG_GET_LOCAL_PLAYER_HEALTH() <= 0.0 // OR sTLGData.sPlayerData[0].iAmmo <= 0
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_HEALTH_DEAD)
|
|
//TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_DEATH)
|
|
// sTLGData.bFadingOut = TRUE
|
|
sTLGData.eLevelStage = TLG_WAIT_FOR_DEAD
|
|
|
|
IF NOT IS_BIT_SET(sTLGData.iMusicBitset, ENUM_TO_INT(TLG_MUSIC_BIT_STOPPED))
|
|
TLG_TRIGGER_MUSIC_EVENT(TLG_MUSIC_EVENT_STOP)
|
|
SET_BIT(sTLGData.iMusicBitset, ENUM_TO_INT(TLG_MUSIC_BIT_STOPPED))
|
|
ENDIF
|
|
|
|
TLG_MAINTAIN_PLAYER_AWARDS()
|
|
|
|
ELSE
|
|
|
|
IF TLG_MAINTAIN_PLAYER_CURRENT_LEVEL_PROGRESSION()
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [GD] Level completed")
|
|
|
|
sTLGData.bLevelsCompleted[ENUM_TO_INT(sTLGData.eCurrentLevel)] = TRUE
|
|
sTLGData.bFadingOut = TRUE
|
|
sTLGData.eLevelStage = TLG_FADING_OUT
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
TLG_OUTPUT_LEVEL_COMPLETE_DATA()
|
|
|
|
IF TLG_ARE_ALL_LEVELS_COMPLETE()
|
|
TLG_OUTPUT_ALL_LEVELS_COMPLETE_DATA()
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
|
|
TLG_MAINTAIN_PLAYER_AWARDS()
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ELIF sTLGData.eLevelStage = TLG_WAIT_FOR_DEAD
|
|
IF sTLGData.sPlayerData[0].iDeadTime = 0
|
|
sTLGData.sPlayerData[0].iDeadTime = GET_GAME_TIMER()
|
|
ELSE
|
|
IF GET_GAME_TIMER() - sTLGData.sPlayerData[0].iDeadTime >= ciTLG_WAIT_FOR_DEAD_TIME
|
|
sTLGData.bFadingOut = TRUE
|
|
sTLGData.eLevelStage = TLG_FADING_OUT
|
|
ENDIF
|
|
ENDIF
|
|
ELIF sTLGData.eLevelStage = TLG_FADING_OUT
|
|
|
|
IF sTLGData.iFade >= 255
|
|
TLG_STOP_AUDIO_SCENE(TLG_AUDIO_SCENE_GAMEPLAY)
|
|
TLG_START_AUDIO_SCENE(TLG_AUDIO_SCENE_MENUS)
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_RESULT_SCREEN)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//
|
|
// PROCESS STATES
|
|
//
|
|
|
|
|
|
|
|
// Process INIT
|
|
PROC TLG_PROCESS_CLIENT_STATE_INIT()
|
|
|
|
ARCADE_CABINET_COMMON_INITIALIZATION()
|
|
|
|
TLG_INIT_COLOUR_STRUCTS()
|
|
TLG_INIT_MENU()
|
|
|
|
TLG_INIT_PLAYER_WEAPON()
|
|
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_REQUESTING_ASSETS)
|
|
|
|
ENDPROC
|
|
|
|
// Process REQUESTING ASSETS
|
|
PROC TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS()
|
|
|
|
|
|
//
|
|
// REQUEST_STREAMED_TEXTURE_DICT(sTLGData.tl31BaseTextDict)
|
|
// IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(sTLGData.tl31BaseTextDict)
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading MPLastGunslingers")
|
|
// EXIT
|
|
// ENDIF
|
|
|
|
REQUEST_STREAMED_TEXTURE_DICT(sTLGData.tl31TitleTextDict)
|
|
REQUEST_STREAMED_TEXTURE_DICT(sTLGData.tl31HudTextDict)
|
|
REQUEST_STREAMED_TEXTURE_DICT(sTLGData.tl31LevelSelectTextDict)
|
|
REQUEST_STREAMED_TEXTURE_DICT(sTLGData.tl31EnemiesTextDict)
|
|
REQUEST_STREAMED_TEXTURE_DICT(sTLGData.tl31GameplayCommonTextDict)
|
|
REQUEST_STREAMED_TEXTURE_DICT(sTLGData.tl31ForegroundEnemiesATextDict)
|
|
REQUEST_STREAMED_TEXTURE_DICT(sTLGData.tl31ForegroundEnemiesBTextDict)
|
|
REQUEST_STREAMED_TEXTURE_DICT(sTLGData.tl31ForegroundEnemiesCTextDict)
|
|
REQUEST_STREAMED_TEXTURE_DICT(sTLGData.tl31HostagesTextDict)
|
|
REQUEST_STREAMED_TEXTURE_DICT(sTLGData.tl31CommonPropsTextDict)
|
|
REQUEST_STREAMED_TEXTURE_DICT(sTLGData.tl31LevelCompTextDict)
|
|
REQUEST_STREAMED_TEXTURE_DICT(sTLGData.tl31ResultsTextDict)
|
|
REQUEST_STREAMED_TEXTURE_DICT(sTLGData.tl31DeadTextDict)
|
|
REQUEST_STREAMED_TEXTURE_DICT(sTLGData.tl31Level1TextDict)
|
|
REQUEST_STREAMED_TEXTURE_DICT(sTLGData.tl31FacadeTextDict)
|
|
|
|
IF NOT ARCADE_GAMES_POSTFX_REQUESTING_ASSETS()
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS Loading POSTFX assets")
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(sTLGData.tl31TitleTextDict)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading ", sTLGData.tl31TitleTextDict)
|
|
EXIT
|
|
ENDIF
|
|
|
|
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(sTLGData.tl31HudTextDict)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading ", sTLGData.tl31HudTextDict)
|
|
EXIT
|
|
ENDIF
|
|
|
|
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(sTLGData.tl31FacadeTextDict)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading ", sTLGData.tl31FacadeTextDict)
|
|
EXIT
|
|
ENDIF
|
|
|
|
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(sTLGData.tl31LevelSelectTextDict)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading ", sTLGData.tl31LevelSelectTextDict)
|
|
EXIT
|
|
ENDIF
|
|
|
|
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(sTLGData.tl31LevelCompTextDict)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading ", sTLGData.tl31LevelCompTextDict)
|
|
EXIT
|
|
ENDIF
|
|
|
|
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(sTLGData.tl31Level1TextDict)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading ", sTLGData.tl31Level1TextDict)
|
|
EXIT
|
|
ENDIF
|
|
//
|
|
// REQUEST_STREAMED_TEXTURE_DICT(sTLGData.tl31Level2TextDict)
|
|
// IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(sTLGData.tl31Level2TextDict)
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading ", sTLGData.tl31Level2TextDict)
|
|
// EXIT
|
|
// ENDIF
|
|
//
|
|
// REQUEST_STREAMED_TEXTURE_DICT(sTLGData.tl31Level3TextDict)
|
|
// IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(sTLGData.tl31Level3TextDict)
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading ", sTLGData.tl31Level3TextDict)
|
|
// EXIT
|
|
// ENDIF
|
|
//
|
|
// REQUEST_STREAMED_TEXTURE_DICT(sTLGData.tl31Level4TextDict)
|
|
// IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(sTLGData.tl31Level4TextDict)
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading ", sTLGData.tl31Level4TextDict)
|
|
// EXIT
|
|
// ENDIF
|
|
//
|
|
// REQUEST_STREAMED_TEXTURE_DICT(sTLGData.tl31Level5TextDict)
|
|
// IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(sTLGData.tl31Level5TextDict)
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading ", sTLGData.tl31Level5TextDict)
|
|
// EXIT
|
|
// ENDIF
|
|
|
|
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(sTLGData.tl31EnemiesTextDict)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading ", sTLGData.tl31EnemiesTextDict)
|
|
EXIT
|
|
ENDIF
|
|
|
|
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(sTLGData.tl31GameplayCommonTextDict)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading ", sTLGData.tl31GameplayCommonTextDict)
|
|
EXIT
|
|
ENDIF
|
|
|
|
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(sTLGData.tl31ForegroundEnemiesATextDict)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading ", sTLGData.tl31ForegroundEnemiesATextDict)
|
|
EXIT
|
|
ENDIF
|
|
|
|
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(sTLGData.tl31ForegroundEnemiesBTextDict)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading ", sTLGData.tl31ForegroundEnemiesBTextDict)
|
|
EXIT
|
|
ENDIF
|
|
|
|
|
|
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(sTLGData.tl31ForegroundEnemiesCTextDict)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading ", sTLGData.tl31ForegroundEnemiesCTextDict)
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(sTLGData.tl31HostagesTextDict)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading ", sTLGData.tl31HostagesTextDict)
|
|
EXIT
|
|
ENDIF
|
|
|
|
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(sTLGData.tl31CommonPropsTextDict)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading ", sTLGData.tl31CommonPropsTextDict)
|
|
EXIT
|
|
ENDIF
|
|
|
|
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(sTLGData.tl31ResultsTextDict)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading ", sTLGData.tl31ResultsTextDict)
|
|
EXIT
|
|
ENDIF
|
|
|
|
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(sTLGData.tl31DeadTextDict)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading ", sTLGData.tl31DeadTextDict)
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT REQUEST_SCRIPT_AUDIO_BANK("DLC_HEIST3/H3_ArcMac_BR2")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Waiting for audio")
|
|
EXIT
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD
|
|
IF GET_COMMANDLINE_PARAM_EXISTS("sc_BadlandsSkipIntro")
|
|
TLG_START_AUDIO_SCENE(TLG_AUDIO_SCENE_MENUS)
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_TITLE_SCREEN)
|
|
EXIT
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_FIB)
|
|
|
|
|
|
// DG_START_MOVIE(sTLGData.bmIdTlgIntro, "TLG_Intro") // _1992_DegenatronLogo_720_auto
|
|
//// DG_START_MOVIE(sTLGData.bmIdTlgIntro, "_Pixtro_Intro_80s_1")
|
|
//
|
|
// TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_INTRO)
|
|
|
|
ENDPROC
|
|
|
|
//-- Process intro Bink movie
|
|
PROC TLG_PROCESS_CLIENT_INTRO()
|
|
|
|
//Wait for the intro movie to finish
|
|
TLG_DRAW_MENU_BACKGROUND()
|
|
|
|
FLOAT fRatioWidth = 1.0 * GET_ASPECT_RATIO_MODIFIER_FROM_ASPECT_RATIO()
|
|
FLOAT fRatioHeight = 1.0
|
|
BOOL bMovieFinished = DG_DRAW_MOVIE(sTLGData.bmIdTlgIntro, fRatioWidth, fRatioHeight)
|
|
// ARCADE_GAMES_POSTFX_DRAW()
|
|
|
|
TWS_DRAW_FRONT_FX()
|
|
|
|
IF NOT bMovieFinished
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "{DSW} [TLG_PROCESS_CLIENT_INTRO] Movie Time: ", GET_BINK_MOVIE_TIME(sTLGData.bmIdTlgIntro))
|
|
IF NOT IS_BIT_SET(sTLGData.iMusicBitset, ENUM_TO_INT(TLG_MUSIC_BIT_STARTED_INTRO))
|
|
IF GET_BINK_MOVIE_TIME(sTLGData.bmIdTlgIntro) >= 34.0
|
|
TLG_TRIGGER_MUSIC_EVENT(TLG_MUSIC_EVENT_INTRO)
|
|
SET_BIT(sTLGData.iMusicBitset, ENUM_TO_INT(TLG_MUSIC_BIT_STARTED_INTRO))
|
|
ENDIF
|
|
ENDIF
|
|
EXIT
|
|
ENDIF
|
|
|
|
TLG_START_AUDIO_SCENE(TLG_AUDIO_SCENE_MENUS)
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_TITLE_SCREEN)
|
|
|
|
ENDPROC
|
|
|
|
|
|
PROC TLG_PROCESS_CLIENT_STATE_FIB
|
|
TLG_DRAW_MENU_BACKGROUND()
|
|
|
|
// ARCADE_DRAW_PIXELSPACE_SPRITE(sTLGData.tl31BaseTextDict, "ARCADE_FIB", INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), INIT_VECTOR_2D(cfTLG_FIB_SCREEN_WIDTH, cfTLG_FIB_SCREEN_HEIGHT), 0, sTLGData.rgbaSprite)
|
|
ARCADE_DRAW_PIXELSPACE_SPRITE(sTLGData.tl31TitleTextDict, "BADLANDS_PSA_SCREEN", INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), INIT_VECTOR_2D(cfTLG_FIB_SCREEN_WIDTH, cfTLG_FIB_SCREEN_HEIGHT), 0, sTLGData.rgbaSprite)
|
|
|
|
TWS_DRAW_FRONT_FX()
|
|
|
|
IF sTLGData.iTimer = 0
|
|
sTLGData.iTimer = GET_GAME_TIMER()
|
|
ELSE
|
|
IF GET_GAME_TIMER() - sTLGData.iTimer > 5000
|
|
OR TLG_IS_PLAYER_SHOOTING()
|
|
DG_START_MOVIE(sTLGData.bmIdTlgIntro, "TLG_Intro") // _1992_DegenatronLogo_720_auto
|
|
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_INTRO)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC TLG_TRIGGER_TITLE_MUSIC()
|
|
IF NOT IS_BIT_SET(sTLGData.iMusicBitset, ENUM_TO_INT(TLG_MUSIC_BIT_STARTED_TITLE))
|
|
CPRINTLN(DEBUG_MINIGAME, "[TLG_TRIGGER_TITLE_MUSIC] Called. CallstacK:")
|
|
DEBUG_PRINTCALLSTACK()
|
|
TLG_TRIGGER_MUSIC_EVENT(TLG_MUSIC_EVENT_TITLE)
|
|
SET_BIT(sTLGData.iMusicBitset, ENUM_TO_INT(TLG_MUSIC_BIT_STARTED_TITLE))
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// Process TITLE SCREEN
|
|
PROC TLG_PROCESS_CLIENT_STATE_TITLE_SCREEN()
|
|
|
|
TLG_TRIGGER_TITLE_MUSIC()
|
|
|
|
TLG_PROCESS_MENU_CONTROLS()
|
|
TLG_HANDLE_PLAYER_SHOOTING(0, TRUE)
|
|
TLG_DRAW_CLIENT_STATE_TITLE_SCREEN()
|
|
TLG_MAINTAIN_HELP_TEXT()
|
|
|
|
ENDPROC
|
|
|
|
// Process STATE MENU
|
|
PROC TLG_PROCESS_CLIENT_STATE_MENU()
|
|
TLG_TRIGGER_TITLE_MUSIC()
|
|
|
|
TLG_PROCESS_MENU_CONTROLS()
|
|
TLG_HANDLE_PLAYER_SHOOTING(0, TRUE)
|
|
TLG_DRAW_CLIENT_STATE_MENU()
|
|
TLG_CHECK_PLAYER_RETURNING_TO_MENU(TRUE)
|
|
TLG_MAINTAIN_HELP_TEXT()
|
|
ENDPROC
|
|
|
|
// Process INIT LEVEL
|
|
PROC TLG_PROCESS_CLIENT_STATE_INIT_LEVEL()
|
|
#IF IS_DEBUG_BUILD
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_PROCESS_CLIENT_STATE_INIT_LEVEL] {DSW} Called. Level: ", TLG_GET_LEVEL_NAME_AS_STRING(TLG_GET_CURRENT_LEVEL()))
|
|
#ENDIF
|
|
|
|
//-- Need to still draw the menu during this frame
|
|
TLG_DRAW_CLIENT_STATE_MENU()
|
|
|
|
TEXT_LABEL_31 tl31TextDict = TLG_GET_TEXTURE_DICTIONARY_FOR_LEVEL(sTLGData.eCurrentLevel)
|
|
REQUEST_STREAMED_TEXTURE_DICT(tl31TextDict)
|
|
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(tl31TextDict)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] {dsw} TLG_PROCESS_CLIENT_STATE_INIT_LEVEL - Loading ", tl31TextDict)
|
|
EXIT
|
|
ENDIF
|
|
|
|
INT i
|
|
|
|
i = 0
|
|
REPEAT ciTLG_MAX_SCREENS i
|
|
sTLGData.iPropToStopOn[i] = -1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_PROCESS_CLIENT_STATE_INIT_LEVEL] {DSW} sTLGData.iPropToStopOn[", i, "] = ", sTLGData.iPropToStopOn[i])
|
|
ENDREPEAT
|
|
|
|
|
|
|
|
TLG_INIT_COVER_POINTS(sTLGData.eCurrentLevel)
|
|
TLG_INIT_ENEMIES()
|
|
TLG_INIT_HOSTAGES()
|
|
TLG_INIT_PLAYERS()
|
|
TLG_INIT_BACKGROUND(sTLGData.eCurrentLevel)
|
|
TLG_INIT_COLLECTIBLE_POINTS()
|
|
TLG_INIT_PLAY_VARIABLES()
|
|
TLG_INIT_SOUND()
|
|
TLG_RESET_LOCAL_PLAYER_SCORE_FOR_CURRENT_LEVEL()
|
|
|
|
TLG_STOP_AUDIO_SCENE(TLG_AUDIO_SCENE_MENUS)
|
|
TLG_START_AUDIO_SCENE(TLG_AUDIO_SCENE_GAMEPLAY)
|
|
|
|
// TLG_PLAY_SOUND_NO_POSITION(TLG_AUDIO_EFFECT_GET_READY)
|
|
|
|
TLG_HANDLE_PLAYER_WEAPON_COCKED_AUDIO()
|
|
|
|
sTLGData.iLocalLevelRunningTime = GET_GAME_TIMER()
|
|
// sTLGData.iLevelBitset[ENUM_TO_INT(sTLGData.eCurrentLevel)] = 0
|
|
sTLGData.iLevelCurrentStage[ENUM_TO_INT(sTLGData.eCurrentLevel)] = 0
|
|
sTLGData.iTotalLevelShots[sTLGData.eCurrentLevel] = 0
|
|
sTLGData.iTotalLevelEnemyHits[sTLGData.eCurrentLevel] = 0
|
|
sTLGData.iTotalLevelEnemyHeadShots[sTLGData.eCurrentLevel] = 0
|
|
sTLGData.iTotalPowerupsCollected[sTLGData.eCurrentLevel] = 0
|
|
sTLGData.iStaggeredOnScreenViableCoverCount = 0
|
|
TLG_RESET_SCREEN_TO_STOP_ON()
|
|
stlgData.iCurrentScreen = 1
|
|
stlgData.fRightMostCoverX = 99999999.0
|
|
sTLGData.iRightMostCover = -1
|
|
REPEAT ciTLG_MAX_LANES i
|
|
sTLGData.iCurrentActiveEnemies[i] = 0
|
|
sTLGData.iTimeSinceEnemyActive[i] = 0
|
|
ENDREPEAT
|
|
|
|
sTLGData.iResultsScreenTimer = 0
|
|
sTLGData.iResultsScreenTimeout = 0
|
|
sTLGData.iReturnToMenuTimeout = 0
|
|
|
|
TLG_CLEAR_LEVEL_BIT_FOR_LEVEL(sTLGData.eCurrentLevel, TLG_LEVELS_BIT_SHOULD_STOP)
|
|
TLG_CLEAR_LEVEL_BIT_FOR_LEVEL(sTLGData.eCurrentLevel, TLG_LEVELS_BIT_STOPPED)
|
|
TLG_CLEAR_LEVEL_BIT_FOR_LEVEL(sTLGData.eCurrentLevel, TLG_LEVELS_BIT_DONE_RESULTS_SCREEN_AUDIO)
|
|
TLG_CLEAR_LEVEL_BIT_FOR_LEVEL(sTLGData.eCurrentLevel, TLG_LEVELS_BIT_ADDED_ON_ACCURACY_BONUS)
|
|
TLG_CLEAR_LEVEL_BIT_FOR_LEVEL(sTLGData.eCurrentLevel, TLG_LEVELS_BIT_ADDED_ON_HOSTAGE_BONUS)
|
|
TLG_CLEAR_LEVEL_BIT_FOR_LEVEL(sTLGData.eCurrentLevel, TLG_LEVELS_BIT_PLAYED_DEATH_SCREEN_AUDIO)
|
|
TLG_CLEAR_LEVEL_BIT_FOR_LEVEL(sTLGData.eCurrentLevel, TLG_LEVELS_BIT_PLAYED_ACCURACY_SCORE_AUDIO)
|
|
TLG_CLEAR_LEVEL_BIT_FOR_LEVEL(sTLGData.eCurrentLevel, TLG_LEVELS_BIT_PLAYED_RESULTS_SCORE_AUDIO)
|
|
TLG_CLEAR_LEVEL_BIT_FOR_LEVEL(sTLGData.eCurrentLevel, TLG_LEVELS_BIT_PLAYED_HOSTAGE_SCORE_AUDIO)
|
|
TLG_CLEAR_LEVEL_BIT_FOR_LEVEL(sTLGData.eCurrentLevel, TLG_LEVELS_BIT_PLAYED_DEATH_SCREEN_AUDIO)
|
|
TLG_CLEAR_LEVEL_BIT_FOR_LEVEL(sTLGData.eCurrentLevel, TLG_LEVELS_BIT_PLAYED_RESULTS_DEAD_AUDIO)
|
|
|
|
IF TLG_GET_LOCAL_PLAYER_HI_SCORE_FOR_LEVEL(TLG_GET_CURRENT_LEVEL_AS_INT()) > 0
|
|
TLG_SET_LEVEL_BIT_FOR_CURRENT_LEVEL(TLG_LEVELS_BIT_REPLAYING_LEVEL)
|
|
ENDIF
|
|
|
|
CLEAR_BIT(sTLGData.iMusicBitset, ENUM_TO_INT(TLG_MUSIC_BIT_STARTED_TITLE))
|
|
CLEAR_BIT(sTLGData.iMusicBitset, ENUM_TO_INT(TLG_MUSIC_BIT_STOPPED))
|
|
CLEAR_BIT(sTLGData.iMusicBitset, ENUM_TO_INT(TLG_MUSIC_BIT_DEATH))
|
|
ARCADE_GAMES_HELP_TEXT_CLEAR()
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_PLAYING)
|
|
|
|
TLG_PREPARE_MUSIC_EVENT(TLG_MUSIC_EVENT_DEATH)
|
|
TLG_TRIGGER_MUSIC_EVENT(TLG_GET_MUSIC_EVENT_FOR_LEVEL(TLG_GET_CURRENT_LEVEL()))
|
|
ENDPROC
|
|
|
|
// Process PLAYING
|
|
PROC TLG_PROCESS_CLIENT_STATE_PLAYING()
|
|
|
|
TLG_HANDLE_ENEMIES()
|
|
|
|
TLG_HANDLE_THROWN_ENEMY_PROJECTILES()
|
|
|
|
TLG_HANDLE_HOSTAGES()
|
|
|
|
TLG_HANDLE_PLAYER_SHOOTING(0)
|
|
|
|
TLG_HANDLE_PLAYER_RELOADING()
|
|
|
|
TLG_HANDLE_PLAYER_MOVEMENT()
|
|
|
|
TLG_HANDLE_PLAYER_ABILITIES()
|
|
|
|
TLG_HANDLE_FX()
|
|
|
|
TLG_CHECK_PLAYER_PROGRESS()
|
|
|
|
TLG_DRAW_CLIENT_STATE_PLAYING()
|
|
|
|
TLG_HANDLE_LEVEL_INTRO_AUDIO()
|
|
|
|
TLG_MAINTAIN_HELP_TEXT()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF GET_COMMANDLINE_PARAM_EXISTS("sc_BadlandsReturnToMenuInGame")
|
|
TLG_CHECK_PLAYER_RETURNING_TO_MENU(TRUE)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL TLG_IS_SCORE_POOR_FOR_CURRENT_LEVEL()
|
|
INT iScore = TLG_GET_LOCAL_PLAYER_SCORE_FOR_LEVEL(TLG_GET_CURRENT_LEVEL_AS_INT())
|
|
|
|
SWITCH TLG_GET_CURRENT_LEVEL()
|
|
CASE TLG_LEVEL_DESERT
|
|
RETURN iScore < 1000
|
|
BREAK
|
|
|
|
CASE TLG_LEVEL_TOWN
|
|
RETURN iScore < 1000
|
|
BREAK
|
|
|
|
CASE TLG_LEVEL_FOREST
|
|
RETURN iScore < 1000
|
|
BREAK
|
|
|
|
CASE TLG_LEVEL_MINE
|
|
RETURN iScore < 1000
|
|
BREAK
|
|
|
|
CASE TLG_LEVEL_GRAVEYARD
|
|
RETURN iScore < 1000
|
|
BREAK
|
|
ENDSWITCH
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL TLG_IS_SCORE_AVERAGE_FOR_CURRENT_LEVEL()
|
|
INT iScore = TLG_GET_LOCAL_PLAYER_SCORE_FOR_LEVEL(TLG_GET_CURRENT_LEVEL_AS_INT())
|
|
|
|
SWITCH TLG_GET_CURRENT_LEVEL()
|
|
CASE TLG_LEVEL_DESERT
|
|
RETURN iScore < 1500
|
|
BREAK
|
|
|
|
CASE TLG_LEVEL_TOWN
|
|
RETURN iScore < 1500
|
|
BREAK
|
|
|
|
CASE TLG_LEVEL_FOREST
|
|
RETURN iScore < 1500
|
|
BREAK
|
|
|
|
CASE TLG_LEVEL_MINE
|
|
RETURN iScore < 1500
|
|
BREAK
|
|
|
|
CASE TLG_LEVEL_GRAVEYARD
|
|
RETURN iScore < 1500
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL TLG_IS_SCORE_GOOD_FOR_CURRENT_LEVEL()
|
|
INT iScore = TLG_GET_LOCAL_PLAYER_SCORE_FOR_LEVEL(TLG_GET_CURRENT_LEVEL_AS_INT())
|
|
|
|
SWITCH TLG_GET_CURRENT_LEVEL()
|
|
CASE TLG_LEVEL_DESERT
|
|
RETURN iScore < 2000
|
|
BREAK
|
|
|
|
CASE TLG_LEVEL_TOWN
|
|
RETURN iScore < 2000
|
|
BREAK
|
|
|
|
CASE TLG_LEVEL_FOREST
|
|
RETURN iScore < 2000
|
|
BREAK
|
|
|
|
CASE TLG_LEVEL_MINE
|
|
RETURN iScore < 2000
|
|
BREAK
|
|
|
|
CASE TLG_LEVEL_GRAVEYARD
|
|
RETURN iScore < 2000
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC BOOL TLG_IS_SCORE_AMAZING_FOR_CURRENT_LEVEL()
|
|
INT iScore = TLG_GET_LOCAL_PLAYER_SCORE_FOR_LEVEL(TLG_GET_CURRENT_LEVEL_AS_INT())
|
|
|
|
SWITCH TLG_GET_CURRENT_LEVEL()
|
|
CASE TLG_LEVEL_DESERT
|
|
RETURN iScore >= 2000
|
|
BREAK
|
|
|
|
CASE TLG_LEVEL_TOWN
|
|
RETURN iScore >= 2000
|
|
BREAK
|
|
|
|
CASE TLG_LEVEL_FOREST
|
|
RETURN iScore >= 2000
|
|
BREAK
|
|
|
|
CASE TLG_LEVEL_MINE
|
|
RETURN iScore >= 2000
|
|
BREAK
|
|
|
|
CASE TLG_LEVEL_GRAVEYARD
|
|
RETURN iScore >= 2000
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC TLG_INIT_GOTO_LEADERBOARD()
|
|
INT i
|
|
FOR i = 0 TO ciTLG_MAX_BACKGROUND_ELEMS - 1
|
|
sTLGData.sBackgroundData[i].bRendering = FALSE
|
|
ENDFOR
|
|
|
|
TLG_RESET_ALL_COVER()
|
|
|
|
sTLGData.iNumberOfBackgroundElements = 0
|
|
|
|
TLG_INIT_BACKGROUND(TLG_LEVEL_DESERT)
|
|
TLG_INIT_COVER_POINTS(TLG_LEVEL_DESERT)
|
|
ENDPROC
|
|
// Process RESULT SCREEN
|
|
PROC TLG_PROCESS_CLIENT_STATE_RESULT_SCREEN()
|
|
BOOL bDoFinalScene
|
|
|
|
IF sTLGData.iResultsScreenTimer = 0
|
|
sTLGData.iResultsScreenTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
IF TLG_ARE_ALL_LEVELS_COMPLETE() AND NOT sTLGData.bPlayedOutro
|
|
bDoFinalScene = TRUE
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF GET_COMMANDLINE_PARAM_EXISTS("sc_badlandsForceOutro")
|
|
bDoFinalScene = TRUE
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
TLG_MAINTAIN_HELP_TEXT()
|
|
|
|
TLG_DRAW_CLIENT_STATE_RESULT_SCREEN(bDoFinalScene)
|
|
|
|
BOOL bShouldGoToLeaderboard
|
|
// INT i
|
|
|
|
IF sTLGData.sPlayerData[0].fHealth <= 0.0
|
|
bShouldGoToLeaderboard = TRUE
|
|
IF NOT IS_BIT_SET(sTLGData.iMusicBitset, ENUM_TO_INT(TLG_MUSIC_BIT_DEATH))
|
|
TLG_TRIGGER_MUSIC_EVENT(TLG_MUSIC_EVENT_DEATH)
|
|
SET_BIT(sTLGData.iMusicBitset, ENUM_TO_INT(TLG_MUSIC_BIT_DEATH))
|
|
ENDIF
|
|
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_PROCESS_CLIENT_STATE_RESULT_SCREEN] {DSW} bShouldGoToLeaderboard = TRUE Player health: ", sTLGData.sPlayerData[0].fHealth)
|
|
ELSE
|
|
//IF TLG_ARE_ALL_LEVELS_COMPLETE() AND NOT sTLGData.bPlayedOutro
|
|
IF bDoFinalScene
|
|
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
|
|
OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
|
|
OR (GET_GAME_TIMER() - sTLGData.iResultsScreenTimer ) > 10000
|
|
DG_START_MOVIE(sTLGData.bmIdTlgOutro, "TLG_Outro")
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_OUTRO_MOVIE)
|
|
ENDIF
|
|
ELSE
|
|
TLG_CHECK_PLAYER_RETURNING_TO_MENU(FALSE, TRUE, DEFAULT, TRUE)
|
|
ENDIF
|
|
|
|
//-- Audio for results screen
|
|
IF NOT TLG_IS_LEVEL_BIT_SET_FOR_CURRENT_LEVEL(TLG_LEVELS_BIT_DONE_RESULTS_SCREEN_AUDIO)
|
|
IF TLG_IS_SCORE_POOR_FOR_CURRENT_LEVEL()
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_SCORE_BAD)
|
|
ELIF TLG_IS_SCORE_AVERAGE_FOR_CURRENT_LEVEL()
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_SCORE_AVERAGE)
|
|
ELIF TLG_IS_SCORE_GOOD_FOR_CURRENT_LEVEL()
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_SCORE_GOOD)
|
|
ELIF TLG_IS_SCORE_AMAZING_FOR_CURRENT_LEVEL()
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_SCORE_AMAZING)
|
|
ENDIF
|
|
|
|
TLG_SET_LEVEL_BIT_FOR_CURRENT_LEVEL(TLG_LEVELS_BIT_DONE_RESULTS_SCREEN_AUDIO)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
|
|
IF bShouldGoToLeaderboard
|
|
IF TLG_SHOULD_SKIP_LEADERBOARD()
|
|
TLG_CHECK_PLAYER_RETURNING_TO_MENU(FALSE, TRUE, DEFAULT, TRUE)
|
|
ELSE
|
|
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
|
|
OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
|
|
OR (GET_GAME_TIMER() - sTLGData.iResultsScreenTimer ) > 10000
|
|
TLG_INIT_GOTO_LEADERBOARD()
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_EDIT_LEADERBOARD)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC TLG_PROCESS_CLIENT_STATE_OUTRO_MOVIE()
|
|
TLG_DRAW_MENU_BACKGROUND()
|
|
|
|
FLOAT fRatioWidth = 1.0 * GET_ASPECT_RATIO_MODIFIER_FROM_ASPECT_RATIO()
|
|
FLOAT fRatioHeight = 1.0
|
|
BOOL bMovieFinished = DG_DRAW_MOVIE(sTLGData.bmIdTlgOutro, fRatioWidth, fRatioHeight)
|
|
|
|
TWS_DRAW_FRONT_FX()
|
|
|
|
IF NOT bMovieFinished
|
|
//CDEBUG1LN(DEBUG_MINIGAME, "{DSW} [TLG_PROCESS_CLIENT_STATE_OUTRO_MOVIE] Movie Time: ", GET_BINK_MOVIE_TIME(sTLGData.bmIdTlgOutro))
|
|
IF NOT sTLGData.bPlayedOutroAudio
|
|
IF GET_BINK_MOVIE_TIME(sTLGData.bmIdTlgOutro) >= 76.0
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_FINISH_GAME)
|
|
sTLGData.bPlayedOutroAudio = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
EXIT
|
|
ENDIF
|
|
|
|
sTLGData.bPlayedOutro = TRUE
|
|
|
|
IF NOT TLG_SHOULD_SKIP_LEADERBOARD()
|
|
TLG_INIT_GOTO_LEADERBOARD()
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_EDIT_LEADERBOARD)
|
|
ELSE
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_TITLE_SCREEN)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC TLG_PROCESS_CLIENT_STATE_VIEW_LEADERBOARD()
|
|
TLG_DRAW_CLIENT_STATE_LEADERBOARD()
|
|
|
|
TLG_CHECK_PLAYER_RETURNING_TO_MENU(TRUE, TRUE, TRUE)
|
|
ENDPROC
|
|
|
|
PROC TLG_PROCESS_CLIENT_STATE_EDIT_LEADERBOARD()
|
|
TLG_TRIGGER_TITLE_MUSIC()
|
|
INT iPlayerScore
|
|
// INT iPlayerScore = 50000//TLG_GET_LOCAL_PLAYER_TOTAL_SCORE()
|
|
// playerBd[PARTICIPANT_ID_TO_INT()].iLeaderboardScore = iPlayerScore
|
|
|
|
IF playerBd[PARTICIPANT_ID_TO_INT()].iLeaderboardScore != TLG_GET_LOCAL_PLAYER_TOTAL_SCORE()
|
|
playerBd[PARTICIPANT_ID_TO_INT()].iLeaderboardScore = TLG_GET_LOCAL_PLAYER_TOTAL_SCORE()
|
|
ENDIF
|
|
|
|
iPlayerScore = playerBd[PARTICIPANT_ID_TO_INT()].iLeaderboardScore
|
|
BOOL bServerReady = IS_BIT_SET(tlgServerBd.iSortLbForPart, PARTICIPANT_ID_TO_INT())
|
|
|
|
//ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY(sTLGData.sLbData, tlgServerBd.sLeaderboard, playerBd, playerBd[PARTICIPANT_ID_TO_INT()].iLeaderboardInitials, iPlayerScore, bServerReady)
|
|
ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY(sTLGData.sLbData, tlgServerBd.sLeaderboard, playerBd[PARTICIPANT_ID_TO_INT()].iLeaderboardInitials, iPlayerScore, bServerReady)
|
|
|
|
TLG_DRAW_CLIENT_STATE_LEADERBOARD()
|
|
|
|
IF NOT sTLGData.sLbData.bEditing
|
|
TLG_SEND_TELEMETRY()
|
|
TLG_RESET_LOCAL_PLAYER_SCORE_FOR_CURRENT_LEVEL()
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_VIEW_LEADERBOARD)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// Process CLEANUP
|
|
PROC TLG_CLEANUP_AND_EXIT_CLIENT()
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [TLG_CLEANUP_AND_EXIT_CLIENT] - Cleaning up and terminating the script")
|
|
|
|
TLG_CANCEL_MUSIC_EVENT(TLG_MUSIC_EVENT_DEATH)
|
|
TLG_TRIGGER_MUSIC_EVENT(TLG_MUSIC_EVENT_STOP)
|
|
|
|
//TLG_SEND_TELEMETRY()
|
|
|
|
sTLGData.sArcadeAnimData.bHoldLastFrame = FALSE
|
|
sTLGData.sArcadeAnimData.bLoopAnim = FALSE
|
|
IF sTLGData.ePlayerPedAnimState = TLG_PLAYER_PED_ANIM_IDLE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [TLG_CLEANUP_AND_EXIT_CLIENT] - ARCADE_CABINET_ANIM_CLIP_EXIT")
|
|
PLAY_ARCADE_CABINET_ANIMATION(sTLGData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_EXIT)
|
|
ELSE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [TLG_CLEANUP_AND_EXIT_CLIENT] - ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_EXIT_FROM_AIM")
|
|
PLAY_ARCADE_CABINET_ANIMATION(sTLGData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_EXIT_FROM_AIM)
|
|
ENDIF
|
|
ARCADE_CABINET_COMMON_CLEANUP()
|
|
|
|
ARCADE_GAMES_HELP_TEXT_CLEAR()
|
|
|
|
TLG_STOP_AUDIO_SCENE(TLG_AUDIO_SCENE_MENUS)
|
|
TLG_STOP_AUDIO_SCENE(TLG_AUDIO_SCENE_GAMEPLAY)
|
|
DG_CLEAN_UP_MOVIE(sTLGData.bmIdTlgIntro)
|
|
DG_CLEAN_UP_MOVIE(sTLGData.bmIdTlgOutro)
|
|
//SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED(sTLGData.tl31BaseTextDict)
|
|
|
|
TERMINATE_THIS_MULTIPLAYER_THREAD_NO_ARGS()
|
|
|
|
ENDPROC
|
|
|
|
FUNC ARCADE_CABINET_ANIM_CLIPS TLG_GET_PLAY_IDLE_CLIP_FROM_COUNT(INT iCount)
|
|
ARCADE_CABINET_ANIM_CLIPS ePlayIdle
|
|
SWITCH iCount
|
|
CASE 0 ePlayIdle = ARCADE_CABINET_ANIM_CLIP_PLAY_IDLE BREAK
|
|
CASE 1 ePlayIdle = ARCADE_CABINET_ANIM_CLIP_PLAY_IDLE_V2 BREAK
|
|
CASE 2 ePlayIdle = ARCADE_CABINET_ANIM_CLIP_PLAY_IDLE_V3 BREAK
|
|
CASE 3 ePlayIdle = ARCADE_CABINET_ANIM_CLIP_PLAY_IDLE_V4 BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN ePlayIdle
|
|
ENDFUNC
|
|
|
|
FUNC BOOL TLG_SHOULD_PLAY_NEXT_PLAY_IDLE_ANIM()
|
|
IF sTLGData.iIdleAnimCount = -1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [TLG_SHOULD_PLAY_NEXT_PLAY_IDLE_ANIM] True - iIdleAnimCount: ", sTLGData.iIdleAnimCount)
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
INT iCurrent = sTLGData.iIdleAnimCount - 1
|
|
IF iCurrent < 0
|
|
iCurrent = 0
|
|
ENDIF
|
|
ARCADE_CABINET_ANIM_CLIPS ePlayIdle = TLG_GET_PLAY_IDLE_CLIP_FROM_COUNT(sTLGData.iIdleAnimCount)
|
|
|
|
IF IS_PLAYER_PLAYING_THIS_ARCADE_CABINET_ANIMATION_CLIP(ePlayIdle)
|
|
IF HAS_ARCADE_CABINET_ANIMATION_CLIP_FINISHED(ePlayIdle)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [TLG_SHOULD_PLAY_NEXT_PLAY_IDLE_ANIM] True - Previous idle finished COunt:: ", iCurrent)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
PROC TLG_PROCESS_PLAYER_PED_ANIMS()
|
|
/*
|
|
url:bugstar:6022461
|
|
PLAY_ARCADE_CABINET_ANIMATION(eAnimEvent, ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_LEVEL_COMPLETE)
|
|
PLAY_ARCADE_CABINET_ANIMATION(eAnimEvent, ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_LOSE_LIFE)
|
|
PLAY_ARCADE_CABINET_ANIMATION(eAnimEvent, ARCADE_CABINET_ANIM_CLIP_WIN)
|
|
PLAY_ARCADE_CABINET_ANIMATION(eAnimEvent, ARCADE_CABINET_ANIM_CLIP_LOSE)
|
|
*/
|
|
ARCADE_CABINET_ANIM_CLIPS ePlayIdle
|
|
SWITCH sTLGData.ePlayerPedAnimState
|
|
//-- Idle (stand)
|
|
CASE TLG_PLAYER_PED_ANIM_IDLE
|
|
IF sTLGData.eClientState = TLG_ARCADE_CLIENT_STATE_LEVEL_SELECTION_MENU
|
|
sTLGData.sArcadeAnimData.bHoldLastFrame = TRUE
|
|
sTLGData.sArcadeAnimData.bLoopAnim = FALSE
|
|
sTLGData.sArcadeAnimData.fBlendInDelta = SLOW_BLEND_IN
|
|
sTLGData.sArcadeAnimData.fBlendOutDelta = SLOW_BLEND_OUT
|
|
PLAY_ARCADE_CABINET_ANIMATION(sTLGData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_IDLE_TO_AIM)
|
|
|
|
TLG_SET_PLAYER_PED_ANIM_STATE(TLG_PLAYER_PED_ANIM_IDLE_TO_AIM)
|
|
ENDIF
|
|
BREAK
|
|
|
|
//-- Idle (stand) -> Aiming
|
|
CASE TLG_PLAYER_PED_ANIM_IDLE_TO_AIM
|
|
IF IS_PLAYER_PLAYING_THIS_ARCADE_CABINET_ANIMATION_CLIP(ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_IDLE_TO_AIM)
|
|
IF HAS_ARCADE_CABINET_ANIMATION_CLIP_FINISHED(ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_IDLE_TO_AIM)
|
|
sTLGData.sArcadeAnimData.bHoldLastFrame = FALSE
|
|
sTLGData.sArcadeAnimData.bLoopAnim = TRUE
|
|
sTLGData.sArcadeAnimData.fBlendInDelta = SLOW_BLEND_IN
|
|
sTLGData.sArcadeAnimData.fBlendOutDelta = SLOW_BLEND_OUT
|
|
PLAY_ARCADE_CABINET_ANIMATION(sTLGData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_AIM_IDLE)
|
|
|
|
sTLGData.iIdleAnimCount = -1
|
|
TLG_SET_PLAYER_PED_ANIM_STATE(TLG_PLAYER_PED_ANIM_AIM_IDLE)
|
|
ELSE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_PROCESS_PLAYER_PED_ANIMS] {DSW} Waiting for HAS_ARCADE_CABINET_ANIMATION_CLIP_FINISHED - ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_IDLE_TO_AIM")
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
//-- Idle (Aiming) -> Idle (playing)
|
|
CASE TLG_PLAYER_PED_ANIM_AIM_IDLE
|
|
IF sTLGData.eClientState = TLG_ARCADE_CLIENT_STATE_PLAYING
|
|
IF TLG_GET_LOCAL_PLAYER_HEALTH() > 0.0
|
|
AND TLG_GET_TOTAL_NUMBER_OF_ENEMIES_ALIVE() > 0
|
|
IF TLG_SHOULD_PLAY_NEXT_PLAY_IDLE_ANIM()
|
|
sTLGData.iIdleAnimCount++
|
|
|
|
IF sTLGData.iIdleAnimCount > 3
|
|
sTLGData.iIdleAnimCount = 0
|
|
ENDIF
|
|
|
|
|
|
ePlayIdle = TLG_GET_PLAY_IDLE_CLIP_FROM_COUNT(sTLGData.iIdleAnimCount)
|
|
SWITCH sTLGData.iIdleAnimCount
|
|
CASE 0 ePlayIdle = ARCADE_CABINET_ANIM_CLIP_PLAY_IDLE BREAK
|
|
CASE 1 ePlayIdle = ARCADE_CABINET_ANIM_CLIP_PLAY_IDLE_V2 BREAK
|
|
CASE 2 ePlayIdle = ARCADE_CABINET_ANIM_CLIP_PLAY_IDLE_V3 BREAK
|
|
CASE 3 ePlayIdle = ARCADE_CABINET_ANIM_CLIP_PLAY_IDLE_V4 BREAK
|
|
ENDSWITCH
|
|
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_PROCESS_PLAYER_PED_ANIMS] {DSW} Starting play_idle, var: ", sTLGData.iIdleAnimCount)
|
|
|
|
|
|
sTLGData.sArcadeAnimData.fBlendInDelta = REALLY_SLOW_BLEND_IN
|
|
sTLGData.sArcadeAnimData.fBlendOutDelta = REALLY_SLOW_BLEND_OUT
|
|
PLAY_ARCADE_CABINET_ANIMATION(sTLGData.sArcadeAnimData, ePlayIdle)
|
|
sTLGData.bDoneReactionAnim = FALSE
|
|
// TLG_SET_PLAYER_PED_ANIM_STATE(TLG_PLAYER_PED_ANIM_PLAY_IDLE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF NOT sTLGData.bDoneReactionAnim
|
|
IF TLG_GET_LOCAL_PLAYER_HEALTH() <= 0.0
|
|
sTLGData.sArcadeAnimData.fBlendInDelta = SLOW_BLEND_IN
|
|
sTLGData.sArcadeAnimData.fBlendOutDelta = SLOW_BLEND_OUT
|
|
sTLGData.sArcadeAnimData.bLoopAnim = FALSE
|
|
sTLGData.sArcadeAnimData.bHoldLastFrame = TRUE
|
|
PLAY_ARCADE_CABINET_ANIMATION(sTLGData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_LOSE_LIFE)
|
|
|
|
TLG_SET_PLAYER_PED_ANIM_STATE(TLG_PLAYER_PED_ANIM_AIM_IDLE_TO_LOSE_LIFE)
|
|
sTLGData.bDoneReactionAnim = TRUE
|
|
ELSE
|
|
IF sTLGData.eClientState = TLG_ARCADE_CLIENT_STATE_PLAYING
|
|
OR sTLGData.eClientState = TLG_ARCADE_CLIENT_STATE_RESULT_SCREEN
|
|
IF (TLG_GET_LOCAL_PLAYER_HEALTH() > 0.0 AND TLG_GET_TOTAL_NUMBER_OF_ENEMIES_ALIVE() = 0)
|
|
|
|
sTLGData.sArcadeAnimData.fBlendInDelta = SLOW_BLEND_IN
|
|
sTLGData.sArcadeAnimData.fBlendOutDelta = SLOW_BLEND_OUT
|
|
sTLGData.sArcadeAnimData.bLoopAnim = FALSE
|
|
sTLGData.sArcadeAnimData.bHoldLastFrame = TRUE
|
|
|
|
IF TLG_ARE_ALL_LEVELS_COMPLETE()
|
|
AND NOT sTLGData.bPlayedWinningAnim
|
|
sTLGData.bPlayedWinningAnim = TRUE
|
|
PLAY_ARCADE_CABINET_ANIMATION(sTLGData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_WIN)
|
|
|
|
TLG_SET_PLAYER_PED_ANIM_STATE(TLG_PLAYER_PED_ANIM_AIM_IDLE_TO_COMPLETE_GAME)
|
|
ELSE
|
|
PLAY_ARCADE_CABINET_ANIMATION(sTLGData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_LEVEL_COMPLETE)
|
|
|
|
TLG_SET_PLAYER_PED_ANIM_STATE(TLG_PLAYER_PED_ANIM_AIM_IDLE_TO_COMPLETE_STAGE)
|
|
|
|
ENDIF
|
|
|
|
sTLGData.bDoneReactionAnim = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
// CASE TLG_PLAYER_PED_ANIM_PLAY_IDLE
|
|
// IF TLG_GET_LOCAL_PLAYER_HEALTH() <= 0.0
|
|
// sTLGData.sArcadeAnimData.fBlendInDelta = SLOW_BLEND_IN
|
|
// sTLGData.sArcadeAnimData.fBlendOutDelta = SLOW_BLEND_OUT
|
|
// sTLGData.sArcadeAnimData.bLoopAnim = FALSE
|
|
// sTLGData.sArcadeAnimData.bHoldLastFrame = TRUE
|
|
// PLAY_ARCADE_CABINET_ANIMATION(sTLGData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_LOSE_LIFE)
|
|
//
|
|
// TLG_SET_PLAYER_PED_ANIM_STATE(TLG_PLAYER_PED_ANIM_AIM_IDLE_TO_LOSE_LIFE)
|
|
// ELSE
|
|
// IF sTLGData.eClientState = TLG_ARCADE_CLIENT_STATE_PLAYING
|
|
// OR sTLGData.eClientState = TLG_ARCADE_CLIENT_STATE_RESULT_SCREEN
|
|
// IF (TLG_GET_LOCAL_PLAYER_HEALTH() > 0.0 AND TLG_GET_TOTAL_NUMBER_OF_ENEMIES_ALIVE() = 0)
|
|
//
|
|
// sTLGData.sArcadeAnimData.fBlendInDelta = SLOW_BLEND_IN
|
|
// sTLGData.sArcadeAnimData.fBlendOutDelta = SLOW_BLEND_OUT
|
|
// sTLGData.sArcadeAnimData.bLoopAnim = FALSE
|
|
// sTLGData.sArcadeAnimData.bHoldLastFrame = TRUE
|
|
//
|
|
// IF TLG_ARE_ALL_LEVELS_COMPLETE()
|
|
// AND NOT sTLGData.bPlayedWinningAnim
|
|
// sTLGData.bPlayedWinningAnim = TRUE
|
|
// PLAY_ARCADE_CABINET_ANIMATION(sTLGData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_WIN)
|
|
//
|
|
// TLG_SET_PLAYER_PED_ANIM_STATE(TLG_PLAYER_PED_ANIM_AIM_IDLE_TO_COMPLETE_GAME)
|
|
// ELSE
|
|
// PLAY_ARCADE_CABINET_ANIMATION(sTLGData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_LEVEL_COMPLETE)
|
|
//
|
|
// TLG_SET_PLAYER_PED_ANIM_STATE(TLG_PLAYER_PED_ANIM_AIM_IDLE_TO_COMPLETE_STAGE)
|
|
//
|
|
// ENDIF
|
|
// ENDIF
|
|
// ENDIF
|
|
// ENDIF
|
|
//
|
|
// BREAK
|
|
|
|
//-- Idle (Playing) -> Lose life
|
|
CASE TLG_PLAYER_PED_ANIM_AIM_IDLE_TO_LOSE_LIFE
|
|
IF IS_PLAYER_PLAYING_THIS_ARCADE_CABINET_ANIMATION_CLIP(ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_LOSE_LIFE)
|
|
IF HAS_ARCADE_CABINET_ANIMATION_CLIP_FINISHED(ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_LOSE_LIFE)
|
|
sTLGData.sArcadeAnimData.bHoldLastFrame = FALSE
|
|
sTLGData.sArcadeAnimData.bLoopAnim = TRUE
|
|
sTLGData.sArcadeAnimData.fBlendInDelta = SLOW_BLEND_IN
|
|
sTLGData.sArcadeAnimData.fBlendOutDelta = SLOW_BLEND_OUT
|
|
PLAY_ARCADE_CABINET_ANIMATION(sTLGData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_AIM_IDLE)
|
|
sTLGData.iIdleAnimCount = -1
|
|
TLG_SET_PLAYER_PED_ANIM_STATE(TLG_PLAYER_PED_ANIM_AIM_IDLE)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
//-- Idle (Aiming) -> Complete stage
|
|
CASE TLG_PLAYER_PED_ANIM_AIM_IDLE_TO_COMPLETE_STAGE
|
|
IF IS_PLAYER_PLAYING_THIS_ARCADE_CABINET_ANIMATION_CLIP(ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_LEVEL_COMPLETE)
|
|
IF HAS_ARCADE_CABINET_ANIMATION_CLIP_FINISHED(ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_LEVEL_COMPLETE)
|
|
sTLGData.sArcadeAnimData.fBlendInDelta = SLOW_BLEND_IN
|
|
sTLGData.sArcadeAnimData.fBlendOutDelta = SLOW_BLEND_OUT
|
|
sTLGData.sArcadeAnimData.bHoldLastFrame = FALSE
|
|
sTLGData.sArcadeAnimData.bLoopAnim = TRUE
|
|
|
|
PLAY_ARCADE_CABINET_ANIMATION(sTLGData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_AIM_IDLE)
|
|
sTLGData.iIdleAnimCount = -1
|
|
TLG_SET_PLAYER_PED_ANIM_STATE(TLG_PLAYER_PED_ANIM_AIM_IDLE)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
//-- Idle (Playing) -> Complete game
|
|
CASE TLG_PLAYER_PED_ANIM_AIM_IDLE_TO_COMPLETE_GAME
|
|
IF IS_PLAYER_PLAYING_THIS_ARCADE_CABINET_ANIMATION_CLIP(ARCADE_CABINET_ANIM_CLIP_WIN)
|
|
IF HAS_ARCADE_CABINET_ANIMATION_CLIP_FINISHED(ARCADE_CABINET_ANIM_CLIP_WIN)
|
|
IF sTLGData.eClientState != TLG_ARCADE_CLIENT_STATE_PLAYING
|
|
sTLGData.sArcadeAnimData.bHoldLastFrame = FALSE
|
|
sTLGData.sArcadeAnimData.bLoopAnim = TRUE
|
|
sTLGData.sArcadeAnimData.fBlendInDelta = REALLY_SLOW_BLEND_IN
|
|
sTLGData.sArcadeAnimData.fBlendOutDelta = REALLY_SLOW_BLEND_OUT
|
|
PLAY_ARCADE_CABINET_ANIMATION(sTLGData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_IDLE)
|
|
|
|
TLG_SET_PLAYER_PED_ANIM_STATE(TLG_PLAYER_PED_ANIM_IDLE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
PROC TLG_PROCESS_CLIENT_STATE_MACHINE()
|
|
|
|
SWITCH sTLGData.eClientState
|
|
|
|
CASE TLG_ARCADE_CLIENT_STATE_INIT
|
|
|
|
TLG_PROCESS_CLIENT_STATE_INIT()
|
|
|
|
BREAK
|
|
|
|
CASE TLG_ARCADE_CLIENT_STATE_REQUESTING_ASSETS
|
|
|
|
TLG_PROCESS_CLIENT_STATE_REQUESTING_ASSETS()
|
|
|
|
BREAK
|
|
|
|
CASE TLG_ARCADE_CLIENT_STATE_FIB
|
|
TLG_PROCESS_CLIENT_STATE_FIB()
|
|
BREAK
|
|
|
|
CASE TLG_ARCADE_CLIENT_STATE_INTRO
|
|
|
|
TLG_PROCESS_CLIENT_INTRO()
|
|
|
|
BREAK
|
|
|
|
CASE TLG_ARCADE_CLIENT_STATE_TITLE_SCREEN
|
|
|
|
TLG_PROCESS_CLIENT_STATE_TITLE_SCREEN()
|
|
|
|
BREAK
|
|
|
|
CASE TLG_ARCADE_CLIENT_STATE_LEVEL_SELECTION_MENU
|
|
|
|
TLG_PROCESS_CLIENT_STATE_MENU()
|
|
|
|
BREAK
|
|
|
|
CASE TLG_ARCADE_CLIENT_STATE_INIT_LEVEL
|
|
|
|
TLG_PROCESS_CLIENT_STATE_INIT_LEVEL()
|
|
|
|
BREAK
|
|
|
|
CASE TLG_ARCADE_CLIENT_STATE_PLAYING
|
|
/*
|
|
#IF IS_DEBUG_BUILD
|
|
INT i
|
|
*/
|
|
/*
|
|
On PC, ~ 1 sec ~38 frames ~ 0.028170 ms avg frame time
|
|
Middle cover (3) 600.0 -> 452 = 148 px
|
|
|
|
Middle Enemy: (5) 2600.0 -> 1945.0 = 555.0 px
|
|
|
|
Background enemy: (19) 2500 -> 1760.0 = 740.0 px
|
|
|
|
On Ps4 debug ~ 1 sec ~20 frames ~ 0.053854s avg frame time
|
|
Middle cover (3): 600 -> 524 = 76 px
|
|
Middle ebemy (5): 2500 -> 2230 = 270 px
|
|
Background enemy (19): 2500 -> 2140 = 360 px
|
|
|
|
|
|
*/
|
|
/*
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [UPDATE_TEST] Start of frame. Frame time: ", GET_FRAME_TIME())
|
|
IF sTLGData.iDebugTimer = 0
|
|
sTLGData.iDebugTimer = GET_GAME_TIMER()
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [UPDATE_TEST] Started timer")
|
|
|
|
REPEAT ciTLG_MAX_COVER i
|
|
IF sTLGData.iDebugCover = -1
|
|
IF sTLGData.sCoverData[i].iCoverLane = ciTLG_LANE_MIDDLE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [UPDATE_TEST] Using cover ", i, " Start pos x: ", sTLGData.sCoverData[i].vSpriteInitialPos.x)
|
|
sTLGData.iDebugCover = i
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT ciTLG_MAX_ENEMIES i
|
|
IF sTLGData.sEnemyData[i].iEnemyType != TLG_OUTHOUSE_ENEMY
|
|
IF sTLGData.sEnemyData[i].iEnemyLane = ciTLG_LANE_BACKGROUND
|
|
IF stlgData.iDebugBackgroundEnemy = -1
|
|
IF NOT sTLGData.sEnemyData[i].bReverse
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [UPDATE_TEST] Using Background enemy ", i, " Start pos x: ", sTLGData.sEnemyData[i].vStartPos.x)
|
|
stlgData.iDebugBackgroundEnemy = i
|
|
ENDIF
|
|
ENDIF
|
|
ELIF sTLGData.sEnemyData[i].iEnemyLane = ciTLG_LANE_MIDDLE
|
|
IF stlgData.iDebugMiddleEnemy = -1
|
|
IF NOT sTLGData.sEnemyData[i].bReverse
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [UPDATE_TEST] Using Middle enemy ", i, " Start pos x: ", sTLGData.sEnemyData[i].vStartPos.x)
|
|
stlgData.iDebugMiddleEnemy = i
|
|
ENDIF
|
|
ENDIF
|
|
ELIF sTLGData.sEnemyData[i].iEnemyLane = ciTLG_LANE_FOREGROUND
|
|
IF stlgData.iDebugForegroundEnemy = -1
|
|
IF NOT sTLGData.sEnemyData[i].bReverse
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [UPDATE_TEST] Using Foreground enemy ", i, " Start pos x: ", sTLGData.sEnemyData[i].vStartPos.x)
|
|
stlgData.iDebugForegroundEnemy = i
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ELSE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [UPDATE_TEST] Time Passed: ", GET_GAME_TIMER() - sTLGData.iDebugTimer)
|
|
|
|
REPEAT ciTLG_MAX_COVER i
|
|
IF i = sTLGData.iDebugCover
|
|
IF sTLGData.sCoverData[i].iCoverLane = ciTLG_LANE_MIDDLE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [UPDATE_TEST] Using cover ", i, " Current Pos: ", sTLGData.sCoverData[i].vSpritePos.x, " X Diff: ", sTLGData.sCoverData[i].vSpritePos.x - sTLGData.sCoverData[i].vSpriteInitialPos.x ," Start pos x: ", sTLGData.sCoverData[i].vSpriteInitialPos.x)
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
|
|
REPEAT ciTLG_MAX_ENEMIES i
|
|
IF sTLGData.sEnemyData[i].iEnemyLane = ciTLG_LANE_BACKGROUND
|
|
IF i = sTLGData.iDebugBackgroundEnemy
|
|
IF NOT sTLGData.sEnemyData[i].bReverse
|
|
IF sTLGData.sEnemyData[i].eState = TLG_ACTIVE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [UPDATE_TEST] Using Background enemy ", i, " Current Pos: ", sTLGData.sEnemyData[i].vSpritePos.x, " Diff from start: ", sTLGData.sEnemyData[i].vSpritePos.x - sTLGData.sEnemyData[i].vStartPos.x, " Start pos x: ", sTLGData.sEnemyData[i].vStartPos.x)
|
|
|
|
ELSE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [UPDATE_TEST] Using Background enemy ", i, " NO LONGER ACTIVE")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF sTLGData.sEnemyData[i].iEnemyLane = ciTLG_LANE_MIDDLE
|
|
IF i = sTLGData.iDebugMiddleEnemy
|
|
IF NOT sTLGData.sEnemyData[i].bReverse
|
|
IF sTLGData.sEnemyData[i].eState = TLG_ACTIVE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [UPDATE_TEST] Using Middle enemy ", i, " Current Pos: ", sTLGData.sEnemyData[i].vSpritePos.x, " Diff from start: ", sTLGData.sEnemyData[i].vSpritePos.x - sTLGData.sEnemyData[i].vStartPos.x, " Start pos x: ", sTLGData.sEnemyData[i].vStartPos.x)
|
|
|
|
ELSE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [UPDATE_TEST] Using Middle enemy ", i, " NO LONGER ACTIVE")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELIF sTLGData.sEnemyData[i].iEnemyLane = ciTLG_LANE_FOREGROUND
|
|
IF i = sTLGData.iDebugForegroundEnemy
|
|
IF NOT sTLGData.sEnemyData[i].bReverse
|
|
IF sTLGData.sEnemyData[i].eState = TLG_ACTIVE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [UPDATE_TEST] Using Foreground enemy ", i, " Current Pos: ", sTLGData.sEnemyData[i].vSpritePos.x, " Diff from start: ", sTLGData.sEnemyData[i].vSpritePos.x - sTLGData.sEnemyData[i].vStartPos.x, " Start pos x: ", sTLGData.sEnemyData[i].vStartPos.x)
|
|
|
|
ELSE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [UPDATE_TEST] Using Foreground enemy ", i, " NO LONGER ACTIVE")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
|
|
|
|
|
|
#ENDIF
|
|
*/
|
|
|
|
TLG_PROCESS_CLIENT_STATE_PLAYING()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_DOWN)
|
|
TLG_SET_LEVEL_BIT_FOR_CURRENT_LEVEL(TLG_LEVELS_BIT_SHOULD_STOP)
|
|
// TLG_INCREASE_CURRENT_LEVEL_STAGE()
|
|
ENDIF
|
|
IF GET_COMMANDLINE_PARAM_EXISTS("sc_BadlandsOnScreen")
|
|
TLG_DO_ON_SCREEN_DEBUG()
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
/*
|
|
#IF IS_DEBUG_BUILD
|
|
sTLGData.iDebugFrameCount++
|
|
sTLGData.fDebugTotalFrameTime += GET_FRAME_TIME()
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [UPDATE_TEST] End of frame. Total frames: ", sTLGData.iDebugFrameCount, " Average: ", sTLGData.fDebugTotalFrameTime / (TO_FLOAT(sTLGData.iDebugFrameCount)))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [UPDATE_TEST]")
|
|
|
|
|
|
#ENDIF
|
|
*/
|
|
BREAK
|
|
|
|
CASE TLG_ARCADE_CLIENT_STATE_RESULT_SCREEN
|
|
|
|
TLG_PROCESS_CLIENT_STATE_RESULT_SCREEN()
|
|
|
|
BREAK
|
|
|
|
CASE TLG_ARCADE_CLIENT_STATE_OUTRO_MOVIE
|
|
TLG_PROCESS_CLIENT_STATE_OUTRO_MOVIE()
|
|
BREAK
|
|
|
|
CASE TLG_ARCADE_CLIENT_STATE_EDIT_LEADERBOARD
|
|
|
|
TLG_PROCESS_CLIENT_STATE_EDIT_LEADERBOARD()
|
|
|
|
BREAK
|
|
|
|
CASE TLG_ARCADE_CLIENT_STATE_VIEW_LEADERBOARD
|
|
|
|
TLG_PROCESS_CLIENT_STATE_VIEW_LEADERBOARD()
|
|
|
|
BREAK
|
|
|
|
CASE TLG_ARCADE_CLIENT_STATE_CLEANUP
|
|
|
|
TLG_CLEANUP_AND_EXIT_CLIENT()
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
|
|
//-- Handle player ped anims while playing
|
|
TLG_PROCESS_PLAYER_PED_ANIMS()
|
|
ENDPROC
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PROC TLG_DEBUG_OUTPUT_ALL_ENEMY_POSITIONS()
|
|
INT i
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [OUTPUT_ENEMY_POSITIONS] ")
|
|
FOR i = 0 TO ciTLG_MAX_ENEMIES -1
|
|
IF sTLGData.sEnemyData[i].eState != TLG_INACTIVE
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [OUTPUT_ENEMY_POSITIONS] Enemy ", i, " lane:", sTLGData.sEnemyData[i].iEnemyLane, " Type: ", TLG_GET_ENEMY_TYPE_AS_STRING(sTLGData.sEnemyData[i].iEnemyType), " State: ", TLG_GET_ENEMY_STATE_AS_STRING(sTLGData.sEnemyData[i].eState) , " Active in stage: ", sTLGData.sEnemyData[i].iLevelStage)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [OUTPUT_ENEMY_POSITIONS] Reverse? ", sTLGData.sEnemyData[i].bReverse, " Pos: ", sTLGData.sEnemyData[i].vSpritePos.x, ", ", sTLGData.sEnemyData[i].vSpritePos.y, " Stopping: ", sTLGData.sEnemyData[i].fStoppingX, " Start: ", sTLGData.sEnemyData[i].vStartPos.x, ", ", sTLGData.sEnemyData[i].vStartPos.y)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [OUTPUT_ENEMY_POSITIONS] Ever on screen? ", sTLGData.sEnemyData[i].bAppearedOnscreen)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [OUTPUT_ENEMY_POSITIONS]")
|
|
ENDIF
|
|
ENDFOR
|
|
ENDPROC
|
|
|
|
PROC TLG_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS()
|
|
INT i
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [TLG_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS] ")
|
|
|
|
/*
|
|
sTLGData.sItemData[iItem].bRendering = FALSE
|
|
sTLGData.sItemData[iItem].iMinActiveStage = 0
|
|
sTLGData.sItemData[iItem].iRenderAfterWarpCount = 0
|
|
sTLGData.sItemData[iItem].iWarpCount = 0
|
|
sTLGData.sItemData[iItem].bShot = FALSE
|
|
*/
|
|
FOR i = 0 TO ciTLG_MAX_ITEMS -1
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [TLG_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS] sTLGData.sItemData[", i, "]..eItemType = ", TLG_GET_COLLECTIBLE_TYPE_AS_STRING(sTLGData.sItemData[i].eItemType))
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [TLG_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS] sTLGData.sItemData[", i, "].bRendering = ", sTLGData.sItemData[i].bRendering)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [TLG_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS] sTLGData.sItemData[", i, "].vSpritePos = ", sTLGData.sItemData[i].vSpritePos.x, ", ", sTLGData.sItemData[i].vSpritePos.y)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [TLG_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS] sTLGData.sItemData[", i, "].iMinActiveStage = ", sTLGData.sItemData[i].iMinActiveStage)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [TLG_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS] sTLGData.sItemData[", i, "].iRenderAfterWarpCount = ", sTLGData.sItemData[i].iRenderAfterWarpCount)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [TLG_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS] sTLGData.sItemData[", i, "].iMinActiveStage = ", sTLGData.sItemData[i].iMinActiveStage)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [TLG_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS] sTLGData.sItemData[", i, "].iWarpCount = ", sTLGData.sItemData[i].iWarpCount)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [TLG_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS] sTLGData.sItemData[", i, "].bShot = ", sTLGData.sItemData[i].bShot)
|
|
CDEBUG1LN(DEBUG_MINIGAME, "{dsw} [TLG_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS] ")
|
|
|
|
ENDFOR
|
|
ENDPROC
|
|
PROC TLG_DEBUG_SET_PARENT_WIDGET_GROUP(WIDGET_GROUP_ID parentWidgetGroup)
|
|
|
|
sTLGData.widgetGroupExample = parentWidgetGroup
|
|
|
|
ENDPROC
|
|
|
|
PROC TLG_DEBUG_CREATE_WIDGETS()
|
|
|
|
IF sTLGData.bDebugCreatedWidgets
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF sTLGData.widgetGroupExample = NULL
|
|
EXIT
|
|
ENDIF
|
|
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] [DSW] Creating widgets...")
|
|
SET_CURRENT_WIDGET_GROUP(sTLGData.widgetGroupExample)
|
|
START_WIDGET_GROUP("TLG 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_FLOAT_READ_ONLY("vSpriteMarkerPos X", sTLGData.sPlayerData[0].vSpriteMarkerPos.x)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("vSpriteMarkerPos Y", sTLGData.sPlayerData[0].vSpriteMarkerPos.y)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Prop X", sTLGData.sCoverData[8].vSpritePos.x)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Prop X", sTLGData.sCoverData[9].vSpritePos.x)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Prop X", sTLGData.sCoverData[10].vSpritePos.x)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Enemy X", sTLGData.sEnemyData[0].vSpritePos.x)
|
|
// ADD_WIDGET_FLOAT_SLIDER("Reticule Screen Sp X", sTLGData.fDebugEntityWorldSpaceX, -cfGAME_SCREEN_WIDTH, cfGAME_SCREEN_WIDTH, 0.5)
|
|
// ADD_WIDGET_FLOAT_SLIDER("Reticule Screen Sp Y", sTLGData.fDebugEntityWorldSpaceY, -cfGAME_SCREEN_HEIGHT, cfGAME_SCREEN_HEIGHT, 0.5)
|
|
START_WIDGET_GROUP("Texture Pos")
|
|
ADD_WIDGET_FLOAT_SLIDER("Texture 1 X", sTLGData.fTexturePosX[0], -10000.0, 10000.0, 0.5)
|
|
ADD_WIDGET_FLOAT_SLIDER("Texture 1 Y", sTLGData.fTexturePosY[0], -10000.0, 10000.0, 0.5)
|
|
ADD_WIDGET_FLOAT_SLIDER("Texture 1 Scale", sTLGData.fTextureScale[0], 0.0, 1.0, 0.05)
|
|
ADD_WIDGET_FLOAT_SLIDER("Texture 2 X", sTLGData.fTexturePosX[1], -10000.0, 10000.0, 0.5)
|
|
ADD_WIDGET_FLOAT_SLIDER("Texture 2 Y", sTLGData.fTexturePosY[1], -10000.0, 10000.0, 0.5)
|
|
ADD_WIDGET_FLOAT_SLIDER("Texture 3 X", sTLGData.fTexturePosX[2], -10000.0, 10000.0, 0.5)
|
|
ADD_WIDGET_FLOAT_SLIDER("Texture 3 Y", sTLGData.fTexturePosY[2], -10000.0, 10000.0, 0.5)
|
|
ADD_WIDGET_INT_SLIDER("Value", sTLGDATA.iDebugIntegerValue,0, 100000, 1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Scale",sTLGData.fDebugFloatValue, -10.0, 10.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Enemy Hover")
|
|
ADD_WIDGET_BOOL("Enable Enemy Hover", sTLGData.bEnableEnemyHover)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Marker World Px Pos X", sTLGData.sPlayerData[0].vSpriteMarkerPos.x)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Marker World Px Pos Y", sTLGData.sPlayerData[0].vSpriteMarkerPos.y)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Reticule-Entity Dist", sTLGData.fReticuleSpriteDist)
|
|
ADD_WIDGET_INT_READ_ONLY("Entity ID", sTLGData.iDebugEntityId )
|
|
ADD_WIDGET_INT_READ_ONLY("Entity Type", sTLGData.iDebugType )
|
|
ADD_WIDGET_INT_READ_ONLY("Entity State", sTLGData.iDebugEntityState )
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Entity stopping X", sTLGData.fEntityStoppingX)
|
|
ADD_WIDGET_INT_READ_ONLY("Lane", sTLGData.iDebugLane)
|
|
ADD_WIDGET_INT_READ_ONLY("Anim frame", sTLGData.iDebugAnimFrame)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Entity World X", sTLGData.fDebugEntityWorldX)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Entity World Y", sTLGData.fDebugEntityWorldY)
|
|
// ADD_WIDGET_FLOAT_READ_ONLY("Entity TL X", sTLGData.fDebugEntityCornerX[0])
|
|
// ADD_WIDGET_FLOAT_READ_ONLY("Entity TL Y", sTLGData.fDebugEntityCornerY[0])
|
|
// ADD_WIDGET_FLOAT_READ_ONLY("Entity BR X", sTLGData.fDebugEntityCornerX[1])
|
|
// ADD_WIDGET_FLOAT_READ_ONLY("Entity BR Y", sTLGData.fDebugEntityCornerY[1])
|
|
// ADD_WIDGET_FLOAT_READ_ONLY("Ent-Ret TL X Diff", sTLGData.fDebugReticuleEntityTLDiffX)
|
|
// ADD_WIDGET_FLOAT_READ_ONLY("Ent-Ret TL Y Diff", sTLGData.fDebugReticuleEntityTLDiffY)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Enemy Projectiles")
|
|
ADD_WIDGET_BOOL("Launch Projectile", sTLGData.bDebugLaunchDynamite)
|
|
ADD_WIDGET_BOOL("Clear Projectile", sTLGData.bDebugClearDynamite)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("My Scores")
|
|
ADD_WIDGET_INT_READ_ONLY("Desert ", sTLGData.iMyScores[0])
|
|
ADD_WIDGET_INT_READ_ONLY("Town ", sTLGData.iMyScores[1])
|
|
ADD_WIDGET_INT_READ_ONLY("Forest ", sTLGData.iMyScores[2])
|
|
ADD_WIDGET_INT_READ_ONLY("Mine ", sTLGData.iMyScores[3])
|
|
ADD_WIDGET_INT_READ_ONLY("Graveyard ", sTLGData.iMyScores[4])
|
|
ADD_WIDGET_INT_READ_ONLY("Successive Hits", sTLGData.sPlayerData[0].iSuccessiveHits)
|
|
ADD_WIDGET_INT_READ_ONLY("Chain", sTLGData.sPlayerData[0].iChainedScore)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Level")
|
|
ADD_WIDGET_INT_READ_ONLY("Stage", sTLGData.iLevelCurrentStage[TLG_GET_CURRENT_LEVEL()])
|
|
ADD_WIDGET_INT_READ_ONLY("# of Stages", sTLGData.iDebugTotalStages)
|
|
ADD_WIDGET_INT_READ_ONLY("Hostages Saved", sTLGData.iTotalLevelHostagesSaved[TLG_GET_CURRENT_LEVEL()])
|
|
ADD_WIDGET_INT_READ_ONLY("Shots", sTLGData.iTotalLevelShots[TLG_GET_CURRENT_LEVEL()])
|
|
ADD_WIDGET_INT_READ_ONLY("Enemy Kills", sTLGData.iTotalLevelEnemyHits[TLG_GET_CURRENT_LEVEL()])
|
|
ADD_WIDGET_INT_READ_ONLY("HeadShots", sTLGData.iTotalLevelEnemyHeadShots[TLG_GET_CURRENT_LEVEL()])
|
|
ADD_WIDGET_INT_READ_ONLY("Birds", sTLGData.iTotalLevelBirdsShot[TLG_GET_CURRENT_LEVEL()])
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Enemies Count")
|
|
ADD_WIDGET_INT_READ_ONLY("Lane 0 Active ", sTLGData.iCurrentActiveEnemies[0])
|
|
ADD_WIDGET_INT_READ_ONLY("Lane 1 Active ", sTLGData.iCurrentActiveEnemies[1])
|
|
ADD_WIDGET_INT_READ_ONLY("Lane 2 Active ", sTLGData.iCurrentActiveEnemies[2])
|
|
ADD_WIDGET_INT_READ_ONLY("Total rem ", sTLGData.iDebugEnemiesRemaining)
|
|
ADD_WIDGET_BOOL("Output all pos", sTLGData.bDebugOutputAliveEnemies)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Background")
|
|
ADD_WIDGET_BOOL("Stop moving", sTLGData.bStopMovingLevel)
|
|
ADD_WIDGET_BOOL("Hide Facade", sTLGData.bDisableFacade)
|
|
ADD_WIDGET_BOOL("Shift props left", sTLGData.bDebugShiftPropsLeft)
|
|
ADD_WIDGET_BOOL("Shift props right", sTLGData.bDebugShiftPropsRight)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Tile 0 X", sTLGData.sBackgroundTilesData[0].vSpritePos.x)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Tile 1 X", sTLGData.sBackgroundTilesData[1].vSpritePos.x)
|
|
// ADD_WIDGET_FLOAT_READ_ONLY("Tile 2 X", sTLGData.sBackgroundTilesData[2].vSpritePos.x)
|
|
// ADD_WIDGET_FLOAT_READ_ONLY("Tile 3 X", sTLGData.sBackgroundTilesData[3].vSpritePos.x)
|
|
// ADD_WIDGET_FLOAT_READ_ONLY("Tile 4 X", sTLGData.sBackgroundTilesData[4].vSpritePos.x)
|
|
// ADD_WIDGET_FLOAT_READ_ONLY("Tile 5 X", sTLGData.sBackgroundTilesData[5].vSpritePos.x)
|
|
// ADD_WIDGET_FLOAT_READ_ONLY("Tile 6 X", sTLGData.sBackgroundTilesData[6].vSpritePos.x)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Props / Cover")
|
|
ADD_WIDGET_BOOL("Enable Hover", sTLGData.bEnableCoverHover)
|
|
ADD_WIDGET_BOOL("Stop moving", sTLGData.bStopMovingLevel)
|
|
ADD_WIDGET_INT_READ_ONLY("Index", sTLGDATA.iDebugIntegerValue)
|
|
sTLGData.twDebugId = ADD_TEXT_WIDGET("Prop Type")
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Prop X", sTLGData.fDebugEntityWorldX)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Prop Y", sTLGData.fDebugEntityWorldY)
|
|
ADD_WIDGET_INT_READ_ONLY("Prop Lane", sTLGData.iDebugLane)
|
|
ADD_WIDGET_INT_READ_ONLY("Prop Screen", sTLGData.iDebugCoverScreen)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Prop Scale", sTLGData.fDebugEntityScale)
|
|
ADD_WIDGET_BOOL("Edit", sTLGData.bDebugEnableEdit)
|
|
ADD_WIDGET_BOOL("Hide Foreground", sTLGData.bDebugHideForegroundProps)
|
|
ADD_WIDGET_INT_READ_ONLY("Editing ID", sTLGData.iEntityEdit)
|
|
sTLGData.twDebugId = ADD_TEXT_WIDGET("Editing Type")
|
|
ADD_WIDGET_FLOAT_SLIDER("Pos X", sTLGData.fTexturePosX[0], -10000.0, 10000.0, 0.5)
|
|
ADD_WIDGET_FLOAT_SLIDER("Pos Y", sTLGData.fTexturePosY[0], -10000.0, 10000.0, 0.5)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Controls")
|
|
// ADD_WIDGET_FLOAT_READ_ONLY("Stick X", sTLGData.fDebugStickX)
|
|
// ADD_WIDGET_FLOAT_READ_ONLY("Stick Y", sTLGData.fDebugStickX)
|
|
// ADD_WIDGET_FLOAT_READ_ONLY("Mouse X", sTLGData.fDebugMouseX)
|
|
// ADD_WIDGET_FLOAT_READ_ONLY("Mouse Y", sTLGData.fDebugMouseY)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Awards")
|
|
ADD_WIDGET_BOOL("Award Deadeye T-Shirt", sTLGData.bDebugAwardDeadeye)
|
|
ADD_WIDGET_INT_SLIDER("Sharshooter award", sTLGData.iDebugSharpShooter, 0, 50, 1)
|
|
ADD_WIDGET_BOOL("Set birds shot", sTLGData.bDebugAwardSetSharpshooter)
|
|
ADD_WIDGET_BOOL("Award Sharpshooter T-Shirt", sTLGData.bDebugAwardSharpshooter)
|
|
ADD_WIDGET_BOOL("Award Pistols at dawn T-Shirt", sTLGData.bDebugAwardPistols)
|
|
ADD_WIDGET_BOOL("Award Complete T-Shirt", sTLGData.bDebugAwardComplete)
|
|
ADD_WIDGET_BOOL("Award Complete Trophy", sTLGData.bDebugAwardTrophy)
|
|
ADD_WIDGET_BOOL("Clear stats", sTLGData.bClearAwardStats)
|
|
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Pickups")
|
|
ADD_WIDGET_BOOL("Enable", sTLGData.bDebugEnablePickup)
|
|
ADD_WIDGET_INT_SLIDER("Show Screen Pickups", sTLGData.iDebugPickupScreen, -1, ciTLG_MAX_SCREENS, 1)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Update")
|
|
ADD_WIDGET_INT_SLIDER("Base FPS", ciBASE_FPS, 0, 1000, 1)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Server BD")
|
|
ADD_WIDGET_INT_READ_ONLY("Number of players ", tlgServerBd.iNumPlayers)
|
|
STOP_WIDGET_GROUP()
|
|
STOP_WIDGET_GROUP()
|
|
|
|
ARCADE_GAMES_LEADERBOARD_WIDGET_CREATE(sTLGData.sLbData)
|
|
|
|
ARCADE_GAMES_POSTFX_WIDGET_CREATE()
|
|
|
|
|
|
CLEAR_CURRENT_WIDGET_GROUP(sTLGData.widgetGroupExample)
|
|
|
|
sTLGData.fTexturePosX[0] = 1000.0 //cfBASE_SCREEN_WIDTH/6*2
|
|
sTLGData.fTexturePosY[0] = 315.0 //152.500
|
|
sTLGData.fTextureScale[0] = 1.0
|
|
sTLGData.fTexturePosX[1] = cfTLG_RESULTS_SCREEN_COMPLETE_ACCURACY_POS_X
|
|
sTLGData.fTexturePosY[1] = cfTLG_RESULTS_SCREEN_COMPLETE_ACCURACY_POS_Y
|
|
sTLGData.fTexturePosX[2] = 500.0
|
|
sTLGData.fTexturePosY[2] = 500.0
|
|
|
|
sTLGDATA.iDebugIntegerValue = 7250
|
|
sTLGDATA.fDebugFloatValue = 1.0
|
|
|
|
sTLGData.iDebugCover = -1
|
|
stlgData.iDebugForegroundEnemy = -1
|
|
stlgData.iDebugMiddleEnemy = -1
|
|
stlgData.iDebugBackgroundEnemy = -1
|
|
|
|
sTLGData.bDebugCreatedWidgets = TRUE
|
|
|
|
ENDPROC
|
|
|
|
PROC TLG_UPDATE_WIDGETS()
|
|
INT i
|
|
|
|
IF PARTICIPANT_ID_TO_INT() >= 0
|
|
|
|
IF sTLGData.iMyScores[sTLGData.iStaggeredDebugCount] != playerBd[PARTICIPANT_ID_TO_INT()].iPlayerScore[sTLGData.iStaggeredDebugCount]
|
|
sTLGData.iMyScores[sTLGData.iStaggeredDebugCount] = playerBd[PARTICIPANT_ID_TO_INT()].iPlayerScore[sTLGData.iStaggeredDebugCount]
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
sTLGData.iDebugEnemiesRemaining = TLG_GET_TOTAL_NUMBER_OF_ENEMIES_ALIVE()
|
|
sTLGData.iDebugTotalStages = TLG_GET_CURRENT_LEVEL_NUMBER_OF_STAGES()
|
|
// VECTOR_2D vScreenSpace = ARCADE_CABINET_CONVERT_TO_VECTOR_2D_TO_SCREENSPACE(INIT_VECTOR_2D(sTLGData.sPlayerData[0].vSpriteMarkerPos.x, sTLGData.sPlayerData[0].vSpriteMarkerPos.y))
|
|
// sTLGData.fDebugEntityWorldSpaceX = vScreenSpace.x
|
|
// sTLGData.fDebugEntityWorldSpacey = vScreenSpace.y
|
|
|
|
|
|
VECTOR_2D vReticule = TLG_GET_PLAYER_RETICULE_POSITON()
|
|
FLOAT distanceX, distanceY, fDistance, fDistanceToCheck
|
|
BOOL bIsHovering
|
|
IF sTLGData.bEnableEnemyHover
|
|
FOR i = 0 TO ciTLG_MAX_ENEMIES -1
|
|
|
|
IF (sTLGData.sEnemyData[i].eState = TLG_ACTIVE OR sTLGData.sEnemyData[i].eState = TLG_SHOOTING) AND sTLGData.sEnemyData[i].iHealth > 0
|
|
distanceX = vReticule.x - sTLGData.sEnemyData[i].vSpritePos.x
|
|
distanceY = vReticule.y - sTLGData.sEnemyData[i].vSpritePos.y
|
|
fDistance = SQRT(distanceX * distanceX + distanceY * distanceY)
|
|
|
|
IF (sTLGData.sEnemyData[i].iEnemyLane = 0 OR sTLGData.sEnemyData[i].iEnemyLane = 1)
|
|
fDistanceToCheck = 120.0
|
|
ELSE
|
|
fDistanceToCheck = 320.0 // 280.0
|
|
ENDIF
|
|
|
|
IF fDistance < fDistanceToCheck
|
|
sTLGData.fReticuleSpriteDist = fDistance
|
|
sTLGData.iDebugEntityId = i
|
|
sTLGData.iDebugType = ENUM_TO_INT(sTLGData.sEnemyData[i].iEnemyType)
|
|
sTLGData.iDebugLane = sTLGData.sEnemyData[i].iEnemyLane
|
|
sTLGData.iDebugEntityState = ENUM_TO_INT(sTLGData.sEnemyData[i].eState)
|
|
sTLGData.fEntityStoppingX = sTLGData.sEnemyData[i].fStoppingX
|
|
sTLGData.fDebugEntityWorldX = sTLGData.sEnemyData[i].vSpritePos.x
|
|
sTLGData.fDebugEntityWorldY = sTLGData.sEnemyData[i].vSpritePos.Y
|
|
|
|
sTLGData.iDebugAnimFrame = sTLGData.sEnemyData[i].iSpriteAnimFrame
|
|
|
|
VECTOR_2D vCorner0 = INIT_VECTOR_2D(sTLGData.sEnemyData[i].vSpritePos.x - (sTLGData.sEnemyData[i].vSize.x/2), sTLGData.sEnemyData[i].vSpritePos.y - (sTLGData.sEnemyData[i].vSize.y/2))
|
|
VECTOR_2D vCorner1 = INIT_VECTOR_2D(sTLGData.sEnemyData[i].vSpritePos.x + (sTLGData.sEnemyData[i].vSize.x/2), sTLGData.sEnemyData[i].vSpritePos.y + (sTLGData.sEnemyData[i].vSize.y/2))
|
|
|
|
sTLGData.fDebugEntityCornerX[0] = vCorner0.x
|
|
sTLGData.fDebugEntityCornerY[0] = vCorner0.y
|
|
sTLGData.fDebugEntityCornerX[1] = vCorner1.x
|
|
sTLGData.fDebugEntityCornerY[1] = vCorner1.y
|
|
|
|
sTLGData.fDebugReticuleEntityTLDiffX = vReticule.x - vCorner0.x
|
|
sTLGData.fDebugReticuleEntityTLDiffY = vReticule.y - vCorner0.y
|
|
bIsHovering = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
IF NOT bIsHovering
|
|
sTLGData.iDebugEntityId = -1
|
|
sTLGData.fDebugEntityWorldX = -1.0
|
|
sTLGData.fDebugEntityWorldY = -1.0
|
|
sTLGData.fDebugEntityCornerX[0] = -1.0
|
|
sTLGData.fDebugEntityCornerY[0] = -1.0
|
|
sTLGData.fDebugEntityCornerX[1] = -1.0
|
|
sTLGData.fDebugEntityCornerY[1] = -1.0
|
|
sTLGData.iDebugLane = -1
|
|
sTLGData.fReticuleSpriteDist = -1.0
|
|
sTLGData.fDebugReticuleEntityTLDiffX = -1.0
|
|
sTLGData.fDebugReticuleEntityTLDiffY = -1.0
|
|
ENDIF
|
|
ENDIF
|
|
STRING sCover
|
|
IF sTLGData.bEnableCoverHover
|
|
INT iClosest = TLG_GET_CLOSEST_PROP_TO_COORD(vReticule)
|
|
IF iClosest > -1
|
|
sCover = TLG_GET_ASSET_TYPE_AS_STRING(sTLGData.sCoverData[iClosest].eType)
|
|
sTLGData.fDebugEntityWorldX = sTLGData.sCoverData[iClosest].vSpritePos.x
|
|
sTLGData.fDebugEntityWorldY = sTLGData.sCoverData[iClosest].vSpritePos.Y
|
|
sTLGData.iDebugLane = sTLGData.sCoverData[iClosest].iCoverLane
|
|
sTLGDATA.iDebugIntegerValue = iClosest
|
|
sTLGData.iDebugCoverScreen = sTLGData.sCoverData[iClosest].iScreen
|
|
sTLGData.fDebugEntityScale = TLG_GET_COVER_TYPE_SCALE_FOR_LANE(sTLGData.sCoverData[iClosest].eType, sTLGData.sCoverData[iClosest].iCoverLane)
|
|
ELSE
|
|
sCover = TLG_GET_ASSET_TYPE_AS_STRING(TLG_ASSET_INVALID)
|
|
sTLGData.fDebugEntityWorldX = -9999999.0
|
|
sTLGData.fDebugEntityWorldY = -9999999.0
|
|
sTLGDATA.iDebugIntegerValue = -1
|
|
ENDIF
|
|
SET_CONTENTS_OF_TEXT_WIDGET(sTLGData.twDebugId, sCover)
|
|
ENDIF
|
|
|
|
IF sTLGData.bDebugEnableEdit
|
|
AND sTLGData.bEnableCoverHover
|
|
IF NOT sTLGData.bDebugInitEdit
|
|
AND sTLGDATA.iDebugIntegerValue > -1
|
|
sTLGData.iEntityEdit = sTLGDATA.iDebugIntegerValue
|
|
sTLGData.bDebugInitEdit = TRUE
|
|
sTLGData.fTexturePosX[0] = sTLGData.sCoverData[sTLGData.iEntityEdit].vSpritePos.x
|
|
sTLGData.fTexturePosY[0] = sTLGData.sCoverData[sTLGData.iEntityEdit].vSpritePos.y
|
|
sTLGData.bDebugHideForegroundProps = TRUE
|
|
ELIF sTLGData.bDebugInitEdit
|
|
sCover = TLG_GET_ASSET_TYPE_AS_STRING(sTLGData.sCoverData[sTLGData.iEntityEdit].eType)
|
|
SET_CONTENTS_OF_TEXT_WIDGET(sTLGData.twDebugId, sCover)
|
|
sTLGData.sCoverData[sTLGData.iEntityEdit].vSpritePos = GET_DEBUG_TEXTURE_POS(0)
|
|
ENDIF
|
|
ELSE
|
|
IF sTLGData.bDebugInitEdit
|
|
sTLGData.bDebugInitEdit = FALSE
|
|
sTLGData.iEntityEdit = -1
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sTLGData.bDebugHideForegroundProps
|
|
sTLGData.bDebugHideForegroundProps = FALSE
|
|
i = 0
|
|
REPEAT ciTLG_MAX_COVER i
|
|
IF sTLGData.sCoverData[i].bRendering
|
|
IF sTLGData.sCoverData[i].iCoverLane = 2
|
|
sTLGData.sCoverData[i].bRendering = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
IF sTLGData.bDebugShiftPropsLeft
|
|
sTLGData.bDebugShiftPropsLeft = FALSE
|
|
i = 0
|
|
REPEAT ciTLG_MAX_COVER i
|
|
IF sTLGData.sCoverData[i].bRendering
|
|
sTLGData.sCoverData[i].vSpritePos.x -= (cfBASE_SCREEN_WIDTH / 2.0)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
IF sTLGData.bDebugShiftPropsRight
|
|
sTLGData.bDebugShiftPropsRight = FALSE
|
|
i = 0
|
|
REPEAT ciTLG_MAX_COVER i
|
|
IF sTLGData.sCoverData[i].bRendering
|
|
sTLGData.sCoverData[i].vSpritePos.x += (cfBASE_SCREEN_WIDTH / 2.0)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
IF sTLGData.bDebugOutputAliveEnemies
|
|
sTLGData.bDebugOutputAliveEnemies = FALSE
|
|
|
|
TLG_DEBUG_OUTPUT_ALL_ENEMY_POSITIONS()
|
|
ENDIF
|
|
|
|
IF sTLGData.bDebugAwardDeadeye
|
|
sTLGData.bDebugAwardDeadeye = FALSE
|
|
TLG_AWARD_DEADEYE()
|
|
ENDIF
|
|
|
|
IF sTLGData.bDebugAwardPistols
|
|
sTLGData.bDebugAwardPistols = FALSE
|
|
TLG_AWARD_PISTOLS_AT_DAWN()
|
|
ENDIF
|
|
|
|
IF sTLGData.bDebugAwardSharpshooter
|
|
sTLGData.bDebugAwardSharpshooter = FALSE
|
|
ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TSHIRT_HELP(ARCADE_GAME_TSHIRTS_BADLANDS_SHARPSHOOTER)
|
|
ENDIF
|
|
|
|
IF sTLGData.bDebugAwardSetSharpshooter
|
|
sTLGData.bDebugAwardSetSharpshooter = FALSE
|
|
sTLGData.iTotalLevelBirdsShot[1] = sTLGData.iDebugSharpShooter
|
|
IF sTLGData.iDebugSharpShooter >= TLG_GET_SHARPSHOOTER_AWARD_PLATINUM_TARGET_SCORE()
|
|
TLG_AWARD_SHARPSHOOTER(sTLGData.iDebugSharpShooter, TRUE)
|
|
ELSE
|
|
TLG_AWARD_SHARPSHOOTER(sTLGData.iDebugSharpShooter, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
IF sTLGData.bDebugAwardComplete
|
|
sTLGData.bDebugAwardComplete = FALSE
|
|
ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TSHIRT_HELP(ARCADE_GAME_TSHIRTS_BADLANDS_COMPLETE)
|
|
ENDIF
|
|
|
|
IF sTLGData.bDebugAwardTrophy
|
|
sTLGData.bDebugAwardTrophy = FALSE
|
|
// ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TROPHY_HELP(ARCADE_GAME_TROPHY_FORTUNE_TELLER, TRUE)
|
|
ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TROPHY_HELP(ARCADE_GAME_TROPHY_BADLANDS, TRUE)
|
|
ENDIF
|
|
|
|
IF sTLGData.bClearAwardStats
|
|
SET_MP_INT_CHARACTER_STAT(MP_STAT_ARCADE_HELP_BITSET, 0)
|
|
SET_MP_INT_CHARACTER_STAT(MP_STAT_ARCADE_HELP_BITSETTWO, 0)
|
|
SET_MP_INT_CHARACTER_AWARD(MP_AWARD_SHARPSHOOTER,0)
|
|
SET_MP_BOOL_CHARACTER_AWARD(MP_AWARD_DEADEYE, FALSE)
|
|
SET_MP_BOOL_CHARACTER_AWARD(MP_AWARD_PISTOLSATDAWN, FALSE)
|
|
sTLGData.bClearAwardStats = FALSE
|
|
ENDIF
|
|
IF sTLGData.bDebugLaunchDynamite
|
|
sTLGData.bDebugLaunchDynamite = FALSE
|
|
TLG_INIT_THROWN_ENEMY_PROJECTILE(TLG_ENEMY_PROJECTILE_DYNAMITE, INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH / 2.0, cfBASE_SCREEN_HEIGHT / 2.0))
|
|
ENDIF
|
|
|
|
IF sTLGData.bDebugClearDynamite
|
|
sTLGData.bDebugClearDynamite = FALSE
|
|
TLG_RESET_ALL_ENEMY_THROWN_PROJECTLES()
|
|
ENDIF
|
|
|
|
VECTOR_2D vInitialPos
|
|
VECTOR_2D vOffset
|
|
IF sTLGData.bDebugEnablePickup
|
|
IF sTLGData.iDebugPickupScreen != -1
|
|
TLG_GET_ITEM_INITIAL_POS_AND_OFFSET_FOR_SCREEN(TLG_HEALTH, sTLGData.iDebugPickupScreen, vInitialPos, vOffset)
|
|
ARCADE_DRAW_PIXELSPACE_SPRITE(sTLGData.tl31HudTextDict, "POWERUP_HEALTH", vInitialPos, INIT_VECTOR_2D(cfTLG_ITEM_HEALTH_WIDTH, cfTLG_ITEM_HEALTH_HEIGHT), 0, sTLGData.rgbaSprite)
|
|
|
|
TLG_GET_ITEM_INITIAL_POS_AND_OFFSET_FOR_SCREEN(TLG_RIFLE_AMMO, sTLGData.iDebugPickupScreen, vInitialPos, vOffset)
|
|
ARCADE_DRAW_PIXELSPACE_SPRITE(sTLGData.tl31HudTextDict, "ammo3", vInitialPos, INIT_VECTOR_2D(cfTLG_SPRITE_HUD_PISTOL_AMMO_CLIP_WIDTH, cfTLG_SPRITE_HUD_PISTOL_AMMO_CLIP_HEIGHT), 0, sTLGData.rgbaSprite)
|
|
|
|
TLG_GET_ITEM_INITIAL_POS_AND_OFFSET_FOR_SCREEN(TLG_SHOTGUN_AMMO, sTLGData.iDebugPickupScreen, vInitialPos, vOffset)
|
|
ARCADE_DRAW_PIXELSPACE_SPRITE(sTLGData.tl31HudTextDict, "ammo2", vInitialPos, INIT_VECTOR_2D(cfTLG_SPRITE_HUD_SHOTGUN_AMMO_CLIP_WIDTH, cfTLG_SPRITE_HUD_SHOTGUN_AMMO_CLIP_HEIGHT), 0, sTLGData.rgbaSprite)
|
|
|
|
TLG_GET_ITEM_INITIAL_POS_AND_OFFSET_FOR_SCREEN(TLG_MACHINE_GUN_AMMO, sTLGData.iDebugPickupScreen, vInitialPos, vOffset)
|
|
ARCADE_DRAW_PIXELSPACE_SPRITE(sTLGData.tl31HudTextDict, "ammo4", vInitialPos, INIT_VECTOR_2D(cfTLG_SPRITE_HUD_AMMO_WIDTH, cfTLG_SPRITE_HUD_AMMO_HEIGHT), 0, sTLGData.rgbaSprite)
|
|
ENDIF
|
|
ELSE
|
|
IF sTLGData.iDebugPickupScreen != -1
|
|
sTLGData.iDebugPickupScreen = -1
|
|
ENDIF
|
|
ENDIF
|
|
// sTLGData.fDebugStickX = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_X)
|
|
// sTLGData.fDebugStickY = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_Y)
|
|
// sTLGData.fDebugMouseX = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_CURSOR_X)
|
|
// sTLGData.fDebugMouseY = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_CURSOR_Y)
|
|
sTLGData.iStaggeredDebugCount++
|
|
IF sTLGData.iStaggeredDebugCount >= ENUM_TO_INT(TLG_MAX_LEVELS)
|
|
sTLGData.iStaggeredDebugCount = 0
|
|
ENDIF
|
|
|
|
IF IS_DEBUG_KEY_JUST_PRESSED(KEY_1, KEYBOARD_MODIFIER_CTRL, "Debug Rifle")
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_RIFLE)
|
|
TLG_SET_PLAYER_SPECIAL_WEAPON(TLG_PLAYER_WEAPON_RIFLE)
|
|
ELIF IS_DEBUG_KEY_JUST_PRESSED(KEY_2, KEYBOARD_MODIFIER_CTRL, "Debug Shotgun")
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_SHOTGUN)
|
|
TLG_SET_PLAYER_SPECIAL_WEAPON(TLG_PLAYER_WEAPON_SHOTGUN)
|
|
ELIF IS_DEBUG_KEY_JUST_PRESSED(KEY_3, KEYBOARD_MODIFIER_CTRL, "Debug Gatling")
|
|
TLG_PLAY_SOUND_AND_RELEASE_NO_POSITION(TLG_AUDIO_EFFECT_PLAYER_GATLING_GUN)
|
|
TLG_SET_PLAYER_SPECIAL_WEAPON(TLG_PLAYER_WEAPON_GATLING)
|
|
ENDIF
|
|
|
|
ARCADE_GAMES_POSTFX_WIDGET_UPDATE()
|
|
|
|
ARCADE_GAMES_LEADERBOARD_WIDGET_UPDATE(sTLGData.sLbData, playerBd, tlgServerBd.sLeaderboard)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Dumps the current state of the game to the logs
|
|
/// Automatically called when a bug is entered
|
|
PROC TLG_DEBUG_DUMP_DATA_TO_LOGS()
|
|
|
|
ARCADE_CABINET_DUMP_DATA_TO_CONSOLE()
|
|
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] {dsw} TLG_DEBUG_DUMP_DATA_TO_LOGS - Dumping data...")
|
|
|
|
//General
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] ----- GENERAL -----")
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_ARCADE] [JS] eClientState = ", TLG_DEBUG_GET_TLG_ARCADE_CLIENT_STATE_AS_STRING(sTLGData.eClientState))
|
|
|
|
TLG_DEBUG_OUTPUT_ALL_ENEMY_POSITIONS()
|
|
|
|
TLG_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS()
|
|
|
|
ENDPROC
|
|
|
|
PROC TLG_DEBUG_PROCESSING()
|
|
|
|
TLG_DEBUG_CREATE_WIDGETS()
|
|
|
|
//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)
|
|
TLG_DEBUG_DUMP_DATA_TO_LOGS()
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
#ENDIF
|
|
|
|
/// PURPOSE:
|
|
/// Run every frame before the client state machine is processed
|
|
PROC TLG_PRE_UPDATE()
|
|
|
|
IF sTLGData.eClientState >= TLG_ARCADE_CLIENT_STATE_CLEANUP
|
|
// Cleaning up, don't do anything
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT IS_SKYSWOOP_AT_GROUND()
|
|
OR SHOULD_KICK_PLAYER_FROM_ANY_ARCADE_GAME()
|
|
TLG_SET_LOCAL_STATE(TLG_ARCADE_CLIENT_STATE_CLEANUP)
|
|
EXIT
|
|
ENDIF
|
|
|
|
ARCADE_GAMES_HELP_TEXT_PRE_UPDATE()
|
|
|
|
ARCADE_GAMES_LEADERBOARD_PROCESS_EVENTS(sTLGData.sLbData, tlgServerBd.sLeaderboard, playerBd, tlgServerBd.bLeaderboardRecieved)
|
|
|
|
ARCADE_GAMES_LEADERBOARD_LOAD(sTLGData.sLbData, CASINO_ARCADE_GAME_TLG, tlgServerBd.bLeaderboardRecieved)
|
|
|
|
TLG_UPDATE_ANIM_FRAMES()
|
|
|
|
BOOL bIsPlaying = sTLGData.eClientState >= TLG_ARCADE_CLIENT_STATE_INTRO
|
|
|
|
INT i
|
|
IF bIsPlaying
|
|
|
|
//-- Construct an array of all the onscreen cover locations which enemy peds can use to hide behind
|
|
//-- Peds can loop through this to see if there's any nearby cover.
|
|
//-- Avoids having every enemy loop through every cover location, every frame.
|
|
IF sTLGData.iStaggeredOnScreenViableCoverCount = 0
|
|
sTLGData.iNumberOfViableOnScreenCoverPoints = 0
|
|
|
|
REPEAT ciTLG_MAX_COVER i
|
|
IF sTLGData.iNumberOfViableOnScreenCoverPoints < ciTLG_MAX_SUITABLE_HIDE_BEHIND_COVER
|
|
IF TLG_IS_COVER_ASSET_TYPE_SUITABLE_FOR_COVER(sTLGData.sCoverData[i].eType)
|
|
IF TLG_IS_COVER_ON_SCREEN(i)
|
|
// #IF IS_DEBUG_BUILD
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_PRE_UPDATE] [TLG_IS_COVER_SUITABLE_FOR_ENEMY_TO_USE] [dsw] ")
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_PRE_UPDATE] [TLG_IS_COVER_SUITABLE_FOR_ENEMY_TO_USE] [dsw] Adding cover ", i, " To viable cover locations. Type: ", TLG_GET_ASSET_TYPE_AS_STRING(sTLGData.sCoverData[i].eType), " Tot Viable: ", sTLGData.iNumberOfViableOnScreenCoverPoints + 1 )
|
|
// #ENDIF
|
|
sTLGData.iViableOnScreenEnemyCoverPoints[sTLGData.iNumberOfViableOnScreenCoverPoints] = i
|
|
sTLGData.iNumberOfViableOnScreenCoverPoints++
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
ARCADE_CABINET_COMMON_EVERY_FRAME_PROCESSING(bIsPlaying)
|
|
|
|
TLG_SET_CURRENT_TIMESTEP()
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Run every frame after the client state machine is processed
|
|
PROC TLG_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()
|
|
|
|
IF NOT ARCADE_GAMES_HELP_TEXT_SHOULD_ALLOW_THIS_FRAME()
|
|
HIDE_HELP_TEXT_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF sTLGData.eClientState >= TLG_ARCADE_CLIENT_STATE_PLAYING
|
|
IF sTLGData.iRightMostCover >= 0
|
|
IF sTLGData.sCoverData[sTLGData.iRightMostCover].iScreen > stlgData.iCurrentScreen
|
|
stlgData.iCurrentScreen = sTLGData.sCoverData[sTLGData.iRightMostCover].iScreen
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_POST_UPDATE] {DSW} Current screen updated to ", stlgData.iCurrentScreen, " as right most cover ", sTLGData.iRightMostCover, " of type ", TLG_GET_ASSET_TYPE_AS_STRING(sTLGData.sCoverData[sTLGData.iRightMostCover].eType), " is for screen ", sTLGData.sCoverData[sTLGData.iRightMostCover].iScreen)
|
|
#ENDIF
|
|
ELIF sTLGData.sCoverData[sTLGData.iRightMostCover].iScreen = 1 AND stlgData.iCurrentScreen = 4
|
|
stlgData.iCurrentScreen = sTLGData.sCoverData[sTLGData.iRightMostCover].iScreen
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CDEBUG1LN(DEBUG_MINIGAME, "[TLG_POST_UPDATE] {DSW} Current screen updated to ", stlgData.iCurrentScreen, " as right most cover ", sTLGData.iRightMostCover, " of type ", TLG_GET_ASSET_TYPE_AS_STRING(sTLGData.sCoverData[sTLGData.iRightMostCover].eType), " is for screen ", sTLGData.sCoverData[sTLGData.iRightMostCover].iScreen)
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
sTLGData.iStaggeredOnScreenViableCoverCount++
|
|
IF sTLGData.iStaggeredOnScreenViableCoverCount >= sTLGData.iNumberOfViableOnScreenCoverPoints
|
|
sTLGData.iStaggeredOnScreenViableCoverCount = 0
|
|
// CDEBUG1LN(DEBUG_MINIGAME, "[TLG_POST_UPDATE] {DSW} Resetting sTLGData.iStaggeredOnScreenViableCoverCount, num viable: ", sTLGData.iNumberOfViableOnScreenCoverPoints)
|
|
ENDIF
|
|
ENDIF
|
|
//HIDE_HELP_TEXT_THIS_FRAME()
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Call every frame to run the minigame
|
|
PROC PROCESS_TLG_ARCADE()
|
|
|
|
TLG_PRE_UPDATE()
|
|
|
|
TLG_PROCESS_CLIENT_STATE_MACHINE()
|
|
|
|
TLG_POST_UPDATE()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
TLG_DEBUG_PROCESSING()
|
|
#ENDIF
|
|
|
|
ENDPROC
|