Sonic CD Save Load Menu Script
Sonic CD Save Load Menu Script
// Aliases
#alias Object.Value0 : [Link]
#alias Object.Value1 : [Link]
#alias [Link] : [Link]
#alias Object[+4].Rotation : [Link]
#alias Object[+4].Value1 : [Link]
// Back Touch
#alias Object[1].Value4 : [Link]
// Delete Button
#alias Object[+1].XPos : [Link]
#alias Object[+1].YPos : [Link]
// States
#alias 0 : STATE_INITIALIZE
#alias 1 : STATE_MAIN_SAVE_MENU
#alias 2 : STATE_SAVE_SELECTED
#alias 3 : STATE_LOAD_SAVE
#alias 4 : STATE_NEW_GAME_SELECTED
#alias 5 : STATE_FADEIN_CHARACTERSELECT
#alias 6 : STATE_CHARACTER_SELECT
#alias 7 : STATE_CHARACTER_SELECTED
#alias 8 : STATE_LOAD_NEW_GAME
#alias 9 : STATE_FADEOUT_CHARACTERSELECT
#alias 10 : STATE_RETURN_TO_SAVESEL
#alias 11 : STATE_EXIT
#alias 12 : STATE_TOGGLE_DELETE_MODE
#alias 13 : STATE_SAVE_SELECTED_DELETE
#alias 14 : STATE_SLIDE_DELETE_SAVE
#alias 15 : STATE_FADEIN_DELETECONFIRM
#alias 16 : STATE_DELETE_CONFIRM
#alias 17 : STATE_DELETECONFIRM_SELECTED
#alias 18 : STATE_FADEOUT_DELETECONFIRM
// Soundtrack
#alias 0 : OST_JP
// Save Modes
#alias 0 : SAVEMODE_NORMAL
#alias 1 : SAVEMODE_NORMAL_SELECTED
#alias 2 : SAVEMODE_DELETE
#alias 3 : SAVEMODE_DELETE_SELECTED
// Buttons
#alias -1 : BUTTON_NONE // Touching nothing on mobile
#alias 0 : BUTTON_SAVE_ONE
#alias 1 : BUTTON_SAVE_TWO
#alias 2 : BUTTON_SAVE_THREE
#alias 3 : BUTTON_SAVE_FOUR
#alias 4 : BUTTON_DELETE
// Save Statuses
#alias 0 : SAVE_NORMAL
#alias 1 : SAVE_NORMAL_SELECTED
#alias 2 : SAVE_DELETE
#alias 3 : SAVE_DELETE_SELECTED
// Presentation Stage
#alias 0 : STAGE_R_PPZ1A
// Special Stage
#alias 0 : STAGE_S_SS1
// Global SFX
#alias 9 : SFX_G_LAMPPOST
#alias 23 : SFX_G_MENUBUTTON
#alias 27 : SFX_G_SELECT
// Stage SFX
#alias 0 : SFX_S_EVENT
#alias 1 : SFX_S_BACKBUTTON
// Languages
#alias 0 : LANG_ENGLISH
#alias 1 : LANG_FRENCH
#alias 2 : LANG_ITALIAN
#alias 3 : LANG_DEUTSCH
#alias 4 : LANG_SPANISH
#alias 5 : LANG_JAPANESE
// Function declarations
#function LoadSaveMenu_DrawSaveFiles
#function LoadSaveMenu_DrawDeleteNoSave
#function LoadSaveMenu_CheckTouchSave
#function LoadSaveMenu_SetShowDelete
function LoadSaveMenu_DrawSaveFiles
switch Object[+ArrayPos0].SaveStatus
case SAVE_DELETE
if Object[+ArrayPos0].StageListPos > 0
[Link] = 64
DrawSpriteScreenFX(56, FX_INK, [Link], [Link])
[Link] = 255
end if
// FallThrough
case SAVE_NORMAL
if ArrayPos0 == [Link]
DrawSpriteScreenFX(9, FX_INK, [Link], [Link])
TempValue0 = Object[+ArrayPos0].StageListPos
if Object[+ArrayPos0].StageListPos > 0 // Is this save used?
TempValue0--
TempValue0 /= 10
if TempValue0 >= 8
TempValue0 = 8
TempValue1 = Object[+ArrayPos0].SpecialListPos
else
TempValue2 = TempValue0
TempValue2 *= 10
TempValue1 = Object[+ArrayPos0].StageListPos
TempValue1--
TempValue1 -= TempValue2
TempValue1 >>= 2
end if
TempValue0 += 21
TempValue1 += 67
DrawSpriteScreenFX(TempValue1, FX_INK, [Link],
[Link])
else
TempValue0 += 20
end if
DrawSpriteScreenFX(TempValue0, FX_INK, [Link], [Link])
else
TempValue0 = Object[+ArrayPos0].StageListPos
if Object[+ArrayPos0].StageListPos > 0
TempValue0--
TempValue0 /= 10
if TempValue0 >= 8
TempValue0 = 8
TempValue1 = Object[+ArrayPos0].SpecialListPos
else
TempValue2 = TempValue0
TempValue2 *= 10
TempValue1 = Object[+ArrayPos0].StageListPos
TempValue1--
TempValue1 -= TempValue2
TempValue1 >>= 2
end if
TempValue0 += 11
TempValue1 += 59
DrawSpriteScreenFX(TempValue1, FX_INK, [Link],
[Link])
else
TempValue0 += 10
end if
DrawSpriteScreenFX(TempValue0, FX_INK, [Link], [Link])
end if
break
case SAVE_DELETE_SELECTED
[Link] = 64
DrawSpriteScreenFX(56, FX_INK, [Link], [Link])
[Link] = 255
// FallThrough
case SAVE_NORMAL_SELECTED
TempValue0 = [Link]
TempValue0 &= 3
TempValue0 >>= 1
if TempValue0 == 0
TempValue0 = Object[+ArrayPos0].StageListPos // Is this save
used?
if Object[+ArrayPos0].StageListPos > 0
TempValue0--
TempValue0 /= 10
if TempValue0 >= 8 // Is this a special stage?
TempValue0 = 8
TempValue1 = Object[+ArrayPos0].SpecialListPos
else
TempValue2 = TempValue0
TempValue2 *= 10
TempValue1 = Object[+ArrayPos0].StageListPos
TempValue1--
TempValue1 -= TempValue2
TempValue1 >>= 2
end if
TempValue0 += 21
TempValue1 += 67
DrawSpriteScreenFX(TempValue1, FX_INK, [Link],
[Link])
else
TempValue0 += 20 // New Game
end if
DrawSpriteScreenFX(TempValue0, FX_INK, [Link], [Link])
end if
break
end switch
TempValue1 = [Link]
TempValue1 >>= 5
TempValue0 += TempValue1
DrawSpriteScreenFX(TempValue0, FX_INK, [Link], [Link])
TempValue0 = 0
TempValue1 = 38
while TempValue0 < 7
TempValue2 = TempValue1
GetBit(CheckResult, Object[+ArrayPos0].TimeStones, TempValue0)
if CheckResult == false
TempValue2 += 7
end if
DrawSpriteScreenFX(TempValue2, FX_INK, [Link], [Link])
TempValue1++
TempValue0++
loop
else
DrawSpriteScreenFX(ArrayPos0, FX_INK, [Link], [Link])
end if
end function
function LoadSaveMenu_DrawDeleteNoSave
// Draw the Delete button
if [Link] >= SAVEMODE_DELETE
if [Link] == BUTTON_DELETE
DrawSpriteScreenXY(55, [Link], [Link])
else
DrawSpriteScreenXY(54, [Link], [Link])
end if
else
if [Link] == BUTTON_DELETE
DrawSpriteScreenXY(53, [Link], [Link])
else
DrawSpriteScreenXY(52, [Link], [Link])
end if
end if
function LoadSaveMenu_SetShowDelete
[Link] = false
sub ObjectMain
switch [Link]
case STATE_INITIALIZE
#platform: Use_Origins
if [Link] == false
[Link] = BUTTON_NONE
end if
#endplatform
#platform: Mobile
if [Link] == false
[Link] = BUTTON_NONE
end if
#endplatform
[Link] = [Link]
[Link] -= 126
if [Link] == 0
CallFunction(LoadSaveMenu_SetShowDelete)
[Link] = [Link]
[Link] -= 120
[Link] = 32
case STATE_MAIN_SAVE_MENU
// Flash a button when selected in delete mode
if [Link] == SAVE_DELETE_SELECTED
[Link]++
[Link] &= 63
else
[Link] = 0
end if
#platform: Standard
CheckResult = true
#endplatform
#platform: Mobile
CheckEqual([Link], true)
#endplatform
#platform: Use_Origins
CheckEqual([Link], true)
#endplatform
if CheckResult > -1
[Link] = BUTTON_DELETE
else
if TempValue3 < 0
if [Link] == BUTTON_DELETE
KeyPress[0].Start = true
end if
else
if [Link] == BUTTON_DELETE
[Link] = BUTTON_NONE
end if
end if
end if
CallFunction(MenuHeading_CheckTouchBack)
#platform: Use_Origins
[Link] = true
#endplatform
end if
if KeyPress[0].Down == true
if [Link] == false
[Link] = BUTTON_SAVE_ONE
else
[Link] = BUTTON_DELETE
end if
#platform: Mobile
[Link] = true
#endplatform
#platform: Use_Origins
[Link] = true
#endplatform
end if
end if
CheckResult = false
if CheckResult == true
if [Link] < BUTTON_DELETE // If a save file was
selected
#platform: Use_Origins
// this object isn't used in the final version of Origins,
but it looks like they had plans to use it at first?
if [Link] != false
ArrayPos0 = [Link]
if Object[+ArrayPos0].StageListPos == 0
break // break STATE_MAIN_SAVE_MENU
end if
end if
#endplatform
switch [Link]
case SAVEMODE_NORMAL
[Link] = false
ArrayPos0 = [Link]
Object[+ArrayPos0].SaveStatus = SAVE_NORMAL_SELECTED
[Link] = STATE_SAVE_SELECTED
PlaySfx(SFX_G_SELECT, false)
if Object[+ArrayPos0].StageListPos > 0 // Is this
save used?
StopMusic()
else
if [Link] == 2 // I have no idea
what this means, this will always be false
StopMusic()
end if
end if
break
case SAVEMODE_DELETE
ArrayPos0 = [Link]
if Object[+ArrayPos0].StageListPos > 0 // Is this
save used?
[Link] = false
[Link] =
STATE_SAVE_SELECTED_DELETE
[Link] = SAVE_NORMAL
[Link] = SAVE_NORMAL
[Link] = SAVE_NORMAL
[Link] = SAVE_NORMAL
Object[+ArrayPos0].SaveStatus =
SAVE_DELETE_SELECTED
[Link] = SAVEMODE_NORMAL
PlaySfx(SFX_G_LAMPPOST, false)
else
[Link] = SAVE_NORMAL
[Link] = SAVE_NORMAL
[Link] = SAVE_NORMAL
[Link] = SAVE_NORMAL
[Link] = SAVEMODE_NORMAL
#platform: Use_Origins
if [Link] == false
[Link] = BUTTON_NONE
end if
#endplatform
#platform: Mobile
if [Link] == false
[Link] = BUTTON_NONE
end if
#endplatform
end if
break
end switch
end if
if [Link] == BUTTON_DELETE
PlaySfx(SFX_G_LAMPPOST, false)
[Link] = STATE_TOGGLE_DELETE_MODE
end if
end if
if KeyPress[0].ButtonB == true
[Link] = false
[Link] = 248
[Link] = STATE_EXIT
PlayStageSfx(SFX_S_BACKBUTTON, false)
end if
break
case STATE_SAVE_SELECTED
if [Link] < 30
[Link]++
else
[Link] = 0
ArrayPos0 = [Link]
Object[+ArrayPos0].SaveStatus = SAVE_NORMAL
if Object[+ArrayPos0].StageListPos > 0 // Is this save used?
[Link] = STATE_LOAD_SAVE
else
if [Link] < 2 // I have no idea what this
means, this will always be true
[Link] = STATE_NEW_GAME_SELECTED
[Link] = 40
[Link] *= [Link]
[Link] += [Link]
[Link] -= 87
else
[Link] = STATE_LOAD_NEW_GAME
end if
end if
end if
break
case STATE_LOAD_SAVE
if [Link] < 256
[Link] += 8
else
ArrayPos0 = [Link]
[Link] = MODE_SAVEGAME
[Link] = [Link]
[Link] = Object[+ArrayPos0].Lives
[Link] = Object[+ArrayPos0].Score
[Link] = Object[+ArrayPos0].ScoreBonus
Good_Future_List = Object[+ArrayPos0].GoodFutureList
Good_Future_List &= 0xFFFF // 0b1111111111111111
Good_Future_Count = 0
Good_Future = false
MetalSonic_List = Object[+ArrayPos0].GoodFutureList
MetalSonic_List >>= 16
[Link] = Object[+ArrayPos0].TimeStones
[Link] = Object[+ArrayPos0].SpecialListPos
[Link] = 0
[Link] = REGULAR_STAGE
[Link] = Object[+ArrayPos0].StageListPos
[Link]--
if [Link] < 0
[Link] = 0
[Link] = 3
[Link] = 0
end if
#platform: Use_Origins
[Link] = 3
#endplatform
[Link] = [Link]
TempValue0 = [Link]
TempValue0 %= 10
TempValue0 >>= 2
if TempValue0 == 1
TempValue1 = [Link]
TempValue1 /= 10
TempValue1 <<= 1
GetBit(TempValue0, Good_Future_List, TempValue1)
Good_Future_Count += TempValue0
end if
else
TempValue0 = [Link]
TempValue0 %= 10
TempValue0 >>= 2
if TempValue0 == 1
TempValue1 = [Link]
TempValue1 /= 10
TempValue1 <<= 1
GetBit(TempValue0, Good_Future_List, TempValue1)
Good_Future_Count += TempValue0
end if
end if
[Link] = Object[+ArrayPos0].PlayerListPos
#platform: Use_Origins
// normally saveSlot is just forced to 0 on the title screen, but
it looks like they were planning to do a bit more than that initially? not like it
matters anyways though, cause this object's unused in origins and all
game.callbackParam0 = [Link]
EngineCallback(NOTIFY_SAVESLOT_SELECT)
#endplatform
LoadStage()
end if
SetScreenFade(0, 0, 0, [Link])
break
case STATE_NEW_GAME_SELECTED
TempValue0 = [Link]
TempValue0 -= 87
if [Link] > TempValue0
[Link] -= 8
if [Link] < TempValue0
[Link] = TempValue0
end if
else
[Link] = STATE_FADEIN_CHARACTERSELECT
[Link] = 0
#platform: Use_Origins
if [Link] == false
ArrayPos0 = [Link]
Object[+ArrayPos0].PlayerListPos = PLAYER_NONE
end if
#endplatform
#platform: Mobile
if [Link] == false
ArrayPos0 = [Link]
Object[+ArrayPos0].PlayerListPos = PLAYER_NONE
end if
#endplatform
end if
break
case STATE_FADEIN_CHARACTERSELECT
if [Link] < 256
[Link] = [Link]
[Link] += 8
else
[Link] = 0
[Link] = 255
[Link] = STATE_CHARACTER_SELECT
end if
break
case STATE_CHARACTER_SELECT
ArrayPos0 = [Link]
#platform: Standard
CheckResult = true
#endplatform
#platform: Mobile
CheckEqual([Link], true)
#endplatform
#platform: Use_Origins
CheckEqual([Link], true)
#endplatform
#platform: Use_Origins
[Link] = false
Object[+ArrayPos0].PlayerListPos = PLAYER_NONE
#endplatform
end if
else
// Touch Controls
if [Link] == MESSAGE_LOSTFOCUS
Object[+ArrayPos0].PlayerListPos = PLAYER_NONE
end if
TempValue0 = [Link]
TempValue0 -= 56
TempValue1 = [Link]
TempValue1 -= 8
CheckTouchRect(TempValue0, 126, TempValue1, 184)
if CheckResult > -1
Object[+ArrayPos0].PlayerListPos = PLAYER_SONIC_A
else
if TempValue3 < 0
if Object[+ArrayPos0].PlayerListPos == PLAYER_SONIC_A
KeyPress[0].Start = true
end if
else
if Object[+ArrayPos0].PlayerListPos == PLAYER_SONIC_A
Object[+ArrayPos0].PlayerListPos = PLAYER_NONE
end if
end if
end if
#platform: Use_Origins
[Link] = true
#endplatform
end if
if KeyPress[0].Right == true
Object[+ArrayPos0].PlayerListPos = PLAYER_SONIC_A
#platform: Mobile
[Link] = true
#endplatform
#platform: Use_Origins
[Link] = true
#endplatform
end if
end if
CheckResult = false
if KeyPress[0].Start == true
CheckResult = true
end if
if KeyPress[0].ButtonA == true
CheckResult = true
end if
if CheckResult == true
if [Link] == true
PlaySfx(SFX_G_SELECT, false)
StopMusic()
[Link] = STATE_CHARACTER_SELECTED
else
if Object[+ArrayPos0].PlayerListPos == PLAYER_SONIC_A
PlaySfx(SFX_G_SELECT, false)
StopMusic()
[Link] = STATE_CHARACTER_SELECTED
else
#platform: Mobile
Object[+ArrayPos0].PlayerListPos = PLAYER_NONE
#endplatform
end if
end if
end if
if KeyPress[0].ButtonB == true
[Link] = STATE_FADEOUT_CHARACTERSELECT
[Link] = 248
PlayStageSfx(SFX_S_BACKBUTTON, false)
end if
break
case STATE_CHARACTER_SELECTED
if [Link] < 30
[Link]++
else
[Link] = 0
[Link] = STATE_LOAD_NEW_GAME
end if
break
case STATE_LOAD_NEW_GAME
if [Link] < 256
[Link] += 8
else
ArrayPos0 = [Link]
ArrayPos1 = [Link]
ArrayPos1 <<= 3
SaveRAM[ArrayPos1] = Object[+ArrayPos0].PlayerListPos // Character
ArrayPos1++
SaveRAM[ArrayPos1] = 3 // Lives
ArrayPos1++
SaveRAM[ArrayPos1] = 0 // Score
ArrayPos1++
SaveRAM[ArrayPos1] = 1 // Stage List Pos, gets down by one
below this
ArrayPos1++
SaveRAM[ArrayPos1] = 0 // Time Stones
ArrayPos1++
SaveRAM[ArrayPos1] = 0 // Special Stage Pos
ArrayPos1++
SaveRAM[ArrayPos1] = 50000 // Score Bonus
ArrayPos1++
SaveRAM[ArrayPos1] = 0 // Destroyed Metal Sonic Projectors
WriteSaveRAM()
[Link] = MODE_SAVEGAME
[Link] = [Link]
[Link] = 3
[Link] = 0
[Link] = 50000
Good_Future_List = 0
Good_Future_Count = 0
Good_Future = false
Transporter_Destroyed = false
MetalSonic_Destroyed = false
MetalSonic_List = 0
[Link] = 0
[Link] = STAGE_S_SS1
[Link] = 0
[Link] = REGULAR_STAGE
ArrayPos0 = [Link]
[Link] = Object[+ArrayPos0].StageListPos
[Link]--
if [Link] < 0
[Link] = STAGE_R_PPZ1A
end if
[Link] = Object[+ArrayPos0].PlayerListPos
#platform: Use_Origins
// normally saveSlot is just forced to 0 on the title screen, but
it looks like they were planning to do a bit more than that initially? not like it
matters anyways though, cause this object's unused in origins and all
game.callbackParam0 = [Link]
EngineCallback(NOTIFY_SAVESLOT_SELECT)
#endplatform
LoadStage()
// #platform: Mobile
// if [Link] == OST_JP
// LoadVideo("Opening")
// else
// LoadVideo("OpeningUS")
// end if
// #endplatform
end if
end if
SetScreenFade(0, 0, 0, [Link])
break
case STATE_FADEOUT_CHARACTERSELECT
if [Link] > 0
[Link] = [Link]
[Link] -= 8
else
[Link] = 0
[Link] = STATE_RETURN_TO_SAVESEL
end if
break
case STATE_RETURN_TO_SAVESEL
TempValue0 = [Link]
TempValue0 *= 40
TempValue0 += [Link]
TempValue0 -= 87
if [Link] < TempValue0
[Link] += 8
if [Link] > TempValue0
[Link] = TempValue0
end if
[Link] = 0
else
#platform: Use_Origins
if [Link] == false
[Link] = BUTTON_NONE
end if
#endplatform
#platform: Mobile
if [Link] == false
[Link] = BUTTON_NONE
end if
#endplatform
[Link] = STATE_MAIN_SAVE_MENU
[Link] = 255
[Link] = SAVE_NORMAL
[Link] = SAVE_NORMAL
[Link] = SAVE_NORMAL
[Link] = SAVE_NORMAL
[Link] = SAVEMODE_NORMAL
CallFunction(LoadSaveMenu_SetShowDelete)
end if
break
case STATE_EXIT
if [Link] > 0
[Link] = [Link]
[Link] -= 8
else
// Tell the other objects that you're leaving the menu
[Link] = TypeName[Blank Object]
[Link] = MENUWINDOW_SHRINK // Reset the window
//All of this is MenuButton Objects
Object[34].State = MENUBUTTON_BUTTONS_IN
Object[35].State = MENUBUTTON_BUTTONS_IN
Object[36].State = MENUBUTTON_BUTTONS_IN
Object[37].State = MENUBUTTON_BUTTONS_IN
Object[38].State = MENUBUTTON_BUTTONS_IN
Object[39].State = MENUBUTTON_BUTTONS_IN
Object[40].State = MENUBUTTON_BUTTONS_IN
Object[41].State = MENUBUTTON_BUTTONS_IN
Object[42].State = MENUBUTTON_BUTTONS_IN
[Link] = MENUHEADING_LEAVE_SCREEN
[Link] = MAINMENU_HEADER
end if
break
case STATE_TOGGLE_DELETE_MODE
if [Link] < 30
[Link]++
else
[Link] = 0
[Link] = STATE_MAIN_SAVE_MENU
#platform: Standard
[Link] = BUTTON_SAVE_ONE
#endplatform
#platform: Use_Origins
if [Link] == true
[Link] = BUTTON_SAVE_ONE
else
[Link] = BUTTON_NONE
end if
#endplatform
#platform: Mobile
if [Link] == true
[Link] = BUTTON_SAVE_ONE
else
[Link] = BUTTON_NONE
end if
#endplatform
case STATE_SAVE_SELECTED_DELETE
if [Link] < 30
[Link]++
else
[Link] = 0
ArrayPos0 = [Link]
Object[+ArrayPos0].SaveStatus = SAVE_DELETE
[Link] = STATE_SLIDE_DELETE_SAVE
[Link] = 40
[Link] *= [Link]
[Link] += [Link]
[Link] -= 87
end if
break
case STATE_SLIDE_DELETE_SAVE
TempValue0 = [Link]
TempValue0 -= 87
if [Link] > TempValue0
[Link] -= 8
if [Link] < TempValue0
[Link] = TempValue0
end if
else
[Link] = STATE_FADEIN_DELETECONFIRM
[Link] = 0
#platform: Standard
[Link] = DELETE_YES
#endplatform
#platform: Use_Origins
if [Link] == true
[Link] = DELETE_YES
else
[Link] = DELETE_NONE
end if
#endplatform
#platform: Mobile
if [Link] == true
[Link] = DELETE_YES
else
[Link] = DELETE_NONE
end if
#endplatform
end if
break
case STATE_FADEIN_DELETECONFIRM
if [Link] < 256
[Link] = [Link]
[Link] += 8
else
[Link] = 0
[Link] = 255
[Link] = STATE_DELETE_CONFIRM
end if
break
case STATE_DELETE_CONFIRM
ArrayPos0 = [Link]
[Link]++
[Link] &= 63
#platform: Standard
CheckResult = true
#endplatform
#platform: Mobile
CheckEqual([Link], true)
#endplatform
#platform: Use_Origins
CheckEqual([Link], true)
#endplatform
if KeyPress[0].Down == true
[Link]++
PlaySfx(SFX_G_MENUBUTTON, false)
if [Link] > DELETE_NO
[Link] = DELETE_YES
end if
end if
#platform: Mobile
[Link] = false
[Link] = DELETE_NONE
#endplatform
#platform: Use_Origins
[Link] = false
[Link] = DELETE_NONE
#endplatform
end if
else
// Touch Controls
if [Link] == MESSAGE_LOSTFOCUS
[Link] = DELETE_NONE
end if
// Check if NO is touched
CheckTouchRect(TempValue0, 144, TempValue1, 169)
if CheckResult > -1
[Link] = DELETE_NO
else
if TempValue3 < 0
if [Link] == DELETE_NO
KeyPress[0].Start = true
end if
else
if [Link] == DELETE_NO
[Link] = DELETE_NONE
end if
end if
end if
if KeyPress[0].Down == true
[Link] = DELETE_YES
#platform: Mobile
[Link] = true
#endplatform
#platform: Use_Origins
[Link] = true
#endplatform
end if
end if
CheckResult = false
if CheckResult == true
if [Link] == DELETE_YES
PlayStageSfx(SFX_S_EVENT, false)
else
PlaySfx(SFX_G_SELECT, false)
end if
[Link] = 0
[Link] = STATE_DELETECONFIRM_SELECTED
end if
if KeyPress[0].ButtonB == true
ArrayPos0 = [Link]
Object[+ArrayPos0].SaveStatus = SAVE_NORMAL
[Link] = STATE_FADEOUT_DELETECONFIRM
[Link] = 248
[Link] = 0
PlayStageSfx(SFX_S_BACKBUTTON, false)
end if
break
case STATE_DELETECONFIRM_SELECTED
if [Link] < 30
[Link]++
else
[Link] = STATE_FADEOUT_DELETECONFIRM
[Link] = 248
ArrayPos0 = [Link]
Object[+ArrayPos0].SaveStatus = SAVE_NORMAL
if [Link] == DELETE_YES
// Delete this save in the menu
Object[+ArrayPos0].PlayerListPos = 0
Object[+ArrayPos0].Lives = 3
Object[+ArrayPos0].Score = 0
Object[+ArrayPos0].StageListPos = 0
Object[+ArrayPos0].TimeStones = 0
Object[+ArrayPos0].SpecialListPos = 0
Object[+ArrayPos0].ScoreBonus = 50000
Object[+ArrayPos0].GoodFutureList = 0
WriteSaveRAM()
end if
break
case STATE_FADEOUT_DELETECONFIRM
if [Link] > 0
[Link] = [Link]
[Link] -= 8
else
[Link] = 0
[Link] = STATE_RETURN_TO_SAVESEL
end if
break
end switch
end sub
sub ObjectDraw
switch [Link]
case STATE_INITIALIZE
case STATE_MAIN_SAVE_MENU
case STATE_SAVE_SELECTED
case STATE_LOAD_SAVE
case STATE_EXIT
case STATE_SAVE_SELECTED_DELETE
if [Link] != STATE_INITIALIZE
CallFunction(LoadSaveMenu_DrawDeleteNoSave)
end if
[Link] = [Link]
[Link] -= 87
ArrayPos0 = 0
CallFunction(LoadSaveMenu_DrawSaveFiles)
[Link] += 40
ArrayPos0++
CallFunction(LoadSaveMenu_DrawSaveFiles)
[Link] += 40
ArrayPos0++
CallFunction(LoadSaveMenu_DrawSaveFiles)
[Link] += 40
ArrayPos0++
CallFunction(LoadSaveMenu_DrawSaveFiles)
break
case STATE_NEW_GAME_SELECTED
case STATE_SLIDE_DELETE_SAVE
CallFunction(LoadSaveMenu_DrawDeleteNoSave)
ArrayPos0 = [Link]
CallFunction(LoadSaveMenu_DrawSaveFiles)
break
case STATE_FADEIN_CHARACTERSELECT
case STATE_CHARACTER_SELECT
case STATE_LOAD_NEW_GAME
case STATE_FADEOUT_CHARACTERSELECT
case STATE_RETURN_TO_SAVESEL
DrawSpriteScreenFX(30, FX_INK, [Link], 84)
TempValue0 = [Link]
TempValue0 -= 32
ArrayPos0 = [Link]
if Object[+ArrayPos0].PlayerListPos == PLAYER_SONIC_A
DrawSpriteScreenFX(31, FX_INK, TempValue0, 136)
DrawSpriteScreenFX(36, FX_INK, TempValue0, 164)
DrawSpriteScreenFX(33, FX_INK, TempValue0, 136)
else
DrawSpriteScreenFX(31, FX_INK, TempValue0, 136)
DrawSpriteScreenFX(34, FX_INK, TempValue0, 164)
end if
TempValue0 += 64
if Object[+ArrayPos0].PlayerListPos == PLAYER_TAILS_A
DrawSpriteScreenFX(32, FX_INK, TempValue0, 136)
DrawSpriteScreenFX(37, FX_INK, TempValue0, 164)
DrawSpriteScreenFX(33, FX_INK, TempValue0, 136)
else
DrawSpriteScreenFX(32, FX_INK, TempValue0, 136)
DrawSpriteScreenFX(35, FX_INK, TempValue0, 164)
end if
[Link] = 255
CallFunction(LoadSaveMenu_DrawSaveFiles)
break
case STATE_CHARACTER_SELECTED
DrawSpriteScreenFX(30, FX_INK, [Link], 84)
TempValue0 = [Link]
TempValue0 -= 32
ArrayPos0 = [Link]
if Object[+ArrayPos0].PlayerListPos == PLAYER_SONIC_A
if TempValue1 == 0
DrawSpriteScreenFX(31, FX_INK, TempValue0, 136)
end if
DrawSpriteScreenFX(36, FX_INK, TempValue0, 164)
DrawSpriteScreenFX(33, FX_INK, TempValue0, 136)
else
DrawSpriteScreenFX(31, FX_INK, TempValue0, 136)
DrawSpriteScreenFX(34, FX_INK, TempValue0, 164)
end if
TempValue0 += 64
if Object[+ArrayPos0].PlayerListPos == PLAYER_TAILS_A
if TempValue1 == 0
DrawSpriteScreenFX(32, FX_INK, TempValue0, 136)
end if
DrawSpriteScreenFX(37, FX_INK, TempValue0, 164)
DrawSpriteScreenFX(33, FX_INK, TempValue0, 136)
else
DrawSpriteScreenFX(32, FX_INK, TempValue0, 136)
DrawSpriteScreenFX(35, FX_INK, TempValue0, 164)
end if
[Link] = 255
CallFunction(LoadSaveMenu_DrawSaveFiles)
break
case STATE_TOGGLE_DELETE_MODE
// Flash the delete button
TempValue0 = [Link]
TempValue0 &= 3
TempValue0 >>= 1
if [Link] == SAVE_DELETE
if TempValue0 == 0
DrawSpriteScreenXY(55, [Link], [Link])
else
DrawSpriteScreenXY(54, [Link], [Link])
end if
else
if TempValue0 == 0
DrawSpriteScreenXY(53, [Link], [Link])
else
DrawSpriteScreenXY(52, [Link], [Link])
end if
end if
[Link] = [Link]
[Link] -= 87
ArrayPos0 = 0
CallFunction(LoadSaveMenu_DrawSaveFiles)
[Link] += 40
ArrayPos0++
CallFunction(LoadSaveMenu_DrawSaveFiles)
[Link] += 40
ArrayPos0++
CallFunction(LoadSaveMenu_DrawSaveFiles)
[Link] += 40
ArrayPos0++
CallFunction(LoadSaveMenu_DrawSaveFiles)
break
case STATE_FADEIN_DELETECONFIRM
case STATE_DELETE_CONFIRM
case STATE_FADEOUT_DELETECONFIRM
DrawSpriteScreenFX(57, FX_INK, [Link], 84)
if [Link] == DELETE_YES
DrawSpriteScreenFX(76, FX_INK, [Link], 112)
else
DrawSpriteScreenFX(75, FX_INK, [Link], 112)
end if
if [Link] == DELETE_NO
DrawSpriteScreenFX(78, FX_INK, [Link], 146)
else
DrawSpriteScreenFX(77, FX_INK, [Link], 146)
end if
ArrayPos0 = [Link]
[Link] = 255
CallFunction(LoadSaveMenu_DrawSaveFiles)
break
case STATE_DELETECONFIRM_SELECTED
// Flash the selected button
TempValue0 = [Link]
TempValue0 &= 3
TempValue0 >>= 1
ReadSaveRAM()
[Link] = SaveRAM[38]
if SaveRAM[36] == true
[Link] = true
end if
// ========================
// Editor Subs
// ========================
sub RSDKDraw
DrawSprite(0)
end sub
sub RSDKLoad
LoadSpriteSheet("Global/[Link]")
SpriteFrame(-16, -16, 32, 32, 1, 143) // #0 - "Script" Icon
SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")
end sub