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

3442 lines
123 KiB
Scheme
Executable File

//-------------------------------------------------
// File: ggsm_arcade_main.sch
// Purpose: the game itself
//-------------------------------------------------
//-------------------------------------------------
// INCLUDES
//-------------------------------------------------
USING "ggsm_structs.sch"
USING "ggsm_maths.sch"
USING "ggsm_helpers.sch"
USING "ggsm_drawing.sch"
USING "ggsm_entity.sch"
//-------------------------------------------------
// SPECIAL WEAPON FUNCTIONS
//-------------------------------------------------
PROC GGSM_UPDATE_SPECIAL_WEAPON_DECOY(GGSM_SPWEAPON_DATA &data)
INT a
VECTOR_2D vPos
SWITCH (data.eState)
CASE GGSM_SPWEAPON_LAUNCH
vPos = sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].sWorld.vPosition
GGSM_PLAYER_DECOY_INIT(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].sWorld.vPosition)
data.fTimer = GGSM_DECOY_ACTIVE_TIME
data.eState = GGSM_SPWEAPON_ACTIVE
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_ABIL_PLAYER_ACTIVATE_DECOY, vPos)
BREAK
CASE GGSM_SPWEAPON_ACTIVE
a = FLOOR((data.fTimer / GGSM_DECOY_ACTIVE_TIME) * 128.0)
ARCADE_GAMES_SOUND_PLAY_LOOP(ARCADE_GAMES_SOUND_GGSM_ABIL_PLAYER_DECOY_LOOP)
IF GGSM_DOES_PLAYER_DECOY_EXIST()
GGSM_SET_PACKED_A_COLOR(sGGSMData.sEntities[sGGSMData.iPlayerDecoyIndex].iPackedColor, a)
ELSE
data.eState = GGSM_SPWEAPON_COOLDOWN
EXIT
ENDIF
IF (data.fTimer < 0)
vPos = sGGSMData.sEntities[sGGSMData.iPlayerDecoyIndex].sWorld.vPosition
ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_GGSM_ABIL_PLAYER_DECOY_LOOP)
GGSM_ENTITY_DESTROY(sGGSMData.sEntities[sGGSMData.iPlayerDecoyIndex])
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_ABIL_PLAYER_DEACTIVATE_DECOY, vPos)
data.eState = GGSM_SPWEAPON_COOLDOWN
ENDIF
BREAK
CASE GGSM_SPWEAPON_COOLDOWN
IF GGSM_DOES_PLAYER_DECOY_EXIST()
GGSM_ENTITY_DESTROY(sGGSMData.sEntities[sGGSMData.iPlayerDecoyIndex])
ENDIF
ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_GGSM_ABIL_PLAYER_DECOY_LOOP)
data.eState = GGSM_SPWEAPON_INACTIVE
BREAK
ENDSWITCH
ENDPROC
PROC GGSM_UPDATE_SPECIAL_WEAPON_NUKE(GGSM_SPWEAPON_DATA &data)
INT iDead
SWITCH (data.eState)
CASE GGSM_SPWEAPON_LAUNCH
GGSM_SET_PLAYER_INVUNERABLE()
GGSM_PLAY_SOUND(ARCADE_GAMES_SOUND_GGSM_ABIL_PLAYER_ACTIVATE_NUKE)
data.eState = GGSM_SPWEAPON_DETONATE
BREAK
CASE GGSM_SPWEAPON_DETONATE
GGSM_FADE_TO_WHITE(0.125)
data.eState = GGSM_SPWEAPON_ACTIVE
BREAK
CASE GGSM_SPWEAPON_ACTIVE
IF GGSM_IS_SCREEN_WHITED_OUT()
iDead = GGSM_ENTITY_NUKE_ARRAY(sGGSMData.sEntities, FALSE)
IF (iDead >= GGSM_KILLS_NEEDED_FOR_NUKE_TSHIRT)
//GGSM_UNLOCK_PRIZE(GGSM_UNLOCK_TSHIRTS_GGSM_NUKE)
ENDIF
GGSM_RESET_PROJECTILE_ARRAY(sGGSMData.sProjectiles)
data.eState = GGSM_SPWEAPON_COOLDOWN
GGSM_FADE_FROM_WHITE()
ENDIF
BREAK
CASE GGSM_SPWEAPON_COOLDOWN
GGSM_FADE_FROM_WHITE()
data.eState = GGSM_SPWEAPON_INACTIVE
BREAK
ENDSWITCH
ENDPROC
PROC GGSM_UPDATE_SPECIAL_WEAPON_REFLECT(GGSM_SPWEAPON_DATA &data)
INT a
SWITCH (data.eState)
CASE GGSM_SPWEAPON_LAUNCH
GGSM_PLAYER_SHIELD_INIT(TRUE)
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].eFlags, GGSM_ENTITY_BIT_REFLECT_BULLETS)
data.fTimer = GGSM_REPLUSE_ACTIVE_TIME
data.eState = GGSM_SPWEAPON_ACTIVE
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_ABIL_PLAYER_ACTIVATE_REPUSLE, sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].sWorld.vPosition)
BREAK
CASE GGSM_SPWEAPON_ACTIVE
a = FLOOR((data.fTimer / GGSM_REPLUSE_ACTIVE_TIME) * 255.0)
IF GGSM_DOES_PLAYER_SHIELD_EXIST()
GGSM_SET_PACKED_A_COLOR(sGGSMData.sEntities[sGGSMData.iPlayerShieldIndex].iPackedColor, a)
ELSE
CLEAR_BITMASK_ENUM_AS_ENUM(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].eFlags, GGSM_ENTITY_BIT_REFLECT_BULLETS)
data.eState = GGSM_SPWEAPON_COOLDOWN
EXIT
ENDIF
IF (data.fTimer < 0) OR NOT GGSM_IS_PLAYER_SHIP_ALIVE()
CLEAR_BITMASK_ENUM_AS_ENUM(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].eFlags, GGSM_ENTITY_BIT_REFLECT_BULLETS)
GGSM_ENTITY_DESTROY(sGGSMData.sEntities[sGGSMData.iPlayerShieldIndex])
data.eState = GGSM_SPWEAPON_COOLDOWN
ENDIF
BREAK
CASE GGSM_SPWEAPON_COOLDOWN
CLEAR_BITMASK_ENUM_AS_ENUM(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].eFlags, GGSM_ENTITY_BIT_REFLECT_BULLETS)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_ABIL_PLAYER_DEACTIVATE_REPULSE, sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].sWorld.vPosition)
IF GGSM_DOES_PLAYER_SHIELD_EXIST()
GGSM_ENTITY_DESTROY(sGGSMData.sEntities[sGGSMData.iPlayerShieldIndex])
ENDIF
data.eState = GGSM_SPWEAPON_INACTIVE
BREAK
ENDSWITCH
ENDPROC
PROC GGSM_UPDATE_SPECIAL_WEAPON_SHIELD(GGSM_SPWEAPON_DATA &data)
INT a
SWITCH (data.eState)
CASE GGSM_SPWEAPON_LAUNCH
GGSM_PLAYER_SHIELD_INIT(FALSE)
CLEAR_BITMASK_ENUM_AS_ENUM(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].eFlags, GGSM_ENTITY_BIT_REFLECT_BULLETS)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_ABIL_PLAYER_ACTIVATE_SHIELD, sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].sWorld.vPosition)
data.eState = GGSM_SPWEAPON_ACTIVE
BREAK
CASE GGSM_SPWEAPON_ACTIVE
IF GGSM_DOES_PLAYER_SHIELD_EXIST()
a = FLOOR(GGSM_ENTITY_GET_HP_PERCENTAGE(sGGSMData.sEntities[sGGSMData.iPlayerShieldIndex]) * 255.0)
GGSM_SET_PACKED_A_COLOR(sGGSMData.sEntities[sGGSMData.iPlayerShieldIndex].iPackedColor, a)
ELSE
data.eState = GGSM_SPWEAPON_COOLDOWN
ENDIF
BREAK
CASE GGSM_SPWEAPON_COOLDOWN
IF GGSM_DOES_PLAYER_SHIELD_EXIST()
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_ABIL_PLAYER_DEACTIVATE_SHIELD, sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].sWorld.vPosition)
GGSM_ENTITY_DESTROY(sGGSMData.sEntities[sGGSMData.iPlayerShieldIndex])
ENDIF
data.eState = GGSM_SPWEAPON_INACTIVE
BREAK
ENDSWITCH
ENDPROC
PROC GGSM_UPDATE_SPECIAL_WEAPON_TEMPORAL(GGSM_SPWEAPON_DATA &data)
SWITCH (data.eState)
CASE GGSM_SPWEAPON_LAUNCH
data.fTimer = GGSM_TEMPORAL_ACTIVE_TIME
data.eState = GGSM_SPWEAPON_ACTIVE
GGSM_PLAY_SOUND(ARCADE_GAMES_SOUND_GGSM_ABIL_PLAYER_ACTIVATE_STUN)
BREAK
CASE GGSM_SPWEAPON_ACTIVE
sGGSMData.fTimeScale -= (GET_FRAME_TIME() / 2.0)
IF (sGGSMData.fTimeScale < GGSM_TEMPORAL_TIME_SCALE)
sGGSMData.fTimeScale = GGSM_TEMPORAL_TIME_SCALE
ENDIF
IF (data.fTimer < 0.0) OR NOT GGSM_IS_PLAYER_SHIP_ALIVE()
GGSM_PLAY_SOUND(ARCADE_GAMES_SOUND_GGSM_ABIL_PLAYER_DEACTIVATE_STUN)
data.eState = GGSM_SPWEAPON_COOLDOWN
ENDIF
BREAK
CASE GGSM_SPWEAPON_COOLDOWN
sGGSMData.fTimeScale += (GET_FRAME_TIME() / 2.0)
IF (sGGSMData.fTimeScale >= 1.0)
sGGSMData.fTimeScale = 1.0
data.eState = GGSM_SPWEAPON_INACTIVE
ENDIF
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL GGSM_GET_FREE_SPECIAL_WEAPON_SLOT(GGSM_SPWEAPON_DATA &array[], INT &ind)
INT i
REPEAT COUNT_OF(array) i
IF (array[i].eState = GGSM_SPWEAPON_INACTIVE)
ind = i
RETURN TRUE
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
FUNC BOOL GGSM_DEPLOY_SPECIAL_WEAPON(GGSM_SPECIAL_WEAPON_TYPE eType)
INT ind
IF NOT GGSM_GET_FREE_SPECIAL_WEAPON_SLOT(sGGSMData.sSpWeaponData, ind)
RETURN FALSE
ENDIF
sGGSMData.sSpWeaponData[ind].eType = eType
sGGSMData.sSpWeaponData[ind].eState = GGSM_SPWEAPON_LAUNCH
RETURN TRUE
ENDFUNC
PROC GGSM_UPDATE_SPECIAL_WEAPON(GGSM_SPWEAPON_DATA &spr)
IF (spr.eType = GGSM_SPECIAL_WEAPON_NONE)
EXIT
ENDIF
IF (spr.fTimer > 0.0)
spr.fTimer -= GET_FRAME_TIME()
ENDIF
SWITCH (spr.eType)
CASE GGSM_SPECIAL_WEAPON_DECOY
GGSM_UPDATE_SPECIAL_WEAPON_DECOY(spr)
BREAK
CASE GGSM_SPECIAL_WEAPON_NUKE
GGSM_UPDATE_SPECIAL_WEAPON_NUKE(spr)
BREAK
CASE GGSM_SPECIAL_WEAPON_REFLECT
GGSM_UPDATE_SPECIAL_WEAPON_REFLECT(spr)
BREAK
CASE GGSM_SPECIAL_WEAPON_SHIELD
GGSM_UPDATE_SPECIAL_WEAPON_SHIELD(spr)
BREAK
CASE GGSM_SPECIAL_WEAPON_TEMPORAL
GGSM_UPDATE_SPECIAL_WEAPON_TEMPORAL(spr)
BREAK
ENDSWITCH
ENDPROC
PROC GGSM_UPDATE_SPECIAL_WEAPON_ARRAY(GGSM_SPWEAPON_DATA &array[])
INT i
REPEAT COUNT_OF(array) i
GGSM_UPDATE_SPECIAL_WEAPON(array[i])
ENDREPEAT
ENDPROC
//-------------------------------------------------
// POWER UP FUNCTIONS
//-------------------------------------------------
PROC GGSM_SET_WEAPON_IN_SLOT(GGSM_SPRITE_TYPE eType, INT iSlot)
// handle help
IF (iSlot = GGSM_WEAPON_SLOT_SPECIAL) AND NOT IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.eHelpFlags, GGSM_HELP_BIT_SPECIAL)
IF GGSM_SHOULD_SHOW_TUTORIAL(GGSM_HELP_BIT_SPECIAL)
ARCADE_GAMES_HELP_TEXT_PRINT(ARCADE_GAMES_HELP_TEXT_ENUM_GGSM_SPECIALWPN)
ENDIF
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.eHelpFlags, GGSM_HELP_BIT_SPECIAL)
ENDIF
IF (iSlot = GGSM_WEAPON_SLOT_DEFENSE) AND NOT IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.eHelpFlags, GGSM_HELP_BIT_DEFENSE)
IF GGSM_SHOULD_SHOW_TUTORIAL(GGSM_HELP_BIT_DEFENSE)
ARCADE_GAMES_HELP_TEXT_PRINT(ARCADE_GAMES_HELP_TEXT_ENUM_GGSM_DEFENSEWPN)
ENDIF
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.eHelpFlags, GGSM_HELP_BIT_DEFENSE)
ENDIF
sGGSMData.eWeaponSlot[iSlot] = eType
ENDPROC
PROC GGSM_USE_WEAPON_IN_SLOT(INT iSlot)
INT iSlotCheck
IF NOT GGSM_GET_FREE_SPECIAL_WEAPON_SLOT(sGGSMData.sSpWeaponData, iSlotCheck)
EXIT
ENDIF
SWITCH (sGGSMData.eWeaponSlot[iSlot])
CASE GGSM_SPRITE_POWER_UP_STUN
GGSM_DEPLOY_SPECIAL_WEAPON(GGSM_SPECIAL_WEAPON_TEMPORAL)
BREAK
CASE GGSM_SPRITE_POWER_UP_NUKE
GGSM_DEPLOY_SPECIAL_WEAPON(GGSM_SPECIAL_WEAPON_NUKE)
BREAK
CASE GGSM_SPRITE_POWER_UP_DECOY
GGSM_DEPLOY_SPECIAL_WEAPON(GGSM_SPECIAL_WEAPON_DECOY)
BREAK
CASE GGSM_SPRITE_POWER_UP_SHIELD
GGSM_DEPLOY_SPECIAL_WEAPON(GGSM_SPECIAL_WEAPON_SHIELD)
BREAK
CASE GGSM_SPRITE_POWER_UP_REPULSE
GGSM_DEPLOY_SPECIAL_WEAPON(GGSM_SPECIAL_WEAPON_REFLECT)
BREAK
ENDSWITCH
sGGSMData.eWeaponSlot[iSlot] = GGSM_SPRITE_NONE
ENDPROC
PROC GGSM_APPLY_POWER_UP(GGSM_POWER_UP &pType)
IF NOT GGSM_DOES_PLAYER_SHIP_EXIST()
EXIT
ENDIF
VECTOR_2D vShipPos = sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].sWorld.vPosition
SWITCH (pType.eType)
CASE GGSM_SPRITE_POWER_UP_DUALARCH
GGSM_ENTITY_SET_WEAPON(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex], GGSM_WEAPON_PLYRDUALARCH)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_PICKUP_DOUBLE, vShipPos)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_MONKEY_VOICE_COLLECT_POWERUP, vShipPos)
BREAK
CASE GGSM_SPRITE_POWER_UP_FORWARD_BACK
GGSM_ENTITY_SET_WEAPON(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex], GGSM_WEAPON_PLYRBACKVULCAN)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_PICKUP_BOLT, vShipPos)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_MONKEY_VOICE_COLLECT_POWERUP, vShipPos)
BREAK
CASE GGSM_SPRITE_POWER_UP_DECOY
GGSM_SET_WEAPON_IN_SLOT(GGSM_SPRITE_POWER_UP_DECOY, GGSM_WEAPON_SLOT_DEFENSE)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_PICKUP_DECOY, vShipPos)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_MONKEY_VOICE_COLLECT_POWERUP, vShipPos)
BREAK
CASE GGSM_SPRITE_POWER_UP_EXPLOSION
GGSM_ENTITY_SET_WEAPON(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex], GGSM_WEAPON_PLYREXPSHELL)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_PICKUP_EXPLOSION, vShipPos)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_MONKEY_VOICE_COLLECT_POWERUP, vShipPos)
BREAK
CASE GGSM_SPRITE_POWER_UP_EXTRALIFE
GGSM_GIVE_EXTRA_LIFE()
BREAK
CASE GGSM_SPRITE_POWER_UP_HEALTH
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_MONKEY_VOICE_COLLECT_POWERUP, vShipPos)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_PICKUP_HEALTH, vShipPos)
IF GGSM_ENTITY_IS_AT_FULL_HEALTH(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex])
GGSM_INCREASE_PLAYER_SCORE(GGSM_POINTS_FOR_FULL_HEALTH)
ELSE
GGSM_ENTITY_RESET_HEALTH(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex])
ENDIF
BREAK
CASE GGSM_SPRITE_POWER_UP_NUKE
GGSM_SET_WEAPON_IN_SLOT(GGSM_SPRITE_POWER_UP_NUKE, GGSM_WEAPON_SLOT_SPECIAL)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_PICKUP_NUKE, vShipPos)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_MONKEY_VOICE_COLLECT_POWERUP, vShipPos)
BREAK
CASE GGSM_SPRITE_POWER_UP_REPULSE
GGSM_SET_WEAPON_IN_SLOT(GGSM_SPRITE_POWER_UP_REPULSE, GGSM_WEAPON_SLOT_DEFENSE)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_PICKUP_REPULSE, vShipPos)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_MONKEY_VOICE_COLLECT_POWERUP, vShipPos)
BREAK
CASE GGSM_SPRITE_POWER_UP_ROCKET
GGSM_ENTITY_SET_WEAPON(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex], GGSM_WEAPON_PLYRHOMINGROCKET)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_PICKUP_ROCKET, vShipPos)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_MONKEY_VOICE_COLLECT_POWERUP, vShipPos)
BREAK
CASE GGSM_SPRITE_POWER_UP_SCATTER
GGSM_ENTITY_SET_WEAPON(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex], GGSM_WEAPON_PLYRSCATTER)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_PICKUP_SCATTER, vShipPos)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_MONKEY_VOICE_COLLECT_POWERUP, vShipPos)
BREAK
CASE GGSM_SPRITE_POWER_UP_SHIELD
GGSM_SET_WEAPON_IN_SLOT(GGSM_SPRITE_POWER_UP_SHIELD, GGSM_WEAPON_SLOT_DEFENSE)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_PICKUP_SHIELD, vShipPos)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_MONKEY_VOICE_COLLECT_POWERUP, vShipPos)
BREAK
CASE GGSM_SPRITE_POWER_UP_STUN
GGSM_SET_WEAPON_IN_SLOT(GGSM_SPRITE_POWER_UP_STUN, GGSM_WEAPON_SLOT_SPECIAL)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_PICKUP_STUN, vShipPos)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_MONKEY_VOICE_COLLECT_POWERUP, vShipPos)
BREAK
CASE GGSM_SPRITE_POWER_UP_WAVE
GGSM_ENTITY_SET_WEAPON(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex], GGSM_WEAPON_PLYRWAVEBLASTER)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_PICKUP_WAVE, vShipPos)
GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND_GGSM_MONKEY_VOICE_COLLECT_POWERUP, vShipPos)
BREAK
ENDSWITCH
GGSM_INCREASE_PLAYER_SCORE(100)
sGGSMData.sGameStats.powerUps ++
CDEBUG1LN(DEBUG_MINIGAME, "GGSM_APPLY_POWER_UP - TYPE:", GGSM_GET_SPRITE_NAME(pType.eType))
pType.eType = GGSM_SPRITE_NONE
ENDPROC
PROC GGSM_UPDATE_POWER_UP(GGSM_POWER_UP &pType)
VECTOR_2D vPos
VECTOR_2D vSize
FLOAT fDistSq
IF (pType.eType = GGSM_SPRITE_NONE)
EXIT
ENDIF
#IF IS_DEBUG_BUILD
IF (sGGSMData.bDebugNoPowerUps)
pType.eType = GGSM_SPRITE_NONE
EXIT
ENDIF
#ENDIF
// move power up
vPos = GGSM_UNPACK_VECTOR_2D(pType.iPackedPosition)
vSize = GGSM_GET_SPRITE_SIZE(GGSM_SPRITE_POWER_UP_BEAM)
vPos.x -= GGSM_POWER_UP_SPEED * sGGSMData.fTimeScale * sGGSMData.fDeltaTime
IF (vPos.x < 1500.0)
IF NOT GGSM_IS_POINT_ON_SCREEN(vPos, vSize)
CDEBUG1LN(DEBUG_MINIGAME, "GGSM_UPDATE_POWER_UP - TYPE:", GGSM_GET_SPRITE_NAME(pType.eType), " OFF SCREEN")
pType.eType = GGSM_SPRITE_NONE
EXIT
ENDIF
ENDIF
IF NOT GGSM_IS_PLAYER_SHIP_ALIVE()
EXIT
ENDIF
// handle power up collision
pType.iPackedPosition = GGSM_PACK_VECTOR_2D_TO_INT(vPos)
fDistSq = VECTOR_2D_DIST2(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].sCollider.sAABB.vCenter, vPos)
IF (fDistSq <= (500.0 * 500.0))
IF GGSM_SHOULD_SHOW_TUTORIAL(GGSM_HELP_BIT_POWERUP)
ARCADE_GAMES_HELP_TEXT_CLEAR()
ARCADE_GAMES_HELP_TEXT_PRINT(ARCADE_GAMES_HELP_TEXT_ENUM_GGSM_COLLECTPOWERUP)
ENDIF
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.eHelpFlags, GGSM_HELP_BIT_POWERUP)
ENDIF
IF (fDistSq <= (vSize.x * vSize.x))
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.eHelpFlags, GGSM_HELP_BIT_POWERUP)
GGSM_APPLY_POWER_UP(pType)
sGGSMData.bPowerUpCollected = TRUE
ENDIF
ENDPROC
PROC GGSM_UPDATE_POWER_UP_ARRAY(GGSM_POWER_UP &pArray[])
INT i
REPEAT COUNT_OF(pArray) i
GGSM_UPDATE_POWER_UP(pArray[i])
ENDREPEAT
ENDPROC
//-------------------------------------------------
// ENEMY SPAWNER
//-------------------------------------------------
PROC GGSM_RESET_ENEMY_SPAWNER()
sGGSMData.iSpawnIndexCounter = 0
sGGSMData.iEnemiesCreated = 0
sGGSMData.iEnemiesDestroyed = 0
sGGSMData.fChainMultiplier = 0.0
ENDPROC
PROC GGSM_UPDATE_ENEMY_SPAWNER()
INT iGroupID = -1
#IF IS_DEBUG_BUILD
IF (sGGSMData.bDebugDisableEnemySpawn)
EXIT
ENDIF
#ENDIF
// update spawner
IF (sGGSMData.iSpawnIndexCounter >= GGSM_MAX_SPAWN_DATA)
EXIT
ENDIF
GGSM_FORMATION_DATA data = sGGSMData.sSpawnData[sGGSMData.iSpawnIndexCounter]
IF (sGGSMData.sCamera.fDistTravelled < data.fScrollDistance) OR (data.fScrollDistance <= 0.0)
EXIT
ENDIF
iGroupID = GGSM_GET_FREE_ENTITY_GROUP(sGGSMData.sEntityGroup)
IF (iGroupID = -1)
CPRINTLN(DEBUG_MINIGAME, "GGSM_UPDATE_ENEMY_SPAWNER - CAN'T GET FREE GROUP")
EXIT
ENDIF
GGSM_ACTIVATE_ENTITY_GROUP_AS_FORMATION(sGGSMData.sEntityGroup[iGroupID], data)
sGGSMData.iSpawnIndexCounter ++
ENDPROC
PROC GGSM_RESET_FOR_STAGE_START(BOOL bResetStageData = TRUE, FLOAT fSkipDist = 0.0)
CPRINTLN(DEBUG_MINIGAME, "GGSM_RESET_FOR_STAGE_START - Reset Stage Data:", GET_STRING_FROM_BOOL(bResetStageData))
GGSM_RESET_ENTITY_ARRAY(sGGSMData.sEntities)
GGSM_RESET_PROJECTILE_ARRAY(sGGSMData.sProjectiles)
GGSM_RESET_ENTITY_DEPTHSORT_ARRAY()
GGSM_DIALOG_CONTROLLER_SET_STATE(sGGSMData.sDialogController, GGSM_DIALOG_STATE_NONE)
GGSM_RESET_ENTITY_GROUP_ARRAY(sGGSMData.sEntityGroup)
GGSM_RESET_FXSPRITE_ARRAY(sGGSMData.sFXSprite)
GGSM_RESET_POWER_UP_ARRAY(sGGSMData.sPowerUp)
GGSM_RESET_SPECIAL_WEAPONS_ARRAY(sGGSMData.sSpWeaponData)
GGSM_RESET_BOSS_CONTROLLER_ARRAY(sGGSMData.sBossController)
GGSM_RESET_ENEMY_SPAWNER()
GGSM_CAMERA_RESET(sGGSMData.sCamera)
GGSM_BGSCROLLER_RESET(sGGSMData.sBGScroller, sGGSMData.sGameStats.level)
sGGSMData.iSpawnIndexCounter = 0
IF (bResetStageData)
GGSM_GET_STAGE_FORMATION_DATA_ARRAY(sGGSMData.sSpawnData, sGGSMData.sGameStats.level)
GGSM_GET_STAGE_TILE_MAP(sGGSMData.sTileMap, sGGSMData.sGameStats.level)
ENDIF
sGGSMData.iPlayerDecoyIndex = GGSM_INVALID_ENTITY
sGGSMData.iPlayerShieldIndex = GGSM_INVALID_ENTITY
sGGSMData.iPlayerShipIndex = GGSM_INVALID_ENTITY
sGGSMData.eStageFlags = GGSM_STAGE_BIT_NONE
sGGSMData.iEntitiesActive = 0
sGGSMData.iProjectilesActive = 0
sGGSMData.iSectorBonus = 0
sGGSMData.iTakedownBonus = 0
sGGSMData.iNoMissBonus = GGSM_NO_MISS_CLEAR_BONUS
sGGSMData.iNoDamageBonus = GGSM_NO_DAMAGE_CLEAR_BONUS
sGGSMData.fChainMultiplier = 0.0
sGGSMData.iGraze = 0
sGGSMData.fGrazeTimer = 0.0
GGSM_CAMERA_JUMP_TO_DISTANCE(sGGSMData.sCamera, fSkipDist)
sGGSMData.iSpawnIndexCounter = 0
CPRINTLN(DEBUG_MINIGAME, "GGSM_RESET_FOR_STAGE_START - Spawn Used:", sGGSMData.iSpawnsUsed)
ENDPROC
PROC GGSM_RESET_FOR_GAME_START()
INT i
GGSM_RESET_GAME_STATS()
sGGSMData.iPlayerLives = 3
sGGSMData.iExtendPtsCounter = 0
sGGSMData.iMaxEntitiesActive = 0
sGGSMData.iMaxGroupsActive = 0
sGGSMData.iMaxProjectilesActive = 0
sGGSMData.bPowerUpCollected = FALSE
REPEAT COUNT_OF(sGGSMData.eWeaponSlot) i
sGGSMData.eWeaponSlot[i] = GGSM_SPRITE_NONE
ENDREPEAT
ENDPROC
PROC GGSM_PROCESS_PLAYER_VS_ENEMY_COLLISIONS()
INT cnt
IF (sGGSMData.iPlayerShipIndex = GGSM_INVALID_ENTITY)
EXIT
ENDIF
IF NOT GGSM_ENTITY_HAS_COLLISION(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex])
EXIT
ENDIF
REPEAT COUNT_OF(sGGSMData.sEntities) cnt
IF NOT GGSM_ENTITY_CAN_COLLIDE_WITH(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex], sGGSMData.sEntities[cnt])
RELOOP
ENDIF
IF GGSM_DOES_PLAYER_SHIELD_EXIST()
IF GGSM_COLLIDER_INTERSECT(sGGSMData.sEntities[cnt].sCollider, sGGSMData.sEntities[sGGSMData.iPlayerShieldIndex].sCollider)
GGSM_ENTITY_DAMAGE(sGGSMData.sEntities[sGGSMData.iPlayerShieldIndex], 9999)
sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].iInvTimeMS = GET_GAME_TIMER() + 1000
EXIT
ENDIF
ENDIF
IF GGSM_COLLIDER_INTERSECT(sGGSMData.sEntities[cnt].sCollider, sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].sCollider)
IF GGSM_ENTITY_DAMAGE(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex], GGSM_PLAYER_DAMAGE_PER_ENEMY_COLLISION)
cnt = COUNT_OF(sGGSMData.sEntities) + 1
ELSE
RELOOP
ENDIF
ENDIF
ENDREPEAT
ENDPROC
PROC GGSM_PROCESS_ENTITY_VS_PROJECTILE_COLLISIONS(GGSM_ENTITY &entArray[], GGSM_PROJECTILE &projArray[])
INT ind, cnt
BOOL bHasReflectCapability
// player bullets vs enemies
REPEAT COUNT_OF(entArray) cnt
IF NOT GGSM_ENTITY_HAS_COLLISION(entArray[cnt])
RELOOP
ENDIF
bHasReflectCapability = IS_BITMASK_ENUM_AS_ENUM_SET(entArray[cnt].eFlags, GGSM_ENTITY_BIT_REFLECT_BULLETS)
REPEAT COUNT_OF(projArray) ind
IF NOT GGSM_ENTITY_CAN_COLLIDE_WITH_PROJECTILE(entArray[cnt], projArray[ind])
RELOOP
ENDIF
IF GGSM_COLLIDER_INTERSECT(projArray[ind].sCollider, entArray[cnt].sCollider)
IF (bHasReflectCapability)
GGSM_REFLECT_PROJECTILE(projArray[ind])
RELOOP
ENDIF
GGSM_PROJECTILE_TAKE_DAMAGE(projArray[ind])
IF GGSM_ENTITY_DAMAGE(entArray[cnt])
ind = COUNT_OF(projArray) + 1
ELSE
RELOOP
ENDIF
ENDIF
ENDREPEAT
ENDREPEAT
ENDPROC
PROC GGSM_PROCESS_PROJECTILE_VS_BACKGROUND_COLLISIONS(GGSM_PROJECTILE &projArray[])
INT ind
IF (sGGSMData.sTileMap.iMapWidth = 0) OR (sGGSMData.sTileMap.iMapHeight = 0)
EXIT
ENDIF
REPEAT COUNT_OF(projArray) ind
IF NOT GGSM_PROJECTILE_HAS_COLLISION(projArray[ind])
RELOOP
ENDIF
IF GGSM_IS_SCREEN_POSITION_COLLIDED_WITH_TILE_MAP(projArray[ind].sCollider.sData.vCollisionVectors[0])
GGSM_PROJECTILE_TAKE_DAMAGE(projArray[ind])
RELOOP
ENDIF
IF (projArray[ind].sCollider.sData.eType = GGSM_COLLISION_CAPSULE)
IF GGSM_IS_SCREEN_POSITION_COLLIDED_WITH_TILE_MAP(projArray[ind].sCollider.sData.vCollisionVectors[1])
GGSM_PROJECTILE_TAKE_DAMAGE(projArray[ind])
RELOOP
ENDIF
ENDIF
ENDREPEAT
ENDPROC
PROC GGSM_PROCESS_PLAYER_VS_BACKGROUND_COLLISIONS()
IF (sGGSMData.sTileMap.iMapWidth = 0) OR (sGGSMData.sTileMap.iMapHeight = 0)
EXIT
ENDIF
IF (sGGSMData.iPlayerShipIndex = GGSM_INVALID_ENTITY)
EXIT
ENDIF
IF NOT GGSM_ENTITY_HAS_COLLISION(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex])
EXIT
ENDIF
INT i
VECTOR_2D vPos
VECTOR_2D vCollidePoints[GGSM_MAX_ENTITY_BG_COLLISIONPOINTS]
vCollidePoints[0] = INIT_VECTOR_2D(0.0, -30.0)
vCollidePoints[1] = INIT_VECTOR_2D(35.0, 0.0)
vCollidePoints[2] = INIT_VECTOR_2D(0.0, 35.0)
vCollidePoints[3] = INIT_VECTOR_2D(-31.0, 0.0)
REPEAT GGSM_MAX_ENTITY_BG_COLLISIONPOINTS i
vPos = ADD_VECTOR_2D(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].sCollider.sAABB.vCenter, vCollidePoints[i])
IF GGSM_IS_SCREEN_POSITION_COLLIDED_WITH_TILE_MAP(vPos)
IF GGSM_DOES_PLAYER_SHIELD_EXIST()
GGSM_ENTITY_DAMAGE(sGGSMData.sEntities[sGGSMData.iPlayerShieldIndex], 9999)
sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].iInvTimeMS = GET_GAME_TIMER() + 1000
EXIT
ENDIF
GGSM_ENTITY_DAMAGE(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex], 9999)
EXIT
ENDIF
ENDREPEAT
ENDPROC
PROC GGSM_UPDATE_MAIN_GAME()
INT i
IF (sGGSMData.bGamePaused)
EXIT
ENDIF
IF GGSM_IS_DIALOG_ACTIVE()
GGSM_SET_PLAYER_INVUNERABLE()
EXIT
ENDIF
CLEAR_BITMASK_ENUM_AS_ENUM(sGGSMData.eStageFlags, GGSM_STAGE_BIT_ENEMIES_ACTIVE | GGSM_STAGE_BIT_PLAYER_PROJECTILES_ACTIVE | GGSM_STAGE_BIT_BOSSES_ACTIVE | GGSM_STAGE_BIT_ENEMY_PROJECTILES_ACTIVE | GGSM_STAGE_BIT_GROUPS_ACTIVE)
IF IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.eStageFlags, GGSM_STAGE_BIT_PLAYER_BOSS_INVUNERABLE)
GGSM_SET_PLAYER_INVUNERABLE()
ENDIF
IF (sGGSMData.fKillStreakTimer > 0.0)
sGGSMData.fKillStreakTimer -= GET_FRAME_TIME()
IF (sGGSMData.fKillStreakTimer <= 0.0)
sGGSMData.fKillStreakTimer = 0.0
sGGSMData.iKillStreak = 0
ENDIF
ENDIF
IF (sGGSMData.iPlayerLives > 0) AND NOT GGSM_DOES_PLAYER_SHIP_EXIST()
GGSM_PLAYER_SHIP_INIT(INIT_VECTOR_2D(600.0, 540.0))
ENDIF
GGSM_UPDATE_ENEMY_SPAWNER()
sGGSMData.iGroupsActive = 0
REPEAT COUNT_OF(sGGSMData.sEntityGroup) i
GGSM_ENTITY_GROUP_UPDATE(sGGSMData.sEntityGroup[i])
ENDREPEAT
IF (sGGSMData.iGroupsActive > sGGSMData.iMaxGroupsActive)
sGGSMData.iMaxGroupsActive = sGGSMData.iGroupsActive
ENDIF
sGGSMData.iEntitiesActive = 0
REPEAT GGSM_MAX_ENTITIES i
IF (sGGSMData.sEntities[i].eState != GGSM_ENTITY_STATE_NONE)
GGSM_ENTITY_UPDATE(sGGSMData.sEntities[i])
ENDIF
ENDREPEAT
IF (sGGSMData.iEntitiesActive > sGGSMData.iMaxEntitiesActive)
sGGSMData.iMaxEntitiesActive = sGGSMData.iEntitiesActive
ENDIF
GGSM_BOSS_CONTROLLER_UPDATE_ARRAY(sGGSMData.sBossController)
GGSM_UPDATE_PROJECTILE_ARRAY(sGGSMData.sProjectiles)
GGSM_PROCESS_PLAYER_VS_ENEMY_COLLISIONS()
GGSM_PROCESS_ENTITY_VS_PROJECTILE_COLLISIONS(sGGSMData.sEntities, sGGSMData.sProjectiles)
GGSM_PROCESS_PROJECTILE_VS_BACKGROUND_COLLISIONS(sGGSMData.sProjectiles)
GGSM_PROCESS_PLAYER_VS_BACKGROUND_COLLISIONS()
IF IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.eStageFlags, GGSM_STAGE_BIT_PLAYER_SPECIAL_WPN_USED)
GGSM_USE_WEAPON_IN_SLOT(GGSM_WEAPON_SLOT_SPECIAL)
CLEAR_BITMASK_ENUM_AS_ENUM(sGGSMData.eStageFlags, GGSM_STAGE_BIT_PLAYER_SPECIAL_WPN_USED)
ENDIF
IF IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.eStageFlags, GGSM_STAGE_BIT_PLAYER_DEFENSE_WPN_USED)
GGSM_USE_WEAPON_IN_SLOT(GGSM_WEAPON_SLOT_DEFENSE)
CLEAR_BITMASK_ENUM_AS_ENUM(sGGSMData.eStageFlags, GGSM_STAGE_BIT_PLAYER_DEFENSE_WPN_USED)
ENDIF
GGSM_UPDATE_FXSPRITE_ARRAY(sGGSMData.sFXSprite)
GGSM_UPDATE_SPECIAL_WEAPON_ARRAY(sGGSMData.sSpWeaponData)
GGSM_UPDATE_POWER_UP_ARRAY(sGGSMData.sPowerUp)
IF (GET_GAME_TIMER() > sGGSMData.iLastEnemyDeathTimeMS + GGSM_CHAIN_GRACE_TIME_MS)
sGGSMData.fChainMultiplier -= (GET_FRAME_TIME() * GGSM_CHAIN_REDUCE_RATE_PER_SECOND)
IF (sGGSMData.fChainMultiplier < 0)
sGGSMData.fChainMultiplier = 0
ENDIF
ENDIF
sGGSMData.fGrazeTimer += GET_FRAME_TIME()
IF (sGGSMData.fGrazeTimer > sGGSMData.fGrazeTime) AND (sGGSMData.bGrazed)
sGGSMData.bGrazed = FALSE
GGSM_INCREASE_PLAYER_SCORE(10)
sGGSMData.iGraze ++
sGGSMData.fGrazeTimer = sGGSMData.fGrazeTime
ENDIF
ENDPROC
//-------------------------------------------------
// CLIENT STATE
//-------------------------------------------------
/// PURPOSE:
/// Set Client State
/// PARAMS:
/// eNewState - New State
PROC GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE eNewState)
ARCADE_GAMES_HELP_TEXT_CLEAR()
CDEBUG1LN(DEBUG_MINIGAME, "[GGSM] GGSM_SET_CLIENT_SUBSTATE - State changed from ",
GGSM_SUBSTATE_TO_STRING(sGGSMData.eSubState), " to ", GGSM_SUBSTATE_TO_STRING(eNewState))
sGGSMData.eSubState = eNewState
sGGSMData.fStateTimer = 0
sGGSMData.fStateInterpolateValue = 0.0
sGGSMData.fTimeScale = 1.0
ENDPROC
/// PURPOSE:
/// Set Client State
/// PARAMS:
/// eNewState - New State
PROC GGSM_SET_CLIENT_STATE(GGSM_STATE eNewState)
CDEBUG1LN(DEBUG_MINIGAME, "[GGSM] GGSM_SET_CLIENT_STATE - State changed from ",
GGSM_STATE_TO_STRING(sGGSMData.eState), " to ", GGSM_STATE_TO_STRING(eNewState))
sGGSMData.bGamePaused = FALSE
sGGSMData.eState = eNewState
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_INIT)
ENDPROC
/// PURPOSE:
/// Cleanup and Exit Client
PROC GGSM_CLEANUP_AND_EXIT_CLIENT()
IF GGSM_IS_GAME_ACTIVELY_PLAYING()
GGSM_SEND_PLAYSTATS()
ENDIF
GGSM_TRIGGER_MUSIC_EVENT("ARCADE_SM_STOP")
CDEBUG1LN(DEBUG_MINIGAME, "[GGSM] [JS] - GGSM_CLEANUP_AND_EXIT_CLIENT - Cleaning up and terminating the script")
GGSM_PLAY_AVATAR_LEAVE_MACHINE_ANIM()
ARCADE_CABINET_COMMON_CLEANUP()
GGSM_RELEASE_BINK_MOVIE(sGGSMData.sBinkMovie)
GGSM_RELEASE_ALL_TEXTURE_DICTS()
GGSM_STOP_AUDIO_SCENE("DLC_CH_AM_SM_IN_MENUS_SCENE")
GGSM_STOP_AUDIO_SCENE("DLC_CH_AM_SM_IN_GAMEPLAY_SCENE")
GGSM_STOP_AUDIO_SCENE("DLC_CH_ARCADE_MACHINE_IN_USE_SCENE")
GGSM_PC_CONTROLS_CLEANUP()
ARCADE_GAMES_HELP_TEXT_CLEAR()
ARCADE_GAMES_AUDIO_CLEAN_UP()
ARCADE_GAMES_SOUND_RELEASE_AUDIO_BANK("DLC_HEIST3\\H3_SpaceMonkey3")
CLEAR_ADDITIONAL_TEXT(MINIGAME_TEXT_SLOT, FALSE)
TERMINATE_THIS_MULTIPLAYER_THREAD_NO_ARGS()
ENDPROC
/// PURPOSE:
/// Initializes the Client
PROC GGSM_PROCESS_CLIENT_STATE_INIT()
GGSM_INIT_GLOBALS()
ARCADE_CABINET_COMMON_INITIALIZATION()
ARCADE_GAMES_POSTFX_INIT(CASINO_ARCADE_GAME_GO_GO_SPACE_MONKEY_3)
ARCADE_GAMES_SOUND_INIT(CASINO_ARCADE_GAME_GO_GO_SPACE_MONKEY_3)
GGSM_PC_CONTROLS_INIT()
GGSM_SET_CHALLENGE_BITS_FROM_AWARDS()
GGSM_CAMERA_INIT(sGGSMData.sCamera)
GGSM_TILEMAP_INIT(sGGSMData.sTileMap)
GGSM_SET_CLIENT_STATE(GGSM_STATE_REQUESTING_ASSETS)
ENDPROC
/// PURPOSE:
/// Processes Requesting of Assets
PROC GGSM_PROCESS_CLIENT_STATE_REQUESTING_ASSETS()
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_RESIDENT)
EXIT
ENDIF
IF GGSM_IS_ANY_EDITOR_INCLUDED()
IF NOT GGSM_LOAD_ALL_TEXTURE_DICTS()
EXIT
ENDIF
ENDIF
//Additional Text
REQUEST_ADDITIONAL_TEXT("GGSM", MINIGAME_TEXT_SLOT)
IF NOT HAS_THIS_ADDITIONAL_TEXT_LOADED("GGSM", MINIGAME_TEXT_SLOT)
CDEBUG1LN(DEBUG_MINIGAME, "[GGSM] GGSM_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading Additional Text: GGSM")
EXIT
ENDIF
IF NOT ARCADE_GAMES_POSTFX_REQUESTING_ASSETS()
CDEBUG1LN(DEBUG_MINIGAME, "[GGSM] GGSM_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Post FX")
EXIT
ENDIF
//Audio
IF NOT ARCADE_GAMES_SOUND_REQUESTING_AUDIO_BANK("DLC_HEIST3\\H3_SpaceMonkey3")
CDEBUG1LN(DEBUG_MINIGAME, "[GGSM] GGSM_PROCESS_CLIENT_STATE_REQUESTING_ASSETS - Loading Audio Bank DLC_HEIST3/H3_SpaceMonkey3")
EXIT
ENDIF
GGSM_START_AUDIO_SCENE("DLC_CH_ARCADE_MACHINE_IN_USE_SCENE")
GGSM_SET_CLIENT_STATE(GGSM_STATE_PSA_SCREEN)
#IF GGSM_NO_INTRO
GGSM_SET_CLIENT_STATE(GGSM_STATE_STAGE_SELECT)
#ENDIF
GGSM_FADE_SCREEN_OUT(0.01)
ENDPROC
PROC GGSM_PROCESS_CLIENT_STATE_FIB_WARNING()
SWITCH (sGGSMData.eSubState)
CASE GGSM_SUBSTATE_INIT
IF NOT GGSM_LOAD_TEXTURE_DICT_FOR_SPRITE(GGSM_SPRITE_FBI_WARN)
EXIT
ENDIF
GGSM_FADE_SCREEN_IN()
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_ACTIVE)
BREAK
CASE GGSM_SUBSTATE_ACTIVE
GGSM_DRAW_CLIENT_STATE_FIB_WARNING()
IF (sGGSMData.fStateTimer > 5.0)
GGSM_FADE_SCREEN_OUT()
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLEANUP)
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLEANUP
GGSM_DRAW_CLIENT_STATE_FIB_WARNING()
IF GGSM_IS_SCREEN_FADED_OUT()
GGSM_SET_CLIENT_STATE(GGSM_STATE_PSA_SCREEN)
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC GGSM_PROCESS_CLIENT_STATE_PSA_SCREEN()
SWITCH (sGGSMData.eSubState)
CASE GGSM_SUBSTATE_INIT
IF NOT GGSM_LOAD_TEXTURE_DICT_FOR_SPRITE(GGSM_SPRITE_PSA)
EXIT
ENDIF
GGSM_FADE_SCREEN_IN()
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_ACTIVE)
BREAK
CASE GGSM_SUBSTATE_ACTIVE
GGSM_DRAW_CLIENT_STATE_PSA_SCREEN()
IF (sGGSMData.fStateTimer > 4.0)
GGSM_FADE_SCREEN_OUT()
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLEANUP)
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLEANUP
GGSM_DRAW_CLIENT_STATE_PSA_SCREEN()
IF GGSM_IS_SCREEN_FADED_OUT()
GGSM_SET_CLIENT_STATE(GGSM_STATE_DEVELOPER_LOGO)
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC GGSM_PROCESS_CLIENT_STATE_DEVELOPER_LOGO()
GGSM_DRAW_BLACK_BG()
SWITCH (sGGSMData.eSubState)
CASE GGSM_SUBSTATE_INIT
GGSM_FADE_SCREEN_IN()
IF NOT GGSM_START_BINK_MOVIE(sGGSMData.sBinkMovie, "_Pixtro_Intro_80s_2")
GGSM_SET_CLIENT_STATE(GGSM_STATE_FIB_WARNING)
EXIT
ENDIF
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_ACTIVE)
BREAK
CASE GGSM_SUBSTATE_ACTIVE
IF GGSM_DRAW_BINK_MOVIE(sGGSMData.sBinkMovie)
GGSM_FADE_SCREEN_OUT_INSTANT()
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLEANUP)
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLEANUP
IF GGSM_IS_SCREEN_FADED_OUT()
GGSM_RELEASE_BINK_MOVIE(sGGSMData.sBinkMovie)
GGSM_SET_CLIENT_STATE(GGSM_STATE_TITLE_SCREEN)
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC GGSM_PROCESS_CLIENT_STATE_TITLE_SCREEN()
SWITCH (sGGSMData.eSubState)
CASE GGSM_SUBSTATE_INIT
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_FRONTEND)
EXIT
ENDIF
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_BG)
EXIT
ENDIF
GGSM_FADE_SCREEN_IN()
GGSM_CAMERA_RESET(sGGSMData.sCamera)
GGSM_BGSCROLLER_RESET(sGGSMData.sBGScroller, 0)
GGSM_START_AUDIO_SCENE("DLC_CH_AM_SM_IN_MENUS_SCENE")
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_ACTIVE)
GGSM_TRIGGER_MUSIC_EVENT("ARCADE_SM_THEME_START")
BREAK
CASE GGSM_SUBSTATE_ACTIVE
GGSM_DRAW_CLIENT_STATE_TITLE_SCREEN()
sGGSMData.bHardMode = IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_LT) AND IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RT) AND IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_LB) AND IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RB) AND IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RLEFT)
sGGSMData.fScrollTimePerFrame = GGSM_SCROLL_TIME_PER_FRAME
IF (sGGSMData.bHardMode)
sGGSMData.fScrollTimePerFrame = GGSM_SCROLL_TIME_PER_FRAME / 2.0
ENDIF
IF GGSM_IS_SCREEN_FADED_IN()
IF NOT ARCADE_GAMES_HELP_TEXT_IS_THIS_BEING_DISPLAYED(ARCADE_GAMES_HELP_TEXT_ENUM_GGSM_TITLE)
ARCADE_GAMES_HELP_TEXT_PRINT(ARCADE_GAMES_HELP_TEXT_ENUM_GGSM_TITLE, 15000)
ENDIF
ENDIF
IF GGSM_HAS_PLAYER_PRESSED_START() OR GGSM_HAS_PLAYER_PRESSED_FIRE()
GGSM_FADE_SCREEN_OUT()
GGSM_PLAY_SOUND(ARCADE_GAMES_SOUND_GGSM_PRESSED_START)
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLEANUP)
ELIF (sGGSMData.fStateTimer > 15.0)
GGSM_FADE_SCREEN_OUT()
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLEANUP_TO_LDB)
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLEANUP
GGSM_DRAW_CLIENT_STATE_TITLE_SCREEN()
IF GGSM_IS_SCREEN_FADED_OUT()
GGSM_SET_CLIENT_STATE(GGSM_STATE_STORY)
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLEANUP_TO_LDB
GGSM_DRAW_CLIENT_STATE_TITLE_SCREEN()
IF GGSM_IS_SCREEN_FADED_OUT()
GGSM_SET_CLIENT_STATE(GGSM_STATE_LEADERBOARD)
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Handles the main game state
PROC GGSM_PROCESS_CLIENT_STATE_PLAYING()
SWITCH (sGGSMData.eSubState)
CASE GGSM_SUBSTATE_INIT
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_BG)
EXIT
ENDIF
GGSM_FADE_SCREEN_IN()
ARCADE_GAMES_HELP_TEXT_CLEAR()
GGSM_STOP_AUDIO_SCENE("DLC_CH_AM_SM_IN_MENUS_SCENE")
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_ACTIVE)
BREAK
CASE GGSM_SUBSTATE_ACTIVE
GGSM_DRAW_BG()
BREAK
ENDSWITCH
ENDPROC
/// Handles the main game state
PROC GGSM_PROCESS_CLIENT_STATE_STORY()
SWITCH (sGGSMData.eSubState)
CASE GGSM_SUBSTATE_INIT
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_FRONTEND)
EXIT
ENDIF
GGSM_CAMERA_RESET(sGGSMData.sCamera)
GGSM_RESET_FOR_GAME_START()
GGSM_RESET_FOR_STAGE_START(TRUE)
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_ACTIVE)
sGGSMData.vStoryBasePos = INIT_VECTOR_2D(cfBASE_SCREEN_HALF_WIDTH, GGSM_STORY_MAX_Y_POS)
sGGSMData.fStoryScrollRate = 40.0
GGSM_FADE_SCREEN_IN()
BREAK
CASE GGSM_SUBSTATE_ACTIVE
sGGSMData.vStoryBasePos.y -= (sGGSMData.fStoryScrollRate * GET_FRAME_TIME())
GGSM_DRAW_CLIENT_STATE_STORY()
IF GGSM_HAS_PLAYER_PRESSED_START() OR GGSM_HAS_PLAYER_PRESSED_FIRE() OR (sGGSMData.vStoryBasePos.y < GGSM_STORY_MIN_Y_POS)
GGSM_FADE_SCREEN_OUT()
GGSM_PLAY_SOUND(ARCADE_GAMES_SOUND_GGSM_PRESSED_START)
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLEANUP)
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLEANUP
GGSM_DRAW_CLIENT_STATE_STORY()
IF GGSM_IS_SCREEN_FADED_OUT()
GGSM_SET_CLIENT_STATE(GGSM_STATE_STAGE_SELECT)
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Handles the main game state
PROC GGSM_PROCESS_CLIENT_STATE_STAGE_MISSION_SELECT()
SWITCH (sGGSMData.eSubState)
CASE GGSM_SUBSTATE_INIT
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_BG)
EXIT
ENDIF
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_FRONTEND)
EXIT
ENDIF
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_GAME)
EXIT
ENDIF
GGSM_FADE_SCREEN_IN()
GGSM_CAMERA_RESET(sGGSMData.sCamera)
GGSM_RESET_FOR_STAGE_START(TRUE)
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_MAP_FLY_START)
BREAK
CASE GGSM_SUBSTATE_MAP_FLY_START
IF (sGGSMData.fStateTimer > 0.5)
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_MAP_FLY)
ELIF GGSM_HAS_PLAYER_PRESSED_FIRE()
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_ACTIVE)
sGGSMData.fStateInterpolateValue = 1.0
ELIF GGSM_HAS_PLAYER_PRESSED_START()
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_MAP_DONE)
sGGSMData.fStateInterpolateValue = 1.0
ENDIF
GGSM_DRAW_CLIENT_STATE_STAGE_MISSION_SELECT()
BREAK
CASE GGSM_SUBSTATE_MAP_FLY
sGGSMData.fStateInterpolateValue += GET_FRAME_TIME()
IF (sGGSMData.fStateInterpolateValue >= 1.0) OR GGSM_HAS_PLAYER_PRESSED_FIRE()
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_ACTIVE)
sGGSMData.fStateInterpolateValue = 1.0
ELIF GGSM_HAS_PLAYER_PRESSED_START()
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_MAP_DONE)
sGGSMData.fStateInterpolateValue = 1.0
ENDIF
GGSM_DRAW_CLIENT_STATE_STAGE_MISSION_SELECT()
BREAK
CASE GGSM_SUBSTATE_ACTIVE
GGSM_DRAW_CLIENT_STATE_STAGE_MISSION_SELECT()
IF GGSM_HAS_PLAYER_PRESSED_START() OR GGSM_HAS_PLAYER_PRESSED_FIRE()
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_MAP_DONE)
sGGSMData.fStateInterpolateValue = 1.0
ENDIF
BREAK
CASE GGSM_SUBSTATE_MAP_DONE
GGSM_DRAW_CLIENT_STATE_STAGE_MISSION_SELECT()
GGSM_FADE_SCREEN_OUT()
GGSM_PLAY_SOUND(ARCADE_GAMES_SOUND_GGSM_MONKEY_VOICE_STAGE_SELECT)
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLEANUP)
sGGSMData.fStateInterpolateValue = 1.0
BREAK
CASE GGSM_SUBSTATE_CLEANUP
GGSM_DRAW_CLIENT_STATE_STAGE_MISSION_SELECT()
IF GGSM_IS_SCREEN_FADED_OUT()
GGSM_SET_CLIENT_STATE(GGSM_STATE_STAGE_ACTIVE)
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Handles the main game state
PROC GGSM_PROCESS_CLIENT_STATE_STAGE_ACTIVE()
GGSM_TEXDICT stageBG
SWITCH (sGGSMData.eSubState)
CASE GGSM_SUBSTATE_INIT
GGSM_RELEASE_TEXTURE_DICT(GGSM_TEXDICT_FRONTEND)
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_GAME)
EXIT
ENDIF
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_BG)
EXIT
ENDIF
stageBG = GGSM_GET_TEXDICT_FOR_STAGE_TILES(sGGSMData.sGameStats.level)
IF (stageBG != GGSM_TEXDICT_NONE) AND NOT GGSM_LOAD_TEXTURE_DICT(stageBG)
EXIT
ENDIF
GGSM_FADE_SCREEN_IN()
ARCADE_GAMES_HELP_TEXT_CLEAR()
GGSM_PLAY_AVATAR_PLAY_RANDOM_IDLE_ANIM()
GGSM_START_AUDIO_SCENE("DLC_CH_AM_SM_IN_GAMEPLAY_SCENE")
GGSM_STOP_AUDIO_SCENE("DLC_CH_AM_SM_IN_MENUS_SCENE")
GGSM_RESET_FOR_STAGE_START(FALSE)
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_ACTIVE)
GGSM_TRIGGER_MUSIC_EVENT_FOR_STAGE(sGGSMData.sGameStats.level)
BREAK
CASE GGSM_SUBSTATE_ACTIVE
GGSM_UPDATE_MAIN_GAME()
GGSM_DRAW_MAIN_GAME()
IF NOT IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.eStageFlags, GGSM_STAGE_BIT_EXPLOSIONS_ACTIVE)
IF (sGGSMData.iPlayerLives = 0) AND NOT GGSM_DOES_PLAYER_SHIP_EXIST()
sGGSMData.fPlayerDeadTimer += GET_FRAME_TIME()
IF (sGGSMData.fPlayerDeadTimer >= 1.5)
GGSM_FADE_SCREEN_OUT()
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLEANUP)
ENDIF
ELSE
sGGSMData.fPlayerDeadTimer = 0.0
ENDIF
ENDIF
IF GGSM_IS_STAGE_READY_TO_END()
GGSM_SET_CLIENT_STATE(GGSM_STATE_STAGE_CLEAR)
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLEANUP
GGSM_DRAW_MAIN_GAME()
IF GGSM_IS_SCREEN_FADED_OUT()
GGSM_SET_CLIENT_STATE(GGSM_STATE_GAME_OVER)
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC GGSM_PROCESS_CLIENT_STATE_STAGE_CLEAR()
FLOAT pc
FLOAT fShipY = 690.0
GGSM_SET_PLAYER_INVUNERABLE()
GGSM_UPDATE_MAIN_GAME()
GGSM_DRAW_GAME_STATE_STAGE_CLEAR()
SWITCH (sGGSMData.eSubState)
CASE GGSM_SUBSTATE_INIT
IF NOT IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.eStageFlags, GGSM_STAGE_BIT_EXPLOSIONS_ACTIVE)
GGSM_RESET_PROJECTILE_ARRAY(sGGSMData.sProjectiles)
CLEAR_BITMASK_ENUM_AS_ENUM(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].eFlags, GGSM_ENTITY_BIT_WPN_ACTIVE)
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.eStageFlags, GGSM_STAGE_BIT_DISABLE_WEAPONS)
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.eStageFlags, GGSM_STAGE_BIT_BRING_CAMERA_TO_STOP)
IF (sGGSMData.sGameStats.level = 1)
//GGSM_DIALOG_CONTROLLER_START_DIALOG(sGGSMData.sDialogController, GGSM_DIALOG_ASTEROID_LEAVE)
ENDIF
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLR_DIALOG)
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLR_DIALOG
IF NOT GGSM_IS_DIALOG_ACTIVE()
GGSM_ENTITY_SET_MOVEMENT_TO_VECTOR(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex], INIT_VECTOR_2D(cfBASE_SCREEN_HALF_WIDTH, fShipY))
CLEAR_BITMASK_ENUM_AS_ENUM(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].eFlags, GGSM_ENTITY_BIT_WPN_ACTIVE)
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.eStageFlags, GGSM_STAGE_BIT_DISABLE_WEAPONS)
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.eStageFlags, GGSM_STAGE_BIT_BRING_CAMERA_TO_STOP)
sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].fSpeed /= 2.0
sGGSMData.iSectorBonus = (sGGSMData.sGameStats.level) * GGSM_SECTOR_CLEAR_BONUS
pc = (TO_FLOAT(sGGSMData.iEnemiesDestroyed) / TO_FLOAT(sGGSMData.iEnemiesCreated)) * 100.0
IF (pc >= 100.0)
pc = 100.0
ENDIF
sGGSMData.iTakedownBonus = CEIL(pc) * (GGSM_TAKEDOWN_BONUS / 100)
sGGSMData.iTakedownBonus -= (sGGSMData.iTakedownBonus % 100)
IF GGSM_IS_LAST_STAGE()
sGGSMData.iAllClearBonus = (GGSM_POINTS_PER_LIFE_ALL_CLEAR * sGGSMData.iPlayerLives)
IF (sGGSMData.bHardMode)
sGGSMData.iAllClearBonus += sGGSMData.sGameStats.score
ENDIF
ELSE
sGGSMData.iAllClearBonus = 0
ENDIF
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLR_STAGE_CLEAR)
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLR_STAGE_CLEAR
// handle movement anim
IF (sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].sWorld.vPosition.y > fShipY)
GGSM_ENTITY_SET_ANIM_FRAME(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex], 1)
ELIF (sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].sWorld.vPosition.y < fShipY)
GGSM_ENTITY_SET_ANIM_FRAME(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex], 2)
ELSE
GGSM_ENTITY_SET_ANIM_FRAME(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex], 0)
ENDIF
IF IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].eMoveFlags, GGSM_MOVE_BIT_COMPLETE)
GGSM_FAKE_FADE_SCREEN_OUT(1.0)
GGSM_TRIGGER_MUSIC_EVENT("ARCADE_SM_THEME_START")
GGSM_ENTITY_SET_MOVEMENT_TYPE(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex], GGSM_MOVEMENT_NONE)
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLR_STAGE_BONUS)
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLR_STAGE_BONUS
IF GGSM_IS_SCREEN_FAKE_FADED_OUT()
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLR_SECTOR_BONUS)
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLR_SECTOR_BONUS
IF (sGGSMData.iSectorBonus <= 0)
sGGSMData.iSectorBonus = 0
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLR_TAKEDOWN_BONUS)
ELSE
ARCADE_GAMES_SOUND_PLAY_LOOP(ARCADE_GAMES_SOUND_GGSM_SCORE_COUNT_LOOP)
sGGSMData.iSectorBonus -= GGSM_BONUS_COUNT_RATE
GGSM_INCREASE_PLAYER_SCORE(GGSM_BONUS_COUNT_RATE, GGSM_IS_LAST_STAGE())
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLR_TAKEDOWN_BONUS
IF (sGGSMData.iTakedownBonus <= 0)
sGGSMData.iTakedownBonus = 0
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLR_NO_DMG_BONUS)
ELSE
ARCADE_GAMES_SOUND_PLAY_LOOP(ARCADE_GAMES_SOUND_GGSM_SCORE_COUNT_LOOP)
sGGSMData.iTakedownBonus -= GGSM_BONUS_COUNT_RATE
GGSM_INCREASE_PLAYER_SCORE(GGSM_BONUS_COUNT_RATE, GGSM_IS_LAST_STAGE())
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLR_NO_DMG_BONUS
IF (sGGSMData.iNoDamageBonus <= 0)
sGGSMData.iNoDamageBonus = 0
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLR_NO_MISS_BONUS)
ELSE
ARCADE_GAMES_SOUND_PLAY_LOOP(ARCADE_GAMES_SOUND_GGSM_SCORE_COUNT_LOOP)
sGGSMData.iNoDamageBonus -= GGSM_BONUS_COUNT_RATE
GGSM_INCREASE_PLAYER_SCORE(GGSM_BONUS_COUNT_RATE, GGSM_IS_LAST_STAGE())
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLR_NO_MISS_BONUS
IF (sGGSMData.iNoMissBonus <= 0)
sGGSMData.iNoMissBonus = 0
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLR_ALL_CLEAR_BONUS)
ELSE
ARCADE_GAMES_SOUND_PLAY_LOOP(ARCADE_GAMES_SOUND_GGSM_SCORE_COUNT_LOOP)
sGGSMData.iNoMissBonus -= GGSM_BONUS_COUNT_RATE
GGSM_INCREASE_PLAYER_SCORE(GGSM_BONUS_COUNT_RATE, GGSM_IS_LAST_STAGE())
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLR_ALL_CLEAR_BONUS
IF (sGGSMData.iAllClearBonus <= 0)
sGGSMData.iAllClearBonus = 0
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLR_FLY_OFF)
ELSE
ARCADE_GAMES_SOUND_PLAY_LOOP(ARCADE_GAMES_SOUND_GGSM_SCORE_COUNT_LOOP)
sGGSMData.iAllClearBonus -= GGSM_BONUS_COUNT_RATE
GGSM_INCREASE_PLAYER_SCORE(GGSM_BONUS_COUNT_RATE, GGSM_IS_LAST_STAGE())
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLR_FLY_OFF
ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_GGSM_SCORE_COUNT_LOOP)
ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND_GGSM_SCORE_COUNT_FINAL)
sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].fSpeed *= 2.0
GGSM_ENTITY_SET_MOVEMENT_TO_VECTOR(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex], INIT_VECTOR_2D(1800.0, fShipY))
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLR_FLY_OFF_DONE)
BREAK
CASE GGSM_SUBSTATE_CLR_FLY_OFF_DONE
IF IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].eMoveFlags, GGSM_MOVE_BIT_COMPLETE)
GGSM_FADE_SCREEN_OUT()
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLEANUP)
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLEANUP
IF GGSM_IS_SCREEN_FADED_OUT()
IF NOT IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.eStageFlags, GGSM_STAGE_BIT_PLAYER_DAMAGED) AND NOT IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.eStageFlags, GGSM_STAGE_BIT_PLAYER_DIED)
GGSM_SET_CHALLENGE_COMPLETED(GGSM_CHALLENGE_BIT_APE_ESCAPE)
ENDIF
GGSM_CLEAR_FAKE_FADE()
sGGSMData.sGameStats.level ++
IF (sGGSMData.sGameStats.level > GGSM_SECTOR_MAX)
GGSM_SET_CLIENT_STATE(GGSM_STATE_STAGE_CONGRATS)
ELSE
GGSM_SET_CLIENT_STATE(GGSM_STATE_STAGE_SELECT)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC GGSM_PROCESS_CLIENT_STATE_STAGE_CONGRATS()
SWITCH (sGGSMData.eSubState)
CASE GGSM_SUBSTATE_INIT
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_BG)
EXIT
ENDIF
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_FRONTEND)
EXIT
ENDIF
IF (sGGSMData.bPowerUpCollected = FALSE )
GGSM_SET_CHALLENGE_COMPLETED(GGSM_CHALLENGE_BIT_MONKEY_MIND)
ENDIF
sGGSMData.sGameStats.level = 0
GGSM_SEND_PLAYSTATS()
GGSM_RESET_FOR_STAGE_START(FALSE)
GGSM_FADE_SCREEN_IN()
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_ACTIVE)
//GGSM_UNLOCK_PRIZE(GGSM_UNLOCK_TSHIRTS_GGSM_CLOCKEDIT)
BREAK
CASE GGSM_SUBSTATE_ACTIVE
GGSM_DRAW_CLIENT_STATE_STAGE_CONGRATS()
IF GGSM_HAS_PLAYER_PRESSED_START() OR GGSM_HAS_PLAYER_PRESSED_FIRE() OR (sGGSMData.fStateTimer > 15.0)
GGSM_FADE_SCREEN_OUT()
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLEANUP)
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLEANUP
GGSM_DRAW_CLIENT_STATE_STAGE_CONGRATS()
IF GGSM_IS_SCREEN_FADED_OUT()
GGSM_SET_CLIENT_STATE(GGSM_STATE_LEADERBOARD_ENTRY)
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Handles the main game state
PROC GGSM_PROCESS_CLIENT_STATE_GAME_OVER()
SWITCH (sGGSMData.eSubState)
CASE GGSM_SUBSTATE_INIT
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_PORTRAITS)
EXIT
ENDIF
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_DIALOG)
EXIT
ENDIF
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_FRONTEND)
EXIT
ENDIF
GGSM_SEND_PLAYSTATS()
GGSM_FADE_SCREEN_IN()
ARCADE_GAMES_HELP_TEXT_CLEAR()
GGSM_RESET_FOR_STAGE_START()
GGSM_START_AUDIO_SCENE("DLC_CH_AM_SM_IN_MENUS_SCENE")
GGSM_STOP_AUDIO_SCENE("DLC_CH_AM_SM_IN_GAMEPLAY_SCENE")
GGSM_DIALOG_CONTROLLER_START_DIALOG(sGGSMData.sDialogController, GGSM_DIALOG_GAME_OVER)
GGSM_TRIGGER_MUSIC_EVENT("ARCADE_SM_STOP")
GGSM_PLAY_SOUND(ARCADE_GAMES_SOUND_GGSM_GAME_OVER)
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_ACTIVE)
BREAK
CASE GGSM_SUBSTATE_ACTIVE
ARCADE_DRAW_PIXELSPACE_SPRITE(GGSM_GET_TEXTURE_DICT(GGSM_TEXDICT_FRONTEND), "GAME_OVER_SCREEN", INIT_VECTOR_2D(cfBASE_SCREEN_HALF_WIDTH, cfBASE_SCREEN_HALF_HEIGHT), INIT_VECTOR_2D(1364.0, 972.0), 0, sGGSMData.rgbaWhite)
GGSM_DRAW_GAME_OVER_TEXT()
IF NOT GGSM_IS_DIALOG_ACTIVE()
GGSM_FADE_SCREEN_OUT()
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLEANUP)
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLEANUP
ARCADE_DRAW_PIXELSPACE_SPRITE(GGSM_GET_TEXTURE_DICT(GGSM_TEXDICT_FRONTEND), "GAME_OVER_SCREEN", INIT_VECTOR_2D(cfBASE_SCREEN_HALF_WIDTH, cfBASE_SCREEN_HALF_HEIGHT), INIT_VECTOR_2D(1364.0, 972.0), 0, sGGSMData.rgbaWhite)
GGSM_DRAW_GAME_OVER_TEXT()
IF GGSM_IS_SCREEN_FADED_OUT()
GGSM_SET_CLIENT_STATE(GGSM_STATE_LEADERBOARD_ENTRY)
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Handles the leaderboard
PROC GGSM_PROCESS_CLIENT_STATE_LEADERBOARD()
SWITCH (sGGSMData.eSubState)
CASE GGSM_SUBSTATE_INIT
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_FRONTEND)
EXIT
ENDIF
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_BG)
EXIT
ENDIF
GGSM_FADE_SCREEN_IN()
ARCADE_GAMES_HELP_TEXT_CLEAR()
GGSM_STOP_AUDIO_SCENE("DLC_CH_AM_SM_IN_GAMEPLAY_SCENE")
GGSM_START_AUDIO_SCENE("DLC_CH_AM_SM_IN_MENUS_SCENE")
GGSM_CAMERA_RESET(sGGSMData.sCamera)
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_ACTIVE)
BREAK
CASE GGSM_SUBSTATE_ACTIVE
GGSM_DRAW_BG()
ARCADE_GAMES_LEADERBOARD_DRAW()
IF (sGGSMData.fStateTimer > 10.0) OR GGSM_HAS_PLAYER_PRESSED_START() OR GGSM_HAS_PLAYER_PRESSED_CANCEL()
GGSM_FADE_SCREEN_OUT()
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLEANUP)
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLEANUP
IF GGSM_IS_SCREEN_FADED_OUT()
GGSM_SET_CLIENT_STATE(GGSM_STATE_TITLE_SCREEN)
ELSE
GGSM_DRAW_BG()
ARCADE_GAMES_LEADERBOARD_DRAW()
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Handles the leaderboard
PROC GGSM_PROCESS_CLIENT_STATE_LEADERBOARD_ENTRY()
SWITCH (sGGSMData.eSubState)
CASE GGSM_SUBSTATE_INIT
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_FRONTEND)
EXIT
ENDIF
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_BG)
EXIT
ENDIF
GGSM_FADE_FROM_WHITE()
GGSM_FADE_SCREEN_IN()
ARCADE_GAMES_HELP_TEXT_CLEAR()
GGSM_STOP_AUDIO_SCENE("DLC_CH_AM_SM_IN_GAMEPLAY_SCENE")
GGSM_START_AUDIO_SCENE("DLC_CH_AM_SM_IN_MENUS_SCENE")
GGSM_CAMERA_RESET(sGGSMData.sCamera)
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_ACTIVE)
GGSM_TRIGGER_MUSIC_EVENT("ARCADE_SM_THEME_START")
BREAK
CASE GGSM_SUBSTATE_ACTIVE
GGSM_DRAW_BG()
ARCADE_GAMES_LEADERBOARD_PROCESS_ENTRY(sGGSMData.sGameStats.score)
ARCADE_GAMES_LEADERBOARD_DRAW()
IF (sAGLeaderboardData.bEditing = FALSE) AND (GGSM_HAS_PLAYER_PRESSED_START() OR GGSM_HAS_PLAYER_PRESSED_CANCEL())
GGSM_FADE_SCREEN_OUT()
GGSM_SET_CLIENT_SUBSTATE(GGSM_SUBSTATE_CLEANUP)
ENDIF
BREAK
CASE GGSM_SUBSTATE_CLEANUP
IF GGSM_IS_SCREEN_FADED_OUT()
GGSM_SET_CLIENT_STATE(GGSM_STATE_TITLE_SCREEN)
ELSE
GGSM_DRAW_BG()
ARCADE_GAMES_LEADERBOARD_DRAW()
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// The actual state machine
PROC GGSM_PROCESS_CLIENT_STATE_MACHINE()
IF (sGGSMData.eState > GGSM_STATE_REQUESTING_ASSETS)
GGSM_DRAW_BLACK_BG()
GGSM_CAMERA_UPDATE(sGGSMData.sCamera)
GGSM_BGSCROLLER_UPDATE(sGGSMData.sBGScroller)
ENDIF
SWITCH sGGSMData.eState
CASE GGSM_STATE_INIT
GGSM_PROCESS_CLIENT_STATE_INIT()
BREAK
CASE GGSM_STATE_REQUESTING_ASSETS
GGSM_PROCESS_CLIENT_STATE_REQUESTING_ASSETS()
BREAK
CASE GGSM_STATE_FIB_WARNING
GGSM_PROCESS_CLIENT_STATE_FIB_WARNING()
BREAK
CASE GGSM_STATE_PSA_SCREEN
GGSM_PROCESS_CLIENT_STATE_PSA_SCREEN()
BREAK
CASE GGSM_STATE_DEVELOPER_LOGO
GGSM_PROCESS_CLIENT_STATE_DEVELOPER_LOGO()
BREAK
CASE GGSM_STATE_TITLE_SCREEN
GGSM_PROCESS_CLIENT_STATE_TITLE_SCREEN()
BREAK
CASE GGSM_STATE_PLAYING
GGSM_PROCESS_CLIENT_STATE_PLAYING()
BREAK
CASE GGSM_STATE_STORY
GGSM_PROCESS_CLIENT_STATE_STORY()
BREAK
CASE GGSM_STATE_STAGE_SELECT
GGSM_PROCESS_CLIENT_STATE_STAGE_MISSION_SELECT()
BREAK
CASE GGSM_STATE_STAGE_ACTIVE
GGSM_PROCESS_CLIENT_STATE_STAGE_ACTIVE()
BREAK
CASE GGSM_STATE_STAGE_CLEAR
GGSM_PROCESS_CLIENT_STATE_STAGE_CLEAR()
BREAK
CASE GGSM_STATE_STAGE_CONGRATS
GGSM_PROCESS_CLIENT_STATE_STAGE_CONGRATS()
BREAK
CASE GGSM_STATE_GAME_OVER
GGSM_PROCESS_CLIENT_STATE_GAME_OVER()
BREAK
CASE GGSM_STATE_LEADERBOARD
GGSM_PROCESS_CLIENT_STATE_LEADERBOARD()
BREAK
CASE GGSM_STATE_LEADERBOARD_ENTRY
GGSM_PROCESS_CLIENT_STATE_LEADERBOARD_ENTRY()
BREAK
CASE GGSM_STATE_CLEANUP
GGSM_CLEANUP_AND_EXIT_CLIENT()
BREAK
ENDSWITCH
IF GGSM_IS_GAME_PLAYING()
GGSM_TILEMAP_SET_RENDERABLE_TILE_BOUNDS(sGGSMData.sTileMap, sGGSMData.sCamera)
GGSM_DIALOG_CONTROLLER_UPDATE(sGGSMData.sDialogController)
IF IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.eStageFlags, GGSM_STAGE_BIT_FORCE_Z_SORT)
GGSM_QUICK_SORT_ZDEPTH_ARRAY(sGGSMData.sZSortData, 0, GGSM_MAX_ENTITIES - 1)
CLEAR_BITMASK_ENUM_AS_ENUM(sGGSMData.eStageFlags, GGSM_STAGE_BIT_FORCE_Z_SORT)
ENDIF
ENDIF
IF (sGGSMData.fFadeTime != 0.0)
sGGSMData.fFadeAlpha = CLAMP(sGGSMData.fFadeAlpha + (GET_FRAME_TIME() / sGGSMData.fFadeTime), 0.0, 1.0)
ENDIF
IF (sGGSMData.fFakeFadeTime != 0.0)
sGGSMData.fFakeFadeAlpha = CLAMP(sGGSMData.fFakeFadeAlpha + (GET_FRAME_TIME() / sGGSMData.fFakeFadeTime), 0.0, 1.0)
ENDIF
IF (sGGSMData.fWhiteOutFadeTime != 0.0)
sGGSMData.fWhiteOutAlpha = CLAMP(sGGSMData.fWhiteOutAlpha + (GET_FRAME_TIME() / sGGSMData.fWhiteOutFadeTime), 0.0, 1.0)
ENDIF
IF (sGGSMData.eState > GGSM_STATE_REQUESTING_ASSETS)
GGSM_DRAW_FACADE()
ENDIF
IF IS_PC_VERSION() AND IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
sGGSMData.sQuitTimer.action = INPUT_FRONTEND_DELETE
ELSE
sGGSMData.sQuitTimer.action = INPUT_FRONTEND_CANCEL
ENDIF
INT iQuitTime = 1000
IF IS_CONTROL_PRESSED(sGGSMData.sQuitTimer.control, sGGSMData.sQuitTimer.action)
OR (IS_DISABLED_CONTROL_PRESSED(sGGSMData.sQuitTimer.control, sGGSMData.sQuitTimer.action))
IF IS_PC_VERSION() AND IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
DRAW_GENERIC_METER(ABSI(GET_TIME_DIFFERENCE(GET_NETWORK_TIME(), sGGSMData.sQuitTimer.sTimer.Timer)), iQuitTime, "DEG_GAME_QUIT")
ELSE
DRAW_GENERIC_METER(ABSI(GET_TIME_DIFFERENCE(GET_NETWORK_TIME(), sGGSMData.sQuitTimer.sTimer.Timer)), iQuitTime, "DEG_GAME_QUIT")
ENDIF
ELSE
IF IS_PC_VERSION() AND IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
DRAW_GENERIC_METER(0, iQuitTime, "DEG_GAME_QUIT")
ELSE
DRAW_GENERIC_METER(0, iQuitTime, "DEG_GAME_QUIT")
ENDIF
ENDIF
IF IS_CONTROL_HELD(sGGSMData.sQuitTimer, DEFAULT, iQuitTime)
OR SHOULD_KICK_PLAYER_FROM_ANY_ARCADE_GAME()
IF GGSM_IS_GAME_ACTIVELY_PLAYING()
GGSM_SEND_PLAYSTATS()
ENDIF
GGSM_SET_CLIENT_STATE(GGSM_STATE_CLEANUP)
ENDIF
ENDPROC
//-------------------------------------------------
// DEBUG FUNCTIONS
//-------------------------------------------------
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Sets up the parent widget group
/// PARAMS:
/// parentWidgetGroup - group
PROC GGSM_DEBUG_SET_PARENT_WIDGET_GROUP(WIDGET_GROUP_ID parentWidgetGroup)
sGGSMData.widgetGroupExample = parentWidgetGroup
ENDPROC
/// PURPOSE:
/// Entity Type Selector
/// PARAMS:
/// index - index for editing the type
PROC GGSM_BOSS_STATE_SELECTOR(INT &index, STRING str = NULL)
GGSM_BOSS_STATE eBet
START_NEW_WIDGET_COMBO()
REPEAT NUM_GGSM_BOSS_STATE eBet
ADD_TO_WIDGET_COMBO(GGSM_BOSS_STATE_TO_STRING(eBet))
ENDREPEAT
IF (NOT IS_STRING_NULL_OR_EMPTY(str))
STOP_WIDGET_COMBO(str, index)
ELSE
STOP_WIDGET_COMBO("Boss State", index)
ENDIF
ENDPROC
/// PURPOSE:
/// Client Type Selector
/// PARAMS:
/// index - index for editing the type
PROC GGSM_STATE_SELECTOR(INT &index, STRING str = NULL)
GGSM_STATE eBet
START_NEW_WIDGET_COMBO()
REPEAT NUM_GGSM_STATE eBet
ADD_TO_WIDGET_COMBO(GGSM_STATE_TO_STRING(eBet))
ENDREPEAT
IF (NOT IS_STRING_NULL_OR_EMPTY(str))
STOP_WIDGET_COMBO(str, index)
ELSE
STOP_WIDGET_COMBO("Client State", index)
ENDIF
ENDPROC
/// PURPOSE:
/// Client Type Selector
/// PARAMS:
/// index - index for editing the type
PROC GGSM_SUBSTATE_SELECTOR(INT &index, STRING str = NULL)
GGSM_SUBSTATE eBet
START_NEW_WIDGET_COMBO()
REPEAT NUM_GGSM_SUBSTATE eBet
ADD_TO_WIDGET_COMBO(GGSM_SUBSTATE_TO_STRING(eBet))
ENDREPEAT
IF (NOT IS_STRING_NULL_OR_EMPTY(str))
STOP_WIDGET_COMBO(str, index)
ELSE
STOP_WIDGET_COMBO("Client Substate", index)
ENDIF
ENDPROC
/// PURPOSE:
/// Entity Type Selector
/// PARAMS:
/// index - index for editing the type
PROC GGSM_ENTITY_TYPE_SELECTOR(INT &index)
GGSM_ENTITY_TYPE eBet
START_NEW_WIDGET_COMBO()
REPEAT NUM_GGSM_ENTITY_TYPE eBet
ADD_TO_WIDGET_COMBO(GGSM_ENTITY_TYPE_TO_STRING(eBet))
ENDREPEAT
STOP_WIDGET_COMBO("Entity Type", index)
ENDPROC
/// PURPOSE:
/// Tile collision Type Widget
/// PARAMS:
/// data - data to effect
PROC GGSM_TILE_COLLISION_TYPE_SELECTOR(INT &index)
GGSM_TILE_COLLISION_TYPE eBet
START_NEW_WIDGET_COMBO()
REPEAT NUM_GGSM_TILE_COLLISION_TYPE eBet
ADD_TO_WIDGET_COMBO(GGSM_TILE_COLLISION_TYPE_TO_STRING(eBet))
ENDREPEAT
STOP_WIDGET_COMBO("Tile Collision Type", index)
ENDPROC
/// PURPOSE:
/// Entity Type Selector
/// PARAMS:
/// index - index for editing the type
PROC GGSM_UNLOCK_SELECTOR(INT &index)
GGSM_UNLOCK_TYPE eBet
START_NEW_WIDGET_COMBO()
REPEAT NUM_GGSM_UNLOCK_TYPE eBet
ADD_TO_WIDGET_COMBO(GGSM_UNLOCK_TYPE_TO_STRING(eBet))
ENDREPEAT
STOP_WIDGET_COMBO("Unlock Type", index)
ENDPROC
/// PURPOSE:
/// Creates a read only 2D vector widget
/// PARAMS:
/// str - widget name
/// vec - vector
PROC GGSM_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 GGSM_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 GGSM_ADD_WIDGET_TRANSFORM_SLIDER(STRING str, GGSM_TRANSFORM &t)
START_WIDGET_GROUP(str)
GGSM_ADD_WIDGET_VECTOR_2D_SLIDER("Position", t.vPosition, -cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_WIDTH, 10)
ADD_WIDGET_FLOAT_SLIDER("Rotation", t.fRotation, -720.0, 720.0, 1)
GGSM_ADD_WIDGET_VECTOR_2D_SLIDER("Scale", t.vScale, -10.0, 10.0, 0.25)
STOP_WIDGET_GROUP()
ENDPROC
PROC GGSM_ADD_WIDGET_TRANSFORM_READ_ONLY(STRING str, GGSM_TRANSFORM &t)
START_WIDGET_GROUP(str)
GGSM_ADD_WIDGET_VECTOR_2D_READONLY("Position", t.vPosition)
ADD_WIDGET_FLOAT_READ_ONLY("Rotation", t.fRotation)
GGSM_ADD_WIDGET_VECTOR_2D_READONLY("Scale", t.vScale)
STOP_WIDGET_GROUP()
ENDPROC
PROC GGSM_RGBA_COLOUR_STRUCT_WIDGET(RGBA_COLOUR_STRUCT &col, STRING str)
START_WIDGET_GROUP(str)
ADD_WIDGET_INT_SLIDER("Red", col.iR, 0, 255, 1)
ADD_WIDGET_INT_SLIDER("Green", col.iG, 0, 255, 1)
ADD_WIDGET_INT_SLIDER("Blue", col.iB, 0, 255, 1)
ADD_WIDGET_INT_SLIDER("Alpha", col.iA, 0, 255, 1)
STOP_WIDGET_GROUP()
ENDPROC
PROC GGSM_BOSS_CONTROLLER_CREATE_WIDGET(GGSM_BOSS_CONTROLLER &boss, STRING str)
INT i
TEXT_LABEL_23 txt
START_WIDGET_GROUP(str)
ADD_WIDGET_BOOL("Change State", boss.bDebugSetState)
GGSM_BOSS_STATE_SELECTOR(boss.iDebugSetState, "Change State")
GGSM_BOSS_STATE_SELECTOR(boss.iCurrentState)
ADD_WIDGET_FLOAT_READ_ONLY("State Timer", boss.fStateTimer)
ADD_WIDGET_INT_READ_ONLY("HP", boss.iTotalHP)
ADD_WIDGET_INT_READ_ONLY("Max HP", boss.iMaxTotalHP)
ADD_WIDGET_INT_READ_ONLY("Group", boss.iGroupID)
ADD_WIDGET_INT_READ_ONLY("Sub Group", boss.iSubGroupID)
ADD_WIDGET_INT_READ_ONLY("Boss Pattern State", boss.iBossPatternState)
ADD_BIT_FIELD_WIDGET("Summed HP Contributors", boss.iSummedMaxHPBitSet)
ADD_BIT_FIELD_WIDGET("Used Pattern Bit Set", boss.iPatternUsedBitSet)
ADD_WIDGET_INT_READ_ONLY("Boss Max Patterns", boss.iMaxPatterns)
ADD_WIDGET_INT_READ_ONLY("Internal Counter", boss.iInternalCounter)
START_WIDGET_GROUP("Entities")
REPEAT GGSM_MAX_BOSS_PARTS i
txt = "Entity "
txt += i
ADD_WIDGET_INT_READ_ONLY(txt, boss.iEntityIndex[i])
ENDREPEAT
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ENDPROC
PROC GGSM_CAMERA_CREATE_DEBUG_WIDGET(GGSM_CAMERA &sCamera)
START_WIDGET_GROUP("Viewport Camera")
GGSM_ADD_WIDGET_VECTOR_2D_READONLY("Viewport Offset", sCamera.vWorldViewportOffset)
GGSM_ADD_WIDGET_VECTOR_2D_SLIDER("World Pos", sCamera.vWorldPosition, -10000000.0, 10000000.0, 4)
GGSM_ADD_WIDGET_VECTOR_2D_READONLY("Last World Pos", sCamera.vLastWorldPosition)
GGSM_ADD_WIDGET_VECTOR_2D_SLIDER("Scroll Direction", sCamera.vScrollDirection, -1.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("Tile Scroll Speed", sCamera.fTileScrollSpeed, 0, 1000000, 1)
ADD_WIDGET_FLOAT_READ_ONLY("Dist Travelled", sCamera.fDistTravelled)
ADD_WIDGET_BOOL("Debug Move Camera", sCamera.bDebugMoveCamera)
ADD_WIDGET_FLOAT_SLIDER("Move Camera Dist", sCamera.fDebugMoveCameraDist, 0, 1000000, 1)
ADD_WIDGET_FLOAT_READ_ONLY("Spd", sCamera.fSpd)
STOP_WIDGET_GROUP()
ENDPROC
/// PURPOSE:
/// Collsion Data Widget
/// PARAMS:
/// data - data to effect
PROC GGSM_COLLISION_DATA_WIDGET(GGSM_COLLISION_DATA &data)
START_WIDGET_GROUP(GGSM_COLLISION_SHAPE_TO_STRING(data.eType))
GGSM_ADD_WIDGET_VECTOR_2D_SLIDER("Vector 0", data.vCollisionVectors[0], -cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_WIDTH, 1)
GGSM_ADD_WIDGET_VECTOR_2D_SLIDER("Vector 1", data.vCollisionVectors[1], -cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_WIDTH, 1)
ADD_WIDGET_FLOAT_SLIDER("Col Radius", data.fColRadius, -cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_WIDTH, 1)
STOP_WIDGET_GROUP()
ENDPROC
PROC GGSM_ENTITY_WIDGET(GGSM_ENTITY &data, STRING str)
INT i
TEXT_LABEL_15 txt
START_WIDGET_GROUP(str)
ADD_WIDGET_INT_READ_ONLY("Parent Index", data.iEntityParentIndex)
ADD_WIDGET_INT_READ_ONLY("Group ID", data.iGroupID)
ADD_WIDGET_INT_READ_ONLY("HP", data.iHP)
ADD_WIDGET_INT_READ_ONLY("Inv Frame Time", data.iInvTimeMS)
ADD_WIDGET_FLOAT_READ_ONLY("Anim Frame", data.fAnimFrame)
ADD_WIDGET_FLOAT_READ_ONLY("Timer", data.fTimer)
ADD_WIDGET_FLOAT_READ_ONLY("Explode Timer", data.fExplodeTimer)
GGSM_ADD_WIDGET_TRANSFORM_SLIDER("Local", data.sLocal)
GGSM_ADD_WIDGET_TRANSFORM_READ_ONLY("World", data.sWorld)
START_WIDGET_GROUP("Movement")
GGSM_ADD_WIDGET_VECTOR_2D_READONLY("Local Direction", data.vLocalDirection)
ADD_WIDGET_FLOAT_SLIDER("Speed", data.fSpeed, 0, 20000, 1)
START_WIDGET_GROUP("Move Params")
REPEAT COUNT_OF(data.fMoveParam) i
txt = "Param "
txt += i
ADD_WIDGET_FLOAT_READ_ONLY(txt, data.fMoveParam[i])
ENDREPEAT
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Weapon")
ADD_WIDGET_INT_READ_ONLY("iWeaponBurstCounter", data.iWeaponBurstCounter)
ADD_WIDGET_INT_READ_ONLY("iWeaponShotCounter", data.iWeaponShotCounter)
ADD_WIDGET_FLOAT_READ_ONLY("Timer", data.fWeaponTimer)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ENDPROC
PROC GGSM_ENTITY_DATA_WIDGET(GGSM_ENTITY_DATA &data, GGSM_ENTITY_TYPE eType)
START_WIDGET_GROUP(GGSM_ENTITY_TYPE_TO_STRING(eType))
ADD_WIDGET_INT_SLIDER("HP", data.iMaxHP, 0, 1000, 1)
ADD_WIDGET_FLOAT_SLIDER("Base Speed", data.fBaseSpeed, 0, 8000, 1)
GGSM_ADD_WIDGET_TRANSFORM_SLIDER("Gun Transform", data.sGunPos)
GGSM_COLLISION_DATA_WIDGET(data.sCollisionData)
STOP_WIDGET_GROUP()
ENDPROC
PROC GGSM_PROJECTILE_WIDGET(GGSM_PROJECTILE &data, STRING str)
START_WIDGET_GROUP(str)
ADD_WIDGET_FLOAT_READ_ONLY("Timer", data.fTimer)
ADD_WIDGET_INT_READ_ONLY("Target Index", data.iTargetIndex)
GGSM_ADD_WIDGET_VECTOR_2D_READONLY("Point 0", data.sCollider.sData.vCollisionVectors[0])
GGSM_ADD_WIDGET_VECTOR_2D_READONLY("Point 1", data.sCollider.sData.vCollisionVectors[1])
ADD_WIDGET_FLOAT_SLIDER("Radius", data.sCollider.sData.fColRadius, -cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_WIDTH, 1)
ADD_WIDGET_FLOAT_SLIDER("Length", data.fLength, -cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_WIDTH, 1)
STOP_WIDGET_GROUP()
ENDPROC
#IF GGSM_DEBUG_TSHIRT_HELP
PROC GGSM_CREATE_TSHIRT_DEBUG_WIDGET()
START_WIDGET_GROUP("T-Shirt Debug")
ADD_WIDGET_BOOL("bDebugResetUnlocks", sGGSMData.bDebugResetUnlocks)
ADD_WIDGET_BOOL("bDebugShowUnlock", sGGSMData.bDebugShowUnlock)
GGSM_UNLOCK_SELECTOR(sGGSMData.iDebugUnlockSelector)
STOP_WIDGET_GROUP()
ENDPROC
PROC GGSM_UPDATE_TSHIRT_DEBUG_WIDGET()
GGSM_UNLOCK_TYPE eType
IF (sGGSMData.bDebugResetUnlocks)
SET_MP_INT_CHARACTER_STAT(MP_STAT_ARCADE_HELP_BITSET, 0)
sGGSMData.bDebugResetUnlocks = FALSE
ENDIF
IF (sGGSMData.bDebugShowUnlock)
eType = INT_TO_ENUM(GGSM_UNLOCK_TYPE, sGGSMData.iDebugUnlockSelector)
GGSM_UNLOCK_PRIZE(eType)
sGGSMData.bDebugShowUnlock = FALSE
ENDIF
ENDPROC
#ENDIF
#IF GGSM_CHALLENGE_DEBUG
PROC GGSM_CREATE_CHALLENGE_DEBUG_WIDGET()
START_WIDGET_GROUP("Challenge Debug")
ADD_WIDGET_BOOL("Reset", sGGSMData.bDebugResetChallenge)
ADD_WIDGET_BOOL("Show Awards", sGGSMData.bDebugShowAwardsOnScreen)
ADD_WIDGET_BOOL("ApeEscape", sGGSMData.bDebugChallengeApeEscape)
ADD_WIDGET_BOOL("MonkeyMind", sGGSMData.bDebugChallengeMonkeyMind)
ADD_WIDGET_BOOL("AstroChimp B", sGGSMData.bDebugChallengeAstroChimpB)
ADD_WIDGET_BOOL("AstroChimp S", sGGSMData.bDebugChallengeAstroChimpS)
ADD_WIDGET_BOOL("AstroChimp G", sGGSMData.bDebugChallengeAstroChimpG)
ADD_WIDGET_BOOL("AstroChimp P", sGGSMData.bDebugChallengeAstroChimpP)
ADD_WIDGET_BOOL("AquaApe", sGGSMData.bDebugChallengeAquaApe)
ADD_WIDGET_BOOL("Award All", sGGSMData.bDebugAwardAllChallenges)
STOP_WIDGET_GROUP()
ENDPROC
PROC GGSM_UPDATE_CHALLENGE_DEBUG_WIDGET()
IF (sGGSMData.bDebugResetChallenge)
GGSM_RESET_CHALLENGES()
sGGSMData.bDebugResetChallenge = FALSE
ENDIF
IF (sGGSMData.bDebugChallengeApeEscape)
GGSM_SET_CHALLENGE_COMPLETED(GGSM_CHALLENGE_BIT_APE_ESCAPE)
sGGSMData.bDebugChallengeApeEscape = FALSE
ENDIF
IF (sGGSMData.bDebugChallengeMonkeyMind)
GGSM_SET_CHALLENGE_COMPLETED(GGSM_CHALLENGE_BIT_MONKEY_MIND)
sGGSMData.bDebugChallengeMonkeyMind = FALSE
ENDIF
IF (sGGSMData.bDebugChallengeAstroChimpB)
GGSM_SET_CHALLENGE_COMPLETED(GGSM_CHALLENGE_BIT_ASTROCHIMP_B)
sGGSMData.bDebugChallengeAstroChimpB = FALSE
ENDIF
IF (sGGSMData.bDebugChallengeAstroChimpS)
GGSM_SET_CHALLENGE_COMPLETED(GGSM_CHALLENGE_BIT_ASTROCHIMP_S)
sGGSMData.bDebugChallengeAstroChimpS = FALSE
ENDIF
IF (sGGSMData.bDebugChallengeAstroChimpG)
GGSM_SET_CHALLENGE_COMPLETED(GGSM_CHALLENGE_BIT_ASTROCHIMP_G)
sGGSMData.bDebugChallengeAstroChimpG = FALSE
ENDIF
IF (sGGSMData.bDebugChallengeAstroChimpP)
GGSM_SET_CHALLENGE_COMPLETED(GGSM_CHALLENGE_BIT_ASTROCHIMP_P)
sGGSMData.bDebugChallengeAstroChimpP = FALSE
ENDIF
IF (sGGSMData.bDebugAwardAllChallenges)
GGSM_RESET_CHALLENGES()
GGSM_SET_CHALLENGE_COMPLETED(GGSM_CHALLENGE_BIT_APE_ESCAPE)
GGSM_SET_CHALLENGE_COMPLETED(GGSM_CHALLENGE_BIT_ASTROCHIMP_B)
GGSM_SET_CHALLENGE_COMPLETED(GGSM_CHALLENGE_BIT_ASTROCHIMP_S)
GGSM_SET_CHALLENGE_COMPLETED(GGSM_CHALLENGE_BIT_ASTROCHIMP_G)
GGSM_SET_CHALLENGE_COMPLETED(GGSM_CHALLENGE_BIT_ASTROCHIMP_P)
GGSM_SET_CHALLENGE_COMPLETED(GGSM_CHALLENGE_BIT_MONKEY_MIND)
sGGSMData.bDebugAwardAllChallenges = FALSE
ENDIF
IF (sGGSMData.bDebugShowAwardsOnScreen)
GGSM_DRAW_AWARD_DEBUG()
ENDIF
ENDPROC
#ENDIF
//-------------------------------------------------
// EDITOR CORE DEBUG FUNCTIONS
//-------------------------------------------------
FUNC BOOL GGSM_EDITOR_CORE_IS_EDITOR_ACTIVE(GGSM_EDITOR_CORE &editor)
RETURN editor.bEditorActive
ENDFUNC
FUNC BOOL GGSM_EDITOR_CORE_IS_EDITOR_LAST_ACTIVE(GGSM_EDITOR_CORE &editor)
RETURN editor.bLastEditorActive
ENDFUNC
PROC GGSM_EDITOR_CORE_FINALISE_FOR_FRAME_END(GGSM_EDITOR_CORE &editor)
editor.iLastEditDatam = editor.iCurrentEditDatam
editor.iLastEditIndex = editor.iCurrentEditIndex
editor.bLastEditorActive = editor.bEditorActive
editor.bLastPauseState = sGGSMData.bGamePaused
ENDPROC
PROC GGSM_EDITOR_CORE_SET_EDITOR_BIT(GGSM_EDITOR_CORE &editor, GGSM_EDITOR_BIT eBit)
SET_BITMASK_ENUM_AS_ENUM(editor.eFlags, eBit)
CPRINTLN(DEBUG_MINIGAME, "GGSM_EDITOR_CORE_SET_EDITOR_BIT - ", GGSM_EDITOR_BIT_TO_STRING(eBit))
ENDPROC
PROC GGSM_EDITOR_CORE_CLEAR_EDITOR_BIT(GGSM_EDITOR_CORE &editor, GGSM_EDITOR_BIT eBit)
CLEAR_BITMASK_ENUM_AS_ENUM(editor.eFlags, eBit)
CPRINTLN(DEBUG_MINIGAME, "GGSM_EDITOR_CORE_CLEAR_EDITOR_BIT - ", GGSM_EDITOR_BIT_TO_STRING(eBit))
ENDPROC
FUNC BOOL GGSM_EDITOR_CORE_EDIT_INT_PARAM(GGSM_EDITOR_CORE &editor, INT &iValue, INT max, INT iIgnoreValue = -1)
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_LEFT)
iValue --
IF (iValue < 0)
iValue = max - 1
ENDIF
IF (editor.iOption != iIgnoreValue)
CLEAR_BITMASK_ENUM_AS_ENUM(editor.eFlags, GGSM_EDITOR_BIT_SAVED)
ENDIF
RETURN TRUE
ENDIF
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT)
iValue ++
IF (iValue >= max)
iValue = 0
ENDIF
IF (editor.iOption != iIgnoreValue)
CLEAR_BITMASK_ENUM_AS_ENUM(editor.eFlags, GGSM_EDITOR_BIT_SAVED)
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL GGSM_EDITOR_CORE_EDIT_INT_MIN_MAX(GGSM_EDITOR_CORE &editor, INT &iValue, INT min, INT max, INT iIgnoreValue = -1)
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_LEFT)
iValue --
IF (iValue < min)
iValue = max - 1
ENDIF
IF (editor.iOption != iIgnoreValue)
CLEAR_BITMASK_ENUM_AS_ENUM(editor.eFlags, GGSM_EDITOR_BIT_SAVED)
ENDIF
RETURN TRUE
ENDIF
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT)
iValue ++
IF (iValue >= max)
iValue = min
ENDIF
IF (editor.iOption != iIgnoreValue)
CLEAR_BITMASK_ENUM_AS_ENUM(editor.eFlags, GGSM_EDITOR_BIT_SAVED)
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC GGSM_EDITOR_CORE_EDIT_FLOAT_MIN_MAX(GGSM_EDITOR_CORE &editor, FLOAT &iValue, FLOAT inc, FLOAT min, FLOAT max, INT iIgnoreValue = -1)
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_LEFT)
iValue -= inc
IF (iValue < min)
iValue = max
ENDIF
IF (editor.iOption != iIgnoreValue)
CLEAR_BITMASK_ENUM_AS_ENUM(editor.eFlags, GGSM_EDITOR_BIT_SAVED)
ENDIF
ENDIF
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT)
iValue += inc
IF (iValue > max)
iValue = min
ENDIF
IF (editor.iOption != iIgnoreValue)
CLEAR_BITMASK_ENUM_AS_ENUM(editor.eFlags, GGSM_EDITOR_BIT_SAVED)
ENDIF
ENDIF
ENDPROC
PROC GGSM_EDITOR_CORE_PICK_OPTION(GGSM_EDITOR_CORE &editor, INT iMaxOption)
// options
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_UP)
editor.iOption --
IF (editor.iOption < 0)
editor.iOption = iMaxOption - 1
ENDIF
ENDIF
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_DOWN)
editor.iOption ++
IF (editor.iOption >= iMaxOption)
editor.iOption = 0
ENDIF
ENDIF
ENDPROC
PROC GGSM_EDITOR_CORE_SHARED_UPDATE(GGSM_EDITOR_CORE &editor)
IF (editor.iLastEditIndex != editor.iCurrentEditIndex)
GGSM_EDITOR_CORE_SET_EDITOR_BIT(editor, GGSM_EDITOR_BIT_COPY_FROM_DATA)
ENDIF
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RLEFT)
GGSM_EDITOR_CORE_SET_EDITOR_BIT(editor, GGSM_EDITOR_BIT_COPY_TO_DATA)
ENDIF
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RRIGHT)
GGSM_EDITOR_CORE_SET_EDITOR_BIT(editor, GGSM_EDITOR_BIT_COPY_FROM_DATA)
ENDIF
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RDOWN)
GGSM_EDITOR_CORE_SET_EDITOR_BIT(editor, GGSM_EDITOR_BIT_TEST_SYSTEM)
ENDIF
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RUP)
GGSM_EDITOR_CORE_SET_EDITOR_BIT(editor, GGSM_EDITOR_BIT_EXPORT)
ENDIF
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_SELECT)
sGGSMData.bGamePaused = !sGGSMData.bGamePaused
ENDIF
ENDPROC
//-------------------------------------------------
// EDITOR TEST DEBUG FUNCTIONS
//-------------------------------------------------
#IF GGSM_ENTITY_EDITOR_ACTIVE
PROC GGSM_ENTITY_EDITOR_WIDGET_UPDATE(GGSM_ENTITY_EDITOR &editor)
IF (editor.sEditCore.bEditorActive = TRUE)
IF (editor.sEditCore.bLastEditorActive = FALSE)
GGSM_EDITOR_CORE_SET_EDITOR_BIT(editor.sEditCore, GGSM_EDITOR_BIT_COPY_FROM_DATA)
sGGSMData.bGamePaused = TRUE
ENDIF
DISABLE_PLAYER_CONTROLS_THIS_FRAME()
GGSM_SET_PLAYER_INVUNERABLE()
GGSM_EDITOR_CORE_SHARED_UPDATE(editor.sEditCore)
GGSM_EDITOR_CORE_PICK_OPTION(editor.sEditCore, GGSM_ENTITY_EDITOR_OPTION_MAX)
// handle options
SWITCH (editor.sEditCore.iOption)
CASE GGSM_ENTITY_EDITOR_OPTION_DATA_SELECT
IF GGSM_EDITOR_CORE_EDIT_INT_PARAM(editor.sEditCore, editor.sEditCore.iCurrentEditIndex, ENUM_TO_INT(NUM_GGSM_ENTITY_TYPE))
GGSM_EDITOR_CORE_SET_EDITOR_BIT(editor.sEditCore, GGSM_EDITOR_BIT_COPY_FROM_DATA)
ENDIF
BREAK
ENDSWITCH
IF IS_BITMASK_ENUM_AS_ENUM_SET(editor.sEditCore.eFlags, GGSM_EDITOR_BIT_COPY_FROM_DATA)
editor.eEditType = INT_TO_ENUM(GGSM_ENTITY_TYPE, editor.sEditCore.iCurrentEditIndex)
editor.sEditData = GGSM_ENTITY_DATA_GET(editor.eEditType)
GGSM_EDITOR_CORE_CLEAR_EDITOR_BIT(editor.sEditCore, GGSM_EDITOR_BIT_COPY_FROM_DATA)
GGSM_ENTITY_RESET(editor.sTestEntity)
GGSM_ENTITY_INIT(editor.sTestEntity, editor.eEditType, INIT_VECTOR_2D(cfBASE_SCREEN_HALF_WIDTH, cfBASE_SCREEN_HALF_HEIGHT), 0, TRUE)
ENDIF
// handle point movement
SWITCH (editor.sEditCore.iOption)
CASE GGSM_ENTITY_EDITOR_OPTION_POINT_EDIT
GGSM_ALTER_POINT_WITH_INPUT(editor.sEditData.sCollisionData.vCollisionVectors[0], 128.0, GGSM_INPUT_LSTICK)
GGSM_ALTER_POINT_WITH_INPUT(editor.sEditData.sCollisionData.vCollisionVectors[1], 128.0, GGSM_INPUT_RSTICK)
BREAK
CASE GGSM_ENTITY_EDITOR_OPTION_RADIUS_SELECT
GGSM_ALTER_FLOAT_WITH_INPUT(editor.sEditData.sCollisionData.fColRadius, 128.0, GGSM_INPUT_LSTICK)
BREAK
CASE GGSM_ENTITY_EDITOR_OPTION_GUNPOS_SELECT
GGSM_ALTER_POINT_WITH_INPUT(editor.sEditData.sGunPos.vPosition, 128.0, GGSM_INPUT_LSTICK)
GGSM_ALTER_FLOAT_WITH_INPUT(editor.sEditData.sGunPos.fRotation, 360.0, GGSM_INPUT_RSTICK)
BREAK
ENDSWITCH
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RDOWN)
GGSM_EDITOR_CORE_SET_EDITOR_BIT(editor.sEditCore, GGSM_EDITOR_BIT_COPY_TO_DATA)
ENDIF
IF IS_BITMASK_ENUM_AS_ENUM_SET(editor.sEditCore.eFlags, GGSM_EDITOR_BIT_COPY_TO_DATA)
editor.eEditType = INT_TO_ENUM(GGSM_ENTITY_TYPE, editor.sEditCore.iCurrentEditIndex)
GGSM_EDITOR_CORE_CLEAR_EDITOR_BIT(editor.sEditCore, GGSM_EDITOR_BIT_COPY_TO_DATA)
GGSM_EDITOR_CORE_SET_EDITOR_BIT(editor.sEditCore, GGSM_EDITOR_BIT_SAVED)
GGSM_ENTITY_RESET(editor.sTestEntity)
GGSM_ENTITY_INIT(editor.sTestEntity, editor.eEditType, INIT_VECTOR_2D(cfBASE_SCREEN_HALF_WIDTH, cfBASE_SCREEN_HALF_HEIGHT), 0, TRUE)
ENDIF
IF IS_BITMASK_ENUM_AS_ENUM_SET(editor.sEditCore.eFlags, GGSM_EDITOR_BIT_EXPORT)
GGSM_EDITOR_CORE_CLEAR_EDITOR_BIT(editor.sEditCore, GGSM_EDITOR_BIT_EXPORT)
GGSM_EDITOR_CORE_SET_EDITOR_BIT(editor.sEditCore, GGSM_EDITOR_BIT_SAVED)
ENDIF
editor.sDebugEntData[editor.eEditType] = editor.sEditData
GGSM_ENTITY_UPDATE(editor.sTestEntity)
GGSM_DRAW_ENTITY_EDITOR(editor)
ELSE
IF (editor.sEditCore.bLastEditorActive != editor.sEditCore.bEditorActive)
sGGSMData.bGamePaused = FALSE
ENDIF
ENDIF
GGSM_EDITOR_CORE_FINALISE_FOR_FRAME_END(editor.sEditCore)
ENDPROC
#ENDIF
#IF GGSM_SPAWN_EDITOR_ACTIVE
PROC GGSM_SPAWN_EDITOR_WIDGET_UPDATE(GGSM_SPAWN_EDITOR &editor)
// check right stick
VECTOR_2D vec = INIT_VECTOR_2D(GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_X), GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_Y))
FLOAT len = VECTOR_2D_MAG(vec)
INT iGroupID = -1
INT ind
IF (editor.sEditCore.bEditorActive = TRUE)
IF (editor.sEditCore.bLastEditorActive = FALSE)
GGSM_EDITOR_CORE_SET_EDITOR_BIT(editor.sEditCore, GGSM_EDITOR_BIT_COPY_FROM_DATA)
GGSM_RESET_FOR_STAGE_START(FALSE)
sGGSMData.bGamePaused = TRUE
ENDIF
IF IS_CONTROL_HELD(sGGSMData.sStartBtnTimer)
sGGSMData.bGamePaused = FALSE
editor.sEditCore.bEditorActive = FALSE
GGSM_SET_CLIENT_STATE(GGSM_STATE_STAGE_ACTIVE)
EXIT
ENDIF
DISABLE_PLAYER_CONTROLS_THIS_FRAME()
GGSM_SET_PLAYER_INVUNERABLE()
GGSM_EDITOR_CORE_SHARED_UPDATE(editor.sEditCore)
GGSM_EDITOR_CORE_PICK_OPTION(editor.sEditCore, GGSM_SPAWN_EDITOR_OPTION_MAX)
IF (len >= 0.9)
editor.fFormAngle = GET_HEADING_FROM_VECTOR_2D(vec.x, vec.y)
ENDIF
// options
SWITCH (editor.sEditCore.iOption)
CASE GGSM_SPAWN_EDITOR_OPTION_DATA_SELECT
IF GGSM_EDITOR_CORE_EDIT_INT_PARAM(editor.sEditCore, editor.sEditCore.iCurrentEditIndex, GGSM_MAX_SPAWN_DATA)
GGSM_EDITOR_CORE_SET_EDITOR_BIT(editor.sEditCore, GGSM_EDITOR_BIT_COPY_FROM_DATA)
ENDIF
BREAK
CASE GGSM_SPAWN_EDITOR_OPTION_FORMATION_SELECT
GGSM_EDITOR_CORE_EDIT_INT_PARAM(editor.sEditCore, editor.iFormationType, ENUM_TO_INT(NUM_GGSM_FORMATION_TYPE), GGSM_SPAWN_EDITOR_OPTION_FORMATION_SELECT)
BREAK
CASE GGSM_SPAWN_EDITOR_OPTION_ENTITY_SELECT
GGSM_EDITOR_CORE_EDIT_INT_PARAM(editor.sEditCore, editor.iEntityType, ENUM_TO_INT(NUM_GGSM_ENTITY_TYPE))
BREAK
CASE GGSM_SPAWN_EDITOR_OPTION_MOVEMENT_SELECT
GGSM_EDITOR_CORE_EDIT_INT_PARAM(editor.sEditCore, editor.iMoveType, ENUM_TO_INT(NUM_GGSM_MOVEMENT_TYPE))
BREAK
CASE GGSM_SPAWN_EDITOR_OPTION_WEAPON_SELECT
GGSM_EDITOR_CORE_EDIT_INT_PARAM(editor.sEditCore, editor.iWeaponType, ENUM_TO_INT(NUM_GGSM_WEAPON_TYPE))
BREAK
CASE GGSM_SPAWN_EDITOR_OPTION_UNITCOUNT_SELECT
GGSM_EDITOR_CORE_EDIT_INT_PARAM(editor.sEditCore, editor.sEditData.iFormationMembers, GGSM_MAX_ENEMIES)
BREAK
CASE GGSM_SPAWN_EDITOR_OPTION_XSPACE_SELECT
GGSM_EDITOR_CORE_EDIT_FLOAT_MIN_MAX(editor.sEditCore, editor.sEditData.vSpacing.x, 0.125, 0.125, 4.0, GGSM_SPAWN_EDITOR_OPTION_FORMATION_SELECT)
BREAK
CASE GGSM_SPAWN_EDITOR_OPTION_YSPACE_SELECT
GGSM_EDITOR_CORE_EDIT_FLOAT_MIN_MAX(editor.sEditCore, editor.sEditData.vSpacing.y, 0.125, 0.125, 4.0, GGSM_SPAWN_EDITOR_OPTION_FORMATION_SELECT)
BREAK
CASE GGSM_SPAWN_EDITOR_OPTION_PATH_SELECT
IF (editor.iFormationType != ENUM_TO_INT(GGSM_FORMATION_POWER_UP))
GGSM_EDITOR_CORE_EDIT_INT_MIN_MAX(editor.sEditCore, editor.sEditData.iPathNumber, -1, GGSM_MAX_PATH_LIBRARY)
ELSE
GGSM_EDITOR_CORE_EDIT_INT_PARAM(editor.sEditCore, editor.sEditData.iPathNumber, GGSM_NUM_POWER_UPS)
ENDIF
BREAK
CASE GGSM_SPAWN_EDITOR_OPTION_FORMATION_SHIFT
GGSM_EDITOR_CORE_EDIT_FLOAT_MIN_MAX(editor.sEditCore, editor.fFormShift, 50.0, -10000.0, 10000.0, GGSM_SPAWN_EDITOR_OPTION_FORMATION_SELECT)
BREAK
ENDSWITCH
// shift the camera forward and backward
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_LB)
GGSM_RESET_FOR_STAGE_START(FALSE)
editor.sEditCore.iActiveTestGroup = -1
ENDIF
IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RT)
sGGSMData.sCamera.vWorldPosition.x += (700.0 * GET_FRAME_TIME())
sGGSMData.sCamera.fDistTravelled += (700.0 * GET_FRAME_TIME())
sGGSMData.sCamera.vLastWorldPosition = sGGSMData.sCamera.vWorldPosition
ENDIF
IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RB)
sGGSMData.sCamera.vWorldPosition.x -= (700.0 * GET_FRAME_TIME())
sGGSMData.sCamera.fDistTravelled -= (700.0 * GET_FRAME_TIME())
sGGSMData.sCamera.vLastWorldPosition = sGGSMData.sCamera.vWorldPosition
ENDIF
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_LT)
IF (editor.sEditCore.iOption != GGSM_SPAWN_EDITOR_OPTION_FORMATION_SHIFT)
ind = GGSM_GET_FREE_FORMATION_SLOT(sGGSMData.sSpawnData)
IF (ind != -1)
editor.sEditCore.iCurrentEditIndex = ind
editor.sEditCore.iLastEditIndex = ind
ENDIF
ELSE
GGSM_SHIFT_FORMATION_DATA_ARRAY(sGGSMData.sSpawnData, editor.fFormShift, editor.sEditCore.iCurrentEditIndex)
ENDIF
ENDIF
// handle point movement
GGSM_ALTER_POINT_WITH_INPUT(editor.vFormPosition, 700.0)
editor.vFormPosition.x = CLAMP(editor.vFormPosition.x, -cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_WIDTH)
editor.vFormPosition.y = CLAMP(editor.vFormPosition.y, -cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_WIDTH)
// copy data from array
IF IS_BITMASK_ENUM_AS_ENUM_SET(editor.sEditCore.eFlags, GGSM_EDITOR_BIT_COPY_FROM_DATA)
editor.sEditData = sGGSMData.sSpawnData[editor.sEditCore.iCurrentEditIndex]
editor.iEntityType = ENUM_TO_INT(GGSM_FORMATION_GET_ENTITY_TYPE(editor.sEditData))
editor.iFormationType = ENUM_TO_INT(GGSM_FORMATION_GET_TYPE(editor.sEditData))
editor.iMoveType = ENUM_TO_INT(GGSM_FORMATION_GET_MOVEMENT_TYPE(editor.sEditData))
editor.iWeaponType = ENUM_TO_INT(GGSM_FORMATION_GET_WEAPON_TYPE(editor.sEditData))
vec = GGSM_FORMATION_GET_START_DIRECTION(editor.sEditData)
editor.fFormAngle = GET_HEADING_FROM_VECTOR_2D(vec.x, vec.y)
editor.vFormPosition = GGSM_FORMATION_GET_START_POSITION(editor.sEditData)
GGSM_RESET_FOR_STAGE_START(FALSE, editor.sEditData.fScrollDistance)
sGGSMData.iSpawnIndexCounter = editor.sEditCore.iCurrentEditIndex
GGSM_EDITOR_CORE_CLEAR_EDITOR_BIT(editor.sEditCore, GGSM_EDITOR_BIT_COPY_FROM_DATA)
ENDIF
// copy data to array
IF IS_BITMASK_ENUM_AS_ENUM_SET(editor.sEditCore.eFlags, GGSM_EDITOR_BIT_COPY_TO_DATA)
vec = GGSM_ROTATE_VECTOR_2D_ABOUT_Z(INIT_VECTOR_2D(0, 1), editor.fFormAngle)
GGSM_FORMATION_SET_SCROLL_DISTANCE(editor.sEditData, sGGSMData.sCamera.fDistTravelled)
GGSM_FORMATION_SET_START_POSITION(editor.sEditData, editor.vFormPosition.x, editor.vFormPosition.y)
GGSM_FORMATION_SET_START_DIRECTION(editor.sEditData, vec.x, vec.y)
sGGSMData.sSpawnData[editor.sEditCore.iCurrentEditIndex] = editor.sEditData
GGSM_QUICK_SORT_FORMATION_DATA_ARRAY(sGGSMData.sSpawnData)
editor.sEditCore.iCurrentEditIndex = GGSM_FIND_FORMATION_SLOT_AT_DISTANCE(sGGSMData.sSpawnData, editor.sEditData.fScrollDistance)
GGSM_EDITOR_CORE_CLEAR_EDITOR_BIT(editor.sEditCore, GGSM_EDITOR_BIT_COPY_TO_DATA)
GGSM_EDITOR_CORE_SET_EDITOR_BIT(editor.sEditCore, GGSM_EDITOR_BIT_SAVED)
ENDIF
// update dropdowns
GGSM_FORMATION_SET_TYPE(editor.sEditData, INT_TO_ENUM(GGSM_FORMATION_TYPE, editor.iFormationType))
GGSM_FORMATION_SET_ENTITY_TYPE(editor.sEditData, INT_TO_ENUM(GGSM_ENTITY_TYPE, editor.iEntityType))
GGSM_FORMATION_SET_MOVEMENT_TYPE(editor.sEditData, INT_TO_ENUM(GGSM_MOVEMENT_TYPE, editor.iMoveType))
GGSM_FORMATION_SET_WEAPON_TYPE(editor.sEditData, INT_TO_ENUM(GGSM_WEAPON_TYPE, editor.iWeaponType))
// test formation
IF IS_BITMASK_ENUM_AS_ENUM_SET(editor.sEditCore.eFlags, GGSM_EDITOR_BIT_TEST_SYSTEM)
vec = GGSM_ROTATE_VECTOR_2D_ABOUT_Z(INIT_VECTOR_2D(0, 1), editor.fFormAngle)
GGSM_FORMATION_SET_START_DIRECTION(editor.sEditData, vec.x, vec.y)
GGSM_FORMATION_SET_START_POSITION(editor.sEditData, editor.vFormPosition.x, editor.vFormPosition.y)
iGroupID = GGSM_GET_FREE_ENTITY_GROUP(sGGSMData.sEntityGroup)
IF (iGroupID != GGSM_INVALID_GROUP_ID)
editor.sEditCore.iActiveTestGroup = iGroupID
GGSM_FORMATION_SET_SCROLL_DISTANCE(editor.sEditData, sGGSMData.sCamera.fDistTravelled)
GGSM_ACTIVATE_ENTITY_GROUP_AS_FORMATION(sGGSMData.sEntityGroup[iGroupID], editor.sEditData)
ENDIF
GGSM_EDITOR_CORE_SET_EDITOR_BIT(editor.sEditCore, GGSM_EDITOR_BIT_COPY_TO_DATA)
GGSM_EDITOR_CORE_CLEAR_EDITOR_BIT(editor.sEditCore, GGSM_EDITOR_BIT_TEST_SYSTEM)
ENDIF
// update scroll while test is active
IF (editor.sEditCore.iActiveTestGroup != GGSM_INVALID_GROUP_ID)
IF GGSM_ENTITY_GROUP_IS_RUNNING(sGGSMData.sEntityGroup[editor.sEditCore.iActiveTestGroup])
sGGSMData.bGamePaused = FALSE
ENDIF
IF GGSM_ENTITY_GROUP_HAS_GROUP_FINISHED(sGGSMData.sEntityGroup[editor.sEditCore.iActiveTestGroup])
GGSM_RESET_FOR_STAGE_START(FALSE, editor.sEditData.fScrollDistance)
editor.sEditCore.iActiveTestGroup = GGSM_INVALID_GROUP_ID
sGGSMData.bGamePaused = TRUE
ENDIF
ENDIF
// export
IF IS_BITMASK_ENUM_AS_ENUM_SET(editor.sEditCore.eFlags, GGSM_EDITOR_BIT_EXPORT)
GGSM_QUICK_SORT_FORMATION_DATA_ARRAY(sGGSMData.sSpawnData)
GGSM_DEBUG_EXPORT_FORMATION_ARRAY_TO_SCRIPT(sGGSMData.sSpawnData, DEFAULT, TRUE)
GGSM_EDITOR_CORE_CLEAR_EDITOR_BIT(editor.sEditCore, GGSM_EDITOR_BIT_EXPORT)
GGSM_EDITOR_CORE_SET_EDITOR_BIT(editor.sEditCore, GGSM_EDITOR_BIT_SAVED)
ENDIF
GGSM_DRAW_SPAWN_EDITOR(editor)
ELSE
IF (editor.sEditCore.bLastEditorActive != editor.sEditCore.bEditorActive)
sGGSMData.bGamePaused = FALSE
ENDIF
ENDIF
GGSM_EDITOR_CORE_FINALISE_FOR_FRAME_END(editor.sEditCore)
ENDPROC
#ENDIF
#IF GGSM_TILEMAP_EDITOR_ACTIVE
PROC GGSM_TILEMAP_EDITOR_WIDGET_UPDATE(GGSM_TILEMAP_EDITOR &editor, GGSM_TILEMAP &tm)
IF (editor.sEditCore.bEditorActive = TRUE)
IF (editor.sEditCore.bLastEditorActive = FALSE)
GGSM_RESET_FOR_STAGE_START(FALSE)
sGGSMData.bGamePaused = TRUE
ENDIF
sGGSMData.bDrawCollisionDebug = TRUE
DISABLE_PLAYER_CONTROLS_THIS_FRAME()
GGSM_SET_PLAYER_INVUNERABLE()
GGSM_EDITOR_CORE_SHARED_UPDATE(editor.sEditCore)
IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RT)
GGSM_EDITOR_CORE_CLEAR_EDITOR_BIT(editor.sEditCore, GGSM_EDITOR_BIT_EDIT_MODE)
ELSE
GGSM_EDITOR_CORE_SET_EDITOR_BIT(editor.sEditCore, GGSM_EDITOR_BIT_EDIT_MODE)
ENDIF
IF NOT IS_BITMASK_ENUM_AS_ENUM_SET(editor.sEditCore.eFlags, GGSM_EDITOR_BIT_EDIT_MODE)
GGSM_EDITOR_CORE_PICK_OPTION(editor.sEditCore, GGSM_TILEMAP_EDITOR_OPTION_MAX)
// options
SWITCH (editor.sEditCore.iOption)
CASE GGSM_TILEMAP_EDITOR_OPTION_TILE_SELECT
GGSM_EDITOR_CORE_EDIT_INT_PARAM(editor.sEditCore, editor.sEditCore.iCurrentEditIndex, tm.iMaxTiles)
BREAK
CASE GGSM_TILEMAP_EDITOR_OPTION_FLIP_SELECT
GGSM_EDITOR_CORE_EDIT_INT_PARAM(editor.sEditCore, editor.iFlipBits, 4)
BREAK
CASE GGSM_TILEMAP_EDITOR_OPTION_MAX_X_SELECT
GGSM_EDITOR_CORE_EDIT_INT_PARAM(editor.sEditCore, tm.iMapWidth, GGSM_MAX_TILEMAP_SIZE_X + 1)
BREAK
CASE GGSM_TILEMAP_EDITOR_OPTION_MAX_Y_SELECT
GGSM_EDITOR_CORE_EDIT_INT_PARAM(editor.sEditCore, tm.iMapHeight, GGSM_MAX_TILEMAP_SIZE_Y + 1)
BREAK
ENDSWITCH
ELSE
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_LEFT)
editor.iEditMapX --
ENDIF
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT)
editor.iEditMapX ++
ENDIF
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_UP)
editor.iEditMapY --
ENDIF
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_DOWN)
editor.iEditMapY ++
ENDIF
ENDIF
IF GGSM_ALTER_POINT_WITH_INPUT(sGGSMData.sCamera.vWorldPosition, 700.0, GGSM_INPUT_RSTICK)
GGSM_WORLD_POSITION_IN_TILE_MAP(tm, ADD_VECTOR_2D(sGGSMData.sCamera.vWorldPosition, sGGSMData.sCamera.vWorldViewportOffset), editor.iEditMapX, editor.iEditMapY)
ENDIF
// clamp values
editor.iEditMapX = CLAMP_INT(editor.iEditMapX, 0, tm.iMapWidth - 1)
editor.iEditMapY = CLAMP_INT(editor.iEditMapY, 0, tm.iMapHeight - 1)
editor.sEditCore.iCurrentEditIndex = CLAMP_INT(editor.sEditCore.iCurrentEditIndex, 0, tm.iMaxTiles - 1)
// copy data to array
IF IS_BITMASK_ENUM_AS_ENUM_SET(editor.sEditCore.eFlags, GGSM_EDITOR_BIT_COPY_TO_DATA)
GGSM_TILEMAP_SET_INDEX(tm, editor.iEditMapX, editor.iEditMapY, editor.sEditCore.iCurrentEditIndex)
GGSM_TILE_SET_FLIP(tm, editor.iEditMapX, editor.iEditMapY, editor.iFlipBits)
CLEAR_BITMASK_ENUM_AS_ENUM(editor.sEditCore.eFlags, GGSM_EDITOR_BIT_COPY_TO_DATA)
ENDIF
IF IS_BITMASK_ENUM_AS_ENUM_SET(editor.sEditCore.eFlags, GGSM_EDITOR_BIT_EXPORT)
CLEAR_BITMASK_ENUM_AS_ENUM(editor.sEditCore.eFlags, GGSM_EDITOR_BIT_EXPORT)
GGSM_DEBUG_EXPORT_TILE_MAP_DATA_TO_SCRIPT(tm)
SET_BITMASK_ENUM_AS_ENUM(editor.sEditCore.eFlags, GGSM_EDITOR_BIT_SAVED)
ENDIF
GGSM_DRAW_TILE_MAP_EDITOR(editor, tm)
ELSE
IF (editor.sEditCore.bLastEditorActive != editor.sEditCore.bEditorActive)
sGGSMData.bGamePaused = FALSE
ENDIF
ENDIF
editor.iLastEditMapX = editor.iEditMapX
editor.iLastEditMapY = editor.iEditMapY
GGSM_EDITOR_CORE_FINALISE_FOR_FRAME_END(editor.sEditCore)
ENDPROC
#ENDIF
//-------------------------------------------------
// LOG FUNCTIONS
//-------------------------------------------------
PROC GGSM_AABB_TO_LOG(GGSM_AABB &ent)
CPRINTLN(DEBUG_MINIGAME, " --- GGSM_AABB ---")
CPRINTLN(DEBUG_MINIGAME, " vCenter:[", ent.vCenter.x, ",", ent.vCenter.y,"]")
CPRINTLN(DEBUG_MINIGAME, " vHalfSize:[", ent.vHalfSize.x, ",", ent.vHalfSize.y,"]")
CPRINTLN(DEBUG_MINIGAME, " --- END GGSM_AABB ---")
CPRINTLN(DEBUG_MINIGAME, " ")
ENDPROC
PROC GGSM_BOSS_CONTROLLER_TO_LOG(GGSM_BOSS_CONTROLLER &ent, INT i)
INT entIndex
CPRINTLN(DEBUG_MINIGAME, " --- GGSM_BOSS_CONTROLLER [", i ,"]---")
CPRINTLN(DEBUG_MINIGAME, " eType:", GGSM_BOSS_TYPE_TO_STRING(ent.eType))
CPRINTLN(DEBUG_MINIGAME, " eState:", GGSM_BOSS_STATE_TO_STRING(ent.eState))
CPRINTLN(DEBUG_MINIGAME, " HP:", ent.iTotalHP, "/", ent.iMaxTotalHP)
CPRINTLN(DEBUG_MINIGAME, " fStateTimer:", ent.fStateTimer)
CPRINTLN(DEBUG_MINIGAME, " iGroupID:", ent.iGroupID)
CPRINTLN(DEBUG_MINIGAME, " iSummedMaxHPBitSet:", ent.iSummedMaxHPBitSet)
CPRINTLN(DEBUG_MINIGAME, " iBossPatternState:", ent.iBossPatternState)
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- BOSS SECTIONS ---")
REPEAT GGSM_MAX_BOSS_PARTS i
entIndex = GGSM_BOSS_CONTROLLER_GET_ENTITY_INDEX(ent, i)
IF (entIndex != GGSM_INVALID_ENTITY)
CPRINTLN(DEBUG_MINIGAME, " ", i, ") ", GGSM_ENTITY_TYPE_TO_STRING(sGGSMData.sEntities[entIndex].eType), " HP:", sGGSMData.sEntities[entIndex].iHP)
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- END GGSM_BOSS_CONTROLLER ---")
CPRINTLN(DEBUG_MINIGAME, " ")
ENDPROC
PROC GGSM_COLLISION_DATA_STATE_TO_LOG(GGSM_COLLISION_DATA &ent)
INT i
CPRINTLN(DEBUG_MINIGAME, " --- GGSM_COLLISION_DATA ---")
CPRINTLN(DEBUG_MINIGAME, " eType:", GGSM_COLLISION_SHAPE_TO_STRING(ent.eType))
CPRINTLN(DEBUG_MINIGAME, " fColRadius:", ent.fColRadius)
REPEAT COUNT_OF(ent.vCollisionVectors) i
CPRINTLN(DEBUG_MINIGAME, " vCollisionVectors:")
CPRINTLN(DEBUG_MINIGAME, " vCollisionVectors[", i, "] = [", ent.vCollisionVectors[i].x, ",", ent.vCollisionVectors[i].y,"]")
ENDREPEAT
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- END GGSM_COLLISION_DATA ---")
CPRINTLN(DEBUG_MINIGAME, " ")
ENDPROC
PROC GGSM_COLLIDER_TO_LOG(GGSM_COLLIDER &ent)
CPRINTLN(DEBUG_MINIGAME, " --- GGSM_COLLIDER ---")
GGSM_COLLISION_DATA_STATE_TO_LOG(ent.sData)
GGSM_AABB_TO_LOG(ent.sAABB)
CPRINTLN(DEBUG_MINIGAME, " --- END GGSM_COLLIDER ---")
CPRINTLN(DEBUG_MINIGAME, " ")
ENDPROC
PROC GGSM_DIALOG_CONTROLLER_TO_LOG(GGSM_DIALOG_CONTROLLER &ent)
CPRINTLN(DEBUG_MINIGAME, " --- GGSM_DIALOG_CONTROLLER ---")
CPRINTLN(DEBUG_MINIGAME, " eType:", GGSM_DIALOG_TYPE_TO_STRING(ent.eType))
CPRINTLN(DEBUG_MINIGAME, " eState:", GGSM_DIALOG_STATE_TO_STRING(ent.eState))
CPRINTLN(DEBUG_MINIGAME, " eLeftPicture:", GGSM_SPRITE_TYPE_TO_STRING(ent.eLeftPicture))
CPRINTLN(DEBUG_MINIGAME, " eRightPicture:", GGSM_SPRITE_TYPE_TO_STRING(ent.eRightPicture))
CPRINTLN(DEBUG_MINIGAME, " eLeftDialog:", GGSM_SPRITE_TYPE_TO_STRING(ent.eLeftDialog))
CPRINTLN(DEBUG_MINIGAME, " eRightDialog:", GGSM_SPRITE_TYPE_TO_STRING(ent.eRightDialog))
CPRINTLN(DEBUG_MINIGAME, " iSlideInOffset:", ent.iSlideInOffset)
CPRINTLN(DEBUG_MINIGAME, " iVariation:", ent.iVariation)
CPRINTLN(DEBUG_MINIGAME, " iMsgNumber:", ent.iMsgNumber)
CPRINTLN(DEBUG_MINIGAME, " iMsgTimerMS:", ent.iMsgTimerMS)
CPRINTLN(DEBUG_MINIGAME, " --- END GGSM_DIALOG_CONTROLLER ---")
CPRINTLN(DEBUG_MINIGAME, " ")
ENDPROC
PROC GGSM_ENTITY_TO_LOG(GGSM_ENTITY &ent)
INT i
VECTOR_2D v
GGSM_ENTITY_BIT bit
CPRINTLN(DEBUG_MINIGAME, " --- GGSM_ENTITY [", GGSM_ENTITY_GET_ARRAY_INDEX(ent),"]---")
CPRINTLN(DEBUG_MINIGAME, " eState:", GGSM_ENTITY_STATE_TO_STRING(ent.eState))
CPRINTLN(DEBUG_MINIGAME, " eType:", GGSM_ENTITY_TYPE_TO_STRING(ent.eType))
CPRINTLN(DEBUG_MINIGAME, " iArrayIndex:", GGSM_ENTITY_GET_ARRAY_INDEX(ent))
CPRINTLN(DEBUG_MINIGAME, " iFlags:", ENUM_TO_INT(ent.eFlags))
CPRINTLN(DEBUG_MINIGAME, " iGroupID:", ent.iGroupID)
CPRINTLN(DEBUG_MINIGAME, " iEntityParentIndex:", GGSM_ENTITY_GET_PARENT_INDEX(ent))
CPRINTLN(DEBUG_MINIGAME, " iHP:", ent.iHP)
CPRINTLN(DEBUG_MINIGAME, " iInvTimeMS:", ent.iInvTimeMS)
CPRINTLN(DEBUG_MINIGAME, " fAnimFrame:", ent.fAnimFrame)
CPRINTLN(DEBUG_MINIGAME, " fExplodeTimer:", ent.fExplodeTimer)
CPRINTLN(DEBUG_MINIGAME, " fTimer:", ent.fTimer)
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- ACTIVE FLAGS ---")
REPEAT 32 i
bit = INT_TO_ENUM(GGSM_ENTITY_BIT, SHIFT_LEFT(1, i))
IF IS_BITMASK_ENUM_AS_ENUM_SET(ent.eFlags, bit)
CPRINTLN(DEBUG_MINIGAME," ", GGSM_ENTITY_BIT_TO_STRING(bit))
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- TRANSFORM ---")
CPRINTLN(DEBUG_MINIGAME, " vLocalPosition:[", ent.sLocal.vPosition.x, ",", ent.sLocal.vPosition.y, "]")
CPRINTLN(DEBUG_MINIGAME, " fLocalRotation:", ent.sLocal.fRotation)
CPRINTLN(DEBUG_MINIGAME, " vLocalScale:[", ent.sLocal.vScale.x, ",", ent.sLocal.vScale.y, "]")
CPRINTLN(DEBUG_MINIGAME, " vPosition:[", ent.sWorld.vPosition.x, ",", ent.sWorld.vPosition.y, "]")
CPRINTLN(DEBUG_MINIGAME, " fRotation:", ent.sWorld.fRotation)
CPRINTLN(DEBUG_MINIGAME, " vScale:[", ent.sWorld.vScale.x, ",", ent.sWorld.vScale.y, "]")
v = GGSM_UNPACK_VECTOR_2D(ent.iPackedLocalOrigin)
CPRINTLN(DEBUG_MINIGAME, " iPackedLocalOrigin:[", v.x, ",", v.y, "]")
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- MOVEMENT ---")
CPRINTLN(DEBUG_MINIGAME, " eMoveType:", GGSM_MOVEMENT_TYPE_TO_STRING(ent.eMoveType))
CPRINTLN(DEBUG_MINIGAME, " eMoveState:", GGSM_MOVESTATE_TYPE_TO_STRING(ent.eMoveState))
CPRINTLN(DEBUG_MINIGAME, " vLocalDirection:[", ent.vLocalDirection.x, ",", ent.vLocalDirection.y, "]")
v = GGSM_UNPACK_VECTOR_2D(ent.iPackedLocalTargetPosition)
CPRINTLN(DEBUG_MINIGAME, " iPackedTargetLocalPosition:[", v.x, ",", v.y, "]")
CPRINTLN(DEBUG_MINIGAME, " fSpeed:", ent.fSpeed)
REPEAT COUNT_OF(ent.fMoveParam) i
CPRINTLN(DEBUG_MINIGAME, " fMoveParam[", i, "]:", ent.fMoveParam[i])
ENDREPEAT
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- COLLISION ---")
CPRINTLN(DEBUG_MINIGAME, " eType:", GGSM_COLLISION_SHAPE_TO_STRING(ent.sCollider.sData.eType))
CPRINTLN(DEBUG_MINIGAME, " fColRadius:", ent.sCollider.sData.fColRadius)
CPRINTLN(DEBUG_MINIGAME, " AABB vCenter:[", ent.sCollider.sAABB.vCenter.x, ",", ent.sCollider.sAABB.vCenter.y,"]")
CPRINTLN(DEBUG_MINIGAME, " AABB vHalfSize:[", ent.sCollider.sAABB.vHalfSize.x, ",", ent.sCollider.sAABB.vHalfSize.y,"]")
CPRINTLN(DEBUG_MINIGAME, " vCollisionVectors:")
REPEAT COUNT_OF(ent.sCollider.sData.vCollisionVectors) i
CPRINTLN(DEBUG_MINIGAME, " vCollisionVectors[", i, "] = [", ent.sCollider.sData.vCollisionVectors[i].x, ",", ent.sCollider.sData.vCollisionVectors[i].y,"]")
ENDREPEAT
CPRINTLN(DEBUG_MINIGAME, " ")
/*
CPRINTLN(DEBUG_MINIGAME, " --- FX ---")
CPRINTLN(DEBUG_MINIGAME, " eSpriteAnim:", GGSM_SPRITE_ANIM_TO_STRING(ent.eSpriteAnim))
IF (ent.iPackedColor != 0)
GGSM_UNPACK_RGBA_COLOUR(ent.iPackedColor, col)
CPRINTLN(DEBUG_MINIGAME, " iPackedColor:", col.iR, " ", col.iG, " ", col.iB, " ", col.iA)
ENDIF
*/
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- WEAPONS ---")
CPRINTLN(DEBUG_MINIGAME, " eWeaponState:", GGSM_WEAPON_STATE_TO_STRING(ent.eWeaponState))
CPRINTLN(DEBUG_MINIGAME, " eWeaponType:", GGSM_WEAPON_TYPE_TO_STRING(ent.eWeaponType))
CPRINTLN(DEBUG_MINIGAME, " fWeaponTimer:", ent.fWeaponTimer)
CPRINTLN(DEBUG_MINIGAME, " iWeaponShotCounter:", ent.iWeaponShotCounter)
CPRINTLN(DEBUG_MINIGAME, " iWeaponBurstCounter:", ent.iWeaponBurstCounter)
CPRINTLN(DEBUG_MINIGAME, " iNumShotsOverride:", ent.iNumShotsOverride)
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- END_GGSM_ENTITY ---")
CPRINTLN(DEBUG_MINIGAME, " ")
ENDPROC
PROC GGSM_ENTITY_GROUP_TO_LOG(GGSM_ENTITY_GROUP &ent)
INT i
VECTOR_2D v
GGSM_GROUP_BIT bit
CPRINTLN(DEBUG_MINIGAME, " --- GGSM_ENTITY_GROUP [",ent.iGroupID ,"]---")
CPRINTLN(DEBUG_MINIGAME, " eFlags:", ENUM_TO_INT(ent.eFlags))
CPRINTLN(DEBUG_MINIGAME, " iLeader:", ent.iLeader)
CPRINTLN(DEBUG_MINIGAME, " iMembersBitSet:", ent.iMemberBitSet)
CPRINTLN(DEBUG_MINIGAME, " iMembersOnStageBitSet:", ent.iMembersOnStageBitSet)
CPRINTLN(DEBUG_MINIGAME, " iActiveCount:", ent.iActiveCount)
CPRINTLN(DEBUG_MINIGAME, " iMembersToCreate:", ent.iMembersToCreate)
CPRINTLN(DEBUG_MINIGAME, " fDistCounter:", ent.fDistCounter)
CPRINTLN(DEBUG_MINIGAME, " ")
//GGSM_FORMATION_DATA_TO_LOG(ent.sFormSettings)
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- ACTIVE FLAGS ---")
REPEAT 32 i
bit = INT_TO_ENUM(GGSM_GROUP_BIT, SHIFT_LEFT(1, i))
IF IS_BITMASK_ENUM_AS_ENUM_SET(ent.eFlags, bit)
CPRINTLN(DEBUG_MINIGAME," ", GGSM_GROUP_BIT_TO_STRING(bit))
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_MINIGAME, " ")
IF (ent.iActiveCount > 0)
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- MEMBERS ---")
REPEAT GGSM_MAX_ENTITIES i
IF (sGGSMData.sEntities[i].eState != GGSM_ENTITY_STATE_NONE) AND (GGSM_ENTITY_GET_GROUP_ID(sGGSMData.sEntities[i]) = ent.iGroupID)
v = sGGSMData.sEntities[i].sWorld.vPosition
CPRINTLN(DEBUG_MINIGAME, " ENTITY:", i, " ", GGSM_ENTITY_TYPE_TO_STRING(sGGSMData.sEntities[i].eType), " POS:[", v.x, ", ", v.y, "]")
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_MINIGAME, " ")
ENDIF
CPRINTLN(DEBUG_MINIGAME, " --- FORMATION PARAMS ---")
CPRINTLN(DEBUG_MINIGAME, " eFormType:", GGSM_FORMATION_TYPE_TO_STRING(GGSM_FORMATION_GET_TYPE(ent.sFormSettings)))
CPRINTLN(DEBUG_MINIGAME, " eEntityType:", GGSM_ENTITY_TYPE_TO_STRING(GGSM_FORMATION_GET_ENTITY_TYPE(ent.sFormSettings)))
CPRINTLN(DEBUG_MINIGAME, " eWeaponType:", GGSM_WEAPON_TYPE_TO_STRING(GGSM_FORMATION_GET_WEAPON_TYPE(ent.sFormSettings)))
CPRINTLN(DEBUG_MINIGAME, " eMovementType:", GGSM_MOVEMENT_TYPE_TO_STRING(GGSM_FORMATION_GET_MOVEMENT_TYPE(ent.sFormSettings)))
v = GGSM_FORMATION_GET_START_POSITION(ent.sFormSettings)
CPRINTLN(DEBUG_MINIGAME, " vBasePos:[", v.x, ",", v.y,"]")
v = GGSM_FORMATION_GET_START_DIRECTION(ent.sFormSettings)
CPRINTLN(DEBUG_MINIGAME, " vBaseDir:[", v.x, ",", v.y,"]")
v = GGSM_FORMATION_GET_SPACING(ent.sFormSettings)
CPRINTLN(DEBUG_MINIGAME, " vSpacing:[", v.x, ",", v.y,"]")
CPRINTLN(DEBUG_MINIGAME, " fScrollDistance:", GGSM_FORMATION_GET_SCROLL_DISTANCE(ent.sFormSettings))
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- END_GGSM_ENTITY_GROUP ---")
CPRINTLN(DEBUG_MINIGAME, " ")
ENDPROC
PROC GGSM_FX_SPRITE_TO_LOG(GGSM_FX_SPRITE &ent, INT n)
GGSM_FX_SPRITE_BIT bit
VECTOR_2D v
INT i
CPRINTLN(DEBUG_MINIGAME, " --- GGSM_SPRITE [", n ,"]---")
CPRINTLN(DEBUG_MINIGAME, " --- ACTIVE FLAGS ---")
REPEAT 32 i
bit = INT_TO_ENUM(GGSM_FX_SPRITE_BIT, SHIFT_LEFT(1, i))
IF IS_BITMASK_ENUM_AS_ENUM_SET(ent.eFlags, bit)
CPRINTLN(DEBUG_MINIGAME," ", GGSM_FX_SPRITE_BIT_TO_STRING(bit))
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- INFO ---")
CPRINTLN(DEBUG_MINIGAME, " eSpriteAnim:", GGSM_SPRITE_ANIM_TO_STRING(ent.eSpriteAnim))
CPRINTLN(DEBUG_MINIGAME, " eSpriteType:", GGSM_SPRITE_TYPE_TO_STRING(ent.eSpriteType))
v = GGSM_UNPACK_VECTOR_2D(ent.iPackedPosition)
CPRINTLN(DEBUG_MINIGAME, " iPackedPosition:[", v.x, ",", v.y, "]")
CPRINTLN(DEBUG_MINIGAME, " fAnimFrame:", ent.fAnimFrame)
CPRINTLN(DEBUG_MINIGAME, " fScale:", ent.fScale)
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- END_GGSM_SPRITE ---")
CPRINTLN(DEBUG_MINIGAME, " ")
ENDPROC
PROC GGSM_PROJECTILE_TO_LOG(GGSM_PROJECTILE &ent, INT n)
GGSM_PROJECTILE_BIT bit
INT i
CPRINTLN(DEBUG_MINIGAME, " --- GGSM_PROJECTILE [", n ,"]---")
CPRINTLN(DEBUG_MINIGAME, " eType:", GGSM_PROJECTILE_TYPE_TO_STRING(ent.eType))
CPRINTLN(DEBUG_MINIGAME, " eFlags:", ENUM_TO_INT(ent.eFlags))
CPRINTLN(DEBUG_MINIGAME, " iTargetIndex:", ent.iTargetIndex)
CPRINTLN(DEBUG_MINIGAME, " fTimer:", ent.fTimer)
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- ACTIVE FLAGS ---")
REPEAT 32 i
bit = INT_TO_ENUM(GGSM_PROJECTILE_BIT, SHIFT_LEFT(1, i))
IF IS_BITMASK_ENUM_AS_ENUM_SET(ent.eFlags, bit)
CPRINTLN(DEBUG_MINIGAME," ", GGSM_PROJECTILE_BIT_TO_STRING(bit))
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- MOVEMENT ---")
CPRINTLN(DEBUG_MINIGAME, " vDirection:[", ent.vDirection.x, ",", ent.vDirection.y, "]")
CPRINTLN(DEBUG_MINIGAME, " fSpeed:", ent.fSpeed)
CPRINTLN(DEBUG_MINIGAME, " fRotation:", GET_HEADING_FROM_VECTOR_2D(ent.vDirection.x, ent.vDirection.y))
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- COLLISION ---")
CPRINTLN(DEBUG_MINIGAME, " eType:", GGSM_COLLISION_SHAPE_TO_STRING(ent.sCollider.sData.eType))
CPRINTLN(DEBUG_MINIGAME, " fLength:", ent.fLength)
CPRINTLN(DEBUG_MINIGAME, " fColRadius:", ent.sCollider.sData.fColRadius)
CPRINTLN(DEBUG_MINIGAME, " AABB vCenter:[", ent.sCollider.sAABB.vCenter.x, ",", ent.sCollider.sAABB.vCenter.y,"]")
CPRINTLN(DEBUG_MINIGAME, " AABB vHalfSize:[", ent.sCollider.sAABB.vHalfSize.x, ",", ent.sCollider.sAABB.vHalfSize.y,"]")
CPRINTLN(DEBUG_MINIGAME, " vCollisionVectors:")
REPEAT COUNT_OF(ent.sCollider.sData.vCollisionVectors) i
CPRINTLN(DEBUG_MINIGAME, " vCollisionVectors[", i, "] = [", ent.sCollider.sData.vCollisionVectors[i].x, ",", ent.sCollider.sData.vCollisionVectors[i].y,"]")
ENDREPEAT
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- END_GGSM_PROJECTILE ---")
CPRINTLN(DEBUG_MINIGAME, " ")
ENDPROC
PROC GGSM_TO_LOG()
INT i, n
GGSM_STAGE_BIT stageBit
GGSM_CHALLENGE_BIT challengeBit
GGSM_TEXDICT textureBit
GGSM_UNLOCK_TYPE unlockType
CPRINTLN(DEBUG_MINIGAME, " --- STATE ---")
CPRINTLN(DEBUG_MINIGAME, " eClientState:", GGSM_STATE_TO_STRING(sGGSMData.eState))
CPRINTLN(DEBUG_MINIGAME, " fTimeScale:", sGGSMData.fTimeScale)
CPRINTLN(DEBUG_MINIGAME, " gameTimer:", GET_GAME_TIMER())
CPRINTLN(DEBUG_MINIGAME, " bPowerUpCollected:", GET_STRING_FROM_BOOL(sGGSMData.bPowerUpCollected))
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- STATS ---")
CPRINTLN(DEBUG_MINIGAME, " gameType:", sGGSMData.sGameStats.gameType)
CPRINTLN(DEBUG_MINIGAME, " matchId:", sGGSMData.sGameStats.matchId)
CPRINTLN(DEBUG_MINIGAME, " numPlayers:", sGGSMData.sGameStats.numPlayers)
CPRINTLN(DEBUG_MINIGAME, " level:", sGGSMData.sGameStats.level)
CPRINTLN(DEBUG_MINIGAME, " powerUps:", sGGSMData.sGameStats.powerUps)
CPRINTLN(DEBUG_MINIGAME, " kills:", sGGSMData.sGameStats.kills)
CPRINTLN(DEBUG_MINIGAME, " timePlayed:", sGGSMData.sGameStats.timePlayed)
CPRINTLN(DEBUG_MINIGAME, " score:", sGGSMData.sGameStats.score)
CPRINTLN(DEBUG_MINIGAME, " reward:", sGGSMData.sGameStats.reward)
CPRINTLN(DEBUG_MINIGAME, " challenges:", sGGSMData.sGameStats.challenges)
CPRINTLN(DEBUG_MINIGAME, " iPlayerLives:", sGGSMData.iPlayerLives)
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- ENTITIES ---")
n = 0
REPEAT COUNT_OF(sGGSMData.sEntities) i
IF (sGGSMData.sEntities[i].eState != GGSM_ENTITY_STATE_NONE)
GGSM_ENTITY_TO_LOG(sGGSMData.sEntities[i])
n ++
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_MINIGAME," # ACTIVE ENTITIES:", n)
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- PLAYER PROJECTILES ---")
n = 0
REPEAT COUNT_OF(sGGSMData.sProjectiles) i
IF IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.sProjectiles[i].eFlags, GGSM_PROJECTILE_BIT_ACTIVE)
IF IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.sProjectiles[i].eFlags, GGSM_PROJECTILE_BIT_IS_PLAYER_ALLIED)
GGSM_PROJECTILE_TO_LOG(sGGSMData.sProjectiles[i], i)
n ++
ENDIF
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_MINIGAME," # ACTIVE PROJECTILES:", n)
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- ENEMY PROJECTILES ---")
n = 0
REPEAT COUNT_OF(sGGSMData.sProjectiles) i
IF IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.sProjectiles[i].eFlags, GGSM_PROJECTILE_BIT_ACTIVE)
IF NOT IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.sProjectiles[i].eFlags, GGSM_PROJECTILE_BIT_IS_PLAYER_ALLIED)
GGSM_PROJECTILE_TO_LOG(sGGSMData.sProjectiles[i], i)
ENDIF
n ++
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_MINIGAME," # ACTIVE PROJECTILES:", n)
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- ENTITY GROUPS ---")
REPEAT COUNT_OF(sGGSMData.sEntityGroup) i
IF IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.sEntityGroup[i].eFlags, GGSM_GROUP_BIT_ACTIVE)
GGSM_ENTITY_GROUP_TO_LOG(sGGSMData.sEntityGroup[i])
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- BOSS CONTROLLERS ---")
REPEAT COUNT_OF(sGGSMData.sBossController) i
GGSM_BOSS_CONTROLLER_TO_LOG(sGGSMData.sBossController[i], i)
ENDREPEAT
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- FX SPRITES ---")
REPEAT COUNT_OF(sGGSMData.sFXSprite) i
IF IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.sFXSprite[i].eFlags, GGSM_FX_SPRITE_BIT_ACTIVE)
GGSM_FX_SPRITE_TO_LOG(sGGSMData.sFXSprite[i], i)
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- STAGE FLAGS ---")
REPEAT 32 i
stageBit = INT_TO_ENUM(GGSM_STAGE_BIT, SHIFT_LEFT(1, i))
IF IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.eStageFlags, stageBit)
CPRINTLN(DEBUG_MINIGAME," ", GGSM_STAGE_BIT_TO_STRING(stageBit))
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- CHALLENGE FLAGS ---")
REPEAT 32 i
challengeBit = INT_TO_ENUM(GGSM_CHALLENGE_BIT, SHIFT_LEFT(1, i))
IF IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.eChallengeFlags, challengeBit)
CPRINTLN(DEBUG_MINIGAME," ", GGSM_CHALLENGE_BIT_TO_STRING(challengeBit))
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- UNLOCKS FLAGS ---")
REPEAT NUM_GGSM_UNLOCK_TYPE unlockType
IF (unlockType != GGSM_UNLOCK_NONE)
CPRINTLN(DEBUG_MINIGAME," ", GGSM_UNLOCK_TYPE_TO_STRING(unlockType), ":", GET_STRING_FROM_BOOL(IS_BIT_SET(sGGSMData.iUnlockedBitField, ENUM_TO_INT(unlockType))))
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- TEXTURE DICTS ---")
REPEAT GGSM_MAX_TEXDICT i
textureBit = INT_TO_ENUM(GGSM_TEXDICT, SHIFT_LEFT(1, i))
IF IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.eLoadedTextureFlags, textureBit)
CPRINTLN(DEBUG_MINIGAME," ", GGSM_TEXDICT_TO_STRING(textureBit))
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_MINIGAME, " ")
CPRINTLN(DEBUG_MINIGAME, " --- Z SORT DATA ---")
REPEAT COUNT_OF(sGGSMData.sZSortData) i
CPRINTLN(DEBUG_MINIGAME, " Slot:", i, " Entity Index:", sGGSMData.sZSortData[i].iEntityIndex, " Z-Depth:", sGGSMData.sZSortData[i].iZDepth)
ENDREPEAT
GGSM_DIALOG_CONTROLLER_TO_LOG(sGGSMData.sDialogController)
CPRINTLN(DEBUG_MINIGAME, " ")
ENDPROC
//-------------------------------------------------
// MAIN DEBUG FUNCTIONS
//-------------------------------------------------
/// PURPOSE:
/// Creates Debug Widgets
PROC GGSM_DEBUG_CREATE_WIDGETS()
IF sGGSMData.bDebugCreatedWidgets
EXIT
ENDIF
IF sGGSMData.widgetGroupExample = NULL
EXIT
ENDIF
INT i
TEXT_LABEL_31 txt
SET_CURRENT_WIDGET_GROUP(sGGSMData.widgetGroupExample)
START_WIDGET_GROUP("Game Widgets")
ADD_WIDGET_BOOL("Dump To TTY", sGGSMData.bDebugDumpToLogs)
ADD_WIDGET_BOOL("Draw Collision", sGGSMData.bDrawCollisionDebug)
ADD_WIDGET_BOOL("Disable SFX", sGGSMData.bDebugDisableSFX)
ADD_WIDGET_BOOL("g_bBlockArcadeCabinetDrawing", g_bBlockArcadeCabinetDrawing)
ADD_WIDGET_BOOL("g_bMinimizeArcadeCabinetDrawing", g_bMinimizeArcadeCabinetDrawing)
ADD_WIDGET_BOOL("Game Paused", sGGSMData.bGamePaused)
ADD_WIDGET_BOOL("Game Force Quit", sGGSMData.bGameForceQuit)
ADD_WIDGET_FLOAT_SLIDER("Analog Dead Zone", sGGSMData.fAnalogDeadZone, 0.1, 1.0, 0.1)
ADD_WIDGET_FLOAT_SLIDER("D-Pad Scalar", sGGSMData.fDPadScalar, 0.1, 1.0, 0.1)
ADD_WIDGET_INT_READ_ONLY("Stack Size", sGGSMData.iDebugCurrentStackSize)
ADD_WIDGET_FLOAT_READ_ONLY("Frame Time", sGGSMData.fDebugFrameTime)
ADD_WIDGET_FLOAT_SLIDER("Time Scale", sGGSMData.fTimeScale, 0.1, 1.0, 0.1)
START_WIDGET_GROUP("Client State")
ADD_WIDGET_BOOL("Change State", sGGSMData.bDebugChangeState)
GGSM_STATE_SELECTOR(sGGSMData.iDebugStateSelector)
GGSM_STATE_SELECTOR(sGGSMData.iDebugCurrentState, "Current State")
GGSM_SUBSTATE_SELECTOR(sGGSMData.iDebugCurrentSubstate, "Current SubState")
ADD_WIDGET_FLOAT_READ_ONLY("Timer", sGGSMData.fStateTimer)
ADD_WIDGET_FLOAT_SLIDER("Interpolator", sGGSMData.fStateInterpolateValue, 0.0, 1.0, 0.1)
STOP_WIDGET_GROUP()
#IF GGSM_DEBUG_TSHIRT_HELP
GGSM_CREATE_TSHIRT_DEBUG_WIDGET()
#ENDIF
GGSM_CAMERA_CREATE_DEBUG_WIDGET(sGGSMData.sCamera)
START_WIDGET_GROUP("Instances")
ADD_WIDGET_BOOL("Skip To Boss", sGGSMData.bDebugJumpToBoss)
ADD_WIDGET_BOOL("Kill All Enemies", sGGSMData.bDebugKillAllEnemies)
ADD_WIDGET_BOOL("Player Invunerable", sGGSMData.bDebugPlayerInvunerable)
ADD_WIDGET_INT_SLIDER("Spawn Index Counter", sGGSMData.iSpawnIndexCounter, 0, GGSM_MAX_SPAWN_DATA - 1, 1)
ADD_WIDGET_INT_SLIDER("Spawns Used", sGGSMData.iSpawnsUsed, 0, GGSM_MAX_SPAWN_DATA, 1)
ADD_WIDGET_INT_READ_ONLY("Player Ship Index", sGGSMData.iPlayerShipIndex)
START_WIDGET_GROUP("Entities")
REPEAT GGSM_MAX_ENTITIES i
txt = "Entity "
txt += i
GGSM_ENTITY_WIDGET(sGGSMData.sEntities[i], txt)
ENDREPEAT
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Projectiles")
REPEAT GGSM_MAX_PROJECTILES i
txt = "Projectile "
txt += i
GGSM_PROJECTILE_WIDGET(sGGSMData.sProjectiles[i], txt)
ENDREPEAT
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Entity Groups")
REPEAT GGSM_MAX_ENTITY_GROUPS i
txt = "Group "
txt += i
START_WIDGET_GROUP(txt)
ADD_WIDGET_INT_READ_ONLY("Leader", sGGSMData.sEntityGroup[i].iLeader)
ADD_WIDGET_INT_READ_ONLY("Active Count", sGGSMData.sEntityGroup[i].iActiveCount)
ADD_WIDGET_INT_READ_ONLY("Members Left To Create", sGGSMData.sEntityGroup[i].iMembersToCreate)
ADD_BIT_FIELD_WIDGET("Group Members", sGGSMData.sEntityGroup[i].iMemberBitSet)
ADD_BIT_FIELD_WIDGET("Group Members On Stage", sGGSMData.sEntityGroup[i].iMembersOnStageBitSet)
STOP_WIDGET_GROUP()
ENDREPEAT
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Boss Controllers")
REPEAT COUNT_OF(sGGSMData.sBossController) i
txt = "Boss Controller "
txt += i
GGSM_BOSS_CONTROLLER_CREATE_WIDGET(sGGSMData.sBossController[i], txt)
ENDREPEAT
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Rendering Counters")
ADD_WIDGET_INT_READ_ONLY("iRectsDrawnThisFrame", iRectsDrawnThisFrame)
ADD_WIDGET_INT_READ_ONLY("iSpritesDrawnThisFrame", iSpritesDrawnThisFrame)
ADD_WIDGET_INT_READ_ONLY("iDebugLinesDrawnThisFrame", iDebugLinesDrawnThisFrame)
ADD_WIDGET_FLOAT_READ_ONLY("Fade Alpha", sGGSMData.fFadeAlpha)
ADD_WIDGET_FLOAT_SLIDER("Fade Time", sGGSMData.fFadeTime, -5.0, 5.0, 0.125)
START_WIDGET_GROUP("Story")
GGSM_ADD_WIDGET_VECTOR_2D_SLIDER("Story Base Pos", sGGSMData.vStoryBasePos, -cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_WIDTH, 1)
ADD_WIDGET_FLOAT_SLIDER("Story Scroll Rate", sGGSMData.fStoryScrollRate, 0.0, 1600.0, 1.0)
ADD_WIDGET_FLOAT_SLIDER("Min Width", sGGSMData.fStoryMinWidth, 0.0, 2048.0, 1.0)
ADD_WIDGET_FLOAT_SLIDER("Max Width", sGGSMData.fStoryMaxWidth, 0.0, 2048.0, 1.0)
ADD_WIDGET_FLOAT_SLIDER("Fadeout Y-Pos", sGGSMData.fStoryFadeOutYPos, -cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_WIDTH, 1)
ADD_WIDGET_FLOAT_READ_ONLY("Story T", sGGSMData.fDebugStoryT)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Z Sort List")
REPEAT COUNT_OF(sGGSMData.sZSortData) i
txt = "Entry "
txt += i
START_WIDGET_GROUP(txt)
ADD_WIDGET_INT_READ_ONLY("Entity", sGGSMData.sZSortData[i].iEntityIndex)
ADD_WIDGET_INT_READ_ONLY("Depth", sGGSMData.sZSortData[i].iZDepth)
STOP_WIDGET_GROUP()
ENDREPEAT
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Stats")
ADD_WIDGET_BOOL("Set Stage", sGGSMData.bDebugSetStage)
ADD_WIDGET_BOOL("Force Default Leaderboard", sAGLeaderboardData.bForceDefaultLeaderboard)
ADD_WIDGET_INT_SLIDER("Stage", sGGSMData.sGameStats.level, 0, 10, 1)
ADD_WIDGET_INT_SLIDER("Lives", sGGSMData.iPlayerLives, 0, 99, 1)
ADD_WIDGET_INT_READ_ONLY("Score", sGGSMData.sGameStats.score)
ADD_WIDGET_INT_READ_ONLY("Kill Streak", sGGSMData.iKillStreak)
ADD_WIDGET_FLOAT_READ_ONLY("Kill Streak Timer", sGGSMData.fKillStreakTimer)
ADD_WIDGET_FLOAT_READ_ONLY("Chain Multiplier", sGGSMData.fChainMultiplier)
ADD_WIDGET_FLOAT_SLIDER("Time Per Frame", sGGSMData.fScrollTimePerFrame, 0.010, 0.050, 0.001)
ADD_WIDGET_INT_READ_ONLY("Extend Point Counter", sGGSMData.iExtendPtsCounter)
ADD_WIDGET_INT_READ_ONLY("Enemies Created", sGGSMData.iEnemiesCreated)
ADD_WIDGET_INT_READ_ONLY("Enemies Destroyed", sGGSMData.iEnemiesDestroyed)
ADD_WIDGET_INT_READ_ONLY("Entities Active", sGGSMData.iEntitiesActive)
ADD_WIDGET_INT_READ_ONLY("Groups Active", sGGSMData.iGroupsActive)
ADD_WIDGET_INT_READ_ONLY("Enemy Projectiles Active", sGGSMData.iEnemyProjectilesActive)
ADD_WIDGET_INT_READ_ONLY("Total Projectiles Active", sGGSMData.iProjectilesActive)
ADD_WIDGET_INT_READ_ONLY("Max Entities Active", sGGSMData.iMaxEntitiesActive)
ADD_WIDGET_INT_READ_ONLY("Max Groups Active", sGGSMData.iMaxGroupsActive)
ADD_WIDGET_INT_READ_ONLY("Max Projectiles Active", sGGSMData.iMaxProjectilesActive)
START_WIDGET_GROUP("Graze")
ADD_WIDGET_INT_READ_ONLY("Graze", sGGSMData.iGraze)
ADD_WIDGET_FLOAT_READ_ONLY("Graze Timer", sGGSMData.fGrazeTimer)
ADD_WIDGET_FLOAT_SLIDER("Graze Timer", sGGSMData.fGrazeTime, 0.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("Graze Radius", sGGSMData.fGrazeRadius, 0.0, 128.0, 1.0)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Game Stats")
ADD_WIDGET_INT_READ_ONLY("Game Type", sGGSMData.sGameStats.gameType)
ADD_WIDGET_INT_READ_ONLY("Match ID", sGGSMData.sGameStats.matchId)
ADD_WIDGET_INT_READ_ONLY("# Players", sGGSMData.sGameStats.numPlayers)
ADD_WIDGET_INT_READ_ONLY("Level", sGGSMData.sGameStats.level)
ADD_WIDGET_INT_READ_ONLY("Power Ups", sGGSMData.sGameStats.powerUps)
ADD_WIDGET_INT_READ_ONLY("Kills", sGGSMData.sGameStats.kills)
ADD_WIDGET_INT_READ_ONLY("Time Played", sGGSMData.sGameStats.timePlayed)
ADD_WIDGET_INT_READ_ONLY("Score", sGGSMData.sGameStats.score)
ADD_WIDGET_INT_READ_ONLY("Reward", sGGSMData.sGameStats.reward)
ADD_WIDGET_INT_READ_ONLY("Challenges", sGGSMData.sGameStats.challenges)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ARCADE_GAMES_POSTFX_WIDGET_CREATE()
START_WIDGET_GROUP("Debug Stuff")
ADD_WIDGET_BOOL("Show Spawn Debug", sGGSMData.bShowSpawnDebug)
ADD_WIDGET_BOOL("Disable Post FX", sGGSMData.bDebugDisablePostFX)
#IF GGSM_ENTITY_EDITOR_ACTIVE
ADD_WIDGET_BOOL("Entity Editor Active", sGGSMData.sDebugEntityEditor.sEditCore.bEditorActive)
#ENDIF
#IF GGSM_SPAWN_EDITOR_ACTIVE
ADD_WIDGET_BOOL("Spawn Editor Active", sGGSMData.sDebugSpawnEditor.sEditCore.bEditorActive)
#ENDIF
#IF GGSM_TILEMAP_EDITOR_ACTIVE
ADD_WIDGET_BOOL("Tilemap Editor Active", sGGSMData.sDebugMapEditor.sEditCore.bEditorActive)
#ENDIF
#IF GGSM_SOUND_TEST
ARCADE_GAMES_SOUND_WIDGET_CREATE()
#ENDIF
#IF GGSM_CHALLENGE_DEBUG
GGSM_CREATE_CHALLENGE_DEBUG_WIDGET()
#ENDIF
ADD_WIDGET_BOOL("bDebugCreatePowerUp", sGGSMData.bDebugCreatePowerUp)
START_WIDGET_GROUP("Debug Rect")
ADD_WIDGET_BOOL("Show Rect", sGGSMData.bDrawDebugRect)
ADD_WIDGET_BOOL("Center Mode", sGGSMData.bDebugRectCenterMode)
GGSM_ADD_WIDGET_VECTOR_2D_SLIDER("Top Left (Center)", sGGSMData.vDebugRect[0], -cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_WIDTH, 10)
GGSM_ADD_WIDGET_VECTOR_2D_SLIDER("Base Right (HalfSize)", sGGSMData.vDebugRect[1], -cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_WIDTH, 10)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
CLEAR_CURRENT_WIDGET_GROUP(sGGSMData.widgetGroupExample)
sGGSMData.bDebugCreatedWidgets = TRUE
ENDPROC
/// PURPOSE:
/// Dumps the current state of the game to the logs
/// Automatically called when a bug is entered
PROC GGSM_DEBUG_DUMP_DATA_TO_LOGS()
ARCADE_CABINET_DUMP_DATA_TO_CONSOLE()
GGSM_TO_LOG()
sGGSMData.bDebugDumpToLogs = FALSE
ENDPROC
/// PURPOSE:
/// Update Debug Processing
PROC GGSM_DEBUG_PROCESSING()
INT i
VECTOR_2D rc, rs
RGBA_COLOUR_STRUCT rcol
GGSM_DEBUG_CREATE_WIDGETS()
sGGSMData.fDebugFrameTime = GET_FRAME_TIME()
sGGSMData.iDebugCurrentStackSize = GET_CURRENT_STACK_SIZE()
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
//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)
OR sGGSMData.bDebugDumpToLogs
GGSM_DEBUG_DUMP_DATA_TO_LOGS()
ENDIF
IF (sGGSMData.bDebugChangeState)
GGSM_SET_CLIENT_STATE(INT_TO_ENUM(GGSM_STATE, sGGSMData.iDebugStateSelector))
sGGSMData.bDebugChangeState = FALSE
ENDIF
sGGSMData.fDebugStoryT = GGSM_CALCULATE_T_FOR_STORY_POS(sGGSMData.vStoryBasePos.y)
sGGSMData.iDebugCurrentState = ENUM_TO_INT(sGGSMData.eState)
sGGSMData.iDebugCurrentSubstate = ENUM_TO_INT(sGGSMData.eSubState)
IF (sGGSMData.bDebugCreatePowerUp)
GGSM_CREATE_POWER_UP(INT_TO_ENUM(GGSM_SPRITE_TYPE, GET_RANDOM_INT_IN_RANGE(ENUM_TO_INT(GGSM_SPRITE_POWER_UP_BEAM), ENUM_TO_INT(GGSM_SPRITE_POWER_UP_WAVE) + 1)), sGGSMData.sPowerUp)
sGGSMData.bDebugCreatePowerUp = FALSE
ENDIF
IF (sGGSMData.bDebugSetStage)
GGSM_SET_CLIENT_STATE(GGSM_STATE_STAGE_SELECT)
sGGSMData.bDebugSetStage = FALSE
ENDIF
REPEAT COUNT_OF(sGGSMData.sBossController) i
IF (sGGSMData.sBossController[i].bDebugSetState)
GGSM_BOSS_CONTROLLER_SET_STATE(sGGSMData.sBossController[i], INT_TO_ENUM(GGSM_BOSS_STATE, sGGSMData.sBossController[i].iDebugSetState))
sGGSMData.sBossController[i].bDebugSetState = FALSE
ENDIF
sGGSMData.sBossController[i].iCurrentState = ENUM_TO_INT(sGGSMData.sBossController[i].eState)
ENDREPEAT
#IF GGSM_CHALLENGE_DEBUG
GGSM_UPDATE_CHALLENGE_DEBUG_WIDGET()
#ENDIF
#IF GGSM_DEBUG_TSHIRT_HELP
GGSM_UPDATE_TSHIRT_DEBUG_WIDGET()
#ENDIF
#IF GGSM_ENTITY_EDITOR_ACTIVE
GGSM_ENTITY_EDITOR_WIDGET_UPDATE(sGGSMData.sDebugEntityEditor)
#ENDIF
#IF GGSM_SPAWN_EDITOR_ACTIVE
GGSM_SPAWN_EDITOR_WIDGET_UPDATE(sGGSMData.sDebugSpawnEditor)
#ENDIF
#IF GGSM_TILEMAP_EDITOR_ACTIVE
GGSM_TILEMAP_EDITOR_WIDGET_UPDATE(sGGSMData.sDebugMapEditor, sGGSMData.sTileMap)
#ENDIF
#IF GGSM_SOUND_TEST
ARCADE_GAMES_SOUND_WIDGET_CREATE()
#ENDIF
IF (sGGSMData.bDrawDebugRect)
INIT_RGBA_STRUCT(rcol, 255, 255, 255, 64)
IF (sGGSMData.bDebugRectCenterMode = FALSE)
rs.x = sGGSMData.vDebugRect[1].x - sGGSMData.vDebugRect[0].x
rs.y = sGGSMData.vDebugRect[1].y - sGGSMData.vDebugRect[0].y
rc.x = sGGSMData.vDebugRect[0].x + (rs.x / 2.0)
rc.y = sGGSMData.vDebugRect[0].y + (rs.y / 2.0)
ARCADE_DRAW_PIXELSPACE_RECT(rc, rs, rcol)
ELSE
ARCADE_DRAW_PIXELSPACE_RECT(sGGSMData.vDebugRect[0], sGGSMData.vDebugRect[1], rcol)
ENDIF
ENDIF
IF (sGGSMData.bDebugJumpToBoss)
i = sGGSMData.iSpawnsUsed - 1
sGGSMData.iSpawnIndexCounter = i
sGGSMData.bDebugKillAllEnemies = TRUE
GGSM_CAMERA_JUMP_TO_DISTANCE(sGGSMData.sCamera, sGGSMData.sSpawnData[i].fScrollDistance)
sGGSMData.bDebugJumpToBoss = FALSE
ENDIF
IF (sGGSMData.bDebugKillAllEnemies)
GGSM_ENTITY_EXPLODE_ARRAY(sGGSMData.sEntities, FALSE)
sGGSMData.bDebugKillAllEnemies = FALSE
ENDIF
IF (sGGSMData.bDebugPlayerInvunerable)
GGSM_SET_PLAYER_INVUNERABLE()
ENDIF
IF (sGGSMData.bShowSpawnDebug)
GGSM_DRAW_SPAWN_DEBUG()
ENDIF
ENDPROC
#ENDIF
//-------------------------------------------------
// PER FRAME UPDATES
//-------------------------------------------------
/// PURPOSE:
/// Handles Script Events
PROC GGSM_PROCESS_SCRIPT_EVENTS()
ENDPROC
/// PURPOSE:
/// Run every frame before the client state machine is processed
PROC GGSM_PRE_UPDATE()
IF sGGSMData.eState >= GGSM_STATE_CLEANUP
// Cleaning up, don't do anything
EXIT
ENDIF
IF NOT IS_SKYSWOOP_AT_GROUND()
GGSM_SET_CLIENT_STATE(GGSM_STATE_CLEANUP)
EXIT
ENDIF
GGSM_UPDATE_MAIN_TIMERS()
GGSM_PROCESS_SCRIPT_EVENTS()
GGSM_UPDATE_AVATAR()
ARCADE_GAMES_LEADERBOARD_PROCESS_EVENTS()
ARCADE_GAMES_LEADERBOARD_LOAD(CASINO_ARCADE_GAME_GO_GO_SPACE_MONKEY_3)
ARCADE_GAMES_HELP_TEXT_PRE_UPDATE()
BOOL bIsPlaying = (sGGSMData.eState >= GGSM_STATE_PLAYING)
ARCADE_CABINET_COMMON_EVERY_FRAME_PROCESSING(bIsPlaying)
ENDPROC
/// PURPOSE:
/// Run every frame after the client state machine is processed
PROC GGSM_POST_UPDATE()
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_GGSM()
GGSM_PRE_UPDATE()
GGSM_PROCESS_CLIENT_STATE_MACHINE()
GGSM_POST_UPDATE()
#IF IS_DEBUG_BUILD
GGSM_DEBUG_PROCESSING()
#ENDIF
ENDPROC