Welcome to Data Crystal's new home! Data Crystal is now part of the TCRF family (sort of).
The wiki has recently moved; please report any issues in Discord. Pardon the dust.

Metroid Zero Mission/ROM map: Difference between revisions

From Data Crystal
Jump to navigation Jump to search
No edit summary
 
 
(17 intermediate revisions by 10 users not shown)
Line 1: Line 1:
<div>
{{rommap|game=Metroid Zero Mission}}
{| cellpadding="0" cellspacing="0" style="background-color: transparent; padding-top: 8px;"
|-
|[[Image:Microchip3.png]]||&nbsp;&nbsp;''This page is a [[ROM map|ROM Map]] for "[[Metroid Zero Mission]]".''
|}
</div><includeonly>[[Category:ROM maps]]</includeonly>


==Misc==
* <tt>340AD4</tt> - Beginning of room header data
* <tt>75FAE4</tt> - Pointer to the scrolling for the first room in the game.
* <tt>33E608</tt> - Beginning of the door data for the first room in the game.
* <tt>345AB6</tt> - Block attributes(like what weapon destroys which special block).
* <tt>75FAA8</tt> - Pointer to door data for the first room in the game.
* <tt>2CCA88</tt> - Properties related to Skree
* <tt>2B0EAB</tt> - Start of enemy data.
* <tt>3654D8</tt> - Block properties clipping.
* <tt>3655A0</tt> - Special Blocks TSA.
* <tt>3601D0</tt> - Start of door state data(a door state is when a door destination is replaced upon a certain event, and is used when big changes to a room is to be made).
* <tt>3459C4</tt> - tank capacities for energy tanks, missiles, supers and power bombs, in that order.  Each has 3 entries for the 3 difficulty levels.
* <tt>7D80A0 -7F7733</tt> - NES Metroid data


60C64A - beginning of the level data. First room in Brinstar(starting room) First few bytes are the size of the room. The first 2 bytes control the size, but the third is unknown.
  013025
013025
013025
013025
013025
013025
013025
013025
013025
013025
013025
013025
013025
013025
013025
013025
013025
01BB15
01720D
01720D
018285
018285
01BEFD
01BEFD
01C50D
01C50D
012FF1
012FF1
012FF1
012FF1
012FF1
01CAE1
01CAE1
013271
014C71
014C71
014C71
014C71
014C71
014C71
014C71
014C71
014C71
014C71
014C71
014C71
014C71
014C71
014C71
014C71
01E739
01E739
01E9D5
012FF1
01EE39
01EE39
01F289
01F289
01F771
020A89
020A89
01D92D
01D955
01D1E5
01D1E5
045E4D
023521
023521
01375D
048FF9
024661
024661
02498D
02498D
025665
025535
0132D5
0264F5
026B09
0282C9
02872D
02C6A5
02C6A5
02C6A5
02C6A5
02C6A5
02E9BD
02E9BD
015CF1
015CF1
02EE79
02F3FD
02F3FD
02FDD5
031201
03147D
0319D1
034A39
02EF69
02E4ED
036011
036011
036D35
0372A9
037B71
037B71
040179
0387D1
03897D
039E79
020229
01AA3D
0286B9
01C161
03B7B1
03C4DD
03C885
03D4C1
04B7F1
03F31D
04AE91
03FFE1
04058D
04058D
036DD1
0406C9
040B09
0412A9
04198D
041ABD
041BED
041D1D
0257B9
0257B9
0433F9
0406C9
040B09
040B09
044099
0264F5
0448E1
0448E1
0448E1
0448E1
0448E1
046621
047281
047D31
015CF1
0483F1
048439
0488A5
0381D1
0381D1
0381D1
0381D1
036275
02E9BD
02E9BD
04058D
04058D
02F3FD
02F3FD
049A39
049B51
036D35
044659
044659
04A5E5
04A5E5
04A9A1
04A9A1
04A9A1
04A2A1
04A2A1
049BD1
049BD1
049BD1
049BD1
049DCD
028629
04B785
04B605
04171D
04144D
0417E9
0418B9
0127AD
04B885
04DD59
012A35
04A7ED
04A7ED
04A7ED
04A7ED
047D31
04E9C1
04E9C1
02D841
02DD99
047D31
036DD1
036DD1
036DD1
036DD1
036DD1
2B2870
2CB304
2C4194
2C4194
  2C4BC0
  2C4BC0 - Enemy AIs, 0-205


Each section of level data for the room has the same 3 bytes that begin the data. Following this is the different level data pieces. First comes the clip data, or what part the player interacts withThere are 2 formats: The first is 2 bytes, the first of which is always 80 +, is a simple RLE. The first byte tells how many times to repeat the contents of the second byte. The second byte is what you interact with. 10, for example, is a solid block.  
//
The second format is different, a bit. The first byte is how many blocks, like the first, except the value is from 00 to 7f. Now, what follows is a one block per space format, which means that if the first byte is 05, then the following data would look like this: 10 10 00 00 10.
// MZM structs
//
 
