Kirby Super Star

Also known as Hoshi no Kirby Super Deluxe and Kirby's Fun Pak. The information below is from the US version of the game, however it works for all versions of the game.

Pointer Table

Bank $FF (PC $3F0000-$3FFFFF) is a table of pointer tables (If you can call it like that) For example, $FF:0000 points to the 1st entry of the Room Pointer Table ($FF:009A)

$FF:0002 points to the GFX and (Level) Palette pointer table. $FF:000C points to the level Pointer table $FF:0022 is the Level Pointer Table containing $3C entries. $FF:009A is the beginning of the Room Pointer Table

Section Format

At the beginning of each Section, there will be a relative Pointer to the next Section (The Repeating 04 00 FF FF Pattern is an example of this) It is skipped by adding the first word to the Current Address (Beware, that the SNES is Little-Endian! The low byte comes first)

Room Height/Width

After you've gotten the Room Address, note it down somewhere and add $3A to the address - that will skip over the room header(s). Then Skip 6 Sections (See last chapter) and add 2 to the address. This will lead to two words. The first one is the width, the second one is height. Two bytes after it, the level data begins.

Level Data

The level data has a simple format: first height*width low bytes, then the high bytes and then the sprite data. It is compressed the same way as other games from HAL Laboratories (See below)

Music / Misc. Headers

An example music header is this one for the first room in Green Greens, starting at $3020EF:

00 00 0F 00 01 01 13 01 00 00 00 00 00 00 00 00 00

$00    00 
$01    00 
$02    0F    Changing this changes the song that will play in that room.
$03    00 
$04    01 
$05    01 
$06    13    This seems to be the background scroll rate for the room. 
             Experiment with different values for different effects. 
             Changing this value to 99 makes the background not scroll at all.
$07    01 
$08    00    Changing this value will make sprites darker?
$09    00    Changing this will horizontally shift the background left or right.
$0A    00    Changing this will vertically shift the background up or down.
$0B    00 
$0C    00    Changing this value to 76 will make Kirby enter the room on a 
             warp star for the main entrance.
$0D    00 
$0E    00 
$0F    00 
$10    00

Most music headers have this same exact format, only with some different values and 0F changed to something else (obviously). By looking for this type of data in the ROM, you will be able to find data for other rooms (which are in a messed up order). By remembering the music that a certain room plays, you will be able to find data for that room by looking for the music header and the matching byte below.

Music Values

Values Description
00 None, or Default
01 Star Piece
02 Dynablade 1 / Floria
03 Grape Garden
04 Battle?
05 Boss Battle 1
06 Boss Battle 2 (RPG)
07 King Dedede
08 Dynablade 4
09 Victory!
0A Victory! (Short Version)
0B Dynablade 3 / Cavios
0C Death
0D Dynablade 2
0E Game over
0F Green Greens
10 Float Islands
11 Bubbly Clouds
12 Spring Breeze Ending
13 Choose Your Weapon
14 Invincibility
15 Title Screen
16 Game Select
17 Guide / Help
18 Birds Chirping?
19 Dynablade Map
1A Dynablade Ending
1B Wind (?)
1C Twinkle Effect?
1D Milky Way Wishes Map
1E Milky Way Wishes Level End
1F Gourmet Race Win
20 Drum Roll
21 Drum Roll End
22 Gourmet Race Loss
23 Gourmet Race Level 1 / 3
24 Gourmet Race Level 2
25 Gourmet Race Intro
26 Gourmet Race Title Screen
27 Night Sounds / Wind?
28 Later Treasure Hunting
29 Begin Treasure Hunting
2A Save Room
2B Great Cave Offensive Title / End
2C Mine Cart Ride
2D Battle With Marx
2E Milky Way Wishes End
2F Space Sound Effects (?)
30 the Arena Title Screen
31 Arena Battle
32 Taking over the Halberd (Revenge of the Metaknight)
33 Halberd 2 (Revenge of the Metaknight)
34 Battle With Metaknight
35 Halberd Escape
36 Revenge of the Metaknight Opening
37 Dynablade 5
38 Revenge of the Metaknight Map Screen
39 Revenge of the Metaknight Title Screen
3A Heart of Nova
3B Game over Screen?
3C Milky Way Wishes Opening
3D Megaton Punch
3E Samurai Kirby
3F Revenge of the Metaknight End
40 Milky Way Wishes Level End
41 Kirby Sleeps
42 - FF Nothing, or Default

Level Graphics Header

An example of a level graphics header is from the first room in Green Greens, starting at $302105, slightly down from the music header. Each room in the game has its own music and graphics headers.

01 AA 08 6A 6A EA 00 2B 40 40 C9 09 0D 0E 00 00 00 00 00 55 4E 57 15 03

