0% found this document useful (0 votes)
4 views32 pages

Sonic CD Save Load Menu Script

Daaaaaaamn
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
4 views32 pages

Sonic CD Save Load Menu Script

Daaaaaaamn
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd

//---------------Sonic CD Load Save Menu Script---------------//

//--------Scripted by Christian Whitehead 'The Taxman'--------//


//-------Unpacked By Rubberduckycooly's Script Unpacker-------//

// Aliases
#alias Object.Value0 : [Link]
#alias Object.Value1 : [Link]
#alias [Link] : [Link]
#alias Object[+4].Rotation : [Link]
#alias Object[+4].Value1 : [Link]

// Menu Heading Aliases


#alias Object[33].State : [Link]
#alias Object[33].PropertyValue : [Link]

// Menu Window Aliases


#alias Object[-1].State : [Link]

// Back Touch
#alias Object[1].Value4 : [Link]

// Save File State


#alias [Link] : [Link] // Meant to be
used with [+ArrayPos0]
#alias [Link] : [Link]
#alias Object[+1].Rotation : [Link]
#alias Object[+2].Rotation : [Link]
#alias Object[+3].Rotation : [Link]

// Save File Info


#alias Object.Value3 : [Link]
#alias Object.Value6 : [Link]
#alias Object.Value5 : [Link]
#alias Object.Value2 : [Link]
#alias Object.Value4 : [Link]
#alias [Link] : [Link]
#alias [Link] : [Link]
#alias Object.Value7 : [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

// Menu Heading States


#alias 1 : MENUHEADING_LEAVE_SCREEN
#alias 2 : MENUHEADING_ENTER_SCREEN
#alias 3 : MENUHEADING_BLANK // used by some external scripts

// Menu Heading Property Values


#alias 5 : MAINMENU_HEADER

// Menu Window States


#alias 3 : MENUWINDOW_SHRINK

// Menu Button States


#alias 1 : MENUBUTTON_BUTTONS_IN

// Soundtrack
#alias 0 : OST_JP

// Game Mode Aliases


#alias 1 : MODE_SAVEGAME

// 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

// Character Select Options


#alias -1 : PLAYER_NONE // Touching nothing on mobile
#alias 0 : PLAYER_SONIC_A
#alias 1 : PLAYER_TAILS_A
#alias 2 : PLAYER_BACK

// Delete Confirm Options


#alias -1 : DELETE_NONE // Touching nothing on mobile
#alias 0 : DELETE_YES
#alias 1 : DELETE_NO
#alias 2 : DELETE_BACK

// 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

// Engine & Callbacks


#alias 2 : MESSAGE_LOSTFOCUS

// 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

DrawSpriteScreenFX(9, FX_INK, [Link], [Link])

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

DrawSpriteScreenFX(8, FX_INK, [Link], [Link])

if Object[+ArrayPos0].StageListPos > 0 // Is this save used?


TempValue0 = Object[+ArrayPos0].PlayerListPos
TempValue0 <<= 1
TempValue0 += 4

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

// Slide the Delete button in or out


if [Link] == true
if [Link] > 14
[Link] -= 2
DrawRect([Link], 32, 64, 18, 96, 96, 128, 255)
end if
else
if [Link] < 32
[Link] += 2
end if
DrawRect([Link], 32, 64, 18, 96, 96, 128, 255)
end if
end function

// This function is shared by other scripts


function LoadSaveMenu_CheckTouchSave
TempValue0 *= 40
TempValue0 += [Link]
TempValue0 -= 87
TempValue1 = TempValue0
TempValue1 += 37
TempValue2 = [Link]
TempValue2 += 250
CheckTouchRect([Link], TempValue0, TempValue2, TempValue1)
end function

function LoadSaveMenu_SetShowDelete
[Link] = false

// Read save files


ArrayPos0 = 0
while ArrayPos0 < 4
if Object[+ArrayPos0].StageListPos > 0 // Is this save used?
[Link] = true
end if
ArrayPos0++
loop
end function

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)

// Read save files


