Sonic 2 Recreation

Lost Levels Guide

Back to Main menu

Back to Guides

 

Contents

Introduction

Level 01 - Winter Hill?

How to sort out the life icons

How to load level art

Rings and Objects

Wood Zone

Rings and Objects 2

Dust Hill

Hidden Palace

Genocide City

Level Size Array

How to get the lost badniks working

Introduction
Well, Iím glad Thunderspeed was able to recover this. This will show you how to make the lost levels able into your ROM.

Back to Top


Level 01 - Winter Hill?
Ok, this level in Sonic 2 Beta was never touched. Apparently this was going to be a level called Winter Hill. You could make it a winter level or make it anything; itís your choice. Now before you say Ďthere are no rings or objects and the life icons are wrong and there is no endí, we can fix that. As long as you understand hex, you will be fine.

Back to Top

How to sort out the life icons
There might be a guide to tell you how to do this but I found this out myself (believe it or not), but it is pretty easy. First of all go to $42594. This is for EHZ. Now copy all the data from $42594-4259F. Now go to $425A0. This is Winter Hill zone. Then paste the data and save. Repeat this with $425AC. And save it. Now go to Winter Hill or Wood Zone on the game and the Life icon should be showing Sonic if you are Sonic, Tails if your tails etc. NOTE: If you have been editing the art data for these two levels, it is best to copy the ROM before doing this. And then once you have followed this procedure, follow the next step ĎHow to get some level art upí using the hack you have copied and after, your level should be back to normal and the life icon should be ok.

Back to Top

How to get some level art up
Now, here is the easy way. Using ESEII (found on SSRG) open your hack and go onto level editor. Load up level 00 01. It should come up with EHZ patterns and palette. Go to the tab ĎIMPORTARí. Load up Sonic 2, Sonic 2 Beta or Sonic 3K. Then go on the dropdown menu (if it says Carregar ROM ou Save State, pick a different ROM). Pick a level that you would like to be in your hack. Then check all of the boxes (the palette check box may effect EHZ palette). Then this is what I do, I select ĎLoadí then ĎSave ROMí then click on the tab ĎMenuí and click ĎSave to ROMí. Check if this had worked.

Back to Top

How to sort out the rings and objects
Ok, this can be quite easy. Go to $E4300. Every 2 bytes (1 byte is two numbers put together so 12 21 is 2 bytes) equal 1 level and 1 act. The first 2 bytes should be 00 44. This is EHZ act 1. This leads it to another area to the ROM. Now the rings for EHZ act 1 is located at $E4344. So the 44 leads it to $E4344. Do you see what I mean? Here is another example: The next 2 bytes (in $E4300) are 02 6A. This is EHZ act 2. Do you know where it leads? $E456A. In $E4300 the first two bytes are 00 44. Now I think that the 00 means how far down the offset goes. So, experiment in different ways.



Here is an example I did for Winter Hill act 1. As you can see $EBD70 is empty for a while. We can use this for the rings in WHZ act 1 (I donít think this mucks up the game but Iím not held responsible). So to do this, go to $E4304 and you should see 04 AC. Now change it: 04 AC Ė 7A 70. Then save it. Now, go to E4344 Ė E4569 and copy all that data (make sure that the data you are copying ends with FF FF). Go to EBD70 and copy the data. It shouldnít overwrite anything but a whole load of 00ís and yes, after the FF FF, there will still be some 00ís left but leave it. And then save the ROM. If everything went according to plan, there should be some rings on WHZ and they are exactly the same as EHZ. Does it mean that EHZ is busted? Well, it shouldnít. Use SonED or ESEII and load Level 01. Edit the rings and save. So far, Iíve changed a lot to it and so far, nothing has gone wrong with my hack. And the beauty thing is that when you have changed the rings in WHZ, EHZ is still normal (well it should be).

(If any of this information is wrong or it does not work, then let me know)


