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

2478 lines
76 KiB
Scheme
Executable File

//-------------------------------------------------
// File: ggsm_arcade_helper.sch
// Purpose: general functions required by system
//-------------------------------------------------
//-------------------------------------------------
// INCLUDES
//-------------------------------------------------
USING "ggsm_structs.sch"
USING "ggsm_maths.sch"
USING "ggsm_data.sch"
USING "arcade_games_help_text_flow.sch"
USING "net_arcade_cabinet.sch"
//-------------------------------------------------
// SOUND FUNCTIONS
//-------------------------------------------------
FUNC BOOL GGSM_IS_SOUND_LOOPED(ARCADE_GAMES_SOUND eSound)
SWITCH (eSound)
CASE ARCADE_GAMES_SOUND_GGSM_BOSS_GRAN_ATTACK_EYE_LASER_CHARGE_LOOP
CASE ARCADE_GAMES_SOUND_GGSM_ABIL_PLAYER_DECOY_LOOP
RETURN TRUE
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC GGSM_START_AUDIO_SCENE(STRING str)
IF NOT IS_AUDIO_SCENE_ACTIVE(str)
START_AUDIO_SCENE(str)
ENDIF
ENDPROC
PROC GGSM_STOP_AUDIO_SCENE(STRING str)
IF IS_AUDIO_SCENE_ACTIVE(str)
STOP_AUDIO_SCENE(str)
ENDIF
ENDPROC
FUNC BOOL GGSM_PLAY_SOUND(ARCADE_GAMES_SOUND eSound)
IF (eSound = ARCADE_GAMES_SOUND_END)
RETURN FALSE
ENDIF
#IF IS_DEBUG_BUILD
IF sGGSMData.bDebugDisableSFX
RETURN FALSE
ENDIF
#ENDIF
ARCADE_GAMES_SOUND_PLAY(eSound)
ARCADE_GAMES_SOUND_SET_VARIABLE(eSound, "Screen_Position", 0.5)
RETURN TRUE
ENDFUNC
FUNC BOOL GGSM_PLAY_SOUND_FROM_POSITION(ARCADE_GAMES_SOUND eSound, VECTOR_2D vPos)
IF (eSound = ARCADE_GAMES_SOUND_END)
RETURN FALSE
ENDIF
#IF IS_DEBUG_BUILD
IF sGGSMData.bDebugDisableSFX
RETURN FALSE
ENDIF
#ENDIF
FLOAT sp = ((vPos.x - GGSM_PX_OVERSCAN_MIN_X) / GGSM_PX_OVERSCAN_WIDTH)
sp = CLAMP(sp, 0.0, 1.0)
ARCADE_GAMES_SOUND_PLAY(eSound)
ARCADE_GAMES_SOUND_SET_VARIABLE(eSound, "Screen_Position", sp)
RETURN TRUE
ENDFUNC
FUNC BOOL GGSM_TRIGGER_MUSIC_EVENT(STRING str)
BOOL bOk = TRIGGER_MUSIC_EVENT(str)
CPRINTLN(DEBUG_MINIGAME, "GGSM_TRIGGER_MUSIC_EVENT:", str)
RETURN bOk
ENDFUNC
FUNC BOOL GGSM_TRIGGER_MUSIC_EVENT_FOR_STAGE(INT iStage)
SWITCH (iStage)
CASE 0 RETURN GGSM_TRIGGER_MUSIC_EVENT("ARCADE_SM_LVL_1_START")
CASE 1 RETURN GGSM_TRIGGER_MUSIC_EVENT("ARCADE_SM_LVL_2_START")
CASE 2 RETURN GGSM_TRIGGER_MUSIC_EVENT("ARCADE_SM_LVL_3_START")
CASE 3 RETURN GGSM_TRIGGER_MUSIC_EVENT("ARCADE_SM_LVL_4_START")
CASE 4 RETURN GGSM_TRIGGER_MUSIC_EVENT("ARCADE_SM_LVL_5_START")
CASE 5 RETURN GGSM_TRIGGER_MUSIC_EVENT("ARCADE_SM_BOSS_START")
ENDSWITCH
RETURN FALSE
ENDFUNC
//-------------------------------------------------
// FADE FUNCTIONS
//-------------------------------------------------
PROC GGSM_FADE_SCREEN_OUT(FLOAT fTime = 0.5)
sGGSMData.fFadeTime = fTime
ENDPROC
PROC GGSM_FADE_SCREEN_OUT_INSTANT()
sGGSMData.fFadeTime = 0.001
sGGSMData.fFadeAlpha = 1.0
ENDPROC
PROC GGSM_FADE_SCREEN_IN(FLOAT fTime = 0.5)
sGGSMData.fFadeTime = -fTime
ENDPROC
FUNC BOOL GGSM_IS_SCREEN_FADED_OUT()
RETURN (sGGSMData.fFadeAlpha = 1.0)
ENDFUNC
FUNC BOOL GGSM_IS_SCREEN_FADED_IN()
RETURN (sGGSMData.fFadeAlpha = 0.0)
ENDFUNC
PROC GGSM_FAKE_FADE_SCREEN_OUT(FLOAT fTime = 0.5)
sGGSMData.fFakeFadeTime = fTime
ENDPROC
PROC GGSM_FAKE_FADE_SCREEN_IN(FLOAT fTime = 0.5)
sGGSMData.fFakeFadeTime = -fTime
ENDPROC
FUNC BOOL GGSM_IS_SCREEN_FAKE_FADED_OUT()
RETURN (sGGSMData.fFakeFadeAlpha = 1.0)
ENDFUNC
FUNC BOOL GGSM_IS_SCREEN_FAKE_FADED_IN()
RETURN (sGGSMData.fFakeFadeAlpha = 0.0)
ENDFUNC
PROC GGSM_CLEAR_FAKE_FADE()
sGGSMData.fFakeFadeAlpha = 0.0
sGGSMData.fFakeFadeTime = 0.0
ENDPROC
PROC GGSM_CLEAR_WHITE_OUT()
sGGSMData.fWhiteOutAlpha = 0.0
sGGSMData.fWhiteOutFadeTime = 0.0
ENDPROC
PROC GGSM_FADE_TO_WHITE(FLOAT fTime = 0.5)
sGGSMData.fWhiteOutFadeTime = fTime
ENDPROC
PROC GGSM_FADE_FROM_WHITE(FLOAT fTime = 0.5)
sGGSMData.fWhiteOutFadeTime = -fTime
ENDPROC
FUNC BOOL GGSM_IS_SCREEN_WHITED_OUT()
RETURN (sGGSMData.fWhiteOutAlpha = 1.0)
ENDFUNC
FUNC BOOL GGSM_IS_SCREEN_WHITED_IN()
RETURN (sGGSMData.fWhiteOutAlpha = 0.0)
ENDFUNC
PROC GGSM_NUKE_WHITE_INSTANT()
sGGSMData.fWhiteOutFadeTime = -1.0
sGGSMData.fWhiteOutAlpha = 1.0
ENDPROC
//-------------------------------------------------
// PC CONTROLS FUNCTIONS
//-------------------------------------------------
PROC GGSM_PC_CONTROLS_INIT()
IF !sGGSMData.bHasInitPCControls
INIT_PC_SCRIPTED_CONTROLS("Arcade_Go_Go_Space_Monkey")
sGGSMData.bHasInitPCControls = TRUE
ENDIF
ENDPROC
PROC GGSM_PC_CONTROLS_CLEANUP()
IF sGGSMData.bHasInitPCControls
SHUTDOWN_PC_SCRIPTED_CONTROLS()
sGGSMData.bHasInitPCControls = FALSE
ENDIF
ENDPROC
//-------------------------------------------------
// ANIM FUNCTIONS
//-------------------------------------------------
PROC GGSM_PLAY_AVATAR_LOST_LIFE_ANIM()
ARCADE_CABINET_ANIM_EVENT_STRUCT sArcadeCabinetAnimEvent
sArcadeCabinetAnimEvent.bHoldLastFrame = FALSE
sArcadeCabinetAnimEvent.bLoopAnim = FALSE
sGGSMData.eAvatarClip = ARCADE_CABINET_ANIM_CLIP_LOSE
sGGSMData.iAvatarClipFrames = 0
PLAY_ARCADE_CABINET_ANIMATION(sArcadeCabinetAnimEvent, sGGSMData.eAvatarClip)
ENDPROC
PROC GGSM_PLAY_AVATAR_GAME_OVER_ANIM()
ARCADE_CABINET_ANIM_EVENT_STRUCT sArcadeCabinetAnimEvent
sArcadeCabinetAnimEvent.bHoldLastFrame = FALSE
sArcadeCabinetAnimEvent.bLoopAnim = FALSE
sGGSMData.eAvatarClip = ARCADE_CABINET_ANIM_CLIP_LOSE_BIG
sGGSMData.iAvatarClipFrames = 0
PLAY_ARCADE_CABINET_ANIMATION(sArcadeCabinetAnimEvent, sGGSMData.eAvatarClip)
ENDPROC
PROC GGSM_PLAY_AVATAR_BOSS_DEAD_ANIM()
ARCADE_CABINET_ANIM_EVENT_STRUCT sArcadeCabinetAnimEvent
sArcadeCabinetAnimEvent.bHoldLastFrame = FALSE
sArcadeCabinetAnimEvent.bLoopAnim = FALSE
sGGSMData.eAvatarClip = ARCADE_CABINET_ANIM_CLIP_WIN
sGGSMData.iAvatarClipFrames = 0
PLAY_ARCADE_CABINET_ANIMATION(sArcadeCabinetAnimEvent, sGGSMData.eAvatarClip)
ENDPROC
PROC GGSM_PLAY_AVATAR_ALL_CLEAR_ANIM()
ARCADE_CABINET_ANIM_EVENT_STRUCT sArcadeCabinetAnimEvent
sArcadeCabinetAnimEvent.bHoldLastFrame = FALSE
sArcadeCabinetAnimEvent.bLoopAnim = FALSE
sGGSMData.eAvatarClip = ARCADE_CABINET_ANIM_CLIP_WIN_BIG
sGGSMData.iAvatarClipFrames = 0
PLAY_ARCADE_CABINET_ANIMATION(sArcadeCabinetAnimEvent, sGGSMData.eAvatarClip)
ENDPROC
PROC GGSM_PLAY_AVATAR_IDLE_ANIM()
ARCADE_CABINET_ANIM_EVENT_STRUCT sArcadeCabinetAnimEvent
sArcadeCabinetAnimEvent.bHoldLastFrame = FALSE
sArcadeCabinetAnimEvent.bLoopAnim = TRUE
sGGSMData.eAvatarClip = ARCADE_CABINET_ANIM_CLIP_IDLE
sGGSMData.iAvatarClipFrames = 0
PLAY_ARCADE_CABINET_ANIMATION(sArcadeCabinetAnimEvent, sGGSMData.eAvatarClip)
ENDPROC
PROC GGSM_PLAY_AVATAR_PLAY_IDLE_ANIM(ARCADE_CABINET_ANIM_CLIPS eClip = ARCADE_CABINET_ANIM_CLIP_PLAY_IDLE)
ARCADE_CABINET_ANIM_EVENT_STRUCT sArcadeCabinetAnimEvent
sArcadeCabinetAnimEvent.bHoldLastFrame = FALSE
sArcadeCabinetAnimEvent.bLoopAnim = FALSE
sGGSMData.eAvatarClip = eClip
sGGSMData.iAvatarClipFrames = 0
PLAY_ARCADE_CABINET_ANIMATION(sArcadeCabinetAnimEvent, sGGSMData.eAvatarClip)
ENDPROC
PROC GGSM_PLAY_AVATAR_PLAY_RANDOM_IDLE_ANIM()
ARCADE_CABINET_ANIM_CLIPS eClip
// If already doing PlayIdle, alternate variation
IF sGGSMData.eAvatarClip = ARCADE_CABINET_ANIM_CLIP_PLAY_IDLE
eClip = ARCADE_CABINET_ANIM_CLIP_PLAY_IDLE_V2
ELIF sGGSMData.eAvatarClip = ARCADE_CABINET_ANIM_CLIP_PLAY_IDLE_V2
eClip = ARCADE_CABINET_ANIM_CLIP_PLAY_IDLE
// Otherwise, pick random variation
ELSE
IF GET_RANDOM_BOOL()
eClip = ARCADE_CABINET_ANIM_CLIP_PLAY_IDLE
ELSE
eClip = ARCADE_CABINET_ANIM_CLIP_PLAY_IDLE_V2
ENDIF
ENDIF
GGSM_PLAY_AVATAR_PLAY_IDLE_ANIM(eClip)
ENDPROC
PROC GGSM_PLAY_AVATAR_LEAVE_MACHINE_ANIM()
ARCADE_CABINET_ANIM_EVENT_STRUCT sArcadeCabinetAnimEvent
sArcadeCabinetAnimEvent.bHoldLastFrame = FALSE
sArcadeCabinetAnimEvent.bLoopAnim = FALSE
sGGSMData.eAvatarClip = ARCADE_CABINET_ANIM_CLIP_EXIT
sGGSMData.iAvatarClipFrames = 0
PLAY_ARCADE_CABINET_ANIMATION(sArcadeCabinetAnimEvent, sGGSMData.eAvatarClip)
ENDPROC
PROC GGSM_UPDATE_AVATAR()
sGGSMData.iAvatarClipFrames++
// If current anim has finished...
IF sGGSMData.iAvatarClipFrames > 5
IF !IS_PLAYER_PLAYING_THIS_ARCADE_CABINET_ANIMATION_CLIP(sGGSMData.eAvatarClip)
OR HAS_ARCADE_CABINET_ANIMATION_CLIP_FINISHED(sGGSMData.eAvatarClip)
SWITCH sGGSMData.eAvatarClip
// PlayIdle proceeds to PlayIdle (randomises variation each time)
CASE ARCADE_CABINET_ANIM_CLIP_PLAY_IDLE
CASE ARCADE_CABINET_ANIM_CLIP_PLAY_IDLE_V2
GGSM_PLAY_AVATAR_PLAY_RANDOM_IDLE_ANIM()
BREAK
// Lose proceeds to PlayIdle (as player is immediately returned to current stage)
CASE ARCADE_CABINET_ANIM_CLIP_LOSE
GGSM_PLAY_AVATAR_PLAY_RANDOM_IDLE_ANIM()
BREAK
// Win proceeds to Idle (most bosses), or PlayIdle (boss rush - but not on final boss yet, because that would have done BigWin)
CASE ARCADE_CABINET_ANIM_CLIP_WIN
IF sGGSMData.sGameStats.level = GGSM_SECTOR_BANANASTAR
GGSM_PLAY_AVATAR_PLAY_RANDOM_IDLE_ANIM()
ELSE
GGSM_PLAY_AVATAR_IDLE_ANIM()
ENDIF
BREAK
// Win/BigWin/BigLose proceed to Idle (as game has ended, or between stages)
CASE ARCADE_CABINET_ANIM_CLIP_WIN_BIG
CASE ARCADE_CABINET_ANIM_CLIP_LOSE_BIG
GGSM_PLAY_AVATAR_IDLE_ANIM()
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
//-------------------------------------------------
// MISC FUNCTIONS
//-------------------------------------------------
PROC GGSM_RESET_GAME_STATS()
CDEBUG1LN(DEBUG_MINIGAME, "GGSM_RESET_GAME_STATS")
sGGSMData.sGameStats.gameType = HASH("ARCADE_CABINET_CH_GG_SPACE_MONKEY")
sGGSMData.sGameStats.matchId = 0
sGGSMData.sGameStats.numPlayers = 1
sGGSMData.sGameStats.level = GGSM_SECTOR_FIRST
sGGSMData.sGameStats.powerUps = 0
sGGSMData.sGameStats.kills = 0
sGGSMData.sGameStats.timePlayed = GET_GAME_TIMER()
sGGSMData.sGameStats.score = 0
sGGSMData.sGameStats.reward = 0
sGGSMData.sGameStats.challenges = 0
sGGSMData.iPlayerLives = 3
ENDPROC
PROC GGSM_SEND_PLAYSTATS()
CDEBUG1LN(DEBUG_MINIGAME, "GGSM_SEND_PLAYSTATS")
sGGSMData.sGameStats.level = sGGSMData.sGameStats.level
sGGSMData.sGameStats.timePlayed = GET_GAME_TIMER() - sGGSMData.sGameStats.timePlayed
sGGSMData.sGameStats.challenges = ENUM_TO_INT(sGGSMData.eChallengeFlags)
IF sGGSMData.bTrophyUnlockedThisSession
sGGSMData.sGameStats.reward = ARCADE_GAME_GET_TROPHY_ID_FOR_TELEMETRY(ARCADE_GAME_TROPHY_GGSM)
ELSE
sGGSMData.sGameStats.reward = 0
ENDIf
IF PLAYER_ID() != INVALID_PLAYER_INDEX()
IF IS_PLAYER_IN_ARCADE_PROPERTY(PLAYER_ID())
sGGSMData.sGameStats.location = ENUM_TO_INT(GET_ARCADE_PROPERTY_ID_FROM_SIMPLE_INTERIOR_ID(GlobalPlayerBD[NATIVE_TO_INT(PLAYER_ID())].SimpleInteriorBD.eCurrentSimpleInterior))
#IF FEATURE_FIXER
ELIF IS_PLAYER_IN_FIXER_HQ(PLAYER_ID())
sGGSMData.sGameStats.location = HASH("SIMPLE_INTERIOR_TYPE_FIXER_HQ")
#ENDIF
ELSE
CDEBUG1LN(DEBUG_MINIGAME, "[GGSM_HELPERS] [GGSM_SEND_PLAYSTATS] Not in valid location, setting sGGSMData.sGameStats.location = 0")
sGGSMData.sGameStats.location = 0
ENDIF
ELSE
CDEBUG1LN(DEBUG_MINIGAME, "[GGSM_HELPERS] [GGSM_SEND_PLAYSTATS] Invalid Player ID, setting sGGSMData.sGameStats.location = 0")
sGGSMData.sGameStats.location = 0
ENDIF
PLAYSTATS_ARCADE_CABINET(sGGSMData.sGameStats)
ENDPROC
FUNC BOOL GGSM_IS_GAME_PLAYING()
RETURN (sGGSMData.eState >= GGSM_STATE_PLAYING) AND (sGGSMData.eState <= GGSM_STATE_GAME_OVER)
ENDFUNC
FUNC BOOL GGSM_IS_GAME_ACTIVELY_PLAYING()
RETURN (sGGSMData.eState >= GGSM_STATE_STAGE_SELECT) AND (sGGSMData.eState <= GGSM_STATE_GAME_OVER)
ENDFUNC
/// PURPOSE:
/// Updates the values used for animating sprite sequences
PROC GGSM_UPDATE_MAIN_TIMERS()
sGGSMData.fDeltaTime = GET_FRAME_TIME()
sGGSMData.fStateTimer += sGGSMData.fDeltaTime
ENDPROC
PROC GGSM_INIT_GLOBALS()
sGGSMData.sQuitTimer.control = FRONTEND_CONTROL
sGGSMData.sQuitTimer.action = INPUT_FRONTEND_CANCEL
sGGSMData.sStartBtnTimer.control = FRONTEND_CONTROL
sGGSMData.sStartBtnTimer.action = INPUT_FRONTEND_SELECT
INIT_RGBA_STRUCT(sGGSMData.rgbaBlack, 0, 0, 0, 255)
INIT_RGBA_STRUCT(sGGSMData.rgbaBGSprite, 64, 64, 64, 255)
INIT_RGBA_STRUCT(sGGSMData.rgbaSprite, 208, 208, 208, 255)
INIT_RGBA_STRUCT(sGGSMData.rgbaWhite, 255, 255, 255, 255)
GGSM_RESET_GAME_STATS()
#IF IS_DEBUG_BUILD
#IF GGSM_ENTITY_EDITOR_ACTIVE
GGSM_ENTITY_DATA_INIT_DEBUG_ARRAY()
#ENDIF
#ENDIF
ENDPROC
PROC GGSM_UNLOCK_PRIZE(GGSM_UNLOCK_TYPE eType)
SWITCH (eType)
CASE GGSM_UNLOCK_TSHIRTS_GGSM_ASTEROID
ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TSHIRT_HELP(ARCADE_GAME_TSHIRTS_GGSM_ASTEROID)
BREAK
CASE GGSM_UNLOCK_TSHIRTS_GGSM_CLOCKEDIT
ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TSHIRT_HELP(ARCADE_GAME_TSHIRTS_GGSM_CLOCKEDIT)
BREAK
CASE GGSM_UNLOCK_TSHIRTS_GGSM_NUKE
ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TSHIRT_HELP(ARCADE_GAME_TSHIRTS_GGSM_NUKE)
BREAK
CASE GGSM_UNLOCK_TSHIRTS_GGSM_SCORE
ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TSHIRT_HELP(ARCADE_GAME_TSHIRTS_GGSM_SCORE)
BREAK
CASE GGSM_UNLOCK_TSHIRTS_GGSM_COMPLETE
ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TSHIRT_HELP(ARCADE_GAME_TSHIRTS_GGSM_COMPLETE)
BREAK
CASE GGSM_UNLOCK_TSHIRTS_GGSM_NODAMAGE
ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TSHIRT_HELP(ARCADE_GAME_TSHIRTS_GGSM_NODAMAGE)
BREAK
CASE GGSM_UNLOCK_TROPHY
ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TROPHY_HELP(ARCADE_GAME_TROPHY_GGSM, FALSE)
BREAK
CASE GGSM_UNLOCK_TROPHY_PENTHOUSE
ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TROPHY_HELP(ARCADE_GAME_TROPHY_GGSM, TRUE)
BREAK
DEFAULT
EXIT
BREAK
ENDSWITCH
SET_BIT(sGGSMData.iUnlockedBitField, ENUM_TO_INT(eType))
CDEBUG1LN(DEBUG_MINIGAME, "GGSM_UNLOCK_PRIZE:", GGSM_UNLOCK_TYPE_TO_STRING(eType), " UNLOCK BITSET:", sGGSMData.iUnlockedBitField)
ENDPROC
PROC GGSM_RESET_CHALLENGES()
sGGSMData.eChallengeFlags = GGSM_CHALLENGE_BIT_NONE
sGGSMData.iUnlockedBitField = 0
SET_MP_BOOL_CHARACTER_AWARD(MP_AWARD_APEESCAPE, FALSE)
SET_MP_BOOL_CHARACTER_AWARD(MP_AWARD_MONKEYKIND, FALSE)
SET_MP_INT_CHARACTER_AWARD(MP_AWARD_ASTROCHIMP, 0)
SET_MP_INT_CHARACTER_STAT(MP_STAT_ARCADE_HELP_BITSET, 0)
SET_MP_INT_CHARACTER_STAT(MP_STAT_ARCADE_HELP_BITSETTWO, 0)
ENDPROC
FUNC BOOL GGSM_ARE_ALL_CHALLENGES_COMPLETE()
IF NOT GET_MP_BOOL_CHARACTER_AWARD(MP_AWARD_MONKEYKIND)
RETURN FALSE
ENDIF
IF NOT GET_MP_BOOL_CHARACTER_AWARD(MP_AWARD_APEESCAPE)
RETURN FALSE
ENDIF
IF (GET_MP_INT_CHARACTER_AWARD(MP_AWARD_ASTROCHIMP) < g_sMPTunables.iCH_ARCADE_GAMES_GGSM_ASTROCHIMP_P_SCORE)
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
PROC GGSM_SET_CHALLENGE_BITS_FROM_AWARDS()
sGGSMData.eChallengeFlags = GGSM_CHALLENGE_BIT_NONE
IF GET_MP_BOOL_CHARACTER_AWARD(MP_AWARD_MONKEYKIND)
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.eChallengeFlags, GGSM_CHALLENGE_BIT_MONKEY_MIND)
ENDIF
IF GET_MP_BOOL_CHARACTER_AWARD(MP_AWARD_APEESCAPE)
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.eChallengeFlags, GGSM_CHALLENGE_BIT_APE_ESCAPE)
ENDIF
IF (GET_MP_INT_CHARACTER_AWARD(MP_AWARD_ASTROCHIMP) >= g_sMPTunables.iCH_ARCADE_GAMES_GGSM_ASTROCHIMP_B_SCORE)
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.eChallengeFlags, GGSM_CHALLENGE_BIT_ASTROCHIMP_B)
ENDIF
IF (GET_MP_INT_CHARACTER_AWARD(MP_AWARD_ASTROCHIMP) >= g_sMPTunables.iCH_ARCADE_GAMES_GGSM_ASTROCHIMP_S_SCORE)
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.eChallengeFlags, GGSM_CHALLENGE_BIT_ASTROCHIMP_S)
ENDIF
IF (GET_MP_INT_CHARACTER_AWARD(MP_AWARD_ASTROCHIMP) >= g_sMPTunables.iCH_ARCADE_GAMES_GGSM_ASTROCHIMP_G_SCORE)
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.eChallengeFlags, GGSM_CHALLENGE_BIT_ASTROCHIMP_G)
ENDIF
IF (GET_MP_INT_CHARACTER_AWARD(MP_AWARD_ASTROCHIMP) >= g_sMPTunables.iCH_ARCADE_GAMES_GGSM_ASTROCHIMP_P_SCORE)
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.eChallengeFlags, GGSM_CHALLENGE_BIT_ASTROCHIMP_P)
ENDIF
INT i
GGSM_CHALLENGE_BIT challengeBit
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, " ")
ENDPROC
PROC GGSM_SET_CHALLENGE_COMPLETED(GGSM_CHALLENGE_BIT eBit)
IF NOT IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.eChallengeFlags, eBit)
CDEBUG1LN(DEBUG_MINIGAME, "GGSM_SET_CHALLENGE_COMPLETED:", GGSM_CHALLENGE_BIT_TO_STRING(eBit))
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.eChallengeFlags, eBit)
SWITCH (eBit)
CASE GGSM_CHALLENGE_BIT_APE_ESCAPE
SET_MP_BOOL_CHARACTER_AWARD(MP_AWARD_APEESCAPE, TRUE)
GGSM_UNLOCK_PRIZE(GGSM_UNLOCK_TSHIRTS_GGSM_ASTEROID)
BREAK
CASE GGSM_CHALLENGE_BIT_MONKEY_MIND
SET_MP_BOOL_CHARACTER_AWARD(MP_AWARD_MONKEYKIND, TRUE)
GGSM_UNLOCK_PRIZE(GGSM_UNLOCK_TSHIRTS_GGSM_NODAMAGE)
BREAK
CASE GGSM_CHALLENGE_BIT_ASTROCHIMP_P
GGSM_UNLOCK_PRIZE(GGSM_UNLOCK_TSHIRTS_GGSM_SCORE)
BREAK
ENDSWITCH
BOOL bOwnsPenthouse = DOES_PLAYER_OWN_A_CASINO_APARTMENT(PLAYER_ID())
IF GGSM_ARE_ALL_CHALLENGES_COMPLETE()
sGGSMData.bTrophyUnlockedThisSession = TRUE
GGSM_UNLOCK_PRIZE(GGSM_UNLOCK_TSHIRTS_GGSM_COMPLETE)
IF (bOwnsPenthouse)
GGSM_UNLOCK_PRIZE(GGSM_UNLOCK_TROPHY_PENTHOUSE)
ELSE
GGSM_UNLOCK_PRIZE(GGSM_UNLOCK_TROPHY)
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL GGSM_SHOULD_SHOW_TUTORIAL(GGSM_HELP_BIT eBit)
IF IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.eHelpFlags, eBit)
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
PROC GGSM_GIVE_EXTRA_LIFE()
sGGSMData.iPlayerLives ++
GGSM_PLAY_SOUND(ARCADE_GAMES_SOUND_GGSM_PICKUP_EXTRA_LIFE)
GGSM_PLAY_SOUND(ARCADE_GAMES_SOUND_GGSM_MONKEY_VOICE_EXTRA_LIFE)
ENDPROC
FUNC INT GGSM_CALCULATE_TAKEDOWN_PERCENTAGE()
FLOAT pc = (TO_FLOAT(sGGSMData.iEnemiesDestroyed) / TO_FLOAT(sGGSMData.iEnemiesCreated)) * 100.0
IF (pc >= 100.0)
pc = 100.0
ENDIF
RETURN CEIL(pc)
ENDFUNC
FUNC INT GGSM_CALCULATE_TAKEDOWN_BONUS()
INT pc = GGSM_CALCULATE_TAKEDOWN_PERCENTAGE()
INT tb = pc * (GGSM_TAKEDOWN_BONUS / 100)
tb -= (tb % 100) // gets rid of decimals
RETURN tb
ENDFUNC
FUNC BOOL GGSM_IS_LAST_STAGE()
RETURN (sGGSMData.sGameStats.level >= GGSM_SECTOR_MAX)
ENDFUNC
PROC GGSM_INCREASE_PLAYER_SCORE(INT iSc, BOOL bNoExtend = FALSE)
sGGSMData.sGameStats.score += iSc
sGGSMData.iExtendPtsCounter += iSc
IF (bNoExtend = FALSE)
IF (sGGSMData.iExtendPtsCounter >= g_sMPTunables.iCH_ARCADE_GAMES_GGSM_POINTS_FOR_EXTEND)
GGSM_GIVE_EXTRA_LIFE()
sGGSMData.iExtendPtsCounter -= g_sMPTunables.iCH_ARCADE_GAMES_GGSM_POINTS_FOR_EXTEND
ENDIF
ENDIF
// astrochimp challenge
IF (sGGSMData.sGameStats.score > GET_MP_INT_CHARACTER_AWARD(MP_AWARD_ASTROCHIMP))
SET_MP_INT_CHARACTER_AWARD(MP_AWARD_ASTROCHIMP, sGGSMData.sGameStats.score)
ENDIF
IF (sGGSMData.sGameStats.score >= g_sMPTunables.iCH_ARCADE_GAMES_GGSM_ASTROCHIMP_P_SCORE)
GGSM_SET_CHALLENGE_COMPLETED(GGSM_CHALLENGE_BIT_ASTROCHIMP_P)
ELIF (sGGSMData.sGameStats.score >= g_sMPTunables.iCH_ARCADE_GAMES_GGSM_ASTROCHIMP_G_SCORE)
GGSM_SET_CHALLENGE_COMPLETED(GGSM_CHALLENGE_BIT_ASTROCHIMP_G)
ELIF (sGGSMData.sGameStats.score >= g_sMPTunables.iCH_ARCADE_GAMES_GGSM_ASTROCHIMP_S_SCORE)
GGSM_SET_CHALLENGE_COMPLETED(GGSM_CHALLENGE_BIT_ASTROCHIMP_S)
ELIF (sGGSMData.sGameStats.score >= g_sMPTunables.iCH_ARCADE_GAMES_GGSM_ASTROCHIMP_B_SCORE)
GGSM_SET_CHALLENGE_COMPLETED(GGSM_CHALLENGE_BIT_ASTROCHIMP_B)
ENDIF
ENDPROC
FUNC BOOL GGSM_IS_DIALOG_ACTIVE()
RETURN (sGGSMData.sDialogController.eState > GGSM_DIALOG_STATE_NONE) AND (sGGSMData.sDialogController.eState < GGSM_DIALOG_STATE_DONE)
ENDFUNC
FUNC BOOL GGSM_IS_ANY_EDITOR_RUNNING()
#IF IS_DEBUG_BUILD
#IF GGSM_ENTITY_EDITOR_ACTIVE
IF (sGGSMData.sDebugEntityEditor.sEditCore.bEditorActive)
RETURN TRUE
ENDIF
#ENDIF
#IF GGSM_SPAWN_EDITOR_ACTIVE
IF (sGGSMData.sDebugSpawnEditor.sEditCore.bEditorActive)
RETURN TRUE
ENDIF
#ENDIF
#ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL GGSM_IS_ANY_EDITOR_INCLUDED()
#IF IS_DEBUG_BUILD
#IF GGSM_ENTITY_EDITOR_ACTIVE
RETURN TRUE
#ENDIF
#IF GGSM_SPAWN_EDITOR_ACTIVE
RETURN TRUE
#ENDIF
#ENDIF
RETURN FALSE
ENDFUNC
PROC GGSM_RESET_SPECIAL_WEAPONS_ARRAY(GGSM_SPWEAPON_DATA &array[])
INT i
REPEAT COUNT_OF(array) i
array[i].eType = GGSM_SPECIAL_WEAPON_NONE
array[i].eState = GGSM_SPWEAPON_INACTIVE
array[i].fTimer = 0
ENDREPEAT
ENDPROC
PROC GGSM_SHUTDOWN_ALL_SPECIAL_WEAPONS(GGSM_SPWEAPON_DATA &array[])
INT i
REPEAT COUNT_OF(array) i
IF (array[i].eType != GGSM_SPECIAL_WEAPON_NONE)
IF (array[i].eState != GGSM_SPWEAPON_INACTIVE) AND (array[i].eState != GGSM_SPWEAPON_COOLDOWN)
array[i].eState = GGSM_SPWEAPON_COOLDOWN
ENDIF
ENDIF
ENDREPEAT
// Player Ship
IF (sGGSMData.iPlayerShipIndex != GGSM_INVALID_ENTITY)
CLEAR_BITMASK_ENUM_AS_ENUM(sGGSMData.sEntities[sGGSMData.iPlayerShipIndex].eFlags, GGSM_ENTITY_BIT_REFLECT_BULLETS)
ENDIF
ENDPROC
FUNC BOOL GGSM_IS_STAGE_READY_TO_END()
#IF IS_DEBUG_BUILD
IF GGSM_IS_ANY_EDITOR_RUNNING()
RETURN FALSE
ENDIF
IF (sGGSMData.bDebugDisableEnemySpawn)
RETURN FALSE
ENDIF
#ENDIF
IF GGSM_IS_DIALOG_ACTIVE()
RETURN FALSE
ENDIF
/*
IF (GET_GAME_TIMER() < (sGGSMData.iLastEnemyDeathTimeMS + 5000))
RETURN FALSE
ENDIF
*/
IF IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.eStageFlags, GGSM_STAGE_BIT_EXPLOSIONS_ACTIVE)
RETURN FALSE
ENDIF
IF IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.eStageFlags, GGSM_STAGE_BIT_ENEMIES_ACTIVE)
RETURN FALSE
ENDIF
IF IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.eStageFlags, GGSM_STAGE_BIT_BOSSES_ACTIVE)
RETURN FALSE
ENDIF
RETURN (sGGSMData.iSpawnIndexCounter >= sGGSMData.iSpawnsUsed)
ENDFUNC
//-------------------------------------------------
// INPUT FUNCTIONS
//-------------------------------------------------
/// PURPOSE:
/// Returns true if the player has pressed start this frame
FUNC BOOL GGSM_HAS_PLAYER_PRESSED_START()
CONTROL_ACTION CA_Start = INPUT_FRONTEND_PAUSE
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
CA_Start = INPUT_FRONTEND_ACCEPT
ENDIF
IF IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, CA_Start)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Returns true if the player has pressed quit this frame
FUNC BOOL GGSM_HAS_PLAYER_PRESSED_FIRE()
CONTROL_ACTION CA_Fire = INPUT_SCRIPT_RDOWN
CONTROL_ACTION CA_Fire2 = INPUT_SCRIPT_RT
RETURN IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, CA_Fire) OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, CA_Fire2)
ENDFUNC
/// PURPOSE:
/// Returns true if the player has pressed quit this frame
FUNC BOOL GGSM_HAS_PLAYER_PRESSED_CANCEL()
CONTROL_ACTION CA_Fire = INPUT_FRONTEND_CANCEL
RETURN IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, CA_Fire)
ENDFUNC
/// PURPOSE:
/// Returns true if the player has pressed quit this frame
FUNC BOOL GGSM_HAS_PLAYER_HOLDING_FIRE()
CONTROL_ACTION CA_Fire = INPUT_SCRIPT_RDOWN
CONTROL_ACTION CA_Fire2 = INPUT_SCRIPT_RT
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
RETURN (IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, CA_Fire) OR IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_ATTACK))
ENDIF
RETURN IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, CA_Fire) OR IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, CA_Fire2)
ENDFUNC
/// PURPOSE:
/// Returns true if the player has pressed quit this frame
FUNC BOOL GGSM_HAS_PLAYER_PRESSED_SPECIAL_WEAPON()
CONTROL_ACTION CA_Fire = INPUT_SCRIPT_RUP
CONTROL_ACTION CA_Fire2 = INPUT_SCRIPT_LB
RETURN IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, CA_Fire) OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, CA_Fire2)
ENDFUNC
/// PURPOSE:
/// Returns true if the player has pressed quit this frame
FUNC BOOL GGSM_HAS_PLAYER_PRESSED_DEFENSE_WEAPON()
CONTROL_ACTION CA_Fire = INPUT_SCRIPT_RRIGHT // keep at as right because PC
CONTROL_ACTION CA_Fire2 = INPUT_SCRIPT_RB
CONTROL_ACTION CA_Fire3 = INPUT_SCRIPT_RLEFT
RETURN IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, CA_Fire)
OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, CA_Fire2)
OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, CA_Fire3)
ENDFUNC
FUNC BOOL GGSM_ALTER_POINT_WITH_INPUT(VECTOR_2D &vec, FLOAT fSpeed, GGSM_INPUT input = GGSM_INPUT_LSTICK)
BOOL bMoved = FALSE
FLOAT fStickX, fStickY
FLOAT spd = fSpeed * GET_FRAME_TIME()
IF (input = GGSM_INPUT_DPAD)
IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_UP)
fStickY = -sGGSMData.fDPadScalar
ENDIF
IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_DOWN)
fStickY = sGGSMData.fDPadScalar
ENDIF
IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_LEFT)
fStickX = -sGGSMData.fDPadScalar
ENDIF
IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT)
fStickX = sGGSMData.fDPadScalar
ENDIF
ELIF (input = GGSM_INPUT_RSTICK)
fStickX = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_X)
fStickY = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_Y)
ELSE
fStickX = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_X)
fStickY = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_Y)
ENDIF
IF (fStickX <= -sGGSMData.fAnalogDeadZone) OR (fStickX >= sGGSMData.fAnalogDeadZone)
vec.x += (spd * fStickX)
bMoved = TRUE
ENDIF
IF (fStickY <= -sGGSMData.fAnalogDeadZone) OR (fStickY >= sGGSMData.fAnalogDeadZone)
vec.y += (spd * fStickY)
bMoved = TRUE
ENDIF
RETURN bMoved
ENDFUNC
PROC GGSM_ALTER_FLOAT_WITH_INPUT(FLOAT &fValue, FLOAT fSpeed, GGSM_INPUT input)
FLOAT fStickX, fStickY
FLOAT spd = fSpeed * GET_FRAME_TIME()
IF (input = GGSM_INPUT_DPAD)
IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_UP)
fStickY = -sGGSMData.fDPadScalar
ENDIF
IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_DOWN)
fStickY = sGGSMData.fDPadScalar
ENDIF
IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_LEFT)
fStickX = -sGGSMData.fDPadScalar
ENDIF
IF IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_PAD_RIGHT)
fStickX = sGGSMData.fDPadScalar
ENDIF
ELIF (input = GGSM_INPUT_RSTICK)
fStickX = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_X)
fStickY = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_Y)
ELSE
fStickX = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_X)
fStickY = GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LEFT_AXIS_Y)
ENDIF
IF (fStickX <= -sGGSMData.fAnalogDeadZone) OR (fStickX >= sGGSMData.fAnalogDeadZone)
fValue += (spd * fStickX)
ENDIF
IF (fStickY <= -sGGSMData.fAnalogDeadZone) OR (fStickY >= sGGSMData.fAnalogDeadZone)
fValue += (spd * fStickY)
ENDIF
ENDPROC
//-------------------------------------------------
// CAMERA FUNCTIONS
//-------------------------------------------------
/// PURPOSE:
/// Resets The Camera
/// PARAMS:
/// cam -
PROC GGSM_CAMERA_RESET(GGSM_CAMERA &cam)
cam.vWorldPosition = INIT_VECTOR_2D(-cam.vWorldViewportOffset.x, -cam.vWorldViewportOffset.y)
cam.vLastWorldPosition = cam.vWorldPosition
cam.vScrollDirection = INIT_VECTOR_2D(1, 0)
cam.fDistTravelled = 0.0
cam.fTileScrollSpeed = 5.0
cam.fScrollPCController = 1.0
CLEAR_BITMASK_ENUM_AS_ENUM(sGGSMData.eStageFlags, GGSM_STAGE_BIT_BRING_CAMERA_TO_STOP)
ENDPROC
/// PURPOSE:
/// Initializes the camera
/// PARAMS:
/// cam - camera struct
/// vw - viewport width
/// vh - viewport height
PROC GGSM_CAMERA_INIT(GGSM_CAMERA &cam)
cam.vWorldViewportOffset.x = (cfBASE_SCREEN_WIDTH - GGSM_PX_OVERSCAN_WIDTH) / 2.0
cam.vWorldViewportOffset.y = (cfBASE_SCREEN_HEIGHT - GGSM_PX_OVERSCAN_HEIGHT) / 2.0
cam.vViewportSize = INIT_VECTOR_2D(GGSM_PX_OVERSCAN_WIDTH, GGSM_PX_OVERSCAN_HEIGHT)
GGSM_CAMERA_RESET(cam)
ENDPROC
PROC GGSM_CAMERA_JUMP_TO_DISTANCE(GGSM_CAMERA &cam, FLOAT fDistance)
GGSM_CAMERA_RESET(cam)
cam.vWorldPosition.x += fDistance
cam.vLastWorldPosition = cam.vWorldPosition
cam.fDistTravelled = fDistance
ENDPROC
/// PURPOSE:
/// Updates the camera
/// PARAMS:
/// cam - camera struct
PROC GGSM_CAMERA_UPDATE(GGSM_CAMERA &cam)
#IF IS_DEBUG_BUILD
IF (cam.bDebugMoveCamera)
GGSM_CAMERA_JUMP_TO_DISTANCE(cam, cam.fDebugMoveCameraDist)
cam.bDebugMoveCamera = FALSE
ENDIF
#ENDIF
IF IS_BITMASK_ENUM_AS_ENUM_SET(sGGSMData.eStageFlags, GGSM_STAGE_BIT_BRING_CAMERA_TO_STOP)
cam.fScrollPCController -= (GET_FRAME_TIME() / 3.0)
IF (cam.fScrollPCController < 0.0)
cam.fScrollPCController = 0.0
ENDIF
ELSE
cam.fScrollPCController += (GET_FRAME_TIME() / 3.0)
IF (cam.fScrollPCController > 1.0)
cam.fScrollPCController = 1.0
ENDIF
ENDIF
IF NOT GGSM_IS_DIALOG_ACTIVE()
cam.fSpd = ((cam.fTileScrollSpeed * sGGSMData.fTimeScale * cam.fScrollPCController) / sGGSMData.fScrollTimePerFrame) * GET_FRAME_TIME()
IF (NOT sGGSMData.bGamePaused) AND (sGGSMData.eState = GGSM_STATE_STAGE_ACTIVE)
cam.vWorldPosition.x += cam.vScrollDirection.x * cam.fSpd
cam.vWorldPosition.y += cam.vScrollDirection.y * cam.fSpd
ENDIF
ENDIF
cam.fDistTravelled += VECTOR_2D_DIST(cam.vLastWorldPosition, cam.vWorldPosition)
cam.vLastWorldPosition = cam.vWorldPosition
ENDPROC
//-------------------------------------------------
// FX FUNCTIONS
//-------------------------------------------------
FUNC BOOL GGSM_SPRITE_UPDATE_ANIMATION(GGSM_SPRITE_ANIM eAnim, FLOAT &fAnimFrame, BOOL bAffectedByTimeScale = TRUE)
GGSM_SPRITE_ANIM_DATA data
FLOAT fDeltaTime = GET_FRAME_TIME()
IF (bAffectedByTimeScale)
fDeltaTime *= sGGSMData.fTimeScale
ENDIF
IF NOT GGSM_GET_SPRITE_ANIM_DATA(eAnim, data)
RETURN FALSE
ENDIF
IF (eAnim = GGSM_SPRITE_ANIM_EXPLOSION) OR (eAnim = GGSM_SPRITE_ANIM_PLYR_EXPLOSION)
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.eStageFlags, GGSM_STAGE_BIT_EXPLOSIONS_ACTIVE)
ENDIF
// animate frame
fAnimFrame += ((data.fEndFrame - data.fStartFrame) / data.fAnimTime) * fDeltaTime
// loop anim if needed
IF IS_BITMASK_ENUM_AS_ENUM_SET(data.eAnimFlags, GGSM_ANIM_BIT_LOOP)
IF (fAnimFrame < data.fStartFrame)
fAnimFrame = data.fEndFrame
ENDIF
IF (fAnimFrame >= data.fEndFrame + 1.0)
fAnimFrame = data.fStartFrame
ENDIF
ELSE
IF (fAnimFrame >= data.fEndFrame + 1.0)
fAnimFrame = data.fEndFrame
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC GGSM_RESET_FXSPRITE(GGSM_FX_SPRITE &spr)
spr.eFlags = GGSM_FX_SPRITE_BIT_NONE
spr.eSpriteAnim = GGSM_SPRITE_ANIM_NONE
spr.eSpriteType = GGSM_SPRITE_NONE
spr.fAnimFrame = 0
ENDPROC
/// PURPOSE:
/// Sets all explosions to be inactive
/// PARAMS:
/// array - array of projectiles
PROC GGSM_RESET_FXSPRITE_ARRAY(GGSM_FX_SPRITE &array[])
INT i
INT cnt = COUNT_OF(array)
REPEAT cnt i
GGSM_RESET_FXSPRITE(array[i])
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Gets the next free projectile index
/// PARAMS:
/// array - projecile array
/// ind - Index of the next free index
/// iSearchIndex - Index to start searching from
/// RETURNS:
/// TRUE if projectile can be found
FUNC BOOL GGSM_GET_FREE_FXSPRITE(GGSM_FX_SPRITE &array[], INT &ind, INT &iSearchIndex)
INT i
INT cnt = COUNT_OF(array)
// stops any overflow nonsense
iSearchIndex = ABSI(iSearchIndex) % cnt
ind = GGSM_INVALID_FX_SPRITE
REPEAT cnt i
IF NOT IS_BITMASK_ENUM_AS_ENUM_SET(array[iSearchIndex].eFlags, GGSM_FX_SPRITE_BIT_ACTIVE)
ind = iSearchIndex
RETURN TRUE
ENDIF
iSearchIndex = (iSearchIndex + 1) % cnt
ENDREPEAT
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Update the projectile array
/// PARAMS:
/// array - array
/// RETURNS:
/// # of active projectiles
FUNC INT GGSM_UPDATE_FXSPRITE_ARRAY(GGSM_FX_SPRITE &array[])
INT i, n
INT cnt = COUNT_OF(array)
VECTOR_2D vPos, vSize
FLOAT fDeltaTime = GET_FRAME_TIME() * sGGSMData.fTimeScale
CLEAR_BITMASK_ENUM_AS_ENUM(sGGSMData.eStageFlags, GGSM_STAGE_BIT_EXPLOSIONS_ACTIVE)
REPEAT cnt i
IF IS_BITMASK_ENUM_AS_ENUM_SET(array[i].eFlags, GGSM_FX_SPRITE_BIT_ACTIVE)
// update movement and do on screen checks
vPos = GGSM_UNPACK_VECTOR_2D(array[i].iPackedPosition)
vSize = GGSM_GET_SPRITE_SIZE(array[i].eSpriteType)
vSize.x *= array[i].fScale
vSize.y *= array[i].fScale
IF GGSM_IS_POINT_ON_SCREEN(vPos, vSize)
SET_BITMASK_ENUM_AS_ENUM(array[i].eFlags, GGSM_FX_SPRITE_BIT_ENTERED_PLAYFIELD)
SET_BITMASK_ENUM_AS_ENUM(array[i].eFlags, GGSM_FX_SPRITE_BIT_ON_SCREEN)
ELSE
CLEAR_BITMASK_ENUM_AS_ENUM(array[i].eFlags, GGSM_FX_SPRITE_BIT_ON_SCREEN)
IF IS_BITMASK_ENUM_AS_ENUM_SET(array[i].eFlags, GGSM_FX_SPRITE_BIT_REMOVE_WHEN_OFFSCREEN | GGSM_FX_SPRITE_BIT_ENTERED_PLAYFIELD)
array[i].eFlags = GGSM_FX_SPRITE_BIT_NONE
RELOOP
ENDIF
ENDIF
vPos.x += array[i].vVelocity.x * fDeltaTime
vPos.y += array[i].vVelocity.y * fDeltaTime
array[i].iPackedPosition = GGSM_PACK_VECTOR_2D_TO_INT(vPos)
IF (array[i].eSpriteAnim != GGSM_SPRITE_ANIM_NONE)
IF GGSM_SPRITE_UPDATE_ANIMATION(array[i].eSpriteAnim, array[i].fAnimFrame)
array[i].eSpriteAnim = GGSM_SPRITE_ANIM_NONE
array[i].eFlags = GGSM_FX_SPRITE_BIT_NONE
ENDIF
ENDIF
n ++
ENDIF
ENDREPEAT
RETURN n
ENDFUNC
PROC GGSM_FXSPRITE_SET_PHYSICAL_RADIUS(GGSM_FX_SPRITE &spr, FLOAT fRadius)
VECTOR_2D size = GGSM_GET_SPRITE_SIZE(spr.eSpriteType)
spr.fScale = fRadius / size.x
ENDPROC
FUNC BOOL GGSM_FXSPRITE_INIT_METEOR(GGSM_FX_SPRITE &sprite, VECTOR_2D vPos, VECTOR_2D vVelocity, FLOAT fPhysicalRadius = 64.0)
sprite.eFlags = GGSM_FX_SPRITE_BIT_ACTIVE | GGSM_FX_SPRITE_BIT_REMOVE_WHEN_OFFSCREEN | GGSM_FX_SPRITE_BIT_BG_SPRITE
IF (fPhysicalRadius < 40.0)
sprite.eSpriteType = GGSM_SPRITE_METEOR_SMALL
ELIF (fPhysicalRadius < 80.0)
sprite.eSpriteType = GGSM_SPRITE_METEOR_MEDIUM
ELSE
sprite.eSpriteType = GGSM_SPRITE_METEOR_BIG
ENDIF
sprite.eSpriteAnim = GGSM_SPRITE_ANIM_NONE
sprite.iPackedPosition = GGSM_PACK_VECTOR_2D_TO_INT(vPos)
sprite.vVelocity = vVelocity
sprite.fAnimFrame = 0
sprite.iPackedColor = GGSM_PACK_RGBA_COLOUR(32, 32, 32, 255)
GGSM_FXSPRITE_SET_PHYSICAL_RADIUS(sprite, fPhysicalRadius)
RETURN TRUE
ENDFUNC
FUNC BOOL GGSM_FXSPRITE_INIT_ANIMATED(GGSM_FX_SPRITE &sprite, VECTOR_2D vPos, GGSM_SPRITE_ANIM eAnim, FLOAT fScale = 1.0, GGSM_FX_SPRITE_BIT eFlags = GGSM_FX_SPRITE_BIT_NONE)
GGSM_SPRITE_ANIM_DATA data
IF NOT GGSM_GET_SPRITE_ANIM_DATA(eAnim, data)
RETURN FALSE
ENDIF
sprite.eFlags = (GGSM_FX_SPRITE_BIT_ACTIVE | eFlags)
sprite.eSpriteAnim = eAnim
sprite.eSpriteType = data.eSprite
sprite.iPackedPosition = GGSM_PACK_VECTOR_2D_TO_INT(vPos)
sprite.fAnimFrame = data.fStartFrame
sprite.fScale = fScale
sprite.iPackedColor = GGSM_PACK_RGBA_COLOUR(255, 255, 255, 255)
GGSM_PLAY_SOUND_FROM_POSITION(data.eSound, vPos)
RETURN TRUE
ENDFUNC
//-------------------------------------------------
// BG SCROLLER FUNCTIONS
//-------------------------------------------------
PROC GGSM_BGSCROLLER_RESET(GGSM_BGSCROLLER &scr, INT iStage)
INT i
VECTOR_2D vSize = GGSM_GET_SPRITE_SIZE(GGSM_SPRITE_BG_SPACE)
VECTOR_2D vPos
// set positions for stars
vPos.x = GGSM_PX_OVERSCAN_MIN_X - (vSize.x / 2.0)
vPos.y = cfBASE_SCREEN_HALF_HEIGHT
REPEAT GGSM_MAX_STAR_BG i
scr.vSpaceBgPos[i] = vPos
scr.vSpaceBgPos[i].x += (i * vSize.x)
ENDREPEAT
// set positions for floor
vSize = GGSM_GET_SPRITE_BG_LAYER_SIZE_FOR_STAGE(iStage)
vPos.x = GGSM_PX_OVERSCAN_MIN_X - (vSize.x / 2.0)
vPos.y = GGSM_PX_OVERSCAN_MAX_Y - (vSize.y / 2.0)
REPEAT GGSM_MAX_FLOOR_BG i
scr.vFloorBgPos[i] = vPos
scr.vFloorBgPos[i].x += (i * vSize.x)
ENDREPEAT
GGSM_RESET_FXSPRITE_ARRAY(scr.sBgSprite)
scr.fSpaceScrollRate = 64.0 + (12.8 * TO_FLOAT(iStage - 1))
scr.fFloorScrollRate = (scr.fSpaceScrollRate * 2.0)
scr.fObjScrollRate = 96.0
scr.iStage = iStage
scr.fTimer = 0
ENDPROC
PROC GGSM_BGSCROLLER_UPDATE(GGSM_BGSCROLLER &scr)
IF (sGGSMData.bGamePaused)
EXIT
ENDIF
INT i, iSearch
FLOAT r
FLOAT xlimit
FLOAT spd = (sGGSMData.fDeltaTime * sGGSMData.fTimeScale)
VECTOR_2D vSize = GGSM_GET_SPRITE_SIZE(GGSM_SPRITE_BG_SPACE)
// scroll stars
scr.fTimer -= spd
xlimit = GGSM_PX_OVERSCAN_MIN_X - (vSize.x / 2.0)
spd = (sGGSMData.fDeltaTime * sGGSMData.fTimeScale) * scr.fSpaceScrollRate
REPEAT GGSM_MAX_STAR_BG i
scr.vSpaceBgPos[i].x -= spd
IF (scr.vSpaceBgPos[i].x <= xlimit)
scr.vSpaceBgPos[i].x += (vSize.x * GGSM_MAX_STAR_BG)
ENDIF
ENDREPEAT
// scroll floor bg
xlimit = GGSM_PX_OVERSCAN_MIN_X - (vSize.x / 2.0)
spd = (sGGSMData.fDeltaTime * sGGSMData.fTimeScale) * scr.fFloorScrollRate
vSize = GGSM_GET_SPRITE_BG_LAYER_SIZE_FOR_STAGE(scr.iStage)
REPEAT GGSM_MAX_FLOOR_BG i
scr.vFloorBgPos[i].x -= spd
IF (scr.vFloorBgPos[i].x <= xlimit)
scr.vFloorBgPos[i].x += (vSize.x * GGSM_MAX_FLOOR_BG)
ENDIF
ENDREPEAT
// update scrolling objects
GGSM_UPDATE_FXSPRITE_ARRAY(scr.sBgSprite)
VECTOR_2D vPos, vVel
IF (scr.fTimer > 0.0)
EXIT
ENDIF
IF (scr.iStage = GGSM_SECTOR_ASTEROID_BELT)
IF GGSM_GET_FREE_FXSPRITE(scr.sBgSprite, i, iSearch)
vVel = INIT_VECTOR_2D(-GET_RANDOM_FLOAT_IN_RANGE(300.0, 700.0), 0)
r = GET_RANDOM_FLOAT_IN_RANGE(32.0, 512.0)
vPos.x = GGSM_PX_OVERSCAN_MAX_X + (r / 2.0)
vPos.y = GET_RANDOM_FLOAT_IN_RANGE(GGSM_PX_OVERSCAN_MIN_Y + 20, GGSM_PX_OVERSCAN_MAX_Y - 20)
GGSM_FXSPRITE_INIT_METEOR(scr.sBgSprite[i], vPos, vVel, r)
scr.fTimer = GET_RANDOM_FLOAT_IN_RANGE(1.0, 5.0)
ENDIF
ENDIF
ENDPROC
//-------------------------------------------------
// DIALOG CONTROLLER FUNCTIONS
//-------------------------------------------------
PROC GGSM_DIALOG_CONTROLLER_SETUP_PICTURES(GGSM_DIALOG_CONTROLLER &con)
ARCADE_GAMES_SOUND monkeyVoice = ARCADE_GAMES_SOUND_GGSM_MONKEY_VOICE_SCREECH_MID
con.eLeftSpeak = ARCADE_GAMES_SOUND_END
con.eRightSpeak = ARCADE_GAMES_SOUND_END
SWITCH (con.eType)
CASE GGSM_DIALOG_BOSS_SMOOTHIE_START
CASE GGSM_DIALOG_BOSS_SMOOTHIE_FAILED
con.eLeftPicture = GGSM_SPRITE_PIC_SMOOTHIE_MAIN
con.eRightPicture = GGSM_SPRITE_PIC_MONKEY_MAIN
con.eLeftSpeak = ARCADE_GAMES_SOUND_GGSM_BOSS_SMOOTHIE_SPEAK
con.eRightSpeak = monkeyVoice
BREAK
CASE GGSM_DIALOG_BOSS_SMOOTHIE_DEFEATED
con.eLeftPicture = GGSM_SPRITE_PIC_SMOOTHIE_MAIN
con.eRightPicture = GGSM_SPRITE_PIC_MONKEY_MAIN
con.eLeftSpeak = ARCADE_GAMES_SOUND_GGSM_BOSS_SMOOTHIE_SPEAK_DEFEAT
con.eRightSpeak = monkeyVoice
BREAK
CASE GGSM_DIALOG_BOSS_MARINE_DEFEATED
con.eLeftPicture = GGSM_SPRITE_PIC_MONKEY_MAIN
con.eRightPicture = GGSM_SPRITE_PIC_MARINE_MAIN
con.eLeftSpeak = monkeyVoice
con.eRightSpeak = ARCADE_GAMES_SOUND_GGSM_BOSS_MARINE_SPEAK_DEFEAT
BREAK
CASE GGSM_DIALOG_BOSS_MARINE_START
CASE GGSM_DIALOG_BOSS_MARINE_FAILED
con.eLeftPicture = GGSM_SPRITE_PIC_MARINE_MAIN
con.eRightPicture = GGSM_SPRITE_PIC_MONKEY_MAIN
con.eLeftSpeak = ARCADE_GAMES_SOUND_GGSM_BOSS_MARINE_SPEAK
con.eRightSpeak = monkeyVoice
BREAK
CASE GGSM_DIALOG_BOSS_GRANANA_START
CASE GGSM_DIALOG_BOSS_GRANANA_FAILED
con.eLeftPicture = GGSM_SPRITE_PIC_GRANANA_MAIN
con.eRightPicture = GGSM_SPRITE_PIC_MONKEY_MAIN
con.eLeftSpeak = ARCADE_GAMES_SOUND_GGSM_BOSS_GRAN_SPEAK
con.eRightSpeak = monkeyVoice
BREAK
CASE GGSM_DIALOG_BOSS_GRANANA_DEFEATED
con.eLeftPicture = GGSM_SPRITE_PIC_GRANANA_MAIN
con.eRightPicture = GGSM_SPRITE_PIC_MONKEY_MAIN
con.eLeftSpeak = ARCADE_GAMES_SOUND_GGSM_BOSS_GRAN_SPEAK_DEFEAT
con.eRightSpeak = monkeyVoice
BREAK
CASE GGSM_DIALOG_BOSS_BREAD_START
CASE GGSM_DIALOG_BOSS_BREAD_FAILED
con.eLeftPicture = GGSM_SPRITE_PIC_BREAD_MAIN
con.eRightPicture = GGSM_SPRITE_PIC_MONKEY_MAIN
con.eLeftSpeak = ARCADE_GAMES_SOUND_GGSM_BOSS_BREAD_SPEAK
con.eRightSpeak = monkeyVoice
BREAK
CASE GGSM_DIALOG_BOSS_BREAD_DEFEATED
con.eLeftPicture = GGSM_SPRITE_PIC_BREAD_MAIN
con.eRightPicture = GGSM_SPRITE_PIC_MONKEY_MAIN
con.eLeftSpeak = ARCADE_GAMES_SOUND_GGSM_BOSS_BREAD_SPEAK_DEFEAT
con.eRightSpeak = monkeyVoice
BREAK
CASE GGSM_DIALOG_BOSS_DR_DANK_START
CASE GGSM_DIALOG_BOSS_DR_DANK_FAILED
con.eLeftPicture = GGSM_SPRITE_PIC_DR_DANK_MAIN
con.eRightPicture = GGSM_SPRITE_PIC_MONKEY_MAIN
con.eLeftSpeak = ARCADE_GAMES_SOUND_GGSM_BOSS_DR_DANK_SPEAK
con.eRightSpeak = monkeyVoice
BREAK
CASE GGSM_DIALOG_BOSS_DR_DANK_DEFEATED
con.eLeftPicture = GGSM_SPRITE_PIC_DR_DANK_MAIN
con.eRightPicture = GGSM_SPRITE_PIC_MONKEY_MAIN
con.eLeftSpeak = ARCADE_GAMES_SOUND_GGSM_BOSS_DR_DANK_SPEAK_DEFEAT
con.eRightSpeak = monkeyVoice
BREAK
CASE GGSM_DIALOG_ASTEROID_ENTER
CASE GGSM_DIALOG_ASTEROID_LEAVE
con.eLeftPicture = GGSM_SPRITE_PIC_MONKEY_ASTEROID
con.eRightPicture = GGSM_SPRITE_NONE
con.eLeftSpeak = monkeyVoice
BREAK
CASE GGSM_DIALOG_GAME_OVER
con.eLeftPicture = GGSM_SPRITE_PIC_DR_DANK_FAIL
con.eLeftSpeak = ARCADE_GAMES_SOUND_GGSM_BOSS_DR_DANK_SPEAK
con.eRightPicture = GGSM_SPRITE_PIC_MONKEY_FAIL
con.eRightSpeak = ARCADE_GAMES_SOUND_GGSM_MONKEY_VOICE_SCREECH_HIGH
BREAK
DEFAULT
con.eLeftPicture = GGSM_SPRITE_PIC_MONKEY_MAIN
con.eRightPicture = GGSM_SPRITE_PIC_GRANANA_MAIN
BREAK
ENDSWITCH
ENDPROC
FUNC BOOL GGSM_DIALOG_CONTROLLER_SETUP_MESSAGES(GGSM_DIALOG_CONTROLLER &con)
con.iMsgTimerMS = GET_GAME_TIMER() + GGSM_DIALOG_READ_TIME
SWITCH (con.eType)
CASE GGSM_DIALOG_BOSS_SMOOTHIE_START
con.eLeftDialog = GGSM_SPRITE_BOX_LVL1_BOSS_START
con.eRightDialog = GGSM_SPRITE_BOX_LVL1_MONKEY_START
IF (con.iMsgNumber != 0)
RETURN FALSE
ENDIF
BREAK
CASE GGSM_DIALOG_BOSS_SMOOTHIE_DEFEATED
con.eLeftDialog = GGSM_SPRITE_BOX_LVL1_BOSS_WIN
con.eRightDialog = GGSM_SPRITE_BOX_LVL1_MONKEY_WIN
IF (con.iMsgNumber != 0)
RETURN FALSE
ENDIF
BREAK
CASE GGSM_DIALOG_BOSS_SMOOTHIE_FAILED
con.eLeftDialog = GGSM_SPRITE_BOX_LVL1_BOSS_FAIL
con.eRightDialog = GGSM_SPRITE_BOX_LVL1_MONKEY_FAIL
IF (con.iMsgNumber != 0)
RETURN FALSE
ENDIF
BREAK
CASE GGSM_DIALOG_BOSS_MARINE_START
con.eLeftDialog = GGSM_SPRITE_BOX_LVL2_BOSS_START
con.eRightDialog = GGSM_SPRITE_BOX_LVL2_MONKEY_START
IF (con.iMsgNumber != 0)
RETURN FALSE
ENDIF
BREAK
CASE GGSM_DIALOG_BOSS_MARINE_DEFEATED
con.eLeftDialog = GGSM_SPRITE_BOX_LVL2_BOSS_WIN
con.eRightDialog = GGSM_SPRITE_BOX_LVL2_MONKEY_WIN
IF (con.iMsgNumber != 0)
RETURN FALSE
ENDIF
BREAK
CASE GGSM_DIALOG_BOSS_MARINE_FAILED
con.eLeftDialog = GGSM_SPRITE_BOX_LVL2_BOSS_FAIL
con.eRightDialog = GGSM_SPRITE_BOX_LVL2_MONKEY_FAIL
IF (con.iMsgNumber != 0)
RETURN FALSE
ENDIF
BREAK
CASE GGSM_DIALOG_BOSS_GRANANA_START
con.eLeftDialog = GGSM_SPRITE_BOX_LVL3_BOSS_START
con.eRightDialog = GGSM_SPRITE_BOX_LVL3_MONKEY_START
IF (con.iMsgNumber != 0)
RETURN FALSE
ENDIF
BREAK
CASE GGSM_DIALOG_BOSS_GRANANA_DEFEATED
con.eLeftDialog = GGSM_SPRITE_BOX_LVL3_BOSS_WIN
con.eRightDialog = GGSM_SPRITE_BOX_LVL3_MONKEY_WIN
IF (con.iMsgNumber != 0)
RETURN FALSE
ENDIF
BREAK
CASE GGSM_DIALOG_BOSS_GRANANA_FAILED
con.eLeftDialog = GGSM_SPRITE_BOX_LVL3_BOSS_FAIL
con.eRightDialog = GGSM_SPRITE_BOX_LVL3_MONKEY_FAIL
IF (con.iMsgNumber != 0)
RETURN FALSE
ENDIF
BREAK
CASE GGSM_DIALOG_BOSS_BREAD_START
con.eLeftDialog = GGSM_SPRITE_BOX_LVL4_BOSS_START
con.eRightDialog = GGSM_SPRITE_BOX_LVL4_MONKEY_START
IF (con.iMsgNumber != 0)
RETURN FALSE
ENDIF
BREAK
CASE GGSM_DIALOG_BOSS_BREAD_DEFEATED
con.eLeftDialog = GGSM_SPRITE_BOX_LVL4_BOSS_WIN
con.eRightDialog = GGSM_SPRITE_BOX_LVL4_MONKEY_WIN
IF (con.iMsgNumber != 0)
RETURN FALSE
ENDIF
BREAK
CASE GGSM_DIALOG_BOSS_BREAD_FAILED
con.eLeftDialog = GGSM_SPRITE_BOX_LVL4_BOSS_FAIL
con.eRightDialog = GGSM_SPRITE_BOX_LVL4_MONKEY_FAIL
IF (con.iMsgNumber != 0)
RETURN FALSE
ENDIF
BREAK
CASE GGSM_DIALOG_BOSS_DR_DANK_START
IF (con.iMsgNumber = 0)
con.eLeftDialog = GGSM_SPRITE_BOX_LVL5_BOSS_START
con.eRightDialog = GGSM_SPRITE_BOX_LVL5_MONKEY_START
ELIF (con.iMsgNumber = 1)
con.eLeftDialog = GGSM_SPRITE_BOX_LVL5_BOSS_START2
con.eRightDialog = GGSM_SPRITE_BOX_LVL5_MONKEY_START2
ELIF (con.iMsgNumber != 0)
RETURN FALSE
ENDIF
BREAK
CASE GGSM_DIALOG_BOSS_DR_DANK_DEFEATED
IF (con.iMsgNumber = 0)
con.eLeftDialog = GGSM_SPRITE_BOX_LVL5_BOSS_WIN
con.eRightDialog = GGSM_SPRITE_BOX_LVL5_MONKEY_WIN
ELIF (con.iMsgNumber = 1)
con.eLeftDialog = GGSM_SPRITE_BOX_LVL5_BOSS_WIN2
con.eRightDialog = GGSM_SPRITE_NONE
ELIF (con.iMsgNumber != 0)
RETURN FALSE
ENDIF
BREAK
CASE GGSM_DIALOG_BOSS_DR_DANK_FAILED
con.eLeftDialog = GGSM_SPRITE_BOX_LVL5_BOSS_FAIL
con.eRightDialog = GGSM_SPRITE_BOX_LVL5_MONKEY_FAIL
IF (con.iMsgNumber != 0)
RETURN FALSE
ENDIF
BREAK
CASE GGSM_DIALOG_ASTEROID_ENTER
con.eLeftDialog = GGSM_SPRITE_BOX_ASTEROID_NEARING
con.eRightDialog = GGSM_SPRITE_NONE
IF (con.iMsgNumber != 0)
RETURN FALSE
ENDIF
BREAK
CASE GGSM_DIALOG_ASTEROID_LEAVE
con.eLeftDialog = GGSM_SPRITE_BOX_ASTEROID_LEAVING
con.eRightDialog = GGSM_SPRITE_NONE
IF (con.iMsgNumber != 0)
RETURN FALSE
ENDIF
BREAK
CASE GGSM_DIALOG_GAME_OVER
con.eLeftDialog = INT_TO_ENUM(GGSM_SPRITE_TYPE, ENUM_TO_INT(GGSM_SPRITE_BOX_FAILSCRN_BOSS1) + con.iVariation)
con.eRightDialog = INT_TO_ENUM(GGSM_SPRITE_TYPE, ENUM_TO_INT(GGSM_SPRITE_BOX_FAILSCRN_MONKEY_1) + con.iVariation)
IF (con.iMsgNumber != 0)
RETURN FALSE
ENDIF
BREAK
DEFAULT
con.eLeftDialog = GGSM_SPRITE_BOX_LVL3_MONKEY_START
con.eRightDialog = GGSM_SPRITE_BOX_LVL3_BOSS_START
BREAK
ENDSWITCH
RETURN TRUE
ENDFUNC
PROC GGSM_DIALOG_CONTROLLER_SET_STATE(GGSM_DIALOG_CONTROLLER &con, GGSM_DIALOG_STATE eState)
con.eState = eState
con.bStateInit = FALSE
con.iMsgTimerMS = GET_GAME_TIMER() + GGSM_DIALOG_READ_TIME
CDEBUG1LN(DEBUG_MINIGAME, "GGSM_DIALOG_CONTROLLER_SET_STATE:", GGSM_DIALOG_STATE_TO_STRING(eState))
ENDPROC
PROC GGSM_DIALOG_CONTROLLER_START_DIALOG(GGSM_DIALOG_CONTROLLER &con, GGSM_DIALOG_TYPE eType, INT iVariation = -1)
con.eType = eType
IF (iVariation = -1) AND (con.eType = GGSM_DIALOG_GAME_OVER)
iVariation = GET_RANDOM_INT_IN_RANGE(0, 6)
ENDIF
con.iVariation = iVariation
con.iMsgNumber = 0
GGSM_DIALOG_CONTROLLER_SET_STATE(con, GGSM_DIALOG_STATE_INIT)
ENDPROC
PROC GGSM_DIALOG_CONTROLLER_UPDATE(GGSM_DIALOG_CONTROLLER &con)
IF NOT GGSM_IS_DIALOG_ACTIVE()
EXIT
ENDIF
VECTOR_2D vPos, vSize
RGBA_COLOUR_STRUCT bgcol
INT iAlpha
STRING sPortraitDict = GGSM_GET_TEXTURE_DICT(GGSM_TEXDICT_PORTRAITS)
STRING sDialogDict = GGSM_GET_TEXTURE_DICT(GGSM_TEXDICT_DIALOG)
SWITCH (con.eState)
CASE GGSM_DIALOG_STATE_INIT
con.iMsgNumber = 0
con.iSlideInOffset = GGSM_DIALOG_MAX_SLIDEIN
//GGSM_RESET_PROJECTILE_ARRAY(sGGSMData.sProjectiles)
GGSM_DIALOG_CONTROLLER_SETUP_PICTURES(con)
GGSM_DIALOG_CONTROLLER_SETUP_MESSAGES(con)
GGSM_DIALOG_CONTROLLER_SET_STATE(con, GGSM_DIALOG_STATE_START)
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.eStageFlags, GGSM_STAGE_BIT_BRING_CAMERA_TO_STOP)
BREAK
CASE GGSM_DIALOG_STATE_START
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_PORTRAITS)
EXIT
ENDIF
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_DIALOG)
EXIT
ENDIF
IF (con.bStateInit = FALSE)
GGSM_PLAY_SOUND(ARCADE_GAMES_SOUND_GGSM_SPEECH_BUBBLE_APPEAR_SWEEP)
con.bStateInit = TRUE
ENDIF
con.iSlideInOffset -= GGSM_DIALOG_SLIDEIN_RATE
IF (con.iSlideInOffset <= 0)
GGSM_PLAY_SOUND(ARCADE_GAMES_SOUND_GGSM_SPEECH_BUBBLE_APPEAR_SYNTH)
GGSM_DIALOG_CONTROLLER_SET_STATE(con, GGSM_DIALOG_STATE_LEFT_SPEAK)
con.iSlideInOffset = 0
ENDIF
BREAK
CASE GGSM_DIALOG_STATE_LEFT_SPEAK
IF (con.bStateInit = FALSE)
IF ARCADE_GAMES_SOUND_HAS_FINISHED(ARCADE_GAMES_SOUND_GGSM_SPEECH_BUBBLE_APPEAR_SYNTH)
IF (con.eLeftSpeak != ARCADE_GAMES_SOUND_END)
GGSM_PLAY_SOUND(con.eLeftSpeak)
ENDIF
con.bStateInit = TRUE
ENDIF
ELSE
IF (con.eLeftSpeak = ARCADE_GAMES_SOUND_END) OR ARCADE_GAMES_SOUND_HAS_FINISHED(con.eLeftSpeak)
GGSM_DIALOG_CONTROLLER_SET_STATE(con, GGSM_DIALOG_STATE_RIGHT_SPEAK)
ENDIF
ENDIF
BREAK
CASE GGSM_DIALOG_STATE_RIGHT_SPEAK
IF (con.bStateInit = FALSE)
IF (con.eRightSpeak != ARCADE_GAMES_SOUND_END)
GGSM_PLAY_SOUND(con.eRightSpeak)
ENDIF
con.bStateInit = TRUE
ELSE
IF (con.eRightSpeak = ARCADE_GAMES_SOUND_END) OR ARCADE_GAMES_SOUND_HAS_FINISHED(con.eRightSpeak)
GGSM_DIALOG_CONTROLLER_SET_STATE(con, GGSM_DIALOG_STATE_ACTIVE)
ENDIF
ENDIF
BREAK
CASE GGSM_DIALOG_STATE_ACTIVE
// we jump to the next message if there isn't one we end the dialog
IF GGSM_HAS_PLAYER_PRESSED_FIRE() OR (GET_GAME_TIMER() > con.iMsgTimerMS)
con.iMsgNumber ++
IF NOT GGSM_DIALOG_CONTROLLER_SETUP_MESSAGES(con)
GGSM_DIALOG_CONTROLLER_SET_STATE(con, GGSM_DIALOG_STATE_END)
ELSE
GGSM_PLAY_SOUND(ARCADE_GAMES_SOUND_GGSM_SPEECH_BUBBLE_APPEAR_SYNTH)
GGSM_DIALOG_CONTROLLER_SET_STATE(con, GGSM_DIALOG_STATE_LEFT_SPEAK)
CDEBUG1LN(DEBUG_MINIGAME, "GGSM_DIALOG_CONTROLLER_UPDATE - TYPE:", GGSM_DIALOG_TYPE_TO_STRING(con.eType), " MSG #:", con.iMsgNumber)
ENDIF
ENDIF
IF GGSM_HAS_PLAYER_PRESSED_START()
GGSM_DIALOG_CONTROLLER_SET_STATE(con, GGSM_DIALOG_STATE_END)
ENDIF
BREAK
CASE GGSM_DIALOG_STATE_END
IF (con.bStateInit = FALSE)
GGSM_PLAY_SOUND(ARCADE_GAMES_SOUND_GGSM_SPEECH_BUBBLE_DISAPPEAR_SWEEP)
con.bStateInit = TRUE
ENDIF
con.iSlideInOffset += GGSM_DIALOG_SLIDEIN_RATE
IF (con.iSlideInOffset >= GGSM_DIALOG_MAX_SLIDEIN)
con.iSlideInOffset = GGSM_DIALOG_MAX_SLIDEIN
con.eLeftDialog = GGSM_SPRITE_NONE
con.eRightDialog = GGSM_SPRITE_NONE
con.eLeftPicture = GGSM_SPRITE_NONE
con.eRightPicture = GGSM_SPRITE_NONE
GGSM_DIALOG_CONTROLLER_SET_STATE(con, GGSM_DIALOG_STATE_DONE)
CLEAR_BITMASK_ENUM_AS_ENUM(sGGSMData.eStageFlags, GGSM_STAGE_BIT_BRING_CAMERA_TO_STOP)
GGSM_RELEASE_TEXTURE_DICT(GGSM_TEXDICT_DIALOG)
EXIT
ENDIF
BREAK
CASE GGSM_DIALOG_STATE_DONE
GGSM_RELEASE_TEXTURE_DICT(GGSM_TEXDICT_DIALOG)
GGSM_DIALOG_CONTROLLER_SET_STATE(con, GGSM_DIALOG_STATE_SHUTDOWN)
EXIT
BREAK
ENDSWITCH
// draw transparent bg if in stage
IF (con.eType > GGSM_DIALOG_GAME_OVER)
iAlpha = FLOOR(128.0 * (TO_FLOAT(GGSM_DIALOG_MAX_SLIDEIN - con.iSlideInOffset) / TO_FLOAT(GGSM_DIALOG_MAX_SLIDEIN)))
INIT_RGBA_STRUCT(bgcol, 0, 0, 0, iAlpha)
ARCADE_DRAW_PIXELSPACE_RECT(INIT_VECTOR_2D(cfBASE_SCREEN_HALF_WIDTH, cfBASE_SCREEN_HALF_HEIGHT), INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH, cfBASE_SCREEN_HEIGHT), bgcol)
ENDIF
// draw left picture
IF (con.eLeftPicture != GGSM_SPRITE_NONE)
vSize = GGSM_GET_SPRITE_SIZE(con.eLeftPicture)
vPos.x = (GGSM_PX_HUD_MIN_X + (vSize.x / 2) + 120) - con.iSlideInOffset
vPos.y = GGSM_PX_HUD_MIN_Y + (vSize.y / 2) + 120
ARCADE_DRAW_PIXELSPACE_SPRITE(sPortraitDict, GGSM_GET_SPRITE_NAME(con.eLeftPicture), vPos, vSize, 0, sGGSMData.rgbaWhite)
vPos.x += ((vSize.x / 2) + 32)
// draw left text
IF (con.iSlideInOffset = 0) AND (con.eLeftDialog != GGSM_SPRITE_NONE)
vSize = GGSM_GET_SPRITE_SIZE(con.eLeftDialog)
IF (con.eType <= GGSM_DIALOG_GAME_OVER)
vPos.x += (328.0 / 2.0)
ELSE
vPos.x += (628.0 / 2.0)
ENDIF
ARCADE_DRAW_PIXELSPACE_SPRITE(sDialogDict, GGSM_GET_SPRITE_NAME(con.eLeftDialog), vPos, vSize, 0, sGGSMData.rgbaWhite)
ENDIF
ENDIF
// draw right picture
IF (con.eRightPicture != GGSM_SPRITE_NONE)
vSize = GGSM_GET_SPRITE_SIZE(con.eRightPicture)
vPos.x = (GGSM_PX_HUD_MAX_X - (vSize.x / 2) - 120) + con.iSlideInOffset
IF (con.eType <= GGSM_DIALOG_GAME_OVER)
vPos.y = 420.0
ELSE
vPos.y = GGSM_PX_HUD_MAX_Y - (vSize.y / 2) - 120
ENDIF
ARCADE_DRAW_PIXELSPACE_SPRITE(sPortraitDict, GGSM_GET_SPRITE_NAME(con.eRightPicture), vPos, vSize, 0, sGGSMData.rgbaWhite)
vPos.x -= ((vSize.x / 2) + 32)
// draw right text
IF (con.iSlideInOffset = 0) AND (con.eRightDialog != GGSM_SPRITE_NONE)
vSize = GGSM_GET_SPRITE_SIZE(con.eRightDialog)
IF (con.eType <= GGSM_DIALOG_GAME_OVER)
vPos.x -= (328.0 / 2.0)
ELSE
vPos.x -= (628.0 / 2.0)
ENDIF
ARCADE_DRAW_PIXELSPACE_SPRITE(sDialogDict, GGSM_GET_SPRITE_NAME(con.eRightDialog), vPos, vSize, 0, sGGSMData.rgbaWhite)
ENDIF
ENDIF
ENDPROC
//-------------------------------------------------
// POWER UP FUNCTIONS
//-------------------------------------------------
PROC GGSM_RESET_POWER_UP(GGSM_POWER_UP &pType)
pType.eType = GGSM_SPRITE_NONE
pType.iPackedPosition = GGSM_PACK_VECTOR_2D_TO_INT_EXPLICIT(1800, 540)
ENDPROC
PROC GGSM_RESET_POWER_UP_ARRAY(GGSM_POWER_UP &pArray[])
INT i
REPEAT COUNT_OF(pArray) i
GGSM_RESET_POWER_UP(pArray[i])
ENDREPEAT
ENDPROC
FUNC INT GGSM_GET_FREE_POWER_UP(GGSM_POWER_UP &pArray[])
INT i
REPEAT COUNT_OF(pArray) i
IF (pArray[i].eType = GGSM_SPRITE_NONE)
RETURN i
ENDIF
ENDREPEAT
RETURN -1
ENDFUNC
FUNC BOOL GGSM_CREATE_POWER_UP(GGSM_SPRITE_TYPE eSprite, GGSM_POWER_UP &pArray[])
IF (eSprite < GGSM_SPRITE_POWER_UP_BEAM) OR (eSprite > GGSM_SPRITE_POWER_UP_WAVE)
RETURN FALSE
ENDIF
INT ind = GGSM_GET_FREE_POWER_UP(pArray)
IF (ind = -1)
RETURN FALSE
ENDIF
pArray[ind].eType = eSprite
pArray[ind].iPackedPosition = GGSM_PACK_VECTOR_2D_TO_INT_EXPLICIT(1800, GET_RANDOM_FLOAT_IN_RANGE(200.0, 840.0))
CDEBUG1LN(DEBUG_MINIGAME, "GGSM_CREATE_POWER_UP - TYPE:", GGSM_GET_SPRITE_NAME(eSprite))
RETURN TRUE
ENDFUNC
FUNC BOOL GGSM_CREATE_POWER_UP_AT(GGSM_SPRITE_TYPE eSprite, VECTOR_2D vPos, GGSM_POWER_UP &pArray[])
IF (eSprite < GGSM_SPRITE_POWER_UP_BEAM) OR (eSprite > GGSM_SPRITE_POWER_UP_WAVE)
RETURN FALSE
ENDIF
INT ind = GGSM_GET_FREE_POWER_UP(pArray)
IF (ind = -1)
RETURN FALSE
ENDIF
pArray[ind].eType = eSprite
pArray[ind].iPackedPosition = GGSM_PACK_VECTOR_2D_TO_INT(vPos)
CDEBUG1LN(DEBUG_MINIGAME, "GGSM_CREATE_POWER_UP - TYPE:", GGSM_GET_SPRITE_NAME(eSprite))
RETURN TRUE
ENDFUNC
//-------------------------------------------------
// ENTITY ACCESSOR FUNCTIONS
//-------------------------------------------------
FUNC INT GGSM_ENTITY_GET_ARRAY_INDEX(GGSM_ENTITY &ent)
RETURN ent.iArrayIndex
ENDFUNC
FUNC INT GGSM_ENTITY_GET_GROUP_ID(GGSM_ENTITY &ent)
RETURN ent.iGroupID
ENDFUNC
FUNC INT GGSM_ENTITY_GET_PARENT_INDEX(GGSM_ENTITY &ent)
RETURN ent.iEntityParentIndex
ENDFUNC
PROC GGSM_ENTITY_SET_ARRAY_INDEX(GGSM_ENTITY &ent, INT i)
ent.iArrayIndex = i
ENDPROC
PROC GGSM_ENTITY_SET_GROUP_ID(GGSM_ENTITY &ent, INT i)
ent.iGroupID = i
ENDPROC
PROC GGSM_ENTITY_SET_PARENT_INDEX(GGSM_ENTITY &ent, INT i)
ent.iEntityParentIndex = i
ENDPROC
//-------------------------------------------------
// BOSS CONTROLLER FUNCTIONS
//-------------------------------------------------
PROC GGSM_BOSS_CONTROLLER_SET_STATE(GGSM_BOSS_CONTROLLER &con, GGSM_BOSS_STATE eState)
con.eState = eState
con.bStateInit = FALSE
con.fStateTimer = 0.0
con.iInternalCounter = 0
con.iBossPatternState = 0
CDEBUG1LN(DEBUG_MINIGAME, "GGSM_BOSS_CONTROLLER_SET_STATE - TYPE:", GGSM_BOSS_TYPE_TO_STRING(con.eType), " STATE:", GGSM_BOSS_STATE_TO_STRING(con.eState))
IF (eState = GGSM_BOSS_STATE_LOADING)
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.eStageFlags, GGSM_STAGE_BIT_BRING_CAMERA_TO_STOP)
ENDIF
ENDPROC
FUNC BOOL GGSM_BOSS_CONTROLLER_IS_BOSS_ACTIVE(GGSM_BOSS_CONTROLLER &boss)
IF (boss.eState = GGSM_BOSS_STATE_NONE) OR (boss.eState = GGSM_BOSS_STATE_DONE)
RETURN FALSE
ENDIF
RETURN FALSE
ENDFUNC
FUNC INT GGSM_GET_FREE_BOSS_CONTROLLER_INDEX(GGSM_BOSS_CONTROLLER &boss[])
INT i
REPEAT COUNT_OF(boss) i
IF (boss[i].iMaxTotalHP = 0)
RETURN i
ENDIF
ENDREPEAT
RETURN GGSM_INVALID_BOSS_CONTROLLER
ENDFUNC
FUNC FLOAT GGSM_GET_BOSS_STATE_TIME_ELAPSED(GGSM_BOSS_CONTROLLER &boss)
RETURN boss.fStateTimer
ENDFUNC
FUNC INT GGSM_BOSS_CONTROLLER_GET_ENTITY_INDEX(GGSM_BOSS_CONTROLLER &boss, INT iSlot)
IF (iSlot < 0) OR (iSlot >= GGSM_MAX_BOSS_PARTS)
RETURN GGSM_INVALID_ENTITY
ENDIF
RETURN boss.iEntityIndex[iSlot]
//RETURN GET_PACKED_BITFIELD_VALUE_FROM_ARRAY(boss.iPackedEntityList, iSlot, GGSM_BOSS_LIST_BIT_WIDTH)
ENDFUNC
PROC GGSM_BOSS_CONTROLLER_SET_ENTITY_INDEX(GGSM_BOSS_CONTROLLER &boss, INT iSlot, INT iEntityIndex)
IF (iSlot < 0) OR (iSlot >= GGSM_MAX_BOSS_PARTS)
EXIT
ENDIF
boss.iEntityIndex[iSlot] = iEntityIndex
//SET_PACKED_BITFIELD_VALUE_IN_ARRAY(boss.iPackedEntityList, iSlot, GGSM_BOSS_LIST_BIT_WIDTH, iEntityIndex)
ENDPROC
PROC GGSM_CLEAR_BOSS_CONTROLLER_USED_PATTERN_BITSET(GGSM_BOSS_CONTROLLER &boss)
boss.iPatternUsedBitSet = 0
ENDPROC
FUNC BOOL GGSM_BOSS_CONTROLLER_ARE_ANY_PATTERNS_LEFT(GGSM_BOSS_CONTROLLER &boss)
INT i
REPEAT boss.iMaxPatterns i
IF NOT IS_BIT_SET(boss.iPatternUsedBitSet, i)
RETURN TRUE
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
FUNC BOOL GGSM_BOSS_CONTROLLER_PICK_UNIQUE_PATTERN(GGSM_BOSS_CONTROLLER &boss, GGSM_BOSS_STATE &newPattern)
INT i, iRand
REPEAT 30 i
iRand = GET_RANDOM_INT_IN_RANGE(0, boss.iMaxPatterns)
IF NOT IS_BIT_SET(boss.iPatternUsedBitSet, iRand)
newPattern = INT_TO_ENUM(GGSM_BOSS_STATE, ENUM_TO_INT(GGSM_BOSS_STATE_PATTERN_A) + iRand)
SET_BIT(boss.iPatternUsedBitSet, iRand)
RETURN TRUE
ENDIF
ENDREPEAT
REPEAT boss.iMaxPatterns i
IF NOT IS_BIT_SET(boss.iPatternUsedBitSet, i)
newPattern = INT_TO_ENUM(GGSM_BOSS_STATE, ENUM_TO_INT(GGSM_BOSS_STATE_PATTERN_A) + i)
SET_BIT(boss.iPatternUsedBitSet, i)
RETURN TRUE
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
PROC GGSM_BOSS_CONTROLLER_SET_ATTACK_PATTERN(GGSM_BOSS_CONTROLLER &boss, GGSM_BOSS_STATE newState)
GGSM_BOSS_CONTROLLER_SET_STATE(boss, newState)
IF NOT GGSM_BOSS_CONTROLLER_ARE_ANY_PATTERNS_LEFT(boss)
GGSM_CLEAR_BOSS_CONTROLLER_USED_PATTERN_BITSET(boss)
SET_BIT(boss.iPatternUsedBitSet, ENUM_TO_INT(newState) - ENUM_TO_INT(GGSM_BOSS_STATE_PATTERN_A))
ENDIF
ENDPROC
PROC GGSM_BOSS_CONTROLLER_SELECT_ATTACK_PATTERN(GGSM_BOSS_CONTROLLER &boss)
GGSM_BOSS_STATE newState
IF NOT GGSM_BOSS_CONTROLLER_ARE_ANY_PATTERNS_LEFT(boss)
GGSM_CLEAR_BOSS_CONTROLLER_USED_PATTERN_BITSET(boss)
ENDIF
GGSM_BOSS_CONTROLLER_PICK_UNIQUE_PATTERN(boss, newState)
GGSM_BOSS_CONTROLLER_SET_ATTACK_PATTERN(boss, newState)
ENDPROC
PROC GGSM_RESET_BOSS_CONTROLLER(GGSM_BOSS_CONTROLLER &boss, GGSM_BOSS_TYPE eType = GGSM_BOSS_NONE)
INT i
REPEAT GGSM_MAX_BOSS_PARTS i
GGSM_BOSS_CONTROLLER_SET_ENTITY_INDEX(boss, i, GGSM_INVALID_ENTITY)
ENDREPEAT
boss.eType = eType
boss.iTotalHP = 0
boss.iMaxTotalHP = 0
boss.bFiftyPercent = FALSE
boss.iGroupID = GGSM_INVALID_GROUP_ID
boss.iSubGroupID = GGSM_INVALID_GROUP_ID
boss.eState = GGSM_BOSS_STATE_NONE
boss.iSummedMaxHPBitSet = 0
boss.iPatternUsedBitSet = 0
boss.iMaxPatterns = 5
CPRINTLN(DEBUG_MINIGAME, "GGSM_RESET_BOSS_CONTROLLER:", GGSM_BOSS_TYPE_TO_STRING(eType))
DEBUG_PRINTCALLSTACK()
ENDPROC
FUNC GGSM_SPRITE_TYPE GGSM_GET_BOSS_CONTROLLER_PORTRAIT(GGSM_BOSS_TYPE eType)
SWITCH (eType)
CASE GGSM_BOSS_BREAD RETURN GGSM_SPRITE_PIC_BREAD_64
CASE GGSM_BOSS_DR_DANK RETURN GGSM_SPRITE_PIC_DR_DANK_64
CASE GGSM_BOSS_GRANANA RETURN GGSM_SPRITE_PIC_GRANANA_64
CASE GGSM_BOSS_MARINE RETURN GGSM_SPRITE_PIC_MARINE_64
CASE GGSM_BOSS_SMOOTHIE RETURN GGSM_SPRITE_PIC_SMOOTHIE_64
ENDSWITCH
RETURN GGSM_SPRITE_BOSS_TEXT
ENDFUNC
FUNC BOOL GGSM_LOAD_TEXTURE_DICTS_FOR_BOSS(GGSM_BOSS_TYPE eType)
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_PORTRAITS)
RETURN FALSE
ENDIF
SWITCH (eType)
CASE GGSM_BOSS_BREAD
RETURN GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_BOSS_BREAD)
BREAK
CASE GGSM_BOSS_DR_DANK
RETURN GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_BOSS_DR_DANK)
BREAK
CASE GGSM_BOSS_GRANANA
RETURN GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_BOSS_GRANANA)
BREAK
CASE GGSM_BOSS_MARINE
IF NOT GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_BOSS_MARINE)
RETURN FALSE
ENDIF
RETURN GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_BOSS_ALIEN)
BREAK
CASE GGSM_BOSS_SMOOTHIE
RETURN GGSM_LOAD_TEXTURE_DICT(GGSM_TEXDICT_BOSS_SMOOTHIE)
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC GGSM_RELEASE_TEXTURE_DICTS_FOR_BOSS(GGSM_BOSS_TYPE eType)
SWITCH (eType)
CASE GGSM_BOSS_BREAD
GGSM_RELEASE_TEXTURE_DICT(GGSM_TEXDICT_BOSS_BREAD)
BREAK
CASE GGSM_BOSS_DR_DANK
GGSM_RELEASE_TEXTURE_DICT(GGSM_TEXDICT_BOSS_DR_DANK)
BREAK
CASE GGSM_BOSS_GRANANA
GGSM_RELEASE_TEXTURE_DICT(GGSM_TEXDICT_BOSS_GRANANA)
BREAK
CASE GGSM_BOSS_MARINE
GGSM_RELEASE_TEXTURE_DICT(GGSM_TEXDICT_BOSS_MARINE)
GGSM_RELEASE_TEXTURE_DICT(GGSM_TEXDICT_BOSS_ALIEN)
BREAK
CASE GGSM_BOSS_SMOOTHIE
GGSM_RELEASE_TEXTURE_DICT(GGSM_TEXDICT_BOSS_SMOOTHIE)
BREAK
ENDSWITCH
ENDPROC
FUNC INT GGSM_BOSS_CONTROLLER_GET_ACTIVE_PART_COUNT(GGSM_BOSS_CONTROLLER &boss)
INT i, cnt, ent
REPEAT GGSM_MAX_BOSS_PARTS i
ent = GGSM_BOSS_CONTROLLER_GET_ENTITY_INDEX(boss, i)
IF (ent != GGSM_INVALID_ENTITY) AND (sGGSMData.sEntities[ent].eState = GGSM_ENTITY_STATE_ALIVE)
cnt ++
ENDIF
ENDREPEAT
RETURN cnt
ENDFUNC
PROC GGSM_BOSS_CONTROLLER_DEACTIVATE_ALL_WEAPONS(GGSM_BOSS_CONTROLLER &boss)
INT i, ent
REPEAT GGSM_MAX_BOSS_PARTS i
ent = GGSM_BOSS_CONTROLLER_GET_ENTITY_INDEX(boss, i)
IF (ent != GGSM_INVALID_ENTITY) AND (sGGSMData.sEntities[ent].eState = GGSM_ENTITY_STATE_ALIVE)
CLEAR_BITMASK_ENUM_AS_ENUM(sGGSMData.sEntities[ent].eFlags, GGSM_ENTITY_BIT_WPN_ACTIVE)
ENDIF
ENDREPEAT
ENDPROC
PROC GGSM_BOSS_CONTROLLER_DACTIVATE_ALL_WEAPONS(GGSM_BOSS_CONTROLLER &boss)
INT i, ent
REPEAT GGSM_MAX_BOSS_PARTS i
ent = GGSM_BOSS_CONTROLLER_GET_ENTITY_INDEX(boss, i)
IF (ent != GGSM_INVALID_ENTITY) AND (sGGSMData.sEntities[ent].eState = GGSM_ENTITY_STATE_ALIVE)
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.sEntities[ent].eFlags, GGSM_ENTITY_BIT_WPN_ACTIVE)
ENDIF
ENDREPEAT
ENDPROC
FUNC INT GGSM_BOSS_CONTROLLER_GET_HP(GGSM_BOSS_CONTROLLER &boss)
INT i, cnt, ent
REPEAT GGSM_MAX_BOSS_PARTS i
ent = GGSM_BOSS_CONTROLLER_GET_ENTITY_INDEX(boss, i)
IF IS_BIT_SET(boss.iSummedMaxHPBitSet, i)
IF (ent != GGSM_INVALID_ENTITY) AND (sGGSMData.sEntities[ent].eState = GGSM_ENTITY_STATE_ALIVE)
cnt += sGGSMData.sEntities[ent].iHP
ENDIF
ENDIF
ENDREPEAT
RETURN cnt
ENDFUNC
FUNC FLOAT GGSM_BOSS_CONTROLLER_GET_HP_PERCENTAGE(GGSM_BOSS_CONTROLLER &boss)
IF (boss.iMaxTotalHP = 0.0)
RETURN 0.0
ENDIF
RETURN TO_FLOAT(boss.iTotalHP) / TO_FLOAT(boss.iMaxTotalHP)
ENDFUNC
PROC GGSM_ADD_ENTITY_TO_BOSS_CONTROLLER(GGSM_BOSS_CONTROLLER &boss, GGSM_ENTITY &ent, INT iIndex, BOOL bContributeToMaxHP = TRUE)
INT iEntity = GGSM_BOSS_CONTROLLER_GET_ENTITY_INDEX(boss, iIndex)
IF (iEntity = GGSM_INVALID_ENTITY) AND NOT IS_BITMASK_ENUM_AS_ENUM_SET(ent.eFlags, GGSM_ENTITY_BIT_IS_PLAYER_ALLIED)
GGSM_BOSS_CONTROLLER_SET_ENTITY_INDEX(boss, iIndex, GGSM_ENTITY_GET_ARRAY_INDEX(ent))
IF (bContributeToMaxHP)
boss.iMaxTotalHP += ent.iHP
SET_BIT(boss.iSummedMaxHPBitSet, iIndex)
ENDIF
IF (boss.eState = GGSM_BOSS_STATE_NONE)
GGSM_BOSS_CONTROLLER_SET_STATE(boss, GGSM_BOSS_STATE_ARRIVE)
ENDIF
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.eStageFlags, GGSM_STAGE_BIT_BOSSES_ACTIVE)
SET_BITMASK_ENUM_AS_ENUM(sGGSMData.eStageFlags, GGSM_STAGE_BIT_BRING_CAMERA_TO_STOP)
IF (iIndex = 0)
SET_BITMASK_ENUM_AS_ENUM(ent.eFlags, GGSM_ENTITY_BIT_FORCE_SCROLLING_TO_STOP)
ENDIF
EXIT
ENDIF
ENDPROC
PROC GGSM_RESET_BOSS_CONTROLLER_ARRAY(GGSM_BOSS_CONTROLLER &boss[])
INT i
REPEAT COUNT_OF(boss) i
GGSM_RESET_BOSS_CONTROLLER(boss[i])
ENDREPEAT
CLEAR_BITMASK_ENUM_AS_ENUM(sGGSMData.eStageFlags, GGSM_STAGE_BIT_BOSSES_ACTIVE)
ENDPROC
//-------------------------------------------------
// SCRIPT EXPORT FUNCTIONS
//-------------------------------------------------
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Exports a Tile Collison Definiation to script
/// PARAMS:
/// data -
/// bOpenAndCloseFile -
PROC GGSM_DEBUG_EXPORT_TILE_COLLISION_DEFINITION_TO_SCRIPT(GGSM_TILE_COLLISION_DATA &data, BOOL bOpenAndCloseFile = TRUE)
INT i
VECTOR_2D vec
IF (bOpenAndCloseFile)
OPEN_DEBUG_FILE()
ENDIF
SAVE_STRING_TO_DEBUG_FILE(" // Tile Collision Data")
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE(" data.eType = ")
SAVE_STRING_TO_DEBUG_FILE(GGSM_TILE_COLLISION_TYPE_TO_STRING(data.eType))
SAVE_NEWLINE_TO_DEBUG_FILE()
REPEAT data.iNumPoints i
vec = GGSM_TILE_COLLISION_DATA_GET_COLLISION_VECTOR(data, i)
SAVE_STRING_TO_DEBUG_FILE(" GGSM_TILE_COLLISION_DATA_SET_COLLISION_VECTOR(data, ")
SAVE_INT_TO_DEBUG_FILE(i)
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_FLOAT_TO_DEBUG_FILE(vec.x)
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_FLOAT_TO_DEBUG_FILE(vec.y)
SAVE_STRING_TO_DEBUG_FILE(")")
SAVE_NEWLINE_TO_DEBUG_FILE()
ENDREPEAT
SAVE_STRING_TO_DEBUG_FILE(" data.iNumPoints = ")
SAVE_INT_TO_DEBUG_FILE(data.iNumPoints)
SAVE_NEWLINE_TO_DEBUG_FILE()
IF (bOpenAndCloseFile)
CLOSE_DEBUG_FILE()
ENDIF
ENDPROC
/// PURPOSE:
/// Exports Tile Collison Array to script
/// PARAMS:
/// array -
/// iCount - # of elements to export
PROC GGSM_DEBUG_EXPORT_TILE_COLLISION_ARRAY_TO_SCRIPT(GGSM_TILE_COLLISION_DATA &array[], INT iCount = 0, BOOL bReturn = FALSE)
INT i
IF (iCount = 0)
iCount = COUNT_OF(array)
ENDIF
OPEN_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("// Tile Colliders")
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("SWITCH (iTileIndex)")
SAVE_NEWLINE_TO_DEBUG_FILE()
REPEAT iCount i
SAVE_STRING_TO_DEBUG_FILE("CASE ")
SAVE_INT_TO_DEBUG_FILE(i)
SAVE_STRING_TO_DEBUG_FILE(" ")
GGSM_DEBUG_EXPORT_TILE_COLLISION_DEFINITION_TO_SCRIPT(array[i], FALSE)
IF (bReturn)
SAVE_STRING_TO_DEBUG_FILE("RETURN TRUE")
ELSE
SAVE_STRING_TO_DEBUG_FILE("BREAK")
ENDIF
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_NEWLINE_TO_DEBUG_FILE()
ENDREPEAT
SAVE_STRING_TO_DEBUG_FILE("ENDSWITCH")
SAVE_NEWLINE_TO_DEBUG_FILE()
CLOSE_DEBUG_FILE()
ENDPROC
/// PURPOSE:
/// Export Tile Map Data to Script
/// PARAMS:
/// tm -
PROC GGSM_DEBUG_EXPORT_TILE_MAP_DATA_TO_SCRIPT(GGSM_TILEMAP &tm)
INT x, y, ind
BOOL bHFlip, bVFlip
OPEN_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("// Tile Map Dimensions")
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("data.iMapWidth = ")
SAVE_INT_TO_DEBUG_FILE(tm.iMapWidth)
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("data.iMapHeight = ")
SAVE_INT_TO_DEBUG_FILE(tm.iMapHeight)
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("data.iMaxTiles = ")
SAVE_INT_TO_DEBUG_FILE(tm.iMaxTiles)
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("data.fTileSize = ")
SAVE_FLOAT_TO_DEBUG_FILE(tm.fTileSize)
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("data.fTileDrawSize = ")
SAVE_FLOAT_TO_DEBUG_FILE(tm.fTileDrawSize)
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("data.bWrapped = ")
IF (tm.bWrapped)
SAVE_STRING_TO_DEBUG_FILE("TRUE")
ELSE
SAVE_STRING_TO_DEBUG_FILE("FALSE")
ENDIF
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("// Tile Directories")
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("data.sTileDirectory = \"")
SAVE_STRING_TO_DEBUG_FILE(tm.sTileDirectory)
SAVE_STRING_TO_DEBUG_FILE("\"")
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("data.sTileSetBaseName = \"")
SAVE_STRING_TO_DEBUG_FILE(tm.sTileSetBaseName)
SAVE_STRING_TO_DEBUG_FILE("\"")
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("// Tile Map Data")
SAVE_NEWLINE_TO_DEBUG_FILE()
REPEAT tm.iMapHeight y
REPEAT tm.iMapWidth x
IF GGSM_TILEMAP_GET_DATA(tm, x, y, ind, bHFlip, bVFlip)
IF (ind != 0)
SAVE_STRING_TO_DEBUG_FILE("GGSM_TILEMAP_SET_DATA(data, ")
SAVE_INT_TO_DEBUG_FILE(x)
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_INT_TO_DEBUG_FILE(y)
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_INT_TO_DEBUG_FILE(ind)
IF (bHFlip)
SAVE_STRING_TO_DEBUG_FILE(", TRUE")
ELSE
SAVE_STRING_TO_DEBUG_FILE(", FALSE")
ENDIF
IF (bVFlip)
SAVE_STRING_TO_DEBUG_FILE(", TRUE")
ELSE
SAVE_STRING_TO_DEBUG_FILE(", FALSE")
ENDIF
SAVE_STRING_TO_DEBUG_FILE(")")
SAVE_NEWLINE_TO_DEBUG_FILE()
ENDIF
ENDIF
ENDREPEAT
ENDREPEAT
SAVE_NEWLINE_TO_DEBUG_FILE()
CLOSE_DEBUG_FILE()
ENDPROC
/// PURPOSE:
/// Exports a Spawn Definition to script
/// PARAMS:
/// data -
/// bOpenAndCloseFile -
PROC GGSM_DEBUG_EXPORT_FORMATION_TO_SCRIPT(GGSM_FORMATION_DATA &data, BOOL bOpenAndCloseFile = TRUE)
//INT i
VECTOR_2D vec
IF (bOpenAndCloseFile)
OPEN_DEBUG_FILE()
ENDIF
SAVE_STRING_TO_DEBUG_FILE(" // Formation Data")
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE(" GGSM_FORMATION_SET_TYPE(data, ")
SAVE_STRING_TO_DEBUG_FILE(GGSM_FORMATION_TYPE_TO_STRING(GGSM_FORMATION_GET_TYPE(data)))
SAVE_STRING_TO_DEBUG_FILE(")")
SAVE_NEWLINE_TO_DEBUG_FILE()
vec = GGSM_FORMATION_GET_START_POSITION(data)
SAVE_STRING_TO_DEBUG_FILE(" GGSM_FORMATION_SET_START_POSITION(data, ")
SAVE_FLOAT_TO_DEBUG_FILE(vec.x)
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_FLOAT_TO_DEBUG_FILE(vec.y)
SAVE_STRING_TO_DEBUG_FILE(")")
SAVE_NEWLINE_TO_DEBUG_FILE()
vec = GGSM_FORMATION_GET_START_DIRECTION(data)
SAVE_STRING_TO_DEBUG_FILE(" GGSM_FORMATION_SET_START_DIRECTION(data, ")
SAVE_FLOAT_TO_DEBUG_FILE(vec.x)
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_FLOAT_TO_DEBUG_FILE(vec.y)
SAVE_STRING_TO_DEBUG_FILE(")")
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE(" GGSM_FORMATION_SET_SCROLL_DISTANCE(data, ")
SAVE_FLOAT_TO_DEBUG_FILE(GGSM_FORMATION_GET_SCROLL_DISTANCE(data))
SAVE_STRING_TO_DEBUG_FILE(")")
SAVE_NEWLINE_TO_DEBUG_FILE()
IF (GGSM_FORMATION_GET_TYPE(data) = GGSM_FORMATION_POWER_UP)
SAVE_STRING_TO_DEBUG_FILE(" GGSM_FORMATION_SET_POWER_UP_SPRITE(data, ")
SAVE_STRING_TO_DEBUG_FILE(GGSM_SPRITE_TYPE_TO_STRING(GGSM_FORMATION_GET_POWER_UP_SPRITE(data)))
SAVE_STRING_TO_DEBUG_FILE(")")
SAVE_NEWLINE_TO_DEBUG_FILE()
ELSE
SAVE_STRING_TO_DEBUG_FILE(" GGSM_FORMATION_SET_ENTITY_TYPE(data, ")
SAVE_STRING_TO_DEBUG_FILE(GGSM_ENTITY_TYPE_TO_STRING(GGSM_FORMATION_GET_ENTITY_TYPE(data)))
SAVE_STRING_TO_DEBUG_FILE(")")
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE(" GGSM_FORMATION_SET_MOVEMENT_TYPE(data, ")
SAVE_STRING_TO_DEBUG_FILE(GGSM_MOVEMENT_TYPE_TO_STRING(GGSM_FORMATION_GET_MOVEMENT_TYPE(data)))
SAVE_STRING_TO_DEBUG_FILE(")")
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE(" GGSM_FORMATION_SET_WEAPON_TYPE(data, ")
SAVE_STRING_TO_DEBUG_FILE(GGSM_WEAPON_TYPE_TO_STRING(GGSM_FORMATION_GET_WEAPON_TYPE(data)))
SAVE_STRING_TO_DEBUG_FILE(")")
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE(" GGSM_FORMATION_SET_PATH_INDEX(data, ")
SAVE_INT_TO_DEBUG_FILE(GGSM_FORMATION_GET_PATH_INDEX(data))
SAVE_STRING_TO_DEBUG_FILE(")")
SAVE_NEWLINE_TO_DEBUG_FILE()
vec = GGSM_FORMATION_GET_SPACING(data)
SAVE_STRING_TO_DEBUG_FILE(" GGSM_FORMATION_SET_SPACING(data, ")
SAVE_FLOAT_TO_DEBUG_FILE(vec.x)
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_FLOAT_TO_DEBUG_FILE(vec.y)
SAVE_STRING_TO_DEBUG_FILE(")")
SAVE_NEWLINE_TO_DEBUG_FILE()
ENDIF
SAVE_STRING_TO_DEBUG_FILE(" GGSM_FORMATION_SET_MEMBER_COUNT(data, ")
SAVE_INT_TO_DEBUG_FILE(GGSM_FORMATION_GET_MEMBER_COUNT(data))
SAVE_STRING_TO_DEBUG_FILE(")")
SAVE_NEWLINE_TO_DEBUG_FILE()
IF (bOpenAndCloseFile)
CLOSE_DEBUG_FILE()
ENDIF
ENDPROC
/// PURPOSE:
/// Exports Spawn Array to script
/// PARAMS:
/// array -
/// iCount - # of elements to export
PROC GGSM_DEBUG_EXPORT_FORMATION_ARRAY_TO_SCRIPT(GGSM_FORMATION_DATA &array[], INT iCount = 0, BOOL bReturn = FALSE)
INT i
INT n = 0
IF (iCount <= 0)
iCount = COUNT_OF(array)
ENDIF
OPEN_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("// Formation Definitions")
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("SWITCH (iSpawnIndex)")
SAVE_NEWLINE_TO_DEBUG_FILE()
REPEAT iCount i
IF NOT GGSM_FORMATION_IS_VALID(array[i])
RELOOP
ENDIF
SAVE_STRING_TO_DEBUG_FILE("CASE ")
SAVE_INT_TO_DEBUG_FILE(n)
SAVE_STRING_TO_DEBUG_FILE(" ")
GGSM_DEBUG_EXPORT_FORMATION_TO_SCRIPT(array[n], FALSE)
IF (bReturn)
SAVE_STRING_TO_DEBUG_FILE("RETURN TRUE")
ELSE
SAVE_STRING_TO_DEBUG_FILE("BREAK")
ENDIF
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_NEWLINE_TO_DEBUG_FILE()
n ++
ENDREPEAT
SAVE_STRING_TO_DEBUG_FILE("ENDSWITCH")
SAVE_NEWLINE_TO_DEBUG_FILE()
CLOSE_DEBUG_FILE()
ENDPROC
/// PURPOSE:
/// Exports a Spawn Definition to script
/// PARAMS:
/// data -
/// bOpenAndCloseFile -
PROC GGSM_DEBUG_EXPORT_PATH_TO_SCRIPT(GGSM_PATH_DATA &data, BOOL bOpenAndCloseFile = TRUE)
INT i, numpts
VECTOR_2D vec
IF (bOpenAndCloseFile)
OPEN_DEBUG_FILE()
ENDIF
numpts = GGSM_PATH_DATA_GET_NUM_POINTS(data)
SAVE_STRING_TO_DEBUG_FILE(" // Path Data")
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE(" GGSM_PATH_DATA_SET_NUM_POINTS(data, ")
SAVE_INT_TO_DEBUG_FILE(GGSM_PATH_DATA_GET_NUM_POINTS(data))
SAVE_STRING_TO_DEBUG_FILE(")")
SAVE_NEWLINE_TO_DEBUG_FILE()
REPEAT numpts i
vec = GGSM_PATH_DATA_GET_POINT(data, i)
SAVE_STRING_TO_DEBUG_FILE(" GGSM_PATH_DATA_SET_POINT(data, ")
SAVE_INT_TO_DEBUG_FILE(i)
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_FLOAT_TO_DEBUG_FILE(vec.x)
SAVE_STRING_TO_DEBUG_FILE(", ")
SAVE_FLOAT_TO_DEBUG_FILE(vec.y)
SAVE_STRING_TO_DEBUG_FILE(")")
SAVE_NEWLINE_TO_DEBUG_FILE()
ENDREPEAT
IF (bOpenAndCloseFile)
CLOSE_DEBUG_FILE()
ENDIF
ENDPROC
/// PURPOSE:
/// Exports Spawn Array to script
/// PARAMS:
/// array -
/// iCount - # of elements to export
PROC GGSM_DEBUG_EXPORT_PATH_ARRAY_TO_SCRIPT(GGSM_PATH_DATA &array[], INT iCount = 0, BOOL bReturn = FALSE)
INT i
INT n = 0
IF (iCount <= 0)
iCount = COUNT_OF(array)
ENDIF
OPEN_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("// Path Definitions")
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("SWITCH (iPathIndex)")
SAVE_NEWLINE_TO_DEBUG_FILE()
REPEAT iCount i
IF (GGSM_PATH_DATA_GET_NUM_POINTS(array[i]) = 0)
RELOOP
ENDIF
SAVE_STRING_TO_DEBUG_FILE("CASE ")
SAVE_INT_TO_DEBUG_FILE(n)
SAVE_STRING_TO_DEBUG_FILE(" ")
GGSM_DEBUG_EXPORT_PATH_TO_SCRIPT(array[n], FALSE)
IF (bReturn)
SAVE_STRING_TO_DEBUG_FILE("RETURN TRUE")
ELSE
SAVE_STRING_TO_DEBUG_FILE("BREAK")
ENDIF
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_NEWLINE_TO_DEBUG_FILE()
n ++
ENDREPEAT
SAVE_STRING_TO_DEBUG_FILE("ENDSWITCH")
SAVE_NEWLINE_TO_DEBUG_FILE()
CLOSE_DEBUG_FILE()
ENDPROC
#ENDIF