ArrayPos0 = 0
ArrayPos1 = 0
while ArrayPos0 < 4
Object[+ArrayPos0].PlayerListPos = SaveRAM[ArrayPos1]
ArrayPos1++
Object[+ArrayPos0].Lives = SaveRAM[ArrayPos1]
ArrayPos1++
Object[+ArrayPos0].Score = SaveRAM[ArrayPos1]
ArrayPos1++
Object[+ArrayPos0].StageListPos = SaveRAM[ArrayPos1]
ArrayPos1++
Object[+ArrayPos0].TimeStones = SaveRAM[ArrayPos1]
ArrayPos1++
Object[+ArrayPos0].SpecialListPos = SaveRAM[ArrayPos1]
ArrayPos1++
Object[+ArrayPos0].ScoreBonus = SaveRAM[ArrayPos1]
ArrayPos1++
Object[+ArrayPos0].GoodFutureList = SaveRAM[ArrayPos1]
ArrayPos1++

if Object[+ArrayPos0].StageListPos > 0 // Is this save


used?
[Link] = true
end if
ArrayPos0++
loop
end if

[Link] = [Link]
[Link] -= 120
[Link] = 32

if [Link] < 256


[Link] = [Link]
[Link] += 6
else
[Link] = 0
[Link] = 255
[Link] = STATE_MAIN_SAVE_MENU
end if
break

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

// 2011 Steam lacks [Link], so we force it here first


and the other platforms can override it
if CheckResult == true
if [Link] == false
if KeyPress[0].Up == true
[Link]--
PlaySfx(SFX_G_MENUBUTTON, false)
if [Link] < BUTTON_SAVE_ONE
[Link] = BUTTON_SAVE_FOUR
end if
end if
if KeyPress[0].Down == true
[Link]++
PlaySfx(SFX_G_MENUBUTTON, false)
if [Link] > BUTTON_SAVE_FOUR
[Link] = BUTTON_SAVE_ONE
end if
end if
else
if KeyPress[0].Up == true
[Link]--
PlaySfx(SFX_G_MENUBUTTON, false)
if [Link] < BUTTON_SAVE_ONE
[Link] = BUTTON_DELETE
end if
end if
if KeyPress[0].Down == true
[Link]++
PlaySfx(SFX_G_MENUBUTTON, false)
if [Link] > BUTTON_DELETE
[Link] = BUTTON_SAVE_ONE
end if
end if
end if
// Enable touch controls if the screen is touched
CheckTouchRect(0, 0, [Link], [Link])
if CheckResult > -1
#platform: Mobile
[Link] = false
[Link] = BUTTON_NONE
#endplatform
#platform: Use_Origins
[Link] = false
[Link] = BUTTON_NONE
#endplatform
end if
else
// Touch Controls

// Check if the screen is touched (used to check if a touch was


released)
CheckTouchRect(0, 0, [Link], [Link])
TempValue3 = CheckResult

// Check if the delete button is touched


if [Link] == true
TempValue0 = [Link]
TempValue0 -= 4
TempValue1 = TempValue0
TempValue1 += 72
CheckTouchRect(TempValue0, 0, TempValue1, 32)
else
CheckResult = -1
end if

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

// Check if save file 1 is touched


TempValue0 = BUTTON_SAVE_ONE
CallFunction(LoadSaveMenu_CheckTouchSave)
if CheckResult > -1
[Link] = BUTTON_SAVE_ONE
else
if TempValue3 < 0
if [Link] == BUTTON_SAVE_ONE
KeyPress[0].Start = true
end if
else
if [Link] == BUTTON_SAVE_ONE
[Link] = BUTTON_NONE
end if
end if
end if

// Check if save file 2 is touched


TempValue0 = BUTTON_SAVE_TWO
CallFunction(LoadSaveMenu_CheckTouchSave)
if CheckResult > -1
[Link] = BUTTON_SAVE_TWO
else
if TempValue3 < 0
if [Link] == BUTTON_SAVE_TWO
KeyPress[0].Start = true
end if
else
if [Link] == BUTTON_SAVE_TWO
[Link] = BUTTON_NONE
end if
end if
end if

// Check if save file 3 is touched


TempValue0 = BUTTON_SAVE_THREE
CallFunction(LoadSaveMenu_CheckTouchSave)
if CheckResult > -1
[Link] = BUTTON_SAVE_THREE
else
if TempValue3 < 0
if [Link] == BUTTON_SAVE_THREE
KeyPress[0].Start = true
end if
else
if [Link] == BUTTON_SAVE_THREE
[Link] = BUTTON_NONE
end if
end if
end if

