Contents
How to sort out the life icons
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."
How to get the lost badniks working
(Credit goes to Sonic Hachelle-Bee and StephenUK)
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.
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.
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
$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.
$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.
$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.
$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.
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.
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.
All pictures, information and details are ©redhotsonic and SEGA. All rights reserved. Hosted by Sonic Game Modification Community.