08 6A 6A EA          - This is the room's level object gfx and palette. 
                       Level objects are things such as floors, blocks, etc. 
                       Note that changing these values may also change the 
                       object itself, not just the graphics / palette. 
                       There are several different sets of objects in the game. 
                       To change this to the objects from another level, 
                       find that level's graphics header and just copy the values over.
2B 40 40 C9 09 0D 0E - This is the background gfx and palette. 
                       Note that some of the 00 bytes beyond this may also affect it; 
                       I'm not 100% certain. 
                       To change this to the background from another level, 
                       find that level's graphics header and just copy the values over.
4E 57 15 03          - This is the sprite gfx. Different values let other sprites be shown correctly.
                       To be able to properly use enemies from another level,
                       find that level's graphics header and just copy the values over. 
                       Note that you do not have to copy all four values over;
                       you can use values from several different levels. Experiment.

Most levels should work in this way, having the music header first and the graphics header slightly below. You'll be able to find it by seeing two repeating values side by side (ie. 6A 6A like the example above). Below the graphics header is the actual level data. I don't know the level data format yet, but sprite data works exactly like I will describe below in most cases. Sprite data is also often near the end of the level data.

Some sprite data is stored in the following format:

AA BB CC DD EE FF

AA - This value can be 00, or a multiple of 10. 
     For some other sprites this can be a different value. 
     This determines the sprite's behavior, or in some cases, 
     what the sprite gives you (for ability selectors, 
     this value determines the ability). 
     Most sprites have different behaviors so it would be 
     long and pointless to list them all here.
BB - The sprite value itself, a partial chart will come later. 
     Note that most sprites will look corrupted unless you load 
     the proper GFX set.
CC - The horizontal position of the sprite on the screen.
DD - The screen number of the sprite in the given area. 
     Changing this to a valid value will move the sprite to 
     that screen (ie. if the value is 02 then it's on screen 2, 
     change it to 01 and it will be on screen 1).
EE - Vertical position of the sprite on the screen.
FF - The vertical screen number. This works the opposite; 
     01 would be the top screen, 02 the next, and so on. 
     Note that this only works in levels with vertical screens, 
     changing this value in other levels may have undesirable effects.

Here is an example piece of enemy data at hex address $302238:

00 1A 2D 02 74 00

This is from the very first room in Green Greens, in the Spring Breeze game. It is for that flying bird thing (1A).

Sprite values (partial list, some missing, all values were tested with the example above "00 1A 2D 02 74 00"):