// Check if save file 4 is touched


TempValue0 = BUTTON_SAVE_FOUR
CallFunction(LoadSaveMenu_CheckTouchSave)
if CheckResult > -1
[Link] = BUTTON_SAVE_FOUR
else
if TempValue3 < 0
if [Link] == BUTTON_SAVE_FOUR
KeyPress[0].Start = true
end if
else
if [Link] == BUTTON_SAVE_FOUR
[Link] = BUTTON_NONE
end if
end if
end if

CallFunction(MenuHeading_CheckTouchBack)

// Enable physical controls if a button is pressed


if KeyPress[0].Up == true
[Link] = BUTTON_SAVE_FOUR
#platform: Mobile
[Link] = true
#endplatform

#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 [Link] > BUTTON_NONE // If a button was touched


if KeyPress[0].Start == true
CheckResult = true
end if
if KeyPress[0].ButtonA == true
CheckResult = true
end if
end if

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

if [Link] >= 80 // Check if the save is on a special


stage
[Link] = [Link]
[Link] -= 80
[Link] = SPECIAL_STAGE

#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

// 2011 Steam lacks [Link], so we force it here first


and the other platforms can override it
if CheckResult == true
if KeyPress[0].Left == true
Object[+ArrayPos0].PlayerListPos--
PlaySfx(SFX_G_MENUBUTTON, false)
if Object[+ArrayPos0].PlayerListPos < PLAYER_SONIC_A
Object[+ArrayPos0].PlayerListPos = PLAYER_TAILS_A
end if
end if
if KeyPress[0].Right == true
Object[+ArrayPos0].PlayerListPos++
PlaySfx(SFX_G_MENUBUTTON, false)
if Object[+ArrayPos0].PlayerListPos > PLAYER_TAILS_A
Object[+ArrayPos0].PlayerListPos = PLAYER_SONIC_A
end if
end if
// Enable touch controls if the screen is touched
CheckTouchRect(0, 0, [Link], [Link])
if CheckResult > -1
#platform: Mobile
[Link] = false
Object[+ArrayPos0].PlayerListPos = PLAYER_NONE
#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

// Check if Sonic is pressed


CheckTouchRect(0, 0, [Link], [Link])
TempValue3 = CheckResult

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

// Check if Tails is pressed


TempValue0 = [Link]
TempValue0 += 8
TempValue1 = [Link]
TempValue1 += 56
CheckTouchRect(TempValue0, 126, TempValue1, 184)
if CheckResult > -1
Object[+ArrayPos0].PlayerListPos = PLAYER_TAILS_A
else
if TempValue3 < 0
if Object[+ArrayPos0].PlayerListPos == PLAYER_TAILS_A
KeyPress[0].Start = true
end if
else
if Object[+ArrayPos0].PlayerListPos == PLAYER_TAILS_A
Object[+ArrayPos0].PlayerListPos = PLAYER_NONE
end if
end if
end if

// Check if the back button is pressed


TempValue0 = [Link]
TempValue0 -= 76
CheckTouchRect(TempValue0, 192, [Link], [Link])
if CheckResult > -1
Object[+ArrayPos0].PlayerListPos = PLAYER_BACK
[Link] = true
else
[Link] = false
if TempValue3 < 0
if Object[+ArrayPos0].PlayerListPos == PLAYER_BACK
KeyPress[0].ButtonB = true
end if
else
if Object[+ArrayPos0].PlayerListPos == PLAYER_BACK
Object[+ArrayPos0].PlayerListPos = PLAYER_NONE
end if
end if
end if

// Enable physical controls if a button is pressed


if KeyPress[0].Left == true
Object[+ArrayPos0].PlayerListPos = PLAYER_TAILS_A
#platform: Mobile
[Link] = true
#endplatform

#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()

if [Link] == PLAYER_SONIC_A // PLAYER_SONIC in


origins plus - why did they update this object in plus even if it's unused in
origins? wish i knew..
LoadVideo("Opening")

// #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

if [Link] >= SAVE_DELETE