// 8 bytes
struct SE {
u8 bAnimated;
u8 timer;
u16 length;
void *data;
};
 
// ? bytes
struct sDoorAttr {
u8 b00;
u8 color;
...
u8 type; // b07;
 
  };
 
  // Not *quite* a door, but a general exit?
struct sDoor {
  u8 type;
  u8 OwnerRoom;
  u8 left;
  u8 right;
  u8 top;
  u8 bottom;
  u8 DestDoor;
  u8 ExitDoorLength;
  u8 b08;
  u8 b09;
  u8 b0A;
  u8 b0B;
};
 
struct s300009C {
u16 *ForegroundPtr // 000
u16 ForegroundWidth
u16 ForegroundHeight
 
u16 *LevelDataPtr // 008
u16 LevelDataWidth
u16 LevelDataHeight
 
u16 *BackLayerPtr // 010
u16 BackLayerWidth
u16 BackLayerHeight
 
u16 *ClipdataPtr // 018
u16 ClipdataWidth
u16 ClipdataHeight
 
u8  Tileset // 20
u8  ForegroundCompression
u8  LeveldataCompression
u8  BacklayerCompression
u8  BackgroundCompression
u8  b25
u8  TransForeground
u8  b27
void *CurrentSpritePtr;
u8 EventCounter;
u8 unknown
u8 MiniMapX;
u8 MiniMayY;
u16 unknown
u16 FFFF
}
 
struct t30013D4
{
u8 b00;
u16 h10;
u16 h12; // x
u16 h14; // y
  };
 
  struct t3001588
  {
s16 sh70; // velocities ?
s16 sh74;
  }
 
  struct t3005450 // 12 bytes
  {
u16 *ph08;
  };


Certain destroyable blocks do not come back, and also any block that acts like an upgrade pickup(missles, for example).  Some common values worth noting are 5B and 6B, the former being a power bomb block that does not return, while the latter does return when you switch rooms.  5A and 6A, the former being a speed block that does not respawn, but does return when you switch rooms, while the latter(I like saying latter for some reason :D) respawns quickly.
{{Internal Data}}
 
Regular item pickups are from 5C to 5F.  5C is an energy tank, 5D is a missle tank, 5E is a super missle pickup, and 5F are power bombs.  6C to 6F are hidden tanks.
 
The graphics work in the same manner, with the first 3 bytes being the size of the data in the room, and the remainder being the same format as with the clip bytes.  Some graphics to note are 48 to 4B, which are item graphics.  Of course if you combine an item graphic with the right item clip byte, you get an item.  40 to 47 are the various special block tiles, without being covered.
 
After this is what I noticed were a bunch of 00's, 01's and stuff.  This data is what tileset each graphic uses.  This means you can grab tiles from more than just 256, by changing these bytes.  I haven't worked with it much, but it seems that one byte = one piece of data.  So one 01 would cover an 8c 00(no graphic), or an array.
 
After, if present, would be the various layer data.  I haven't worked much with other layers, but the data should be there.  Last, is sprite data, which is just a series of 3 bytes, each being one sprite.  The first 2 bytes are the postion, and the third is the object in the index to use.
 
Room Header data:
 
340AD4 - room header of the starting room
 
Well first of all is a byte that determins what graphic is used for the room.  Following that seems to be controls for the various layers.  I've managed to turn off some layers before, but I am unsure how it works.  After this are the various level data pointers.  After this are sprite pointers(apparently 2, one for normal and 1 for hard mode).  After the sprite data is a byte that is the enemy index for the room.  This tells the game what objects are in the room.  A few indexes I have found are:  2F. 30. 4F  These are for the 3 unknown items and their blocks.  The last one is the plasma beam while the first is the gravity suit.  Also are 04(long beam), 10 to some byte or another(most item and location statues), and 4B(Crocomire).
 
It looks as if the byte after the enemy index might be some sort of switch or somthing that makes those changes to the enemies thoughout the game.  More testing is needed, however.
After this is one more pointer untested.  After is the location of the room on the map, and then data that relates to extra layers that affect you(like water and acid), after is the music data.  That's the end of it there.
 
Door Data:
 
The first byte seems to determine whether or not the door acts like a door, or another kind of room transition.  It also seems to control if the door displays an intro(like for an area).  The second byte I don't know exactly what it does yet.
 
The third and 4th byte are the x positions of both where the door is located(in terms of shootability), and where it lets you off after you go though it(from the other side)  After that is door index that's used.  Changing it will make you go to different doors and warps around the reigon.  After that is where on the screen the door drops you off, and the last one seems to be the y postion, but doesn't really seem used much.
 
On second though, it looks as if the second byte is the room number.  Because of how the game does its map and stuff, it's quite possible that there are only 256 rooms in the entire game.  Of course that seems a tad unlikely, but you never know.
 
3459c4 - item pickup data.  4 entries for each difficulty level.

Latest revision as of 14:28, 24 January 2024

Chip tiny.png The following article is a ROM map for Metroid Zero Mission.

