Beta Level Order - RetroKoH/S1Fixed GitHub Wiki
(Original guide by RetroKoH)
Source: See Commit
Commit: c38f62d
This mod can be toggled in S1Fixed by setting BetaLevelOrder to 0 or 1.
Here is Sonic 1's Level Order, according to the REV01 Level Select:
Did you know that Sonic 1's level order used to be radically different? I mean, you probably did if you've ever seen the original Level Select order, or the internal order of zones in the game for that matter:
It's said that the level order was changed due to the original order being too steep of a difficulty curve for players. Well, what if we wanted to play the game in this way? We can do that, actually!
Changing Progression Order
First, we should actually change the in-game progression order. The Got Through cards are actually responsible for this, as they take your current zone/act ID, and use these to set the next zone/act ID prior to the level transition. All we need to do is change the IDs around. Open__incObj/3A Got Through Card.asm_ and find LevelOrder. Change the listed data to this:
LevelOrder:
; Green Hill Zone
dc.b id_GHZ, 1 ; Act 1
dc.b id_GHZ, 2 ; Act 2
dc.b id_LZ, 0 ; Act 3
dc.b 0, 0
; Labyrinth Zone
dc.b id_LZ, 1 ; Act 1
dc.b id_LZ, 2 ; Act 2
dc.b id_MZ, 0 ; Act 3
dc.b id_SBZ, 2 ; Scrap Brain Zone Act 3
; Marble Zone
dc.b id_MZ, 1 ; Act 1
dc.b id_MZ, 2 ; Act 2
dc.b id_SLZ, 0 ; Act 3
dc.b 0, 0
; Star Light Zone
dc.b id_SLZ, 1 ; Act 1
dc.b id_SLZ, 2 ; Act 2
dc.b id_SYZ, 0 ; Act 3
dc.b 0, 0
; Spring Yard Zone
dc.b id_SYZ, 1 ; Act 1
dc.b id_SYZ, 2 ; Act 2
dc.b id_SBZ, 0 ; Act 3
dc.b 0, 0
; Scrap Brain Zone
dc.b id_SBZ, 1 ; Act 1
dc.b id_LZ, 3 ; Act 2
dc.b 0, 0 ; Final Zone
dc.b 0, 0
even
zonewarning LevelOrder,8
Change Level Select Order and Text
That makes our game follow the new (old) progression, but now we need to change the Level Select. This is actually very easy, as modern Sonic 1 disassemblies already have this as an option, listed under if Revision=0
.
Look for the labels LevSel_Ptrs and LevelMenuText, and use the data listed under if Revision=0
. The Menu Text is just a binary blob (unless you followed the ASCII guide) but you'll simply want to use the one that doesn't have (JP) in the filename. The pointers should look like this:
LevSel_Ptrs:
dc.b id_GHZ, 0
dc.b id_GHZ, 1
dc.b id_GHZ, 2
dc.b id_LZ, 0
dc.b id_LZ, 1
dc.b id_LZ, 2
dc.b id_MZ, 0
dc.b id_MZ, 1
dc.b id_MZ, 2
dc.b id_SLZ, 0
dc.b id_SLZ, 1
dc.b id_SLZ, 2
dc.b id_SYZ, 0
dc.b id_SYZ, 1
dc.b id_SYZ, 2
dc.b id_SBZ, 0
dc.b id_SBZ, 1
dc.b id_LZ, 3
dc.b id_SBZ, 2
dc.b id_SS, 0 ; Special Stage
dc.w $8000 ; Sound Test
even
If you DID follow the ASCII guide (which you should), this is what your level select text should look like:
LevelMenuText:
dc.b "GREEN HILL ZONE STAGE 1"
dc.b " STAGE 2"
dc.b " STAGE 3"
dc.b "LABYRINTH ZONE STAGE 1"
dc.b " STAGE 2"
dc.b " STAGE 3"
dc.b "MARBLE ZONE STAGE 1"
dc.b " STAGE 2"
dc.b " STAGE 3"
dc.b "STAR LIGHT ZONE STAGE 1"
dc.b " STAGE 2"
dc.b " STAGE 3"
dc.b "SPRING YARD ZONE STAGE 1"
dc.b " STAGE 2"
dc.b " STAGE 3"
dc.b "SCRAP BRAIN ZONE STAGE 1"
dc.b " STAGE 2"
dc.b " STAGE 3"
dc.b "FINAL ZONE "
dc.b "SPECIAL STAGE "
dc.b "SOUND SELECT "
even
And there we go. We have the beta level order reimplemented!