*** WARNING *** This document is extremely messy. Trying to make sense of it may cause your brain to explode. I may try to clean it up at some point, but so far I don't really have the urge. This document looks best when word wrapped, but even then it's somewhat fugly. *** WARNING *** Some terminology I'll be using, before we begin: Level: A 32x32 grid of Blocks, which makes up an entire area. The Tank and Overhead sections are considered seperate levels for the purposes of this document. A Level contains 1024 Blocks in a 32x32 grid, 64 Screens in an 8x8 grid, a semi-arbitrary number of Rooms, 4096 Sub Blocks (64x64), and 16384 Ultra Sub Blocks (128x128). Levels also loop in both directions. A good example of this is Level 6, where you always head up and to the right to make progress, yet you can end up back at the Level 5 Passage again simply by heading left from the Boss Tunnel. Scroll Border: Any place at which the screen ceases scrolling, unless you step/drive through a door. Screen: A 4x4 section of the Level, the largest section viewable on screen at once. Mostly a cosmetic designation, except that Scroll Borders always end on a screen border. They don't comprise EXACTLY 4x4 blocks either. They actually use 5x5 blocks, but the borders and corners only use a portion of the block, with the other parts being shared with other Screen(s). For example, the upper left block on Screen(0,0) shares its data with Screen(0,7), Screen(7,0), and Screen(7,7). A little diagram to show you what I mean: M: Map Index (in hex) S: Screen +---+---+-------+-------+-------+---+---+ |M 0|M 0| M 1 | M 2 | M 3 |M 4|M 4| |S |S | S 0,7 | S 0,7 | S 0,7 |S |S | |7,7|0,7| | | |0,7|1,7| +---+---+-------+-------+-------+---+---+ |M 0|M 0| M 1 | M 2 | M 3 |M 4|M 4| |S |S | S 0,0 | S 0,0 | S 0,0 |S |S | |7,0|0,0| | | |0,0|1,0| +---+---+-------+-------+-------+---+---+ |M20|M20| M21 | M22 | M23 |M24|M24| |S |S | S 0,0 | S 0,0 | S 0,0 |S |S | |7,0|0,0| | | |0,0|1,0| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +---+---+-------+-------+-------+---+---+ |M40|M40| M41 | M42 | M43 |M44|M44| |S |S | S 0,0 | S 0,0 | S 0,0 |S |S | |7,0|0,0| | | |0,0|1,0| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +---+---+-------+-------+-------+---+---+ |M60|M60| M61 | M62 | M63 |M64|M64| |S |S | S 0,0 | S 0,0 | S 0,0 |S |S | |7,0|0,0| | | |0,0|1,0| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +---+---+-------+-------+-------+---+---+ |M80|M80| M81 | M82 | M83 |M84|M84| |S |S | S 0,0 | S 0,0 | S 0,0 |S |S | |7,0|0,0| | | |0,0|1,0| +---+---+-------+-------+-------+---+---+ |M80|M80| M81 | M82 | M83 |M84|M84| |S |S | S 0,1 | S 0,1 | S 0,1 |S |S | |7,1|0,1| | | |0,1|1,1| +---+---+-------+-------+-------+---+---+ Room: A section of the Level contained by Scroll Borders. (See below, Box/Shaft/Track/Cavern.) Mostly a cosmetic designation, as the map covers the entire level, not the individual Rooms. Blocks: Meat of the Level... contains 2x2(4) Sub Blocks, 4x4(16) Ultra Sub Blocks, and 8x8(64) characters. Sub Blocks: Makes up the blocks... contains 2x2(4) Ultra Sub Blocks, and 4x4(16) characters. Ultra Sub Blocks: Makes up the Sub Blocks... contains 2x2(4) characters. Tank is 2x1 USBs for comparison. The smallest piece of a Level that you can interact with. Characters: Makes up the USBs, contains 8x8 pixels in the standard NES character format. Purely graphical. Tank (section): Any side scrolling section where you can drive the tank. Overhead (section): Any overhead (duh) section. Bosses are always in an Overhead section. (Unless you want to count the Level 2 Gate guardian. I don't.) Box: A Room which does not scroll at all, eg Level 2's entrance to Level 3. Shaft: Entirely vertical Room, eg first vertical section of Level 1. Track: Entirely horizontal Room, eg the various "tree" sections of Level 7. Cavern: Any Room that scrolls in both directions. Always rectangular, because the engine doesn't deal with jagged Scroll Borders gracefully. Tunnel: A door that switches between a Tank section and an Overhead section. Boss Tunnel: A Tunnel that leads to an Overhead section that contains a Level Boss. Gateway: A gate that the tank can enter that changes to another Level, or in Level 7, moves within the Level. Levels have several pieces of info stored with them. First is 12 bytes consisiting of data pointers telling the ROM where to find various bits of level data. This is followed by a 16 byte palette, used for the background. (The sprites have their own seperate palette stored elsewhere.) Then comes the table for the USBs, then sBs, then Blocks, then the actual map. The length of the three Block tables could be arbitrary, with a pointer stored elsewhere to designate the beginning. They do not have a "null block" or anything of the sort to designate the end of the table. For example, in Level 1, Block # 203 is stored just before the beginning of the map data. Trying to refer to Block # 204 just uses map data for the block. Level Maps are made up of 1024 Blocks in a simple 32x32 grid. Scrolling is controlled by a bitfield, but scrolling is a pseudo-cosmetic effect. If you cut away a wall and drive through where it would normally not be scrolling (eg where you would normally enter a door), you will end up where you "should" be, but it will play merry hell with the graphics. I verified this by cutting away the floor from the first shaft of Level 1. I fell through into the shaft to Level 2, and after a little searching I was able to find the gateway and enter Level 2 without a complaint. The graphics returned to normal afterwards. I was, however, of course, stuck on the wrong side of the gate, due to the Gate Guard still being alive. Below are some values I've managed to figure out so far. Rom Header = 0x0000-0x000F Data Pointers = 0x0010-0x0023 = 0x14 bytes = 20 bytes Data Pointers to where the first five levels are stored, and their scroll tables. (Why here instead of with the rest of the pointers I'm not sure.) To gain the location in the ROM, reverse the bytes, subtract 0x8000, and add 0x0010. 0x0010= "14 80 2e 8e" Raw 8014 8e2e Convert 0024 0e3e Lvl1 Scrl 0x0014= "3e 8e 72 99" Raw 8e3e 9972 Convert 0e4e 1982 Lvl2 Scrl 0x0018= "1a 9a 5f a5" Raw 9a1a a55f Convert 1a2a 256f Lvl3 Scrl 0x001C= "6f a5 6a b1" Raw a56f b16a Convert 257f 317a Lvl4 Scrl 0x0020= "7a b1 7c bd" Raw b17a bd7c Convert 318a 3d8c Lvl5 Scrl Level 1 Tank Area Character Bank = 0x28010-0x2900F = 4096 bytes Actual character graphics used for the Background for the Tank Area of Level 1, stored in standard NES character format. 256 characters, 4 colors, 8x8 pixels. Sub palettes stored elsewhere are used to say WHICH four colors a character/block uses. Total = 0x0024-0x0e4d = 0xe3e bytes = 3626 bytes Data Pointers = 0x0024-0x2F = 12 bytes Data pointers to Palette, USB Attribute Table, USB Table, SB Table, Block Table, and Map. Two bytes each. To figure out the location in the ROM file, reverse the byte order, subtract 0x8000 and then add 0x0010. "20 80 94 8d 30 80 98 82 68 86 94 89" Plt USBA USB SB Blk Map Example: USBA = 0x8D94 0x8D94 - 0x8000 + 0x0010 = 0x0DA4 As you can see below, 0x0DA4 perfectly matches where the USB Attribute table begins in the ROM. Background Palette = 0x0030-0x003F = 16 bytes Which 16 colors to use for the background. Simple. Character Bank = 0x28010-0x2900F = 4096 bytes Actual character graphics used for the Background for the Tank Area of Level 1, stored in standard NES character format. 256 characters, 4 colors, 8x8 pixels. Sub palettes stored elsewhere are used to say WHICH four colors a character/block uses. USB Data = 0x0040-0x02A7 = 0x268 bytes = 616 bytes = 0x9A blocks = 154 Ultra Sub Blocks Describes each USB, 4 bytes each, corresponding to which Characters make up this USB SB Data = 0x2A8-0x677 = 0x3d0 bytes = 976 bytes = 0xF4 blocks = 244 Sub Blocks Describes each SB, 4 bytes each, corresponding to which USBs make up this SB Block Data = 0x0678-0x09a3 = 0x32C bytes = 812 bytes = 0xCB blocks = 203 Blocks Describes each block, 4 bytes each, corresponding to which SBs make up this block Map Data = 0x09a4-0x0da3 = 1k = 0x400 bytes = 1024 bytes = 32x32(1024) Blocks USB Attribute Table = 0x0da4-0x0e3d = 0x9a bytes = 154 bytes An array of bytes which describes the attributes of the USBs. The first two bits control which palette to use, and the other six control the USB's physical properties. Note that making a Gateway/Tunnel block isn't enough, it has to match up with an existing gateway (explanation below). Tank Bit 0&1 (0x00-0x03) = Which Sub-palette to use Bit 2 (0x04) = Unknown Bit 3 (0x08) = Gateway Bit 2&3 (0x0C) = Tunnel (From Tank to Overhead) Bit 4 (0x10) = Damaging Bit 5 (0x20) = Ladder (One you will fall through) Bit 6 (0x40) = Water Bit 7 (0x80) = Solid Bit 4&6 (0x50) = Lava (Damaging and slows you like water) Bit 5&7 (0xA0) = Solid Ladder (One you can stand on) Bit 6&7 (0xC0) = Destroyable (w/Crusher) Bit 3&7 (0x88) = Doorway (the kind that seperates Rooms) Bit 5&6 (0X60) = Water Ladder (One you can climb or swim) In Level 6 Tank, any solid block NOT using Sub-palette 1 is considered "ice". Overhead Bit 0&1 (0x00-0x03) = As above Bit 2 (0x04) = "Walk Behind"/Overhang Bit 3 (0x08) = Tunnel Bit 4 (0x10) = Damaging Bit 2&4 (0x14) = Instant Death or Ice (Level 6 Only) Bit 5 = Unknown Bit 6 = Unknown Bit 7 (0x80) = Solid Bit 3&7 (0x88) = Doorway (True for all directions, but any direction but Up has Bit 2 set for cosmetic reasons) Bit 6&7 (0xC0) = Destroyable Scroll Table = 0x0e3e-0xe4d = 16 bytes The first eight bytes control up-down scrolling, the next eight control left-right scrolling. Both are simple bitmasks, moving left to right, most significant bits first, ie Bit #7 (0x80) controls the border on the left for the leftmost Screen, and Bit #0 (0x01) controls the border on the left of the rightmost Screen. It both wraps and shares, so Bit #7 also controls the right border on the rightmost Screen. If a bit is off, then the border in question will allow scrolling. If it is on, scrolling ceases. Forming a non-rectangular border works, but will mess up the graphics something fierce if you hit a border at the wrong angle. Switching to the pause menu fixes the graphics. Below is a chart of which byte and bit to check for each respective border. Checking Up and Down uses the same bit, but different bytes, where checking Left and Right uses the same byte, but different bits. Screen #0 Screen#7 v v Byte 0 +7+6+5+4+3+2+1+0+ Byte 8 7 6 5 4 3 2 1 0 7 Byte 1 +7+6+5+4+3+2+1+0+ Byte 9 7 6 5 4 3 2 1 0 7 Byte 2 +7+6+5+4+3+2+1+0+ Byte 10 7 6 5 4 3 2 1 0 7 Byte 3 +7+6+5+4+3+2+1+0+ Byte 11 7 6 5 4 3 2 1 0 7 Byte 4 +7+6+5+4+3+2+1+0+ Byte 12 7 6 5 4 3 2 1 0 7 Byte 5 +7+6+5+4+3+2+1+0+ Byte 13 7 6 5 4 3 2 1 0 7 Byte 6 +7+6+5+4+3+2+1+0+ Byte 14 7 6 5 4 3 2 1 0 7 Byte 7 +7+6+5+4+3+2+1+0+ Byte 15 7 6 5 4 3 2 1 0 7 Byte 0 +7+6+5+4+3+2+1+0+ ^ ^ Screen #56 Screen#63 As another example, here's the scroll table for Level 1, Tank Area: +1+1+1+1+1+1+1+1+ 1 1 0 0 0 0 0 0 |(1) +0+0+0+0+0+0++0+0 1 1 0 0 0 0 0 0 |(1) +0+0+0+0+0+0+0+0+ 141 0 0 0 0 0 0 |(1) +1+0+0+0+0+0+0+0+ 1 1S0 0 0 0 0 0 |(1) +0+1+1+1+1+1+1+1+ 1 1 0 0 0 0 0 0 |(1) +1+0+0+0+0+0+0+0+ 1 1 0 0 0 0 0 0 |(1) +0+0+0+0+0+0+0+0+ 1 1 0 0 0 0 0 0 |(1) +0+0+0+0+0+0+0+0+ 121 0 0 0 0 0 0 |(1) +-+-+-+-+-+-+-+-+ (1 1 1 1 1 1 1 1) "4" and "2" mark the inter level gates, and "S" marks the start position. The data for the Level 2 Tank section follows all of this, stored in a similar format. Overhead sections are stored in the same way, except that the USB attribute bits mean different things. Bank #0 (0x0010-0x4010) contains data for Levels 1-5. Bank #1 (0x4010-0x8010) contains data for Level 6, 7, 8, and the overhead sections of 1 and 3. Bank #2 (0x8010-0xC010) contains data for the remaining overhead sections. Bank #3 (0xC010-0x10010) contains Thing (enemy/item/sprite) data and some other unknown data C010 = Unknown Pointer (8004 = C014) C012 = Thing Data Pointers Pointer (A174 = E184) C014 = Pause Menu Code (?) Pointer (801C = C02C) C016 = Intro Screen Code (?) Pointer (822E = C23E) C018 = Title Screen Code (?) Pointer (84C9 = C4D9) C01A = Unknown Pointer (8A5F = CA6F) C01C = Unknown Pointer (8C9F = CCAF) C01E = Unknown Pointer (8D9F = CDAF) C020 = Unknown Pointer (8EDF = CEEF) C022 = Unknown Pointer (90CC = D0DC) C024 = Unknown Pointer (8640 = C650) C026 = Unknown Pointer (942C = D43C) C028 = Unknown Pointer (96FC = D70C) C02A = Unknown Pointer (99AC = D9BC) C02C-C23D = 0x212 bytes RLE-like data that describes the pause screen's appearance. I'll fiddle with it and see what I can come up with. C23E-C4D8 = 0x29B bytes Similar to the above, but for the intro screen. C4D9-C64F = 0x177 bytes Same deal, for the title screen. C650-CA6E = 0x41F bytes No immediately obvious effect. Probably an ending screen, or perhaps one of the bosses. CA6F-CCAE = 0x240 bytes Level 2/6 Boss (head only, arms are sprites) CCAF-CDAE = 0x100 bytes Unknown CDAF-CEEE = 0x140 bytes Level 1 Boss (brain/tentacles only, rotating brains are sprites) CEEF-D0DB = 0x1ED bytes Level 3 Boss (borders and "inactive boxes", active boxes are, again, sprites) D0DC-D43B = 0x360 bytes Unknown D70C-D9BB = 0x2B0 bytes Unknown D9BC-E183(?) = 0x7C8(?) bytes Unknown C02C-E183 = Background/Boss Data Graphical information describing what various static screens and the bosses look like. Stored in an RLE-like format. Note that only some parts of the bosses are considered "background". Only the main parts are background, such as the Level 1 Boss "big brain", the Level 2/6 Boss' head, etc. This does NOT affect the Gate Guard in Level 1, as that is a sprite. E184 = Thing Data Pointers E184 = Level 1 Overhead (A19B = E1AB) E186 = Level 2 Overhead (A331 = E341) E188 = Level 3 Overhead (A4BB = E4CB) E18A = Level 4 Overhead (A729 = E739) E18C = Level 5 Overhead (A907 = E917) E18E = Level 6 Overhead (ABA8 = EBB8) E190 = Level 7 Overhead (AD3E = ED4E) E192 = Level 8 Overhead (AF19 = EF29) E194 = Level 1 Tank (B118 = F128) E196 = Level 2 Tank (B2A2 = F2B2) E198 = Level 3 Tank (B40E = F41E) E19A = Level 4 Tank (B56E = F57E) E19C = Level 5 Tank (B692 = F6A2) E19E = Level 6 Tank (B858 = F868) E120 = Level 7 Tank (B982 = F992) E122 = Level 8 Tank (BAFD = FB0D) Level 1 Overhead E1AB = Type List Pointer (A1A1 = E1B1) E1AD = X List Pointer (A227 = E237) E1AF = Y List Pointer (A2AC = E2BC) E1B1 = Type List E236 = 0xFF (end of list) E237 = X List E2BC = Y List 0x85 Things = 133 Things Level 2 Overhead E341 = Type List Pointer (A337 = E347) E343 = X List Pointer (A3B9 = E3C9) E345 = Y List Pointer (A43A = E44A) E347 = Type List E3C8 = 0xFF (eol) E3C9 = X List E44A = Y List 0x81 Things = 129 Things Level 3 Overhead E4CB = Type List Pointer (A4C1 = E4D1) E4CD = X List Pointer (A58F = E59F) E4CF = Y List Pointer (A65C = E66C) E4D1 = Type List E59E = 0xFF (eol) E59F = X List E66C = Y List 0xCD Things = 205 Things Level 4 Overhead E739 = Type List Pointer (A72F = E73F) E73B = X List Pointer (A7CD = E7DD) E73D = Y List Pointer (A86A = E87A) E73F = Type List E7DC = 0xFF (eol) E7DD = X List E87A = Y List 0x9D Things = 157 Things Level 5 Overhead E917 = Type List Pointer (A90D = E91D) E919 = X List Pointer (A9EC = E9FC) E91B = Y List Pointer (AACA = EADA) E91D = Type List E9FB = 0xFF (eol) E9FC = X List EADA = Y List 0xDE Things = 238 Things Level 6 Overhead EBB8 = Type List Pointer (ABAE = EBBE) EBBA = X List Pointer (AC34 = EC44) EBBC = Y List Pointer (ACB9 = ECC9) EBBE = Type List EC43 = 0xFF (eol) EC44 = X List ECC9 = Y List 0x85 Things = 133 Things Level 7 Overhead ED4E = Type List Pointer (AD44 = ED44) ED50 = X List Pointer (ADE1 = EDF1) ED52 = Y List Pointer (AE7D = EE8D) ED54 = Type List EDF0 = 0xFF (eol) EDF1 = X List EE8D = Y List 0x9C Things = 156 Things Level 8 Overhead EF29 = Type List Pointer (AF1F = EF2F) EF2B = X List Pointer (AFC8 = EFD8) EF2D = Y List Pointer (B070 = F080) EF2F = Type List EFD7 = 0xFF (eol) EFD8 = X List F080 = Y List 0xA8 Things = 168 Things Level 1 Tank F128 = Type List Pointer (B11E = F12E) F12A = X List Pointer (B1A0 = F1B0) F12C = Y List Pointer (B221 = F231) F12E = Type List F1AF = 0xFF (eol) F1B0 = X List F231 = Y List 0x81 Things = 129 Things Level 2 Tank F2B2 = Type List Pointer (B2A8 = F2B8) F2B4 = X List Pointer (B320 = F330) F2B6 = Y List Pointer (B397 = F3A7) F2B8 = Type List F32F = 0xFF (eol) F330 = X List F3A7 = Y List 0x77 Things = 119 Things Level 3 Tank F41E = Type List Pointer (B414 = F424) F420 = X List Pointer (B488 = F498) F422 = Y List Pointer (B4FB = F50B) F424 = Type List F497 = 0xFF (eol) F498 = X List F50B = Y List 0x73 Things = 115 Things Level 4 Tank F57E = Type List Pointer (B574 = F584) F580 = X List Pointer (B5D4 = F5E4) F582 = Y List Pointer (B633 = F643) F584 = Type List F5E3 = OxFF (eol) F5E4 = X List F643 = Y List 0x5F Things = 95 Things Level 5 Tank F6A2 = Type List Pointer (B698 = F6A8) F6A4 = X List Pointer (B72E = F73E) F6A6 = Y List Pointer (B7C3 = F7D3) F6A8 = Type List F73D = 0xFF (eol) F73E = X List F7D3 = Y List 0x95 Things = 145 Things Level 6 Tank F868 = Type List Pointer (B85E = F86E) F86A = X List Pointer (B8C0 = F8D0) F86C = Y List Pointer (B921 = F931) F86E = Type List F8CF = 0xFF (eol) F8D0 = X List F931 = Y List 0x61 Things = 97 Things Level 7 Tank F992 = Type List Pointer (B988 = F998) F994 = X List Pointer (BA05 = FA15) F996 = Y List Pointer (BA81 = FA91) F998 = Type List FA14 = 0xFF (eol) FA15 = X List FA91 = Y List 0x7C Things = 124 Things Level 8 Tank FB0D = Type List Pointer (BB03 = FB13) FB0F = X List Pointer (BB8F = FB9F) FB11 = Y List Pointer (BC1A = FC2A) FB13 = Type List FB9E = 0xFF (eol) FB9F = X List FC2A = Y List 0x8B Things = 139 Things Tank Thing Types Numbers in parentheses are levels in which they show up *correctly*, not neccessarily where the original game has them. Some enemy types are the same but look different in different levels, eg the "Bullets" are the same as the "Zoomers", just using different graphics because a different character set is loaded in. The level list is not exhaustive, in fact many of them are just me guessing. Experiment and see. 00 = Gray Caterpillar (2, 3, 6, 8) 01 = Gray Bullet (1, 2, 4, 6, 7, 8) horizontal (Choose one depending on 02 = Gray Bullet (1, 2, 4, 6, 7, 8) vertical the surface type is starts on) 03 = Red Dropper (3) 04 = Gray Hulk (1, 4, 7) 05 = Gray Hopper (1, 2, 4, 6, 7, 8) (6 hp) 06 = Red Caterpillar (2, 3, 6, 8) 07 = Mine (1, 2, 4, 6, 7, 8) 08 = Ceiling Turret (1, 3, 4, 7) 09 = Bomber Rock (5) 0A = Gray Alien (2, 6, 8) 0B = Gray Bomber (1, 2, 4, 6, 7, 8) 0C = Orb Dive Bomber (3, 5) 0D = Bee (2, 6, 8) 0E = Gray Orb (goes back and forth and occasionally up or down) (2, 4, 6, 7) 0F = Red Skull Bomber (2, 6, 8) (also works in 1, 4, and 7, however the caterpillars that spawn from the bombs do NOT show up correctly) 10 = Gray Shooter (flies in a line, bounces, and shoots at you) (1, 2, 4, 6, 7, 8) 11 = Kamikaze Gray Orb (flies AT you) (2, 4, 6, 7) 12 = Gray Hopper (1, 2, 4, 6, 7, 8) (Identical to 05 except has 12 hp) 13 = (Spawns) Red Fliers (1, 3, 4, 7) 14 = (Spawns) Gray Fliers (1, 3, 4, 7) 15 = Bomber Hand (2, 6, 8) 16 = Metroid Swimmer (1, 4, 7) 17 = Fish Swimmer (5) 18 = Charging Shell (5) 19 = (Spawns) Gray Swimmers (5) 1A = Crescent Roller (3) 1B = Bomb Boiler (3) 1C = Red Bullet (1, 2, 4, 6, 7, 8) 1D = Red Bullet (1, 2, 4, 6, 7, 8) 1E = Unknown/Nothing (UN) 1F = UN 20 = Gate Guard (to Level 2) 21 = Power + 1 22 = Power + 4 23 = Gun + 1 24 = Gun + 4 25 = Hover + 1 26 = Hover + 4 27 = Homing Missiles 28 = Thunder Break 29 = Multi-Warhead 2A = Gate (Opens if Gate Guardian is Dead) 2B = Left-Side Lock + Gate (requires Key) 2C = Right-Side Lock + Gate (requires Key) 2D = Unknown/Freezes Game (UFG) 2E = Bullet/Explosion (BE) (dies as soon as it shows up on screen, possibly after flying in some direction) 2F = UFG 30 = Lightning Fragment (bug) 31 = UFG 32 = UN 33 = UN 34 = UFG 35 = Unknown/Bugs Game (UBG) 36 = UFG 37 = Unknown/Other (UO) (Looked like a gray hopper, but hung in place... died like a regular enemy, took 5 hits with Hyper, dropped Power + 1, didn't do anything but hang there) 38 = UFG 39 = UBG 3A = Charging Shell (again, acted exactly like 18) 3B = UN 3C = UFG 3D = UBG 3E = Charging Shell (yet again...) 3F = UN 40 = UFG 41 = BE 42 = Charging Shell (CS from now on since it shows up so much) 43 = Dying Jason (makes you die after the animation is done) 44 = UFG 45 = BE 46 = Falling Bomb (drops, rolls, then blows up and stays gone) 47 = UBG 48 = UBG 49 = CS 4A = UBG 4B = UFG 4C = BE 4D = CS 4E = UBG 4F = UFG 50 = UN 51 = CS 52 = UBG 53 = Same as 46 54 = UFG 55 = UBG 56 = UBG 57-FE = Untested FF = Signals End of List I'll fill out the rest of this later when I feel like wasting time. ;) Overhead Thing Types 00 = Robot (4, 7) 01 = Eye (2, 6) 02 = Robed Skeleton (2, 6) 03 = Spawns Eyes (2, 6) 04 = Rotating Camera(s) (1, 3, 5, 8) (used only once, at the entrance to the Level 8 boss tunnel) 05 = Gray Gumdrop (1, 3, 5, 8) 06 = Gray Flier Spawn (1, 8) 07 = Charging Robot (2, 6) (used only once, in an overhead section of Level 6) 08 = Gray Spinner (1, 8) 09 = Cross Shooter (2, 6) 0A = Vertical Camera (1, 3, 5, 8) 0B = Horizontal Camera (1, 3, 5, 8) 0C = Slider (3, 5) 0D = Gray Spitter (1, 8) 0E = Gray Zombie Head (1, 8) 0F = Red Gumdrop (1, 3, 5, 8) 10-18 = UN 19-1F = Untested 20 = Boss (Use this one for ALL level bosses, to make sure they only spawn once and the graphics are set up properly.) 21 = Power +1 22 = Power +4 23 = Gun +1 24 = Gun +4 25 = Hover +1 26 = Hover +4 27 = Homing Missile 28 = Thunder Break 29 = Multi-Warhead 2A = Final Boss (Note: Use 0x20, NOT this one. This doesn't set up the graphics properly.) 2B = BE 2C = BE 2D = BE 2E = (Spawns) Level Boss (Use 0x20, this and others ALWAYS make the boss spawn, and/or doesn't set the graphics up correctly, and/or does bad things in general. Just don't use them. For internal consumption only. ;) ) 2F = Level 7 Boss 30 = Level 6 Boss 31 = Level 1 Boss 32 = Level 5 Boss 33 = Level 8 Boss 34 = Final Boss 35 = Hyper/Boss Powerup(?) (Lets you skip the Level 1 Boss (all bosses?), if you're so inclined. Only shows up once. (per level?)) 36 = Unknown/Other (Sits there, bounces, hurts, and can't be killed. No idea what it is.) 37 = UO (Sits there, wiggles, hurts (a LOT), and can't be killed.) 38 = UO (Sits still, hurts, and can't be killed.) 39 = UO (Similar to 37.) 3A = UO (Sits there, wiggles, hurts, but disappears if shot or touched.) 3B = UO (Drops off screen, hurts.) 3C = UO (Shoots 'rainbow' bullets in semi-random directions.) 3D = UO (Sits there, changes color, hurts, can't be killed.) 3E = BE 3F = BE 40 = UO (Sits there, changes if shot, hurts, disappeares when touched.) 41 = BE (Level 8 Boss "disc" shot) 42 = BE (Final Boss' Whip) 43 = Duplicate Jason (weird bugs) 44 = BE 45 = UFG 46 = UFG 47-FE = Untested FF = Signals End of List 0x11716 = HP for the Level 4/7 Boss (Default: 0x60 (96)) Speed bytes are pointless, and indeed, not present, due to the way these bosses move. Check the "command table" to see the movement pattern. 0x11955 = Attack Pattern Pointer (0x4799 = 0x11957) 0x11957 = Attack Pattern for the Level 4 Boss (0xFF terminated) 0x11967 = Attack Pattern Pointer (0x5999 = 0x11969) 0x11969 = Attack Pattern for the Level 7 Boss (0xFF terminated) Both of the above patterns read in a "command byte", then execute it. Simple enough. Known values: 0x00 = Pause 0x01 = Jump 0x02 = Fireball 0x03 = Tri-Ball 0x04 = Regular Tongue 0x05 = Fire Tongue 0xFF = End of Loop 0x11B66 = HP for the Level 2 and 6 Boss (Default: 0x40 (64)) 0x11B6A = Horizonal Direction and Speed (Default: 0x08) 0x11B6E = Vertical Direction and Speed (Default: 0x03) These bosses bounce back and forth, when they hit borders (coded elsewhere) they reverse direction (by changing the byte sign, ie 0x08 becomes 0xF8), so these bytes are all you need to modify to change the speed. 0x1214B = HP for the individual Level 3 Boxes (Default: 0x08 (8)) 0x12186-0x12195 = X Spawn Location for the Boxes (16 values) 0x12196-0x121A5 = Y Spawn Location for the Boxes (16 values) X and Y spawn locations are relative to the upper left corner of the screen 3,3 would be right up against the upper left wall corner, D,D would be lower right corner 0x12352-0x12365 = Attack Pattern for the Boxes (0x14 (20) bytes, 2 bytes per step, 10 steps, 0xFF terminated) First byte in a step indicates what to do: 0x05 = Shoot 0x01-04 = Move Right/Left/Down/Up Any other value (rom uses 0xFF) = end of list (start over) Second byte indicates how far to go, or for shooting, how long to flash before shooting (Defaults to 0x40) 01 means to stand still (open and shuts immediately), 02 means to move one box length, 03 two box lengths, etc... If a box can't move in the direction specified by the first byte, it checks the next clockwise direction to move in until it can find one... if it can't move at all, it gives up and shuts off immediately. If it can move at least one box length in the chosen direction, but hits something early, it will stop. If a box already exists in the spawn spot, it will take control of that box. If not, it will attempt to spawn a box there unless there are 16 - (Number of Boxes Killed) boxes already. As a box spawns it is assigned a number from 0x0 to 0xF. If the max number of boxes has been reached, it will grab whichever box the spawn cycle is on. The boxes run two loops, one for spawn spots, and one for attack pattern. The spawn spot loops at 16 (0x10), skipping dead boxes, and the attack pattern loops at 10 (0x0A) because of the 0xFF byte, but with creative rom hacking this could theoretically be extended. When 16 boxes have been killed, the boss dies. Every time a Box dies, the sliding boxes speed up and are more likely to shoot. The "first" box (the one that shows up in the center of the room) will always slide to the edge of the room, regardless of the second byte of the first step. It will, however, slide in whichever direction you specify, or will shoot if need be. Each box's HP is stored seperately, and is initialized as the boss is "warping in", according to the value in 0x1214B. 0x12585 = HP for the Level 1 Boss (Default: 0x80 (128)) 0x1258F = Initial Horizonal Direction and Speed (Default: 0x00) 0x12593 = Initial Vertical Direction and Speed (Default: 0x08) 0x125B7 = Level 1 Boss speed when chasing right (higher = faster) (Default: 0x06) 0x125BB = Level 1 Boss speed when chasing left (lower = faster) (Default: 0xFA) 0x125CA = Level 1 Boss speed when chasing down (higher = faster) (Default: 0x06) 0x125CE = Level 1 Boss speed when chasing up (lower = faster) (Default: 0xFA) 0x126C7 = HP for the Level 5 Boss (Default: 0x50 (80)) 0x12A1A = HP for the Level 8 Boss (Default: 0x3c (60)) 0x12C6F = HP for the Final Boss (Default: 0xC0 (120)) 0x13C79 = HP value? (Default: 0x10 (16)) 0x13D59 = HP value? (Default: 0x10 (16)) 0x14010-0x18010 = Sound? (Wiping this with 0s makes the game run just fine, except for the intro and a complete lack of sound) 0x196B5 = Tank Ice Section Controls which tank section has "ice" blocks for blocks that aren't using sub-palette 1. Defaults to 0x0D, or the Level 6 Tank section. Valid values are 0x08-0x0F. 0x19EA3 = Level 1 Gate Structure Controls which 4 characters to paint back on the screen when closing the Level 1 gate, in case you decide to move it to another Level. Stored in UL/LL/UR/LR rather than UL/UR/LL/LR like a USB. (Default: C6 C7 D6 D7 or C6 D6 C7 D7) 0x19EAA = Level 4 Gate Structure Same as the above, for the Key gates. (Default: 6A 6B 7A 7B or 6A 7A 6B 7B) 0x1C5B2-0x1C5C1 = 0x10 Bytes = 16 Bytes Boss Points No, these are not where the bosses are (that's controlled by thing type 0x20), this is where you end up after you defeat the boss and the game needs to know where to dump you so you end up next to the exit. Each point is two bytes, X, and Y. Simple. Note that there IS a value for Level 8, it IS valid (I verified the coords by comparing them to a map position), it's just never used by the game. Lvl1 Lvl2 Lvl3 Lvl4 Lvl5 Lvl6 Lvl7 Lvl8 (Default: 3D 5A 09 75 0E 06 37 5D 18 1B 59 09 4A 40 59 2A) 0x1CA4B-0x1CA5A = 0x10 Bytes = 16 Bytes Restart Points Similar to the above, but so the game knows where to dump you after a continue, or for the first level, your ultimate starting point. Lvl1 Lvl2 Lvl3 Lvl4 Lvl5 Lvl6 Lvl7 Lvl8 (Default: 18 39 45 4B 55 07 06 0B 36 0B 05 7B 05 39 39 07) 0x1D275 = Overhead Ice Section Byte that controls which overhead level has "ice" instead of "instant death" blocks. Defaults to 0x05, or Level 6. Valid values are 0x00-0x07. 0x1DD8E-0x1DED1 = 0x144 Bytes = 324 bytes Gateway/Tunnel Data Gateways are paired up, meaning #0 leads to #1 and vice versa, #2 to 3 and vice versa, etc etc. They are stored as 3 0x6C (108) byte strings, meaning a total of 54 gateway "pairs" are available. The first string is which level the gateway is in. 00-07 is overhead sections, 08-0F is tank sections. The second string is the X position of the gateway. The third string is the Y position of the gateway.