Now, the objects work out the same way. The offsetting is located at $E6800. Yet again the first two bytes are EHZ act 1. They should be 00 4A. This leads to $E684A. The patterns with the two bytes are behaving like the rings. So you want to change $E6804 which is 55 52. Thatís currently leading to $EBD52 (as you can see, thatís so close to the rings we have just added). We need to change that. Experiment with the information I gave you to point it to another area of the ROM (here is a way to find out where it has pointed to. When you change the bytes, save it and load ESEII. Load your hack and the level. On the menu tab, there is a box saying Ďobject offsetí. Is that where you wanted it to go? If no, back to hex and change the two bytes. If yes, edit away). Now here is a tip that you MIGHT want to use. If you do, you have got to be careful (it is easy). You can share objects. For example, if you wanted WHZ to share with EHZ objects, go to $E6804. Change the 2 bytes to 00 4A. If you look at the 2 bytes for EHZ ($E6800) it is also 00 4A. Now on WHZ, the objects should be there like EHZ. BUT, unfortunately you cannot edit it. Well you can but this is what will happen if you do. If you moved an object in WHZ, it would also have been moved in EHZ. This can be done with the ring as well but the same effect happens.



If you want to arrange the objects yourself instead of copying from the level, make sure you find an empty area of the ROM (follow the procedure I gave you $E6800). Now this is how it works. There are 6 bytes per sprite. The first 2 bytes is the X coordinate for the sprite. The next two bytes is the Y coordinate for the sprite. Now the last 2 bytes is the sprite you want. The first byte is the number of the sprite (e.g. a monitor is number 26) and the second bytes are it content (e.g. 01 is for the extra life). If you want another sprite, follow this procedure again but once you have finished with your sprites, make sure that you end it in FF FF. Just In case I have lost you, here is an example. On WHZ I have a loop and I want to put a star post on top of that loop. The coordinates are found as Ď02E4036Cí (half those to get the X and Y coordinates). So on Hex at $E6B10 (donít use this as an offset as it is already used, look for an empty part of the ROM, pure 00ís) and I Put down 02 E4 03 6C 79 01 and then finish off with FF FF. I save the ROM and play WHZ. On top of my loop is a star post.



If you canít find the X or Y coordinate then

- Play Sonic 2 in debug mode and the first line of numbers of the score bar is the coordinates. Remember the first 4 numbers are for X and the second 4 are for the Y.

- Using SonED using the object placement, it gives you the coordinates in the same way as the game.

Back to Top

Wood Zone
This is my favourite level that I am looking forward to hack into. For the level icons got to ĎHow to get the life iconsí. Same with the rings and objects but remember that they are talking about Winter Hill. Every 2 bytes in the rings are for one level one act at $E4300. Here is how it works for the rings:
 

Level in order of bytes
Where it points to

EHZ 1
E4344

EHZ 2
E456A

WHZ 1
E47AC

WHZ 2
E47AE

WZ 1
E47B0

WZ 2
E47B2

DHZ 1
E47B4

DHZ 2
E47B6

MZ 1
E47B8

MZ 2
E4A2A

MZ 3
E4C48

MZ 4
E4D72

WFZ 1
E6154

WFZ 2
E6292

HTZ 1
E4D74

HTZ 2
E4EAA

HPZ 1
E50E8

HPZ 2
E525A

GCZ 1
E525C

GCZ 2
E525F

OOZ 1
E5260

OOZ 2
E5422

MCZ 1
E5598

MCZ 2
E570E

CNZ1
E5944

CNZ 2
E5B7E

CPZ 1
E5E2C

CPZ 2
E5F9E

DEZ 1
E6150

DEZ 2
E6152

ARZ 1
E6294

ARZ 2
E642E

SCZ 1
E6684

SCZ 2
E66D6
 

Please remember that if you have edited some in your hack, these might be wrong



Now the objects work the same way. I will show you the offset that they point to like above for rings,

Level in order of bytes
Where it points to

EHZ 1
E684A

EHZ 2
E6B7A

WHZ 1
EBD52

WHZ 2
EBD52

WZ 1
EBD52

WZ 2
EBD52

DHZ 1
E47B4

DHZ 2
E47B6

MZ 1
E6F34

MZ 2
E73C0

MZ 3
E78EE

MZ 4
E78EE (shares with MZ 3)

WFZ 1
E7F48

WFZ 2
E82FC

HTZ 1
E8302

HTZ 2
E8668

HPZ 1
E8C80

HPZ 2
E8D94

GCZ 1
E525C

GCZ 2
E525E

OOZ 1
E8DA0

OOZ 2
E9214

MCZ 1
E968E

MCZ 2
E99A0