[Link] = SAVE_NORMAL
[Link] = SAVE_NORMAL
[Link] = SAVE_NORMAL
[Link] = SAVE_NORMAL
[Link] = SAVEMODE_NORMAL
else
[Link] = SAVE_DELETE
[Link] = SAVE_DELETE
[Link] = SAVE_DELETE
[Link] = SAVE_DELETE
[Link] = SAVEMODE_DELETE
end if
end if
break

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

// 2011 Steam lacks [Link], so we force it here first


and the other platforms can override it
if CheckResult == true
if KeyPress[0].Up == true
[Link]--
PlaySfx(SFX_G_MENUBUTTON, false)
if [Link] < DELETE_YES
[Link] = DELETE_NO
end if
end if

if KeyPress[0].Down == true
[Link]++
PlaySfx(SFX_G_MENUBUTTON, false)
if [Link] > DELETE_NO
[Link] = DELETE_YES
end if
end if

// Enable touch controls if the screen is touched


CheckTouchRect(0, 0, [Link], [Link])
if CheckResult > -1

#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 YES is touched


CheckTouchRect(0, 0, [Link], [Link])
TempValue3 = CheckResult
TempValue0 = [Link]
TempValue0 -= 34
TempValue1 = [Link]
TempValue1 += 34
CheckTouchRect(TempValue0, 110, TempValue1, 135)
if CheckResult > -1
[Link] = DELETE_YES
else
if TempValue3 < 0
if [Link] == DELETE_YES
KeyPress[0].Start = true
end if
else
if [Link] == DELETE_YES
[Link] = DELETE_NONE
end if
end if
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

// Check if the back button is touched


TempValue0 = [Link]
TempValue0 -= 76
CheckTouchRect(TempValue0, 192, [Link], [Link])
if CheckResult > -1
[Link] = DELETE_BACK
[Link] = true
else
[Link] = false
if TempValue3 < 0
if [Link] == DELETE_BACK
KeyPress[0].ButtonB = true
end if
else
if [Link] == DELETE_BACK
[Link] = DELETE_NONE
end if
end if
end if

// Enable physical controls if a button is pressed


if KeyPress[0].Up == true
[Link] = DELETE_NO
#platform: Mobile
[Link] = true
#endplatform
#platform: Use_Origins
[Link] = true
#endplatform
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 [Link] > DELETE_NONE // If a button was touched


if KeyPress[0].Start == true
CheckResult = true
end if
if KeyPress[0].ButtonA == true
CheckResult = true
end if
end if

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

// Now delete it in SaveRAM


ArrayPos1 = [Link]
ArrayPos1 <<= 3
SaveRAM[ArrayPos1] = 0
ArrayPos1++
SaveRAM[ArrayPos1] = 3
ArrayPos1++
SaveRAM[ArrayPos1] = 0
ArrayPos1++
SaveRAM[ArrayPos1] = 0
ArrayPos1++
SaveRAM[ArrayPos1] = 0
ArrayPos1++
SaveRAM[ArrayPos1] = 0
ArrayPos1++
SaveRAM[ArrayPos1] = 0
ArrayPos1++
SaveRAM[ArrayPos1] = 0
end if

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]

// Flash the border for the selected character


TempValue1 = [Link]
TempValue1 &= 3
TempValue1 >>= 1

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

DrawSpriteScreenFX(57, FX_INK, [Link], 84)


if [Link] == DELETE_YES
if TempValue0 == 0
DrawSpriteScreenFX(76, FX_INK, [Link], 112)
else
DrawSpriteScreenFX(75, FX_INK, [Link], 112)
end if
else
DrawSpriteScreenFX(75, FX_INK, [Link], 112)
end if
if [Link] == DELETE_NO
if TempValue0 == 0
DrawSpriteScreenFX(78, FX_INK, [Link], 146)
else
DrawSpriteScreenFX(77, FX_INK, [Link], 146)
end if
else
DrawSpriteScreenFX(77, FX_INK, [Link], 146)
end if
ArrayPos0 = [Link]
[Link] = 255
CallFunction(LoadSaveMenu_DrawSaveFiles)
break
end switch
end sub
sub ObjectStartup
switch [Link]
case LANG_ENGLISH
LoadSpriteSheet("Menu/MenuGfx2_EN.gif")
break
case LANG_FRENCH
LoadSpriteSheet("Menu/MenuGfx2_FR.gif")
break
case LANG_ITALIAN
LoadSpriteSheet("Menu/MenuGfx2_IT.gif")
break
case LANG_DEUTSCH
LoadSpriteSheet("Menu/MenuGfx2_DE.gif")
break
case LANG_SPANISH
LoadSpriteSheet("Menu/MenuGfx2_ES.gif")
break
case LANG_JAPANESE
LoadSpriteSheet("Menu/MenuGfx2_JP.gif")
break
end switch