Value Description
00 Blank
01 Waddle Dee
02 Waddle Doo
03 Sir Kibble
04 Sleeping Enemy
05 Crash Bomb
06 Mushroom
07 Waddle Dee Boss?
08 ???
09 Ninja
0A Flying Enemy
0B Jet Enemy
0C Fire Enemy
0D Gordo
0E Gim (Yoyo Enemy)
0F Wheel Enemy
10 Bomb Enemy
11 Flower
12 Knuckle Joe
13 Poppy Bros. (Unarmed)
14 Dog-Type Enemy
15 Cannon
16 Sweeping Enemy (?)
17 Hopping Enemy (?)
18 Scarfy
19 Blank (?)
1A Bird-Type Enemy
1B Flying Chicken (?)
1C Hopping Enemy (?)
1D ???
1E Another Hopping Enemy (?)
1F ???
20 Blade Knight
21 Weird Thing That Explodes?
22 Unswallowable Cutter Enemy (from Revenge of the Metaknight)
23 Unswallowable Jet/Axe Enemy (from Revenge of the Metaknight)
24 Unswallowable Pitchfork Enemy (from Revenge of the Metaknight)
25 Unswallowable Ball & Chain Enemy (from Revenge of the Metaknight)
26 Birdon (Wing Enemy)
27 Plasma Wisp
28 Rocky (Stone Enemy)
29 Chilly (Ice Enemy)
2A Simirror (Mirror Enemy)
2B Mike Enemy
2C T.A.C. (Copy Enemy)
2D Unknown
2E Movable Cannon
2F Floating Beam/Laser Enemy
30 Star-Chucking Enemy
31 Swinging Enemy (?)
32 Swinging Waddle Doo (?)
33 Parasol (by Itself)
34 Parasol Waddle Dee
35 Parasol Waddle Doo
36 Parasol Cannon (?)
37 Bomb (?)
38 Another Bomb (?)
39 Unknown (Fish ?)
3A Same As 39 (?)
3B Yet Another Bomb (?)
3C Fighter Mini-Boss
3D Nothing (?)
3E Smoke, then Nothing (?)
3F Blank (?)
40 Blank (?)
41 Same As 3C (?)
42 Karate Man Mini-Boss
43 Poppy Bros. Sr. Mini-Boss
44 Chef Kawasaki
45 Frosty
46 Bonkers
47 Bugzzy
48 - 4F Blank (?)
50 Whispy Woods (?)
51 Lololo & Lalala
52 Kracko Mini-Boss
53 Kracko (Boss)
54 King Dedede
55 Dynablade
56 Fatty Whale
57 Unknown
58 Wham Bam Rock
59 Halberd Reactor
5A Metaknight
5B Escaping Metaknight
5C Twin Woods
5D Rpg Battle 1
5E Halberd Cannon
5F Heavy Lobster + Horizontal Auto Scroll
60 Heart of Nova
61 ???
62 Nothing?
63 Nothing?
64 Star? (Not a Warp Star)
65 - 67 Blank (?)
68 Poppy Bros. Sr., Fighter Mini-Boss, Karate Man
69 Chef Kawasaki, Bonkers, Bugzzy
6A Floating Hotdog then SFX (?)
6B Healing Candy, Reappears
6C Healing Hotdog, Reappears
6D Waddle Dee (?)
6E Waddle Doo, Always Moving Left + Doesn't Attack
6F Blank (?)
70 Rotating Thing (?)
71 ???
72 Door Star Sprites (?)
73 Star That Finishes Level (?)
74 Blank (?)
75 Warp Star
76 Getting off Warp Star
77 Vertical Autoscroll
78 Trolley
79 Cannon That Kirby Can Shoot out of (Fuse) (?)
7A Cannon That Shoots You up
7B Flag (?)
7C Thing That Pushes You Forward (?)
7D Spring (?)
7E Blank (?)
7F Blank (?)
80 1-Up
81 Invincibility Lolipop
82 Maxim Tomato
83 Healing Hotdog
84 Healing Candy
85 Healing Juice
86 Random (Hotdog, Candy, or Juice) That Reappears
87 Nothing?
88 Falling 1-Up
89 Falling Invincibility Lolipop
8A Falling Maxim Tomato
8B Falling Healing Hotdog
8C Falling Healing Candy
8D Falling Healing Juice
8E Nothing?
8F Falling Maxim Tomato That Reappears
90 Ability Selector (Default Beam)
91 Ability Selector (Default Cutter)
92 Random Ability Selector
93 Blank (?)
94 Ability Selector (Default Beam) That Does Not Reappear
95 Ability Selector (Default Cutter) That Does Not Reappear
96 - 98 ???
99 Fuse Plunger
9A Freezes Game if You Touch?
9B - 9D Same As 9a
9E Same As 9a, Only With Switch SFX?
9F Switch That Vanishes when Hit
A0 Dynablade End of Level Cannon
A1 Blank (?)
A2 Blank (?)
A3 Green Greens Intro?
A4 Float Islands Intro?
A5 Bubbly Clouds Intro?
A6 Mt. Dedede Intro?
A7 Blank (?)
A8 Special Warp Star (Milky Way Wishes)
A9 Nothing (?)
AA Upward Current (?)
AB Nothing (?)
AC Fade-In (?)
AD - AF Blank (?)

I never went beyond this but I assume that there are either no more sprites, or only a few.

Sprite Palette Header

This is an example from the first room in Green Greens, it starts at $30211E (right after the Music / Misc. header):

99 01 01 01 01 01 99

All of the 01 values edit certain sprite palettes; best of all you must experiment to see what will change what. Note that some palettes look really ugly on some sprites. Most levels in the game have this same pattern, only with different values instead of 01 01 01 01 01.

Main Entrance and Door Exits

This is for the first room in Green Greens, and this will show you how to edit the main entrance and the door on the second screen. This starts at $302125. All levels should have this same format. Door exits are a bit screwed up because the game uses some sort of a "relative pointer" system, so you have to be sure to edit all doors in all rooms that you edit to go to valid levels if you edit a door to go to a different room than originally supposed to.

2B 00 2A 00 18 00 02 00 80 01 78 00 9C 00 6C 00 03 00 00

2B 00 2A 00 - This is the main level entrance data. 
              2B is Kirby's horizontal (x) position on the screen, 
              00 is the horizontal screen number he starts on, 
              2A is Kirby's vertical (y) position on the screen, and 
              00 is the vertical screen number he starts in (if any).
00 18 00 02 00 80 01 78 00 9C 00 6C 00 03 00 00
            - This is the data for the door on the second screen. 
              Note that this is on a level with only one door; 
              levels with multiple doors will have some of this same 
              string repeated several times, only with different values.
02          - The number of the room that the door leads to.
00          - If the room you want to go to is past FF (there are over 255), 
              then set this value to 01 and restart the value before this 
              from 00 and go up from there.