CNZ1
E91DE

CNZ 2
EA3D8

CPZ 1
EA9D2

CPZ 2
EAD6E

DEZ 1
EB230

DEZ 2
EB254

ARZ 1
EB25A

ARZ 2
EB6A4

SCZ 1
EBBDE

SCZ 2
EBD4C
 

Please remember that if you have edited some in your hack, these might be wrong



Some of these objects share with each other for example MZ 4 shares with MZ 3 and WHZ and WZ share.



Loading the art up
This is pretty similar to what you have to do with WHZ. Load up ESEII with your hack and go to level editor and load up Wood. Now where it says ĎImportarí load up Sonic 2 beta and pick wood zone. Tick every box (if you tick the palette box, this may affect EHZ). Click on load, then save, then the tab Ďmenuí and click on save. It should work. For more info go here



Dust Hill
I really do not need to explain do I? You know what to do. But if you want to know what it might of turn out like, read on. Now, in Sonic 2 Beta, this level was like MCZ but if you look, there was no level called MCZ. And in the final, there is with the same tiles and there is no Dust Hill. So, you can use MCZ tiles, or use any other tiles from a Sonic game OR you can use tiles provided by Esrael which was apparently going to turn out like. Itís up to you. If you want the tiles, I cannot help you.



Hidden Palace
Aha! This is nearly everyoneís favourite level in the game. This level can be hard to restore but some of it is so easy. First of all for the level art, you know what to with that. Now, some of the objects may still be playing up but this can be sorted. All you have to do with hex is go to $425F4 and it should be number 14. Change that to 1E. Then go to $425F8 and it should be number 15. Change it to 1F. All of the objects should be sorted except from a few spheres.



Genocide City
Yet again, I do not need to explain but here is some information about what the level was going to turn out like. Well, like Winter Hill, this level was never touched. But it was being considered. It has been said that this level was linked with CPZ because of its music. So you could use the CPZ tile for this level or you can use any tiles from any game.

Back to Top

Level Size Array
This can be confusing, but Iíve tried to explain it as easy as I can with the help from Guifrog and bobxp.



Level
Act
Offset
Bytes

EMERALD HILL
1
C054 (0000C054)
00 00 29 A0 00 00 03 20


2
C05C (0000C05C)
00 00 29 40 00 00 04 20

WINTER HILL
1
C064 (0000C064)
00 00 3F FF 00 00 07 20


2
C06C (0000C06C)
00 00 3F FF 00 00 07 20

WOOD
1
C074 (0000C074)
00 00 3F FF 00 00 07 20


2
C07C (0000C07C)
00 00 3F FF 00 00 07 20

DUST HILL
1
C084 (0000C084)
00 00 3F FF 00 00 07 20


2
C08C (0000C08C)
00 00 3F FF 00 00 07 20

METROPOLIS
1
C094 (0000C094)
00 00 22 80 FF 00 08 00


2
C09C (0000C09C)
00 00 1E 80 FF 00 08 00

METROPOLIS
3
C0A4 (0000C0A4)
00 00 2A 80 FF 00 08 00


4
C0AC (0000C0AC)
00 00 3F FF FF 00 08 00

WING FORTRESS
1
C0B4 (0000C0B4)
00 00 3F FF 00 00 07 20


2
C0BC (0000C0BC)
00 00 3F FF 00 00 07 20

HILL TOP
1
C0C4 (0000C0C4)
00 00 28 00 00 00 07 20


2
C0CC (0000C0CC)
00 00 32 80 00 00 07 20

HIDDEN PALACE
1
C0D4 (0000C0D4)
00 00 3F FF 00 00 07 20


2
C0DC (0000C0DC)
00 00 3F FF 00 00 07 20

GENOCIDE CITY
1
C0E4 (0000C0E4)
00 00 3F FF 00 00 07 20


2
C0EC (0000C0EC)
00 00 3F FF 00 00 07 20

OIL OCEAN
1
C0F4 (0000C0F4)
00 00 2F 80 00 00 06 80


2
C0FC (0000C0FC)
00 00 2D 00 00 00 06 80

MYSTIC CAVE
1
C104 (0000C104)
00 00 23 80 03 C0 07 20


2
C10C (0000C10C)
00 00 3F FF 00 60 07 20

