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:
STHX_LS_guide_2

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:
Sonic1_level_select

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!