SpriteFrame(4, 2, 32, 32, 389, 1) // #0 - Save 1 Gear


SpriteFrame(4, 2, 32, 32, 422, 1) // #1 - Save 2 Gear
SpriteFrame(4, 2, 32, 32, 455, 1) // #2 - Save 3 Gear
SpriteFrame(4, 2, 32, 32, 446, 34) // #3 - Save 4 Gear
SpriteFrame(3, 2, 40, 32, 259, 1) // #4 - Mini Sonic Gear
SpriteFrame(3, 2, 64, 32, 259, 1) // #5 - Mini Sonic + Hey
SpriteFrame(3, 2, 40, 32, 324, 1) // #6 - Mini Tails Gear
SpriteFrame(3, 2, 64, 32, 324, 1) // #7 - Mini Tails + Hey
SpriteFrame(45, 12, 13, 13, 488, 1) // #8 - Triangle Detail
SpriteFrame(0, 0, 250, 37, 259, 421) // #9 - Select Border
SpriteFrame(64, 12, 128, 16, 1, 1) // #10 - New Game
SpriteFrame(64, 12, 144, 16, 259, 93) // #11 - Palmtree Panic
SpriteFrame(64, 12, 144, 16, 259, 110) // #12 - Collision Chaos
SpriteFrame(64, 12, 144, 16, 259, 127) // #13 - Tidal Tempest
SpriteFrame(64, 12, 144, 16, 259, 144) // #14 - Quartz Quadrant
SpriteFrame(64, 12, 144, 16, 259, 161) // #15 - Wacky Workbench
SpriteFrame(64, 12, 144, 16, 259, 178) // #16 - Stardust Speedway
SpriteFrame(64, 12, 144, 16, 259, 195) // #17 - Metallic Madness
SpriteFrame(64, 12, 144, 16, 259, 212) // #18 - Final Fever
SpriteFrame(64, 12, 144, 16, 259, 229) // #19 - Special Stage
//Highlights
SpriteFrame(64, 12, 128, 16, 130, 1) // #20 - New Game
SpriteFrame(64, 12, 144, 16, 259, 268) // #21 - Palmtree Panic
SpriteFrame(64, 12, 144, 16, 259, 285) // #22 - Collision Chaos
SpriteFrame(64, 12, 144, 16, 259, 302) // #23 - Tidal Tempest
SpriteFrame(64, 12, 144, 16, 259, 319) // #24 - Quartz Quadrant
SpriteFrame(64, 12, 144, 16, 259, 336) // #25 - Wacky Workbench
SpriteFrame(64, 12, 144, 16, 259, 353) // #26 - Stardust Speedway
SpriteFrame(64, 12, 144, 16, 259, 370) // #27 - Metallic Madness
SpriteFrame(64, 12, 144, 16, 259, 387) // #28 - Final Fever
SpriteFrame(64, 12, 144, 16, 259, 404) // #29 - Special Stage

ReadSaveRAM()
[Link] = SaveRAM[38]
if SaveRAM[36] == true
[Link] = true
end if

SpriteFrame(-112, 0, 224, 16, 1, 477) // #30 - Player Select

SpriteFrame(-16, -20, 32, 40, 26, 357) // #31 - Sonic


if [Link] == true
SpriteFrame(-16, -12, 32, 32, 59, 365) // #32 - Tails
else
SpriteFrame(-16, -12, 32, 32, 72, 332) // #32 - Locked Tails
end if

SpriteFrame(-24, -24, 48, 48, 405, 88) // #33 - Character Border

SpriteFrame(-14, 0, 27, 8, 454, 88) // #34 - Sonic Name