CASINO NIGHT
1
C114 (0000C114)
00 00 27 A0 00 00 07 20


2
C11C (0000C11C)
00 00 2A 80 00 00 07 20

CHEMICAL PLANT
1
C124 (0000C124)
00 00 27 80 00 00 07 20


2
C12C (0000C12C)
00 00 2A 80 00 00 07 20

DEATH EGG
1
C134 (0000C134)
00 00 10 00 00 C8 00 C8


2
C13C (0000C13C)
00 00 10 00 00 C8 00 C8

AQUATIC RUIN
1
C144 (0000C144)
00 00 28 C0 02 00 06 00


2
C14C (0000C14C)
00 00 3F FF 01 80 07 10

SKY CHASE
1
C154 (0000C154)
00 00 3F FF 00 00 00 00


2
C15C (0000C15C)
00 00 3F FF 00 00 07 20




This is quite easy to understand. For explaining things, I am going to use Emerald Hill zone act 1 as an example. Now to find itís level size array, go to its offset, which is $0C054. For level size array, there are 8 bytes per act so there are 16 bytes per level. For the bytes, itís been colour-coded so it is easier to understand. The 4 bytes coloured red is the X coordinates to where the level ends. The 4 bytes coloured black is the Y coordinates to where the level ends. As you can see, the bytes for EHZ act 1 is
00 00 29 A0 00 00 03 20. So 00 00 29 A0 is the X coordinates. 00 00 03 20 is the Y coordinates. So when playing the game on EHZ act one, when you (or Sonic) get close to these coordinates, the level ends so you donít go any further. So you can change the coordinates if you want the level longer or shorter (Iím not 100% sure but I donít think that WHZ, WZ, DHZ, HPZ or GCZ can get any longer). If you still donít understand or any of the information is wrong, then let me know.



A Quote from bobxp

"There's a little problem here. Okay, your table at the bottom. Let's take EHZ1. It says:

EMERALD HILL 1 C054 (0000C054)
00 00 29 A0 00 00 03 20

It says below that the green is the X end, and the red is the Y end. THIS IS WRONG!!

It should be colour coded as follows:

EMERALD HILL 1 C054 (0000C054)
00 00 29 A0 00 00 03 20

