Files
2025-09-29 00:52:08 +02:00

7428 lines
302 KiB
XML
Executable File

USING "camhedz_arcade_drawing.sch"
USING "net_arcade_cabinet.sch"
/// PURPOSE:
/// Updates the values used for animating sprite sequences
PROC CMHDZ_UPDATE_ANIM_FRAMES()
INT p, i
FOR p = 0 TO ciCMHDZ_MAX_PLAYERS - 1
//Blast Slow anim update
FOR i = 0 TO ciCMHDZ_MAX_PROJECTILES - 1
sCMHDZData.sPlayerData[p].sBulletData[i].iSlowFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
sCMHDZData.sPlayerData[p].sBulletData[i].iSlowUpdateFrames = FLOOR(sCMHDZData.sPlayerData[p].sBulletData[i].iSlowFrameTimeCounter / cfCMHDZ_SLOW_ANIM_FRAME_TIME)
sCMHDZData.sPlayerData[p].sBulletData[i].iSlowFrameTimeCounter -= ROUND(cfCMHDZ_SLOW_ANIM_FRAME_TIME * sCMHDZData.sPlayerData[p].sBulletData[i].iSlowUpdateFrames)
ENDFOR
FOR i = 0 TO ciCMHDZ_MAX_PLAYER_THROWN_PROJECTILES - 1
sCMHDZData.sPlayerData[p].sThrownProjectile[i].iSlowFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
sCMHDZData.sPlayerData[p].sThrownProjectile[i].iSlowUpdateFrames = FLOOR(sCMHDZData.sPlayerData[p].sThrownProjectile[i].iSlowFrameTimeCounter / cfCMHDZ_DEFAULT_ANIM_FRAME_TIME)
sCMHDZData.sPlayerData[p].sThrownProjectile[i].iSlowFrameTimeCounter -= ROUND(cfCMHDZ_DEFAULT_ANIM_FRAME_TIME * sCMHDZData.sPlayerData[p].sThrownProjectile[i].iSlowUpdateFrames)
ENDFOR
ENDFOR
// Enemies
FOR i = 0 TO ciCMHDZ_MAX_ENEMIES -1
//Slow anim update
sCMHDZData.sEnemyData[i].iSlowFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
sCMHDZData.sEnemyData[i].iSlowUpdateFrames = FLOOR(sCMHDZData.sEnemyData[i].iSlowFrameTimeCounter / cfCMHDZ_SLOW_ANIM_FRAME_TIME)
sCMHDZData.sEnemyData[i].iSlowFrameTimeCounter -= ROUND(cfCMHDZ_SLOW_ANIM_FRAME_TIME * sCMHDZData.sEnemyData[i].iSlowUpdateFrames)
//Default anim update
sCMHDZData.sEnemyData[i].iDefaultFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
sCMHDZData.sEnemyData[i].iDefaultUpdateFrames = FLOOR(sCMHDZData.sEnemyData[i].iDefaultFrameTimeCounter / cfCMHDZ_DEFAULT_ANIM_FRAME_TIME)
sCMHDZData.sEnemyData[i].iDefaultFrameTimeCounter -= ROUND(cfCMHDZ_DEFAULT_ANIM_FRAME_TIME * sCMHDZData.sEnemyData[i].iDefaultUpdateFrames)
ENDFOR
// FOR i = 0 TO ciCMHDZ_MAX_HOSTAGES -1
//
// //Slow anim update
// sCMHDZData.sHostageData[i].iSlowFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
// sCMHDZData.sHostageData[i].iSlowUpdateFrames = FLOOR(sCMHDZData.sHostageData[i].iSlowFrameTimeCounter / cfCMHDZ_SLOW_ANIM_FRAME_TIME)
// sCMHDZData.sHostageData[i].iSlowFrameTimeCounter -= ROUND(cfCMHDZ_SLOW_ANIM_FRAME_TIME * sCMHDZData.sHostageData[i].iSlowUpdateFrames)
//
// //Default anim update
// sCMHDZData.sHostageData[i].iDefaultFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
// sCMHDZData.sHostageData[i].iDefaultUpdateFrames = FLOOR(sCMHDZData.sHostageData[i].iDefaultFrameTimeCounter / cfCMHDZ_DEFAULT_ANIM_FRAME_TIME)
// sCMHDZData.sHostageData[i].iDefaultFrameTimeCounter -= ROUND(cfCMHDZ_DEFAULT_ANIM_FRAME_TIME * sCMHDZData.sHostageData[i].iDefaultUpdateFrames)
//
// ENDFOR
FOR i = 0 TO ciCMHDZ_MAX_FX -1
//Slow anim update
sCMHDZData.sFXData[i].iSlowFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
sCMHDZData.sFXData[i].iSlowUpdateFrames = FLOOR(sCMHDZData.sFXData[i].iSlowFrameTimeCounter / cfCMHDZ_SLOW_ANIM_FRAME_TIME)
sCMHDZData.sFXData[i].iSlowFrameTimeCounter -= ROUND(cfCMHDZ_SLOW_ANIM_FRAME_TIME * sCMHDZData.sFXData[i].iSlowUpdateFrames)
// Medium
sCMHDZData.sFXData[i].iMedFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
sCMHDZData.sFXData[i].iMedUpdateFrames = FLOOR(sCMHDZData.sFXData[i].iMedFrameTimeCounter / cfCMHDZ_DEFAULT_ANIM_FRAME_TIME)
sCMHDZData.sFXData[i].iMedFrameTimeCounter -= ROUND(cfCMHDZ_DEFAULT_ANIM_FRAME_TIME * sCMHDZData.sFXData[i].iMedUpdateFrames)
ENDFOR
FOR i = 0 TO ciCMHDZ_MAX_COVER - 1
IF CMHDZ_COVER_DATA_IS_BITMASK_SET(i, CMHDZ_COVER_DATA_BITS_IS_ANIMATED)
AND sCMHDZData.sCoverData[i].iHitCount > 0
//Slow anim update
sCMHDZData.sCoverData[i].iSlowFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
sCMHDZData.sCoverData[i].iSlowUpdateFrames = FLOOR(sCMHDZData.sCoverData[i].iSlowFrameTimeCounter / cfCMHDZ_SLOW_ANIM_FRAME_TIME)
sCMHDZData.sCoverData[i].iSlowFrameTimeCounter -= ROUND(cfCMHDZ_SLOW_ANIM_FRAME_TIME * sCMHDZData.sCoverData[i].iSlowUpdateFrames)
//Default anim update
sCMHDZData.sCoverData[i].iDefaultFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
sCMHDZData.sCoverData[i].iDefaultUpdateFrames = FLOOR(sCMHDZData.sCoverData[i].iDefaultFrameTimeCounter / cfCMHDZ_DEFAULT_ANIM_FRAME_TIME)
sCMHDZData.sCoverData[i].iDefaultFrameTimeCounter -= ROUND(cfCMHDZ_DEFAULT_ANIM_FRAME_TIME * sCMHDZData.sCoverData[i].iDefaultUpdateFrames)
ENDIF
ENDFOR
FOR i = 0 TO ciCMHDZ_MAX_ENEMY_PROJECTILES - 1
sCMHDZData.sEnemyProjectiles[i].iSlowFrameTimeCounter += ROUND(GET_FRAME_TIME() * 1000)
sCMHDZData.sEnemyProjectiles[i].iSlowUpdateFrames = FLOOR(sCMHDZData.sEnemyProjectiles[i].iSlowFrameTimeCounter / cfCMHDZ_SLOW_ANIM_FRAME_TIME)
sCMHDZData.sEnemyProjectiles[i].iSlowFrameTimeCounter -= ROUND(cfCMHDZ_SLOW_ANIM_FRAME_TIME * sCMHDZData.sEnemyProjectiles[i].iSlowUpdateFrames)
ENDFOR
ENDPROC
PROC CMHDZ_TRIGGER_TITLE_MUSIC()
IF NOT IS_BIT_SET(sCMHDZData.iMusicBitset, ENUM_TO_INT(CMHDZ_MUSIC_BIT_STARTED_TITLE))
CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_TRIGGER_TITLE_MUSIC] Called.")
//DEBUG_PRINTCALLSTACK()
CMHDZ_TRIGGER_MUSIC_EVENT(CMHDZ_MUSIC_EVENT_TITLE)
SET_BIT(sCMHDZData.iMusicBitset, ENUM_TO_INT(CMHDZ_MUSIC_BIT_STARTED_TITLE))
ENDIF
ENDPROC
PROC CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE eNewState)
//CDEBUG2LN(DEBUG_MINIGAME, " ")
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] [BAZ] {DSW} CMHDZ_SET_LOCAL_STATE - State changed from ",
//CMHDZ_ARCADE_CLIENT_STATE_TO_STRING(sCMHDZData.eClientState), " to ", CMHDZ_ARCADE_CLIENT_STATE_TO_STRING(eNewState))
//DEBUG_PRINTCALLSTACK()
sCMHDZData.eClientState = eNewState
// IF eNewState = CMHDZ_ARCADE_CLIENT_STATE_LEVEL_SELECTION_MENU // relaced by CMHDZ_AUDIO_EFFECT_PLAYER_START
// CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_SELECT_STAGE)
// ENDIF
ENDPROC
PROC CMHDZ_RESET_ALL_ENEMY_THROWN_PROJECTLES()
INT i
REPEAT ciCMHDZ_MAX_ENEMY_PROJECTILES i
CMHDZ_RESET_ENEMY_THROWN_PROJECTILE(i)
ENDREPEAT
sCMHDZData.iNumberOfThrownEnemyProjectiles = 0
ENDPROC
PROC RESET_ENEMIES()
INT i = 0
FOR i = 0 TO ciCMHDZ_MAX_ENEMIES -1
CMHDZ_RESET_ENEMY(i)
sCMHDZData.sEnemyData[i].iEnemyType = CMHDZ_ENEMY_INVALID
ENDFOR
ENDPROC
PROC CMHDZ_RESET_ALL_COVER()
INT i
FOR i = 0 TO ciCMHDZ_MAX_COVER -1
CMHDZ_RESET_COVER(i)
sCMHDZData.sCoverData[i].eType = CMHDZ_ASSET_INVALID
ENDFOR
sCMHDZData.iNumberOfProps = 0
ENDPROC
PROC CMHDZ_CLEANUP_VARIABLES()
sCMHDZData.sPlayerData[0].fHealth = 1.0
// sCMHDZData.sPlayerData[0].iWeapon = 0
// sCMHDZData.sPlayerData[0].iAmmo = ciCMHDZ_PLAYER_START_AMMO
CMHDZ_RESET_ALL_PLAYER_THROWN_PROJECTILES(0)
CMHDZ_INIT_PLAYER_WEAPON()
sCMHDZData.sPlayerData[0].fHitCountdown = 0.0
//sCMHDZData.iCurrentScreen = 1
////sCMHDZData.fOverallLevelProgression = 0.0 // Trialing keeping this the same.
sCMHDZData.iCurrentActiveEnemies[0] = 0
sCMHDZData.iCurrentActiveEnemies[1] = 0
sCMHDZData.iCurrentActiveEnemies[2] = 0
sCMHDZData.bFadingOut = FALSE
sCMHDZData.eLevelState = CMHDZ_FADING_IN
CMHDZ_RESET_ALL_COVER()
RESET_ENEMIES()
CMHDZ_RESET_ITEMS()
CMHDZ_RESET_ALL_ENEMY_THROWN_PROJECTLES()
sCMHDZData.iNumberOfEnemies = 0
sCMHDZData.iTotalNumberOfEnemies = 0
sCMHDZData.iTotalNumberOfEnemiesSpawned = 0
//CMHDZ_RESET_HOSTAGES()
INT i
FOR i = 0 TO ciCMHDZ_MAX_BACKGROUND_ELEMS - 1
CMHDZ_BACKGROUND_DATA_SET_RENDERING(i, FALSE)
ENDFOR
sCMHDZData.iNumberOfBackgroundElements = 0
CMHDZ_RESET_ITEMS()
FOR i = 0 TO ciCMHDZ_MAX_FX - 1
sCMHDZData.sFXData[i].bActive = FALSE
ENDFOR
// Reinit boss structure
sCMHDZData.sBossData.rgbaColor = sCMHDZData.rgbaWhite
CMHDZ_CHANGE_BOSS_STATE(CMHDZ_BOSS_STATE_INACTIVE)
sCMHDZData.sBossData.iActiveLane = ciCMHDZ_LANE_FOREGROUND
sCMHDZData.sBossData.bShotThisFrame = FALSE
CLEAR_BITMASK_ENUM_AS_ENUM(sCMHDZData.sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_SPAWNED_ENEMIES_1)
CLEAR_BITMASK_ENUM_AS_ENUM(sCMHDZData.sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_SPAWNED_ENEMIES_2)
CLEAR_BITMASK_ENUM_AS_ENUM(sCMHDZData.sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_ANIM_FINISHED_ONCE)
CLEAR_BITMASK_ENUM_AS_ENUM(sCMHDZData.sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_REVERSE)
CLEAR_BITMASK_ENUM_AS_ENUM(sCMHDZData.sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_TAKING_DAMAGE)
CLEAR_BITMASK_ENUM_AS_ENUM(sCMHDZData.sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_NONE)
sCMHDZData.sBossData.fAnimTimer = 0.0
sCMHDZData.sBossData.fHealth = cfBOSS_MaxHealth
//sCMHDZData.vV_ScanMod = INIT_VECTOR_2D(1.0,1.0)
CMHDZ_RESET_LOCAL_PLAYER_SCORE_FOR_CURRENT_LEVEL()
ENDPROC
FUNC BOOL CMHDZ_CHECK_FOR_MENU_PROGRESS_BUTTON(BOOL bAllowAccept = TRUE)
BOOL bShouldReturn = FALSE
// bShouldReturn = IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
//
// IF bAllowAccept
// bShouldReturn = (IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
// OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_ATTACK)
// OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RT))
// ENDIF
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
bShouldReturn = IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_FRONTEND_CANCEL)
#IF IS_DEBUG_BUILD
OR IS_KEYBOARD_KEY_JUST_PRESSED(KEY_BACK)
OR IS_KEYBOARD_KEY_JUST_PRESSED(KEY_ESCAPE)
OR IS_KEYBOARD_KEY_JUST_PRESSED(KEY_DELETE)
#ENDIF
IF (bAllowAccept
AND !bShouldReturn)
bShouldReturn = (IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_FRONTEND_ACCEPT)
OR IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_ATTACK)
OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RT))
CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ][BAZ] CMHDZ_CHECK_PLAYER_RETURNING_TO_MENU - bAllowAccept")
ENDIF
ELSE
bShouldReturn = IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
IF (bAllowAccept
AND !bShouldReturn)
bShouldReturn = (IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_FRONTEND_ACCEPT)
OR IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_ATTACK)
OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RT))
ENDIF
ENDIF
RETURN bShouldReturn
ENDFUNC
PROC CMHDZ_CHECK_PLAYER_RETURNING_TO_MENU(BOOL bReturnToTitle = TRUE, BOOL bAllowAccept = FALSE, BOOL bIsLeaderboard = FALSE, BOOL bUseTimeOut = FALSE)
BOOL bShouldReturn
BOOL bTimeExpired
IF bUseTimeOut
IF sCMHDZData.iReturnToMenuTimeout = 0
sCMHDZData.iReturnToMenuTimeout = GET_GAME_TIMER()
ENDIF
ENDIF
bTimeExpired = (bUseTimeOut AND (GET_GAME_TIMER() - sCMHDZData.iReturnToMenuTimeout > 10000))
IF NOT bIsLeaderboard
// bShouldReturn = IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
//
// IF bAllowAccept
// bShouldReturn = (IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
// OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_ATTACK)
// OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RT))
// ENDIF
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
bShouldReturn = IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_FRONTEND_CANCEL)
#IF IS_DEBUG_BUILD
OR IS_KEYBOARD_KEY_JUST_PRESSED(KEY_BACK)
OR IS_KEYBOARD_KEY_JUST_PRESSED(KEY_ESCAPE)
OR IS_KEYBOARD_KEY_JUST_PRESSED(KEY_DELETE)
#ENDIF
IF (bAllowAccept
AND !bShouldReturn)
bShouldReturn = (IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_FRONTEND_ACCEPT)
OR IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_ATTACK)
OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RT))
CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ][BAZ] CMHDZ_CHECK_PLAYER_RETURNING_TO_MENU - bAllowAccept")
ENDIF
ELSE
bShouldReturn = IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
IF (bAllowAccept
AND !bShouldReturn)
bShouldReturn = (IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_FRONTEND_ACCEPT)
OR IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_ATTACK)
OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RT))
ENDIF
ENDIF
//#IF IS_DEBUG_BUILD
ELSE
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
bShouldReturn = IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_FRONTEND_CANCEL)
#IF IS_DEBUG_BUILD
OR IS_KEYBOARD_KEY_JUST_PRESSED(KEY_BACK)
OR IS_KEYBOARD_KEY_JUST_PRESSED(KEY_ESCAPE)
OR IS_KEYBOARD_KEY_JUST_PRESSED(KEY_DELETE)
#ENDIF
IF (bAllowAccept
AND !bShouldReturn)
bShouldReturn = (IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_FRONTEND_ACCEPT)
OR IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_ATTACK)
OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RT))
ENDIF
ELSE
bShouldReturn = IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
IF (bAllowAccept
AND !bShouldReturn)
bShouldReturn = (IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_FRONTEND_ACCEPT)
OR IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_ATTACK)
OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RT))
ENDIF
ENDIF
//#ENDIF
ENDIF
IF bShouldReturn
OR bTimeExpired
#IF IS_DEBUG_BUILD
IF bTimeExpired
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_CHECK_PLAYER_RETURNING_TO_MENU] {dsw} Time expired - bReturnToTitle: ", bReturnToTitle, " bAllowAccept: ", bAllowAccept, " bIsLeaderboard: ",bIsLeaderboard, " bUseTimeOut: ",bUseTimeOut)
DEBUG_PRINTCALLSTACK()
ENDIF
#ENDIF
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_MENU_BACK)
CMHDZ_CLEANUP_VARIABLES()
// No penalty for chekcing each stage at this point.
INT i
REPEAT ENUM_TO_INT(CMHDZ_MAX_LEVELS) i
CMHDZ_CANCEL_MUSIC_EVENT(CMHDZ_GET_MUSIC_EVENT_FOR_LEVEL(INT_TO_ENUM(CMHDZ_LEVELS, i)))
ENDREPEAT
CMHDZ_TRIGGER_TITLE_MUSIC()
IF bReturnToTitle
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_TITLE_SCREEN)
//CMHDZ_START_MOVIE_FORCE(sCMHDZData.bmIdCmhdzIntro, "CMHDZ_Intro_Static")
// SET_BINK_MOVIE_TIME(sCMHDZData.bmIdCmhdzIntro, 99.0)
// DRAW_BINK_MOVIE(sCMHDZData.bmIdCmhdzIntro, cfSCREEN_CENTER, cfSCREEN_CENTER, fRatioWidth, fRatioHeight, 0.0, 255,255,255,255)
sCMHDZData.iReturnToMenuTimeout = 0
ELSE
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_LEVEL_SELECTION_MENU)
//sCMHDZData.fSyncOffsetY = 600 // Offset to correct
sCMHDZData.iReturnToMenuTimeout = 0
ENDIF
ENDIF
ENDPROC
PROC CMHDZ_INIT_GOTO_LEADERBOARD()
INT i
FOR i = 0 TO ciCMHDZ_MAX_BACKGROUND_ELEMS - 1
CMHDZ_BACKGROUND_DATA_SET_RENDERING(i, FALSE)
ENDFOR
// Grab a random frame.
sCMHDZData.eCurrentLevel = INT_TO_ENUM(CMHDZ_LEVELS, GET_RANDOM_INT_IN_RANGE(0, 5))
CMHDZ_RESET_ALL_COVER()
sCMHDZData.iNumberOfBackgroundElements = 0
#IF IS_DEBUG_BUILD
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_PROCESS_CLIENT_STATE_INIT_LEVEL] {DSW} Called. Level: ", CMHDZ_LEVELS_TO_STRING(CMHDZ_GET_CURRENT_LEVEL()))
#ENDIF
//-- Need to still draw the menu during this frame
CMHDZ_DRAW_MENU_BACKGROUND()
TWS_DRAW_FRONT_FX()
//CMHDZ_DRAW_CLIENT_STATE_MENU()
sCMHDZData.iCurrentScreen = FLOOR(sCMHDZData.fOverallLevelProgression/cfCMHDZ_SCREEN_LENGTH)
TEXT_LABEL_31 tl31TextDict = CMHDZ_GET_TEXTURE_DICTIONARY_FOR_LEVEL(sCMHDZData.eCurrentLevel)
REQUEST_STREAMED_TEXTURE_DICT(tl31TextDict)
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(tl31TextDict)
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {dsw} CMHDZ_PROCESS_CLIENT_STATE_INIT_LEVEL - Loading ", tl31TextDict)
EXIT
ENDIF
// Reset Counter Variables
CMHDZ_CLEANUP_VARIABLES()
CMHDZ_INIT_COVER_POINTS(sCMHDZData.eCurrentLevel)
CMHDZ_INIT_PLAYERS()
CMHDZ_INIT_BACKGROUND(sCMHDZData.eCurrentLevel)
CMHDZ_INIT_ITEMS()
CMHDZ_INIT_PLAY_VARIABLES()
CMHDZ_INIT_BOSS_STRUCT()
CMHDZ_INIT_SOUND()
sCMHDZData.iLocalLevelRunningTime = GET_GAME_TIMER()
sCMHDZData.iLevelBitset[ENUM_TO_INT(sCMHDZData.eCurrentLevel)] = 0
i = 0 // reset
REPEAT ciCMHDZ_MAX_LANES i
sCMHDZData.iCurrentActiveEnemies[i] = 0
sCMHDZData.iTimeSinceEnemyActive[i] = 0
ENDREPEAT
sCMHDZData.iResultsScreenTimer = 0
sCMHDZData.iResultsScreenTimeout = 0
sCMHDZData.iReturnToMenuTimeout = 0
sCMHDZData.iTotalNumberOfEnemiesKilledForScreen = 0
// New progression trackers#
sCMHDZData.fOverallLevelProgression = 0.0
sCMHDZData.iStaticScreenPhase = 0
ARCADE_GAMES_HELP_TEXT_CLEAR()
CMHDZ_INIT_BACKGROUND(CMHDZ_LEVEL_SCRAPYARD)
CMHDZ_INIT_COVER_POINTS(CMHDZ_LEVEL_SCRAPYARD)
ENDPROC
PROC CMHDZ_ACTIVATE_ITEM(INT iIndex)
#IF IS_DEBUG_BUILD
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ACTIVATE_ITEM] {DSW} Called. Item: ", iIndex, " Type: ", CMHDZ_ITEM_TYPES_TO_STRING(sCMHDZData.sItemData[iIndex].eItemType), " Pos: ", sCMHDZData.sItemData[iIndex].vSpritePos.x, ", ", sCMHDZData.sItemData[iIndex].vSpritePos.y)
#ENDIF
// INT iInClip
// INT iTotal
// INT iRand
// CMHDZ_PLAYER_WEAPON_DATA weaponData
SWITCH sCMHDZData.sItemData[iIndex].eItemType
CASE CMHDZ_ITEM_NAIL_GUN_AMMO
// sCMHDZData.sPlayerData[0].iWeapon = 1
// sCMHDZData.sPlayerData[0].iAmmo = 1000
CMHDZ_SET_PLAYER_SPECIAL_WEAPON(CMHDZ_PLAYER_WEAPON_NAILGUN)
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_NAILGUN_RELOAD_SINGLE)
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_DIRECTOR_Weapon_Rnd)
sCMHDZData.sItemData[iIndex].bRendering = FALSE
sCMHDZData.sItemData[iIndex].iRenderAfterWarpCount = 0
BREAK
CASE CMHDZ_ITEM_RIFLE_AMMO
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_RIFLE_RELOAD_SINGLE)
CMHDZ_SET_PLAYER_SPECIAL_WEAPON(CMHDZ_PLAYER_WEAPON_RIFLE)
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_DIRECTOR_Weapon_AR)
sCMHDZData.sItemData[iIndex].bRendering = FALSE
sCMHDZData.sItemData[iIndex].iRenderAfterWarpCount = 0
BREAK
CASE CMHDZ_ITEM_SHOTGUN_AMMO
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_SHOTGUN_RELOAD_SINGLE)
CMHDZ_SET_PLAYER_SPECIAL_WEAPON(CMHDZ_PLAYER_WEAPON_SHOTGUN)
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_DIRECTOR_Weapon_SG)
sCMHDZData.sItemData[iIndex].bRendering = FALSE
sCMHDZData.sItemData[iIndex].iRenderAfterWarpCount = 0
BREAK
CASE CMHDZ_ITEM_HEALTH
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_PICKUP_HEALTH)
CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Collectable_Health)
sCMHDZData.sPlayerData[0].fHealth = CLAMP(sCMHDZData.sPlayerData[0].fHealth + 0.5, 0.0, 1.0)
sCMHDZData.sItemData[iIndex].bRendering = FALSE
sCMHDZData.sItemData[iIndex].iRenderAfterWarpCount = 0
BREAK
CASE CMHDZ_ITEM_SHIELD
//CMHDZ_PLAY_SOUND_NO_POSITION(CMHDZ_AUDIO_EFFECT_PICKUP_SHIELD)
CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Collectable_Invulnerable)
CMHDZ_SET_PLAYER_BIT(CMHDZ_PLAYER_BIT_INVULNERABILE)
sCMHDZData.sPlayerData[0].iInvulnerableTimer = GET_GAME_TIMER()
sCMHDZData.sItemData[iIndex].bRendering = FALSE
sCMHDZData.sItemData[iIndex].iRenderAfterWarpCount = 0
sCMHDZData.fPowerRunTimer = 0.0
//CMHDZ_START_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_POWERUP_ACTIVE)
BREAK
CASE CMHDZ_ITEM_BUFF
//CMHDZ_PLAY_SOUND_NO_POSITION(CMHDZ_AUDIO_EFFECT_PICKUP_BUFF)
CMHDZ_SET_PLAYER_BIT(CMHDZ_PLAYER_BIT_QUAD_DAMAGE)
//CMHDZ_START_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_POWERUP_ACTIVE)
CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Collectable_Damage)
sCMHDZData.fPowerRunTimer = 0.0
sCMHDZData.sPlayerData[0].iQuadDamageTimer = GET_GAME_TIMER()
sCMHDZData.sItemData[iIndex].bRendering = FALSE
sCMHDZData.sItemData[iIndex].iRenderAfterWarpCount = 0
BREAK
CASE CMHDZ_ITEM_CASH
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_PICKUP_CASH)
CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Collectable_Cash)
CMHDZ_ADD_TO_LOCAL_PLAYER_SCORE(CMHDZ_SCORE_TYPE_CASH)
sCMHDZData.sItemData[iIndex].bRendering = FALSE
sCMHDZData.sItemData[iIndex].iRenderAfterWarpCount = 0
BREAK
CASE CMHDZ_ITEM_MOLOTOV
sCMHDZData.sPlayerData[0].projectileType = CMHDZ_PROJECTILE_MOLOTOV
sCMHDZData.sPlayerData[0].iThrownProjectilesAmmo = ciCMHDZ_ITEM_MOLOTOV_AMMO_COUNT
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_DIRECTOR_Weapon_MV)
sCMHDZData.sItemData[iIndex].bRendering = FALSE
sCMHDZData.sItemData[iIndex].iRenderAfterWarpCount = 0
BREAK
CASE CMHDZ_ITEM_BRICK
sCMHDZData.sPlayerData[0].projectileType = CMHDZ_PROJECTILE_BRICK
sCMHDZData.sPlayerData[0].iThrownProjectilesAmmo = ciCMHDZ_ITEM_BRICK_AMMO_COUNT
sCMHDZData.sItemData[iIndex].bRendering = FALSE
sCMHDZData.sItemData[iIndex].iRenderAfterWarpCount = 0
BREAK
CASE CMHDZ_ITEM_NAILBOMB
sCMHDZData.sPlayerData[0].projectileType = CMHDZ_PROJECTILE_NAILBOMB
sCMHDZData.sPlayerData[0].iThrownProjectilesAmmo = ciCMHDZ_ITEM_NAILBOMB_AMMO_COUNT
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_DIRECTOR_Weapon_NB)
sCMHDZData.sItemData[iIndex].bRendering = FALSE
sCMHDZData.sItemData[iIndex].iRenderAfterWarpCount = 0
BREAK
CASE CMHDZ_ITEM_DYNAMITE
sCMHDZData.sPlayerData[0].projectileType = CMHDZ_PROJECTILE_DYNAMITE
sCMHDZData.sPlayerData[0].iThrownProjectilesAmmo = ciCMHDZ_ITEM_DYNAMITE_AMMO_COUNT
sCMHDZData.sItemData[iIndex].bRendering = FALSE
sCMHDZData.sItemData[iIndex].iRenderAfterWarpCount = 0
BREAK
CASE CMHDZ_ITEM_VIDEOTAPE
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_PICKUP_TAPE)
CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Collectable_Tape)
CMHDZ_ADD_TO_LOCAL_PLAYER_SCORE(CMHDZ_SCORE_TYPE_TAPE)
sCMHDZData.sItemData[iIndex].bRendering = FALSE
sCMHDZData.sItemData[iIndex].iRenderAfterWarpCount = 0
BREAK
ENDSWITCH
// Activate item
SWITCH sCMHDZData.sItemData[iIndex].eItemType
CASE CMHDZ_ITEM_BUFF
CASE CMHDZ_ITEM_SHIELD
sAGPostFXData.sFXLayers[ARCADE_GAMES_POSTFX_LAYER_SCAN_LINE].bShow = TRUE
sAGPostFXData.sFXLayers[ARCADE_GAMES_POSTFX_LAYER_FLICKERING].bShow = TRUE
INIT_RGBA_STRUCT(sAGPostFXData.sFXLayers[ARCADE_GAMES_POSTFX_LAYER_SCAN_LINE].rgbaColor,255,255,255,20)
BREAK
ENDSWITCH
//CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_MUSIC_TRANSITION)
CMHDZ_INCREASE_POWERUPS_COLLECTED_FOR_CURRENT_LEVEL()
ENDPROC
FUNC BOOL CMHDZ_CHECK_FOR_HEADSHOT(VECTOR_2D vSpriteTL, VECTOR_2D vBullet, INT iLane)
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} [CMHDZ_CHECK_FOR_HEADSHOT] ")
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} [CMHDZ_CHECK_FOR_HEADSHOT] Lane: ", iLane)
// IF sCMHDZData.sPlayerData[0].weaponType != CMHDZ_PLAYER_WEAPON_TYPE_SPECIAL
// RETURN FALSE
// ENDIF
//
// IF CMHDZ_GET_PLAYER_CURRENT_WEAPON() = CMHDZ_PLAYER_WEAPON_NAILGUN
// RETURN FALSE
// ENDIF
FLOAT fAbsfDist = ABSF(vBullet.Y - vSpriteTL.y)
FLOAT fYMin, fYMax
SWITCH iLane
CASE ciCMHDZ_LANE_BACKGROUND // Back of screen
fYMin = cfCMHDZ_HEADSHOT_BACKGROUND_MIN_Y
fYMax = cfCMHDZ_HEADSHOT_BACKGROUND_MAX_Y
BREAK
CASE ciCMHDZ_LANE_MIDDLE // Middle of screen
fYMin = cfCMHDZ_HEADSHOT_MIDGROUND_MIN_Y
fYMax = cfCMHDZ_HEADSHOT_MIDGROUND_MAX_Y
BREAK
CASE ciCMHDZ_LANE_FOREGROUND // Front of screen
fYMin = cfCMHDZ_HEADSHOT_FOREGROUND_MIN_Y
fYMax = cfCMHDZ_HEADSHOT_FOREGROUND_MAX_Y
BREAK
ENDSWITCH
fAbsfDist = ABSF(vBullet.Y - vSpriteTL.y)
IF fAbsfDist >= fYMin
AND fAbsfDist <= fYMax
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} [CMHDZ_CHECK_FOR_HEADSHOT] HEADSHOT!")
RETURN TRUE
ENDIF
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} [CMHDZ_CHECK_FOR_HEADSHOT] No Headshot - Diff: ", fAbsfDist, " Min: ", fYMin, " Max : ", fYMax)
RETURN FALSE
ENDFUNC
PROC CMHDZ_PLAY_AUDIO_FOR_SHOT_COVER(INT iCover)
CMHDZ_ASSET_TYPES eType = sCMHDZData.sCoverData[iCover].eType
VECTOR_2D vPos = sCMHDZData.sCoverData[iCover].vSpritePos
#IF IS_DEBUG_BUILD
//CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_PLAY_AUDIO_FOR_SHOT_COVER] [CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER] {dsw} Cover ", iCover, " Type: ", CMHDZ_ASSET_TYPES_TO_STRING(sCMHDZData.sCoverData[iCover].eType))
#ENDIF
SWITCH eType
CASE CMHDZ_ASSET_GRASS
CASE CMHDZ_ASSET_BUSH_1
CASE CMHDZ_ASSET_BUSH_2
CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_BULLET_HIT_BUSHES, vPos)
BREAK
CASE CMHDZ_ASSET_MEATGRINDER_1
CASE CMHDZ_ASSET_SCRAPYARD_MD_VAN_1
CASE CMHDZ_ASSET_SCRAPYARD_MD_VAN_2
CASE CMHDZ_ASSET_SCRAPYARD_MD_VAN_3
CASE CMHDZ_ASSET_SCRAPYARD_MD_VAN_4
CASE CMHDZ_ASSET_SCRAPYARD_MD_CAR_1
CASE CMHDZ_ASSET_SCRAPYARD_MD_CAR_2
CASE CMHDZ_ASSET_SCRAPYARD_MD_CAR_3
CASE CMHDZ_ASSET_SCRAPYARD_MD_CAR_4
CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_BULLET_HIT_METAL, vPos)
BREAK
CASE CMHDZ_ASSET_ROCK_SMALL
CASE CMHDZ_ASSET_ROCK_LARGE
CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_BULLET_HIT_ROCK, vPos)
BREAK
CASE CMHDZ_ASSET_BODYBAG_1
CASE CMHDZ_ASSET_BODYBAG_2
CASE CMHDZ_ASSET_BODYBAG_3
CASE CMHDZ_ASSET_BODYBAG_FLOOR_1
CASE CMHDZ_ASSET_BODYBAG_FLOOR_2
CASE CMHDZ_ASSET_BODYBAG_FLOOR_3
CASE CMHDZ_ASSET_BODYBAG_FLOOR_4
CASE CMHDZ_ASSET_PIG
CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_BULLET_HIT_BODY, vPos)
BREAK
DEFAULT
CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_BULLET_HIT_GENERIC, vPos)
BREAK
ENDSWITCH
ENDPROC
FUNC INT CMHDZ_GET_NUMBER_OF_PICKUPS_PLACED_INSIDE_PIGS_FOR_CURRENT_SCREEN()
INT i
INT iCount
FOR i = 0 TO ciCMHDZ_MAX_COVER - 1
IF sCMHDZData.sCoverData[i].eType = CMHDZ_ASSET_PIG
IF CMHDZ_IS_POSITION_ON_SCREEN(sCMHDZData.sCoverData[i].vSpritePos)
IF CMHDZ_COVER_DATA_IS_BITMASK_SET(i, CMHDZ_COVER_DATA_BITS_SPAWNED_PICKUP)
iCount++
ENDIF
ENDIF
ENDIF
ENDFOR
RETURN iCount
ENDFUNC
PROC CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER( INT iCover, INT iPlayer, INT iProjectile, BOOL &bProcessedThisFrame )
IF bProcessedThisFrame
EXIT
ENDIF
IF sCMHDZData.sCoverData[iCover].iCoverLane = ciCMHDZ_LANE_FOREGROUND
EXIT
ENDIF
INT iRandom
INT iPlaced
VECTOR_2D vPickupLoc
sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].bHitObject = TRUE
sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].iTimeOfHit = GET_GAME_TIMER()
sCMHDZData.sCoverData[iCover].iHitCount++
#IF IS_DEBUG_BUILD
//CDEBUG2LN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER] {dsw} Cover ", iCover, " Shot. Hit count: ", sCMHDZData.sCoverData[iCover].iHitCount, " Lane: ", sCMHDZData.sCoverData[iCover].iCoverLane, " Type: ", CMHDZ_ASSET_TYPES_TO_STRING(sCMHDZData.sCoverData[iCover].eType), " Special? ", CMHDZ_COVER_DATA_IS_BITMASK_SET(iCover, CMHDZ_COVER_DATA_BITS_IS_SPECIAL_COVER))
#ENDIF
IF CMHDZ_COVER_DATA_IS_BITMASK_SET(iCover, CMHDZ_COVER_DATA_BITS_IS_SPECIAL_COVER)
CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_EXP_GENERIC, sCMHDZData.sCoverData[iCover].vSpritePos)
TWS_CREATE_FX(sCMHDZData.sCoverData[iCover].vSpritePos, CMHDZ_FX_EXPLOSION, sCMHDZData.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 sCMHDZData.sCoverData[iCover].eType = CMHDZ_ASSET_SPECIAL_TNT_BARREL_1
// OR sCMHDZData.sCoverData[iCover].eType = CMHDZ_ASSET_SPECIAL_TNT_CRATE
CMHDZ_ADD_COVER_TO_LIST(sCMHDZData.sCoverData[iCover].vSpritePos, CMHDZ_ASSET_SPECIAL_TNT_BARREL_1, sCMHDZData.sCoverData[iCover].iCoverLane, DEFAULT)
ENDIF
CMHDZ_KILL_ALL_ENEMIES_IN_RANGE(sCMHDZData.sCoverData[iCover].vSpritePos, 400)
CMHDZ_ADD_TO_LOCAL_PLAYER_SCORE(CMHDZ_SCORE_TYPE_SCENERY)
ELIF CMHDZ_COVER_DATA_IS_BITMASK_SET(iCover, CMHDZ_COVER_DATA_BITS_IS_ANIMATED)
IF sCMHDZData.sCoverData[iCover].eType = CMHDZ_ASSET_PIG
IF NOT CMHDZ_COVER_DATA_IS_BITMASK_SET(iCover, CMHDZ_COVER_DATA_BITS_SPAWNED_PICKUP)
IF sCMHDZData.sCoverData[iCover].iHitCount > 0
// sCMHDZData.sCoverData[iCover].bSpawnedPickup = TRUE
vPickupLoc = sCMHDZData.sCoverData[iCover].vSpritePos
// vPickupLoc.x += cfCMHDZ_PICKUP_COFFIN_OFFSET_X
// vPickupLoc.y += cfCMHDZ_PICKUP_COFFIN_OFFSET_Y
vPickupLoc.x -= 12.0
vPickupLoc.y += 36.0
// 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, 6)
//-- If we're stopping on screen 8 in the Slaughterhouse level, want to force either a NAILGUN gun pickup or a health
//-- pickup
IF CMHDZ_GET_CURRENT_LEVEL() = CMHDZ_LEVEL_SLAUGHTERHOUSE
IF CMHDZ_IS_LEVEL_STOPPED()
OR CMHDZ_IS_MOVING_LEVEL_ABOUT_TO_STOP()
iPlaced = CMHDZ_GET_NUMBER_OF_PICKUPS_PLACED_INSIDE_PIGS_FOR_CURRENT_SCREEN()
IF iPlaced = 0
//CDEBUG2LN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER] Graveyard level - stopped - haven't placed any pickups inside coffin forcing NAILGUN gun")
iRandom = 8
ELIF iPlaced = 1
//CDEBUG2LN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER] Graveyard level - stopped - placed 1 pickupinside coffin forcing health")
iRandom = 5
ELSE
//CDEBUG2LN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER] Placed too many inside coffin - iPlaced: ", iPlaced)
ENDIF
ENDIF
ENDIF
SWITCH iRandom
CASE 0 CMHDZ_ADD_ITEM_TO_LIST(vPickupLoc, CMHDZ_ITEM_RIFLE_AMMO, ciCMHDZ_LANE_FOREGROUND, DEFAULT, 0.75) BREAK
CASE 1 CMHDZ_ADD_ITEM_TO_LIST(vPickupLoc, CMHDZ_ITEM_SHOTGUN_AMMO, ciCMHDZ_LANE_FOREGROUND, DEFAULT, 0.75) BREAK
CASE 2 CMHDZ_ADD_ITEM_TO_LIST(vPickupLoc, CMHDZ_ITEM_HEALTH, ciCMHDZ_LANE_FOREGROUND, DEFAULT, 0.75) BREAK
CASE 3 CMHDZ_ADD_ITEM_TO_LIST(vPickupLoc, CMHDZ_ITEM_BUFF, ciCMHDZ_LANE_FOREGROUND, DEFAULT, 0.75) BREAK
CASE 4 CMHDZ_ADD_ITEM_TO_LIST(vPickupLoc, CMHDZ_ITEM_SHIELD, ciCMHDZ_LANE_FOREGROUND, DEFAULT, 0.75) BREAK
CASE 5 CMHDZ_ADD_ITEM_TO_LIST(vPickupLoc, CMHDZ_ITEM_NAIL_GUN_AMMO, ciCMHDZ_LANE_FOREGROUND, DEFAULT, 0.75) BREAK
//CASE 2 CMHDZ_ADD_ITEM_TO_LIST(vPickupLoc, CMHDZ_ITEM_REVOLVER_AMMO, ciCMHDZ_LANE_FOREGROUND, DEFAULT, 0.75) BREAK
//CASE 6 CMHDZ_ADD_ITEM_TO_LIST(vPickupLoc, CMHDZ_ITEM_CASH, ciCMHDZ_LANE_FOREGROUND, DEFAULT, 0.75) BREAK
//CASE 6 CMHDZ_ADD_ITEM_TO_LIST(vPickupLoc, CMHDZ_ITEM_MOLOTOV, ciCMHDZ_LANE_FOREGROUND, DEFAULT, 0.75) BREAK
//CASE 7 CMHDZ_ADD_ITEM_TO_LIST(vPickupLoc, CMHDZ_ITEM_NAILBOMB, ciCMHDZ_LANE_FOREGROUND, DEFAULT, 0.75) BREAK
ENDSWITCH
// Director dialogue
CMHDZ_HANDLE_DIRECTOR_ONE_OFF_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Props_Destroyed)
//CDEBUG2LN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER] Spawned ammo inside outhouse ", iCover)
CMHDZ_COVER_DATA_SET_BIT_BY_BOOL(iCover, CMHDZ_COVER_DATA_BITS_SPAWNED_PICKUP)
ENDIF
ENDIF
ENDIF
ENDIF
CMHDZ_PLAY_AUDIO_FOR_SHOT_COVER(iCover)
bProcessedThisFrame = TRUE
ENDPROC
FUNC INT CMHDZ_GET_AMOUNT_ENEMY_HAS_BEEN_DAMAGED(INT iEnemy, BOOL bHeadshot)
#IF IS_DEBUG_BUILD
//CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [CMHDZ_GET_AMOUNT_ENEMY_HAS_BEEN_DAMAGED] {dsw} ")
//CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [CMHDZ_GET_AMOUNT_ENEMY_HAS_BEEN_DAMAGED] {dsw} Enemy ", iEnemy, " Shot at least once. Lane: ", sCMHDZData.sEnemyData[iEnemy].iEnemyLane, " Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.sEnemyData[iEnemy].iEnemyType), " Headshot? ", bHeadshot)
#ENDIF
INT iBaseDamage
INT iRand
IF bHeadshot
//CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [CMHDZ_GET_AMOUNT_ENEMY_HAS_BEEN_DAMAGED] {dsw} was headshot. Damage: ", CMHDZ_GET_ENEMY_START_HEALTH_FOR_TYPE())
RETURN CMHDZ_GET_ENEMY_START_HEALTH_FOR_TYPE()
ENDIF
IF sCMHDZData.sEnemyData[iEnemy].iEnemyLane = ciCMHDZ_LANE_FOREGROUND
//CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [CMHDZ_GET_AMOUNT_ENEMY_HAS_BEEN_DAMAGED] {dsw} Foreground enemy. Damage: ", CMHDZ_GET_ENEMY_START_HEALTH_FOR_TYPE())
RETURN CMHDZ_GET_ENEMY_START_HEALTH_FOR_TYPE()
ENDIF
CMHDZ_PLAYER_WEAPON weapon = CMHDZ_GET_PLAYER_CURRENT_WEAPON()
CMHDZ_PLAYER_WEAPON_DATA data = CMHDZ_GET_PLAYER_WEAPON_DATA(weapon)
iBaseDamage = data.iMinDamagePerShot
IF CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_QUAD_DAMAGE)
iBaseDamage *= 4
ENDIF
IF sCMHDZData.sPlayerData[0].weaponType = CMHDZ_PLAYER_WEAPON_TYPE_DEFAULT
iRand = GET_RANDOM_INT_IN_RANGE(0, 4)
iBaseDamage += iRand
//CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [CMHDZ_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] [CMHDZ_GET_AMOUNT_ENEMY_HAS_BEEN_DAMAGED] {dsw} Player has weapon: ", CMHDZ_PLAYER_WEAPON_TO_STRING(weapon), " Returning: ", data.iMinDamagePerShot)
#ENDIF
RETURN data.iMinDamagePerShot
ENDFUNC
PROC CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_ENEMY(INT iEnemy, INT iPlayer, INT iProjectile, VECTOR_2D vSpriteTopLeft, VECTOR_2D vBulletPos )
// Don't count it if they're already dying.
IF sCMHDZData.sEnemyData[iEnemy].eState = CMHDZ_ENEMY_STATE_DYING
OR sCMHDZData.sEnemyData[iEnemy].eState = CMHDZ_ENEMY_STATE_DYING_HEADSHOT
OR sCMHDZData.sEnemyData[iEnemy].eState = CMHDZ_ENEMY_STATE_DYING_BURNING
EXIT
ENDIF
// Don't process if it's the RAT.
IF sCMHDZData.sEnemyData[iEnemy].iEnemyType = CMHDZ_RARE_ENEMY_RAT
EXIT
ENDIF
BOOL bHeadshot
IF NOT CMHDZ_ENEMY_DATA_IS_BITMASK_SET(iEnemy, CMHDZ_ENEMY_DATA_BITS_SHOT_AT_LEAST_ONCE)
CMHDZ_ENEMY_DATA_SET_BIT_BY_BOOL(iEnemy, CMHDZ_ENEMY_DATA_BITS_SHOT_AT_LEAST_ONCE, TRUE)
#IF IS_DEBUG_BUILD
//CDEBUG2LN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_ENEMY] {dsw} Enemy ", iEnemy, " Shot at least once. Lane: ", sCMHDZData.sEnemyData[iEnemy].iEnemyLane, " Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.sEnemyData[iEnemy].iEnemyType))
#ENDIF
ENDIF
bHeadshot = CMHDZ_CHECK_FOR_HEADSHOT( vSpriteTopLeft, vBulletPos, sCMHDZData.sEnemyData[iEnemy].iEnemyLane )
sCMHDZData.sEnemyData[iEnemy].iHealth -= CMHDZ_GET_AMOUNT_ENEMY_HAS_BEEN_DAMAGED(iEnemy, bHeadshot)
IF sCMHDZData.sEnemyData[iEnemy].iHealth > 0
IF !bHeadshot
CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_BULLET_HIT_BODY, sCMHDZData.sEnemyData[iEnemy].vSpritePos)
ELSE
CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_BULLET_HIT_HEADSHOT, sCMHDZData.sEnemyData[iEnemy].vSpritePos)
ENDIF
IF NOT CMHDZ_ENEMY_DATA_IS_BITMASK_SET(iEnemy, CMHDZ_ENEMY_DATA_BITS_IS_BONUS)
CMHDZ_PLAY_ENEMY_TYPE_SOUND_AND_RELEASE(sCMHDZData.sEnemyData[iEnemy].iEnemyType, CMHDZ_AUDIO_EFFECT_ENEMY_INJURED, sCMHDZData.sEnemyData[iEnemy].vSpritePos, sCMHDZData.sEnemyData[iEnemy].iEnemyVoiceID)
ELSE
CMHDZ_PLAY_BONUS_PAIN_AUDIO(iEnemy)
ENDIF
SET_BITMASK_ENUM_AS_ENUM(sCMHDZData.sPlayerData[iPlayer].eReticuleBits, CMHDZ_RETICLE_BITS_HIT_TARGET)
CMHDZ_INCREASE_ENEMY_HIT_COUNT_FOR_CURRENT_LEVEL(sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].bHit)
#IF IS_DEBUG_BUILD
//CDEBUG2LN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Enemy ", iEnemy, " Has been injured. New Health: ", sCMHDZData.sEnemyData[iEnemy].iHealth, " Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.sEnemyData[iEnemy].iEnemyType))
#ENDIF
ELSE
IF bHeadshot
// AND NOT CMHDZ_IS_BEAR(iEnemy)
CMHDZ_SET_HELP_TEXT_BIT(CMHDZ_HELP_TEXT_BIT_AT_LEAST_ONE_HEADSHOT)
CMHDZ_ADD_TO_LOCAL_PLAYER_SCORE( CMHDZ_SCORE_TYPE_ENEMY_HEADSHOT )
CMHDZ_INCREASE_ENEMY_HEADSHOT_COUNT_FOR_CURRENT_LEVEL()
CMHDZ_SET_HELP_TEXT_BIT(CMHDZ_HELP_TEXT_BIT_AT_LEAST_ONE_HEADSHOT)
CMHDZ_INCREASE_ENEMY_HIT_COUNT_FOR_CURRENT_LEVEL(sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].bHit)
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_PLAYER_SHOOT_HEADSHOT)
ELSE
CMHDZ_ADD_TO_LOCAL_PLAYER_SCORE( CMHDZ_SCORE_TYPE_ENEMY )
CMHDZ_INCREASE_ENEMY_HIT_COUNT_FOR_CURRENT_LEVEL(sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].bHit)
ENDIF
CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_BULLET_HIT_BODY, sCMHDZData.sEnemyData[iEnemy].vSpritePos)
//CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_ENEMY_A_DEAD, sCMHDZData.sEnemyData[iEnemy].vSpritePos)
// Bonus enemies run a different logic
IF NOT CMHDZ_ENEMY_DATA_IS_BITMASK_SET(iEnemy, CMHDZ_ENEMY_DATA_BITS_IS_BONUS)
IF sCMHDZData.sEnemyData[iEnemy].eState != CMHDZ_ENEMY_STATE_DYING_BURNING
//CMHDZ_PLAY_ENEMY_TYPE_SOUND_AND_RELEASE(sCMHDZData.sEnemyData[iEnemy].iEnemyType, CMHDZ_AUDIO_EFFECT_ENEMY_DEAD, sCMHDZData.sEnemyData[iEnemy].vSpritePos, sCMHDZData.sEnemyData[iEnemy].iEnemyVoiceID)
CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_ENEMY_DEAD, sCMHDZData.sEnemyData[iEnemy].vSpritePos)
// ELSE // Is on fire
// CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_ENEMY_ON_FIRE, sCMHDZData.sEnemyData[iEnemy].vSpritePos)
ENDIF
ELSE
CMHDZ_PLAY_BONUS_DEATH_AUDIO(iEnemy)
ENDIF
sCMHDZData.sEnemyData[iEnemy].eState = CMHDZ_ENEMY_STATE_DYING
IF bHeadshot
// High velocity weapons only cause the head explosions.
// IF sCMHDZData.sPlayerData[0].activeWeapon = CMHDZ_PLAYER_WEAPON_RIFLE
// OR sCMHDZData.sPlayerData[0].activeWeapon = CMHDZ_PLAYER_WEAPON_SHOTGUN
sCMHDZData.sEnemyData[iEnemy].eState = CMHDZ_ENEMY_STATE_DYING_HEADSHOT
CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Enemy_Kill_Headshot)
// ENDIF
ENDIF
sCMHDZData.sEnemyData[iEnemy].fAnimTimer = 0.0
SET_BITMASK_ENUM_AS_ENUM(sCMHDZData.sPlayerData[iPlayer].eReticuleBits, CMHDZ_RETICLE_BITS_DESTROYED_TARGET)
ENDIF
// Moving call to consider Hit count.
sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].bHit = TRUE
sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].iTimeOfHit = GET_GAME_TIMER()
ENDPROC
PROC CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_BOSS(CMHDZ_BOSS_DATA &sBossData, INT iPlayer, INT iProjectile, VECTOR_2D vSpriteTopLeft, VECTOR_2D vBulletPos )
BOOL bHeadshot
UNUSED_PARAMETER(bHeadshot)
sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].bHit = TRUE
sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].iTimeOfHit = GET_GAME_TIMER()
bHeadshot = CMHDZ_CHECK_FOR_HEADSHOT( vSpriteTopLeft, vBulletPos, sBossData.iActiveLane )
//sBossData.fHealth -= CMHDZ_GET_AMOUNT_BOSS_HAS_BEEN_DAMAGED(sBossData, bHeadshot)
IF sCMHDZData.sBossData.fHealth > 0
SET_BITMASK_ENUM_AS_ENUM(sCMHDZData.sPlayerData[iPlayer].eReticuleBits, CMHDZ_RETICLE_BITS_HIT_TARGET)
#IF IS_DEBUG_BUILD
//CDEBUG2LN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Enemy ", iEnemy, " Has been injured. New Health: ", sCMHDZData.sEnemyData[iEnemy].iHealth, " Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.sEnemyData[iEnemy].iEnemyType))
#ENDIF
ELSE
SET_BITMASK_ENUM_AS_ENUM(sCMHDZData.sPlayerData[iPlayer].eReticuleBits, CMHDZ_RETICLE_BITS_DESTROYED_TARGET)
ENDIF
CMHDZ_INCREASE_ENEMY_HIT_COUNT_FOR_CURRENT_LEVEL((sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].bHit
OR sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].bHitObject)) // Unfir to penalise enemy accuracy on this one.
CMHDZ_HANDLE_BEARSY_DAMAGE(sBossData, bHeadshot)
ENDPROC
PROC CMHDZ_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] [CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_ITEM] {dsw} Hit item", iItem, " Type: ", CMHDZ_ITEM_TYPES_TO_STRING(sCMHDZData.sItemData[iItem].eItemType))
#ENDIF
sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].bHitObject = TRUE
sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].iTimeOfHit = GET_GAME_TIMER()
CMHDZ_INCREASE_ENEMY_HIT_COUNT_FOR_CURRENT_LEVEL((sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].bHit
OR sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].bHitObject)) // Unfir to penalise enemy accuracy on this one.
sCMHDZData.sItemData[iItem].bShot = TRUE
CMHDZ_ACTIVATE_ITEM(iItem)
bProcessedThisFrame = TRUE
ENDPROC
PROC CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_THROWN_WEAPON( INT iWeapon, INT iPlayer, INT iProjectile , BOOL &bProcessedThisFrame)
IF bProcessedThisFrame
EXIT
ENDIF
#IF IS_DEBUG_BUILD
//CDEBUG2LN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] [CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_THROWN_WEAPON] {dsw} Hit thrown weapon ", iWeapon, " Type: ", CMHDZ_PROJECTILE_TYPES_TO_STRING(sCMHDZData.sEnemyProjectiles[iWeapon].eType))
#ENDIF
// Unfir to penalise enemy accuracy on this one.
CMHDZ_INCREASE_ENEMY_HIT_COUNT_FOR_CURRENT_LEVEL((sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].bHit
OR sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].bHitObject)) // Unfir to penalise enemy accuracy on this one.
sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].bHit = TRUE
sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].iTimeOfHit = GET_GAME_TIMER()
sCMHDZData.sEnemyProjectiles[iWeapon].eState = CMHDZ_PROJECTILE_STATE_IMPACT
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 20)
CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_EXP_DYNAMITE, sCMHDZData.sEnemyProjectiles[iWeapon].vSpritePos)
//CMHDZ_KILL_ALL_ENEMIES_IN_AREA(sCMHDZData.sEnemyProjectiles[iWeapon].vSpritePos, INIT_VECTOR_2D(cfCMHDZ_SPRITE_GANG_THROWN_EXPLOSION_LARGE_WIDTH, cfCMHDZ_SPRITE_GANG_THROWN_EXPLOSION_LARGE_HEIGHT), 2.0)
SWITCH sCMHDZData.sEnemyProjectiles[iWeapon].eType
CASE CMHDZ_PROJECTILE_DYNAMITE
TWS_CREATE_FX(sCMHDZData.sEnemyProjectiles[iWeapon].vSpritePos, CMHDZ_FX_ENEMY_TNT_EXP, 1)
CMHDZ_KILL_ALL_ENEMIES_IN_RANGE(sCMHDZData.sEnemyProjectiles[iWeapon].vSpritePos, 1500)
BREAK
// Stopped bearsy projectile midair.
CASE CMHDZ_PROJECTILE_JOWL
CASE CMHDZ_PROJECTILE_LEG
CASE CMHDZ_PROJECTILE_TROTTER
CASE CMHDZ_PROJECTILE_BONE
TWS_CREATE_FX(sCMHDZData.sEnemyProjectiles[iWeapon].vSpritePos, CMHDZ_FX_BLOOD_SPLAT, ciCMHDZ_LANE_FOREGROUND)
TWS_CREATE_FX(sCMHDZData.sEnemyProjectiles[iWeapon].vSpritePos, CMHDZ_FX_BEARSY_FOREGROUND_PAIN_BLOOD, ciCMHDZ_LANE_FOREGROUND)
BREAK
ENDSWITCH
bProcessedThisFrame = TRUE
ENDPROC
PROC HANDLE_PLAYER_BULLET_COLLISION(INT iPlayer, INT iProjectile)
IF NOT sCMHDZData.sPlayerData[iPlayer].bHasJustShot
EXIT
ENDIF
INT i
CMHDZ_PLAYER_WEAPON_DATA weaponData
weaponData = CMHDZ_GET_PLAYER_WEAPON_DATA(CMHDZ_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(sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.X, sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.Y)
INT iEnemyHit[ciCMHDZ_MAX_ENEMY_SHOT_AT_ONCE]
INT iCurrentNumberOfEnemyHit = 0
FOR i = 0 TO ciCMHDZ_MAX_ENEMY_SHOT_AT_ONCE -1
iEnemyHit[i] = -1
ENDFOR
INT iCoverHit = -1
INT iItemHit = -1
INT iThrownHit = -1
BOOL bBossHit
FLOAT fModifier
FLOAT fWidth
FLOAT fHeight
FOR i = 0 TO ciCMHDZ_MAX_COVER -1
IF CMHDZ_DRAW_COVER_PROCESS_CHECK(i, sCMHDZData.sCoverData[i].iCoverLane, CMHDZ_COVER_DATA_IS_BITMASK_SET(i, CMHDZ_COVER_DATA_BITS_IS_FAR_BG))
fModifier = CMHDZ_COVER_UTIL_GET_SIZE_MODIFIER_FOR_COLLISION_CHECK(sCMHDZData.sCoverData[i].eType)
fWidth = sCMHDZData.sCoverData[i].fCoverWidth * fModifier
fHeight = sCMHDZData.sCoverData[i].fCoverHeight * fModifier
IF fWidth <= 0.0
SCRIPT_ASSERT("[BAZ][HANDLE_PLAYER_BULLET_COLLISION] Width is returning 0.0 for cover so will never get hit. Check object initialisation.")
ENDIF
x1 = sCMHDZData.sCoverData[i].vSpritePos.x - (fWidth/2)
y1 = sCMHDZData.sCoverData[i].vSpritePos.y - (fHeight/2)
x2 = sCMHDZData.sCoverData[i].vSpritePos.x + (fWidth/2)
y2 = sCMHDZData.sCoverData[i].vSpritePos.y + (fHeight/2)
IF (sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.X > x1 AND sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.X < x2
AND sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.Y > y1 AND sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.Y < y2)
IF iCoverHit = -1
OR sCMHDZData.sCoverData[i].iCoverLane > sCMHDZData.sCoverData[iCoverHit].iCoverLane
OR (CMHDZ_COVER_DATA_IS_BITMASK_SET(i, CMHDZ_COVER_DATA_BITS_IS_SPECIAL_COVER) AND NOT CMHDZ_COVER_DATA_IS_BITMASK_SET(iCoverHit, CMHDZ_COVER_DATA_BITS_IS_SPECIAL_COVER))
OR (CMHDZ_COVER_DATA_IS_BITMASK_SET(i, CMHDZ_COVER_DATA_BITS_IS_ANIMATED) AND NOT CMHDZ_COVER_DATA_IS_BITMASK_SET(iCoverHit, CMHDZ_COVER_DATA_BITS_IS_ANIMATED))
iCoverHit = i
ENDIF
ENDIF
ENDIF
ENDFOR
BOOL bBulletHitEnemyCoordCheck
FLOAT fSpreadDistanceX
FLOAT fSpreadDistanceY
FOR i = 0 TO ciCMHDZ_MAX_ENEMIES -1
bBulletHitEnemyCoordCheck = FALSE
IF sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING
OR sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ACTIVE
OR sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_STUNNED
IF sCMHDZData.sEnemyData[i].iHealth > 0
x1 = sCMHDZData.sEnemyData[i].vSpritePos.x - (sCMHDZData.sEnemyData[i].vSize.x/2)
y1 = sCMHDZData.sEnemyData[i].vSpritePos.y - (sCMHDZData.sEnemyData[i].vSize.y/2)
x2 = sCMHDZData.sEnemyData[i].vSpritePos.x + (sCMHDZData.sEnemyData[i].vSize.x/2)
y2 = sCMHDZData.sEnemyData[i].vSpritePos.y + (sCMHDZData.sEnemyData[i].vSize.y/2)
IF sCMHDZData.sEnemyData[i].iEnemyType = CMHDZ_FOREGROUND_ENEMY_T5_2
x1 -= (160.0)
y1 -= (100.0)
x2 += (160.0)
y2 += (100.0)
ENDIF
IF fSpreadModifier = 1.0
OR sCMHDZData.sEnemyData[i].iEnemyLane = ciCMHDZ_LANE_FOREGROUND
IF sCMHDZData.sEnemyData[i].iEnemyLane = ciCMHDZ_LANE_FOREGROUND
x1 -= (fSpreadModifier/2.0)
x2 += (fSpreadModifier/2.0)
ENDIF
IF (vBulletPos.X > x1 AND vBulletPos.X < x2
AND vBulletPos.Y > y1 AND vBulletPos.Y < y2)
bBulletHitEnemyCoordCheck = TRUE
ENDIF
ELSE
// Size up if enemy is in the foreground.
// IF sCMHDZData.sEnemyData[i].iEnemyLane = ciCMHDZ_LANE_FOREGROUND
// fSpreadModifier *= 1.5
// ENDIF
fSpreadDistanceX = sCMHDZData.sEnemyData[i].vSpritePos.x - vBulletPos.X
fSpreadDistanceY = sCMHDZData.sEnemyData[i].vSpritePos.Y - vBulletPos.Y
IF ((fSpreadDistanceX * fSpreadDistanceX) + (fSpreadDistanceY * fSpreadDistanceY ) < (fSpreadModifier * fSpreadModifier))
bBulletHitEnemyCoordCheck = TRUE
//CDEBUG2LN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Potential Enemy SPREAD hit: ",i, " fSpreadModifier: ", fSpreadModifier, " Current weapon: ", CMHDZ_PLAYER_WEAPON_TO_STRING(CMHDZ_GET_PLAYER_CURRENT_WEAPON()))
ENDIF
// Rest modifier
fSpreadModifier = weaponData.fSpreadModifier
ENDIF
IF bBulletHitEnemyCoordCheck
IF iMaxEnemyImpacts = 1
AND iCurrentNumberOfEnemyHit < ciCMHDZ_MAX_ENEMY_SHOT_AT_ONCE
IF iEnemyHit[iCurrentNumberOfEnemyHit] = -1
OR sCMHDZData.sEnemyData[i].iEnemyLane > sCMHDZData.sEnemyData[iEnemyHit[iCurrentNumberOfEnemyHit]].iEnemyLane
iEnemyHit[iCurrentNumberOfEnemyHit] = i
iCurrentNumberOfEnemyHit++
ENDIF
ELSE
IF iCurrentNumberOfEnemyHit < iMaxEnemyImpacts
IF iEnemyHit[iCurrentNumberOfEnemyHit] = -1
iEnemyHit[iCurrentNumberOfEnemyHit] = i
iCurrentNumberOfEnemyHit++
#IF IS_DEBUG_BUILD
//CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Potential Enemy hit: ",i, " Lane: ", sCMHDZData.sEnemyData[i].iEnemyLane, " Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.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: ", CMHDZ_PLAYER_WEAPON_TO_STRING(CMHDZ_GET_PLAYER_CURRENT_WEAPON()))
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
FOR i = 0 TO ciCMHDZ_MAX_ITEMS -1
IF NOT sCMHDZData.sItemData[i].bShot
IF sCMHDZData.sItemData[i].bRendering
fDistanceX = sCMHDZData.sPlayerData[iPlayer].vSpriteFinalReticlePos.x - sCMHDZData.sItemData[i].vSpritePos.x
fDistanceY = sCMHDZData.sPlayerData[iPlayer].vSpriteFinalReticlePos.y - sCMHDZData.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: ", CMHDZ_ITEM_TYPES_TO_STRING(sCMHDZData.sItemData[i].eItemType), " Pos: ", sCMHDZData.sItemData[i].vSpritePos.x, ", ", sCMHDZData.sItemData[i].vSpritePos.y, " Rendering: ", sCMHDZData.sItemData[i].bRendering, " Dist from bullet : ", fDistance)
#ENDIF
IF fDistance < 60
IF iItemHit = -1
OR sCMHDZData.sItemData[i].iLane > sCMHDZData.sItemData[iItemHit].iLane
// CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_ITEM(i,iPlayer, iProjectile )
iItemHit = i
#IF IS_DEBUG_BUILD
//CPRINTLN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Potential Item hit: ",i, " Lane: ", sCMHDZData.sItemData[i].iLane, " Type: ", CMHDZ_ITEM_TYPES_TO_STRING(sCMHDZData.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: ", sCMHDZData.sItemData[i].iLane, " Type: ", CMHDZ_ITEM_TYPES_TO_STRING(sCMHDZData.sItemData[i].eItemType), " Pos: ", sCMHDZData.sItemData[i].vSpritePos.x, ", ", sCMHDZData.sItemData[i].vSpritePos.y)
#ENDIF
ENDIF
ENDFOR
VECTOR_2D v2ProjSize
FOR i = 0 TO ciCMHDZ_MAX_ENEMY_PROJECTILES -1
IF sCMHDZData.sEnemyProjectiles[i].eType = CMHDZ_PROJECTILE_DYNAMITE
OR sCMHDZData.sEnemyProjectiles[i].eType = CMHDZ_PROJECTILE_JOWL
OR sCMHDZData.sEnemyProjectiles[i].eType = CMHDZ_PROJECTILE_LEG
OR sCMHDZData.sEnemyProjectiles[i].eType = CMHDZ_PROJECTILE_TROTTER
OR sCMHDZData.sEnemyProjectiles[i].eType = CMHDZ_PROJECTILE_BONE
IF sCMHDZData.sEnemyProjectiles[i].eState = CMHDZ_PROJECTILE_STATE_AIRBORNE
SWITCH sCMHDZData.sEnemyProjectiles[i].iSpriteAnimFrame
CASE 0 v2ProjSize = INIT_VECTOR_2D(ciCMHDZ_DYNAMITE_SMALL_WIDTH, ciCMHDZ_DYNAMITE_SMALL_HEIGHT) BREAK
CASE 1 v2ProjSize = INIT_VECTOR_2D(ciCMHDZ_DYNAMITE_SMALL_WIDTH, ciCMHDZ_DYNAMITE_SMALL_HEIGHT) BREAK
CASE 2 v2ProjSize = INIT_VECTOR_2D(ciCMHDZ_DYNAMITE_MEDIUM_WIDTH, ciCMHDZ_DYNAMITE_MEDIUM_HEIGHT) BREAK
CASE 3 v2ProjSize = INIT_VECTOR_2D(ciCMHDZ_DYNAMITE_MEDIUM_WIDTH, ciCMHDZ_DYNAMITE_MEDIUM_HEIGHT) BREAK
CASE 4 v2ProjSize = INIT_VECTOR_2D(ciCMHDZ_DYNAMITE_LARGE_WIDTH, ciCMHDZ_DYNAMITE_LARGE_HEIGHT) BREAK
CASE 5 v2ProjSize = INIT_VECTOR_2D(ciCMHDZ_DYNAMITE_LARGE_WIDTH, ciCMHDZ_DYNAMITE_LARGE_HEIGHT) BREAK
ENDSWITCH
x1 = sCMHDZData.sEnemyProjectiles[i].vSpritePos.x - (v2ProjSize.x/2)
y1 = sCMHDZData.sEnemyProjectiles[i].vSpritePos.y - (v2ProjSize.y/2)
x2 = sCMHDZData.sEnemyProjectiles[i].vSpritePos.x + (v2ProjSize.x/2)
y2 = sCMHDZData.sEnemyProjectiles[i].vSpritePos.y + (v2ProjSize.y/2)
// Increase size can be a bit too hard to hit
IF sCMHDZData.sEnemyProjectiles[i].eType = CMHDZ_PROJECTILE_DYNAMITE
x1 -= (120.0 + fSpreadModifier)
y1 -= (120.0 + fSpreadModifier)
x2 += (120.0 + fSpreadModifier)
y2 += (120.0 + fSpreadModifier)
ENDIF
IF sCMHDZData.sEnemyProjectiles[i].eType = CMHDZ_PROJECTILE_JOWL
OR sCMHDZData.sEnemyProjectiles[i].eType = CMHDZ_PROJECTILE_LEG
OR sCMHDZData.sEnemyProjectiles[i].eType = CMHDZ_PROJECTILE_TROTTER
OR sCMHDZData.sEnemyProjectiles[i].eType = CMHDZ_PROJECTILE_BONE
x1 -= (180.0 + fSpreadModifier)
y1 -= (180.0 + fSpreadModifier)
x2 += (180.0 + fSpreadModifier)
y2 += (180.0 + fSpreadModifier)
ENDIF
IF (vBulletPos.X > x1 AND sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.X < x2
AND vBulletPos.Y > y1 AND sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.Y < y2)
IF iThrownHit = -1
// CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_THROWN_WEAPON(i, iPlayer, iProjectile)
iThrownHit = i
#IF IS_DEBUG_BUILD
CDEBUG2LN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Potential thrown weapon hit: ",i, " Lane: ", sCMHDZData.sEnemyProjectiles[i].iLane, " Type: ", CMHDZ_PROJECTILE_TYPES_TO_STRING(sCMHDZData.sEnemyProjectiles[i].eType))
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
// Hit bearsy
VECTOR_2D v2BearsySize
v2BearsySize = sCMHDZData.sBossData.vScale
x1 = sCMHDZData.sBossData.vSpritePos.x - (v2BearsySize.x/1.5)
y1 = sCMHDZData.sBossData.vSpritePos.y - (v2BearsySize.y/1.5)
x2 = sCMHDZData.sBossData.vSpritePos.x + (v2BearsySize.x/1.5)
y2 = sCMHDZData.sBossData.vSpritePos.y + (v2BearsySize.y/1.5)
IF fSpreadModifier = 1.0
OR sCMHDZData.sBossData.iActiveLane = ciCMHDZ_LANE_FOREGROUND
IF sCMHDZData.sEnemyData[i].iEnemyLane = ciCMHDZ_LANE_FOREGROUND
x1 -= (fSpreadModifier/2.0)
x2 += (fSpreadModifier/2.0)
y1 -= (fSpreadModifier/2.0)
y2 += (fSpreadModifier/2.0)
ENDIF
IF (vBulletPos.X > x1 AND vBulletPos.X < x2
AND vBulletPos.Y > y1 AND vBulletPos.Y < y2)
bBulletHitEnemyCoordCheck = TRUE
ENDIF
ELSE
// Size up if enemy is in the foreground.
// IF sCMHDZData.sBossData.iActiveLane = ciCMHDZ_LANE_FOREGROUND
// fSpreadModifier *= 2.0
// ENDIF
fSpreadDistanceX = sCMHDZData.sBossData.vSpritePos.x - vBulletPos.X
fSpreadDistanceY = sCMHDZData.sBossData.vSpritePos.Y - vBulletPos.Y
IF ((fSpreadDistanceX * fSpreadDistanceX) + (fSpreadDistanceY * fSpreadDistanceY ) < (fSpreadModifier * fSpreadModifier))
bBulletHitEnemyCoordCheck = TRUE
//CDEBUG2LN(DEBUG_MINIGAME, "[HANDLE_PLAYER_BULLET_COLLISION] {dsw} Potential Enemy SPREAD hit: ",i, " fSpreadModifier: ", fSpreadModifier, " Current weapon: ", CMHDZ_PLAYER_WEAPON_TO_STRING(CMHDZ_GET_PLAYER_CURRENT_WEAPON()))
ENDIF
fSpreadModifier = weaponData.fSpreadModifier
ENDIF
IF (bBulletHitEnemyCoordCheck)
IF !bBossHit
bBossHit = TRUE
ENDIF
ENDIF
//-- Figure out what we actually hit.
IF iThrownHit = -1 AND iCoverHit = -1 AND iItemHit = -1 AND iEnemyHit[0] = -1 AND !bBossHit
//-- Didn't hit anything
CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_BULLET_HIT_GENERIC, vBulletPos)
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
CMHDZ_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 sCMHDZData.sEnemyData[iEnemyHit[i]].iEnemyLane = ciCMHDZ_LANE_FOREGROUND
CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_ENEMY(iEnemyHit[i], iPlayer, iProjectile, INIT_VECTOR_2D(sCMHDZData.sEnemyData[iEnemyHit[i]].vSpritePos.x - (sCMHDZData.sEnemyData[iEnemyHit[i]].vSize.x/2), sCMHDZData.sEnemyData[iEnemyHit[i]].vSpritePos.y - (sCMHDZData.sEnemyData[iEnemyHit[i]].vSize.y/2)), vBulletPos)
ELIF iItemHit > -1 AND sCMHDZData.sItemData[iItemHit].iLane = ciCMHDZ_LANE_FOREGROUND
//-- Hit a foreground item - generally a pickup hidden in an out house
CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_ITEM(iItemHit,iPlayer, iProjectile, bProcessedHitItemsThisFrame )
ELIF iEnemyHit[i] > -1 AND CMHDZ_ENEMY_DATA_IS_BITMASK_SET(iEnemyHit[i], CMHDZ_ENEMY_DATA_BITS_IS_POPUP)
//-- Enemy peds that 'pop up' behind buildings can always be hit
CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_ENEMY(iEnemyHit[i], iPlayer, iProjectile, INIT_VECTOR_2D(sCMHDZData.sEnemyData[iEnemyHit[i]].vSpritePos.x - (sCMHDZData.sEnemyData[iEnemyHit[i]].vSize.x/2), sCMHDZData.sEnemyData[iEnemyHit[i]].vSpritePos.y - (sCMHDZData.sEnemyData[iEnemyHit[i]].vSize.y/2)), vBulletPos)
ELSE
IF iItemHit > -1
IF sCMHDZData.sItemData[iItemHit].iLane = ciCMHDZ_LANE_MIDDLE
CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_ITEM(iItemHit,iPlayer, iProjectile, bProcessedHitItemsThisFrame )
ELIF sCMHDZData.sItemData[iItemHit].iLane = ciCMHDZ_LANE_BACKGROUND
IF iEnemyHit[i] > -1 AND sCMHDZData.sEnemyData[iEnemyHit[i]].iEnemyLane = ciCMHDZ_LANE_MIDDLE
CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_ENEMY(iEnemyHit[i], iPlayer, iProjectile, INIT_VECTOR_2D(sCMHDZData.sEnemyData[iEnemyHit[i]].vSpritePos.x - (sCMHDZData.sEnemyData[iEnemyHit[i]].vSize.x/2), sCMHDZData.sEnemyData[iEnemyHit[i]].vSpritePos.y - (sCMHDZData.sEnemyData[iEnemyHit[i]].vSize.y/2)), vBulletPos)
ELSE
CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_ITEM(iItemHit,iPlayer, iProjectile, bProcessedHitItemsThisFrame )
ENDIF
ENDIF
ELSE
IF iCoverHit > -1
IF sCMHDZData.sCoverData[iCoverHit].iCoverLane = ciCMHDZ_LANE_MIDDLE
AND NOT CMHDZ_CAN_SHOOT_THROUGH_COVER(iCoverHit)
//-- Hit cover in middle lane
CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER(iCoverHit, iPlayer, iProjectile, bProcessedHitCoverThisFrame)
ELIF sCMHDZData.sCoverData[iCoverHit].iCoverLane = ciCMHDZ_LANE_BACKGROUND
OR CMHDZ_CAN_SHOOT_THROUGH_COVER(iCoverHit)
//-- Background cover hit, check if anything in front of it
IF iItemHit > -1 AND sCMHDZData.sItemData[iItemHit].iLane = ciCMHDZ_LANE_MIDDLE
CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_ITEM(iItemHit,iPlayer, iProjectile, bProcessedHitItemsThisFrame )
ELIF iEnemyHit[i] > -1 AND ( sCMHDZData.sEnemyData[iEnemyHit[i]].iEnemyLane = ciCMHDZ_LANE_MIDDLE OR CMHDZ_CAN_SHOOT_THROUGH_COVER(iCoverHit))
CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_ENEMY(iEnemyHit[i], iPlayer, iProjectile, INIT_VECTOR_2D(sCMHDZData.sEnemyData[iEnemyHit[i]].vSpritePos.x - (sCMHDZData.sEnemyData[iEnemyHit[i]].vSize.x/2), sCMHDZData.sEnemyData[iEnemyHit[i]].vSpritePos.y - (sCMHDZData.sEnemyData[iEnemyHit[i]].vSize.y/2)), vBulletPos)
ELIF iEnemyHit[i] > -1 AND ( sCMHDZData.sEnemyData[iEnemyHit[i]].iEnemyLane = ciCMHDZ_LANE_BACKGROUND)
//-- Be generous with peds sticking their heads above cover
fModifier = CMHDZ_COVER_UTIL_GET_SIZE_MODIFIER_FOR_COLLISION_CHECK(sCMHDZData.sCoverData[iCoverHit].eType)
fHeight = sCMHDZData.sCoverData[iCoverHit].fCoverHeight * fModifier
IF sCMHDZData.sCoverData[iCoverHit].vSpritePos.y - (fHeight /2.0) < (sCMHDZData.sEnemyData[iEnemyHit[i]].vSpritePos.y + (sCMHDZData.sEnemyData[iEnemyHit[i]].vSize.y / 2.0))
CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_ENEMY(iEnemyHit[i], iPlayer, iProjectile, INIT_VECTOR_2D(sCMHDZData.sEnemyData[iEnemyHit[i]].vSpritePos.x - (sCMHDZData.sEnemyData[iEnemyHit[i]].vSize.x/2), sCMHDZData.sEnemyData[iEnemyHit[i]].vSpritePos.y - (sCMHDZData.sEnemyData[iEnemyHit[i]].vSize.y/2)), vBulletPos)
ENDIF
ELSE
CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_COVER(iCoverHit, iPlayer, iProjectile, bProcessedHitCoverThisFrame)
ENDIF
ENDIF
ELIF iEnemyHit[i] > -1
IF sCMHDZData.sEnemyData[iEnemyHit[i]].iEnemyLane = ciCMHDZ_LANE_MIDDLE
CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_ENEMY(iEnemyHit[i], iPlayer, iProjectile, INIT_VECTOR_2D(sCMHDZData.sEnemyData[iEnemyHit[i]].vSpritePos.x - (sCMHDZData.sEnemyData[iEnemyHit[i]].vSize.x/2), sCMHDZData.sEnemyData[iEnemyHit[i]].vSpritePos.y - (sCMHDZData.sEnemyData[iEnemyHit[i]].vSize.y/2)), vBulletPos)
ELIF sCMHDZData.sEnemyData[iEnemyHit[i]].iEnemyLane = ciCMHDZ_LANE_BACKGROUND
CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_ENEMY(iEnemyHit[i], iPlayer, iProjectile, INIT_VECTOR_2D(sCMHDZData.sEnemyData[iEnemyHit[i]].vSpritePos.x - (sCMHDZData.sEnemyData[iEnemyHit[i]].vSize.x/2), sCMHDZData.sEnemyData[iEnemyHit[i]].vSpritePos.y - (sCMHDZData.sEnemyData[iEnemyHit[i]].vSize.y/2)), vBulletPos)
ENDIF
ENDIF
ENDIF
ENDIF
ENDFOR
IF bBossHit
CMHDZ_HANDLE_PLAYER_BULLET_COLLISION_WITH_BOSS(sCMHDZData.sBossData, iPlayer, iProjectile, INIT_VECTOR_2D(sCMHDZData.sBossData.vSpritePos.x - (sCMHDZData.sBossData.vScale.x/2), sCMHDZData.sBossData.vSpritePos.y - (sCMHDZData.sBossData.vSpritePos.y/2)), vBulletPos)
ENDIF
// Harsh to punish accuracy like this. Hits reset if you take damage.
// IF NOT bHitSomething
// IF CMHDZ_GET_PLAYER_SUCESSIVE_HITS() != 1
// CMHDZ_RESET_PLAYER_SUCCESSIVE_HITS()
// ENDIF
// ENDIF
ENDPROC
PROC CMHDZ_ACTIVATE_MENU_OPTION(CMHDZ_MENU_OPTIONS eOption)
/*
CMHDZ_LEVEL_CITY
CMHDZ_LEVEL_SCRAPYARD,
CMHDZ_LEVEL_ASYLUM,
CMHDZ_LEVEL_PARK,
CMHDZ_LEVEL_SLAUGHTERHOUSE,
*/
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] CMHDZ_ACTIVATE_MENU_OPTION ")
SWITCH eOption
CASE CMHDZ_START
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_BULLET_HIT_START)
//DG_START_MOVIE(sCMHDZData.bmIdCmhdzIntro, "CMHDZ_Intro_FadeOut")
CMHDZ_START_MOVIE_FORCE(sCMHDZData.bmIdCmhdzIntro, "CMHDZ_Intro_FadeOut")
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_TITLE_FADEOUT)
BREAK
CASE CMHDZ_SCORES
IF NOT sCMHDZData.bSkipLeaderboard
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_BULLET_HIT_OPTION)
CMHDZ_INIT_GOTO_LEADERBOARD()
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_VIEW_LEADERBOARD)
// CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_EDIT_LEADERBOARD)
ENDIF
BREAK
CASE CMHDZ_WANTED_1
sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_CITY
//CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_SELECT_STAGE)
CMHDZ_TRIGGER_MUSIC_EVENT(CMHDZ_MUSIC_EVENT_STOP)
CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Level_Select_Slums)
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_INIT_LEVEL)
BREAK
CASE CMHDZ_WANTED_2
sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_SCRAPYARD
//CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_SELECT_STAGE)
CMHDZ_TRIGGER_MUSIC_EVENT(CMHDZ_MUSIC_EVENT_STOP)
CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Level_Select_Junkyard)
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_INIT_LEVEL)
BREAK
CASE CMHDZ_WANTED_3
sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_ASYLUM
//CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_SELECT_STAGE)
CMHDZ_TRIGGER_MUSIC_EVENT(CMHDZ_MUSIC_EVENT_STOP)
CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Level_Select_Asylum)
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_INIT_LEVEL)
BREAK
CASE CMHDZ_WANTED_4
sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_PARK
//CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_SELECT_STAGE)
CMHDZ_TRIGGER_MUSIC_EVENT(CMHDZ_MUSIC_EVENT_STOP)
CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Level_Select_Theme_Park)
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_INIT_LEVEL)
BREAK
CASE CMHDZ_WANTED_5
sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_SLAUGHTERHOUSE
//CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_SELECT_STAGE)
CMHDZ_TRIGGER_MUSIC_EVENT(CMHDZ_MUSIC_EVENT_STOP)
CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Level_Select_Slaughterhouse)
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_INIT_LEVEL)
BREAK
CASE CMHDZ_REWIND
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_BULLET_HIT_OPTION)
CMHDZ_SET_RESULT_SCREEN_STATE(CMHDZ_RESULT_SCREEN_STATE_START_REWIND)
BREAK
CASE CMHDZ_EJECT
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_BULLET_HIT_OPTION)
CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Quit)
CMHDZ_SET_RESULT_SCREEN_STATE(CMHDZ_RESULT_SCREEN_STATE_GOTO_LEADERBOARD)
BREAK
ENDSWITCH
ENDPROC
PROC HANDLE_PLAYER_BULLET_IN_MENU(INT iPlayer, INT iProjectile)
IF NOT sCMHDZData.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 ciCMHDZ_MAX_MENU_OPTIONS-1
IF sCMHDZData.sMenuOptionsData[i].eClientState = sCMHDZData.eClientState
sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].bHit = TRUE
// x1 = sCMHDZData.sMenuOptionsData[i].vSpritePos.x - (sCMHDZData.sMenuOptionsData[i].vSize.x/2)
// y1 = sCMHDZData.sMenuOptionsData[i].vSpritePos.y - (sCMHDZData.sMenuOptionsData[i].vSize.y/2)
//
// x2 = sCMHDZData.sMenuOptionsData[i].vSpritePos.x + (sCMHDZData.sMenuOptionsData[i].vSize.x/2)
// y2 = sCMHDZData.sMenuOptionsData[i].vSpritePos.y + (sCMHDZData.sMenuOptionsData[i].vSize.y/2)
//
// IF sCMHDZData.sMenuOptionsData[i].eMenuOption = CMHDZ_START
// //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} [HANDLE_PLAYER_BULLET_IN_MENU] ")
// //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} [HANDLE_PLAYER_BULLET_IN_MENU] Sprite Pos X: ", sCMHDZData.sMenuOptionsData[i].vSpritePos.x, " Pos Y: ",sCMHDZData.sMenuOptionsData[i].vSpritePos.y)
// //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} [HANDLE_PLAYER_BULLET_IN_MENU] Sprite Size X: ", sCMHDZData.sMenuOptionsData[i].vSize.x, " Size Y: ", sCMHDZData.sMenuOptionsData[i].vSize.y)
// //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} [HANDLE_PLAYER_BULLET_IN_MENU] Sprite (x1, y1) : ", x1, " , ", y1, " (x2, y2): ", x2, ", ", y2)
// //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} [HANDLE_PLAYER_BULLET_IN_MENU] Bullet x: ", sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.X, " y: ", sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.y)
//
//
// //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} [HANDLE_PLAYER_BULLET_IN_MENU] ")
// ENDIF
// IF (sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.X > x1 AND sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.X < x2
// AND sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.Y > y1 AND sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos.Y < y2)
IF CMHDZ_IS_POSITION_OVER_MENU_OPTION(sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].vSpritePos, INT_TO_ENUM(CMHDZ_MENU_OPTIONS, i))
bHitSomething = TRUE
sCMHDZData.sPlayerData[iPlayer].sBulletData[iProjectile].iTimeOfHit = GET_GAME_TIMER()
IF CMHDZ_IS_MENU_OPTION_UNLOCKED(sCMHDZData.sMenuOptionsData[i].eMenuOption)
CMHDZ_ACTIVATE_MENU_OPTION(sCMHDZData.sMenuOptionsData[i].eMenuOption)
ELSE
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_SCREEN_LOCKED)
ENDIF
ENDIF
ENDIF
ENDFOR
IF NOT bHitSomething
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_BULLET_HIT_MISS)
ENDIF
ENDPROC
PROC CMHDZ_CHECK_PLAYER_HOVERING_ENEMY()
FLOAT distanceX, distanceY, fDistance
INT iPlayer, i
FOR iPlayer = 0 TO ciCMHDZ_MAX_PLAYERS - 1
sCMHDZData.sPlayerData[iPlayer].bHoveringEnemy = FALSE
FOR i = 0 TO ciCMHDZ_MAX_ENEMIES -1
IF (sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ACTIVE OR sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING)
AND sCMHDZData.sEnemyData[i].iHealth > 0
distanceX = sCMHDZData.sPlayerData[iPlayer].vSpriteInitReticlePos.x - sCMHDZData.sEnemyData[i].vSpritePos.x
distanceY = sCMHDZData.sPlayerData[iPlayer].vSpriteInitReticlePos.y - sCMHDZData.sEnemyData[i].vSpritePos.y
fDistance = SQRT(distanceX * distanceX + distanceY * distanceY)
IF fDistance <= 112 * CMHDZ_GET_ENEMY_TYPE_SCALE_FOR_LANE(sCMHDZData.sEnemyData[i].iEnemyLane)
sCMHDZData.sPlayerData[iPlayer].bHoveringEnemy = TRUE
EXIT
ENDIF
ENDIF
ENDFOR
FOR i = 0 TO ciCMHDZ_MAX_ITEMS -1
IF NOT sCMHDZData.sItemData[i].bShot
IF sCMHDZData.sItemData[i].bRendering
distanceX = sCMHDZData.sPlayerData[iPlayer].vSpriteInitReticlePos.x - sCMHDZData.sItemData[i].vSpritePos.x
distanceY = sCMHDZData.sPlayerData[iPlayer].vSpriteInitReticlePos.y - sCMHDZData.sItemData[i].vSpritePos.y
fDistance = SQRT(distanceX * distanceX + distanceY * distanceY)
IF fDistance <= 76
sCMHDZData.sPlayerData[iPlayer].bHoveringEnemy = TRUE
ENDIF
ENDIF
ENDIF
ENDFOR
ENDFOR
ENDPROC
PROC CMHDZ_CHECK_PLAYER_HOVERING_MENU_OPTION()
// FLOAT x1, x2, y1, y2 // Top-left & Bottom-right corners of collision
INT iPlayer, i
FOR iPlayer = 0 TO ciCMHDZ_MAX_PLAYERS - 1
sCMHDZData.sPlayerData[iPlayer].bHoveringEnemy = FALSE
FOR i = 0 TO ciCMHDZ_MAX_MENU_OPTIONS-1
IF sCMHDZData.sMenuOptionsData[i].eClientState = sCMHDZData.eClientState
// x1 = sCMHDZData.sMenuOptionsData[i].vSpritePos.x - (sCMHDZData.sMenuOptionsData[i].vSize.x/2)
// y1 = sCMHDZData.sMenuOptionsData[i].vSpritePos.y - (sCMHDZData.sMenuOptionsData[i].vSize.y/2)
//
// x2 = sCMHDZData.sMenuOptionsData[i].vSpritePos.x + (sCMHDZData.sMenuOptionsData[i].vSize.x/2)
// y2 = sCMHDZData.sMenuOptionsData[i].vSpritePos.y + (sCMHDZData.sMenuOptionsData[i].vSize.y/2)
//
// IF (sCMHDZData.sPlayerData[iPlayer].vSpriteInitReticlePos.x > x1
// AND sCMHDZData.sPlayerData[iPlayer].vSpriteInitReticlePos.x < x2
// AND sCMHDZData.sPlayerData[iPlayer].vSpriteInitReticlePos.y > y1
// AND sCMHDZData.sPlayerData[iPlayer].vSpriteInitReticlePos.Y < y2)
IF CMHDZ_IS_POSITION_OVER_MENU_OPTION(sCMHDZData.sPlayerData[iPlayer].vSpriteInitReticlePos, INT_TO_ENUM(CMHDZ_MENU_OPTIONS, i))
sCMHDZData.sPlayerData[iPlayer].bHoveringEnemy = TRUE
ENDIF
ENDIF
ENDFOR
ENDFOR
ENDPROC
PROC CMHDZ_HANDLE_RETICULE_MOVEMENT(BOOL bAllowRightStick = TRUE, BOOL bInMenu = FALSE)
IF CMHDZ_IS_PLAYER_PLAYING()
IF CMHDZ_GET_LOCAL_PLAYER_HEALTH() <= 0.0
EXIT
ENDIF
ENDIF
FLOAT fAxisThresholdMod = cfIAP_CONTROLLER_AXIS_THRESHOLD_MOD
FLOAT fLeftLimit = 305.0
FLOAT fRightLimit = cfRIGHT_SCREEN_LIMIT
FLOAT fDownLimit = 80.0
FLOAT fUpLimit = 995.0
IF NOT IS_USING_KEYBOARD_AND_MOUSE(PLAYER_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)
IF (bAllowRightStick = FALSE)
fRightStickX = 0
fRightStickY = 0
ENDIF
fAxisThresholdMod = 0.10
BOOL bMovingLeft = (fLeftStickX < -cfSTICK_THRESHOLD * fAxisThresholdMod)
BOOL bMovingRight = (fLeftStickX > cfSTICK_THRESHOLD * fAxisThresholdMod)
BOOL bMovingDown = (fLeftStickY < -cfSTICK_THRESHOLD * fAxisThresholdMod)
BOOL bMovingUp = (fLeftStickY > cfSTICK_THRESHOLD * fAxisThresholdMod)
FLOAT fMoveSpeedX = ABSF(fLeftStickX * 55)
FLOAT fMoveSpeedY = ABSF(fLeftStickY * 45)
FLOAT fAutoAimTension = 0.35 // Set Between 0.0 - 1.0
IF bInMenu
CMHDZ_CHECK_PLAYER_HOVERING_MENU_OPTION()
ELSE // In game
IF (fMoveSpeedX >= 5)
OR (fMoveSpeedY >= 5)
CMHDZ_CHECK_PLAYER_HOVERING_ENEMY()
ENDIF
ENDIF
//Reticule 1
IF bMovingLeft AND sCMHDZData.sPlayerData[0].vSpriteInitReticlePos.x >= fLeftLimit // 0.0
sCMHDZData.sPlayerData[0].vSpriteInitReticlePos.x -= (fMoveSpeedX - (BOOL_TO_INT(sCMHDZData.sPlayerData[0].bHoveringEnemy) * (fMoveSpeedX*fAutoAimTension))) * CMHDZ_GET_RETICULE_UPDATE()
IF sCMHDZData.sPlayerData[0].vSpriteInitReticlePos.x < fLeftLimit
sCMHDZData.sPlayerData[0].vSpriteInitReticlePos.x = fLeftLimit
ENDIF
ELIF bMovingRight AND sCMHDZData.sPlayerData[0].vSpriteInitReticlePos.x <= fRightLimit
sCMHDZData.sPlayerData[0].vSpriteInitReticlePos.x += (fMoveSpeedX - (BOOL_TO_INT(sCMHDZData.sPlayerData[0].bHoveringEnemy) * (fMoveSpeedX*fAutoAimTension))) * CMHDZ_GET_RETICULE_UPDATE()
IF sCMHDZData.sPlayerData[0].vSpriteInitReticlePos.x > fRightLimit
sCMHDZData.sPlayerData[0].vSpriteInitReticlePos.x = fRightLimit
ENDIF
ENDIF
IF bMovingDown AND sCMHDZData.sPlayerData[0].vSpriteInitReticlePos.y >= fDownLimit //20.0
sCMHDZData.sPlayerData[0].vSpriteInitReticlePos.y -= (fMoveSpeedY - (BOOL_TO_INT(sCMHDZData.sPlayerData[0].bHoveringEnemy) * (fMoveSpeedY*fAutoAimTension))) * CMHDZ_GET_RETICULE_UPDATE()
IF sCMHDZData.sPlayerData[0].vSpriteInitReticlePos.y < fDownLimit
sCMHDZData.sPlayerData[0].vSpriteInitReticlePos.y = fDownLimit
ENDIF
ELIF bMovingUp AND sCMHDZData.sPlayerData[0].vSpriteInitReticlePos.y <= fUpLimit
sCMHDZData.sPlayerData[0].vSpriteInitReticlePos.y += (fMoveSpeedY - (BOOL_TO_INT(sCMHDZData.sPlayerData[0].bHoveringEnemy) * (fMoveSpeedY*fAutoAimTension))) * CMHDZ_GET_RETICULE_UPDATE()
IF sCMHDZData.sPlayerData[0].vSpriteInitReticlePos.y > fUpLimit
sCMHDZData.sPlayerData[0].vSpriteInitReticlePos.y = fUpLimit
ENDIF
ENDIF
// Get the right stick micro mod
VECTOR_2D vRightStickMod
// vRightStickMod.x = (cfBASE_SCREEN_WIDTH/2.0) + ((fRightLimit - (cfBASE_SCREEN_WIDTH/2.0))*fRightStickX)
// vRightStickMod.y = (cfBASE_SCREEN_HEIGHT/2.0) + ((fUpLimit - (cfBASE_SCREEN_HEIGHT/2.0))*fRightStickY)
vRightStickMod.x = ((fRightLimit - (cfBASE_SCREEN_WIDTH/2.0))*fRightStickX)
vRightStickMod.y = ((fUpLimit - (cfBASE_SCREEN_HEIGHT/2.0))*fRightStickY)
vRightStickMod = MULTIPLY_VECTOR_2D(vRightStickMod, 1.1)
// Add the relative results together.
sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos = sCMHDZData.sPlayerData[0].vSpriteInitReticlePos
sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.x += vRightStickMod.x
sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.y += vRightStickMod.y
IF sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.x < fLeftLimit
sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.x = fLeftLimit
ENDIF
IF sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.x > fRightLimit
sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.x = fRightLimit
ENDIF
IF sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.y < fDownLimit
sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.y = fDownLimit
ENDIF
IF sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.y > fUpLimit
sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.y = fUpLimit
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)
fMouseX= GET_DISABLED_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_CURSOR_X)
fMouseY= GET_DISABLED_CONTROL_NORMAL(PLAYER_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
sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos = INIT_VECTOR_2D(vTopLeft.x + (fMouseX * fXAxisPlay), vBottomRight.y + (fMouseY * fYAxisPlay))
ENDIF
ENDPROC
PROC CMHDZ_HANDLE_PLAYER_MOVEMENT()
CMHDZ_HANDLE_RETICULE_MOVEMENT()
ENDPROC
PROC CMHDZ_HANDLE_PLAYER_ABILITIES()
IF CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_INVULNERABILE)
IF GET_GAME_TIMER() - sCMHDZData.sPlayerData[0].iInvulnerableTimer > ciCMHDZ_ITEM_SHIELD_TIME
CMHDZ_CLEAR_PLAYER_BIT(CMHDZ_PLAYER_BIT_INVULNERABILE)
//CMHDZ_STOP_SOUND(CMHDZ_AUDIO_EFFECT_PICKUP_SHIELD)
//CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_MUSIC_TRANSITION)
CMHDZ_STOP_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_POWERUP_ACTIVE)
CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Collectable_Run_Out)
//sAGPostFXData.sFXLayers[ARCADE_GAMES_POSTFX_LAYER_SCAN_LINE].bShow = FALSE
sAGPostFXData.sFXLayers[ARCADE_GAMES_POSTFX_LAYER_FLICKERING].bShow = FALSE
sCMHDZData.fPowerRunTimer = 0.0
INIT_RGBA_STRUCT(sAGPostFXData.sFXLayers[ARCADE_GAMES_POSTFX_LAYER_SCAN_LINE].rgbaColor,255,255,255,3)
ENDIF
ENDIF
IF CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_HIDE_RETICULE)
IF GET_GAME_TIMER() - sCMHDZData.sPlayerData[0].iHideReticuleTimer > ciCMHDZ_HIDE_RETICULE_TIME
CMHDZ_CLEAR_PLAYER_BIT(CMHDZ_PLAYER_BIT_HIDE_RETICULE)
//CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_MUSIC_TRANSITION)
CMHDZ_STOP_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_POWERUP_ACTIVE)
CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Collectable_Run_Out)
//sAGPostFXData.sFXLayers[ARCADE_GAMES_POSTFX_LAYER_SCAN_LINE].bShow = FALSE
sAGPostFXData.sFXLayers[ARCADE_GAMES_POSTFX_LAYER_FLICKERING].bShow = FALSE
INIT_RGBA_STRUCT(sAGPostFXData.sFXLayers[ARCADE_GAMES_POSTFX_LAYER_SCAN_LINE].rgbaColor,255,255,255,3)
ENDIF
ENDIF
IF CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_QUAD_DAMAGE)
IF GET_GAME_TIMER() - sCMHDZData.sPlayerData[0].iQuadDamageTimer > ciCMHDZ_ITEM_BUFF_TIME
CMHDZ_CLEAR_PLAYER_BIT(CMHDZ_PLAYER_BIT_QUAD_DAMAGE)
//CMHDZ_STOP_SOUND(CMHDZ_AUDIO_EFFECT_PICKUP_BUFF)
//CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_MUSIC_TRANSITION)
CMHDZ_STOP_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_POWERUP_ACTIVE)
CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Collectable_Run_Out)
//sAGPostFXData.sFXLayers[ARCADE_GAMES_POSTFX_LAYER_SCAN_LINE].bShow = FALSE
sAGPostFXData.sFXLayers[ARCADE_GAMES_POSTFX_LAYER_FLICKERING].bShow = FALSE
sCMHDZData.fPowerRunTimer = 0.0
INIT_RGBA_STRUCT(sAGPostFXData.sFXLayers[ARCADE_GAMES_POSTFX_LAYER_SCAN_LINE].rgbaColor,255,255,255,3)
ENDIF
ENDIF
IF CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_INVULNERABILE)
OR CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_HIDE_RETICULE)
OR CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_QUAD_DAMAGE)
sCMHDZData.fSoundGlitchAdditional += 0.25
sCMHDZData.fPowerRunTimer += (0.0+@1000)
ENDIF
ENDPROC
FUNC BOOL CMHDZ_CAN_ENEMY_SHOOT_GUN(INT iEnemy)
IF sCMHDZData.sEnemyData[iEnemy].vSpritePos.x >= cfRIGHT_SCREEN_LIMIT
RETURN FALSE
ENDIF
IF sCMHDZData.sEnemyData[iEnemy].vSpritePos.x <= 300.0
RETURN FALSE
ENDIF
IF CMHDZ_IS_ENEMY_TYPE_THROWING_ENEMY(sCMHDZData.sEnemyData[iEnemy].iEnemyType)
RETURN FALSE
ENDIF
// IF sCMHDZData.sEnemyData[iEnemy].iEnemyType = CMHDZ_FOREGROUND_ENEMY_BEAR
// RETURN FALSE
// ENDIF
// CMHDZ_ADD_ENEMY_TO_LIST(1398.0, 446.875, 357.875,
FLOAT fPosY
FLOAT fLocToCheck
IF CMHDZ_ENEMY_DATA_IS_BITMASK_SET(iEnemy, CMHDZ_ENEMY_DATA_BITS_IS_POPUP)
fPosY = sCMHDZData.sEnemyData[iEnemy].vSpritePos.y
fLocToCheck = sCMHDZData.sEnemyData[iEnemy].fStoppingX + 10.0
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_CAN_ENEMY_SHOOT_GUN] [CMHDZ_ENEMY_STATE_ACTIVE] [dsw] Enemy ", iEnemy, " Is popup Y Pos: ",fPosY, "> ? ", fLocToCheck)
IF fPosY > fLocToCheck
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_CAN_ENEMY_SHOOT_GUN] [CMHDZ_ENEMY_STATE_ACTIVE] [dsw] Enemy ", iEnemy, " FALSE")
RETURN FALSE
ENDIF
// Wait till full out before shooting
IF sCMHDZData.sEnemyData[iEnemy].iPopUpTime < 1500
RETURN FALSE
ENDIF
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_CAN_ENEMY_SHOOT_GUN] [CMHDZ_ENEMY_STATE_ACTIVE] [dsw] Enemy ", iEnemy, " TRUE")
ENDIF
RETURN TRUE
ENDFUNC
PROC CMHDZ_HANDLE_POPUP_ENEMY(INT iEnemy)
IF NOT CMHDZ_ENEMY_DATA_IS_BITMASK_SET(iEnemy, CMHDZ_ENEMY_DATA_BITS_IS_POPUP)
EXIT
ENDIF
IF sCMHDZData.sEnemyData[iEnemy].vSpritePos.y > sCMHDZData.sEnemyData[iEnemy].fStoppingX
AND sCMHDZData.sEnemyData[iEnemy].iPopUpTime = 0 // Needs additional condition to stop it freezing in place.
sCMHDZData.sEnemyData[iEnemy].vSpritePos.y -= (0.45*(0.0+@1000))
CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_ENEMY_STATE_ACTIVE] [CMHDZ_HANDLE_POPUP_ENEMY] Enemy ", iEnemy, " Going up Y pos ", sCMHDZData.sEnemyData[iEnemy].vSpritePos.y, " Stop ", sCMHDZData.sEnemyData[iEnemy].fStoppingX)
ELSE
CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_ENEMY_STATE_ACTIVE] [CMHDZ_HANDLE_POPUP_ENEMY] Enemy ", iEnemy, " Finished up, grabbing time")
sCMHDZData.sEnemyData[iEnemy].iPopUpTime += ROUND(0.0+@1000) // Better timer
ENDIF
// Don't pop down after popup.
IF sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_ASYLUM
EXIT
ENDIF
IF sCMHDZData.sEnemyData[iEnemy].iPopUpTime > 3000
// OR CMHDZ_ENEMY_DATA_IS_BITMASK_SET(iEnemy, CMHDZ_ENEMY_DATA_BITS_THROWN_PROJECTILE)
IF sCMHDZData.sEnemyData[iEnemy].vSpritePos.y < sCMHDZData.sEnemyData[iEnemy].vStartPos.y
CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_ENEMY_STATE_ACTIVE] [CMHDZ_HANDLE_POPUP_ENEMY] Enemy ", iEnemy, " Going dowm Y pos ", sCMHDZData.sEnemyData[iEnemy].vSpritePos.y, " Stop ", sCMHDZData.sEnemyData[iEnemy].vStartPos.y)
sCMHDZData.sEnemyData[iEnemy].vSpritePos.y += (0.45*(0.0+@1000))
ELSE
CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_ENEMY_STATE_ACTIVE] [CMHDZ_HANDLE_POPUP_ENEMY] Enemy ", iEnemy, " FINISHED Going dowm Y pos ", sCMHDZData.sEnemyData[iEnemy].vSpritePos.y, " Stop ", sCMHDZData.sEnemyData[iEnemy].vStartPos.y)
IF sCMHDZData.sEnemyData[iEnemy].iPopUpTime > 6000
sCMHDZData.sEnemyData[iEnemy].iPopUpTime = 0
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL CMHDZ_INIT_THROWN_PLAYER_PROJECTILE(INT iPlayer, CMHDZ_PROJECTILE_TYPES eType, VECTOR_2D vInitialPos)
#IF IS_DEBUG_BUILD
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_INIT_THROWN_PLAYER_PROJECTILE] Called, PLAYER:", iPlayer, " Type: ", CMHDZ_PROJECTILE_TYPES_TO_STRING(eType), " Initial pos: ",vInitialPos.x, ", ", vInitialPos.y)
#ENDIF
IF sCMHDZData.sPlayerData[iPlayer].iNumberOfThrownProjectiles >= ciCMHDZ_MAX_PLAYER_THROWN_PROJECTILES
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_INIT_THROWN_PLAYER_PROJECTILE] PLAYER:", iPlayer, " Too many projectiles - exiting ")
RETURN FALSE
ENDIF
IF (eType = CMHDZ_PROJECTILE_BRICK)
// Zone in on the nearest enemy coord
FLOAT fSmallestDistance = -1.0 // Invalid distance
FLOAT distanceX
FLOAT distanceY
FLOAT fDistance
INT iEnemyToHit = -1
INT i
REPEAT ciCMHDZ_MAX_ENEMIES i
IF CMHDZ_SHOULD_COUNT_ENEMY_AS_ALIVE(i)
AND CMHDZ_IS_ENEMY_ON_SCREEN(i)
AND sCMHDZData.sEnemyData[i].eState != CMHDZ_ENEMY_STATE_WAITING
distanceX = vInitialPos.x - sCMHDZData.sEnemyData[i].vSpritePos.x
distanceY = vInitialPos.y - sCMHDZData.sEnemyData[i].vSpritePos.y
fDistance = SQRT(distanceX * distanceX + distanceY * distanceY)
// Initialise the value if -1
IF fSmallestDistance = -1.0
fSmallestDistance = fDistance
ENDIF
IF fDistance <= 300
AND fDistance <= fSmallestDistance
fSmallestDistance = fDistance
// IF (sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ACTIVE
// OR sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING)
iEnemyToHit = i
CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_INIT_THROWN_PLAYER_PROJECTILE - fDistance = ", fSmallestDistance, " iEnemyToHit = ", iEnemyToHit)
ENDIF
ENDIF
ENDREPEAT
// Asign the position of the nearest enemy to the projectile.
IF fSmallestDistance > -1.0
AND fSmallestDistance <= 300 // Is in a valid range
AND iEnemyToHit != -1
vInitialPos = sCMHDZData.sEnemyData[iEnemyToHit].vSpritePos
sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[sCMHDZData.sPlayerData[iPlayer].iNumberOfThrownProjectiles].iEnemyInstToHit = iEnemyToHit
CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_INIT_THROWN_PLAYER_PROJECTILE - Enemy to be hit: ", sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[sCMHDZData.sPlayerData[iPlayer].iNumberOfThrownProjectiles].iEnemyInstToHit)
ELSE
RETURN FALSE
ENDIF
IF (GET_GAME_TIMER() <= (sCMHDZData.sPlayerData[iPlayer].iLastThrownProjectileTime + sCMHDZData.sPlayerData[iPlayer].iThrownProjectileReloadDelay))
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_INIT_THROWN_PLAYER_PROJECTILE] PLAYER:", iPlayer, " Projectile Thrown Too Recently ")
RETURN FALSE
ENDIF
ELIF (eType = CMHDZ_PROJECTILE_MOLOTOV)
vInitialPos.x = (cfBASE_SCREEN_WIDTH/2.0)
vInitialPos.y = (cfBASE_SCREEN_HEIGHT/2.0)
ENDIF
sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[sCMHDZData.sPlayerData[iPlayer].iNumberOfThrownProjectiles].eState = CMHDZ_PROJECTILE_STATE_AIRBORNE
sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[sCMHDZData.sPlayerData[iPlayer].iNumberOfThrownProjectiles].eType = eType
sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[sCMHDZData.sPlayerData[iPlayer].iNumberOfThrownProjectiles].vSpritePos = vInitialPos
sCMHDZData.sPlayerData[iPlayer].iLastThrownProjectileTime = GET_GAME_TIMER()
IF (eType != CMHDZ_PROJECTILE_BRICK)
sCMHDZData.sPlayerData[iPlayer].iThrownProjectilesAmmo --
// turn projectile back into brick when ran out
IF (sCMHDZData.sPlayerData[iPlayer].iThrownProjectilesAmmo = 0)
sCMHDZData.sPlayerData[iPlayer].projectileType = CMHDZ_PROJECTILE_BRICK
ENDIF
ENDIF
//Sound effects
CMHDZ_AUDIO_EFFECT eAudioEffect
SWITCH sCMHDZData.sPlayerData[iPlayer].projectileType
CASE CMHDZ_PROJECTILE_BRICK
eAudioEffect = CMHDZ_AUDIO_EFFECT_PLAYER_BRICK_THROW
BREAK
CASE CMHDZ_PROJECTILE_MOLOTOV
eAudioEffect = CMHDZ_AUDIO_EFFECT_PLAYER_MOLOTOV_THROW
BREAK
CASE CMHDZ_PROJECTILE_NAILBOMB
eAudioEffect = CMHDZ_AUDIO_EFFECT_PLAYER_NAILBOMB_THROW
BREAK
ENDSWITCH
CMHDZ_PLAY_SOUND_AND_RELEASE(eAudioEffect, vInitialPos)
RETURN TRUE
ENDFUNC
PROC CMHDZ_HANDLE_THROWN_PLAYER_PROJECTILES(INT iPlayer)
INT i
INT iEnemyID = -1
REPEAT ciCMHDZ_MAX_PLAYER_THROWN_PROJECTILES i
SWITCH sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].eState
CASE CMHDZ_PROJECTILE_STATE_AIRBORNE
sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].iSpriteAnimFrame += sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].iSlowUpdateFrames
IF sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].iSpriteAnimFrame >= ciCMHDZ_MAX_ENEMY_THROWN_DYNAMITE_ANIM_FRAMES
sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].eState = CMHDZ_PROJECTILE_STATE_IMPACT
// Add additional enemy states when we implement differences between the projectile weapons
SWITCH (sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].eType)
CASE CMHDZ_PROJECTILE_MOLOTOV
CMHDZ_KILL_ALL_ENEMIES_IN_RANGE(sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].vSpritePos, 1500)
TWS_CREATE_FX(sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].vSpritePos, CMHDZ_FX_ENEMY_TNT_EXP, 1)
// Damage Bearsy
IF CMHDZ_IS_BEARSY_ON_SCREEN()
IF sCMHDZData.sBossData.eCurrentBossState != CMHDZ_BOSS_STATE_INACTIVE
AND sCMHDZData.sBossData.iActiveLane != ciCMHDZ_LANE_FOREGROUND
IF sCMHDZData.sBossData.eCurrentBossState != CMHDZ_BOSS_STATE_STUNNED_BACKGROUND
AND sCMHDZData.sBossData.eCurrentBossState != CMHDZ_BOSS_STATE_WALKING_INV
sCMHDZData.sBossData.fHealth -= 40
sCMHDZData.sBossData.bShotThisFrame = TRUE
ENDIF
ENDIF
ENDIF
BREAK
CASE CMHDZ_PROJECTILE_BRICK // If it's the brick stun the enemy it impacts with.
// Make a direct reference from
IF sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].iEnemyInstToHit != -1
iEnemyID = sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].iEnemyInstToHit
ENDIF
IF iEnemyID != -1
AND sCMHDZData.sEnemyData[iEnemyID].iHealth > 0
IF sCMHDZData.sEnemyData[iEnemyID].iEnemyLane != ciCMHDZ_LANE_POPUP_LHS
AND sCMHDZData.sEnemyData[iEnemyID].iEnemyLane != ciCMHDZ_LANE_POPUP_RHS
sCMHDZData.sEnemyData[iEnemyID].fAnimTimer = 2000.0 // 2 second stun time.
sCMHDZData.sEnemyData[iEnemyID].eState = CMHDZ_ENEMY_STATE_STUNNED
CMHDZ_PLAY_ENEMY_TYPE_SOUND_AND_RELEASE(sCMHDZData.sEnemyData[iEnemyID].iEnemyType, CMHDZ_AUDIO_EFFECT_ENEMY_INJURED,
sCMHDZData.sEnemyData[iEnemyID].vSpritePos, sCMHDZData.sEnemyData[iEnemyID].iEnemyVoiceID)
ELSE // Just kill popup enemies
sCMHDZData.sEnemyData[iEnemyID].iHealth = 0
sCMHDZData.sEnemyData[iEnemyID].fAnimTimer = 0.0
sCMHDZData.sEnemyData[iEnemyID].eState = CMHDZ_ENEMY_STATE_DYING // If the projectile type is a Molotov
CMHDZ_ADD_TO_LOCAL_PLAYER_SCORE(CMHDZ_SCORE_TYPE_ENEMY)
ENDIF
ENDIF
TWS_CREATE_FX(sCMHDZData.sEnemyData[iEnemyID].vSpritePos, CMHDZ_FX_OUCH, sCMHDZData.sEnemyData[iEnemyID].iEnemyLane)
BREAK
CASE CMHDZ_PROJECTILE_NAILBOMB
CMHDZ_STUN_ENEMIES_IN_RANGE(sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].vSpritePos, 500)
TWS_CREATE_FX(sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].vSpritePos, CMHDZ_FX_ENEMY_TNT_EXP, 1)
// Damage Bearsy
IF sCMHDZData.sBossData.eCurrentBossState != CMHDZ_BOSS_STATE_INACTIVE
AND sCMHDZData.sBossData.iActiveLane = ciCMHDZ_LANE_BACKGROUND
IF sCMHDZData.sBossData.eCurrentBossState != CMHDZ_BOSS_STATE_STUNNED_BACKGROUND
AND sCMHDZData.sBossData.eCurrentBossState != CMHDZ_BOSS_STATE_WALKING_INV
sCMHDZData.sBossData.fHealth -= 20
sCMHDZData.sBossData.bShotThisFrame = TRUE
ENDIF
ENDIF
BREAK
ENDSWITCH
//Sound effects
CMHDZ_AUDIO_EFFECT eAudioEffect
SWITCH sCMHDZData.sPlayerData[iPlayer].projectileType
CASE CMHDZ_PROJECTILE_BRICK
eAudioEffect = CMHDZ_AUDIO_EFFECT_PLAYER_BRICK_HIT
BREAK
CASE CMHDZ_PROJECTILE_MOLOTOV
eAudioEffect = CMHDZ_AUDIO_EFFECT_PLAYER_MOLOTOV_HIT
BREAK
CASE CMHDZ_PROJECTILE_NAILBOMB
eAudioEffect = CMHDZ_AUDIO_EFFECT_PLAYER_NAILBOMB_HIT
BREAK
ENDSWITCH
CMHDZ_PLAY_SOUND_AND_RELEASE(eAudioEffect, sCMHDZData.sPlayerData[iPlayer].sThrownProjectile[i].vSpritePos)
//
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 20)
ENDIF
BREAK
CASE CMHDZ_PROJECTILE_STATE_IMPACT
CMHDZ_RESET_PLAYER_THROWN_PROJECTILE(iPlayer, i)
BREAK
ENDSWITCH
ENDREPEAT
ENDPROC
PROC CMHDZ_INIT_THROWN_ENEMY_PROJECTILE(CMHDZ_PROJECTILE_TYPES eType, VECTOR_2D vInitialPos)
#IF IS_DEBUG_BUILD
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_INIT_THROWN_ENEMY_PROJECTILE] Called, type: ", CMHDZ_PROJECTILE_TYPES_TO_STRING(eType), " Initial pos: ",vInitialPos.x, ", ", vInitialPos.y)
#ENDIF
IF sCMHDZData.iNumberOfThrownEnemyProjectiles > ciCMHDZ_MAX_ENEMY_PROJECTILES - 1
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_INIT_THROWN_ENEMY_PROJECTILE] Too many projectiles - exiting ")
EXIT
ENDIF
sCMHDZData.sEnemyProjectiles[sCMHDZData.iNumberOfThrownEnemyProjectiles].eState = CMHDZ_PROJECTILE_STATE_AIRBORNE
sCMHDZData.sEnemyProjectiles[sCMHDZData.iNumberOfThrownEnemyProjectiles].eType = eType
sCMHDZData.sEnemyProjectiles[sCMHDZData.iNumberOfThrownEnemyProjectiles].vSpritePos = vInitialPos
ENDPROC
PROC CMHDZ_HANDLE_THROWN_ENEMY_PROJECTILES()
INT i
REPEAT ciCMHDZ_MAX_ENEMY_PROJECTILES i
SWITCH sCMHDZData.sEnemyProjectiles[i].eState
CASE CMHDZ_PROJECTILE_STATE_AIRBORNE
sCMHDZData.sEnemyProjectiles[i].iSpriteAnimFrame += sCMHDZData.sEnemyProjectiles[i].iSlowUpdateFrames
IF sCMHDZData.sEnemyProjectiles[i].iSpriteAnimFrame >= ciCMHDZ_MAX_ENEMY_THROWN_DYNAMITE_ANIM_FRAMES
sCMHDZData.sEnemyProjectiles[i].eState = CMHDZ_PROJECTILE_STATE_IMPACT
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 20)
SWITCH(sCMHDZData.sEnemyProjectiles[i].eType)
CASE CMHDZ_PROJECTILE_DYNAMITE
CMHDZ_DAMAGE_PLAYER(CMHDZ_DAMAGE_PLAYER_TYPE_DYNAMITE)
TWS_CREATE_FX(sCMHDZData.sEnemyProjectiles[i].vSpritePos, CMHDZ_FX_ENEMY_TNT_EXP, 1)
CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_EXP_DYNAMITE, sCMHDZData.sEnemyProjectiles[i].vSpritePos)
BREAK
CASE CMHDZ_PROJECTILE_BONE
CASE CMHDZ_PROJECTILE_JOWL
CASE CMHDZ_PROJECTILE_LEG
CASE CMHDZ_PROJECTILE_TROTTER
CMHDZ_DAMAGE_PLAYER(CMHDZ_DAMAGE_PLAYER_TYPE_SLASH)
TWS_CREATE_FX(sCMHDZData.sEnemyProjectiles[i].vSpritePos, CMHDZ_FX_BLOOD_SPLAT, 1)
CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_BEARSY_MEAT_IMPACT, sCMHDZData.sEnemyProjectiles[i].vSpritePos)
BREAK
ENDSWITCH
ENDIF
BREAK
CASE CMHDZ_PROJECTILE_STATE_IMPACT
CMHDZ_RESET_ENEMY_THROWN_PROJECTILE(i)
BREAK
ENDSWITCH
ENDREPEAT
ENDPROC
FUNC BOOL CMHDZ_CAN_ENEMY_STOP_TO_CHECK_FOR_COVER(INT iEnemy)
IF CMHDZ_ENEMY_DATA_IS_BITMASK_SET(iEnemy, CMHDZ_ENEMY_DATA_BITS_IS_POPUP)
RETURN FALSE
ENDIF
IF CMHDZ_ENEMY_DATA_IS_BITMASK_SET(iEnemy, CMHDZ_ENEMY_DATA_BITS_THROWN_PROJECTILE)
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL CMHDZ_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN(INT iEnemy)
VECTOR_2D vPos = sCMHDZData.sEnemyData[iEnemy].vSpritePos
VECTOR_2D vSize = sCMHDZData.sEnemyData[iEnemy].vSize
vSize.x = ABSF(vSize.x) // Fix the value if the scale is reversed for animation.
FLOAT fScale = CMHDZ_GET_ENEMY_TYPE_SCALE_FOR_LANE(sCMHDZData.sEnemyData[iEnemy].iEnemyLane)
BOOL bFromLeft = CMHDZ_ENEMY_DATA_IS_BITMASK_SET(iEnemy, CMHDZ_ENEMY_DATA_BITS_REVERSE)
BOOL bThrownProjectile = CMHDZ_ENEMY_DATA_IS_BITMASK_SET(iEnemy, CMHDZ_ENEMY_DATA_BITS_THROWN_PROJECTILE)
IF sCMHDZData.sEnemyData[iEnemy].eState = CMHDZ_ENEMY_STATE_ACTIVE
IF NOT CMHDZ_ENEMY_DATA_IS_BITMASK_SET(iEnemy, CMHDZ_ENEMY_DATA_BITS_APPEARED_ON_SCREEN)
RETURN FALSE
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, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN] {dsw} True Enemy ", iEnemy, " Off LHS Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.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, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN] {dsw} True Enemy ", iEnemy, " Thrown projectile, off rhs Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.sEnemyData[iEnemy].iEnemyType), " Pos x ", vPos.x)
#ENDIF
RETURN TRUE
ENDIF
IF bFromLeft AND CMHDZ_ENEMY_DATA_IS_BITMASK_SET(iEnemy, CMHDZ_ENEMY_DATA_BITS_APPEARED_ON_SCREEN) AND vPos.x > cfBASE_SCREEN_WIDTH * 2.0
#IF IS_DEBUG_BUILD
//CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN] {dsw} True Enemy ", iEnemy, " From lhs, far off rhs Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.sEnemyData[iEnemy].iEnemyType), " Pos x ", vPos.x)
#ENDIF
RETURN TRUE
ENDIF
// #IF IS_DEBUG_BUILD
// IF eType = CMHDZ_COFFIN_ENEMY OR eType = CMHDZ_OUTHOUSE_ENEMY
// //CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN]")
// //CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN] Enemy ", iEnemy, " Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(eType), " State: ", CMHDZ_ENEMY_STATE_TO_STRING(sCMHDZData.sEnemyData[iEnemy].eState) )
// //CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN] Pos: ", vPos.x, ", ", vPos.y, " Ever on screen? ", CMHDZ_ENEMY_DATA_IS_BITMASK_SET(iEnemy, CMHDZ_ENEMY_DATA_BITS_APPEARED_ON_SCREEN), " Shot? ", CMHDZ_ENEMY_DATA_IS_BITMASK_SET(iEnemy, CMHDZ_ENEMY_DATA_BITS_SHOT_AT_LEAST_ONCE))
// //CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN] Level stopped? ", CMHDZ_IS_LEVEL_STOPPED())
// //CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN]")
//
// ENDIF
// #ENDIF
IF CMHDZ_IS_LEVEL_STOPPED()
IF sCMHDZData.sEnemyData[iEnemy].eState = CMHDZ_ENEMY_STATE_ATTACKING
IF sCMHDZData.sEnemyData[iEnemy].eState = CMHDZ_ENEMY_STATE_ACTIVE
IF vPos.x > ( cfRIGHT_SCREEN_LIMIT )
#IF IS_DEBUG_BUILD
//CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN] {dsw} True Enemy ", iEnemy, " Level stopped, off rhs Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.sEnemyData[iEnemy].iEnemyType), " Pos x ", vPos.x)
#ENDIF
RETURN TRUE
ELIF vPos.x <= ( 300.0 )
#IF IS_DEBUG_BUILD
//CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN] {dsw} True Enemy ", iEnemy, " Level stopped, off lhs Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.sEnemyData[iEnemy].iEnemyType), " Pos x ", vPos.x)
#ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF CMHDZ_ENEMY_DATA_IS_BITMASK_SET(iEnemy, CMHDZ_ENEMY_DATA_BITS_IS_BONUS)
IF CMHDZ_ENEMY_DATA_IS_BITMASK_SET(iEnemy, CMHDZ_ENEMY_DATA_BITS_APPEARED_ON_SCREEN)
IF bFromLeft
AND vPos.x >= cfBASE_SCREEN_WIDTH
RETURN TRUE
ENDIF
IF !bFromLeft
AND vPos.x <= 0.0
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CMHDZ_SHOULD_FORCE_DOORS_OPEN(INT iEnemyCover)
IF sCMHDZData.sEnemyData[iEnemyCover].iRenderAfterWarpedCount = 0
IF sCMHDZData.sEnemyData[iEnemyCover].iWarpedForMovingLevelCount > 0
RETURN TRUE
ENDIF
ELSE
IF sCMHDZData.sEnemyData[iEnemyCover].iWarpedForMovingLevelCount > sCMHDZData.sEnemyData[iEnemyCover].iRenderAfterWarpedCount
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC CMHDZ_HANDLE_ENEMIES()
INT iCurrentGameTime = GET_GAME_TIMER()
// INT iBlockingCover
INT i//, j
VECTOR_2D vThrow
FLOAT fXpos
BOOL bCanEnemyEnter
// FLOAT fCoverWidth
// FLOAT fScale
FOR i = 0 TO ciCMHDZ_MAX_ENEMIES - 1
// iBlockingCover = -1
#IF IS_DEBUG_BUILD
// //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_ENEMY_STATE_ACTIVE] [dsw]")
// //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_ENEMY_STATE_ACTIVE] [dsw] Processing Enemy: ",i)
// //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_ENEMY_STATE_ACTIVE] [dsw] State: ", CMHDZ_ENEMY_STATE_TO_STRING(sCMHDZData.sEnemyData[i].eState), " Lane: ",sCMHDZData.sEnemyData[i].iEnemyLane, " Type:", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.sEnemyData[i].iEnemyType))
// //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_ENEMY_STATE_ACTIVE] [dsw] Active in stage: ", sCMHDZData.sEnemyData[i].iLevelStage, " Current stage:", CMHDZ_GET_CURRENT_LEVEL_SCREEN())
#ENDIF
IF NOT CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_APPEARED_ON_SCREEN)
IF sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ACTIVE
OR sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING
OR sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_DYING
OR sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_DYING_HEADSHOT
fXpos = sCMHDZData.sEnemyData[i].vSpritePos.x
IF fXPos > cfLEFT_SCREEN_LIMIT AND fXPos < cfRIGHT_SCREEN_LIMIT
#IF IS_DEBUG_BUILD
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_ENEMY_STATE_ACTIVE] [dsw] Enemy: ",i, " Appeared on screen. Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.sEnemyData[i].iEnemyType), " State: ", CMHDZ_ENEMY_STATE_TO_STRING(sCMHDZData.sEnemyData[i].eState), " Lane: ", sCMHDZData.sEnemyData[i].iEnemyLane)
#ENDIF
CMHDZ_ENEMY_DATA_SET_BIT_BY_BOOL(i, CMHDZ_ENEMY_DATA_BITS_APPEARED_ON_SCREEN, TRUE)
sCMHDZData.iTotalNumberOfEnemiesSpawned ++
ENDIF
ENDIF
ENDIF
// Update enemy stopping position to match the screen scrolling.
IF sCMHDZData.sEnemyData[i].fPointToAppear <= sCMHDZData.fOverallLevelProgression
IF IS_MOVING_LEVEL()
AND sCMHDZData.sEnemyData[i].iEnemyLane != ciCMHDZ_LANE_FOREGROUND
AND sCMHDZData.sEnemyData[i].iEnemyLane != ciCMHDZ_LANE_POPUP_LHS
AND sCMHDZData.sEnemyData[i].iEnemyLane != ciCMHDZ_LANE_POPUP_RHS
AND sCMHDZData.sEnemyData[i].fStoppingX > -200
AND sCMHDZData.sEnemyData[i].fStoppingX < 2000
sCMHDZData.sEnemyData[i].fStoppingX -= CMHDZ_GET_GENERAL_UPDATE()
ENDIF
ENDIF
SWITCH sCMHDZData.sEnemyData[i].eState
CASE CMHDZ_ENEMY_STATE_ACTIVE
#IF IS_DEBUG_BUILD
// //CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_IS_COVER_SUITABLE_FOR_ENEMY_TO_USE] {dsw} Start of Active Enemy ", i, " Staggered count: ", sCMHDZData.iStaggeredOnScreenViableCoverCount)
#ENDIF
sCMHDZData.sEnemyData[i].iSpriteAnimFrame += sCMHDZData.sEnemyData[i].iSlowUpdateFrames
IF sCMHDZData.sEnemyData[i].iSpriteAnimFrame >= ciCMHDZ_MAX_ANIM_FRAMES
sCMHDZData.sEnemyData[i].iSpriteAnimFrame = 0
ENDIF
// IF sCMHDZData.sEnemyData[i].iEnemyType != CMHDZ_CART_1 AND sCMHDZData.sEnemyData[i].iSpriteAnimFrame >= ciCMHDZ_MAX_ANIM_FRAMES
// sCMHDZData.sEnemyData[i].iSpriteAnimFrame = 0
// ELIF sCMHDZData.sEnemyData[i].iEnemyType = CMHDZ_CART_1
// sCMHDZData.sEnemyData[i].iSpriteAnimFrame = 0
// ENDIF
// IF sCMHDZData.sEnemyData[i].iHealth <= 0
// sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_DYING
// #IF IS_DEBUG_BUILD
// //CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] {dsw} Enemy ", i, " set as Dying as iHealth <= 0. Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.sEnemyData[i].iEnemyType))
// #ENDIF
// ENDIF
IF NOT CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_IS_POPUP)
AND NOT CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_IS_BONUS)
// //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] [dsw] [CMHDZ_IS_COVER_SUITABLE_FOR_ENEMY_TO_USE] Enemy ",i , " Comparing sprite x ", sCMHDZData.sEnemyData[i].vSpritePos.x, " wih stopping x ", sCMHDZData.sEnemyData[i].fStoppingX)
IF (sCMHDZData.sEnemyData[i].vSpritePos.x >= sCMHDZData.sEnemyData[i].fStoppingX
AND CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_REVERSE))
OR (sCMHDZData.sEnemyData[i].vSpritePos.x <= sCMHDZData.sEnemyData[i].fStoppingX
AND !CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_REVERSE))
//-- If the enemy is about to stop and shoot then check the stop location isn't behind a big bit of cover
sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING
//CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_ENEMY_STATE_ACTIVE - CMHDZ_ENEMY_DATA_BITS_THROWN_PROJECTILE - eState = CMHDZ_ENEMY_STATE_ATTACKING - IS at stoppping position")
sCMHDZData.sEnemyData[i].iTimeOfLastShot = GET_GAME_TIMER()
ELSE
//-- If the ped is stiil on their way to their stopping loc, stop if they happen to pass some suitable cover
IF sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ACTIVE
AND NOT CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_THROWN_PROJECTILE)
IF CMHDZ_IS_COVER_SUITABLE_FOR_ENEMY_TO_USE(sCMHDZData.iViableOnScreenEnemyCoverPoints[sCMHDZData.iStaggeredOnScreenViableCoverCount], i)
sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING
CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_ENEMY_STATE_ACTIVE - CMHDZ_ENEMY_DATA_BITS_THROWN_PROJECTILE - eState = CMHDZ_ENEMY_STATE_ATTACKING")
sCMHDZData.sEnemyData[i].iTimeOfLastShot = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
ENDIF
SWITCH sCMHDZData.sEnemyData[i].iEnemyLane
CASE 2
IF CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_REVERSE)
sCMHDZData.sEnemyData[i].vSpritePos.x += CMHDZ_GET_ENEMY_FOREGROUND_UPDATE(TRUE)
ELSE
sCMHDZData.sEnemyData[i].vSpritePos.x -= CMHDZ_GET_ENEMY_FOREGROUND_UPDATE(FALSE)
ENDIF
BREAK
CASE 1
IF CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_REVERSE)
sCMHDZData.sEnemyData[i].vSpritePos.x += CMHDZ_GET_ENEMY_MIDDLE_UPDATE(TRUE)
ELSE
sCMHDZData.sEnemyData[i].vSpritePos.x -= CMHDZ_GET_ENEMY_MIDDLE_UPDATE(FALSE)
ENDIF
BREAK
CASE 0
IF CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_REVERSE)
sCMHDZData.sEnemyData[i].vSpritePos.x += CMHDZ_GET_ENEMY_BACKGROUND_UPDATE(TRUE)
ELSE
sCMHDZData.sEnemyData[i].vSpritePos.x -= CMHDZ_GET_ENEMY_BACKGROUND_UPDATE(FALSE)
ENDIF
BREAK
ENDSWITCH
IF sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ACTIVE
IF CMHDZ_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN(i)
#IF IS_DEBUG_BUILD
//CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] {dsw} Enemy ", i, " Active but went outside the limits and is being set as inactive. Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.sEnemyData[i].iEnemyType))
#ENDIF
IF CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_IS_BONUS)
CMHDZ_PLAY_BONUS_MISSED_AUDIO(i)
ENDIF
sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_INACTIVE
sCMHDZData.iCurrentActiveEnemies[sCMHDZData.sEnemyData[i].iEnemyLane]--
// IF sCMHDZData.iCurrentActiveEnemies[sCMHDZData.sEnemyData[i].iEnemyLane] = ciCMHDZ_LANE_BACKGROUND
// sCMHDZData.iCurrentActiveEnemies[sCMHDZData.sEnemyData[i].iEnemyLane] = ciCMHDZ_LANE_BACKGROUND
// //CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] {dsw} iCurrentActiveEnemies in lane ", sCMHDZData.sEnemyData[i].iEnemyLane, " < 0 (1)")
// ENDIF
IF sCMHDZData.iCurrentActiveEnemies[sCMHDZData.sEnemyData[i].iEnemyLane] = ciCMHDZ_LANE_FOREGROUND
CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] {baz} Cleanup foreground enemy off screen")
ENDIF
ENDIF
ENDIF
BREAK
CASE CMHDZ_ENEMY_STATE_ATTACKING
IF IS_MOVING_LEVEL() AND sCMHDZData.sEnemyData[i].iEnemyLane != ciCMHDZ_LANE_FOREGROUND
sCMHDZData.sEnemyData[i].vSpritePos.x -= CMHDZ_GET_ENEMY_SHOOTING_UPDATE()
ENDIF
IF CMHDZ_CAN_ENEMY_SHOOT_GUN(i)
IF iCurrentGameTime - sCMHDZData.sEnemyData[i].iTimeOfLastShot > ciCMHDZ_ENEMY_TIME_TO_SHOOT - (ENUM_TO_INT(sCMHDZData.eCurrentLevel) * 200)
sCMHDZData.sEnemyData[i].iTimeOfLastShot = GET_GAME_TIMER()
IF sCMHDZData.sEnemyData[i].iEnemyLane = ciCMHDZ_LANE_FOREGROUND
TWS_CREATE_FX(INIT_VECTOR_2D(sCMHDZData.sEnemyData[i].vSpritePos.x + cfCMHDZ_FG_ENEMY_1_X_OFFSET, sCMHDZData.sEnemyData[i].vSpritePos.Y - cfCMHDZ_FG_ENEMY_1_Y_OFFSET), CMHDZ_FX_ENEMY_SHOT, sCMHDZData.sEnemyData[i].iEnemyLane)
ELSE
IF NOT CMHDZ_IS_ENEMY_TYPE_THROWING_ENEMY(sCMHDZData.sEnemyData[i].iEnemyType)
TWS_CREATE_FX(INIT_VECTOR_2D(sCMHDZData.sEnemyData[i].vSpritePos.x + cfCMHDZ_BG_ENEMY_1_X_OFFSET, sCMHDZData.sEnemyData[i].vSpritePos.Y + cfCMHDZ_BG_ENEMY_1_Y_OFFSET), CMHDZ_FX_ENEMY_SHOT, sCMHDZData.sEnemyData[i].iEnemyLane)
ENDIF
ENDIF
IF GET_PLAYER_TOTAL_AMMO_FOR_ALL_WEAPON_TYPES() <= 0
IF sCMHDZData.sPlayerData[0].iNoAmmoTimer = 0
sCMHDZData.sPlayerData[0].iNoAmmoTimer = GET_GAME_TIMER()
//CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} Start iNoAmmoTimer")
ELSE
IF GET_GAME_TIMER() - sCMHDZData.sPlayerData[0].iNoAmmoTimer >= ciCMHDZ_PLAYER_CRITICAL_DAMAGE_NO_AMMO_TIME
IF sCMHDZData.sPlayerData[0].fHealth > 0.05
//CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} Forcing hit critical as ammo <=0")
sCMHDZData.sPlayerData[0].fHealth = 0.05
ENDIF
ENDIF
ENDIF
ELSE
IF sCMHDZData.sPlayerData[0].iNoAmmoTimer != 0
sCMHDZData.sPlayerData[0].iNoAmmoTimer = 0
ENDIF
ENDIF
IF CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_WILL_INFLICT_MELEE_DAMAGE)
CMHDZ_DAMAGE_PLAYER(CMHDZ_DAMAGE_PLAYER_TYPE_SLASH)
TWS_CREATE_FX(sCMHDZData.sEnemyData[i].vSpritePos, CMHDZ_FX_SLASH_EFFECT, ciCMHDZ_LANE_FOREGROUND)
CMHDZ_PLAY_ENEMY_TYPE_SOUND_AND_RELEASE(sCMHDZData.sEnemyData[i].iEnemyType, CMHDZ_AUDIO_EFFECT_ENEMY_ATTACK, sCMHDZData.sEnemyData[i].vSpritePos, sCMHDZData.sEnemyData[i].iEnemyVoiceID)
sCMHDZData.sEnemyData[i].fAnimTimer = 900 // Hold the slash animation for 0.9 secs
CMHDZ_PLAY_ENEMY_WEAPON_MELEE_SWING_SOUND_AND_RELEASE(sCMHDZData.sEnemyData[i].iEnemyType, sCMHDZData.sEnemyData[i].vSpritePos)
CMHDZ_PLAY_ENEMY_WEAPON_ATTACK_SOUND_AND_RELEASE(sCMHDZData.sEnemyData[i].iEnemyType, sCMHDZData.sEnemyData[i].vSpritePos)
IF NOT CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_PLAYED_WARN_AUDIO)
CMHDZ_ENEMY_DATA_SET_BIT_BY_BOOL(i, CMHDZ_ENEMY_DATA_BITS_PLAYED_WARN_AUDIO, FALSE)
ENDIF
ELSE
CMHDZ_DAMAGE_PLAYER(CMHDZ_DAMAGE_PLAYER_TYPE_BULLET)
CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_ENEMY_RIFLE_FIRE, sCMHDZData.sEnemyData[i].vSpritePos)
CMHDZ_PLAY_ENEMY_WEAPON_ATTACK_SOUND_AND_RELEASE(sCMHDZData.sEnemyData[i].iEnemyType, sCMHDZData.sEnemyData[i].vSpritePos)
ENDIF
#IF IS_DEBUG_BUILD
//CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] Player has been hit by enemy ", i, " Ped Pos: ", sCMHDZData.sEnemyData[i].vSpritePos.x, ", ", sCMHDZData.sEnemyData[i].vSpritePos.y, " lane: ", sCMHDZData.sEnemyData[i].iEnemyLane, " Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.sEnemyData[i].iEnemyType), " Popup? ", CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_IS_POPUP))
#ENDIF
ELSE
//-- Audio for enemy cocking weapon
IF NOT CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_PLAYED_AIM_AUDIO)
//CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_ENEMY_RIFLE_AIM,sCMHDZData.sEnemyData[i].vSpritePos)
CMHDZ_PLAY_ENEMY_WEAPON_READY_SOUND_AND_RELEASE(sCMHDZData.sEnemyData[i].iEnemyType, sCMHDZData.sEnemyData[i].vSpritePos)
CMHDZ_ENEMY_DATA_SET_BIT_BY_BOOL(i, CMHDZ_ENEMY_DATA_BITS_PLAYED_AIM_AUDIO)
ENDIF
//-- Enemies 'laugh' just before they fire a critical shot
IF NOT CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_PLAYED_WARN_AUDIO)
IF iCurrentGameTime - sCMHDZData.sEnemyData[i].iTimeOfLastShot > (ciCMHDZ_ENEMY_TIME_TO_SHOOT - (200)) - 1000
//IF CMHDZ_GET_LOCAL_PLAYER_HEALTH() <= 0.1 AND CMHDZ_GET_LOCAL_PLAYER_HEALTH() > 0.0
CMHDZ_ENEMY_DATA_SET_BIT_BY_BOOL(i, CMHDZ_ENEMY_DATA_BITS_PLAYED_WARN_AUDIO, TRUE)
//CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_ENEMY_CRIT_WARNING, sCMHDZData.sEnemyData[i].vSpritePos)
CMHDZ_PLAY_ENEMY_TYPE_SOUND_AND_RELEASE(sCMHDZData.sEnemyData[i].iEnemyType, CMHDZ_AUDIO_EFFECT_ENEMY_GLOAT, sCMHDZData.sEnemyData[i].vSpritePos, sCMHDZData.sEnemyData[i].iEnemyVoiceID)
//ENDIF
ENDIF
ENDIF
ENDIF
// ELIF CMHDZ_IS_BEAR(i)
// IF iCurrentGameTime - sCMHDZData.sEnemyData[i].iTimeOfLastShot > ciCMHDZ_ENEMY_TIME_TO_SHOOT - (ENUM_TO_INT(sCMHDZData.eCurrentLevel) * 200)
// sCMHDZData.sEnemyData[i].iTimeOfLastShot = GET_GAME_TIMER()
// //CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] {DSW} Bear ", i, " attacking ")
// ENDIF
ENDIF
// IF sCMHDZData.sEnemyData[i].vSpritePos.x < cfLEFT_SCREEN_LIMIT - ( sCMHDZData.sEnemyData[i].vSize.x * CMHDZ_GET_ENEMY_TYPE_SCALE_FOR_LANE(sCMHDZData.sEnemyData[i].iEnemyType, sCMHDZData.sEnemyData[i].iEnemyLane))
// OR (sCMHDZData.sEnemyData[i].bReverse AND sCMHDZData.sEnemyData[i].bThrownProjectile AND sCMHDZData.sEnemyData[i].vSpritePos.x > cfRIGHT_SCREEN_LIMIT - ( sCMHDZData.sEnemyData[i].vSize.x * CMHDZ_GET_ENEMY_TYPE_SCALE_FOR_LANE(sCMHDZData.sEnemyData[i].iEnemyType, sCMHDZData.sEnemyData[i].iEnemyLane)))
IF CMHDZ_SHOULD_CLEANUP_ENEMY_FOR_BEING_OFF_SCREEN(i)
#IF IS_DEBUG_BUILD
//CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] {dsw} Enemy ", i, " went outside the limits and is being set as inactive. Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.sEnemyData[i].iEnemyType))
#ENDIF
sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_INACTIVE
sCMHDZData.iCurrentActiveEnemies[sCMHDZData.sEnemyData[i].iEnemyLane]--
IF sCMHDZData.iCurrentActiveEnemies[sCMHDZData.sEnemyData[i].iEnemyLane] < ciCMHDZ_LANE_BACKGROUND
sCMHDZData.iCurrentActiveEnemies[sCMHDZData.sEnemyData[i].iEnemyLane] = ciCMHDZ_LANE_BACKGROUND
//CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] {dsw} iCurrentActiveEnemies in lane ", sCMHDZData.sEnemyData[i].iEnemyLane, " < 0 (2)")
ENDIF
ENDIF
IF CMHDZ_IS_ENEMY_TYPE_THROWING_ENEMY(sCMHDZData.sEnemyData[i].iEnemyType)
IF NOT CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_THROWN_PROJECTILE)
sCMHDZData.sEnemyData[i].iSpriteAnimFrame += sCMHDZData.sEnemyData[i].iSlowUpdateFrames
IF sCMHDZData.sEnemyData[i].iSpriteAnimFrame > ciCMHDZ_MAX_THROWING_FRAMES -2
sCMHDZData.sEnemyData[i].iSpriteAnimFrame = ciCMHDZ_MAX_THROWING_FRAMES -2
CMHDZ_ENEMY_DATA_SET_BIT_BY_BOOL(i, CMHDZ_ENEMY_DATA_BITS_THROWN_PROJECTILE)
sCMHDZData.sEnemyData[i].iTimeOfLastShot = GET_GAME_TIMER()
vThrow = sCMHDZData.sEnemyData[i].vSpritePos
vThrow.x -= 23.75
vThrow.y -= 95.125
CMHDZ_INIT_THROWN_ENEMY_PROJECTILE(CMHDZ_PROJECTILE_DYNAMITE, vThrow)
CMHDZ_PLAY_SOUND_AND_RELEASE(CMHDZ_AUDIO_EFFECT_ENEMY_THROW_DYNAMITE, sCMHDZData.sEnemyData[i].vSpritePos)
//CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] {dsw} Enemy ", i, " Throwing projectile")
ENDIF
ELIF NOT CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_IS_POPUP)
IF GET_GAME_TIMER() - sCMHDZData.sEnemyData[i].iTimeOfLastShot > 1000
IF CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_REVERSE)
sCMHDZData.sEnemyData[i].fStoppingX = 2000.0
ELSE
sCMHDZData.sEnemyData[i].fStoppingX = -200.0
ENDIF
CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] {dsw} Enemy ", i, " has thrown projectile and time expired. Running off screen")
sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ACTIVE
ENDIF
ENDIF
ENDIF
CMHDZ_HANDLE_POPUP_ENEMY(i)
BREAK
CASE CMHDZ_ENEMY_STATE_STUNNED
IF IS_MOVING_LEVEL()
sCMHDZData.sEnemyData[i].vSpritePos.x -= CMHDZ_GET_ENEMY_DYING_UPDATE()
ENDIF
IF sCMHDZData.sEnemyData[i].fAnimTimer > 0
sCMHDZData.sEnemyData[i].fAnimTimer -= (0.0+@1000)
ELSE // Stun time over
// Testing: May have state conflict
sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ACTIVE // Return to active.
ENDIF
BREAK
CASE CMHDZ_ENEMY_STATE_DYING
CASE CMHDZ_ENEMY_STATE_DYING_HEADSHOT
CASE CMHDZ_ENEMY_STATE_DYING_BURNING
sCMHDZData.sEnemyData[i].fAnimTimer += (0.0+@1000)
IF IS_MOVING_LEVEL()
sCMHDZData.sEnemyData[i].vSpritePos.x -= CMHDZ_GET_ENEMY_DYING_UPDATE()
ENDIF
SWITCH sCMHDZData.sEnemyData[i].iEnemyLane
CASE ciCMHDZ_LANE_FOREGROUND
sCMHDZData.sEnemyData[i].vSpritePos.y -= (0.5*(0.0+@1000))
BREAK
CASE ciCMHDZ_LANE_MIDDLE
sCMHDZData.sEnemyData[i].vSpritePos.y -= (0.4*(0.0+@1000))
BREAK
CASE ciCMHDZ_LANE_BACKGROUND
CASE ciCMHDZ_LANE_POPUP_LHS
CASE ciCMHDZ_LANE_POPUP_RHS
sCMHDZData.sEnemyData[i].vSpritePos.y -= (0.3*(0.0+@1000))
BREAK
ENDSWITCH
IF sCMHDZData.sEnemyData[i].fAnimTimer >= 200.0 // Disappear after 0.4 seconds
IF sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_DYING_BURNING
//AND sCMHDZData.sEnemyData[i].iEnemyLane = ciCMHDZ_LANE_FOREGROUND
CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_HANDLE_ENEMIES - Timing out burning enemy in Foreground")
//ASSERTLN("[BAZ] CMHDZ_HANDLE_ENEMIES - Timing out burning enemy in Foreground")
ENDIF
IF sCMHDZData.iCurrentActiveEnemies[sCMHDZData.sEnemyData[i].iEnemyLane] > 0
sCMHDZData.iCurrentActiveEnemies[sCMHDZData.sEnemyData[i].iEnemyLane]--
ENDIF
sCMHDZData.sEnemyData[i].fAnimTimer = 0.0
sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_INACTIVE
ENDIF
// Trigger director commentary
CMHDZ_HANDLE_DIRECTOR_ONE_OFF_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Enemy_Kill)
BREAK
CASE CMHDZ_ENEMY_STATE_WAITING
// IF sCMHDZData.iCurrentActiveEnemies[sCMHDZData.sEnemyData[i].iEnemyLane] != ciCMHDZ_LANE_MIDDLE
// //CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} [CMHDZ_HANDLE_ENEMIES] Active in lane ", sCMHDZData.sEnemyData[i].iEnemyLane, ": ", sCMHDZData.iCurrentActiveEnemies[sCMHDZData.sEnemyData[i].iEnemyLane])
// ENDIF
//-- Set enemy peds as active, depending on their parameters
//IF sCMHDZData.iCurrentActiveEnemies[sCMHDZData.sEnemyData[i].iEnemyLane] < ciCMHDZ_LANE_MIDDLE
bCanEnemyEnter = (sCMHDZData.sEnemyData[i].fPointToAppear <= sCMHDZData.fOverallLevelProgression)
AND (!CMHDZ_IS_LEVEL_BIT_SET_FOR_CURRENT_LEVEL(CMHDZ_LEVELS_BIT_STOPPED))
// Only bring in the enemy if the static screen phase is valid
IF CMHDZ_IS_LEVEL_BIT_SET_FOR_CURRENT_LEVEL(CMHDZ_LEVELS_BIT_STOPPED)
AND IS_BITMASK_ENUM_AS_ENUM_SET(sCMHDZData.sEnemyData[i].eDataBits, CMHDZ_ENEMY_DATA_BITS_WAIT_UNTIL_LEVEL_STATIONARY)
AND sCMHDZData.sEnemyData[i].iStaticScreenPhase > 0
AND sCMHDZData.sEnemyData[i].fPointToAppear <= sCMHDZData.fOverallLevelProgression + cfCMHDZ_SCREEN_LENGTH
bCanEnemyEnter = (sCMHDZData.sEnemyData[i].iStaticScreenPhase = sCMHDZData.iStaticScreenPhase)
ENDIF
IF bCanEnemyEnter
IF CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_WAIT_UNTIL_LEVEL_STATIONARY)
IF NOT CMHDZ_IS_LEVEL_BIT_SET_FOR_CURRENT_LEVEL(CMHDZ_LEVELS_BIT_STOPPED)
//-- The ped only appears when the level is stationary, but it is still moving
RELOOP
ENDIF
ENDIF
IF CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_IS_POPUP)
IF CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_WAIT_UNTIL_LEVEL_STATIONARY)
IF sCMHDZData.iTimeSinceEnemyActive[sCMHDZData.sEnemyData[i].iEnemyLane] = ciCMHDZ_LANE_BACKGROUND
OR GET_GAME_TIMER() - sCMHDZData.iTimeSinceEnemyActive[sCMHDZData.sEnemyData[i].iEnemyLane] > 1500
//-- This ped 'pops-up' from behind scenery, but only when the level has stopped scrolling
#IF IS_DEBUG_BUILD
//CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} [CMHDZ_HANDLE_ENEMIES] Setting as SHOOTING stationary pop up enemy ", i, " Lane: ", sCMHDZData.sEnemyData[i].iEnemyLane, " Is popup? ", CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_IS_POPUP) ," Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.sEnemyData[i].iEnemyType))
#ENDIF
sCMHDZData.iCurrentActiveEnemies[sCMHDZData.sEnemyData[i].iEnemyLane]++
sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING
ENDIF
ELSE
//-- This ped pops up behind scenery while the level is moving
IF CMHDZ_IS_ENEMY_ON_SCREEN(i, cfLEFT_SCREEN_LIMIT)
#IF IS_DEBUG_BUILD
//CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} [CMHDZ_HANDLE_ENEMIES] Setting as SHOOTING moving pop up enemy ", i, " Lane: ", sCMHDZData.sEnemyData[i].iEnemyLane, " Is popup? ", CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_IS_POPUP)," Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.sEnemyData[i].iEnemyType))
#ENDIF
sCMHDZData.iCurrentActiveEnemies[sCMHDZData.sEnemyData[i].iEnemyLane]++
sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING
ENDIF
ENDIF
ELSE // Set the PED active on screen here
IF sCMHDZData.sEnemyData[i].iRenderAfterWarpedCount = 0
OR sCMHDZData.sEnemyData[i].iRenderAfterWarpedCount = sCMHDZData.sEnemyData[i].iWarpedForMovingLevelCount
//-- This is a normal ped who runs into position from either the left or the right of the screev
sCMHDZData.iCurrentActiveEnemies[sCMHDZData.sEnemyData[i].iEnemyLane]++
#IF IS_DEBUG_BUILD
//CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {DSW} [CMHDZ_HANDLE_ENEMIES] Setting as CMHDZ_ENEMY_STATE_ACTIVE enemy ", i, " Lane: ", sCMHDZData.sEnemyData[i].iEnemyLane, " Is popup? ", CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_IS_POPUP)," Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.sEnemyData[i].iEnemyType), " Active in lane: ", sCMHDZData.iCurrentActiveEnemies[sCMHDZData.sEnemyData[i].iEnemyLane])
#ENDIF
IF CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_IS_BONUS)
CMHDZ_PLAY_BONUS_APPEAR_AUDIO(i)
ENDIF
IF NOT CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_IS_BONUS)
CMHDZ_HANDLE_DIRECTOR_ONE_OFF_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_First_Enemy_Appear)
ENDIF
IF CMHDZ_IS_ENEMY_TYPE_THROWING_ENEMY(sCMHDZData.sEnemyData[i].iEnemyType)
CMHDZ_SET_HELP_TEXT_BIT(CMHDZ_HELP_TEXT_BIT_DYNAMITE)
ENDIF
sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_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 CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_IS_POPUP)
//OR (CMHDZ_GET_CURRENT_LEVEL() = CMHDZ_LEVEL_PARK)
OR sCMHDZData.sEnemyData[i].iRenderAfterWarpedCount > 0
//IF NOT CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_WAIT_UNTIL_LEVEL_STATIONARY)
IF sCMHDZData.fOverallLevelProgression >= sCMHDZData.sEnemyData[i].fPointToAppear
sCMHDZData.sEnemyData[i].vSpritePos.x -= CMHDZ_GET_ENEMY_WAITING_UPDATE()
ENDIF
IF sCMHDZData.sEnemyData[i].iRenderAfterWarpedCount > 0
IF sCMHDZData.sEnemyData[i].vSpritePos.x <= 0
sCMHDZData.sEnemyData[i].vSpritePos.x = CMHDZ_GET_OFFSET_FOR_ELEMENT_WARP_FOR_CURRENT_LEVEL()
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_HANDLE_ENEMIES] [CMHDZ_ENEMY_STATE_WAITING] [OUTHOUSE_WARP] [dsw] Enemy: ",i, " Warped")
sCMHDZData.sEnemyData[i].iWarpedForMovingLevelCount++
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDFOR
ENDPROC
////-- Handle NAILGUN gun overheating
//PROC CMHDZ_PROCESS_NAILGUN_GUN_TEMP()
// FLOAT fTimeOverHeat = cfCMHDZ_NAILGUN_OVERHEAT_TIME_SECONDS
// FLOAT fTimeCooldown = cfCMHDZ_NAILGUN_COOLDOWN_TIME_SECONDS
//
// BOOL bShooting
// FLOAT fFrameTime = GET_FRAME_TIME()
//
// IF CMHDZ_GET_PLAYER_CURRENT_WEAPON() = CMHDZ_PLAYER_WEAPON_NAILGUN
//
// bSHooting = (IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RT) OR IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RDOWN)
// AND CMHDZ_GET_LOCAL_PLAYER_HEALTH() > 0.0)
//
// IF CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_NAILGUN_OVERHEAT)
// IF NOT CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_NAILGUN_STOPPED_SHOOTING)
// IF NOT bSHooting
// CMHDZ_SET_PLAYER_BIT(CMHDZ_PLAYER_BIT_NAILGUN_STOPPED_SHOOTING)
// ENDIF
// ENDIF
//
// IF bSHooting
// IF sCMHDZData.sPlayerData[0].iNAILGUNOverheatTime = 0
// OR (GET_GAME_TIMER() - sCMHDZData.sPlayerData[0].iNAILGUNOverheatTime) > 100
// sCMHDZData.sPlayerData[0].iNAILGUNOverheatTime = GET_GAME_TIMER()
// CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_SHOOT_NAILGUN_OVERHEAT)
// ENDIF
//
// IF NOT CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_NAILGUN_STOPPED_SHOOTING)
// sCMHDZData.sPlayerData[0].fNAILGUNGunTemp = 1.0
// EXIT
// ENDIF
// ENDIF
//
//
//
// IF sCMHDZData.sPlayerData[0].fNAILGUNGunTemp > 0.0
// sCMHDZData.sPlayerData[0].fNAILGUNGunTemp -= (1.0 / (fTimeCooldown/fFrameTime))
// // //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_PROCESS_NAILGUN_GUN_TEMP] DECREASE sCMHDZData.sPlayerData[0].fNAILGUNGunTemp = ", sCMHDZData.sPlayerData[0].fNAILGUNGunTemp)
// ELSE
// sCMHDZData.sPlayerData[0].fNAILGUNGunTemp = 0.0
// CMHDZ_CLEAR_PLAYER_BIT(CMHDZ_PLAYER_BIT_NAILGUN_OVERHEAT)
// CMHDZ_CLEAR_PLAYER_BIT(CMHDZ_PLAYER_BIT_NAILGUN_STOPPED_SHOOTING)
// ENDIF
//
// EXIT
// ENDIF
//
//
//
// IF bSHooting
// IF sCMHDZData.sPlayerData[0].fNAILGUNGunTemp < 1.0
//
// IF NOT CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_NAILGUN_OVERHEAT)
// sCMHDZData.sPlayerData[0].fNAILGUNGunTemp += (1.0 / (fTimeOverHeat/fFrameTime))
//
// IF sCMHDZData.sPlayerData[0].fNAILGUNGunTemp >= 1.0
// CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_NAILGUN_OVERHEAT)
// CMHDZ_SET_PLAYER_BIT(CMHDZ_PLAYER_BIT_NAILGUN_OVERHEAT)
// ENDIF
//// ELSE
//// IF sCMHDZData.sPlayerData[0].iNAILGUNOverheatTime = 0
//// OR (GET_GAME_TIMER() - sCMHDZData.sPlayerData[0].iNAILGUNOverheatTime) > 100
//// sCMHDZData.sPlayerData[0].iNAILGUNOverheatTime = GET_GAME_TIMER()
//// CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_SHOOT_NAILGUN_OVERHEAT)
//// ENDIF
// ENDIF
// ELSE
// sCMHDZData.sPlayerData[0].fNAILGUNGunTemp = 1.0
// ENDIF
// ELSE
// IF sCMHDZData.sPlayerData[0].fNAILGUNGunTemp > 0.0
// sCMHDZData.sPlayerData[0].fNAILGUNGunTemp -= (1.0 / (fTimeCooldown/fFrameTime))
// // //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_PROCESS_NAILGUN_GUN_TEMP] DECREASE sCMHDZData.sPlayerData[0].fNAILGUNGunTemp = ", sCMHDZData.sPlayerData[0].fNAILGUNGunTemp)
// ELSE
// sCMHDZData.sPlayerData[0].fNAILGUNGunTemp = 0.0
// CMHDZ_CLEAR_PLAYER_BIT(CMHDZ_PLAYER_BIT_NAILGUN_OVERHEAT)
// CMHDZ_CLEAR_PLAYER_BIT(CMHDZ_PLAYER_BIT_NAILGUN_STOPPED_SHOOTING)
// ENDIF
// ENDIF
// ELSE
// IF sCMHDZData.sPlayerData[0].fNAILGUNGunTemp != 0.0
// sCMHDZData.sPlayerData[0].fNAILGUNGunTemp = 0.0
// ENDIF
// ENDIF
//ENDPROC
FUNC BOOL CMHDZ_PLAYER_SHOT(INT iPlayer, BOOL bIsMenu)
BOOL bReturn = FALSE
CMHDZ_PLAYER_WEAPON_DATA weaponData
IF CMHDZ_GET_PLAYER_AMMO_IN_CLIP_FOR_CURRENT_WEAPON() > 0
OR bIsMenu
IF CMHDZ_IS_PLAYER_SHOOTING()
//-- Shoot pistol
IF CMHDZ_GET_PLAYER_CURRENT_WEAPON() = GET_PLAYER_DEFAULT_WEAPON()
IF NOT bIsMenu
sCMHDZData.sPlayerData[0].weaponData[CMHDZ_PLAYER_WEAPON_TYPE_DEFAULT].iLastShotTime = GET_GAME_TIMER()
ENDIF
bReturn = TRUE
ELSE
IF CMHDZ_GET_PLAYER_CURRENT_WEAPON() = CMHDZ_PLAYER_WEAPON_SHOTGUN
OR CMHDZ_GET_PLAYER_CURRENT_WEAPON() = CMHDZ_PLAYER_WEAPON_RIFLE
weaponData = CMHDZ_GET_PLAYER_WEAPON_DATA(CMHDZ_GET_PLAYER_CURRENT_WEAPON())
IF sCMHDZData.sPlayerData[0].weaponData[CMHDZ_PLAYER_WEAPON_TYPE_SPECIAL].iLastShotTime = 0
OR GET_GAME_TIMER() - sCMHDZData.sPlayerData[0].weaponData[CMHDZ_PLAYER_WEAPON_TYPE_SPECIAL].iLastShotTime >= weaponData.iMinTimeBetweenShots
sCMHDZData.sPlayerData[0].weaponData[CMHDZ_PLAYER_WEAPON_TYPE_SPECIAL].iLastShotTime = GET_GAME_TIMER()
bReturn = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
//--SHoot NAILGUN gun
IF (CMHDZ_GET_PLAYER_CURRENT_WEAPON() = CMHDZ_PLAYER_WEAPON_NAILGUN
AND (CMHDZ_IS_PLAYER_HOLDING_SHOOT())
AND GET_GAME_TIMER() - sCMHDZData.sPlayerData[iPlayer].iLastProjectileTime > 100)
// IF NOT CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_NAILGUN_OVERHEAT)
bReturn = TRUE
// ENDIF
ENDIF
ENDIF
IF (bReturn
OR (CMHDZ_IS_PLAYER_SHOOTING()
AND CMHDZ_GET_PLAYER_AMMO_IN_CLIP_FOR_CURRENT_WEAPON() = 0))
CMHDZ_HANDLE_PLAYER_SHOOTING_AUDIO(bIsMenu)
ENDIF
RETURN bReturn
ENDFUNC
PROC CMHDZ_HANDLE_PLAYER_RELOADING()
CMHDZ_PLAYER_WEAPON_TYPE weaponType = sCMHDZData.sPlayerData[0].weaponType
//-- Exit if the gun clip is full
IF NOT CMHDZ_CAN_PLAYER_CURRNT_WEAPON_BE_RELOADED()
IF sCMHDZData.sPlayerData[0].bIsReloading[weaponType]
sCMHDZData.sPlayerData[0].bIsReloading[weaponType] = FALSE
ENDIF
IF sCMHDZData.sPlayerData[0].weaponData[weaponType].iReloadSingleBulletTime != 0
sCMHDZData.sPlayerData[0].weaponData[weaponType].iReloadSingleBulletTime = 0
ENDIF
IF CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_RELOADED_FIRST_BULLET)
CMHDZ_CLEAR_PLAYER_BIT(CMHDZ_PLAYER_BIT_RELOADED_FIRST_BULLET)
ENDIF
EXIT
ENDIF
//-- Stop reloading if the player shoots after starting to reload.
IF CMHDZ_GET_PLAYER_AMMO_IN_CLIP_FOR_CURRENT_WEAPON() > 0
IF CMHDZ_PLAYER_SHOT(0, FALSE)
IF sCMHDZData.sPlayerData[0].bIsReloading[weaponType]
sCMHDZData.sPlayerData[0].bIsReloading[weaponType] = FALSE
ENDIF
IF sCMHDZData.sPlayerData[0].weaponData[weaponType].iReloadSingleBulletTime != 0
sCMHDZData.sPlayerData[0].weaponData[weaponType].iReloadSingleBulletTime = 0
ENDIF
IF CMHDZ_IS_PLAYER_BIT_SET(CMHDZ_PLAYER_BIT_RELOADED_FIRST_BULLET)
CMHDZ_CLEAR_PLAYER_BIT(CMHDZ_PLAYER_BIT_RELOADED_FIRST_BULLET)
ENDIF
EXIT
ENDIF
ENDIF
IF sCMHDZData.sPlayerData[0].bIsReloading[weaponType]
CMHDZ_RELOAD_PLAYER_WEAPON()
ENDIF
ENDPROC
PROC CMHDZ_HANDLE_PLAYER_SHOOTING(INT iPlayer, BOOL bIsMenu = FALSE)
CMHDZ_STOP_LOOPING_WEAPON_AUDIO()
sCMHDZData.sPlayerData[iPlayer].bHasJustShot = FALSE
sCMHDZData.sPlayerData[iPlayer].eReticuleBits = CMHDZ_RETICLE_BITS_NONE
// PROCESS BULLETS
// IF ((CMHDZ_GET_PLAYER_CURRENT_WEAPON() = GET_PLAYER_DEFAULT_WEAPON() AND CMHDZ_IS_PLAYER_SHOOTING())
// OR (CMHDZ_GET_PLAYER_CURRENT_WEAPON() = CMHDZ_PLAYER_WEAPON_NAILGUN AND IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RT) AND GET_GAME_TIMER() - sCMHDZData.sPlayerData[iPlayer].iLastProjectileTime > 100))
// AND (CMHDZ_GET_PLAYER_AMMO_IN_CLIP_FOR_CURRENT_WEAPON() > 0 AND iPlayer = 0 OR bIsMenu)
IF CMHDZ_PLAYER_SHOT(iPlayer, bIsMenu)
IF bIsMenu
OR CMHDZ_GET_LOCAL_PLAYER_HEALTH() > 0.0
sCMHDZData.sPlayerData[iPlayer].iLastProjectileTime = GET_GAME_TIMER()
//CPRINTLN(DEBUG_MINIGAME, "TLG - Player shot.")
SET_BITMASK_ENUM_AS_ENUM(sCMHDZData.sPlayerData[iPlayer].eReticuleBits, CMHDZ_RETICLE_BITS_IS_SHOOTING)
SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 20)
sCMHDZData.sPlayerData[iPlayer].bHasJustShot = TRUE
sCMHDZData.sPlayerData[iPlayer].sBulletData[sCMHDZData.sPlayerData[iPlayer].iProjectileIndex].vSpritePos = sCMHDZData.sPlayerData[iPlayer].vSpriteFinalReticlePos
sCMHDZData.sPlayerData[iPlayer].sBulletData[sCMHDZData.sPlayerData[iPlayer].iProjectileIndex].iSpriteBlastAnimFrame = 0
sCMHDZData.sPlayerData[iPlayer].sBulletData[sCMHDZData.sPlayerData[iPlayer].iProjectileIndex].bShot = TRUE
sCMHDZData.sPlayerData[iPlayer].iProjectileIndex = (sCMHDZData.sPlayerData[iPlayer].iProjectileIndex + 1) % ciCMHDZ_MAX_PROJECTILES
ENDIF
IF NOT bIsMenu
IF CMHDZ_GET_LOCAL_PLAYER_HEALTH() > 0.0
AND (sCMHDZData.iFade = 0.0) // bugstar://7148845
// Do not apply ammo deductions for the editor mode.
IF sCMHDZData.eClientState != CMHDZ_ARCADE_CLIENT_STATE_EDITOR_ACTIVE
CMHDZ_INCREASE_SHOT_FIRED_FOR_CURRENT_LEVEL()
CMHDZ_REDUCE_PLAYER_AMMO_IN_CLIP()
ENDIF
ENDIF
ELSE
// CMHDZ_HANDLE_PLAYER_SHOOTING_AUDIO(TRUE)
ENDIF
ENDIF
// IF sCMHDZData.eClientState = CMHDZ_ARCADE_CLIENT_STATE_PLAYING
// OR sCMHDZData.eClientState = CMHDZ_ARCADE_CLIENT_STATE_VIEW_LEADERBOARD
// OR sCMHDZData.eClientState = CMHDZ_ARCADE_CLIENT_STATE_EDIT_LEADERBOARD
IF !bIsMenu
IF CMHDZ_GET_LOCAL_PLAYER_HEALTH() > 0.0
// Reloading.
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RB)
OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
OR (IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
AND IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_AIM))
//-- Check for player reloading
IF NOT sCMHDZData.sPlayerData[0].bIsReloading[sCMHDZData.sPlayerData[0].weaponType]
sCMHDZData.sPlayerData[0].bIsReloading[sCMHDZData.sPlayerData[0].weaponType] = TRUE
ENDIF
ELIF CMHDZ_IS_PLAYER_THROWING()
IF (sCMHDZData.sPlayerData[0].projectileType != CMHDZ_PROJECTILE_NONE)
CMHDZ_INIT_THROWN_PLAYER_PROJECTILE(0, sCMHDZData.sPlayerData[0].projectileType, sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos)
ENDIF
ELSE
IF CMHDZ_GET_PLAYER_AMMO_IN_CLIP_FOR_CURRENT_WEAPON() = 0
AND NOT CMHDZ_DOES_PLAYER_CURRENT_WEAPON_HAVE_INFINITE_AMMO()
IF CMHDZ_GET_PLAYER_TOTAL_AMMO_IN_CURRENT_WEAPON(FALSE) > 0
//-- Check for player shootig empty weapon
// IF CMHDZ_IS_PLAYER_SHOOTING()
// CMHDZ_HANDLE_PLAYER_FIRING_EMPTY_WEAPON_AUDIO()
// ENDIF
ELSE
IF sCMHDZData.sPlayerData[0].weaponType = CMHDZ_PLAYER_WEAPON_TYPE_SPECIAL
CMHDZ_SET_PLAYER_WEAPON_TYPE(CMHDZ_PLAYER_WEAPON_TYPE_DEFAULT)
CMHDZ_SET_PLAYER_SPECIAL_WEAPON(CMHDZ_PLAYER_WEAPON_NONE, FALSE)
CMHDZ_INIT_PLAYER_SPECIAL_WEAPON()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
INT i
FOR i = 0 TO ciCMHDZ_MAX_PROJECTILES - 1
IF sCMHDZData.sPlayerData[iPlayer].sBulletData[i].bShot
sCMHDZData.sPlayerData[iPlayer].sBulletData[i].iSpriteBlastAnimFrame += sCMHDZData.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()
sCMHDZData.sPlayerData[iPlayer].sBulletData[i].vSpritePos.X -= CMHDZ_GET_PROJECTILE_UPDATE()
ENDIF
ENDIF
IF sCMHDZData.sPlayerData[iPlayer].sBulletData[i].iSpriteBlastAnimFrame >= ciCMHDZ_PLAYER_SHOT_MAX_ANIM_FRAMES
sCMHDZData.sPlayerData[iPlayer].sBulletData[i].bShot = FALSE
sCMHDZData.sPlayerData[iPlayer].sBulletData[i].bHit = FALSE
sCMHDZData.sPlayerData[iPlayer].sBulletData[i].bHitObject = FALSE
sCMHDZData.sPlayerData[iPlayer].sBulletData[i].bPlayedAudio = FALSE
sCMHDZData.sPlayerData[iPlayer].sBulletData[i].iSpriteBlastAnimFrame = 0
ENDIF
ENDIF
ENDFOR
//CMHDZ_PROCESS_NAILGUN_GUN_TEMP()
ENDPROC
PROC CMHDZ_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)
// fAxisThresholdMod = 0.5
//
// //Reticule 1
// IF fRightStickX < -cfSTICK_THRESHOLD * fAxisThresholdMod AND sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.x > 0.0
// sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.x -= 30 - (BOOL_TO_INT(sCMHDZData.sPlayerData[0].bHoveringEnemy) * 15)
// ELIF fRightStickX > cfSTICK_THRESHOLD * fAxisThresholdMod AND sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.x < (cfBASE_SCREEN_WIDTH - 40)
// sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.x += 30 - (BOOL_TO_INT(sCMHDZData.sPlayerData[0].bHoveringEnemy) * 15)
// ENDIF
//
// IF fRightStickY < -cfSTICK_THRESHOLD * fAxisThresholdMod AND sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.y > 20.0
// sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.y -= 30 - (BOOL_TO_INT(sCMHDZData.sPlayerData[0].bHoveringEnemy) * 15)
// ELIF fRightStickY > cfSTICK_THRESHOLD * fAxisThresholdMod AND sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.y < (cfBASE_SCREEN_HEIGHT - 40)
// sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.y += 30 - (BOOL_TO_INT(sCMHDZData.sPlayerData[0].bHoveringEnemy) * 15)
// ENDIF
CMHDZ_HANDLE_RETICULE_MOVEMENT(FALSE, TRUE)
////CPRINTLN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] RETICULE ", sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.x, ",", sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.y)
ENDPROC
/// PURPOSE:
/// Levels are split up into screens. Generally each full span is a single screen.
/// RETURNS: True when all stages complete
//FUNC INT CMHDZ_GET_SCREEN_PROGRESSION_VALUES()
//
// RETURN ROUND(((1920.0) * sCMHDZData.iCurrentScreen)*2.2)
//
//ENDFUNC
FUNC BOOL CMHDZ_MAINTAIN_PLAYER_CURRENT_LEVEL_PROGRESSION()
// Testing moved check
IF IS_MOVING_LEVEL()
IF CMHDZ_SHOULD_MOVING_LEVEL_STOP()
AND CMHDZ_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_SCREEN() > 0
AND NOT CMHDZ_IS_LEVEL_STOPPED()
IF sCMHDZData.iStaticScreenPhase <= 0
sCMHDZData.iStaticScreenPhase++
ENDIF
//IF CMHDZ_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_CURRENT_PHASE() > 0
IF sCMHDZData.eCurrentLevel != CMHDZ_LEVEL_SLAUGHTERHOUSE
CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Get_Ready)
ENDIF
CMHDZ_SET_HELP_TEXT_BIT(CMHDZ_HELP_TEXT_BIT_MICROAIM)
CMHDZ_SET_LEVEL_BIT_FOR_CURRENT_LEVEL(CMHDZ_LEVELS_BIT_STOPPED)
CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_MAINTAIN_PLAYER_CURRENT_LEVEL_PROGRESSION - CMHDZ_SET_LEVEL_BIT_FOR_CURRENT_LEVEL(CMHDZ_LEVELS_BIT_STOPPED) - sCMHDZData.iStaticScreenPhase: ", sCMHDZData.iStaticScreenPhase)
//ENDIF
ENDIF
ENDIF
// By default we increase the screen count every Set number of pixels
IF NOT CMHDZ_IS_LEVEL_STOPPED()
sCMHDZData.fOverallLevelProgression += (CMHDZ_GET_GENERAL_UPDATE())
// 1 is the minimum screen value so we count from there.
sCMHDZData.iCurrentScreen = FLOOR(sCMHDZData.fOverallLevelProgression/(cfCMHDZ_SCREEN_LENGTH))
ELSE //CMHDZ_IS_LEVEL_STOPPED()
IF CMHDZ_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_CURRENT_PHASE() <= 0
sCMHDZData.iStaticScreenPhase++
CDEBUG2LN(DEBUG_MINIGAME,"[BAZ] CMHDZ_MAINTAIN_PLAYER_CURRENT_LEVEL_PROGRESSION - sCMHDZData.iStaticScreenPhase = ", sCMHDZData.iStaticScreenPhase, " CMHDZ_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_CURRENT_PHASE = ", CMHDZ_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_CURRENT_PHASE())
ENDIF
IF CMHDZ_GET_CURRENT_LEVEL_SCREEN() >= CMHDZ_GET_FINAL_SCREEN_IN_CURRENT_LEVEL()
// Update the boss fight if we're in teh final level.
IF sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_SLAUGHTERHOUSE
IF CMHDZ_BEARSY_UPDATE()
//CMHDZ_RESET_SCREEN_TO_STOP_ON()
// check for round clear
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_PLAYER_COMPLETE_LEVEL)
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDIF
IF sCMHDZData.iStaticScreenPhase > CMHDZ_GET_STATIC_SCREEN_PHASE_COUNT()
//IF CMHDZ_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_CURRENT_SCREEN() = 0
//CDEBUG2LN(DEBUG_MINIGAME, "CMHDZ_MAINTAIN_PLAYER_CURRENT_LEVEL_PROGRESSION - update stage iEnemyLeftInStage = 0")
CMHDZ_RESET_SCREEN_TO_STOP_ON()
// check for round clear
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_PLAYER_COMPLETE_LEVEL)
RETURN TRUE
ENDIF
RETURN FALSE
ENDIF
IF sCMHDZData.iStaticScreenPhase > CMHDZ_GET_STATIC_SCREEN_PHASE_COUNT()
CMHDZ_CLEAR_LEVEL_BIT_FOR_LEVEL(sCMHDZData.eCurrentLevel, CMHDZ_LEVELS_BIT_STOPPED)
CDEBUG2LN(DEBUG_MINIGAME,"[BAZ] CMHDZ_MAINTAIN_PLAYER_CURRENT_LEVEL_PROGRESSION - Clearing flag - CMHDZ_GET_STATIC_SCREEN_PHASE_COUNT() = ", CMHDZ_GET_STATIC_SCREEN_PHASE_COUNT())
sCMHDZData.iTotalNumberOfEnemiesKilledForScreen = 0
sCMHDZData.iStaticScreenPhase = 0
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC CMHDZ_CHECK_PLAYER_PROGRESS()
IF sCMHDZData.eLevelState = CMHDZ_PLAY
IF CMHDZ_GET_LOCAL_PLAYER_HEALTH() <= 0.0 // OR sCMHDZData.sPlayerData[0].iAmmo <= 0
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_PLAYER_HEALTH_DEAD)
//CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_PLAYER_DEATH)
// sCMHDZData.bFadingOut = TRUE
sCMHDZData.eLevelState = CMHDZ_WAIT_FOR_DEAD
CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] [BAZ] sCMHDZData.eLevelState = WAIT_FOR_DEAD")
IF NOT IS_BIT_SET(sCMHDZData.iMusicBitset, ENUM_TO_INT(CMHDZ_MUSIC_BIT_STOPPED))
CMHDZ_TRIGGER_MUSIC_EVENT(CMHDZ_MUSIC_EVENT_STOP)
SET_BIT(sCMHDZData.iMusicBitset, ENUM_TO_INT(CMHDZ_MUSIC_BIT_STOPPED))
ENDIF
ELSE
IF CMHDZ_MAINTAIN_PLAYER_CURRENT_LEVEL_PROGRESSION()
CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] [GD] Level completed")
sCMHDZData.bLevelsCompleted[ENUM_TO_INT(sCMHDZData.eCurrentLevel)] = TRUE
sCMHDZData.bFadingOut = TRUE
sCMHDZData.eLevelState = CMHDZ_FADING_OUT
CMHDZ_ASIGN_STAR_RATING(sCMHDZData.eCurrentLevel)
IF CMHDZ_ARE_ALL_LEVELS_COMPLETE()
CMHDZ_MAINTAIN_PLAYER_AWARDS()
CMHDZ_SEND_TELEMETRY()
ELSE
CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Complete_Level)
ENDIF
ENDIF
ENDIF
ELIF sCMHDZData.eLevelState = CMHDZ_WAIT_FOR_DEAD
IF sCMHDZData.sPlayerData[0].iDeadTime = 0
sCMHDZData.sPlayerData[0].iDeadTime = GET_GAME_TIMER()
ELSE
IF GET_GAME_TIMER() - sCMHDZData.sPlayerData[0].iDeadTime >= ciCMHDZ_WAIT_FOR_DEAD_TIME
CMHDZ_STOP_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_GAMEPLAY)
CMHDZ_STOP_SOUND(CMHDZ_AUDIO_EFFECT_LEVEL_BACKGROUND_LOOP)
CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Player_Death)
CMHDZ_START_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_MENUS)
CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] [BAZ] CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_GAME_OVER)")
CMHDZ_SET_RESULT_SCREEN_STATE(CMHDZ_RESULT_SCREEN_STATE_INIT)
CMHDZ_ASIGN_STAR_RATING(sCMHDZData.eCurrentLevel)
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_GAME_OVER)
ENDIF
ENDIF
ELIF sCMHDZData.eLevelState = CMHDZ_FADING_OUT
IF sCMHDZData.iFade >= 255
CMHDZ_STOP_SOUND(CMHDZ_AUDIO_EFFECT_LEVEL_BACKGROUND_LOOP)
CMHDZ_STOP_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_GAMEPLAY)
CMHDZ_STOP_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_POWERUP_ACTIVE)
CMHDZ_CLEAR_PLAYER_BIT(CMHDZ_PLAYER_BIT_QUAD_DAMAGE)
CMHDZ_STOP_SOUND(CMHDZ_AUDIO_EFFECT_PICKUP_BUFF)
CMHDZ_CLEAR_PLAYER_BIT(CMHDZ_PLAYER_BIT_INVULNERABILE)
CMHDZ_STOP_SOUND(CMHDZ_AUDIO_EFFECT_PICKUP_SHIELD)
// Go to the result screen
CMHDZ_SET_RESULT_SCREEN_STATE(CMHDZ_RESULT_SCREEN_STATE_INIT)
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_RESULT_SCREEN)
ENDIF
ENDIF
ENDPROC
PROC CMHDZ_PROCESS_CLIENT_STATE_INIT()
ARCADE_CABINET_COMMON_INITIALIZATION()
CMHDZ_INIT_COLOUR_STRUCTS()
CMHDZ_INIT_MENU()
CMHDZ_INIT_PLAYER_WEAPON()
CMHDZ_INIT_BOSS_STRUCT()
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_FIB)
ENDPROC
// Process REQUESTING ASSETS
//PROC CMHDZ_PROCESS_CLIENT_STATE_REQUESTING_ASSETS()
//
// IF NOT CMHDZ_LOAD_ALL_TEXTURE_DICTS()
// CDEBUG2LN(DEBUG_MINIGAME, "CMHDZ_LOAD_ALL_TEXTURE_DICTS - Returning false")
// EXIT
// ENDIF
//
// IF NOT ARCADE_GAMES_POSTFX_REQUESTING_ASSETS()
// CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] [BAZ] CMHDZ_PROCESS_CLIENT_STATE_REQUESTING_ASSETS Loading POSTFX assets")
// EXIT
// ENDIF
//
// IF NOT REQUEST_SCRIPT_AUDIO_BANK("DLC_TUNER/DLC_Tuner_AM_CH")
// CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] [BAZ] CMHDZ_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Waiting for main audio")
// EXIT
// ENDIF
//
//// IF NOT REQUEST_SCRIPT_AUDIO_BANK("DLC_TUNER/DLC_Tuner_AM_CH_Enemy_Vocal")
//// CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] [BAZ] CMHDZ_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Waiting for enemy vocal audio")
//// EXIT
//// ENDIF
//
// IF NOT REQUEST_SCRIPT_AUDIO_BANK("DLC_TUNER/DLC_Tuner_AM_CH_Dir_Vocal")
// CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] [BAZ] CMHDZ_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Waiting for Director vocal audio")
// EXIT
// ENDIF
//
// #IF IS_DEBUG_BUILD
// #IF CMHDZ_CMDLINE_BOOT_INTO_EDITOR
// #IF CMHDZ_CMDLINE_EDITOR_NEW
// sCMHDZData.sEditor.bEditorActive = TRUE
// #ENDIF
// #ENDIF
//
// IF GET_COMMANDLINE_PARAM_EXISTS("sc_BadlandsSkipIntro") OR (CMHDZ_CMDLINE_NO_INTRO = 1)
// CMHDZ_START_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_MENUS)
// CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_TITLE_SCREEN)
// EXIT
// ENDIF
// #ENDIF
//
// //CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_FIB)
//
//ENDPROC
FUNC BOOL CMHDZ_PROCESS_CLIENT_STATE_REQUESTING_ASSETS()
IF NOT CMHDZ_LOAD_ALL_TEXTURE_DICTS()
CDEBUG2LN(DEBUG_MINIGAME, "CMHDZ_LOAD_ALL_TEXTURE_DICTS - Returning false")
RETURN FALSE
ENDIF
// IF NOT ARCADE_GAMES_POSTFX_REQUESTING_ASSETS()
// CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] [BAZ] CMHDZ_PROCESS_CLIENT_STATE_REQUESTING_ASSETS Loading POSTFX assets")
// RETURN FALSE
// ENDIF
IF NOT REQUEST_SCRIPT_AUDIO_BANK("DLC_TUNER/DLC_Tuner_AM_CH")
CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] [BAZ] CMHDZ_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Waiting for main audio")
RETURN FALSE
ENDIF
// IF NOT REQUEST_SCRIPT_AUDIO_BANK("DLC_TUNER/DLC_Tuner_AM_CH_Enemy_Vocal")
// CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] [BAZ] CMHDZ_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Waiting for enemy vocal audio")
// EXIT
// ENDIF
IF NOT REQUEST_SCRIPT_AUDIO_BANK("DLC_TUNER/DLC_Tuner_AM_CH_Dir_Vocal")
CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] [BAZ] CMHDZ_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Waiting for Director vocal audio")
RETURN FALSE
ENDIF
#IF IS_DEBUG_BUILD
#IF CMHDZ_CMDLINE_BOOT_INTO_EDITOR
#IF CMHDZ_CMDLINE_EDITOR_NEW
sCMHDZData.sEditor.bEditorActive = TRUE
#ENDIF
#ENDIF
IF GET_COMMANDLINE_PARAM_EXISTS("sc_BadlandsSkipIntro") OR (CMHDZ_CMDLINE_NO_INTRO = 1)
CMHDZ_START_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_MENUS)
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_TITLE_SCREEN)
RETURN FALSE
ENDIF
#ENDIF
//CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_FIB)
RETURN TRUE
ENDFUNC
//-- Process intro Bink movie
PROC CMHDZ_PROCESS_CLIENT_INTRO()
//Wait for the intro movie to finish
CMHDZ_DRAW_MENU_BACKGROUND()
FLOAT fRatioWidth = 1.0 * GET_ASPECT_RATIO_MODIFIER_FROM_ASPECT_RATIO()
FLOAT fRatioHeight = 1.0
BOOL bMovieFinished = CMHDZ_DRAW_MOVIE_SEQUENCE(sCMHDZData.bmIdCmhdzIntro, fRatioWidth, fRatioHeight)
// ARCADE_GAMES_POSTFX_DRAW()
CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_PROCESS_CLIENT_INTRO - Movie time: ", GET_BINK_MOVIE_TIME(sCMHDZData.bmIdCmhdzIntro))
IF ARE_ANY_CONTROLS_BEING_PRESSED()
CMHDZ_START_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_MENUS)
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_TITLE_SCREEN)
//SET_BINK_MOVIE_TIME(sCMHDZData.bmIdCmhdzIntro, 99.0)
//CMHDZ_START_MOVIE_FORCE(sCMHDZData.bmIdCmhdzIntro, "CMHDZ_Intro_Static")
CMHDZ_STOP_TITLE_INTRO_MOVIE(sCMHDZData.bmIdCmhdzIntro)
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_Logo_Appear)
TWS_DRAW_FRONT_FX()
EXIT
ENDIF
IF NOT bMovieFinished
// //CDEBUG2LN(DEBUG_MINIGAME, "{DSW} [CMHDZ_PROCESS_CLIENT_INTRO] Movie Time: ", GET_BINK_MOVIE_TIME(sCMHDZData.bmIdCmhdzIntro))
IF NOT IS_BIT_SET(sCMHDZData.iMusicBitset, ENUM_TO_INT(CMHDZ_MUSIC_BIT_STARTED_INTRO))
//IF GET_BINK_MOVIE_TIME(sCMHDZData.bmIdCmhdzIntro) >= 0.0
CMHDZ_TRIGGER_MUSIC_EVENT(CMHDZ_MUSIC_EVENT_INTRO)
//DG_START_MOVIE()
SET_BIT(sCMHDZData.iMusicBitset, ENUM_TO_INT(CMHDZ_MUSIC_BIT_STARTED_INTRO))
//ENDIF
ENDIF
TWS_DRAW_FRONT_FX()
EXIT // Stop further progress.
ENDIF
//SCRIPT_ASSERT("[CMHDZ][BAZ] CMHDZ_PROCESS_CLIENT_INTRO")
CMHDZ_DRAW_MENU_BACKGROUND()
CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_TITLES), "CAMHEDZ_TITLE_SCREEN_CHARACTER",
INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, (cfBASE_SCREEN_HEIGHT/2)), INIT_VECTOR_2D(782, 1080), 0, sCMHDZData.rgbaSprite)
//CMHDZ_START_MOVIE_FORCE(sCMHDZData.bmIdCmhdzIntro, "CMHDZ_Intro_Static")
CMHDZ_STOP_TITLE_INTRO_MOVIE(sCMHDZData.bmIdCmhdzIntro)
CMHDZ_START_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_MENUS)
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_Logo_Appear)
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_TITLE_SCREEN)
TWS_DRAW_FRONT_FX()
ENDPROC
PROC CMHDZ_PROCESS_CLIENT_STATE_FIB
CMHDZ_DRAW_MENU_BACKGROUND()
CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ][BAZ] CMHDZ_PROCESS_CLIENT_STATE_FIB")
// CMHDZ_DRAW_GAME_SPRITE(sCMHDZData.tl31BaseTextDict, "ARCADE_FIB", INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), INIT_VECTOR_2D(cfCMHDZ_FIB_SCREEN_WIDTH, cfCMHDZ_FIB_SCREEN_HEIGHT), 0, sCMHDZData.rgbaSprite)
CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_FACADE), "BADLANDS_PSA_SCREEN", INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), INIT_VECTOR_2D(cfCMHDZ_PSA_SCREEN_WIDTH, cfCMHDZ_PSA_SCREEN_HEIGHT), 0, sCMHDZData.rgbaSprite)
TWS_DRAW_FRONT_FX()
IF NOT CMHDZ_PROCESS_CLIENT_STATE_REQUESTING_ASSETS()
EXIT
ENDIF
IF sCMHDZData.iTimer = 0
sCMHDZData.iTimer = GET_GAME_TIMER()
ELSE
IF GET_GAME_TIMER() - sCMHDZData.iTimer > 5000
OR CMHDZ_IS_PLAYER_SHOOTING()
DG_START_MOVIE(sCMHDZData.bmIdCmhdzIntro, "CMHDZ_Intro") // _1992_DegenatronLogo_720_auto
sCMHDZData.iTimer = 0
ARCADE_GAMES_HELP_TEXT_CLEAR()
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_INTRO)
ENDIF
ENDIF
ENDPROC
// Process TITLE SCREEN
PROC CMHDZ_PROCESS_CLIENT_STATE_TITLE_SCREEN()
ARCADE_GAMES_HELP_TEXT_PRINT_FOREVER(ARCADE_GAMES_HELP_TEXT_ENUM_CMHDZ_HELP_MENU)
CMHDZ_TRIGGER_TITLE_MUSIC()
CMHDZ_HANDLE_PLAYER_SHOOTING(0, TRUE)
CMHDZ_PROCESS_MENU_CONTROLS()
CMHDZ_DRAW_CLIENT_STATE_TITLE_SCREEN()
ENDPROC
PROC CMHDZ_PROCESS_CLIENT_STATE_TITLE_SCREEN_FADE_OUT()
ARCADE_GAMES_HELP_TEXT_PRINT_FOREVER(ARCADE_GAMES_HELP_TEXT_ENUM_CMHDZ_HELP_MENU)
FLOAT fRatioWidth = 1.0 * GET_ASPECT_RATIO_MODIFIER_FROM_ASPECT_RATIO()
FLOAT fRatioHeight = 1.0
IF DG_DRAW_MOVIE(sCMHDZData.bmIdCmhdzIntro, fRatioWidth, fRatioHeight)
//#IF IS_DEBUG_BUILD
OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
OR IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_ATTACK)
//#ENDIF
//sCMHDZData.fSyncOffsetY = 700
CMHDZ_STOP_TITLE_INTRO_MOVIE(sCMHDZData.bmIdCmhdzIntro)
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_LEVEL_SELECTION_MENU)
ENDIF
IF GET_BINK_MOVIE_TIME(sCMHDZData.bmIdCmhdzIntro) <= 5.0
ARCADE_DRAW_PIXELSPACE_RECT(INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/2), INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_HEIGHT), sCMHDZData.rgbaBlack)
CMHDZ_DRAW_GAME_SPRITE_DETAILS(CMHDZ_GET_TEXTURE_DICT_NAME(CMHDZ_TEXDICT_CH_TITLES), "CAMHEDZ_TITLE_SCREEN_CHARACTER",
INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, (cfBASE_SCREEN_HEIGHT/2)), INIT_VECTOR_2D(782, 1080), 0, sCMHDZData.rgbaSprite)
ENDIF
TWS_DRAW_FRONT_FX()
ENDPROC
// Process STATE MENU
PROC CMHDZ_PROCESS_CLIENT_STATE_LEVEL_SELECT_MENU()
ARCADE_GAMES_HELP_TEXT_PRINT_FOREVER(ARCADE_GAMES_HELP_TEXT_ENUM_CMHDZ_HELP_MENU)
CMHDZ_TRIGGER_TITLE_MUSIC()
CMHDZ_PROCESS_MENU_CONTROLS()
CMHDZ_HANDLE_PLAYER_SHOOTING(0, TRUE)
CMHDZ_DRAW_CLIENT_STATE_MENU()
CMHDZ_CHECK_PLAYER_RETURNING_TO_MENU(TRUE)
ENDPROC
// Process INIT LEVEL
PROC CMHDZ_PROCESS_CLIENT_STATE_INIT_LEVEL()
#IF IS_DEBUG_BUILD
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_PROCESS_CLIENT_STATE_INIT_LEVEL] {DSW} Called. Level: ", CMHDZ_LEVELS_TO_STRING(CMHDZ_GET_CURRENT_LEVEL()))
#ENDIF
ARCADE_GAMES_HELP_TEXT_CLEAR()
//-- Need to still draw the menu during this frame
CMHDZ_DRAW_MENU_BACKGROUND()
TWS_DRAW_FRONT_FX()
//CMHDZ_DRAW_CLIENT_STATE_MENU()
TEXT_LABEL_31 tl31TextDict = CMHDZ_GET_TEXTURE_DICTIONARY_FOR_LEVEL(sCMHDZData.eCurrentLevel)
REQUEST_STREAMED_TEXTURE_DICT(tl31TextDict)
IF NOT HAS_STREAMED_TEXTURE_DICT_LOADED(tl31TextDict)
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] {dsw} CMHDZ_PROCESS_CLIENT_STATE_INIT_LEVEL - Loading ", tl31TextDict)
EXIT
ENDIF
INT i
// Reset Counter Variables
CMHDZ_CLEANUP_VARIABLES()
CMHDZ_INIT_COVER_POINTS(sCMHDZData.eCurrentLevel)
CMHDZ_INIT_ENEMIES()
CMHDZ_INIT_PLAYERS()
CMHDZ_INIT_BACKGROUND(sCMHDZData.eCurrentLevel)
CMHDZ_INIT_ITEMS()
CMHDZ_INIT_PLAY_VARIABLES()
CMHDZ_INIT_SOUND()
CMHDZ_INIT_BOSS_STRUCT()
CMHDZ_RESET_LOCAL_PLAYER_SCORE_FOR_CURRENT_LEVEL()
CMHDZ_STOP_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_MENUS)
CMHDZ_START_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_GAMEPLAY)
sCMHDZData.iLocalLevelRunningTime = GET_GAME_TIMER()
sCMHDZData.iLevelBitset[ENUM_TO_INT(sCMHDZData.eCurrentLevel)] = 0
sCMHDZData.iTotalLevelShots[sCMHDZData.eCurrentLevel] = 0
sCMHDZData.iTotalLevelEnemyHits[sCMHDZData.eCurrentLevel] = 0
sCMHDZData.iTotalLevelEnemyHeadShots[sCMHDZData.eCurrentLevel] = 0
sCMHDZData.iTotalPowerupsCollected[sCMHDZData.eCurrentLevel] = 0
sCMHDZData.iStaggeredOnScreenViableCoverCount = 0
CMHDZ_RESET_SCREEN_TO_STOP_ON()
REPEAT ciCMHDZ_MAX_LANES i
sCMHDZData.iCurrentActiveEnemies[i] = 0
sCMHDZData.iTimeSinceEnemyActive[i] = 0
ENDREPEAT
sCMHDZData.iResultsScreenTimer = 0
sCMHDZData.iResultsScreenTimeout = 0
sCMHDZData.iReturnToMenuTimeout = 0
sCMHDZData.iTotalNumberOfEnemiesKilledForScreen = 0
// New progression trackers
sCMHDZData.fOverallLevelProgression = 0.0
sCMHDZData.iStaticScreenPhase = 0
sCMHDZData.iCurrentScreen = FLOOR(sCMHDZData.fOverallLevelProgression/cfCMHDZ_SCREEN_LENGTH)
CMHDZ_CLEAR_LEVEL_BIT_FOR_LEVEL(sCMHDZData.eCurrentLevel, CMHDZ_LEVELS_BIT_STOPPED)
CMHDZ_CLEAR_LEVEL_BIT_FOR_LEVEL(sCMHDZData.eCurrentLevel, CMHDZ_LEVELS_BIT_DONE_RESULTS_SCREEN_AUDIO)
CMHDZ_CLEAR_LEVEL_BIT_FOR_LEVEL(sCMHDZData.eCurrentLevel, CMHDZ_LEVELS_BIT_ADDED_ON_ACCURACY_BONUS)
CMHDZ_CLEAR_LEVEL_BIT_FOR_LEVEL(sCMHDZData.eCurrentLevel, CMHDZ_LEVELS_BIT_PLAYED_DEATH_SCREEN_AUDIO)
CMHDZ_CLEAR_LEVEL_BIT_FOR_LEVEL(sCMHDZData.eCurrentLevel, CMHDZ_LEVELS_BIT_PLAYED_ACCURACY_SCORE_AUDIO)
CMHDZ_CLEAR_LEVEL_BIT_FOR_LEVEL(sCMHDZData.eCurrentLevel, CMHDZ_LEVELS_BIT_PLAYED_RESULTS_SCORE_AUDIO)
CMHDZ_CLEAR_LEVEL_BIT_FOR_LEVEL(sCMHDZData.eCurrentLevel, CMHDZ_LEVELS_BIT_PLAYED_DEATH_SCREEN_AUDIO)
IF sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_SCRAPYARD
OR sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_ASYLUM
CMHDZ_CLEAR_LEVEL_BIT_FOR_LEVEL(sCMHDZData.eCurrentLevel, CMHDZ_LEVELS_BIT_CHALLENGE_MONKEY_C_MONKEY_DIE_BUNNY_KILL)
ENDIF
IF sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_PARK
OR sCMHDZData.eCurrentLevel = CMHDZ_LEVEL_CITY
CMHDZ_CLEAR_LEVEL_BIT_FOR_LEVEL(sCMHDZData.eCurrentLevel, CMHDZ_LEVELS_BIT_CHALLENGE_MONKEY_C_MONKEY_DIE_MONKEY_KILL)
ENDIF
IF CMHDZ_GET_LOCAL_PLAYER_HI_SCORE_FOR_LEVEL(CMHDZ_GET_CURRENT_LEVEL_AS_INT()) > 0
CMHDZ_SET_LEVEL_BIT_FOR_CURRENT_LEVEL(CMHDZ_LEVELS_BIT_REPLAYING_LEVEL)
ENDIF
CLEAR_BIT(sCMHDZData.iMusicBitset, ENUM_TO_INT(CMHDZ_MUSIC_BIT_STARTED_TITLE))
CLEAR_BIT(sCMHDZData.iMusicBitset, ENUM_TO_INT(CMHDZ_MUSIC_BIT_STOPPED))
CLEAR_BIT(sCMHDZData.iMusicBitset, ENUM_TO_INT(CMHDZ_MUSIC_BIT_DEATH))
ARCADE_GAMES_HELP_TEXT_CLEAR()
sAGHelpText.iCurrentHelpTextExpiry = NATIVE_TO_INT(GET_NETWORK_TIME()) + 4000
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_PLAYING)
CMHDZ_PREPARE_MUSIC_EVENT(CMHDZ_MUSIC_EVENT_DEATH)
CMHDZ_PREPARE_MUSIC_EVENT(CMHDZ_MUSIC_EVENT_HIT)
CMHDZ_PREPARE_MUSIC_EVENT(CMHDZ_MUSIC_EVENT_HIT_ALT)
// Set up help text string
CMHDZ_SET_HELP_TEXT_BIT(CMHDZ_HELP_TEXT_BIT_SHOOT_AIM)
CMHDZ_SET_HELP_TEXT_BIT(CMHDZ_HELP_TEXT_BIT_THROW)
ENDPROC
// Process PLAYING
PROC CMHDZ_PROCESS_CLIENT_STATE_PLAYING()
#IF IS_DEBUG_BUILD
IF (sCMHDZData.bDebugPause)
CMHDZ_DRAW_CLIENT_STATE_PLAYING()
EXIT
ENDIF
#ENDIF
// //CMHDZ_REPLAY_SYSTEM_UPDATE()
// IF CMHDZ_IS_REPLAY_SYSTEM_PLAYING_BACK()
// CMHDZ_DRAW_CLIENT_STATE_PLAYING()
// EXIT
// ENDIF
CMHDZ_HANDLE_ENEMIES()
CMHDZ_HANDLE_THROWN_ENEMY_PROJECTILES()
CMHDZ_HANDLE_PLAYER_SHOOTING(0)
CMHDZ_HANDLE_THROWN_PLAYER_PROJECTILES(0)
CMHDZ_HANDLE_PLAYER_RELOADING()
CMHDZ_HANDLE_PLAYER_MOVEMENT()
CMHDZ_HANDLE_PLAYER_ABILITIES()
CMHDZ_HANDLE_FX()
CMHDZ_CHECK_PLAYER_PROGRESS()
CMHDZ_DRAW_CLIENT_STATE_PLAYING()
CMHDZ_HANDLE_LOOPING_AUDIO()
CMHDZ_MAINTAIN_HELP_TEXT()
#IF IS_DEBUG_BUILD
IF GET_COMMANDLINE_PARAM_EXISTS("sc_BadlandsReturnToMenuInGame") OR (CMHDZ_CMDLINE_RTN_TO_MENU_IN_GAME = 1)
CMHDZ_CHECK_PLAYER_RETURNING_TO_MENU(TRUE)
ENDIF
#ENDIF
ENDPROC
// Process PLAYING
PROC CMHDZ_PROCESS_CLIENT_STATE_EDITOR_ACTIVE()
#IF IS_DEBUG_BUILD
#IF CMHDZ_CMDLINE_EDITOR_NEW
IF (sCMHDZData.sEditor.bPlayStage)
CMHDZ_PROCESS_CLIENT_STATE_PLAYING()
ELSE
CMHDZ_HANDLE_RETICULE_MOVEMENT(FALSE)
//CDEBUG2LN(DEBUG_MINIGAME, "[BAZ]CMHDZ_PROCESS_CLIENT_STATE_EDITOR_ACTIVE - CMHDZ_HANDLE_RETICULE_MOVEMENT")
CMHDZ_DRAW_CLIENT_STATE_EDITOR_ACTIVE()
ENDIF
EXIT
#ENDIF
#ENDIF
// if the editor isn't defined and somehow we end up here - reset the stage
CMHDZ_PROCESS_CLIENT_STATE_INIT_LEVEL()
ENDPROC
FUNC BOOL CMHDZ_IS_SCORE_POOR_FOR_CURRENT_LEVEL()
INT iScore = CMHDZ_GET_LOCAL_PLAYER_SCORE_FOR_LEVEL(CMHDZ_GET_CURRENT_LEVEL_AS_INT())
SWITCH CMHDZ_GET_CURRENT_LEVEL()
CASE CMHDZ_LEVEL_CITY
RETURN iScore < 1000
BREAK
CASE CMHDZ_LEVEL_SCRAPYARD
RETURN iScore < 1000
BREAK
CASE CMHDZ_LEVEL_ASYLUM
RETURN iScore < 1000
BREAK
CASE CMHDZ_LEVEL_PARK
RETURN iScore < 1000
BREAK
CASE CMHDZ_LEVEL_SLAUGHTERHOUSE
RETURN iScore < 1000
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL CMHDZ_IS_SCORE_AVERAGE_FOR_CURRENT_LEVEL()
INT iScore = CMHDZ_GET_LOCAL_PLAYER_SCORE_FOR_LEVEL(CMHDZ_GET_CURRENT_LEVEL_AS_INT())
SWITCH CMHDZ_GET_CURRENT_LEVEL()
CASE CMHDZ_LEVEL_CITY
RETURN iScore < 1500
BREAK
CASE CMHDZ_LEVEL_SCRAPYARD
RETURN iScore < 1500
BREAK
CASE CMHDZ_LEVEL_ASYLUM
RETURN iScore < 1500
BREAK
CASE CMHDZ_LEVEL_PARK
RETURN iScore < 1500
BREAK
CASE CMHDZ_LEVEL_SLAUGHTERHOUSE
RETURN iScore < 1500
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL CMHDZ_IS_SCORE_BELOW_MAX_FOR_CURRENT_LEVEL()
INT iScore = CMHDZ_GET_LOCAL_PLAYER_SCORE_FOR_LEVEL(CMHDZ_GET_CURRENT_LEVEL_AS_INT())
SWITCH CMHDZ_GET_CURRENT_LEVEL()
CASE CMHDZ_LEVEL_CITY
RETURN iScore < 10000
BREAK
CASE CMHDZ_LEVEL_SCRAPYARD
RETURN iScore < 10000
BREAK
CASE CMHDZ_LEVEL_ASYLUM
RETURN iScore < 10000
BREAK
CASE CMHDZ_LEVEL_PARK
RETURN iScore < 20000
BREAK
CASE CMHDZ_LEVEL_SLAUGHTERHOUSE
RETURN iScore < 100000
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL CMHDZ_IS_SCORE_ABOVE_MAX_FOR_CURRENT_LEVEL()
INT iScore = CMHDZ_GET_LOCAL_PLAYER_SCORE_FOR_LEVEL(CMHDZ_GET_CURRENT_LEVEL_AS_INT())
SWITCH CMHDZ_GET_CURRENT_LEVEL()
CASE CMHDZ_LEVEL_CITY
RETURN iScore >= 10000
BREAK
CASE CMHDZ_LEVEL_SCRAPYARD
RETURN iScore >= 10000
BREAK
CASE CMHDZ_LEVEL_ASYLUM
RETURN iScore >= 10000
BREAK
CASE CMHDZ_LEVEL_PARK
RETURN iScore >= 20000
BREAK
CASE CMHDZ_LEVEL_SLAUGHTERHOUSE
RETURN iScore >= 100000
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC CMHDZ_PROCESS_CLIENT_STATE_GAME_OVER()
// Reset screen effects
IF sCMHDZData.fSyncOffsetY != 0.0
AND (sCMHDZData.eResultState != CMHDZ_RESULT_SCREEN_STATE_REWIND)
INIT_RGBA_STRUCT(sCMHDZData.rgbaSprite, 255, 255, 255, 255)
sCMHDZData.fSyncOffsetY = 0.0
ENDIF
CMHDZ_PROCESS_MENU_CONTROLS()
CMHDZ_HANDLE_PLAYER_SHOOTING(0, TRUE)
//CMHDZ_REPLAY_SYSTEM_UPDATE()
CMHDZ_DRAW_CLIENT_STATE_GAME_OVER()
IF (sCMHDZData.eResultState = CMHDZ_RESULT_SCREEN_STATE_COMPLETE)
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_MENU_CONTINUE)
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_INIT_LEVEL)
ENDIF
IF (sCMHDZData.eResultState = CMHDZ_RESULT_SCREEN_STATE_GOTO_LEADERBOARD)
IF sCMHDZData.bSkipLeaderboard
CMHDZ_CHECK_PLAYER_RETURNING_TO_MENU(FALSE, TRUE, DEFAULT, TRUE)
ELSE
CMHDZ_INIT_GOTO_LEADERBOARD()
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_EDIT_LEADERBOARD)
ENDIF
ENDIF
ENDPROC
// Process RESULT SCREEN
PROC CMHDZ_PROCESS_CLIENT_STATE_RESULT_SCREEN()
BOOL bDoFinalScene
BOOL bShouldGoToLeaderboard
STRING sSubtitles
IF sCMHDZData.iResultsScreenTimer = 0
sCMHDZData.iResultsScreenTimer = GET_GAME_TIMER()
ENDIF
IF CMHDZ_ARE_ALL_LEVELS_COMPLETE() AND NOT sCMHDZData.bPlayedOutro
bDoFinalScene = TRUE
ENDIF
#IF IS_DEBUG_BUILD
IF GET_COMMANDLINE_PARAM_EXISTS("sc_badlandsForceOutro") OR (CMHDZ_CMDLINE_FORCE_OUTRO = 1)
bDoFinalScene = TRUE
ENDIF
#ENDIF
// Fix the screen jump
// IF sCMHDZData.fSyncOffsetY > 0
// sCMHDZData.fSyncOffsetY -= (0.0+@GET_RANDOM_FLOAT_IN_RANGE(2500.0,4000.0))
// ELSE
// sCMHDZData.fSyncOffsetY = 0.0
// ENDIF
SWITCH (sCMHDZData.eResultState)
CASE CMHDZ_RESULT_SCREEN_STATE_INIT
//sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos = INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/3, cfBASE_SCREEN_HEIGHT/3)
//CMHDZ_REPLAY_SYSTEM_STOP_RECORDING()
// Display the subtitle if language isn't English
IF GET_CURRENT_LANGUAGE() != LANGUAGE_ENGLISH
sSubtitles = "CMHDZ_LVW1"
SWITCH sCMHDZData.eCurrentLevel
CASE CMHDZ_LEVEL_CITY
sSubtitles = "CMHDZ_LVW1"
BREAK
CASE CMHDZ_LEVEL_SCRAPYARD
sSubtitles = "CMHDZ_LVW2"
BREAK
CASE CMHDZ_LEVEL_ASYLUM
sSubtitles = "CMHDZ_LVW3"
BREAK
CASE CMHDZ_LEVEL_PARK
sSubtitles = "CMHDZ_LVW4"
BREAK
CASE CMHDZ_LEVEL_SLAUGHTERHOUSE
sSubtitles = "CMHDZ_LVW5"
BREAK
ENDSWITCH
PRINT_NOW(sSubtitles, 8000, 1)
ENDIF
CMHDZ_SET_RESULT_SCREEN_STATE(CMHDZ_RESULT_SCREEN_STATE_COMPLETE)
BREAK
CASE CMHDZ_RESULT_SCREEN_STATE_COMPLETE
// INT i
IF sCMHDZData.sPlayerData[0].fHealth <= 0.0
bShouldGoToLeaderboard = TRUE
IF NOT IS_BIT_SET(sCMHDZData.iMusicBitset, ENUM_TO_INT(CMHDZ_MUSIC_BIT_DEATH))
CMHDZ_TRIGGER_MUSIC_EVENT(CMHDZ_MUSIC_EVENT_DEATH)
SET_BIT(sCMHDZData.iMusicBitset, ENUM_TO_INT(CMHDZ_MUSIC_BIT_DEATH))
ENDIF
// //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_PROCESS_CLIENT_STATE_RESULT_SCREEN] {DSW} bShouldGoToLeaderboard = TRUE Player health: ", sCMHDZData.sPlayerData[0].fHealth)
ELSE
//IF CMHDZ_ARE_ALL_LEVELS_COMPLETE() AND NOT sCMHDZData.bPlayedOutro
IF bDoFinalScene
IF (GET_GAME_TIMER() - sCMHDZData.iResultsScreenTimer ) > 14000
OR (GET_GAME_TIMER() - sCMHDZData.iResultsScreenTimer ) > 2000
AND CMHDZ_CHECK_FOR_MENU_PROGRESS_BUTTON()
DG_START_MOVIE(sCMHDZData.bmIdCmhdzOutro, "CMHDZ_Outro")
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_OUTRO_MOVIE)
ENDIF
ELSE
IF (GET_GAME_TIMER() - sCMHDZData.iResultsScreenTimer) > 2000
CMHDZ_CHECK_PLAYER_RETURNING_TO_MENU(FALSE, TRUE, DEFAULT, TRUE)
ENDIF
ENDIF
//-- Audio for results screen
IF NOT CMHDZ_IS_LEVEL_BIT_SET_FOR_CURRENT_LEVEL(CMHDZ_LEVELS_BIT_DONE_RESULTS_SCREEN_AUDIO)
// IF CMHDZ_IS_SCORE_POOR_FOR_CURRENT_LEVEL()
// CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_PLAYER_SCORE_BAD)
// ELIF CMHDZ_IS_SCORE_AVERAGE_FOR_CURRENT_LEVEL()
// CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_PLAYER_SCORE_AVERAGE)
//EL
IF CMHDZ_IS_SCORE_BELOW_MAX_FOR_CURRENT_LEVEL()
//CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_PLAYER_SCORE_GOOD)
CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Score_Ok)
ELIF CMHDZ_IS_SCORE_ABOVE_MAX_FOR_CURRENT_LEVEL()
CMHDZ_PLAY_DIRECTOR_DIALOGUE(CMHDZ_AUDIO_EFFECT_DIRECTOR_Score_Good)
ENDIF
CMHDZ_SET_LEVEL_BIT_FOR_CURRENT_LEVEL(CMHDZ_LEVELS_BIT_DONE_RESULTS_SCREEN_AUDIO)
ENDIF
ENDIF
IF bShouldGoToLeaderboard
IF sCMHDZData.bSkipLeaderboard
CMHDZ_CHECK_PLAYER_RETURNING_TO_MENU(FALSE, TRUE, DEFAULT, TRUE)
ELSE
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
OR (GET_GAME_TIMER() - sCMHDZData.iResultsScreenTimer ) > 14000
CMHDZ_INIT_GOTO_LEADERBOARD()
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_EDIT_LEADERBOARD)
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
CMHDZ_DRAW_CLIENT_STATE_RESULT_SCREEN(bDoFinalScene)
ENDPROC
PROC CMHDZ_PROCESS_CLIENT_STATE_OUTRO_MOVIE()
CMHDZ_DRAW_MENU_BACKGROUND()
FLOAT fRatioWidth = 1.0 * GET_ASPECT_RATIO_MODIFIER_FROM_ASPECT_RATIO()
FLOAT fRatioHeight = 1.0
BOOL bMovieFinished = DG_DRAW_MOVIE(sCMHDZData.bmIdCmhdzOutro, fRatioWidth, fRatioHeight)
IF NOT bMovieFinished
////CDEBUG2LN(DEBUG_MINIGAME, "{DSW} [CMHDZ_PROCESS_CLIENT_STATE_OUTRO_MOVIE] Movie Time: ", GET_BINK_MOVIE_TIME(sCMHDZData.bmIdCmhdzOutro))
IF NOT sCMHDZData.bPlayedOutroAudio
IF GET_BINK_MOVIE_TIME(sCMHDZData.bmIdCmhdzOutro) >= 78.0
CMHDZ_PLAY_SOUND_AND_RELEASE_NO_POSITION(CMHDZ_AUDIO_EFFECT_PLAYER_FINISH_GAME)
sCMHDZData.bPlayedOutroAudio = TRUE
ENDIF
ENDIF
CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_PROCESS_CLIENT_STATE_OUTRO_MOVIE - Outro movie is running.")
TWS_DRAW_FRONT_FX()
EXIT
ENDIF
sCMHDZData.bPlayedOutro = TRUE
IF NOT sCMHDZData.bSkipLeaderboard
CMHDZ_INIT_GOTO_LEADERBOARD()
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_EDIT_LEADERBOARD)
//CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_VIEW_LEADERBOARD)
ELSE
CMHDZ_START_MOVIE_FORCE(sCMHDZData.bmIdCmhdzIntro, "CMHDZ_Intro")
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_TITLE_SCREEN)
ENDIF
TWS_DRAW_FRONT_FX()
ENDPROC
PROC CMHDZ_PROCESS_CLIENT_STATE_VIEW_LEADERBOARD()
CMHDZ_DRAW_CLIENT_STATE_LEADERBOARD()
CMHDZ_CHECK_PLAYER_RETURNING_TO_MENU(TRUE, TRUE, TRUE)
ENDPROC
PROC CMHDZ_PROCESS_CLIENT_STATE_EDIT_LEADERBOARD()
CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ][BAZ] CMHDZ_PROCESS_CLIENT_STATE_EDIT_LEADERBOARD - Processing leaderboard entry")
CMHDZ_TRIGGER_TITLE_MUSIC()
INT iPlayerScore
// INT iPlayerScore = 50000//CMHDZ_GET_LOCAL_PLAYER_TOTAL_SCORE()
// playerBd[PARTICIPANT_ID_TO_INT()].iLeaderboardScore = iPlayerScore
IF playerBd[PARTICIPANT_ID_TO_INT()].iLeaderboardScore != CMHDZ_GET_LOCAL_PLAYER_TOTAL_SCORE()
playerBd[PARTICIPANT_ID_TO_INT()].iLeaderboardScore = CMHDZ_GET_LOCAL_PLAYER_TOTAL_SCORE()
ENDIF
iPlayerScore = playerBd[PARTICIPANT_ID_TO_INT()].iLeaderboardScore
BOOL bServerReady = IS_BIT_SET(cmhdzServerBd.iSortLbForPart, PARTICIPANT_ID_TO_INT())
//ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY(sCMHDZData.sLbData, cmhdzServerBd.sLeaderboard, playerBd, playerBd[PARTICIPANT_ID_TO_INT()].iLeaderboardInitials, iPlayerScore, bServerReady)
ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY(sCMHDZData.sLbData, cmhdzServerBd.sLeaderboard, playerBd[PARTICIPANT_ID_TO_INT()].iLeaderboardInitials, iPlayerScore, bServerReady)
CMHDZ_DRAW_CLIENT_STATE_LEADERBOARD()
IF NOT sCMHDZData.sLbData.bEditing
CMHDZ_RESET_LOCAL_PLAYER_SCORE_FOR_CURRENT_LEVEL()
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_VIEW_LEADERBOARD)
ENDIF
ENDPROC
// Process CLEANUP
PROC CMHDZ_CLEANUP_AND_EXIT_CLIENT()
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_CLEANUP_AND_EXIT_CLIENT] - Cleaning up and terminating the script")
CMHDZ_CANCEL_MUSIC_EVENT(CMHDZ_MUSIC_EVENT_DEATH)
CMHDZ_CANCEL_MUSIC_EVENT(CMHDZ_MUSIC_EVENT_HIT)
CMHDZ_CANCEL_MUSIC_EVENT(CMHDZ_MUSIC_EVENT_HIT_ALT)
CMHDZ_CANCEL_MUSIC_EVENT(CMHDZ_GET_MUSIC_EVENT_FOR_LEVEL(sCMHDZData.eCurrentLevel))
CMHDZ_TRIGGER_MUSIC_EVENT(CMHDZ_MUSIC_EVENT_STOP)
#IF IS_DEBUG_BUILD
#IF CMHDZ_CMDLINE_EDITOR_NEW
CLEANUP_MENU_ASSETS()
#ENDIF
#ENDIF
IF NETWORK_IS_HOST_OF_THIS_SCRIPT()
CMHDZ_SEND_TELEMETRY()
ENDIF
sCMHDZData.sArcadeAnimData.bHoldLastFrame = FALSE
sCMHDZData.sArcadeAnimData.bLoopAnim = FALSE
IF sCMHDZData.ePlayerPedAnimState = CMHDZ_PLAYER_PED_ANIM_IDLE
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_CLEANUP_AND_EXIT_CLIENT] - ARCADE_CABINET_ANIM_CLIP_EXIT")
PLAY_ARCADE_CABINET_ANIMATION(sCMHDZData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_EXIT)
ELSE
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_CLEANUP_AND_EXIT_CLIENT] - ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_EXIT_FROM_AIM")
PLAY_ARCADE_CABINET_ANIMATION(sCMHDZData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_EXIT_FROM_AIM)
ENDIF
ARCADE_CABINET_COMMON_CLEANUP()
ARCADE_GAMES_HELP_TEXT_CLEAR()
CMHDZ_STOP_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_MENUS)
CMHDZ_STOP_SOUND(CMHDZ_AUDIO_EFFECT_LEVEL_BACKGROUND_LOOP)
CMHDZ_STOP_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_GAMEPLAY)
DG_CLEAN_UP_MOVIE(sCMHDZData.bmIdCmhdzIntro)
DG_CLEAN_UP_MOVIE(sCMHDZData.bmIdCmhdzOutro)
// DG_CLEAN_UP_MOVIE(sCMHDZData.bmIdCmhdzIntro)
// DG_CLEAN_UP_MOVIE(sCMHDZData.bmIdCmhdzIntro_LoopStatic)
//SET_STREAMED_TEXTURE_DICT_AS_NO_LONGER_NEEDED(sCMHDZData.tl31BaseTextDict)
ARCADE_GAMES_SOUND_RELEASE_AUDIO_BANK("DLC_TUNER/DLC_Tuner_AM_CH")
ARCADE_GAMES_SOUND_RELEASE_AUDIO_BANK("DLC_TUNER/DLC_Tuner_AM_CH_Enemy_Vocal")
ARCADE_GAMES_SOUND_RELEASE_AUDIO_BANK("DLC_TUNER/DLC_Tuner_AM_CH_Dir_Vocal")
CMHDZ_RELEASE_ALL_TEXTURE_DICTS()
TERMINATE_THIS_MULTIPLAYER_THREAD_NO_ARGS()
//CDEBUG2LN(DEBUG_MINIGAME, "{baz} [CMHDZ_CLEANUP_AND_EXIT_CLIENT] - ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_EXIT_FROM_AIM")
ENDPROC
FUNC ARCADE_CABINET_ANIM_CLIPS CMHDZ_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 CMHDZ_SHOULD_PLAY_NEXT_PLAY_IDLE_ANIM()
IF sCMHDZData.iIdleAnimCount = -1
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_SHOULD_PLAY_NEXT_PLAY_IDLE_ANIM] True - iIdleAnimCount: ", sCMHDZData.iIdleAnimCount)
RETURN TRUE
ENDIF
INT iCurrent = sCMHDZData.iIdleAnimCount - 1
IF iCurrent < 0
iCurrent = 0
ENDIF
ARCADE_CABINET_ANIM_CLIPS ePlayIdle = CMHDZ_GET_PLAY_IDLE_CLIP_FROM_COUNT(sCMHDZData.iIdleAnimCount)
IF IS_PLAYER_PLAYING_THIS_ARCADE_CABINET_ANIMATION_CLIP(ePlayIdle)
IF HAS_ARCADE_CABINET_ANIMATION_CLIP_FINISHED(ePlayIdle)
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_SHOULD_PLAY_NEXT_PLAY_IDLE_ANIM] True - Previous idle finished COunt:: ", iCurrent)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC CMHDZ_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 sCMHDZData.ePlayerPedAnimState
//-- Idle (stand)
CASE CMHDZ_PLAYER_PED_ANIM_IDLE
IF sCMHDZData.eClientState = CMHDZ_ARCADE_CLIENT_STATE_LEVEL_SELECTION_MENU
sCMHDZData.sArcadeAnimData.bHoldLastFrame = TRUE
sCMHDZData.sArcadeAnimData.bLoopAnim = FALSE
sCMHDZData.sArcadeAnimData.fBlendInDelta = SLOW_BLEND_IN
sCMHDZData.sArcadeAnimData.fBlendOutDelta = SLOW_BLEND_OUT
PLAY_ARCADE_CABINET_ANIMATION(sCMHDZData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_IDLE_TO_AIM)
CMHDZ_SET_PLAYER_PED_ANIM_STATE(CMHDZ_PLAYER_PED_ANIM_IDLE_TO_AIM)
ENDIF
BREAK
//-- Idle (stand) -> Aiming
CASE CMHDZ_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)
sCMHDZData.sArcadeAnimData.bHoldLastFrame = FALSE
sCMHDZData.sArcadeAnimData.bLoopAnim = TRUE
sCMHDZData.sArcadeAnimData.fBlendInDelta = SLOW_BLEND_IN
sCMHDZData.sArcadeAnimData.fBlendOutDelta = SLOW_BLEND_OUT
PLAY_ARCADE_CABINET_ANIMATION(sCMHDZData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_AIM_IDLE)
sCMHDZData.iIdleAnimCount = -1
CMHDZ_SET_PLAYER_PED_ANIM_STATE(CMHDZ_PLAYER_PED_ANIM_AIM_IDLE)
ELSE
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_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 CMHDZ_PLAYER_PED_ANIM_AIM_IDLE
IF sCMHDZData.eClientState = CMHDZ_ARCADE_CLIENT_STATE_PLAYING
IF CMHDZ_GET_LOCAL_PLAYER_HEALTH() > 0.0
AND CMHDZ_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_CURRENT_SCREEN() > 0
IF CMHDZ_SHOULD_PLAY_NEXT_PLAY_IDLE_ANIM()
sCMHDZData.iIdleAnimCount++
IF sCMHDZData.iIdleAnimCount > 3
sCMHDZData.iIdleAnimCount = 0
ENDIF
ePlayIdle = CMHDZ_GET_PLAY_IDLE_CLIP_FROM_COUNT(sCMHDZData.iIdleAnimCount)
SWITCH sCMHDZData.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
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_PROCESS_PLAYER_PED_ANIMS] {DSW} Starting play_idle, var: ", sCMHDZData.iIdleAnimCount)
sCMHDZData.sArcadeAnimData.fBlendInDelta = REALLY_SLOW_BLEND_IN
sCMHDZData.sArcadeAnimData.fBlendOutDelta = REALLY_SLOW_BLEND_OUT
PLAY_ARCADE_CABINET_ANIMATION(sCMHDZData.sArcadeAnimData, ePlayIdle)
sCMHDZData.bDoneReactionAnim = FALSE
// CMHDZ_SET_PLAYER_PED_ANIM_STATE(CMHDZ_PLAYER_PED_ANIM_PLAY_IDLE)
ENDIF
ENDIF
ENDIF
IF NOT sCMHDZData.bDoneReactionAnim
IF CMHDZ_GET_LOCAL_PLAYER_HEALTH() <= 0.0
sCMHDZData.sArcadeAnimData.fBlendInDelta = SLOW_BLEND_IN
sCMHDZData.sArcadeAnimData.fBlendOutDelta = SLOW_BLEND_OUT
sCMHDZData.sArcadeAnimData.bLoopAnim = FALSE
sCMHDZData.sArcadeAnimData.bHoldLastFrame = TRUE
PLAY_ARCADE_CABINET_ANIMATION(sCMHDZData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_LOSE_LIFE)
CMHDZ_SET_PLAYER_PED_ANIM_STATE(CMHDZ_PLAYER_PED_ANIM_AIM_IDLE_TO_LOSE_LIFE)
sCMHDZData.bDoneReactionAnim = TRUE
ELSE
IF sCMHDZData.eClientState = CMHDZ_ARCADE_CLIENT_STATE_PLAYING
OR sCMHDZData.eClientState = CMHDZ_ARCADE_CLIENT_STATE_RESULT_SCREEN
IF (CMHDZ_GET_LOCAL_PLAYER_HEALTH() > 0.0 AND CMHDZ_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_CURRENT_SCREEN() = 0)
sCMHDZData.sArcadeAnimData.fBlendInDelta = SLOW_BLEND_IN
sCMHDZData.sArcadeAnimData.fBlendOutDelta = SLOW_BLEND_OUT
sCMHDZData.sArcadeAnimData.bLoopAnim = FALSE
sCMHDZData.sArcadeAnimData.bHoldLastFrame = TRUE
IF CMHDZ_ARE_ALL_LEVELS_COMPLETE()
AND NOT sCMHDZData.bPlayedWinningAnim
sCMHDZData.bPlayedWinningAnim = TRUE
PLAY_ARCADE_CABINET_ANIMATION(sCMHDZData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_WIN)
CMHDZ_SET_PLAYER_PED_ANIM_STATE(CMHDZ_PLAYER_PED_ANIM_AIM_IDLE_TO_COMPLETE_GAME)
ELSE
PLAY_ARCADE_CABINET_ANIMATION(sCMHDZData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_LEVEL_COMPLETE)
CMHDZ_SET_PLAYER_PED_ANIM_STATE(CMHDZ_PLAYER_PED_ANIM_AIM_IDLE_TO_COMPLETE_SCREEN)
ENDIF
sCMHDZData.bDoneReactionAnim = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
// CASE CMHDZ_PLAYER_PED_ANIM_PLAY_IDLE
// IF CMHDZ_GET_LOCAL_PLAYER_HEALTH() <= 0.0
// sCMHDZData.sArcadeAnimData.fBlendInDelta = SLOW_BLEND_IN
// sCMHDZData.sArcadeAnimData.fBlendOutDelta = SLOW_BLEND_OUT
// sCMHDZData.sArcadeAnimData.bLoopAnim = FALSE
// sCMHDZData.sArcadeAnimData.bHoldLastFrame = TRUE
// PLAY_ARCADE_CABINET_ANIMATION(sCMHDZData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_LOSE_LIFE)
//
// CMHDZ_SET_PLAYER_PED_ANIM_STATE(CMHDZ_PLAYER_PED_ANIM_AIM_IDLE_TO_LOSE_LIFE)
// ELSE
// IF sCMHDZData.eClientState = CMHDZ_ARCADE_CLIENT_STATE_PLAYING
// OR sCMHDZData.eClientState = CMHDZ_ARCADE_CLIENT_STATE_RESULT_SCREEN
// IF (CMHDZ_GET_LOCAL_PLAYER_HEALTH() > 0.0 AND CMHDZ_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_CURRENT_SCREEN() = 0)
//
// sCMHDZData.sArcadeAnimData.fBlendInDelta = SLOW_BLEND_IN
// sCMHDZData.sArcadeAnimData.fBlendOutDelta = SLOW_BLEND_OUT
// sCMHDZData.sArcadeAnimData.bLoopAnim = FALSE
// sCMHDZData.sArcadeAnimData.bHoldLastFrame = TRUE
//
// IF CMHDZ_ARE_ALL_LEVELS_COMPLETE()
// AND NOT sCMHDZData.bPlayedWinningAnim
// sCMHDZData.bPlayedWinningAnim = TRUE
// PLAY_ARCADE_CABINET_ANIMATION(sCMHDZData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_WIN)
//
// CMHDZ_SET_PLAYER_PED_ANIM_STATE(CMHDZ_PLAYER_PED_ANIM_AIM_IDLE_TO_COMPLETE_GAME)
// ELSE
// PLAY_ARCADE_CABINET_ANIMATION(sCMHDZData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_LEVEL_COMPLETE)
//
// CMHDZ_SET_PLAYER_PED_ANIM_STATE(CMHDZ_PLAYER_PED_ANIM_AIM_IDLE_TO_COMPLETE_SCREEN)
//
// ENDIF
// ENDIF
// ENDIF
// ENDIF
//
// BREAK
//-- Idle (Playing) -> Lose life
CASE CMHDZ_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)
sCMHDZData.sArcadeAnimData.bHoldLastFrame = FALSE
sCMHDZData.sArcadeAnimData.bLoopAnim = TRUE
sCMHDZData.sArcadeAnimData.fBlendInDelta = SLOW_BLEND_IN
sCMHDZData.sArcadeAnimData.fBlendOutDelta = SLOW_BLEND_OUT
PLAY_ARCADE_CABINET_ANIMATION(sCMHDZData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_AIM_IDLE)
sCMHDZData.iIdleAnimCount = -1
CMHDZ_SET_PLAYER_PED_ANIM_STATE(CMHDZ_PLAYER_PED_ANIM_AIM_IDLE)
ENDIF
ENDIF
BREAK
//-- Idle (Aiming) -> Complete stage
CASE CMHDZ_PLAYER_PED_ANIM_AIM_IDLE_TO_COMPLETE_SCREEN
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)
sCMHDZData.sArcadeAnimData.fBlendInDelta = SLOW_BLEND_IN
sCMHDZData.sArcadeAnimData.fBlendOutDelta = SLOW_BLEND_OUT
sCMHDZData.sArcadeAnimData.bHoldLastFrame = FALSE
sCMHDZData.sArcadeAnimData.bLoopAnim = TRUE
PLAY_ARCADE_CABINET_ANIMATION(sCMHDZData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_LAST_GUNSLINGERS_AIM_IDLE)
sCMHDZData.iIdleAnimCount = -1
CMHDZ_SET_PLAYER_PED_ANIM_STATE(CMHDZ_PLAYER_PED_ANIM_AIM_IDLE)
ENDIF
ENDIF
BREAK
//-- Idle (Playing) -> Complete game
CASE CMHDZ_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 sCMHDZData.eClientState != CMHDZ_ARCADE_CLIENT_STATE_PLAYING
sCMHDZData.sArcadeAnimData.bHoldLastFrame = FALSE
sCMHDZData.sArcadeAnimData.bLoopAnim = TRUE
sCMHDZData.sArcadeAnimData.fBlendInDelta = REALLY_SLOW_BLEND_IN
sCMHDZData.sArcadeAnimData.fBlendOutDelta = REALLY_SLOW_BLEND_OUT
PLAY_ARCADE_CABINET_ANIMATION(sCMHDZData.sArcadeAnimData, ARCADE_CABINET_ANIM_CLIP_IDLE)
CMHDZ_SET_PLAYER_PED_ANIM_STATE(CMHDZ_PLAYER_PED_ANIM_IDLE)
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC CMHDZ_PROCESS_CLIENT_STATE_MACHINE()
#IF IS_DEBUG_BUILD
sCMHDZData.iAssertCounter = 0
#ENDIF
IF sCMHDZData.eClientState != CMHDZ_ARCADE_CLIENT_STATE_INIT
// Black backdrop
ARCADE_DRAW_PIXELSPACE_RECT(INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2,cfBASE_SCREEN_HEIGHT/2),
INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH,cfBASE_SCREEN_HEIGHT),
sCMHDZData.rgbaBlack)
ENDIF
SWITCH sCMHDZData.eClientState
CASE CMHDZ_ARCADE_CLIENT_STATE_INIT
IF NOT CMHDZ_LOAD_TEXDICT(CMHDZ_TEXDICT_FACADE)
BREAK
ENDIF
IF NOT ARCADE_GAMES_POSTFX_REQUESTING_ASSETS()
CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] [BAZ] CMHDZ_PROCESS_CLIENT_STATE_REQUESTING_ASSETS Loading POSTFX assets")
BREAK
ENDIF
CMHDZ_PROCESS_CLIENT_STATE_INIT()
BREAK
// CASE CMHDZ_ARCADE_CLIENT_STATE_REQUESTING_ASSETS
//
// CMHDZ_PROCESS_CLIENT_STATE_REQUESTING_ASSETS()
//
// BREAK
// Remove if not needed.
CASE CMHDZ_ARCADE_CLIENT_STATE_FIB
CMHDZ_PROCESS_CLIENT_STATE_FIB()
BREAK
CASE CMHDZ_ARCADE_CLIENT_STATE_INTRO
CMHDZ_PROCESS_CLIENT_INTRO()
BREAK
CASE CMHDZ_ARCADE_CLIENT_STATE_TITLE_SCREEN
CMHDZ_PROCESS_CLIENT_STATE_TITLE_SCREEN()
BREAK
CASE CMHDZ_ARCADE_CLIENT_STATE_TITLE_FADEOUT
CMHDZ_PROCESS_CLIENT_STATE_TITLE_SCREEN_FADE_OUT()
BREAK
CASE CMHDZ_ARCADE_CLIENT_STATE_LEVEL_SELECTION_MENU
CMHDZ_PROCESS_CLIENT_STATE_LEVEL_SELECT_MENU()
BREAK
CASE CMHDZ_ARCADE_CLIENT_STATE_INIT_LEVEL
CMHDZ_PROCESS_CLIENT_STATE_INIT_LEVEL()
BREAK
CASE CMHDZ_ARCADE_CLIENT_STATE_PLAYING
CMHDZ_PROCESS_CLIENT_STATE_PLAYING()
#IF IS_DEBUG_BUILD
// IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_DOWN)
// //CMHDZ_SET_LEVEL_BIT_FOR_CURRENT_LEVEL(CMHDZ_LEVELS_BIT_STOPPED)
// CMHDZ_INCREASE_CURRENT_LEVEL_SCREEN()
// ENDIF
IF IS_DEBUG_KEY_JUST_PRESSED(KEY_DOWN, KEYBOARD_MODIFIER_NONE, "Debug complete")
sCMHDZData.bLevelsCompleted[ENUM_TO_INT(sCMHDZData.eCurrentLevel)] = TRUE
sCMHDZData.bFadingOut = TRUE
CMHDZ_CLEAR_LEVEL_BIT_FOR_LEVEL(sCMHDZData.eCurrentLevel, CMHDZ_LEVELS_BIT_REPLAYING_LEVEL)
// Debugging worst possible score
playerBd[PARTICIPANT_ID_TO_INT()].iPlayerScore[CMHDZ_GET_CURRENT_LEVEL()] = 9999
playerBd[PARTICIPANT_ID_TO_INT()].iPlayerHiScore[CMHDZ_GET_CURRENT_LEVEL()] = 9999
sCMHDZData.iTotalLevelShots[CMHDZ_GET_CURRENT_LEVEL()] = 100
sCMHDZData.iTotalLevelEnemyHits[CMHDZ_GET_CURRENT_LEVEL()] = 0
CMHDZ_ASIGN_STAR_RATING(sCMHDZData.eCurrentLevel)
IF CMHDZ_ARE_ALL_LEVELS_COMPLETE()
CMHDZ_MAINTAIN_PLAYER_AWARDS()
CMHDZ_SEND_TELEMETRY()
ENDIF
sCMHDZData.eLevelState = CMHDZ_FADING_OUT
ENDIF
IF GET_COMMANDLINE_PARAM_EXISTS("sc_BadlandsOnScreen") OR (CMHDZ_CMDLINE_ON_SCREEN_DEBUG = 1)
CMHDZ_DO_ON_SCREEN_DEBUG()
ENDIF
#ENDIF
BREAK
CASE CMHDZ_ARCADE_CLIENT_STATE_EDITOR_ACTIVE
CMHDZ_PROCESS_CLIENT_STATE_EDITOR_ACTIVE()
BREAK
CASE CMHDZ_ARCADE_CLIENT_STATE_GAME_OVER
CMHDZ_PROCESS_CLIENT_STATE_GAME_OVER()
BREAK
CASE CMHDZ_ARCADE_CLIENT_STATE_RESULT_SCREEN
CMHDZ_PROCESS_CLIENT_STATE_RESULT_SCREEN()
BREAK
CASE CMHDZ_ARCADE_CLIENT_STATE_OUTRO_MOVIE
CMHDZ_PROCESS_CLIENT_STATE_OUTRO_MOVIE()
BREAK
CASE CMHDZ_ARCADE_CLIENT_STATE_EDIT_LEADERBOARD
CMHDZ_PROCESS_CLIENT_STATE_EDIT_LEADERBOARD()
BREAK
CASE CMHDZ_ARCADE_CLIENT_STATE_VIEW_LEADERBOARD
CMHDZ_PROCESS_CLIENT_STATE_VIEW_LEADERBOARD()
BREAK
CASE CMHDZ_ARCADE_CLIENT_STATE_CLEANUP
CMHDZ_CLEANUP_AND_EXIT_CLIENT()
TERMINATE_THIS_MULTIPLAYER_THREAD_NO_ARGS()
BREAK
ENDSWITCH
//-- Handle player ped anims while playing
CMHDZ_PROCESS_PLAYER_PED_ANIMS()
ENDPROC
#IF IS_DEBUG_BUILD
PROC CMHDZ_DEBUG_OUTPUT_ALL_ENEMY_POSITIONS()
INT i
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [OUTPUT_ENEMY_POSITIONS] ")
FOR i = 0 TO ciCMHDZ_MAX_ENEMIES -1
IF sCMHDZData.sEnemyData[i].eState != CMHDZ_ENEMY_STATE_INACTIVE
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [OUTPUT_ENEMY_POSITIONS] Enemy ", i, " lane:", sCMHDZData.sEnemyData[i].iEnemyLane, " Type: ", CMHDZ_ENEMY_TYPES_TO_STRING(sCMHDZData.sEnemyData[i].iEnemyType), " State: ", CMHDZ_ENEMY_STATE_TO_STRING(sCMHDZData.sEnemyData[i].eState) , " Active in screen: ", sCMHDZData.sEnemyData[i].fPointToAppear)
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [OUTPUT_ENEMY_POSITIONS] Reverse? ", CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_REVERSE), " Pos: ", sCMHDZData.sEnemyData[i].vSpritePos.x, ", ", sCMHDZData.sEnemyData[i].vSpritePos.y, " Stopping: ", sCMHDZData.sEnemyData[i].fStoppingX, " Start: ", sCMHDZData.sEnemyData[i].vStartPos.x, ", ", sCMHDZData.sEnemyData[i].vStartPos.y)
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [OUTPUT_ENEMY_POSITIONS] Ever on screen? ", CMHDZ_ENEMY_DATA_IS_BITMASK_SET(i, CMHDZ_ENEMY_DATA_BITS_APPEARED_ON_SCREEN))
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [OUTPUT_ENEMY_POSITIONS]")
ENDIF
ENDFOR
ENDPROC
PROC CMHDZ_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS()
INT i
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS] ")
/*
sCMHDZData.sItemData[iItem].bRendering = FALSE
sCMHDZData.sItemData[iItem].iMinScreen = 0
sCMHDZData.sItemData[iItem].iRenderAfterWarpCount = 0
sCMHDZData.sItemData[iItem].iWarpCount = 0
sCMHDZData.sItemData[iItem].bShot = FALSE
*/
FOR i = 0 TO ciCMHDZ_MAX_ITEMS -1
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS] sCMHDZData.sItemData[", i, "]..eItemType = ", CMHDZ_ITEM_TYPES_TO_STRING(sCMHDZData.sItemData[i].eItemType))
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS] sCMHDZData.sItemData[", i, "].bRendering = ", sCMHDZData.sItemData[i].bRendering)
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS] sCMHDZData.sItemData[", i, "].vSpritePos = ", sCMHDZData.sItemData[i].vSpritePos.x, ", ", sCMHDZData.sItemData[i].vSpritePos.y)
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS] sCMHDZData.sItemData[", i, "].iMinScreen = ", sCMHDZData.sItemData[i].iMinScreen)
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS] sCMHDZData.sItemData[", i, "].iRenderAfterWarpCount = ", sCMHDZData.sItemData[i].iRenderAfterWarpCount)
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS] sCMHDZData.sItemData[", i, "].iMinScreen = ", sCMHDZData.sItemData[i].iMinScreen)
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS] sCMHDZData.sItemData[", i, "].iWarpCount = ", sCMHDZData.sItemData[i].iWarpCount)
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS] sCMHDZData.sItemData[", i, "].bShot = ", sCMHDZData.sItemData[i].bShot)
//CDEBUG2LN(DEBUG_MINIGAME, "{dsw} [CMHDZ_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS] ")
ENDFOR
ENDPROC
PROC CMHDZ_DEBUG_SET_PARENT_WIDGET_GROUP(WIDGET_GROUP_ID parentWidgetGroup)
sCMHDZData.widgetGroupExample = parentWidgetGroup
ENDPROC
/// PURPOSE:
/// Creates a read only 2D vector widget
/// PARAMS:
/// str - widget name
/// vec - vector
PROC CMHDZ_ADD_WIDGET_VECTOR_2D_READONLY(STRING str, VECTOR_2D &vec)
TEXT_LABEL_23 txt
txt = str
txt += " X"
ADD_WIDGET_FLOAT_READ_ONLY(txt, vec.x)
txt = str
txt += " Y"
ADD_WIDGET_FLOAT_READ_ONLY(txt, vec.y)
ENDPROC
/// PURPOSE:
/// Creates an editable 2D Vector widget
/// PARAMS:
/// str - widget name
/// vec - vector
/// vMin - min value (note this effects both x and y)
/// vMax - max value (note this effects both x and y)
/// vStep - value increase rate
PROC CMHDZ_ADD_WIDGET_VECTOR_2D_SLIDER(STRING str, VECTOR_2D &vec, FLOAT vMin, FLOAT vMax, FLOAT vStep)
TEXT_LABEL_23 txt
txt = str
txt += " X"
ADD_WIDGET_FLOAT_SLIDER(txt, vec.x, vMin, vMax, vStep)
txt = str
txt += " Y"
ADD_WIDGET_FLOAT_SLIDER(txt, vec.y, vMin, vMax, vStep)
ENDPROC
PROC CMHDZ_DEBUG_CREATE_PLAYER_DATA_WIDGET(CMHDZ_PLAYER_DATA &dat)
START_WIDGET_GROUP("Player Data")
ADD_WIDGET_BOOL("bHasJustShot", dat.bHasJustShot)
ADD_WIDGET_BOOL("bCovering", dat.bCovering)
ADD_WIDGET_BOOL("bHoveringEnemy", dat.bHoveringEnemy)
ADD_WIDGET_BOOL("bShouldShowReloadPrompt", dat.bShouldShowReloadPrompt)
ADD_WIDGET_BOOL("bDoneReloadEffect", dat.bDoneReloadEffect)
ADD_WIDGET_FLOAT_SLIDER("Health", dat.fHealth, 0.0, 1.0, 0.01)
ADD_BIT_FIELD_WIDGET("Player Bitset", dat.iPlayerBitset)
START_WIDGET_GROUP("Timing")
ADD_WIDGET_INT_READ_ONLY("iLastShotTime", dat.iLastShotTime)
ADD_WIDGET_INT_READ_ONLY("iLastProjectileTime", dat.iLastProjectileTime)
ADD_WIDGET_INT_READ_ONLY("iDeadTime", dat.iDeadTime)
ADD_WIDGET_INT_READ_ONLY("iReloadPromptShowTime", dat.iReloadPromptShowTime)
ADD_WIDGET_INT_READ_ONLY("iInvulnerableTimer", dat.iInvulnerableTimer)
ADD_WIDGET_INT_READ_ONLY("iHideReticuleTimer", dat.iHideReticuleTimer)
ADD_WIDGET_INT_READ_ONLY("iQuadDamageTimer", dat.iQuadDamageTimer)
ADD_WIDGET_INT_READ_ONLY("iNoAmmoTimer", dat.iNoAmmoTimer)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Weapon Stuff")
ADD_WIDGET_INT_READ_ONLY("iProjectileIndex", dat.iProjectileIndex)
ADD_WIDGET_FLOAT_READ_ONLY("fHitCountdown", dat.fHitCountdown)
ADD_WIDGET_INT_READ_ONLY("iNumberOfThrownProjectiles", dat.iNumberOfThrownProjectiles)
ADD_WIDGET_INT_SLIDER("iThrownProjectilesAmmo", dat.iThrownProjectilesAmmo, 0, 100, 1)
ADD_WIDGET_INT_SLIDER("iThrownProjectileReloadDelay", dat.iThrownProjectileReloadDelay, 0, 5000, 250)
ADD_WIDGET_INT_READ_ONLY("iLastThrownProjectileTime", dat.iLastThrownProjectileTime)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Scoring")
ADD_WIDGET_INT_READ_ONLY("iSuccessiveHits", dat.iSuccessiveHits)
ADD_WIDGET_INT_READ_ONLY("iChainedScore", dat.iChainedScore)
ADD_WIDGET_INT_READ_ONLY("iScoreNoChain", dat.iScoreNoChain)
ADD_WIDGET_INT_READ_ONLY("iPreviousTargetScore", dat.iPreviousTargetScore)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ENDPROC
PROC CMHDZ_DEBUG_CREATE_DEBUG_STATE_WIDGET(CMHDZ_DEBUG_STATE_WIDGET &widget, INT iMaxStates = 99, STRING str = null)
IF IS_STRING_NULL_OR_EMPTY(str)
str = "Debug State"
ENDIF
START_WIDGET_GROUP(str)
widget.twCurrentState = ADD_TEXT_WIDGET("Current State")
ADD_WIDGET_BOOL("Change State", widget.bDebugChangeState)
ADD_WIDGET_INT_SLIDER("New State Selector", widget.iDesiredStateSelector, 0, iMaxStates - 1, 1)
widget.twDesiredState = ADD_TEXT_WIDGET("New State")
STOP_WIDGET_GROUP()
ENDPROC
PROC CMHDZ_DEBUG_UPDATE_CLIENT_STATE_WIDGET(CMHDZ_DEBUG_STATE_WIDGET &widget)
CMHDZ_ARCADE_CLIENT_STATE st = INT_TO_ENUM(CMHDZ_ARCADE_CLIENT_STATE, widget.iDesiredStateSelector)
IF (widget.bDebugChangeState)
CMHDZ_SET_LOCAL_STATE(st)
widget.bDebugChangeState = FALSE
ENDIF
SET_CONTENTS_OF_TEXT_WIDGET(widget.twCurrentState, CMHDZ_ARCADE_CLIENT_STATE_TO_STRING(sCMHDZData.eClientState))
SET_CONTENTS_OF_TEXT_WIDGET(widget.twDesiredState, CMHDZ_ARCADE_CLIENT_STATE_TO_STRING(st))
ENDPROC
#ENDIF
#IF IS_DEBUG_BUILD
#IF CMHDZ_CMDLINE_EDITOR_NEW
FUNC BOOL CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(CMHDZ_EDITOR &widget, CONTROL_ACTION ctrl, INT iTimeBetweenPresses = 200)
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
RETURN FALSE
ENDIF
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, ctrl)
widget.iDirectionDebounceTime = GET_GAME_TIMER() + iTimeBetweenPresses
RETURN TRUE
ENDIF
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, ctrl) AND (GET_GAME_TIMER() > widget.iDirectionDebounceTime)
widget.iDirectionDebounceTime = GET_GAME_TIMER() + iTimeBetweenPresses
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(CMHDZ_EDITOR &widget, KEY_NUMBER ctrl, INT iTimeBetweenPresses = 200)
IF IS_KEYBOARD_KEY_JUST_PRESSED(ctrl)
widget.iDirectionDebounceTime = GET_GAME_TIMER() + iTimeBetweenPresses
//CPRINTLN(DEBUG_MINIGAME, "CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION - ctrl key just pressed")
RETURN TRUE
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(ctrl) AND (GET_GAME_TIMER() > widget.iDirectionDebounceTime)
widget.iDirectionDebounceTime = GET_GAME_TIMER() + iTimeBetweenPresses
//CPRINTLN(DEBUG_MINIGAME, "CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION - ctrl key just pressed. timer debounced")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CMHDZ_EDITOR_CONTROLLER_ADJUST_BOOL(CMHDZ_EDITOR &w, BOOL &value)
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, INPUT_SCRIPT_PAD_LEFT)
OR CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, INPUT_CELLPHONE_LEFT)
value = !value
RETURN TRUE
ENDIF
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, INPUT_SCRIPT_PAD_RIGHT)
OR CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, INPUT_CELLPHONE_RIGHT)
value = !value
RETURN TRUE
ENDIF
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
IF CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_LEFT)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_A)
value = !value
RETURN TRUE
ENDIF
IF CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_RIGHT)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_D)
value = !value
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CMHDZ_EDITOR_CONTROLLER_ADJUST_BITMASK_ENUM_BOOL(CMHDZ_EDITOR &w, ENUM_TO_INT &eBitField, ENUM_TO_INT eBitMask)
BOOL value
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, INPUT_SCRIPT_PAD_LEFT)
value = IS_BITMASK_ENUM_AS_ENUM_SET(eBitField, eBitMask)
SET_BITMASK_ENUM_AS_ENUM_BY_BOOL(eBitField, eBitMask, !value)
RETURN TRUE
ENDIF
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, INPUT_SCRIPT_PAD_RIGHT)
value = IS_BITMASK_ENUM_AS_ENUM_SET(eBitField, eBitMask)
SET_BITMASK_ENUM_AS_ENUM_BY_BOOL(eBitField, eBitMask, !value)
RETURN TRUE
ENDIF
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
IF CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_LEFT)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_A)
value = IS_BITMASK_ENUM_AS_ENUM_SET(eBitField, eBitMask)
SET_BITMASK_ENUM_AS_ENUM_BY_BOOL(eBitField, eBitMask, !value)
RETURN TRUE
ENDIF
IF CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_RIGHT)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_D)
value = IS_BITMASK_ENUM_AS_ENUM_SET(eBitField, eBitMask)
SET_BITMASK_ENUM_AS_ENUM_BY_BOOL(eBitField, eBitMask, !value)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CMHDZ_EDITOR_CONTROLLER_ADJUST_BITSET_BOOL(CMHDZ_EDITOR &w, INT &iBitSet, INT iBit)
BOOL value
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, INPUT_SCRIPT_PAD_LEFT) OR CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, INPUT_SCRIPT_PAD_RIGHT)
value = !IS_BIT_SET(iBitSet, iBit)
IF (value)
SET_BIT(iBitSet, iBit)
ELSE
CLEAR_BIT(iBitSet, iBit)
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(CMHDZ_EDITOR &w, INT &value, INT iVMin, INT iVMax, INT iInc = 1, BOOL bMaxInclusive = TRUE)
BOOL bChange
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, INPUT_SCRIPT_PAD_LEFT)
value -= iInc
bChange = TRUE
ENDIF
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, INPUT_SCRIPT_PAD_RIGHT)
value += iInc
bChange = TRUE
ENDIF
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
IF CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_LEFT)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_A)
value -= iInc
bChange = TRUE
ENDIF
IF CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_RIGHT)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_D)
value += iInc
bChange = TRUE
ENDIF
ENDIF
IF (bMaxInclusive = FALSE)
iVMax --
ENDIF
IF (value < iVMin)
value = iVMax
ENDIF
IF (value > iVMax)
value = iVMin
ENDIF
RETURN bChange
ENDFUNC
FUNC BOOL CMHDZ_EDITOR_CONTROLLER_ADJUST_FLOAT(CMHDZ_EDITOR &w, FLOAT &value, FLOAT iVMin, FLOAT iVMax, FLOAT iInc = 1.0, BOOL bMaxInclusive = TRUE)
BOOL bChange
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, INPUT_SCRIPT_PAD_LEFT)
value -= iInc
bChange = TRUE
ENDIF
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, INPUT_SCRIPT_PAD_RIGHT)
value += iInc
bChange = TRUE
ENDIF
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
IF CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_LEFT)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_A)
value -= iInc
bChange = TRUE
ENDIF
IF CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_RIGHT)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_D)
value += iInc
bChange = TRUE
ENDIF
ENDIF
IF (bMaxInclusive = FALSE)
iVMax -= 1.0
ENDIF
IF (value < iVMin)
value = iVMax
ENDIF
IF (value > iVMax)
value = iVMin
ENDIF
RETURN bChange
ENDFUNC
PROC CMHDZ_EDITOR_COPY_DATA_TO_GAME(CMHDZ_EDITOR &widget)
CMHDZ_COPY_ENEMY_MAP_DATA_TO_GAME(widget.sEnemyMapData)
CMHDZ_COPY_COVER_MAP_DATA_TO_GAME(widget.sCoverMapData)
CMHDZ_COPY_ITEM_MAP_DATA_TO_GAME(widget.sItemMapData)
ENDPROC
PROC CMHDZ_EDITOR_RESET_MAP_DATA(CMHDZ_EDITOR &widget)
CMHDZ_RESET_ALL_ENEMY_MAP_DATA(widget.sEnemyMapData)
CMHDZ_RESET_ALL_COVER_MAP_DATA(widget.sCoverMapData)
CMHDZ_RESET_ALL_ITEM_MAP_DATA(widget.sItemMapData)
ENDPROC
PROC CMHDZ_EDITOR_LOAD_OR_RESTART_LEVEL(CMHDZ_EDITOR &widget, BOOL bLoad = TRUE)
sCMHDZData.eCurrentLevel = INT_TO_ENUM(CMHDZ_LEVELS, widget.iActiveLevel)
CMHDZ_CLEANUP_VARIABLES()
CMHDZ_PROCESS_CLIENT_STATE_INIT_LEVEL()
IF (bLoad)
CMHDZ_EDITOR_RESET_MAP_DATA(widget)
ELSE
CMHDZ_EDITOR_COPY_DATA_TO_GAME(widget)
ENDIF
// INT i
// REPEAT COUNT_OF(sCMHDZData.iPropToStopOn) i
// sCMHDZData.iPropToStopOn[i] = -1
// ENDREPEAT
// CMHDZ_INIT_COVER_POINTS(sCMHDZData.eCurrentLevel)
// CMHDZ_INIT_ENEMIES()
// sCMHDZData.iTotalNumberOfEnemies = sCMHDZData.iNumberOfEnemies
// //CMHDZ_INIT_HOSTAGES()
// CMHDZ_INIT_BACKGROUND(sCMHDZData.eCurrentLevel)
// CMHDZ_INIT_ITEMS()
widget.bShowMiniMap = TRUE
widget.bRebuildMenu = TRUE
widget.iSelectedData = -1
widget.iNewUnitData = 0
sCMHDZData.iCurrentScreen = FLOOR(sCMHDZData.fOverallLevelProgression/cfCMHDZ_SCREEN_LENGTH)
sCMHDZData.bDebugPause = TRUE
CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_EDITOR_LOAD_OR_RESTART_LEVEL - Returning to Editor state.")
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_EDITOR_ACTIVE)
ENDPROC
PROC CMHDZ_EDITOR_PLAY_LEVEL(CMHDZ_EDITOR &widget)
CMHDZ_EDITOR_LOAD_OR_RESTART_LEVEL(widget, FALSE)
sCMHDZData.bDebugPause = FALSE
widget.bShowMiniMap = FALSE
widget.bPlayStage = TRUE
ENDPROC
PROC CMHDZ_EDITOR_GET_ACTIVE_SCREEN_DATA(CMHDZ_EDITOR &widget)
CMHDZ_COPY_COVER_MAP_DATA_TO_GAME(widget.sCoverMapData)
CMHDZ_COPY_ITEM_MAP_DATA_TO_GAME(widget.sItemMapData)
ENDPROC
FUNC INT CMHDZ_EDITOR_PLACE_NEW_UNIT(CMHDZ_EDITOR &widget, INT iEntityType = -1)
INT iSlot
VECTOR_2D vPos
//VECTOR_2D vScnOrigin = CMHDZ_GET_ORIGIN_FOR_SCREEN((CEIL(sCMHDZData.fOverallLevelProgression/((cfRIGHT_SCREEN_LIMIT + cfLEFT_SCREEN_LIMIT)/2))))
CMHDZ_ASSET_TYPES eAssetType = CMHDZ_ASSET_TRASHBAG_BIG
CMHDZ_ITEM_TYPES eItemType = CMHDZ_ITEM_HEALTH
CMHDZ_ENEMY_TYPES eEnemyType = CMHDZ_ENEMY_1
// CMHDZ_HOSTAGE_TYPES eHostageType = CMHDZ_HOSTAGE_GIRL
vPos.x = cfBASE_SCREEN_WIDTH / 2.0
vPos.y = cfBASE_SCREEN_HEIGHT / 2.0
SWITCH (widget.iEditMode)
CASE CMHDZ_EDITOR_MODE_COVER
iSlot = CMHDZ_GET_COVER_MAP_DATA_SLOT(widget.sCoverMapData)
IF (iSlot = -1)
RETURN -1
ENDIF
IF (iEntityType != -1)
eAssetType = INT_TO_ENUM(CMHDZ_ASSET_TYPES, iEntityType)
ENDIF
CMHDZ_RESET_COVER_MAP_DATA(widget.sCoverMapData[iSlot])
CMHDZ_SET_DEFAULT_COVER_MAP_DATA(widget.sCoverMapData[iSlot], vPos, eAssetType, ciCMHDZ_LANE_MIDDLE)
CMHDZ_EDITOR_GET_ACTIVE_SCREEN_DATA(widget)
widget.iSelectedData = iSlot
widget.bRebuildMenu = TRUE
RETURN iSlot
BREAK
CASE CMHDZ_EDITOR_MODE_ITEM
iSlot = CMHDZ_GET_ITEM_MAP_DATA_SLOT(widget.sItemMapData)
IF (iSlot = -1)
RETURN -1
ENDIF
IF (iEntityType != -1)
eItemType = INT_TO_ENUM(CMHDZ_ITEM_TYPES, iEntityType)
ENDIF
CMHDZ_RESET_ITEM_MAP_DATA(widget.sItemMapData[iSlot])
CMHDZ_SET_ITEM_MAP_DATA(widget.sItemMapData[iSlot], vPos, eItemType, ciCMHDZ_LANE_MIDDLE, DEFAULT, DEFAULT, (ROUND(sCMHDZData.fOverallLevelProgression/cfCMHDZ_SCREEN_LENGTH)))
CMHDZ_COPY_ITEM_MAP_DATA_TO_GAME(widget.sItemMapData)
sCMHDZData.sItemData[iSlot].bRendering = TRUE
widget.iSelectedData = iSlot
widget.bRebuildMenu = TRUE
RETURN iSlot
BREAK
CASE CMHDZ_EDITOR_MODE_ENEMY
iSlot = CMHDZ_GET_ENEMY_MAP_DATA_SLOT(widget.sEnemyMapData)
IF (iSlot = -1)
RETURN -1
ENDIF
IF (iEntityType != -1)
eEnemyType = INT_TO_ENUM(CMHDZ_ENEMY_TYPES, iEntityType)
ENDIF
CMHDZ_RESET_ENEMY_MAP_DATA(widget.sEnemyMapData[iSlot])
CMHDZ_SET_ENEMY_MAP_DATA(widget.sEnemyMapData[iSlot], vPos, 940.0, ciCMHDZ_LANE_MIDDLE, FALSE, eEnemyType, sCMHDZData.fOverallLevelProgression, FALSE, FALSE, 0)
CMHDZ_COPY_ENEMY_MAP_DATA_TO_GAME(widget.sEnemyMapData)
widget.iSelectedData = iSlot
widget.bRebuildMenu = TRUE
RETURN iSlot
BREAK
// CASE CMHDZ_EDITOR_MODE_HOSTAGE
// iSlot = CMHDZ_GET_HOSTAGE_MAP_DATA_SLOT(widget.sHostageMapData)
// IF (iSlot = -1)
// RETURN -1
// ENDIF
//
// IF (iEntityType != -1)
// eHostageType = INT_TO_ENUM(CMHDZ_HOSTAGE_TYPES, iEntityType)
// ENDIF
//
// CMHDZ_RESET_HOSTAGE_MAP_DATA(widget.sHostageMapData[iSlot])
// CMHDZ_SET_HOSTAGE_MAP_DATA(widget.sHostageMapData[iSlot], vPos, 940, ciCMHDZ_LANE_MIDDLE, FALSE, eHostageType)
// CMHDZ_COPY_HOSTAGE_MAP_DATA_TO_GAME(widget.sHostageMapData)
// widget.iSelectedData = iSlot
// widget.bRebuildMenu = TRUE
// RETURN iSlot
// BREAK
ENDSWITCH
RETURN -1
ENDFUNC
PROC CMHDZ_EDITOR_ADD_MENU_ITEM_BOOL(CMHDZ_EDITOR &w, INT iRow, STRING opt, BOOL bValue, BOOL bArrows = TRUE)
ADD_MENU_ITEM_TEXT(iRow, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(opt)
ADD_MENU_ITEM_TEXT(iRow, "STRING", 1, TRUE)
IF (bValue)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("ON")
ELSE
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("OFF")
ENDIF
SET_MENU_ITEM_TOGGLEABLE(FALSE, bArrows)
w.iMenuMaxSelection ++
ENDPROC
PROC CMHDZ_EDITOR_ADD_MENU_ITEM_INT(CMHDZ_EDITOR &w, INT iRow, STRING opt, INT iValue, BOOL bArrows = TRUE)
ADD_MENU_ITEM_TEXT(iRow, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(opt)
ADD_MENU_ITEM_TEXT(iRow, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_INT(iValue))
SET_MENU_ITEM_TOGGLEABLE(FALSE, bArrows)
w.iMenuMaxSelection ++
ENDPROC
PROC CMHDZ_EDITOR_ADD_MENU_ITEM_FLOAT(CMHDZ_EDITOR &w, INT iRow, STRING opt, FLOAT fValue, INT dp = 2, BOOL bArrows = TRUE)
ADD_MENU_ITEM_TEXT(iRow, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(opt)
ADD_MENU_ITEM_TEXT(iRow, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_FLOAT(fValue, dp))
SET_MENU_ITEM_TOGGLEABLE(FALSE, bArrows)
w.iMenuMaxSelection ++
ENDPROC
PROC CMHDZ_EDITOR_ADD_MENU_ITEM_STRING(CMHDZ_EDITOR &w, INT iRow, STRING opt, STRING sValue, BOOL bArrows = TRUE)
ADD_MENU_ITEM_TEXT(iRow, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(opt)
ADD_MENU_ITEM_TEXT(iRow, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(sValue)
SET_MENU_ITEM_TOGGLEABLE(FALSE, bArrows)
w.iMenuMaxSelection ++
ENDPROC
PROC CMHDZ_EDITOR_BUILD_COVER_MENU(CMHDZ_EDITOR &w)
INT iStrLen
STRING str
// add asset type
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_NEW_UNIT, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Place New")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_NEW_UNIT, "STRING", 1, TRUE)
str = CMHDZ_ASSET_TYPES_TO_STRING(INT_TO_ENUM(CMHDZ_ASSET_TYPES, w.iNewUnitData))
iStrlen = GET_LENGTH_OF_LITERAL_STRING(str)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_STRING(str, 6, iStrLen))
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
w.iMenuMaxSelection ++
// selected index
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_INDEX, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Selected Item")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_INDEX, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_INT(w.iSelectedData))
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
w.iMenuMaxSelection ++
// level to edit
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_LEVEL, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Level")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_LEVEL, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(CMHDZ_LEVELS_TO_STRING(INT_TO_ENUM(CMHDZ_LEVELS, w.iActiveLevel)))
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
w.iMenuMaxSelection ++
IF (w.iSelectedData = -1)
EXIT
ENDIF
// add asset type
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_TYPE, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Type")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_TYPE, "STRING", 1, TRUE)
str = CMHDZ_ASSET_TYPES_TO_STRING(w.sCoverMapData[w.iSelectedData].eType)
iStrlen = GET_LENGTH_OF_LITERAL_STRING(str)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_STRING(str, 6, iStrLen))
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
w.iMenuMaxSelection ++
// add lane type
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_LANE, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Lane")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_LANE, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(CMHDZ_LANE_TO_STRING(w.sCoverMapData[w.iSelectedData].iCoverLane))
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
w.iMenuMaxSelection ++
// add screen type
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_SCREEN, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Screen")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_SCREEN, "STRING", 1, TRUE)
INT iActiveScreen = ROUND(sCMHDZData.fOverallLevelProgression/cfCMHDZ_SCREEN_LENGTH)
IF iActiveScreen <= 0
iActiveScreen = 1
ENDIF
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(CMHDZ_SCREEN_TO_STRING(iActiveScreen))
w.iMenuMaxSelection ++
// add pos x
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_INITIAL_X, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Initial X Pos / Point to appear")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_INITIAL_X, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_FLOAT(w.sCoverMapData[w.iSelectedData].vSpriteInitialPos.x, 2))
w.iMenuMaxSelection ++
// add pos y
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_INITIAL_Y, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Initial Y Pos")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_INITIAL_Y, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_FLOAT(w.sCoverMapData[w.iSelectedData].vSpriteInitialPos.y, 2))
w.iMenuMaxSelection ++
// add never render
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_IS_FAR_BG, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Is Far BG")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_IS_FAR_BG, "STRING", 1, TRUE)
IF IS_BITMASK_ENUM_AS_ENUM_SET(w.sCoverMapData[w.iSelectedData].eDataBits, CMHDZ_COVER_DATA_BITS_IS_FAR_BG)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("ON")
ELSE
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("OFF")
ENDIF
w.iMenuMaxSelection ++
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_REMOVE_OFF_SCREEN, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Remove when off screen")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_REMOVE_OFF_SCREEN, "STRING", 1, TRUE)
IF IS_BITMASK_ENUM_AS_ENUM_SET(w.sCoverMapData[w.iSelectedData].eDataBits, CMHDZ_COVER_DATA_BITS_REMOVE_OFF_SCREEN)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("ON")
ELSE
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("OFF")
ENDIF
w.iMenuMaxSelection ++
// add never render
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_EXPORT, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Export Cover Info")
w.iMenuMaxSelection ++
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_COVER_EXPORT_ALL, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Export All Cover Info")
w.iMenuMaxSelection ++
ENDPROC
PROC CMHDZ_EDITOR_BUILD_ENEMY_MENU(CMHDZ_EDITOR &w)
INT iStrLen
STRING str
// add asset type
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_NEW_UNIT, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Place New")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_NEW_UNIT, "STRING", 1, TRUE)
str = CMHDZ_ENEMY_TYPES_TO_STRING(INT_TO_ENUM(CMHDZ_ENEMY_TYPES, w.iNewUnitData))
iStrlen = GET_LENGTH_OF_LITERAL_STRING(str)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_STRING(str, 4, iStrLen))
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
w.iMenuMaxSelection ++
// selected index
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_INDEX, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Selected Item")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_INDEX, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_INT(w.iSelectedData))
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
w.iMenuMaxSelection ++
// level to edit
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_LEVEL, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Level")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_LEVEL, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(CMHDZ_LEVELS_TO_STRING(INT_TO_ENUM(CMHDZ_LEVELS, w.iActiveLevel)))
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
w.iMenuMaxSelection ++
IF (w.iSelectedData = -1)
EXIT
ENDIF
// add asset type
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_TYPE, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Type")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_TYPE, "STRING", 1, TRUE)
str = CMHDZ_ENEMY_TYPES_TO_STRING(w.sEnemyMapData[w.iSelectedData].eEnemyType)
iStrlen = GET_LENGTH_OF_LITERAL_STRING(str)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_STRING(str, 4, iStrLen))
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
w.iMenuMaxSelection ++
// add lane type
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_LANE, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Lane")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_LANE, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(CMHDZ_LANE_TO_STRING(w.sEnemyMapData[w.iSelectedData].iLane))
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
w.iMenuMaxSelection ++
// add point to appear
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_POSITION, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Point to Appear")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_POSITION, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_FLOAT(w.sEnemyMapData[w.iSelectedData].fPointToAppear, 2))
w.iMenuMaxSelection ++
// add stage type
// ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_SCREEN, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Screen")
// ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_POSITION, "STRING", 1, TRUE)
//
// INT iActiveScreen = CEIL(sCMHDZData.fOverallLevelProgression/((cfRIGHT_SCREEN_LIMIT + cfLEFT_SCREEN_LIMIT)/2))
//
// IF iActiveScreen <= 0
// iActiveScreen = 1
// ENDIF
//
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(CMHDZ_SCREEN_TO_STRING(iActiveScreen))
// w.iMenuMaxSelection ++
// add pos x
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_INITIAL_X, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Initial X Pos")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_INITIAL_X, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_FLOAT(w.sEnemyMapData[w.iSelectedData].vSpritePos.x, 2))
w.iMenuMaxSelection ++
// add pos y
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_INITIAL_Y, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Initial Y Pos")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_INITIAL_Y, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_FLOAT(w.sEnemyMapData[w.iSelectedData].vSpritePos.y, 2))
w.iMenuMaxSelection ++
// add stop scrolling pos
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_STOP_POS, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Stop Pos X")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_STOP_POS, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_FLOAT(w.sEnemyMapData[w.iSelectedData].fStoppingPos, 2))
w.iMenuMaxSelection ++
// add never render
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_WAITSCROLL, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Wait Stationary")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_WAITSCROLL, "STRING", 1, TRUE)
IF IS_BITMASK_ENUM_AS_ENUM_SET(w.sEnemyMapData[w.iSelectedData].eDataBits, CMHDZ_ENEMY_DATA_BITS_WAIT_UNTIL_LEVEL_STATIONARY)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("ON")
ELSE
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("OFF")
ENDIF
w.iMenuMaxSelection ++
// add stop scrolling
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_REVERSE, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("From Left")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_REVERSE, "STRING", 1, TRUE)
IF IS_BITMASK_ENUM_AS_ENUM_SET(w.sEnemyMapData[w.iSelectedData].eDataBits, CMHDZ_ENEMY_DATA_BITS_REVERSE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("ON")
ELSE
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("OFF")
ENDIF
w.iMenuMaxSelection ++
// add never render
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_IS_POP_UP, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Pop Up")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_IS_POP_UP, "STRING", 1, TRUE)
IF IS_BITMASK_ENUM_AS_ENUM_SET(w.sEnemyMapData[w.iSelectedData].eDataBits, CMHDZ_ENEMY_DATA_BITS_IS_POPUP)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("ON")
ELSE
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("OFF")
ENDIF
w.iMenuMaxSelection ++
// add render warp count
// ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_RENDERWARP, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Warp Count")
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_INT(w.sEnemyMapData[w.iSelectedData].iRenderAfterWarpCount))
// SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
// w.iMenuMaxSelection ++
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_EXPORT, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Export Enemy Info")
//ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_EXPORT, "STRING", 1, TRUE)
w.iMenuMaxSelection ++
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_EXPORT_ALL, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Export All Enemy Info")
//ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ENEMY_EXPORT_ALL, "STRING", 1, TRUE)
w.iMenuMaxSelection ++
ENDPROC
PROC CMHDZ_EDITOR_BUILD_ITEM_MENU(CMHDZ_EDITOR &w)
INT iStrLen
STRING str
// add asset type
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_NEW_UNIT, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Place New")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_NEW_UNIT, "STRING", 1, TRUE)
str = CMHDZ_ITEM_TYPES_TO_STRING(INT_TO_ENUM(CMHDZ_ITEM_TYPES, w.iNewUnitData))
iStrlen = GET_LENGTH_OF_LITERAL_STRING(str)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_STRING(str, 5, iStrLen))
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
w.iMenuMaxSelection ++
// selected index
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_INDEX, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Selected Item")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_INDEX, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_INT(w.iSelectedData))
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
w.iMenuMaxSelection ++
// level to edit
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_LEVEL, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Level")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_LEVEL, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(CMHDZ_LEVELS_TO_STRING(INT_TO_ENUM(CMHDZ_LEVELS, w.iActiveLevel)))
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
w.iMenuMaxSelection ++
IF (w.iSelectedData = -1)
EXIT
ENDIF
// add asset type
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_TYPE, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Type")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_TYPE, "STRING", 1, TRUE)
str = CMHDZ_ITEM_TYPES_TO_STRING(w.sItemMapData[w.iSelectedData].eItemType)
iStrlen = GET_LENGTH_OF_LITERAL_STRING(str)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_STRING(str, 6, iStrLen))
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
w.iMenuMaxSelection ++
// add lane type
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_LANE, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Lane")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_LANE, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(CMHDZ_LANE_TO_STRING(w.sItemMapData[w.iSelectedData].iLane))
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
w.iMenuMaxSelection ++
// add stage type
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_SCREEN, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Screen")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_SCREEN, "STRING", 1, TRUE)
INT iActiveScreen = ROUND(sCMHDZData.fOverallLevelProgression/cfCMHDZ_SCREEN_LENGTH)
IF iActiveScreen <= 0
iActiveScreen = 1
ENDIF
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(CMHDZ_SCREEN_TO_STRING(iActiveScreen))
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
w.iMenuMaxSelection ++
// add pos x
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_INITIAL_X, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Initial X Pos")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_INITIAL_X, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_FLOAT(w.sItemMapData[w.iSelectedData].vSpritePos.x, 2))
w.iMenuMaxSelection ++
// add pos y
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_INITIAL_Y, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Initial Y Pos")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_INITIAL_Y, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_FLOAT(w.sItemMapData[w.iSelectedData].vSpritePos.y, 2))
w.iMenuMaxSelection ++
// add render warp count
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_RENDERWARP, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Warp Count")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_RENDERWARP, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_INT(w.sItemMapData[w.iSelectedData].iRenderAfterWarpCount))
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
w.iMenuMaxSelection ++
// add stop scrolling pos
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_FORCESCALE, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Force Scale")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_FORCESCALE, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_FLOAT(w.sItemMapData[w.iSelectedData].fForceScale, 4))
w.iMenuMaxSelection ++
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_EXPORT, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Export Item Info")
w.iMenuMaxSelection ++
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_EXPORT_ALL, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Export All Item Info")
//ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_ITEM_EXPORT_ALL, "STRING", 1, TRUE)
w.iMenuMaxSelection ++
ENDPROC
PROC CMHDZ_EDITOR_BUILD_LEVEL_MENU(CMHDZ_EDITOR &w)
// level to edit
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_LEVEL_INDEX, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Level")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_LEVEL_INDEX, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(CMHDZ_LEVELS_TO_STRING(INT_TO_ENUM(CMHDZ_LEVELS, w.iActiveLevel)))
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
w.iMenuMaxSelection ++
// stage to edit
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_LEVEL_PROGRESS_SET, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Level Progression")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_LEVEL_PROGRESS_SET, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_INT(ROUND(sCMHDZData.fOverallLevelProgression)))
w.iMenuMaxSelection ++
// add screen type
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_LEVEL_SCREEN, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Screen")
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_LEVEL_SCREEN, "STRING", 1, TRUE)
INT iActiveScreen = ROUND(sCMHDZData.fOverallLevelProgression/cfCMHDZ_SCREEN_LENGTH)
IF iActiveScreen <= 0
iActiveScreen = 1
ENDIF
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(CMHDZ_SCREEN_TO_STRING(iActiveScreen))
w.iMenuMaxSelection ++
// add screen type
//ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_LEVEL_STOP_PROP, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("View Stop Prop")
//ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_LEVEL_STOP_PROP, "STRING", 1, TRUE)
//ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_INT(sCMHDZData.iPropToStopOn[(CEIL(sCMHDZData.fOverallLevelProgression/((cfRIGHT_SCREEN_LIMIT + cfLEFT_SCREEN_LIMIT)/2)))]))
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
w.iMenuMaxSelection ++
// add export level
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_LEVEL_PLAY, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Play Active Stage")
w.iMenuMaxSelection ++
// add reset level
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_LEVEL_RESET, "STRING", 1, (ENUM_TO_INT(sCMHDZData.eCurrentLevel) = w.iActiveLevel))
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Reset Editor Level")
w.iMenuMaxSelection ++
// add load level
ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_EXPORT_LEVEL, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Export Level Map to Game")
w.iMenuMaxSelection ++
ENDPROC
//PROC CMHDZ_EDITOR_BUILD_HOSTAGE_MENU(CMHDZ_EDITOR &w)
// INT iStrLen
// STRING str
//
// // add asset type
// ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_HOSTAGE_NEW_UNIT, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Place New")
// ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_HOSTAGE_NEW_UNIT, "STRING", 1, TRUE)
//
// str = CMHDZ_HOSTAGE_TYPES_TO_STRING(INT_TO_ENUM(CMHDZ_HOSTAGE_TYPES, w.iNewUnitData))
// iStrlen = GET_LENGTH_OF_LITERAL_STRING(str)
//
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_STRING(str, 4, iStrLen))
// SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
// w.iMenuMaxSelection ++
//
// // selected index
// ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_HOSTAGE_INDEX, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Selected Item")
// ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_HOSTAGE_INDEX, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_INT(w.iSelectedData))
// SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
// w.iMenuMaxSelection ++
//
// IF (w.iSelectedData = -1)
// EXIT
// ENDIF
//
// // add asset type
// ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_HOSTAGE_TYPE, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Type")
// ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_HOSTAGE_TYPE, "STRING", 1, TRUE)
//
// str = CMHDZ_HOSTAGE_TYPES_TO_STRING(w.sHostageMapData[w.iSelectedData].eHostageType)
// iStrlen = GET_LENGTH_OF_LITERAL_STRING(str)
//
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_STRING(str, 4, iStrLen))
// SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
// w.iMenuMaxSelection ++
//
// // add lane type
// ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_HOSTAGE_LANE, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Lane")
// ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_HOSTAGE_LANE, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(CMHDZ_LANE_TO_STRING(w.sHostageMapData[w.iSelectedData].iHostageLane))
// SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
// w.iMenuMaxSelection ++
//
// // add pos x
// ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_HOSTAGE_INITIAL_X, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Initial X Pos")
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_FLOAT(w.sHostageMapData[w.iSelectedData].vSpritePos.x, 2))
// w.iMenuMaxSelection ++
//
// // add pos y
// ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_HOSTAGE_INITIAL_Y, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Initial Y Pos")
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_FLOAT(w.sHostageMapData[w.iSelectedData].vSpritePos.y, 2))
// w.iMenuMaxSelection ++
//
// // add stop scrolling
// ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_HOSTAGE_REVERSE, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("From Left")
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// IF IS_BIT_SET(w.sHostageMapData[w.iSelectedData].iBitset, ENUM_TO_INT(CMHDZ_HOSTAGE_BIT_GOING_BACK))
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("ON")
// ELSE
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("OFF")
// ENDIF
// w.iMenuMaxSelection ++
//
// // add stop scrolling pos
// ADD_MENU_ITEM_TEXT(CMHDZ_EDITOR_MODE_HOSTAGE_STOP_POS, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Stop Pos X")
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_FLOAT(w.sHostageMapData[w.iSelectedData].fStoppingX, 2))
// w.iMenuMaxSelection ++
//ENDPROC
PROC CMHDZ_EDITOR_BUILD_PLAY_MENU(CMHDZ_EDITOR &w, BOOL bPlayMode = TRUE)
TEXT_LABEL_63 str
//INT iCurrentStage = CMHDZ_GET_CURRENT_LEVEL_SCREEN()
w.iMenuCurrentSelection = 0
IF (bPlayMode = TRUE)
CLEAR_MENU_DATA()
SET_MENU_TITLE("STRING")
str = "ACTIVE LEVEL: "
str += CMHDZ_LEVELS_TO_STRING(sCMHDZData.eCurrentLevel)
ADD_LITERAL_TO_MENU_TITLE(str)
SET_MENU_HEADER_COLOUR(0, 128, 0, 255, TRUE)
SET_MENU_ITEM_JUSTIFICATION(FONT_LEFT, FONT_RIGHT)
SET_MENU_ITEM_LAYOUT(MENU_ITEM_TEXT, MENU_ITEM_TEXT)
SET_CURRENT_MENU_ITEM(w.iMenuCurrentSelection)
ENDIF
w.iMenuMaxSelection = 0
// add asset type
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Current Screen")
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_INT(sCMHDZData.iCurrentScreen))
w.iMenuMaxSelection ++
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Overall Progression")
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_INT(ROUND(sCMHDZData.fOverallLevelProgression)))
w.iMenuMaxSelection ++
// add asset type
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Stop Prop For Screen")
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// IF (sCMHDZData.iCurrentScreen != -1)
// //ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_INT(sCMHDZData.iPropToStopOn[sCMHDZData.iCurrentScreen]))
// ELSE
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("INVALID")
// ENDIF
// w.iMenuMaxSelection ++
// // add asset type
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Screen To Stop On")
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// w.iMenuMaxSelection ++
// selected index
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Enemies Left For Stage")
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_INT(CMHDZ_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_LEVEL()))
SET_MENU_ITEM_TOGGLEABLE(FALSE, FALSE)
w.iMenuMaxSelection ++
// selected index
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Enemies Alive for Phase")
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_INT(CMHDZ_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_CURRENT_PHASE()))
SET_MENU_ITEM_TOGGLEABLE(FALSE, FALSE)
w.iMenuMaxSelection ++
// add asset type
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Ready To Stop")
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
IF (CMHDZ_IS_MOVING_LEVEL_ABOUT_TO_STOP())
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("ON")
ELSE
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("OFF")
ENDIF
w.iMenuMaxSelection ++
// add asset type
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Has Stopped")
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
IF CMHDZ_IS_LEVEL_STOPPED()
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("ON")
ELSE
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("OFF")
ENDIF
w.iMenuMaxSelection ++
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Shots Fired")
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_INT(CMHDZ_GET_TOTAL_SHOTS_FIRED_IN_CURRENT_LEVEL()))
SET_MENU_ITEM_TOGGLEABLE(FALSE, FALSE)
w.iMenuMaxSelection ++
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Enemies Hit")
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_INT(CMHDZ_GET_TOTAL_ENEMY_HITS_FOR_CURRENT_LEVEL()))
SET_MENU_ITEM_TOGGLEABLE(FALSE, FALSE)
w.iMenuMaxSelection ++
// IF (iCurrentStage < ciCMHDZ_MAX_SCREENS)
// //INT iStrLen
//
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(" ")
// w.iMenuMaxSelection ++
//
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Stage Settings")
// w.iMenuMaxSelection ++
// // add stop scrong
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Stop Scroll On Stage End")
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
//// IF (sCMHDZData.sStageEndData[iCurrentStage].bStopScrollingOnStageEnd)
//// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("ON")
//// ELSE
//// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("OFF")
//// ENDIF
// w.iMenuMaxSelection ++
//
// // add stop scrolling
//// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
//// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Stationary Stage")
//// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
//// IF (sCMHDZData.sStageEndData[iCurrentStage].bStationary)
//// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("ON")
//// ELSE
//// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("OFF")
//// ENDIF
//// w.iMenuMaxSelection ++
//
// // add asset type
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("End Condition")
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// w.iMenuMaxSelection ++
//
// // selected index
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Condition Value")
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
//// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_INT(sCMHDZData.sStageEndData[iCurrentStage].iValue))
// w.iMenuMaxSelection ++
//
// // selected index
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Enemy Less Than Stop")
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
//// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_INT(sCMHDZData.sStageEndData[iCurrentStage].iScrollStopEnemyCount))
// SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
// w.iMenuMaxSelection ++
// ENDIF
IF (bPlayMode = TRUE)
SET_MAX_MENU_ROWS_TO_DISPLAY(w.iMenuMaxSelection)
w.bRebuildMenu = FALSE
ENDIF
ENDPROC
PROC CMHDZ_EDITOR_BUILD_BOSS_MENU(CMHDZ_EDITOR &w)//, BOOL bPlayMode = TRUE)
TEXT_LABEL_63 strToDisplay
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Phase Index")
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_INT(sCMHDZData.sBossData.iPhaseIndex))
// w.iMenuMaxSelection ++
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Start Health")
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_FLOAT(cfBOSS_MaxHealth, 2))
w.iMenuMaxSelection ++
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Current Health")
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_FLOAT(sCMHDZData.sBossData.fHealth, 2))
w.iMenuMaxSelection ++
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Boss starting state")
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// strToDisplay = CMHDZ_BOSS_STATE_TO_STRING(sCMHDZData.sBossData.eStartingState)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_STRING(strToDisplay, 17, GET_LENGTH_OF_LITERAL_STRING(strToDisplay)))
// w.iMenuMaxSelection ++
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Pop Up X Coord")
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_FLOAT(sCMHDZData.sBossData.fForegroundXAppear, 2))
// w.iMenuMaxSelection ++
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Block time")
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_FLOAT(sCMHDZData.sBossData.fIdleAttackTime, 2))
// w.iMenuMaxSelection ++
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Background lane")
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
strToDisplay = CMHDZ_LANE_TO_STRING(sCMHDZData.sBossData.iActiveLane)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_STRING(strToDisplay, 13, GET_LENGTH_OF_LITERAL_STRING(strToDisplay)))
w.iMenuMaxSelection ++
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Spawn Helpers")
ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_BOOL(IS_BITMASK_ENUM_AS_ENUM_SET(sCMHDZData.sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_SPAWNED_ENEMIES_1)))
w.iMenuMaxSelection ++
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Midground Popup")
// ADD_MENU_ITEM_TEXT(w.iMenuMaxSelection, "STRING", 1, TRUE)
// ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(GET_STRING_FROM_BOOL(IS_BITMASK_ENUM_AS_ENUM_SET(sCMHDZData.sBossData.eDataBits, CMHDZ_BOSS_DATA_BITS_POPUP)))
// w.iMenuMaxSelection ++
ENDPROC
PROC CMHDZ_EDITOR_BUILD_MENU(CMHDZ_EDITOR &w)//, BOOL bPlayMode = TRUE)
TEXT_LABEL_63 str
// title bar
CLEAR_MENU_DATA()
SET_MENU_TITLE("STRING")
SET_MENU_HEADER_COLOUR(0, 0, 128, 255, TRUE)
SWITCH (w.iEditMode)
CASE CMHDZ_EDITOR_MODE_ITEM
str = "ITEM EDITOR USED:"
str += sCMHDZData.iNumberOfItems
str += "/"
str += ciCMHDZ_MAX_ITEMS
// Prevent overflow
IF w.iSelectedData >= ciCMHDZ_MAX_ITEMS
w.iSelectedData = 0
ENDIF
BREAK
// CASE CMHDZ_EDITOR_MODE_HOSTAGE
// str = "HOSTAGE EDITOR USED:"
// str += sCMHDZData.iNumberOfHostages
// str += "/"
// str += ciCMHDZ_MAX_HOSTAGES
// BREAK
CASE CMHDZ_EDITOR_MODE_ENEMY
str = "ENEMY EDITOR USED:"
str += sCMHDZData.iNumberOfEnemies
str += "/"
str += ciCMHDZ_MAX_ENEMIES
// Prevent overflow
IF w.iSelectedData >= ciCMHDZ_MAX_ENEMIES
w.iSelectedData = 0
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_COVER
str = "COVER EDITOR USED:"
str += sCMHDZData.iNumberOfProps
str += "/"
str += ciCMHDZ_MAX_COVER
// Prevent overflow
IF w.iSelectedData >= ciCMHDZ_MAX_COVER
w.iSelectedData = 0
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_BOSS
str = "BOSS EDITOR:"
BREAK
DEFAULT
str = "Camhedz EDITOR"
BREAK
ENDSWITCH
//IF (w.iEditMode < 4)
//str += " SCN:"
//str += (CEIL(sCMHDZData.fOverallLevelProgression/((cfRIGHT_SCREEN_LIMIT + cfLEFT_SCREEN_LIMIT)/2)))
//ENDIF
w.iMenuMaxSelection = 0
ADD_LITERAL_TO_MENU_TITLE(str)
SET_MENU_ITEM_JUSTIFICATION(FONT_LEFT, FONT_RIGHT)
SET_MENU_ITEM_LAYOUT(MENU_ITEM_TEXT, MENU_ITEM_TEXT)
SET_CURRENT_MENU_ITEM(w.iMenuCurrentSelection)
// main option
ADD_MENU_ITEM_TEXT(0, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL("Mode")
ADD_MENU_ITEM_TEXT(0, "STRING", 1, TRUE)
ADD_MENU_ITEM_TEXT_COMPONENT_LITERAL(CMHDZ_EDITOR_MODE_TO_STRING(w.iEditMode))
SET_MENU_ITEM_TOGGLEABLE(FALSE, TRUE)
w.iMenuMaxSelection ++
// add asset menu
SWITCH (w.iEditMode)
CASE CMHDZ_EDITOR_MODE_ITEM
CMHDZ_EDITOR_BUILD_ITEM_MENU(w)
BREAK
CASE CMHDZ_EDITOR_MODE_ENEMY
CMHDZ_EDITOR_BUILD_ENEMY_MENU(w)
BREAK
CASE CMHDZ_EDITOR_MODE_COVER
CMHDZ_EDITOR_BUILD_COVER_MENU(w)
BREAK
CASE CMHDZ_EDITOR_MODE_LEVEL
CMHDZ_EDITOR_BUILD_LEVEL_MENU(w)
BREAK
CASE CMHDZ_EDITOR_MODE_BOSS
CMHDZ_EDITOR_BUILD_BOSS_MENU(w)//, bPlayMode)
BREAK
ENDSWITCH
SET_MAX_MENU_ROWS_TO_DISPLAY(w.iMenuMaxSelection)
w.bRebuildMenu = FALSE
ENDPROC
PROC CMHDZ_EDITOR_SELECT_RETICULE_OVER_OBJECT_FOR_EDIT(CMHDZ_EDITOR &w)
INT i
// priorities current mode
IF (w.iEditMode < 5)
IF (w.iReticuleOverIndex[w.iEditMode] != -1)
IF (w.iSelectedData != w.iReticuleOverIndex[w.iEditMode])
w.iSelectedData = w.iReticuleOverIndex[w.iEditMode]
w.bRebuildMenu = TRUE
ENDIF
EXIT
ENDIF
ENDIF
// then check item
REPEAT 5 i
IF (w.iReticuleOverIndex[i] != -1) AND (w.iEditMode != i)
w.iEditMode = i
w.iSelectedData = w.iReticuleOverIndex[i]
w.bRebuildMenu = TRUE
EXIT
ENDIF
ENDREPEAT
ENDPROC
PROC CMHDZ_EDITOR_UPDATE_GENERAL_OPTIONS(CMHDZ_EDITOR &w)
// handle up and down and quit
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, INPUT_SCRIPT_PAD_UP)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_W)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_UP)
OR CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, INPUT_CELLPHONE_UP)
w.iMenuCurrentSelection --
IF (w.iMenuCurrentSelection < 0)
w.iMenuCurrentSelection = w.iMenuMaxSelection - 1
ENDIF
w.bRebuildMenu = TRUE
ENDIF
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, INPUT_SCRIPT_PAD_DOWN)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_S)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_DOWN)
OR CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, INPUT_CELLPHONE_DOWN)
w.iMenuCurrentSelection ++
IF (w.iMenuCurrentSelection >= w.iMenuMaxSelection)
w.iMenuCurrentSelection = 0
ENDIF
w.bRebuildMenu = TRUE
ENDIF
// IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, INPUT_FRONTEND_CANCEL)
// OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, KEY_RSHIFT)
// IF (w.iEditMode != CMHDZ_EDITOR_MODE_LEVEL)
// w.iEditMode = CMHDZ_EDITOR_MODE_LEVEL
// w.bRebuildMenu = TRUE
// ENDIF
// ENDIF
// handle main option change
IF (w.iMenuCurrentSelection = 0)
AND (IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RLEFT)
OR (IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) AND IS_KEYBOARD_KEY_PRESSED(KEY_LCONTROL)))
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, w.iEditMode, 0, CMHDZ_EDITOR_MODE_MAX_TYPES, 1, FALSE)
CMHDZ_EDITOR_LOAD_OR_RESTART_LEVEL(w, TRUE) // Restart the level when we switch Editor modes.
// Change the stage and progress for the Boss menu.
IF w.iEditMode = CMHDZ_EDITOR_MODE_BOSS
w.iActiveLevel = ENUM_TO_INT(CMHDZ_LEVEL_SLAUGHTERHOUSE)
CMHDZ_EDITOR_LOAD_OR_RESTART_LEVEL(w, TRUE)
sCMHDZData.fOverallLevelProgression = 25306
ENDIF
sCMHDZData.bDebugInvunerablePlayer = TRUE
w.bRebuildMenu = TRUE
w.iSelectedData = -1
ENDIF
ENDIF
// pick based on mode type
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, w.ctrlPick)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, w.ctrlPick_PC)
CMHDZ_EDITOR_SELECT_RETICULE_OVER_OBJECT_FOR_EDIT(w)
ENDIF
ENDPROC
FUNC BOOL CMHDZ_EDITOR_UPDATE_COVER_OPTIONS(CMHDZ_EDITOR &w)
INT iType
FLOAT fAdjust
SWITCH (w.iMenuCurrentSelection)
CASE CMHDZ_EDITOR_MODE_COVER_NEW_UNIT
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, w.iNewUnitData, 0, ENUM_TO_INT(NUM_CMHDZ_ASSET_TYPES), 1, FALSE)
RETURN TRUE
ENDIF
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, w.ctrlPlace)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, w.ctrlPlace_PC)
iType = CMHDZ_EDITOR_PLACE_NEW_UNIT(w, w.iNewUnitData)
RETURN (iType != -1)
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_COVER_INDEX
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, w.iSelectedData, 0, sCMHDZData.iNumberOfProps, 1, FALSE)
IF (w.iSelectedData <= -1)
OR w.iSelectedData > sCMHDZData.iNumberOfProps
w.iSelectedData = 0
ENDIF
// Set camera to the point the cover appears
sCMHDZData.fOverallLevelProgression = w.sCoverMapData[w.iSelectedData].vSpriteInitialPos.x - (cfBASE_SCREEN_WIDTH/2.0)
sCMHDZData.iCurrentScreen = FLOOR(sCMHDZData.fOverallLevelProgression/cfCMHDZ_SCREEN_LENGTH)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_COVER_LEVEL
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, w.iActiveLevel, 0, ENUM_TO_INT(CMHDZ_MAX_LEVELS), 1, FALSE)
CMHDZ_EDITOR_LOAD_OR_RESTART_LEVEL(w, TRUE)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_COVER_TYPE
iType = ENUM_TO_INT(w.sCoverMapData[w.iSelectedData].eType)
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, iType, -1, ENUM_TO_INT(NUM_CMHDZ_ASSET_TYPES), 1, FALSE)
w.sCoverMapData[w.iSelectedData].eType = INT_TO_ENUM(CMHDZ_ASSET_TYPES, iType)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_COVER_LANE
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, w.sCoverMapData[w.iSelectedData].iCoverLane, 0, ciCMHDZ_MAX_LANES, 1, FALSE)
//CMHDZ_COPY_COVER_MAP_TO_COVER(sCMHDZData.sCoverMapData[w.iSelectedData], w.iSelectedData)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_COVER_IS_FAR_BG
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_BITMASK_ENUM_BOOL(w, w.sCoverMapData[w.iSelectedData].eDataBits, CMHDZ_COVER_DATA_BITS_IS_FAR_BG)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_COVER_REMOVE_OFF_SCREEN
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_BITMASK_ENUM_BOOL(w, w.sCoverMapData[w.iSelectedData].eDataBits, CMHDZ_COVER_DATA_BITS_REMOVE_OFF_SCREEN)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_COVER_EXPORT
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, w.ctrlPlace)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, w.ctrlPlace_PC)
CMHDZ_DEBUG_EXPORT_COVER_MAP_DATA_TO_SCRIPT(w.sCoverMapData[w.iSelectedData], w.iSelectedData)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_COVER_EXPORT_ALL
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, w.ctrlPlace)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, w.ctrlPlace_PC)
CMHDZ_DEBUG_EXPORT_COVER_MAP_DATA_ARRAY_TO_SCRIPT(w.sCoverMapData)
RETURN TRUE
ENDIF
BREAK
// CASE CMHDZ_EDITOR_MODE_COVER_SCROLLING
// IF CMHDZ_EDITOR_CONTROLLER_ADJUST_BITMASK_ENUM_BOOL(w, w.sCoverMapData[w.iSelectedData].eDataBits, CMHDZ_COVER_DATA_BITS_STOP_SCROLLING)
// IF IS_BITMASK_ENUM_AS_ENUM_SET(w.sCoverMapData[w.iSelectedData].eDataBits, CMHDZ_COVER_DATA_BITS_STOP_SCROLLING)
// IF (w.sCoverMapData[w.iSelectedData].fXScreenCoordForStop = 0.0)
// w.sCoverMapData[w.iSelectedData].fXScreenCoordForStop = sCMHDZData.sCoverData[w.iSelectedData].vSpritePos.x
// ENDIF
//
// IF (w.sCoverMapData[w.iSelectedData].fXScreenCoordForStop < 700)
// w.sCoverMapData[w.iSelectedData].fXScreenCoordForStop = 700
// ENDIF
//
// ENDIF
//
// RETURN TRUE
// ENDIF
// BREAK
// CASE CMHDZ_EDITOR_MODE_COVER_STOP_POS
// IF CMHDZ_EDITOR_CONTROLLER_ADJUST_FLOAT(w, w.sCoverMapData[w.iSelectedData].fXScreenCoordForStop, 0, 2500, 24)
//// IF IS_BITMASK_ENUM_AS_ENUM_SET(w.sCoverMapData[w.iSelectedData].eDataBits, CMHDZ_COVER_DATA_BITS_STOP_SCROLLING)
//// IF (w.sCoverMapData[w.iSelectedData].fXScreenCoordForStop < 700)
//// w.sCoverMapData[w.iSelectedData].fXScreenCoordForStop = 700
//// ENDIF
//// ENDIF
// RETURN TRUE
// ENDIF
// BREAK
//
CASE CMHDZ_EDITOR_MODE_COVER_INITIAL_X
fAdjust = 240.0
IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RLEFT)
#IF IS_DEBUG_BUILD
OR IS_KEYBOARD_KEY_PRESSED(KEY_LSHIFT)
#ENDIF
fAdjust = 24.00
ENDIF
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_FLOAT(w, w.sCoverMapData[w.iSelectedData].vSpriteInitialPos.x, cfCMHDZ_MIN_EDITOR_X_COORD, cfCMHDZ_MAX_EDITOR_X_COORD, fAdjust)
sCMHDZData.fOverallLevelProgression = w.sCoverMapData[w.iSelectedData].vSpriteInitialPos.x - (cfBASE_SCREEN_WIDTH/2.0)
sCMHDZData.iCurrentScreen = FLOOR(sCMHDZData.fOverallLevelProgression/cfCMHDZ_SCREEN_LENGTH)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_COVER_INITIAL_Y
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_FLOAT(w, w.sCoverMapData[w.iSelectedData].vSpriteInitialPos.y, cfCMHDZ_MIN_EDITOR_Y_COORD, cfCMHDZ_MAX_EDITOR_Y_COORD, 24)
w.sCoverMapData[w.iSelectedData].vSpritePos.y = w.sCoverMapData[w.iSelectedData].vSpriteInitialPos.y
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
CMHDZ_COPY_COVER_MAP_DATA_TO_GAME(w.sCoverMapData)
RETURN FALSE
ENDFUNC
FUNC BOOL CMHDZ_EDITOR_UPDATE_ENEMY_OPTIONS(CMHDZ_EDITOR &w)
INT iType
FLOAT fAdjust // Can change some interation values with modifiers.
SWITCH (w.iMenuCurrentSelection)
CASE CMHDZ_EDITOR_MODE_ENEMY_NEW_UNIT
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, w.iNewUnitData, 0, ENUM_TO_INT(NUM_CMHDZ_ENEMY_TYPES), 1, FALSE)
RETURN TRUE
ENDIF
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, w.ctrlPlace)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, w.ctrlPlace_PC)
iType = CMHDZ_EDITOR_PLACE_NEW_UNIT(w, w.iNewUnitData)
RETURN (iType != -1)
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ENEMY_INDEX
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, w.iSelectedData, 0, ciCMHDZ_MAX_ENEMIES, 1, FALSE)
IF (w.iSelectedData != -1)
IF (w.sEnemyMapData[w.iSelectedData].eEnemyType = CMHDZ_ENEMY_INVALID)
w.iSelectedData = 0
ENDIF
// Set the screen view to the enemy you are looking at.
IF w.sEnemyMapData[w.iSelectedData].fPointToAppear > 0.0
sCMHDZData.fOverallLevelProgression = w.sEnemyMapData[w.iSelectedData].fPointToAppear
sCMHDZData.iCurrentScreen = FLOOR(sCMHDZData.fOverallLevelProgression/cfCMHDZ_SCREEN_LENGTH)
ENDIF
ENDIF
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ENEMY_LEVEL
// Safety precaution
IF (IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RLEFT)
OR (IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) AND IS_KEYBOARD_KEY_PRESSED(KEY_LCONTROL)))
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, w.iActiveLevel, 0, ENUM_TO_INT(CMHDZ_MAX_LEVELS), 1, FALSE)
CMHDZ_COPY_ENEMY_MAP_DATA_TO_GAME(w.sEnemyMapData)
CMHDZ_EDITOR_LOAD_OR_RESTART_LEVEL(w, TRUE)
RETURN TRUE
ENDIF
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ENEMY_TYPE
iType = ENUM_TO_INT(w.sEnemyMapData[w.iSelectedData].eEnemyType)
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, iType, 0, ENUM_TO_INT(NUM_CMHDZ_ENEMY_TYPES), 1, FALSE)
w.sEnemyMapData[w.iSelectedData].eEnemyType = INT_TO_ENUM(CMHDZ_ENEMY_TYPES, iType)
CMHDZ_COPY_ENEMY_MAP_TO_ENEMY(w.sEnemyMapData[w.iSelectedData], w.iSelectedData)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ENEMY_LANE
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, w.sEnemyMapData[w.iSelectedData].iLane, 0, ciCMHDZ_MAX_LANES, 1, FALSE)
CMHDZ_COPY_ENEMY_MAP_TO_ENEMY(w.sEnemyMapData[w.iSelectedData], w.iSelectedData)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ENEMY_POSITION
fAdjust = 240.0
IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RLEFT)
#IF IS_DEBUG_BUILD
OR IS_KEYBOARD_KEY_PRESSED(KEY_LSHIFT)
#ENDIF
fAdjust = 24.00
ENDIF
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_FLOAT(w, w.sEnemyMapData[w.iSelectedData].fPointToAppear, 0.0, CMHDZ_GET_FINAL_SCREEN_IN_CURRENT_LEVEL() * cfCMHDZ_SCREEN_LENGTH, fAdjust)
//CMHDZ_COPY_ENEMY_MAP_TO_ENEMY(w.sEnemyMapData[w.iSelectedData], w.iSelectedData)
// Update the camera position
sCMHDZData.fOverallLevelProgression = w.sEnemyMapData[w.iSelectedData].fPointToAppear
sCMHDZData.iCurrentScreen = FLOOR(sCMHDZData.fOverallLevelProgression/cfCMHDZ_SCREEN_LENGTH)
RETURN TRUE
ENDIF
BREAK
// CASE CMHDZ_EDITOR_MODE_ENEMY_RENDERWARP
// IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, w.sEnemyMapData[w.iSelectedData].iRenderAfterWarpCount, 0, 10)
// CMHDZ_COPY_ENEMY_MAP_TO_ENEMY(w.sEnemyMapData[w.iSelectedData], w.iSelectedData)
// RETURN TRUE
// ENDIF
// BREAK
CASE CMHDZ_EDITOR_MODE_ENEMY_REVERSE
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_BITMASK_ENUM_BOOL(w, w.sEnemyMapData[w.iSelectedData].eDataBits, CMHDZ_ENEMY_DATA_BITS_REVERSE)
CMHDZ_COPY_ENEMY_MAP_TO_ENEMY(w.sEnemyMapData[w.iSelectedData], w.iSelectedData)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ENEMY_WAITSCROLL
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_BITMASK_ENUM_BOOL(w, w.sEnemyMapData[w.iSelectedData].eDataBits, CMHDZ_ENEMY_DATA_BITS_WAIT_UNTIL_LEVEL_STATIONARY)
CMHDZ_COPY_ENEMY_MAP_TO_ENEMY(w.sEnemyMapData[w.iSelectedData], w.iSelectedData)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ENEMY_IS_POP_UP
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_BITMASK_ENUM_BOOL(w, w.sEnemyMapData[w.iSelectedData].eDataBits, CMHDZ_ENEMY_DATA_BITS_IS_POPUP)
CMHDZ_COPY_ENEMY_MAP_TO_ENEMY(w.sEnemyMapData[w.iSelectedData], w.iSelectedData)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ENEMY_STOP_POS
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_FLOAT(w, w.sEnemyMapData[w.iSelectedData].fStoppingPos, cfCMHDZ_MIN_EDITOR_X_COORD, cfCMHDZ_MAX_EDITOR_X_COORD, 24)
CMHDZ_COPY_ENEMY_MAP_TO_ENEMY(w.sEnemyMapData[w.iSelectedData], w.iSelectedData)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ENEMY_INITIAL_X
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_FLOAT(w, w.sEnemyMapData[w.iSelectedData].vSpritePos.x, cfCMHDZ_MIN_EDITOR_X_COORD, cfCMHDZ_MAX_EDITOR_X_COORD, 24)
////sCMHDZData.fOverallLevelProgression = w.sEnemyMapData[w.iSelectedData].vSpritePos.x
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ENEMY_INITIAL_Y
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_FLOAT(w, w.sEnemyMapData[w.iSelectedData].vSpritePos.y, cfCMHDZ_MIN_EDITOR_Y_COORD, cfCMHDZ_MAX_EDITOR_Y_COORD, 24)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ENEMY_EXPORT
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, w.ctrlPlace)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, w.ctrlPlace_PC)
CMHDZ_DEBUG_EXPORT_ENEMY_MAP_DATA_TO_SCRIPT(w.sEnemyMapData[w.iSelectedData], w.iSelectedData)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ENEMY_EXPORT_ALL
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, w.ctrlPlace)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, w.ctrlPlace_PC)
CMHDZ_DEBUG_EXPORT_ENEMY_MAP_DATA_ARRAY_TO_SCRIPT(w.sEnemyMapData)
CMHDZ_COPY_ENEMY_MAP_DATA_TO_GAME(w.sEnemyMapData)
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
//CMHDZ_COPY_ENEMY_MAP_DATA_TO_GAME(w.sEnemyMapData)
RETURN FALSE
ENDFUNC
FUNC BOOL CMHDZ_EDITOR_UPDATE_ITEM_OPTIONS(CMHDZ_EDITOR &w)
INT iType
FLOAT fAdjust
SWITCH (w.iMenuCurrentSelection)
CASE CMHDZ_EDITOR_MODE_ITEM_NEW_UNIT
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, w.iNewUnitData, 0, ENUM_TO_INT(NUM_CMHDZ_ITEM_TYPES), 1, FALSE)
RETURN TRUE
ENDIF
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, w.ctrlPlace)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, w.ctrlPlace_PC)
iType = CMHDZ_EDITOR_PLACE_NEW_UNIT(w, w.iNewUnitData)
RETURN (iType != -1)
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ITEM_INDEX
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, w.iSelectedData, 0, ciCMHDZ_MAX_ITEMS, 1, FALSE)
IF (w.iSelectedData != -1)
OR w.iSelectedData >= sCMHDZData.iNumberOfItems
IF (w.sItemMapData[w.iSelectedData].eItemType = CMHDZ_ITEM_NONE)
w.iSelectedData = 0
ENDIF
sCMHDZData.fOverallLevelProgression = w.sItemMapData[w.iSelectedData].vSpritePos.x - (cfBASE_SCREEN_WIDTH/2.0)
//sCMHDZData.fOverallLevelProgression = (w.sItemMapData[w.iSelectedData].vSpritePos.x - (w.sItemMapData[w.iSelectedData].vSpritePos.x%1920))
sCMHDZData.iCurrentScreen = FLOOR(sCMHDZData.fOverallLevelProgression/cfCMHDZ_SCREEN_LENGTH)
ENDIF
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ITEM_LEVEL
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, w.iActiveLevel, 0, ENUM_TO_INT(CMHDZ_MAX_LEVELS), 1, FALSE)
CMHDZ_EDITOR_LOAD_OR_RESTART_LEVEL(w, TRUE)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ITEM_TYPE
iType = ENUM_TO_INT(w.sItemMapData[w.iSelectedData].eItemType)
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, iType, 0, ENUM_TO_INT(NUM_CMHDZ_ITEM_TYPES), 1, FALSE)
w.sItemMapData[w.iSelectedData].eItemType = INT_TO_ENUM(CMHDZ_ITEM_TYPES, iType)
CMHDZ_COPY_ITEM_MAP_TO_ITEM(w.sItemMapData[w.iSelectedData], w.iSelectedData)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ITEM_LANE
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, w.sItemMapData[w.iSelectedData].iLane, 0, ciCMHDZ_MAX_LANES, 1, FALSE)
CMHDZ_COPY_ITEM_MAP_TO_ITEM(w.sItemMapData[w.iSelectedData], w.iSelectedData)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ITEM_SCREEN
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, w.sItemMapData[w.iSelectedData].iMinScreen, 1, ciCMHDZ_MAX_SCREENS)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ITEM_RENDERWARP
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, w.sItemMapData[w.iSelectedData].iRenderAfterWarpCount, 0, 10)
CMHDZ_COPY_ITEM_MAP_TO_ITEM(w.sItemMapData[w.iSelectedData], w.iSelectedData)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ITEM_FORCESCALE
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_FLOAT(w, w.sItemMapData[w.iSelectedData].fForceScale, 0, 2.0, 0.25)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ITEM_INITIAL_X
fAdjust = 240.0
IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RLEFT)
#IF IS_DEBUG_BUILD
OR IS_KEYBOARD_KEY_PRESSED(KEY_LSHIFT)
#ENDIF
fAdjust = 24.00
ENDIF
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_FLOAT(w, w.sItemMapData[w.iSelectedData].vSpritePos.x, 0, CMHDZ_GET_FINAL_SCREEN_IN_CURRENT_LEVEL() * 1920.0, fAdjust)
// Adjust again if we're manipulating X position.
sCMHDZData.fOverallLevelProgression = w.sItemMapData[w.iSelectedData].vSpritePos.x - (cfBASE_SCREEN_WIDTH/2.0)
sCMHDZData.iCurrentScreen = FLOOR(sCMHDZData.fOverallLevelProgression/cfCMHDZ_SCREEN_LENGTH)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ITEM_INITIAL_Y
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_FLOAT(w, w.sItemMapData[w.iSelectedData].vSpritePos.y, 0, cfBASE_SCREEN_HEIGHT, 24)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ITEM_EXPORT
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, w.ctrlPlace)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, w.ctrlPlace_PC)
CMHDZ_DEBUG_EXPORT_ITEM_MAP_DATA_TO_SCRIPT(w.sItemMapData[w.iSelectedData], w.iSelectedData)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ITEM_EXPORT_ALL
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, w.ctrlPlace)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, w.ctrlPlace_PC)
CMHDZ_DEBUG_EXPORT_ITEM_MAP_DATA_ARRAY_TO_SCRIPT(w.sItemMapData)
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
//CMHDZ_COPY_ITEM_MAP_DATA_TO_GAME(w.sItemMapData)
RETURN FALSE
ENDFUNC
//FUNC BOOL CMHDZ_EDITOR_UPDATE_HOSTAGE_OPTIONS(CMHDZ_EDITOR &w)
// INT iType
//
// SWITCH (w.iMenuCurrentSelection)
// CASE CMHDZ_EDITOR_MODE_HOSTAGE_NEW_UNIT
// IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, w.iNewUnitData, 0, ENUM_TO_INT(NUM_CMHDZ_HOSTAGE_TYPES), 1, FALSE)
// RETURN TRUE
// ENDIF
//
// IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, w.ctrlPlace)
// OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, w.ctrlPlace_PC)
// iType = CMHDZ_EDITOR_PLACE_NEW_UNIT(w, w.iNewUnitData)
// RETURN (iType != -1)
// ENDIF
// BREAK
//
// CASE CMHDZ_EDITOR_MODE_HOSTAGE_INDEX
// IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, w.iSelectedData, 0, ciCMHDZ_MAX_HOSTAGES, 1, FALSE)
// IF (w.iSelectedData != -1)
// IF (w.sHostageMapData[w.iSelectedData].eHostageType = CMHDZ_HOSTAGE_INVALID)
// w.iSelectedData = 0
// ENDIF
// ENDIF
//
// RETURN TRUE
// ENDIF
// BREAK
//
// CASE CMHDZ_EDITOR_MODE_HOSTAGE_TYPE
// iType = ENUM_TO_INT(w.sHostageMapData[w.iSelectedData].eHostageType)
// IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, iType, -1, ENUM_TO_INT(NUM_CMHDZ_HOSTAGE_TYPES), 1, FALSE)
// w.sHostageMapData[w.iSelectedData].eHostageType = INT_TO_ENUM(CMHDZ_HOSTAGE_TYPES, iType)
// CMHDZ_COPY_HOSTAGE_MAP_TO_HOSTAGE(w.sHostageMapData[w.iSelectedData], w.iSelectedData)
// RETURN TRUE
// ENDIF
// BREAK
//
// CASE CMHDZ_EDITOR_MODE_HOSTAGE_LANE
// IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, w.sHostageMapData[w.iSelectedData].iHostageLane, 0, ciCMHDZ_MAX_LANES, 1, FALSE)
// CMHDZ_COPY_HOSTAGE_MAP_TO_HOSTAGE(w.sHostageMapData[w.iSelectedData], w.iSelectedData)
// RETURN TRUE
// ENDIF
// BREAK
//
// CASE CMHDZ_EDITOR_MODE_HOSTAGE_REVERSE
// IF CMHDZ_EDITOR_CONTROLLER_ADJUST_BITSET_BOOL(w, w.sHostageMapData[w.iSelectedData].iBitset, ENUM_TO_INT(CMHDZ_HOSTAGE_BIT_GOING_BACK))
// CMHDZ_COPY_HOSTAGE_MAP_TO_HOSTAGE(w.sHostageMapData[w.iSelectedData], w.iSelectedData)
// RETURN TRUE
// ENDIF
// BREAK
//
// CASE CMHDZ_EDITOR_MODE_HOSTAGE_STOP_POS
// IF CMHDZ_EDITOR_CONTROLLER_ADJUST_FLOAT(w, w.sHostageMapData[w.iSelectedData].fStoppingX, 0, 2500, 50)
// CMHDZ_COPY_HOSTAGE_MAP_TO_HOSTAGE(w.sHostageMapData[w.iSelectedData], w.iSelectedData)
// RETURN TRUE
// ENDIF
// BREAK
//
// CASE CMHDZ_EDITOR_MODE_HOSTAGE_INITIAL_X
// IF CMHDZ_EDITOR_CONTROLLER_ADJUST_FLOAT(w, w.sHostageMapData[w.iSelectedData].vSpritePos.x, -4000, 4000, 50)
// RETURN TRUE
// ENDIF
// BREAK
//
// CASE CMHDZ_EDITOR_MODE_HOSTAGE_INITIAL_Y
// IF CMHDZ_EDITOR_CONTROLLER_ADJUST_FLOAT(w, w.sHostageMapData[w.iSelectedData].vSpritePos.y, 0, cfBASE_SCREEN_HEIGHT, 50)
// RETURN TRUE
// ENDIF
// BREAK
// ENDSWITCH
//
// RETURN FALSE
//ENDFUNC
FUNC BOOL CMHDZ_EDITOR_UPDATE_LEVEL_OPTIONS(CMHDZ_EDITOR &w)
FLOAT fAdjust // Can change some interation values with modifiers.
SWITCH (w.iMenuCurrentSelection)
CASE CMHDZ_EDITOR_MODE_LEVEL_INDEX
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, w.iActiveLevel, 0, ENUM_TO_INT(CMHDZ_MAX_LEVELS), 1, FALSE)
CMHDZ_EDITOR_LOAD_OR_RESTART_LEVEL(w, TRUE)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_LEVEL_PROGRESS_SET
fAdjust = 240.0
IF (IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RLEFT))
fAdjust = 24.00
ENDIF
IF CMHDZ_EDITOR_CONTROLLER_ADJUST_FLOAT(w, sCMHDZData.fOverallLevelProgression, 0.0, CMHDZ_GET_FINAL_SCREEN_IN_CURRENT_LEVEL()*cfRIGHT_SCREEN_LIMIT, fAdjust)
sCMHDZData.iCurrentScreen = FLOOR(sCMHDZData.fOverallLevelProgression/cfCMHDZ_SCREEN_LENGTH)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_LEVEL_SCREEN
// IF CMHDZ_EDITOR_CONTROLLER_ADJUST_INT(w, (CEIL(sCMHDZData.fOverallLevelProgression/((cfRIGHT_SCREEN_LIMIT + cfLEFT_SCREEN_LIMIT)/2))), 1, CMHDZ_GET_FINAL_SCREEN_IN_CURRENT_LEVEL())
// CMHDZ_EDITOR_GET_ACTIVE_SCREEN_DATA(w, (CEIL(sCMHDZData.fOverallLevelProgression/((cfRIGHT_SCREEN_LIMIT + cfLEFT_SCREEN_LIMIT)/2))))
// RETURN TRUE
// ENDIF
BREAK
// CASE CMHDZ_EDITOR_MODE_LEVEL_STOP_PROP
// IF (ENUM_TO_INT(sCMHDZData.eCurrentLevel) = w.iActiveLevel)
// IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, w.ctrlPick)
// OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, w.ctrlPick_PC)
// IF (sCMHDZData.iPropToStopOn[(CEIL(sCMHDZData.fOverallLevelProgression/((cfRIGHT_SCREEN_LIMIT + cfLEFT_SCREEN_LIMIT)/2)))] != -1)
// //CMHDZ_EDITOR_GET_ACTIVE_SCREEN_DATA(w, w.sCoverMapData[sCMHDZData.iPropToStopOn[(CEIL(sCMHDZData.fOverallLevelProgression/((cfRIGHT_SCREEN_LIMIT + cfLEFT_SCREEN_LIMIT)/2)))]].iScreen)
// RETURN TRUE
// ENDIF
// ENDIF
// ENDIF
// BREAK
CASE CMHDZ_EDITOR_MODE_LEVEL_PLAY
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, w.ctrlPick)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, w.ctrlPick_PC)
CMHDZ_EDITOR_PLAY_LEVEL(w)
RETURN TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_LEVEL_RESET
IF (ENUM_TO_INT(sCMHDZData.eCurrentLevel) = w.iActiveLevel)
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, w.ctrlPick)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, w.ctrlPick_PC)
CMHDZ_EDITOR_LOAD_OR_RESTART_LEVEL(w, FALSE)
RETURN TRUE
ENDIF
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_EXPORT_LEVEL
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, w.ctrlPick)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, w.ctrlPick_PC)
CMHDZ_EDITOR_LOAD_OR_RESTART_LEVEL(w, TRUE)
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC CMHDZ_EDITOR_RUN_MENU(CMHDZ_EDITOR &w)
IF (w.bPlayStage)
EXIT
ENDIF
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, w.ctrlToggleMap)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, w.ctrlToggleMap_PC)
w.bShowMiniMap = !w.bShowMiniMap
ENDIF
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, w.ctrlToggleMap)
OR CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, w.ctrlToggleMap_PC)
IF (!w.bMenuActive)
w.bRebuildMenu = TRUE
ENDIF
w.bMenuActive = !w.bMenuActive
ENDIF
IF (!w.bMenuActive) OR IS_PAUSE_MENU_ACTIVE_EX()
EXIT
ENDIF
IF NOT LOAD_MENU_ASSETS()
EXIT
ENDIF
IF (w.bRebuildMenu)
CMHDZ_EDITOR_BUILD_MENU(w)
ELSE
SET_CURRENT_MENU_ITEM(w.iMenuCurrentSelection)
ENDIF
CMHDZ_EDITOR_UPDATE_GENERAL_OPTIONS(w)
SWITCH (w.iEditMode)
CASE CMHDZ_EDITOR_MODE_ITEM
IF CMHDZ_EDITOR_UPDATE_ITEM_OPTIONS(w)
IF (w.iSelectedData != -1)
CMHDZ_COPY_ITEM_MAP_TO_ITEM(w.sItemMapData[w.iSelectedData], w.iSelectedData)
ENDIF
w.bRebuildMenu = TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_ENEMY
IF CMHDZ_EDITOR_UPDATE_ENEMY_OPTIONS(w)
IF (w.iSelectedData != -1)
CMHDZ_COPY_ENEMY_MAP_TO_ENEMY(w.sEnemyMapData[w.iSelectedData], w.iSelectedData)
ENDIF
w.bRebuildMenu = TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_COVER
IF CMHDZ_EDITOR_UPDATE_COVER_OPTIONS(w)
IF (w.iSelectedData != -1)
//CMHDZ_COPY_COVER_MAP_TO_COVER(w.sCoverMapData[w.iSelectedData], w.iSelectedData)
ENDIF
w.bRebuildMenu = TRUE
ENDIF
BREAK
CASE CMHDZ_EDITOR_MODE_LEVEL
IF CMHDZ_EDITOR_UPDATE_LEVEL_OPTIONS(w)
w.bRebuildMenu = TRUE
ENDIF
BREAK
ENDSWITCH
DRAW_MENU()
ENDPROC
PROC CMHDZ_EDITOR_RUN_PLAY_MENU(CMHDZ_EDITOR &w)
IF ((!w.bPlayStage) AND (sCMHDZData.eClientState != CMHDZ_ARCADE_CLIENT_STATE_PLAYING))
EXIT
ENDIF
IF CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, w.ctrlToggleMenu)
IF (!w.bMenuActive)
w.bRebuildMenu = TRUE
ENDIF
w.bMenuActive = !w.bMenuActive
ENDIF
IF CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, w.ctrlToggleMenu_PC)
IF (!w.bMenuActive)
w.bRebuildMenu = TRUE
ENDIF
w.bMenuActive = !w.bMenuActive
ENDIF
IF (!w.bMenuActive) OR IS_PAUSE_MENU_ACTIVE_EX()
EXIT
ENDIF
IF NOT LOAD_MENU_ASSETS()
EXIT
ENDIF
IF (GET_GAME_TIMER() > w.iPlayMenuUpdateClock)
w.bRebuildMenu = TRUE
w.iPlayMenuUpdateClock = (GET_GAME_TIMER() + 500)
ENDIF
IF (w.bRebuildMenu)
CMHDZ_EDITOR_BUILD_PLAY_MENU(w)
ELSE
SET_CURRENT_MENU_ITEM(w.iMenuCurrentSelection)
ENDIF
DRAW_MENU()
ENDPROC
FUNC INT CMHDZ_EDITOR_CHECK_RETICULE_OVER_INDEX(INT iMode)
SWITCH (iMode)
CASE CMHDZ_EDITOR_MODE_ENEMY
RETURN CMHDZ_GET_ENEMY_OVER_RETICULE()
BREAK
CASE CMHDZ_EDITOR_MODE_COVER
RETURN CMHDZ_GET_COVER_OVER_RETICULE()
BREAK
// CASE CMHDZ_EDITOR_MODE_HOSTAGE
// RETURN CMHDZ_GET_HOSTAGE_OVER_RETICULE()
// BREAK
CASE CMHDZ_EDITOR_MODE_ITEM
RETURN CMHDZ_GET_ITEM_OVER_RETICULE()
BREAK
ENDSWITCH
RETURN -1
ENDFUNC
PROC CMHDZ_EDITOR_UPDATE_RETICULE_DRAG(CMHDZ_EDITOR &w)
IF (w.bPlayStage)
EXIT
ENDIF
IF (w.iSelectedData = -1)
EXIT
ENDIF
IF NOT CMHDZ_EDITOR_IS_CONTROL_PRESSED_FOR_OPTION(w, w.ctrlPick)
AND NOT CMHDZ_EDITOR_IS_KEY_PRESSED_FOR_OPTION(w, w.ctrlPick_PC)
EXIT
ENDIF
IF IS_VECTOR_2D_ZERO(w.vReticuleDelta)
EXIT
ENDIF
SWITCH (w.iEditMode)
CASE CMHDZ_EDITOR_MODE_COVER
w.sCoverMapData[w.iSelectedData].vSpriteInitialPos.x += w.vReticuleDelta.x
w.sCoverMapData[w.iSelectedData].vSpriteInitialPos.y += w.vReticuleDelta.y
//w.sCoverMapData[w.iSelectedData].iScreen = CMHDZ_GET_SCREEN_FOR_X_POSITION(w.sCoverMapData[w.iSelectedData].vSpriteInitialPos.x)
CMHDZ_COPY_COVER_MAP_TO_COVER(w.sCoverMapData[w.iSelectedData], w.iSelectedData)
// sCMHDZData.sCoverData[w.iSelectedData].vSpritePos.x += w.vReticuleDelta.x
// sCMHDZData.sCoverData[w.iSelectedData].vSpritePos.y += w.vReticuleDelta.y
w.bRebuildMenu = TRUE
BREAK
CASE CMHDZ_EDITOR_MODE_ITEM
w.sItemMapData[w.iSelectedData].vSpritePos.x += w.vReticuleDelta.x
w.sItemMapData[w.iSelectedData].vSpritePos.y += w.vReticuleDelta.y
CMHDZ_COPY_ITEM_MAP_TO_ITEM(w.sItemMapData[w.iSelectedData], w.iSelectedData)
// sCMHDZData.sItemData[w.iSelectedData].vSpritePos.x += w.vReticuleDelta.x
// sCMHDZData.sItemData[w.iSelectedData].vSpritePos.y += w.vReticuleDelta.y
w.bRebuildMenu = TRUE
BREAK
ENDSWITCH
ENDPROC
PROC CMHDZ_EDITOR_UPDATE_RETICULE(CMHDZ_EDITOR &w)
INT i
BOOL bTypeLocked
// reticule
w.vReticulePos = CMHDZ_GET_PLAYER_RETICULE_POSITON()
w.vReticuleDelta = SUBTRACT_VECTOR_2D(w.vReticulePos, w.vReticuleOldPos)
w.vReticuleOldPos = w.vReticulePos
IF (w.bPlayStage)
EXIT
ENDIF
REPEAT 4 i
w.iReticuleOverIndex[i] = CMHDZ_EDITOR_CHECK_RETICULE_OVER_INDEX(i)
IF (w.iReticuleOverIndex[i] != -1)
IF (w.iEditMode = i) OR (bTypeLocked = FALSE)
w.iReticuleOverType = i
bTypeLocked = TRUE
ENDIF
ENDIF
ENDREPEAT
CMHDZ_EDITOR_UPDATE_RETICULE_DRAG(w)
ENDPROC
PROC CMHDZ_EDITOR_REBOOT(CMHDZ_EDITOR &w, BOOL bLoad = FALSE)
w.bPlayStage = FALSE
sCMHDZData.bDebugPause = TRUE
CMHDZ_EDITOR_LOAD_OR_RESTART_LEVEL(w, bLoad)
w.iEditMode = CMHDZ_EDITOR_MODE_LEVEL
w.iSelectedData = -1
w.bMenuActive = TRUE
w.bRebuildMenu = TRUE
sCMHDZData.bDebugInvunerablePlayer = TRUE
CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_EDITOR_REBOOT - w.bPlayStage = FALSE")
ENDPROC
PROC CMHDZ_UPDATE_EDITOR_WIDGET(CMHDZ_EDITOR &w)
IF (!w.bEditorActive)
EXIT
ENDIF
IF (sCMHDZData.eClientState = CMHDZ_ARCADE_CLIENT_STATE_PLAYING)
CMHDZ_EDITOR_DRAW_ENTITY_INDICES(w)
//CMHDZ_EDITOR_DRAW_PROP_STOP_PROP(sCMHDZData.iCurrentScreen)
CMHDZ_EDITOR_RUN_PLAY_MENU(w)
EXIT
ENDIF
IF (w.bPlayStage)
sCMHDZData.bDebugInvunerablePlayer = TRUE
//IF CMHDZ_EDITOR_UPDATE_PLAYER_PROGRESSION(w)
//IF CMHDZ_MAINTAIN_PLAYER_CURRENT_LEVEL_PROGRESSION()
IF sCMHDZData.bLevelsCompleted[ENUM_TO_INT(sCMHDZData.eCurrentLevel)]
w.bPlayStage = FALSE
CDEBUG2LN(DEBUG_MINIGAME, "[BAZ] CMHDZ_UPDATE_EDITOR_WIDGET - w.bPlayStage = FALSE")
sCMHDZData.bDebugPause = TRUE
ENDIF
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_DOWN) // Originall clashed with reloading. No good
CMHDZ_EDITOR_REBOOT(w)
sCMHDZData.bDebugPause = TRUE
ENDIF
ENDIF
//CMHDZ_EDITOR_UPDATE_RETICULE(w)
//CMHDZ_EDITOR_DRAW_SELECTION_OVERLAYS(w)
CMHDZ_EDITOR_DRAW_ENTITY_INDICES(w)
//CMHDZ_EDITOR_DRAW_PROP_STOP_PROP((CEIL(sCMHDZData.fOverallLevelProgression/((cfRIGHT_SCREEN_LIMIT + cfLEFT_SCREEN_LIMIT)/2))))
CMHDZ_EDITOR_DRAW_MINIMAP(w)
//CMHDZ_DRAW_RETICLES()
CMHDZ_EDITOR_RUN_MENU(w)
CMHDZ_EDITOR_RUN_PLAY_MENU(w)
ENDPROC
PROC CMHDZ_CREATE_EDITOR_WIDGET(CMHDZ_EDITOR &w)
INT i
TEXT_LABEL_63 txt
w.vMiniMapPos = INIT_VECTOR_2D(cfGAME_HUD_MINIMAP_X, cfGAME_HUD_MINIMAP_Y)
w.vMiniMapSize = INIT_VECTOR_2D(cfGAME_HUD_MINIMAP_WIDTH, cfGAME_HUD_MINIMAP_HEIGHT)
INT iActiveScreen = FLOOR(sCMHDZData.fOverallLevelProgression/cfCMHDZ_SCREEN_LENGTH)
START_WIDGET_GROUP("CMHDZ Editor")
ADD_WIDGET_BOOL("Editor Active", w.bEditorActive)
ADD_WIDGET_BOOL("Play Stage", w.bPlayStage)
START_WIDGET_GROUP("Menu")
ADD_WIDGET_BOOL("Menu Active", w.bMenuActive)
ADD_WIDGET_BOOL("Rebuild Menu", w.bRebuildMenu)
ADD_WIDGET_INT_READ_ONLY("Current Selection", w.iMenuCurrentSelection)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Map")
ADD_WIDGET_BOOL("Show Map", w.bShowMiniMap)
ADD_WIDGET_VECTOR_2D_SLIDER("Map Display Pos", w.vMiniMapPos, -2000.0, 2000.0, 10.0)
ADD_WIDGET_VECTOR_2D_SLIDER("Map Display Size", w.vMiniMapSize, -2000.0, 2000.0, 10.0)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Indexes")
ADD_WIDGET_BOOL("Show Enemy", w.bShowEntityIndicies[CMHDZ_EDITOR_MODE_ENEMY])
ADD_WIDGET_BOOL("Show Cover", w.bShowEntityIndicies[CMHDZ_EDITOR_MODE_COVER])
// ADD_WIDGET_BOOL("Show Hostage", w.bShowEntityIndicies[CMHDZ_EDITOR_MODE_HOSTAGE])
ADD_WIDGET_BOOL("Show Item", w.bShowEntityIndicies[CMHDZ_EDITOR_MODE_ITEM])
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Edit")
ADD_WIDGET_INT_READ_ONLY("Edit Mode", w.iEditMode)
ADD_WIDGET_INT_READ_ONLY("New Unit Type", w.iNewUnitData)
ADD_WIDGET_INT_READ_ONLY("Selected Data", w.iSelectedData)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Level")
ADD_WIDGET_INT_READ_ONLY("Active Level", w.iActiveLevel)
ADD_WIDGET_INT_READ_ONLY("Active Screen", iActiveScreen)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Reticule")
ADD_WIDGET_INT_READ_ONLY("Reticule Over Type", w.iReticuleOverType)
ADD_WIDGET_VECTOR_2D_READ_ONLY("Position", w.vReticulePos)
ADD_WIDGET_VECTOR_2D_READ_ONLY("Delta", w.vReticuleDelta)
REPEAT 4 i
txt = "Over "
txt += CMHDZ_EDITOR_MODE_TO_STRING(i)
ADD_WIDGET_INT_READ_ONLY(txt, w.iReticuleOverIndex[i])
ENDREPEAT
STOP_WIDGET_GROUP()
// START_WIDGET_GROUP("Prop To Stop Screen On")
// REPEAT ciCMHDZ_MAX_SCREENS i
// txt = "Scn "
// txt += i
// ADD_WIDGET_INT_READ_ONLY(txt, sCMHDZData.iPropToStopOn[i])
// ENDREPEAT
// STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
ENDPROC
#ENDIF
#ENDIF
#IF IS_DEBUG_BUILD
PROC CMHDZ_DEBUG_CREATE_WIDGETS()
IF sCMHDZData.bDebugCreatedWidgets
EXIT
ENDIF
IF sCMHDZData.widgetGroupExample = NULL
EXIT
ENDIF
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] [BAZ] [DSW] Creating widgets...")
SET_CURRENT_WIDGET_GROUP(sCMHDZData.widgetGroupExample)
START_WIDGET_GROUP("CMHDZ Arcade Widgets")
ADD_WIDGET_BOOL("Invunerable Player", sCMHDZData.bDebugInvunerablePlayer)
ADD_WIDGET_BOOL("Debug Pause", sCMHDZData.bDebugPause)
ADD_WIDGET_INT_READ_ONLY("Stack Size", sCMHDZData.iDebugStackSize)
ADD_WIDGET_INT_READ_ONLY("iRectsDrawnThisFrame", iRectsDrawnThisFrame)
ADD_WIDGET_INT_READ_ONLY("iSpritesDrawnThisFrame", iSpritesDrawnThisFrame)
ADD_WIDGET_INT_READ_ONLY("iDebugLinesDrawnThisFrame", iDebugLinesDrawnThisFrame)
ADD_WIDGET_FLOAT_SLIDER("Debug Float", sCMHDZData.fDebugFloat, 0, 5, 0.01)
CMHDZ_DEBUG_CREATE_DEBUG_STATE_WIDGET(sCMHDZData.sClientStateWidget, ENUM_TO_INT(NUM_CMHDZ_ARCADE_CLIENT_STATE), "Client State")
#IF CMHDZ_CMDLINE_EDITOR_NEW
CMHDZ_CREATE_EDITOR_WIDGET(sCMHDZData.sEditor)
#ENDIF
// IF (CMHDZ_MAX_REPLAY_ENTRIES != 1)
// CMHDZ_DEBUG_CREATE_REPLAY_SYSTEM_WIDGET(sCMHDZData.sReplaySystem)
// ENDIF
START_WIDGET_GROUP("Game")
CMHDZ_DEBUG_CREATE_PLAYER_DATA_WIDGET(sCMHDZData.sPlayerData[0])
START_WIDGET_GROUP("My Scores")
ADD_WIDGET_INT_READ_ONLY("Desert ", sCMHDZData.iMyScores[0])
ADD_WIDGET_INT_READ_ONLY("Town ", sCMHDZData.iMyScores[1])
ADD_WIDGET_INT_READ_ONLY("Forest ", sCMHDZData.iMyScores[2])
ADD_WIDGET_INT_READ_ONLY("Mine ", sCMHDZData.iMyScores[3])
ADD_WIDGET_INT_READ_ONLY("Graveyard ", sCMHDZData.iMyScores[4])
ADD_WIDGET_INT_READ_ONLY("Successive Hits", sCMHDZData.sPlayerData[0].iSuccessiveHits)
ADD_WIDGET_INT_READ_ONLY("Chain", sCMHDZData.sPlayerData[0].iChainedScore)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Level")
//ADD_WIDGET_INT_READ_ONLY("# of Stages", sCMHDZData.iDebugTotalStages)
ADD_WIDGET_INT_READ_ONLY("Shots", sCMHDZData.iTotalLevelShots[CMHDZ_GET_CURRENT_LEVEL()])
ADD_WIDGET_INT_READ_ONLY("Enemy Kills", sCMHDZData.iTotalLevelEnemyHits[CMHDZ_GET_CURRENT_LEVEL()])
ADD_WIDGET_INT_READ_ONLY("HeadShots", sCMHDZData.iTotalLevelEnemyHeadShots[CMHDZ_GET_CURRENT_LEVEL()])
//ADD_WIDGET_INT_READ_ONLY("Birds", sCMHDZData.iTotalLevelBirdsShot[CMHDZ_GET_CURRENT_LEVEL()])
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Enemies Count")
ADD_WIDGET_INT_READ_ONLY("Lane 0 Active ", sCMHDZData.iCurrentActiveEnemies[0])
ADD_WIDGET_INT_READ_ONLY("Lane 1 Active ", sCMHDZData.iCurrentActiveEnemies[1])
ADD_WIDGET_INT_READ_ONLY("Lane 2 Active ", sCMHDZData.iCurrentActiveEnemies[2])
ADD_WIDGET_INT_READ_ONLY("Total rem ", sCMHDZData.iDebugEnemiesRemaining)
ADD_WIDGET_INT_READ_ONLY("Total Spawned", sCMHDZData.iTotalNumberOfEnemiesSpawned)
ADD_WIDGET_INT_READ_ONLY("Total Count", sCMHDZData.iTotalNumberOfEnemies)
ADD_WIDGET_BOOL("Output all pos", sCMHDZData.bDebugOutputAliveEnemies)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Background")
ADD_WIDGET_BOOL("Stop moving", sCMHDZData.bStopMovingLevel)
ADD_WIDGET_BOOL("Hide Facade", sCMHDZData.bDisableFacade)
ADD_WIDGET_BOOL("Shift props left", sCMHDZData.bDebugShiftPropsLeft)
ADD_WIDGET_BOOL("Shift props right", sCMHDZData.bDebugShiftPropsRight)
ADD_WIDGET_BOOL("Flip Background", sCMHDZData.bFlipBackground)
ADD_WIDGET_INT_READ_ONLY("# of BG Elements Drawn", sCMHDZData.iNumberOfBackgroundElementsDrawn)
ADD_WIDGET_FLOAT_SLIDER("Background Speed Mult", sCMHDZData.fBackgroundSpeedMult, 1, 20.0, 1)
ADD_WIDGET_FLOAT_READ_ONLY("Tile 0 X", sCMHDZData.sBackgroundTilesData[0].vSpritePos.x)
ADD_WIDGET_FLOAT_READ_ONLY("Tile 1 X", sCMHDZData.sBackgroundTilesData[1].vSpritePos.x)
// ADD_WIDGET_FLOAT_READ_ONLY("Tile 2 X", sCMHDZData.sBackgroundTilesData[2].vSpritePos.x)
// ADD_WIDGET_FLOAT_READ_ONLY("Tile 3 X", sCMHDZData.sBackgroundTilesData[3].vSpritePos.x)
// ADD_WIDGET_FLOAT_READ_ONLY("Tile 4 X", sCMHDZData.sBackgroundTilesData[4].vSpritePos.x)
// ADD_WIDGET_FLOAT_READ_ONLY("Tile 5 X", sCMHDZData.sBackgroundTilesData[5].vSpritePos.x)
// ADD_WIDGET_FLOAT_READ_ONLY("Tile 6 X", sCMHDZData.sBackgroundTilesData[6].vSpritePos.x)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Player Thrown Projectiles")
ADD_WIDGET_BOOL("Set Projectile", sCMHDZData.bDebugSetPlayerProjectile)
sCMHDZData.twDebugPlayerProjectileType = ADD_TEXT_WIDGET("Projectile")
ADD_WIDGET_INT_SLIDER("Projectile Type", sCMHDZData.iDebugPlayerProjectileType, 0, ENUM_TO_INT(NUM_CMHDZ_PROJECTILE_TYPES) - 1, 1)
ADD_WIDGET_INT_SLIDER("Ammo Count", sCMHDZData.sPlayerData[0].iThrownProjectilesAmmo, 0, 99, 1)
ADD_WIDGET_INT_SLIDER("Reload Time", sCMHDZData.sPlayerData[0].iThrownProjectileReloadDelay, 0, 5000, 250)
ADD_WIDGET_BOOL("Launch Projectile", sCMHDZData.bDebugLaunchPlayerProjectile)
ADD_WIDGET_BOOL("Clear Projectile", sCMHDZData.bDebugClearPlayerProjectile)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Enemy Projectiles")
ADD_WIDGET_BOOL("Launch Projectile", sCMHDZData.bDebugLaunchDynamite)
ADD_WIDGET_BOOL("Clear Projectile", sCMHDZData.bDebugClearDynamite)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Awards")
ADD_WIDGET_BOOL("Award Deadeye T-Shirt", sCMHDZData.bDebugAwardDeadeye)
ADD_WIDGET_INT_SLIDER("Sharshooter award", sCMHDZData.iDebugFACES_OF_DEATH, 0, 50, 1)
ADD_WIDGET_BOOL("Set birds shot", sCMHDZData.bDebugAwardSetFACES_OF_DEATH)
ADD_WIDGET_BOOL("Award FACES_OF_DEATH T-Shirt", sCMHDZData.bDebugAwardFACES_OF_DEATH)
ADD_WIDGET_BOOL("Award Pistols at dawn T-Shirt", sCMHDZData.bDebugAwardSTV)
ADD_WIDGET_BOOL("Award Complete T-Shirt", sCMHDZData.bDebugAwardComplete)
ADD_WIDGET_BOOL("Award Complete Trophy", sCMHDZData.bDebugAwardTrophy)
ADD_WIDGET_BOOL("Clear stats", sCMHDZData.bClearAwardStats)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Pickups")
ADD_WIDGET_BOOL("Enable", sCMHDZData.bDebugEnablePickup)
ADD_WIDGET_INT_SLIDER("Show Screen Pickups", sCMHDZData.iDebugPickupScreen, -1, ciCMHDZ_MAX_SCREENS, 1)
ADD_WIDGET_BOOL("Quad Damage", sCMHDZData.bDebugEnableQuadDamage)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Level Select Screen Debug")
ADD_WIDGET_FLOAT_SLIDER("Level 1 score X", cfCMHDZ_SOLO_LEVEL1_SCORE_X_POS, -100, 2000, 4)
ADD_WIDGET_FLOAT_SLIDER("Level 2 score X", cfCMHDZ_SOLO_LEVEL2_SCORE_X_POS, -100, 2000, 4)
ADD_WIDGET_FLOAT_SLIDER("Level 3 score X", cfCMHDZ_SOLO_LEVEL3_SCORE_X_POS, -100, 2000, 4)
ADD_WIDGET_FLOAT_SLIDER("Level 4 score X", cfCMHDZ_SOLO_LEVEL4_SCORE_X_POS, -100, 2000, 4)
ADD_WIDGET_FLOAT_SLIDER("Level 5 score X", cfCMHDZ_SOLO_LEVEL5_SCORE_X_POS, -100, 2000, 4)
ADD_WIDGET_FLOAT_SLIDER("Level 1 Star X", cfCMHDZ_SOLO_LEVEL1_STAR_X_POS, -100, 2000, 4)
ADD_WIDGET_FLOAT_SLIDER("Level 1 Star Y", cfCMHDZ_SOLO_LEVEL1_STAR_Y_POS, -100, 2000, 4)
ADD_WIDGET_FLOAT_SLIDER("Level 2 Star X", cfCMHDZ_SOLO_LEVEL2_STAR_X_POS, -100, 2000, 4)
ADD_WIDGET_FLOAT_SLIDER("Level 3 Star X", cfCMHDZ_SOLO_LEVEL3_STAR_X_POS, -100, 2000, 4)
ADD_WIDGET_FLOAT_SLIDER("Level 4 Star X", cfCMHDZ_SOLO_LEVEL4_STAR_X_POS, -100, 2000, 4)
ADD_WIDGET_FLOAT_SLIDER("Level 4 Star Y", cfCMHDZ_SOLO_LEVEL4_STAR_Y_POS, -100, 2000, 4)
ADD_WIDGET_FLOAT_SLIDER("Level 5 Star X", cfCMHDZ_SOLO_LEVEL5_STAR_X_POS, -100, 2000, 4)
// ADD_WIDGET_FLOAT_SLIDER("Level Accuracy Results Pos X", cfCMHDZ_RESULTS_SCREEN_COMPLETE_ACCURACY_POS_X, -100, 2000, 4)
// ADD_WIDGET_FLOAT_SLIDER("Level Accuracy VAL Results Pos X", cfCMHDZ_RESULTS_SCREEN_COMPLETE_ACCURACY_VAL_POS_X, -100, 2000, 4)
//
// ADD_WIDGET_FLOAT_SLIDER("GAME Score Results Pos X", cfCMHDZ_RESULTS_SCREEN_GAME_COMPLETE_SCORE_POS_X, -100, 2000, 4)
// ADD_WIDGET_FLOAT_SLIDER("GAME Accuracy Results Pos X", cfCMHDZ_RESULTS_SCREEN_COMPLETE_ACCURACY_POS_X, -100, 2000, 4)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Result Screen Debug")
ADD_WIDGET_FLOAT_SLIDER("Level Score Results Pos X", cfCMHDZ_RESULTS_SCREEN_COMPLETE_SCORE_POS_X, -100, 2000, 4)
ADD_WIDGET_FLOAT_SLIDER("Level Score Results VAL Pos X", cfCMHDZ_RESULTS_SCREEN_COMPLETE_SCORE_VAL_POS_X, -100, 2000, 4)
// ADD_WIDGET_FLOAT_SLIDER("Level Score Results Pos X", cfCMHDZ_RESULTS_SCREEN_COMPLETE_SCORE_VAL_POS_X, -100, 2000, 4)
// ADD_WIDGET_FLOAT_SLIDER("Level Score Results VAL Pos X", cfCMHDZ_RESULTS_SCREEN_COMPLETE_SCORE_VAL_POS_X, -100, 2000, 4)
ADD_WIDGET_FLOAT_SLIDER("Level Accuracy Results Pos X", cfCMHDZ_RESULTS_SCREEN_COMPLETE_ACCURACY_POS_X, -100, 2000, 4)
ADD_WIDGET_FLOAT_SLIDER("Level Accuracy VAL Results Pos X", cfCMHDZ_RESULTS_SCREEN_COMPLETE_ACCURACY_VAL_POS_X, -100, 2000, 4)
ADD_WIDGET_FLOAT_SLIDER("GAME Score Results Pos X", cfCMHDZ_RESULTS_SCREEN_GAME_COMPLETE_SCORE_VAL_POS_X, -100, 2000, 4)
ADD_WIDGET_FLOAT_SLIDER("GAME Accuracy Results Pos X", cfCMHDZ_RESULTS_SCREEN_COMPLETE_ACCURACY_VAL_POS_X, -100, 2000, 4)
ADD_WIDGET_FLOAT_SLIDER("GAME Star Results Pos X", cfCMHDZ_SOLO_RESULTS_STAR_X_POS, -100, 2000, 2)
ADD_WIDGET_FLOAT_SLIDER("GAME Star Results Pos Y", cfCMHDZ_SOLO_RESULTS_STAR_Y_POS, -100, 2000, 2)
ADD_WIDGET_FLOAT_SLIDER("FINAL Star Results Pos X", cfCMHDZ_SOLO_GAME_RESULTS_STAR_X_POS, -100, 2000, 2)
ADD_WIDGET_FLOAT_SLIDER("FINAL Star Results Pos Y", cfCMHDZ_SOLO_GAME_RESULTS_STAR_Y_POS, -100, 2000, 2)
ADD_WIDGET_FLOAT_SLIDER("cfCMHDZ_SPRITE_HUD_TIME_TEXT_X", cfCMHDZ_SPRITE_HUD_TIME_TEXT_X, -100, 2000, 2)
ADD_WIDGET_FLOAT_SLIDER("cfCMHDZ_SPRITE_HUD_TIME_TEXT_Y", cfCMHDZ_SPRITE_HUD_TIME_TEXT_Y, -100, 2000, 2)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Bazal's Debug")
START_WIDGET_GROUP("Stuff")
ADD_WIDGET_FLOAT_READ_ONLY("vSpriteMarkerPos X", sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.x)
ADD_WIDGET_FLOAT_READ_ONLY("vSpriteMarkerPos Y", sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.y)
ADD_WIDGET_FLOAT_READ_ONLY("Prop X", sCMHDZData.sCoverData[8].vSpritePos.x)
ADD_WIDGET_FLOAT_READ_ONLY("Prop X", sCMHDZData.sCoverData[9].vSpritePos.x)
ADD_WIDGET_FLOAT_READ_ONLY("Prop X", sCMHDZData.sCoverData[10].vSpritePos.x)
ADD_WIDGET_FLOAT_READ_ONLY("Enemy X", sCMHDZData.sEnemyData[0].vSpritePos.x)
// ADD_WIDGET_FLOAT_SLIDER("Reticule Screen Sp X", sCMHDZData.fDebugEntityWorldSpaceX, -cfGAME_SCREEN_WIDTH, cfGAME_SCREEN_WIDTH, 0.5)
// ADD_WIDGET_FLOAT_SLIDER("Reticule Screen Sp Y", sCMHDZData.fDebugEntityWorldSpaceY, -cfGAME_SCREEN_HEIGHT, cfGAME_SCREEN_HEIGHT, 0.5)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Enemy Hover")
ADD_WIDGET_BOOL("Enable Enemy Hover", sCMHDZData.bEnableEnemyHover)
ADD_WIDGET_FLOAT_READ_ONLY("Marker World Px Pos X", sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.x)
ADD_WIDGET_FLOAT_READ_ONLY("Marker World Px Pos Y", sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos.y)
ADD_WIDGET_FLOAT_READ_ONLY("Reticule-Entity Dist", sCMHDZData.fReticuleSpriteDist)
ADD_WIDGET_INT_READ_ONLY("Entity ID", sCMHDZData.iDebugEntityId )
ADD_WIDGET_INT_READ_ONLY("Entity Type", sCMHDZData.iDebugType )
ADD_WIDGET_INT_READ_ONLY("Entity State", sCMHDZData.iDebugEntityState )
ADD_WIDGET_FLOAT_READ_ONLY("Entity stopping X", sCMHDZData.fEntityStoppingX)
ADD_WIDGET_INT_READ_ONLY("Lane", sCMHDZData.iDebugLane)
ADD_WIDGET_INT_READ_ONLY("Anim frame", sCMHDZData.iDebugAnimFrame)
ADD_WIDGET_FLOAT_READ_ONLY("Entity World X", sCMHDZData.fDebugEntityWorldX)
ADD_WIDGET_FLOAT_READ_ONLY("Entity World Y", sCMHDZData.fDebugEntityWorldY)
// ADD_WIDGET_FLOAT_READ_ONLY("Entity TL X", sCMHDZData.fDebugEntityCornerX[0])
// ADD_WIDGET_FLOAT_READ_ONLY("Entity TL Y", sCMHDZData.fDebugEntityCornerY[0])
// ADD_WIDGET_FLOAT_READ_ONLY("Entity BR X", sCMHDZData.fDebugEntityCornerX[1])
// ADD_WIDGET_FLOAT_READ_ONLY("Entity BR Y", sCMHDZData.fDebugEntityCornerY[1])
// ADD_WIDGET_FLOAT_READ_ONLY("Ent-Ret TL X Diff", sCMHDZData.fDebugReticuleEntityTLDiffX)
// ADD_WIDGET_FLOAT_READ_ONLY("Ent-Ret TL Y Diff", sCMHDZData.fDebugReticuleEntityTLDiffY)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Texture Pos")
ADD_WIDGET_FLOAT_SLIDER("Texture 1 X", sCMHDZData.fTexturePosX[0], -10000.0, 10000.0, 0.5)
ADD_WIDGET_FLOAT_SLIDER("Texture 1 Y", sCMHDZData.fTexturePosY[0], -10000.0, 10000.0, 0.5)
ADD_WIDGET_FLOAT_SLIDER("Texture 1 Scale", sCMHDZData.fTextureScale[0], 0.0, 1.0, 0.05)
ADD_WIDGET_FLOAT_SLIDER("Texture 2 X", sCMHDZData.fTexturePosX[1], -10000.0, 10000.0, 0.5)
ADD_WIDGET_FLOAT_SLIDER("Texture 2 Y", sCMHDZData.fTexturePosY[1], -10000.0, 10000.0, 0.5)
ADD_WIDGET_FLOAT_SLIDER("Texture 3 X", sCMHDZData.fTexturePosX[2], -10000.0, 10000.0, 0.5)
ADD_WIDGET_FLOAT_SLIDER("Texture 3 Y", sCMHDZData.fTexturePosY[2], -10000.0, 10000.0, 0.5)
ADD_WIDGET_INT_SLIDER("Value", sCMHDZData.iDebugIntegerValue,0, 100000, 1)
ADD_WIDGET_FLOAT_SLIDER("Scale",sCMHDZData.fDebugFloatValue, -10.0, 10.0, 0.1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Props / Cover")
ADD_WIDGET_BOOL("Enable Hover", sCMHDZData.bEnableCoverHover)
ADD_WIDGET_BOOL("Stop moving", sCMHDZData.bStopMovingLevel)
ADD_WIDGET_INT_READ_ONLY("Index", sCMHDZData.iDebugIntegerValue)
sCMHDZData.twDebugId = ADD_TEXT_WIDGET("Prop Type")
ADD_WIDGET_FLOAT_READ_ONLY("Prop X", sCMHDZData.fDebugEntityWorldX)
ADD_WIDGET_FLOAT_READ_ONLY("Prop Y", sCMHDZData.fDebugEntityWorldY)
ADD_WIDGET_INT_READ_ONLY("Prop Lane", sCMHDZData.iDebugLane)
// ADD_WIDGET_INT_READ_ONLY("Prop Screen", sCMHDZData.iDebugCoverScreen)
ADD_WIDGET_FLOAT_READ_ONLY("Prop Scale", sCMHDZData.fDebugEntityScale)
ADD_WIDGET_BOOL("Edit", sCMHDZData.bDebugEnableEdit)
ADD_WIDGET_BOOL("Finalise Edit", sCMHDZData.bDebugFinaliseEdit)
ADD_WIDGET_BOOL("Hide Foreground", sCMHDZData.bDebugHideForegroundProps)
ADD_WIDGET_INT_READ_ONLY("Editing ID", sCMHDZData.iEntityEdit)
sCMHDZData.twDebugId = ADD_TEXT_WIDGET("Editing Type")
ADD_WIDGET_FLOAT_SLIDER("Pos X", sCMHDZData.fTexturePosX[0], -10000.0, 10000.0, 0.5)
ADD_WIDGET_FLOAT_SLIDER("Pos Y", sCMHDZData.fTexturePosY[0], -10000.0, 10000.0, 0.5)
ADD_WIDGET_FLOAT_READ_ONLY("Initial Pos X", sCMHDZData.fTexturePosX[1])
ADD_WIDGET_FLOAT_READ_ONLY("Initial Pos Y", sCMHDZData.fTexturePosY[1])
STOP_WIDGET_GROUP()
/*
START_WIDGET_GROUP("Controls")
// ADD_WIDGET_FLOAT_READ_ONLY("Stick X", sCMHDZData.fDebugStickX)
// ADD_WIDGET_FLOAT_READ_ONLY("Stick Y", sCMHDZData.fDebugStickX)
// ADD_WIDGET_FLOAT_READ_ONLY("Mouse X", sCMHDZData.fDebugMouseX)
// ADD_WIDGET_FLOAT_READ_ONLY("Mouse Y", sCMHDZData.fDebugMouseY)
STOP_WIDGET_GROUP()
*/
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ARCADE_GAMES_LEADERBOARD_WIDGET_CREATE(sCMHDZData.sLbData)
ARCADE_GAMES_POSTFX_WIDGET_CREATE()
START_WIDGET_GROUP("Debug Rect")
ADD_WIDGET_BOOL("Show Rect", sCMHDZData.bDrawDebugRect)
ADD_WIDGET_BOOL("Center Mode", sCMHDZData.bDebugRectCenterMode)
CMHDZ_ADD_WIDGET_VECTOR_2D_SLIDER("Top Left (Center)", sCMHDZData.vDebugRect[0], -cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_WIDTH, 10)
CMHDZ_ADD_WIDGET_VECTOR_2D_SLIDER("Base Right (HalfSize)", sCMHDZData.vDebugRect[1], -cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_WIDTH, 10)
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 ", cmhdzServerBd.iNumPlayers)
STOP_WIDGET_GROUP()
CLEAR_CURRENT_WIDGET_GROUP(sCMHDZData.widgetGroupExample)
sCMHDZData.fTexturePosX[0] = 1000.0 //cfBASE_SCREEN_WIDTH/6*2
sCMHDZData.fTexturePosY[0] = 315.0 //152.500
sCMHDZData.fTextureScale[0] = 1.0
sCMHDZData.fTexturePosX[1] = cfCMHDZ_RESULTS_SCREEN_COMPLETE_ACCURACY_POS_X
sCMHDZData.fTexturePosY[1] = cfCMHDZ_RESULTS_SCREEN_COMPLETE_ACCURACY_POS_Y
sCMHDZData.fTexturePosX[2] = 500.0
sCMHDZData.fTexturePosY[2] = 500.0
sCMHDZData.iDebugIntegerValue = 7250
sCMHDZData.fDebugFloatValue = 1.0
sCMHDZData.iDebugCover = -1
sCMHDZData.iDebugForegroundEnemy = -1
sCMHDZData.iDebugMiddleEnemy = -1
sCMHDZData.iDebugBackgroundEnemy = -1
sCMHDZData.bDebugCreatedWidgets = TRUE
ENDPROC
PROC CMHDZ_UPDATE_WIDGETS()
INT i
sCMHDZData.iDebugStackSize = GET_CURRENT_STACK_SIZE()
#IF CMHDZ_CMDLINE_EDITOR_NEW
CMHDZ_DEBUG_UPDATE_CLIENT_STATE_WIDGET(sCMHDZData.sClientStateWidget)
CMHDZ_UPDATE_EDITOR_WIDGET(sCMHDZData.sEditor)
#ENDIF
IF PARTICIPANT_ID_TO_INT() >= 0
IF sCMHDZData.iMyScores[sCMHDZData.iStaggeredDebugCount] != playerBd[PARTICIPANT_ID_TO_INT()].iPlayerScore[sCMHDZData.iStaggeredDebugCount]
sCMHDZData.iMyScores[sCMHDZData.iStaggeredDebugCount] = playerBd[PARTICIPANT_ID_TO_INT()].iPlayerScore[sCMHDZData.iStaggeredDebugCount]
ENDIF
ENDIF
sCMHDZData.iDebugEnemiesRemaining = CMHDZ_GET_TOTAL_NUMBER_OF_ENEMIES_LEFT_ALIVE_FOR_CURRENT_SCREEN()
VECTOR_2D vReticule = CMHDZ_GET_PLAYER_RETICULE_POSITON()
FLOAT distanceX, distanceY, fDistance, fDistanceToCheck
BOOL bIsHovering
IF sCMHDZData.bEnableEnemyHover
FOR i = 0 TO ciCMHDZ_MAX_ENEMIES -1
IF (sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ACTIVE OR sCMHDZData.sEnemyData[i].eState = CMHDZ_ENEMY_STATE_ATTACKING) AND sCMHDZData.sEnemyData[i].iHealth > 0
distanceX = vReticule.x - sCMHDZData.sEnemyData[i].vSpritePos.x
distanceY = vReticule.y - sCMHDZData.sEnemyData[i].vSpritePos.y
fDistance = SQRT(distanceX * distanceX + distanceY * distanceY)
IF (sCMHDZData.sEnemyData[i].iEnemyLane = ciCMHDZ_LANE_BACKGROUND OR sCMHDZData.sEnemyData[i].iEnemyLane = ciCMHDZ_LANE_MIDDLE)
fDistanceToCheck = 120.0
ELSE
fDistanceToCheck = 320.0 // 280.0
ENDIF
IF fDistance < fDistanceToCheck
sCMHDZData.fReticuleSpriteDist = fDistance
sCMHDZData.iDebugEntityId = i
sCMHDZData.iDebugType = ENUM_TO_INT(sCMHDZData.sEnemyData[i].iEnemyType)
sCMHDZData.iDebugLane = sCMHDZData.sEnemyData[i].iEnemyLane
sCMHDZData.iDebugEntityState = ENUM_TO_INT(sCMHDZData.sEnemyData[i].eState)
sCMHDZData.fEntityStoppingX = sCMHDZData.sEnemyData[i].fStoppingX
sCMHDZData.fDebugEntityWorldX = sCMHDZData.sEnemyData[i].vSpritePos.x
sCMHDZData.fDebugEntityWorldY = sCMHDZData.sEnemyData[i].vSpritePos.Y
sCMHDZData.iDebugAnimFrame = sCMHDZData.sEnemyData[i].iSpriteAnimFrame
VECTOR_2D vCorner0 = INIT_VECTOR_2D(sCMHDZData.sEnemyData[i].vSpritePos.x - (sCMHDZData.sEnemyData[i].vSize.x/2), sCMHDZData.sEnemyData[i].vSpritePos.y - (sCMHDZData.sEnemyData[i].vSize.y/2))
VECTOR_2D vCorner1 = INIT_VECTOR_2D(sCMHDZData.sEnemyData[i].vSpritePos.x + (sCMHDZData.sEnemyData[i].vSize.x/2), sCMHDZData.sEnemyData[i].vSpritePos.y + (sCMHDZData.sEnemyData[i].vSize.y/2))
sCMHDZData.fDebugEntityCornerX[0] = vCorner0.x
sCMHDZData.fDebugEntityCornerY[0] = vCorner0.y
sCMHDZData.fDebugEntityCornerX[1] = vCorner1.x
sCMHDZData.fDebugEntityCornerY[1] = vCorner1.y
sCMHDZData.fDebugReticuleEntityTLDiffX = vReticule.x - vCorner0.x
sCMHDZData.fDebugReticuleEntityTLDiffY = vReticule.y - vCorner0.y
bIsHovering = TRUE
ENDIF
ENDIF
ENDFOR
IF NOT bIsHovering
sCMHDZData.iDebugEntityId = -1
sCMHDZData.fDebugEntityWorldX = -1.0
sCMHDZData.fDebugEntityWorldY = -1.0
sCMHDZData.fDebugEntityCornerX[0] = -1.0
sCMHDZData.fDebugEntityCornerY[0] = -1.0
sCMHDZData.fDebugEntityCornerX[1] = -1.0
sCMHDZData.fDebugEntityCornerY[1] = -1.0
sCMHDZData.iDebugLane = -1
sCMHDZData.fReticuleSpriteDist = -1.0
sCMHDZData.fDebugReticuleEntityTLDiffX = -1.0
sCMHDZData.fDebugReticuleEntityTLDiffY = -1.0
ENDIF
ENDIF
STRING sCover
IF sCMHDZData.bEnableCoverHover
INT iClosest = CMHDZ_GET_CLOSEST_PROP_TO_COORD(vReticule)
IF iClosest > -1
sCover = CMHDZ_ASSET_TYPES_TO_STRING(sCMHDZData.sCoverData[iClosest].eType)
sCMHDZData.fDebugEntityWorldX = sCMHDZData.sCoverData[iClosest].vSpritePos.x
sCMHDZData.fDebugEntityWorldY = sCMHDZData.sCoverData[iClosest].vSpritePos.Y
sCMHDZData.iDebugLane = sCMHDZData.sCoverData[iClosest].iCoverLane
sCMHDZData.iDebugIntegerValue = iClosest
// sCMHDZData.iDebugCoverScreen = sCMHDZData.sCoverData[iClosest].iScreen
sCMHDZData.fDebugEntityScale = CMHDZ_COVER_UTIL_GET_TYPE_SCALE_FOR_LANE(sCMHDZData.sCoverData[iClosest].eType, sCMHDZData.sCoverData[iClosest].iCoverLane)
ELSE
sCover = CMHDZ_ASSET_TYPES_TO_STRING(CMHDZ_ASSET_INVALID)
sCMHDZData.fDebugEntityWorldX = -9999999.0
sCMHDZData.fDebugEntityWorldY = -9999999.0
sCMHDZData.iDebugIntegerValue = -1
ENDIF
SET_CONTENTS_OF_TEXT_WIDGET(sCMHDZData.twDebugId, sCover)
ENDIF
IF sCMHDZData.bDebugEnableEdit
AND sCMHDZData.bEnableCoverHover
IF NOT sCMHDZData.bDebugInitEdit
AND sCMHDZData.iDebugIntegerValue > -1
sCMHDZData.iEntityEdit = sCMHDZData.iDebugIntegerValue
sCMHDZData.bDebugInitEdit = TRUE
sCMHDZData.fTexturePosX[0] = sCMHDZData.sCoverData[sCMHDZData.iEntityEdit].vSpritePos.x
sCMHDZData.fTexturePosY[0] = sCMHDZData.sCoverData[sCMHDZData.iEntityEdit].vSpritePos.y
sCMHDZData.fTexturePosX[1] = sCMHDZData.sCoverData[sCMHDZData.iEntityEdit].vSpriteInitialPos.x
sCMHDZData.fTexturePosY[1] = sCMHDZData.sCoverData[sCMHDZData.iEntityEdit].vSpriteInitialPos.y
sCMHDZData.fTexturePosX[2] = sCMHDZData.sCoverData[sCMHDZData.iEntityEdit].vSpritePos.x
sCMHDZData.fTexturePosY[2] = sCMHDZData.sCoverData[sCMHDZData.iEntityEdit].vSpritePos.y
sCMHDZData.bDebugHideForegroundProps = TRUE
ELIF sCMHDZData.bDebugInitEdit
sCover = CMHDZ_ASSET_TYPES_TO_STRING(sCMHDZData.sCoverData[sCMHDZData.iEntityEdit].eType)
SET_CONTENTS_OF_TEXT_WIDGET(sCMHDZData.twDebugId, sCover)
sCMHDZData.sCoverData[sCMHDZData.iEntityEdit].vSpritePos = GET_DEBUG_TEXTURE_POS(0)
IF (sCMHDZData.fTexturePosY[2] != sCMHDZData.fTexturePosY[0])
sCMHDZData.fTexturePosY[1] -= (sCMHDZData.fTexturePosY[2] - sCMHDZData.fTexturePosY[0])
sCMHDZData.fTexturePosY[2] = sCMHDZData.fTexturePosY[0]
ENDIF
IF (sCMHDZData.fTexturePosX[2] != sCMHDZData.fTexturePosX[0])
sCMHDZData.fTexturePosX[1] -= (sCMHDZData.fTexturePosX[2] - sCMHDZData.fTexturePosX[0])
sCMHDZData.fTexturePosX[2] = sCMHDZData.fTexturePosX[0]
ENDIF
IF (sCMHDZData.bDebugFinaliseEdit) OR (sCMHDZData.bStopMovingLevel)
sCMHDZData.sCoverData[sCMHDZData.iEntityEdit].vSpriteInitialPos.x = sCMHDZData.fTexturePosX[1]
sCMHDZData.sCoverData[sCMHDZData.iEntityEdit].vSpriteInitialPos.y = sCMHDZData.fTexturePosY[1]
sCMHDZData.bDebugFinaliseEdit = FALSE
ENDIF
ENDIF
ELSE
IF sCMHDZData.bDebugInitEdit
sCMHDZData.bDebugInitEdit = FALSE
sCMHDZData.iEntityEdit = -1
ENDIF
ENDIF
IF sCMHDZData.bDebugShiftPropsLeft
sCMHDZData.bDebugShiftPropsLeft = FALSE
i = 0
REPEAT ciCMHDZ_MAX_COVER i
sCMHDZData.sCoverData[i].vSpritePos.x -= (cfBASE_SCREEN_WIDTH / 2.0)
ENDREPEAT
ENDIF
IF sCMHDZData.bDebugShiftPropsRight
sCMHDZData.bDebugShiftPropsRight = FALSE
i = 0
REPEAT ciCMHDZ_MAX_COVER i
sCMHDZData.sCoverData[i].vSpritePos.x += (cfBASE_SCREEN_WIDTH / 2.0)
ENDREPEAT
ENDIF
IF sCMHDZData.bDebugOutputAliveEnemies
sCMHDZData.bDebugOutputAliveEnemies = FALSE
CMHDZ_DEBUG_OUTPUT_ALL_ENEMY_POSITIONS()
ENDIF
IF sCMHDZData.bDebugAwardDeadeye
sCMHDZData.bDebugAwardDeadeye = FALSE
CMHDZ_AWARD_TRAINED_TO_KILL()
ENDIF
IF sCMHDZData.bDebugAwardSTV
sCMHDZData.bDebugAwardSTV = FALSE
CMHDZ_AWARD_STRAIGHT_TO_VIDEO()
ENDIF
// IF sCMHDZData.bDebugAwardFACES_OF_DEATH
// sCMHDZData.bDebugAwardFACES_OF_DEATH = FALSE
// ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TSHIRT_HELP(ARCADE_GAME_TSHIRTS_)
// ENDIF
//
// IF sCMHDZData.bDebugAwardSetFACES_OF_DEATH
// sCMHDZData.bDebugAwardSetFACES_OF_DEATH = FALSE
// //sCMHDZData.iTotalLevelBirdsShot[1] = sCMHDZData.iDebugFACES_OF_DEATH
// IF sCMHDZData.iDebugFACES_OF_DEATH >= CMHDZ_GET_FACES_OF_DEATH_AWARD_PLATINUM_TARGET_SCORE()
// CMHDZ_AWARD_FACES_OF_DEATH(sCMHDZData.iDebugFACES_OF_DEATH, TRUE)
// ELSE
// CMHDZ_AWARD_FACES_OF_DEATH(sCMHDZData.iDebugFACES_OF_DEATH, FALSE)
// ENDIF
// ENDIF
// IF sCMHDZData.bDebugAwardComplete
// sCMHDZData.bDebugAwardComplete = FALSE
// ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TSHIRT_HELP(ARCADE_GAME_TSHIRTS_CAMHEDZ_FOD)
// ENDIF
IF sCMHDZData.bDebugAwardTrophy
sCMHDZData.bDebugAwardTrophy = FALSE
ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TROPHY_HELP(ARCADE_GAME_TROPHY_CAMHEDZ, TRUE)
SET_PACKED_STAT_BOOL(PACKED_MP_AWARD_BEARSY_MASK, TRUE)
ENDIF
IF sCMHDZData.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_FACES_OF_DEATH,0)
SET_MP_BOOL_CHARACTER_AWARD(MP_AWARD_TRAINED_TO_KILL, FALSE)
SET_MP_BOOL_CHARACTER_AWARD(MP_AWARD_STRAIGHT_TO_VIDEO, FALSE)
SET_MP_BOOL_CHARACTER_AWARD(MP_AWARD_MONKEY_C_MONKEY_DO, FALSE)
SET_MP_BOOL_CHARACTER_AWARD(MP_AWARD_DIRECTOR, FALSE)
SCRIPT_ASSERT("sCMHDZData.bClearAwardStats - Cleared all Awards")
sCMHDZData.bClearAwardStats = FALSE
ENDIF
IF sCMHDZData.bDebugLaunchDynamite
sCMHDZData.bDebugLaunchDynamite = FALSE
CMHDZ_INIT_THROWN_ENEMY_PROJECTILE(CMHDZ_PROJECTILE_DYNAMITE, INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH / 2.0, cfBASE_SCREEN_HEIGHT / 2.0))
ENDIF
IF sCMHDZData.bDebugClearDynamite
sCMHDZData.bDebugClearDynamite = FALSE
CMHDZ_RESET_ALL_ENEMY_THROWN_PROJECTLES()
ENDIF
IF sCMHDZData.bDebugSetPlayerProjectile
sCMHDZData.sPlayerData[0].projectileType = INT_TO_ENUM(CMHDZ_PROJECTILE_TYPES, sCMHDZData.iDebugPlayerProjectileType)
sCMHDZData.bDebugSetPlayerProjectile = FALSE
ENDIF
IF sCMHDZData.bDebugLaunchPlayerProjectile
sCMHDZData.bDebugLaunchPlayerProjectile = FALSE
CMHDZ_INIT_THROWN_PLAYER_PROJECTILE(0, sCMHDZData.sPlayerData[0].projectileType, sCMHDZData.sPlayerData[0].vSpriteFinalReticlePos)
ENDIF
IF sCMHDZData.bDebugClearPlayerProjectile
sCMHDZData.bDebugClearPlayerProjectile = FALSE
CMHDZ_RESET_ALL_PLAYER_THROWN_PROJECTILES(0)
ENDIF
IF sCMHDZData.bDebugEnableQuadDamage
CMHDZ_SET_PLAYER_BIT(CMHDZ_PLAYER_BIT_QUAD_DAMAGE)
CMHDZ_START_AUDIO_SCENE(CMHDZ_AUDIO_SCENE_POWERUP_ACTIVE)
sCMHDZData.sPlayerData[0].iQuadDamageTimer = GET_GAME_TIMER()
sCMHDZData.bDebugEnableQuadDamage = FALSE
ENDIF
VECTOR_2D vInitialPos
VECTOR_2D vOffset
IF sCMHDZData.bDebugEnablePickup
IF sCMHDZData.iDebugPickupScreen != -1
CMHDZ_GET_ITEM_INITIAL_POS_AND_OFFSET_FOR_SCREEN(CMHDZ_ITEM_HEALTH, sCMHDZData.iDebugPickupScreen, vInitialPos, vOffset)
CMHDZ_DRAW_GAME_SPRITE(CMHDZ_SPRITE_ITEM_HEALTH, vInitialPos, INIT_VECTOR_2D(cfCMHDZ_ITEM_HEALTH_WIDTH, cfCMHDZ_ITEM_HEALTH_HEIGHT), 0, sCMHDZData.rgbaSprite)
CMHDZ_GET_ITEM_INITIAL_POS_AND_OFFSET_FOR_SCREEN(CMHDZ_ITEM_RIFLE_AMMO, sCMHDZData.iDebugPickupScreen, vInitialPos, vOffset)
CMHDZ_DRAW_GAME_SPRITE(CMHDZ_SPRITE_ITEM_RIFLE_AMMO, vInitialPos, INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_PISTOL_AMMO_CLIP_WIDTH, cfCMHDZ_SPRITE_HUD_PISTOL_AMMO_CLIP_HEIGHT), 0, sCMHDZData.rgbaSprite)
CMHDZ_GET_ITEM_INITIAL_POS_AND_OFFSET_FOR_SCREEN(CMHDZ_ITEM_SHOTGUN_AMMO, sCMHDZData.iDebugPickupScreen, vInitialPos, vOffset)
CMHDZ_DRAW_GAME_SPRITE(CMHDZ_SPRITE_ITEM_SHOTGUN_AMMO, vInitialPos, INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_SHOTGUN_AMMO_CLIP_WIDTH, cfCMHDZ_SPRITE_HUD_SHOTGUN_AMMO_CLIP_HEIGHT), 0, sCMHDZData.rgbaSprite)
CMHDZ_GET_ITEM_INITIAL_POS_AND_OFFSET_FOR_SCREEN(CMHDZ_ITEM_NAIL_GUN_AMMO, sCMHDZData.iDebugPickupScreen, vInitialPos, vOffset)
CMHDZ_DRAW_GAME_SPRITE(CMHDZ_SPRITE_ITEM_MACHINE_GUN_AMMO, vInitialPos, INIT_VECTOR_2D(cfCMHDZ_SPRITE_HUD_AMMO_WIDTH, cfCMHDZ_SPRITE_HUD_AMMO_HEIGHT), 0, sCMHDZData.rgbaSprite)
ENDIF
ELSE
IF sCMHDZData.iDebugPickupScreen != -1
sCMHDZData.iDebugPickupScreen = -1
ENDIF
ENDIF
// sCMHDZData.fDebugStickX = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_X)
// sCMHDZData.fDebugStickY = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_Y)
// sCMHDZData.fDebugMouseX = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_CURSOR_X)
// sCMHDZData.fDebugMouseY = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_CURSOR_Y)
sCMHDZData.iStaggeredDebugCount++
IF sCMHDZData.iStaggeredDebugCount >= ENUM_TO_INT(CMHDZ_MAX_LEVELS)
sCMHDZData.iStaggeredDebugCount = 0
ENDIF
ARCADE_GAMES_POSTFX_WIDGET_UPDATE()
VECTOR_2D rs, rc
RGBA_COLOUR_STRUCT rcol
IF (sCMHDZData.bDrawDebugRect)
INIT_RGBA_STRUCT(rcol, 255, 255, 255, 64)
IF (sCMHDZData.bDebugRectCenterMode = FALSE)
rs.x = sCMHDZData.vDebugRect[1].x - sCMHDZData.vDebugRect[0].x
rs.y = sCMHDZData.vDebugRect[1].y - sCMHDZData.vDebugRect[0].y
rc.x = sCMHDZData.vDebugRect[0].x + (rs.x / 2.0)
rc.y = sCMHDZData.vDebugRect[0].y + (rs.y / 2.0)
ARCADE_DRAW_PIXELSPACE_RECT(rc, rs, rcol)
ELSE
ARCADE_DRAW_PIXELSPACE_RECT(sCMHDZData.vDebugRect[0], sCMHDZData.vDebugRect[1], rcol)
ENDIF
ENDIF
// IF (CMHDZ_MAX_REPLAY_ENTRIES != 1)
// CMHDZ_DEBUG_UPDATE_REPLAY_SYSTEM_WIDGET(sCMHDZData.sReplaySystem)
// ENDIF
ARCADE_GAMES_LEADERBOARD_WIDGET_UPDATE(sCMHDZData.sLbData, playerBd, cmhdzServerBd.sLeaderboard)
ENDPROC
/// PURPOSE:
/// Dumps the current state of the game to the logs
/// Automatically called when a bug is entered
PROC CMHDZ_DEBUG_DUMP_DATA_TO_LOGS()
ARCADE_CABINET_DUMP_DATA_TO_CONSOLE()
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] [BAZ] {dsw} CMHDZ_DEBUG_DUMP_DATA_TO_LOGS - Dumping data...")
//General
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] [BAZ] ----- GENERAL -----")
//CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_ARCADE] [BAZ] eClientState = ", CMHDZ_ARCADE_CLIENT_STATE_TO_STRING(sCMHDZData.eClientState))
CMHDZ_DEBUG_OUTPUT_ALL_ENEMY_POSITIONS()
CMHDZ_DEBUG_OUTPUT_ALL_PICKUP_POSITIONS()
ENDPROC
PROC CMHDZ_DEBUG_PROCESSING()
CMHDZ_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)
CMHDZ_DEBUG_DUMP_DATA_TO_LOGS()
ENDIF
ENDPROC
#ENDIF
/// PURPOSE:
/// Run every frame before the client state machine is processed
PROC CMHDZ_PRE_UPDATE()
IF sCMHDZData.eClientState >= CMHDZ_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()
CMHDZ_SET_LOCAL_STATE(CMHDZ_ARCADE_CLIENT_STATE_CLEANUP)
EXIT
ENDIF
ARCADE_GAMES_HELP_TEXT_PRE_UPDATE()
ARCADE_GAMES_LEADERBOARD_PROCESS_EVENTS(sCMHDZData.sLbData, cmhdzServerBd.sLeaderboard, playerBd, cmhdzServerBd.bLeaderboardRecieved)
ARCADE_GAMES_LEADERBOARD_LOAD(sCMHDZData.sLbData, CASINO_ARCADE_GAME_Camhedz, cmhdzServerBd.bLeaderboardRecieved)
CMHDZ_UPDATE_ANIM_FRAMES()
CMHDZ_UPDATE_SOUND_GLITCH_LEVEL()
BOOL bIsPlaying = sCMHDZData.eClientState >= CMHDZ_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 sCMHDZData.iStaggeredOnScreenViableCoverCount = 0
sCMHDZData.iNumberOfViableOnScreenCoverPoints = 0
REPEAT ciCMHDZ_MAX_COVER i
IF sCMHDZData.iNumberOfViableOnScreenCoverPoints < ciCMHDZ_MAX_SUITABLE_HIDE_BEHIND_COVER
IF CMHDZ_COVER_UTIL_IS_TYPE_SUITABLE_FOR_COVER(sCMHDZData.sCoverData[i].eType)
IF CMHDZ_IS_COVER_ON_SCREEN(i, cfLEFT_SCREEN_LIMIT)
// #IF IS_DEBUG_BUILD
// //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_PRE_UPDATE] [CMHDZ_IS_COVER_SUITABLE_FOR_ENEMY_TO_USE] [dsw] ")
// //CDEBUG2LN(DEBUG_MINIGAME, "[CMHDZ_PRE_UPDATE] [CMHDZ_IS_COVER_SUITABLE_FOR_ENEMY_TO_USE] [dsw] Adding cover ", i, " To viable cover locations. Type: ", CMHDZ_ASSET_TYPES_TO_STRING(sCMHDZData.sCoverData[i].eType), " Tot Viable: ", sCMHDZData.iNumberOfViableOnScreenCoverPoints + 1 )
// #ENDIF
sCMHDZData.iViableOnScreenEnemyCoverPoints[sCMHDZData.iNumberOfViableOnScreenCoverPoints] = i
sCMHDZData.iNumberOfViableOnScreenCoverPoints++
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDIF
ARCADE_CABINET_COMMON_EVERY_FRAME_PROCESSING(bIsPlaying)
CMHDZ_SET_CURRENT_TIMESTEP()
ENDPROC
/// PURPOSE:
/// Run every frame after the client state machine is processed
PROC CMHDZ_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
ENDPROC
/// PURPOSE:
/// Call every frame to run the minigame
PROC PROCESS_CMHDZ_ARCADE()
CMHDZ_PRE_UPDATE()
CMHDZ_PROCESS_CLIENT_STATE_MACHINE()
CMHDZ_POST_UPDATE()
#IF IS_DEBUG_BUILD
CMHDZ_DEBUG_PROCESSING()
#ENDIF
ENDPROC