if [Link] == true
// Bug Details:
// This works fine everywhere else, but in the Blit releases of the
game, this sprite was
// extended in the JP spritesheet to match the width of (unused)
Japanese text sprites
// This difference wasn't taken into account here, causing Tails' name
to be cut off in-game
SpriteFrame(-12, 0, 24, 8, 482, 88) // #35 - Tails Name
else
SpriteFrame(-12, 0, 24, 8, 92, 365) // #35 - Tails Name Locked
end if

SpriteFrame(-14, 0, 27, 8, 454, 97) // #36 - Sonic Name Highlight


if [Link] == true
// Bug Details: Same as above
SpriteFrame(-12, 0, 24, 8, 482, 97) // #37 - Tails Name Highlight
else
SpriteFrame(-12, 0, 24, 8, 92, 374) // #37 - Tails Name Locked
end if

SpriteFrame(224, 7, 8, 8, 404, 137) // #38 - Green Time Stone


SpriteFrame(232, 7, 8, 8, 413, 137) // #39 - Orange Time Stone
SpriteFrame(220, 15, 8, 8, 422, 137) // #40 - Yellow Time Stone
SpriteFrame(228, 15, 8, 8, 431, 137) // #41 - Blue Time Stone
SpriteFrame(236, 15, 8, 8, 440, 137) // #42 - Cyan Time Stone
SpriteFrame(224, 23, 8, 8, 449, 137) // #43 - Purple Time Stone
SpriteFrame(232, 23, 8, 8, 458, 137) // #44 - Red Time Stone

// (#45 - #51) - Time Stone Socket


SpriteFrame(224, 7, 8, 8, 467, 137)
SpriteFrame(232, 7, 8, 8, 467, 137)
SpriteFrame(220, 15, 8, 8, 467, 137)
SpriteFrame(228, 15, 8, 8, 467, 137)
SpriteFrame(236, 15, 8, 8, 467, 137)
SpriteFrame(224, 23, 8, 8, 467, 137)
SpriteFrame(232, 23, 8, 8, 467, 137)

SpriteFrame(0, 0, 64, 18, 404, 196) // #52 - Delete


SpriteFrame(0, 0, 64, 18, 404, 215) // #53 - Delete Highlight
SpriteFrame(0, 0, 64, 18, 404, 234) // #54 - Cancel
SpriteFrame(0, 0, 64, 18, 404, 253) // #55 - Cancel Highlight
SpriteFrame(0, 0, 250, 37, 259, 459) // #56 - Orange Alpha
SpriteFrame(-112, 0, 224, 16, 1, 443) // #57 - "Delete Save Game?"
SpriteFrame(-112, 0, 224, 16, 1, 460) // #58 - Unused
SpriteFrame(208, 12, 8, 16, 478, 183) // #59 - 1
SpriteFrame(208, 12, 8, 16, 487, 183) // #60 - 2
SpriteFrame(208, 12, 8, 16, 496, 183) // #61 - 3
SpriteFrame(208, 12, 8, 16, 469, 200) // #62 - 4
SpriteFrame(208, 12, 8, 16, 478, 200) // #63 - 5
SpriteFrame(208, 12, 8, 16, 487, 200) // #64 - 6
SpriteFrame(208, 12, 8, 16, 496, 200) // #65 - 7
SpriteFrame(208, 12, 8, 16, 469, 217) // #66 - 8 (Unused)
// Highlights
SpriteFrame(208, 12, 8, 16, 478, 234) // #67 - 1
SpriteFrame(208, 12, 8, 16, 487, 234) // #68 - 2
SpriteFrame(208, 12, 8, 16, 496, 234) // #69 - 3
SpriteFrame(208, 12, 8, 16, 469, 251) // #70 - 4
SpriteFrame(208, 12, 8, 16, 478, 251) // #71 - 5
SpriteFrame(208, 12, 8, 16, 487, 251) // #72 - 6
SpriteFrame(208, 12, 8, 16, 496, 251) // #73 - 7
SpriteFrame(208, 12, 8, 16, 469, 268) // #74 - 8 (Unused)

SpriteFrame(-32, 0, 64, 21, 404, 319) // #75 - Yes


SpriteFrame(-32, 0, 64, 21, 404, 341) // #76 - Yes Highlight
SpriteFrame(-32, 0, 64, 21, 404, 363) // #77 - No
SpriteFrame(-32, 0, 64, 21, 404, 385) // #78 - No Highlight
end sub

// ========================
// 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

You might also like