In this colour coding, the green part is the X start position (the furthest to the left the screen can go), the blue part is the X end position (the furthest to the right the screen can go), the red part is the Y start position (the furthest upwards the screen can go) and the purple part is the Y end position (the furthest downwards the screen can go."

Back to Top

How to get the lost badniks working

(Credit goes to Sonic Hachelle-Bee and StephenUK)

The sprites pointers table

In both Sonic 2 Beta and Sonic 2 Final, you have a sprites pointers table where all pointers for the program of each sprite are stored in order by their sprite ID.

Sonic 2 Beta sprites pointers table: $D01A
Sonic 2 Final sprites pointers table: $1600C
Usually, as Sonic 2 Beta, and as Esrael made it in its hacks, we assume that:

ID $4C is for the batbot.
ID $4D is for the trycerobot.
ID $4E is for the crocobot.
ID $4F is for the dinobot.
ID $62 is for the snailbot.

All these sprites ID are empty, and we will use them for our sprites.
For example, in Sonic 2 Final, the pointer that jumps to the batbot is at $16138 and it's currently 00 01 63 7C (empty).
The one for the trycerobot is next, and it's again 00 01 63 7C. You will have to change these pointers at the end once the program for each sprite is implemented.

 

Find the program of each sprite

You have to copy the program, for each sprite, from Sonic 2 Beta and paste it somewhere in Sonic 2 Final.
Here is the addresses where to copy these sprites from Sonic 2 Beta:

For the most lazy ones, the boring part has been done: click here.

Batbot: $1EE68-$1F2EE
Trycerobot: $1D984-$1DC52
Crocobot: $1F2F0-$1F5E8
Dinobot: $1DEAC-$1E00E
Snailbot: $1F6E8-$1F99C and $1EAF2-$1EB8C -> Paste the second part (animated fire) after the first (main) part. The result is $34E in size.

Now, you can change your pointers in the sprites pointers table to jump at these sprites programs.

 

Fix the pointers

Now that you copied all programs for the lost sprites, for now, all pointers refers to routines from Sonic 2 Beta, and then the pointers are wrong. We have to fix some pointers in these programs so that the game uses the right routines from Sonic 2 Final. This is the most boring part! We will assume that for each sprite program, the first byte is at address $0.

For the most lazy ones, if you previously downloaded the archive, you only have to change addresses in blue color. The others are already fixed.
Thanks Sonic Hachelle-Bee! =P
 

Batbot:

$14 -> 21 7C 00 01 F1 06
Change the pointer to jump to $29E -> 00 1E 00 40 00 62

$1C -> 31 7C 25 30
VRAM address and palette line to use.
In red, the palette line to use for the sprite.
In green, the VRAM address. $530x$20=$A600.
Change it to $23B2 instead.

$64 -> 43 F9 00 01 F0 D2
Change the pointer to jump to $26A -> 00 08 00 0C 00 1B

$7C -> 4E B9 00 00 32 0A
Jump to subroutine. Change it to $000033B6.

$D0 -> 43 F9 00 01 F0 D2

Same as before. Jump to $26A -> 00 08 00 0C 00 1B

$1C2 -> 4E B9 00 00 32 0A
Same as before. Change it to $000033B6.

$1EC -> 4E B9 00 00 31 E4
Jump to subroutine. Change it to $00003390.

$474 -> 4E F9 00 00 D2 A0
Jump. Change it to $000163D2.

$47A -> 4E F9 00 00 D4 12
Jump. Change it to $00016544.

$480 -> 4E F9 00 00 D2 7A
Jump. Change it to $000163AC.

 

Trycerobot:

$12 -> 21 7C 00 01 DA EE
Change the pointer to jump to $16A -> 00 10 00 3A 00 64

$1A -> 31 7C 23 C4
VRAM address and palette line to use.
In red, the palette line to use for the sprite.
In green, the VRAM address. $3C4x$20=$7880.
Change this to $23A0 instead.

$48 -> 4E B9 00 01 38 98
Jump to subroutine. Change it to $0001EDFA.

$70 -> 43 F9 00 01 DA D2
Change the pointer to jump to $14E -> 00 06 00 14 00 17

$AE -> 4E B9 00 01 38 98
Jump to subroutine. Change it to $0001EDFA.

$2BC -> 4E F9 00 00 D2 A0
Jump. Change it to $000163D2.

$2C2 -> 4E F9 00 00 D4 12
Jump. Change it to $00016544.

$2C8 -> 4E F9 00 00 D2 4E
Jump. Change it to $00016380.

 

Crocobot:

$12 -> 21 7C 00 01 F4 20
Change the pointer to jump to $130 -> 00 18 00 3A 00 5C

$1A -> 31 7C 23 00
VRAM address and palette line to use.
In red, the palette line to use for the sprite.
In green, the VRAM address. $300x$20=$6000.
Change this to $2500 instead.

$48 -> 4E B9 00 01 38 98
Jump to subroutine. Change it to $0001EDFA.

$70 -> 43 F9 00 01 F4 06
Change the pointer to jump to $116 -> 00 06 00 0E 00 11

$AE -> 4E B9 00 01 38 98
Jump to subroutine. Change it to $0001EDFA.

$2E0 -> 4E F9 00 00 D2 A0
Jump. Change it to $000163D2.

$2E6 -> 4E F9 00 00 D4 12
Jump. Change it to $00016544.

$2EC -> 4E F9 00 00 D2 4E
Jump. Change it to $00016380.

$2F2 -> 4E F9 00 00 D2 7A
Jump. Change it to $000163AC.

 

Dinobot:

$14 -> 21 7C 00 01 DF CA
Change the pointer to jump to $11E -> 00 06 00 10 00 1A

$1C -> 31 7C 05 00
VRAM address and palette line to use.
In red, the palette line to use for the sprite.
In green, the VRAM address. $500x$20=$A000.
You don't need to change these values this time.

$4A -> 4E B9 00 01 38 98
Jump to subroutine. Change it to $0001EDFA.

$78 -> 43 F9 00 01 DF BC
Change the pointer to jump to $110 -> 00 04 00 07 09 01

$DC -> 4E B9 00 01 38 98
Jump to subroutine. Change it to $0001EDFA.

$144 -> 4E F9 00 00 D3 C2
Jump. Change it to $000164F4.

$14A -> 4E F9 00 00 D3 B4
Jump. Change it to $000164E6.

$150 -> 4E F9 00 00 D4 12
Jump. Change it to $00016544.

$156 -> 4E F9 00 00 D2 4E
Jump. Change it to $00016380.

$15C -> 4E F9 00 00 D2 7A
Jump. Change it to $000163AC.

 

Snailbot:

This is the most difficult one. The snailbot contains 3 parts: the body, the shell and the animated fire.
The program for the animated fire is separate. Actually, it uses the one from the wasp sprite, but I adviced before to paste it right after the main program of the sprite. The result should be a program of $34E in size.

$18 -> 21 7C 00 01 F9 38
Change the pointer to jump to $250 -> 00 06 00 18 00 2A

$20 -> 31 7C 04 02
VRAM address and palette line to use for the body.
In red, the palette line to use for the sprite.
In green, the VRAM address.
Change this to $054E instead.

$54 -> 13 7C 00 54
This is the old sprite ID of Sonic 2 Beta. Change it to $62 now.

$60 -> 23 7C 00 01 F9 38
Change the pointer to jump to $250 -> 00 06 00 18 00 2A

$68 -> 33 7C 24 02
VRAM address and palette line to use for the shell.
In red, the palette line to use for the sprite.
In green, the VRAM address.
Change this to $254E instead.

$C0 -> 4E B9 00 01 38 98
Jump to subroutine. Change it to $0001EDFA.

$D6 -> 43 F9 00 01 F9 2C
Change the pointer to jump to $244 -> 00 04 00 08 05 00

$F2 -> 43 F9 00 01 F9 2C
Change the pointer to jump to $244 -> 00 04 00 08 05 00

$14A -> 13 7C 00 54
This is the old sprite ID of Sonic 2 Beta. Change it to $62 now.

$156 -> 23 7C 00 01 EB 0E
Change the pointer to jump to $2D0 -> 00 0E 00 20 00 3A

$15E -> 33 7C 03 E6
VRAM address and palette line to use for the animated fire.
In red, the palette line to use for the sprite.
In green, the VRAM address.
Change this to $03D2 instead.

$1A6 -> 0C 11 00 54
This is the old sprite ID of Sonic 2 Beta. Change it to $62 now.

$1D6 -> 43 F9 00 01 EA F2
Change the pointer to jump to $2B4 -> 00 08 00 0B 00 0F

$220 -> 0C 11 00 54
This is the old sprite ID of Sonic 2 Beta. Change it to $62 now.

$284 -> 4E F9 00 00 D3 B4
Jump. Change it to $000164E6.

$28A -> 4E F9 00 00 E7 88
Jump. Change it to $00017FFA.

$290 -> 4E F9 00 00 D4 12
Jump. Change it to $00016544.

$296 -> 4E F9 00 00 DC 4C
Jump. Change it to $00016D8A.

$29C -> 4E F9 00 00 D3 40
Jump. Change it to $00016472.

$2A2 -> 4E F9 00 00 DC 30
Jump. Change it to $00016D6E.

$2A8 -> 4E F9 00 00 D2 4E
Jump. Change it to $00016380.

$2AE -> 4E F9 00 00 D2 7A
Jump. Change it to $000163AC.

 

Sprites graphics and pattern load cue's

Now that we have the programs, we have to port the graphics for our sprites from Sonic 2 Beta:

For the most lazy ones, here is the archive that contains all graphics for each sprite in Nemesis format: click here.

Batbot: $7A6A2
Trycerobot: $7AD18
Crocobot: $7A11A
Dinobot: $7B114
Snailbot: $7C514

Paste these graphics in Sonic 2 Final.

Now, all you need is to add them in the pattern load cue's of your levels. You have already the objects art, and I will tell you their VRAM position they must be loaded at to display them correctly on screen:

Batbot: $7640
Trycerobot: $7400
Crocobot: $A000
Dinobot: $A000
Snailbot: $7A40 -> The wasp must be loaded just before it, for the animated fire.

Now, you can place your sprites in your levels using their specific ID.

Back to Top

Back to Main menu

Back to Guides

All pictures, information and details are ©redhotsonic and SEGA. All rights reserved. Hosted by Sonic Game Modification Community.