80 01 78 00 - This determines where the door trigger will be. 
              In order for a door to work you must have a door tile object, 
              and the appropriate trigger on it. 
              80 is the x-position of the door,
              01 the horizontal screen number, 
              78 the y-position of the door, and 
              00 the vertical screen number.
9C 00 6C 00 - This works exactly like the 80 01 78 00 data above, 
              only this data determines where on the screen you will 
              end up when you switch rooms through the door.

Almost directly below the entrances / exits is the level data itself. However, most of it uses compressions, some of which I will explain below.

Compressions

Level data in this game is compressed. The compression is the same as other games developed by HAL laboratory. it can be (de)compressed using exhal Thanks to Vagla for cracking the 0x, 2x, 8x, and E4 compressions. This is the original document. 0x[string of length x+1] = Uncompressed Blocks

This applies to an 0x value that you will often see after another type of compression. Basically, this tells the game how many blocks after this value will be uncompressed. Example:

09 18 0C 0C C3 C3 07 C3 C4 C7 07
09 Tells how many uncompressed blocks are coming x+1.
   The other values would be the uncompressed blocks.

2xid = RLE of length x+1 with id id.
       Simple enough, the x+1 tells the game how many of that block to make,
       and id is the value of the block used. Example:
2E 00
2E tells how many blocks are coming x+1. 
00 value is the value to use for the block.

4xid1id2
Draw the next two blocks back to back, then repeat x times. Example:
41 C8 C9
41 is the 4x value, this tells the game how many times to repeat 
   the next two blocks after drawing them once, with x.
C8 and C9
   These are the id values. They should both be different.
The game would translate the 41 C8 C9 string into blocks like this:
C8 C9 C8 C9 in a row

6xid = String of length x+1, starts at id value and adds 1 for each value x times.
       Pretty much self-explanatory. Example:
62 8C would make:
8C 8D 8E in a row

8x??l1 = LZ of length x+1 taking blocks from location l1+1 (?).
         ?? unknown (affects blocks that are copied, maybe an extra length byte)
         Not much to explain here, this basically "Copies and Pastes" data from 
         another part of the game's data, thus saving space.

E4xxid = RLE of length xx+1 with id id?
         This is basically the same as 2xid above, only you can use two-digit values.

This is the new Document (Created by darklink):

Every "command" byte is split into 3 command bits and 5 length bits.

Here is a small table of the commands and what they do:

Command Bits Information Example
000 Output next length+1 bytes (uncompressed) 01 00 FF outputs 00 FF
001 Output next byte length+1 times 23 01 outputs 01 01 01
010 Output next word length+1 times 41 02 03 outputs 02 03 02 03
011 Output a increasing sequence consisting length+1 bytes 62 03 outputs 03 04 05
100 Outputs a backref of length+1 bytes starting from offset next byte+1 81 00 output whatever word is on offset 00
101 Outputs a backref of length+1 bytes starting from offset next word+1. note that every byte is flipped. (flip(0x80)==0x01) A1 00 00 will output a flipped word, which is located on offset 00
110 Is like 100 with backward seek and a word offset C1 00 01 will output when at offset 00 00 the word AB CD is, CD AB
Note: 111 may not be used. However other games by HAL Laboratories CAN do the same as 100
Also, the backref offsets are for DECOMPRESSED stuff.
Note it has some discrepancies. This may be because the old doc is 4 years old, or I am just really wrong.

Misc. ROM Map Information

$302171 & $3021C1 - Part of Green Greens 1st room level data
$302974 - Float Islands 1st room music byte (in the music header, default value is 10, used to locate this room's data)
$30828B - Maxim Tomato in the 2nd room in Green Greens (used to locate this room's data)
$30DB33 & $30DB2F - Green Greens intro bytes?
$3020F3 - 1st room in Green Greens, change value to 02 for border, and 00 for a black background?
$308294 - Milky Way Wishes "Ninja Room" music byte (used to locate this room's data)
$302156 to $302159 - Green Greens level-type header?
$377D17 - Part of some TSA data, check first room in Green Greens for changes
$302157 - Does this determine the number of horizontal screens in the first room in Green Greens? When I changed the value to other random values, the level data was messed up and the level seemed to be shorter, so... There's a few bytes before and after this that might have something to do with the room type data I've been trying to find.

These bytes are from the graphics header for the 1st room in Green Greens (from the example graphic header above):
$302107 - Ground GFX byte
$302108 & $302109 - Ground palette
$30210A - Ground type modifier
$30210C & $30210F - Background modifier
$30210D & $30210E - Background palette
$302119 to $30211C - Sprite GFX modifiers

Information discovered by Proto K.