Misc

  • 340AD4 - Beginning of room header data
  • 75FAE4 - Pointer to the scrolling for the first room in the game.
  • 33E608 - Beginning of the door data for the first room in the game.
  • 345AB6 - Block attributes(like what weapon destroys which special block).
  • 75FAA8 - Pointer to door data for the first room in the game.
  • 2CCA88 - Properties related to Skree
  • 2B0EAB - Start of enemy data.
  • 3654D8 - Block properties clipping.
  • 3655A0 - Special Blocks TSA.
  • 3601D0 - Start of door state data(a door state is when a door destination is replaced upon a certain event, and is used when big changes to a room is to be made).
  • 3459C4 - tank capacities for energy tanks, missiles, supers and power bombs, in that order. Each has 3 entries for the 3 difficulty levels.
  • 7D80A0 -7F7733 - NES Metroid data
013025
013025
013025
013025
013025
013025
013025
013025
013025
013025
013025
013025
013025
013025
013025
013025
013025
01BB15
01720D
01720D
018285
018285
01BEFD
01BEFD
01C50D
01C50D
012FF1
012FF1
012FF1
012FF1
012FF1
01CAE1
01CAE1
013271
014C71
014C71
014C71
014C71
014C71
014C71
014C71
014C71
014C71
014C71
014C71
014C71
014C71
014C71
014C71
014C71
01E739
01E739
01E9D5
012FF1
01EE39
01EE39
01F289
01F289
01F771
020A89
020A89
01D92D
01D955
01D1E5
01D1E5
045E4D
023521
023521
01375D
048FF9
024661
024661
02498D
02498D
025665
025535
0132D5
0264F5
026B09
0282C9
02872D
02C6A5
02C6A5
02C6A5
02C6A5
02C6A5
02E9BD
02E9BD
015CF1
015CF1
02EE79
02F3FD
02F3FD
02FDD5
031201
03147D
0319D1
034A39
02EF69
02E4ED
036011
036011
036D35
0372A9
037B71
037B71
040179
0387D1
03897D
039E79
020229
01AA3D
0286B9
01C161
03B7B1
03C4DD
03C885
03D4C1
04B7F1
03F31D
04AE91
03FFE1
04058D
04058D
036DD1
0406C9
040B09
0412A9
04198D
041ABD
041BED
041D1D
0257B9
0257B9
0433F9
0406C9
040B09
040B09
044099
0264F5
0448E1
0448E1
0448E1
0448E1
0448E1
046621
047281
047D31
015CF1
0483F1
048439
0488A5
0381D1
0381D1
0381D1
0381D1
036275
02E9BD
02E9BD
04058D
04058D
02F3FD
02F3FD
049A39
049B51
036D35
044659
044659
04A5E5
04A5E5
04A9A1
04A9A1
04A9A1
04A2A1
04A2A1
049BD1
049BD1
049BD1
049BD1
049DCD
028629
04B785
04B605
04171D
04144D
0417E9
0418B9
0127AD
04B885
04DD59
012A35
04A7ED
04A7ED
04A7ED
04A7ED
047D31
04E9C1
04E9C1
02D841
02DD99
047D31
036DD1
036DD1
036DD1
036DD1
036DD1
2B2870
2CB304
2C4194
2C4194
2C4BC0
2C4BC0 - Enemy AIs, 0-205
//
// MZM structs
//
 
// 8 bytes
struct SE {
	u8	bAnimated;
	u8	timer;
	u16	length;
	void *data;
};
 
// ? bytes
struct sDoorAttr {
	u8	b00;
	u8	color;
	...
	u8	type;		// b07;
 
};
 
// Not *quite* a door, but a general exit?
struct sDoor {
  u8 type;
  u8 OwnerRoom;
  u8 left;
  u8 right;
  u8 top;
  u8 bottom;
  u8 DestDoor;
  u8 ExitDoorLength;
  u8 b08;
  u8 b09;
  u8 b0A;
  u8 b0B;
};
 
struct s300009C {
	u16 *ForegroundPtr			// 000
	u16 ForegroundWidth
	u16 ForegroundHeight
 
	u16 *LevelDataPtr			// 008
	u16 LevelDataWidth
	u16 LevelDataHeight
 
	u16 *BackLayerPtr			// 010
	u16 BackLayerWidth
	u16 BackLayerHeight
 
	u16 *ClipdataPtr			// 018
	u16 ClipdataWidth
	u16 ClipdataHeight
 
	u8  Tileset					// 20
	u8  ForegroundCompression
	u8  LeveldataCompression
	u8  BacklayerCompression
	u8  BackgroundCompression
	u8  b25
	u8  TransForeground
	u8  b27
	void *CurrentSpritePtr;
	u8	EventCounter;
	u8 	unknown
	u8 	MiniMapX;
	u8 	MiniMayY;
	u16 unknown
	u16 FFFF
}
 
struct t30013D4
{
	u8	b00;
	u16	h10;
	u16	h12;	// x
	u16	h14;	// y
};
 
struct t3001588
{
	s16	sh70;	// velocities ?
	s16	sh74;
}
 
struct t3005450		// 12 bytes
{
	u16	*ph08;
};