Tip: Switch palace switches normally disappear if you replay the level. However, if you insert them as direct Map16 and use the hex edit at $00EEB2 in the ROM map, you can replay the level without a problem.
Bits 5 through 7 of this address are used to keep track of which overworld Koopa Kids have been defeated (i.e. they pulled Mario into a level and the level was beaten). If set, the sprite will not respawn.
If bit 7 is set (#$80-#$FF) and the player is located on a level tile, they will enter it directly.
The Koopa Kid and Piranha Plant overworld sprites also write their sprite index to this address while the player is in contact with them. The Piranha Plant in particular uses this to erase itself if Mario beats the level the sprite is on top of.
How sprites enter pipes with the player. This handles carried sprites and riding yoshi, and is always set regardless whether or not the player is carrying a sprite and whether or not is riding yoshi. When this RAM is set to any non-zero and the sprite is being carried and/or yoshi is being ridden on, they're placed behind layer 1 and yoshi's tongue is not shown (when licking).
$01 = Horizontal pipes (duck a little on yoshi and carrying sprites facing left or right).
$02 = Vertical pipes (face the screen).
$FF = Don't change image, only go behind layer (shooting out of slanted pipe). Note that this will probably work with all values #$03-#$FF.
Note: Yoshi always show his pipe animation pose regardless if the player is mounted on Yoshi or not, consider using this patch to fix it.
Layer 1 X position, next frame.
Much similar to $7E:001A, maintaining the exact same values, with the difference being the usage of their values.
This is more notable in auto-scroll commands, for example, if $7E:1462 were to remain static while there was a Layer 2 auto-scroll going, the image would stay, but the level would move.
Is also used for temporary storage to determine how much the screen has moved horizontally in the current frame. ($7E:001A - $7E:1462 = $7E:17BD)
Also used during the credits scene for the second layer 1 X position, where the output is separated in two halves, each with their own scrolling.
Empty. Cleared on reset, titlescreen load, overworld load and cutscene load.
$7E146C-$7E146D is used by Lunar Magic (v3.10+): on level load it holds the Layer 3 Y position/offset (as defined in the advanced bypass settings), and it's updated during the level when the layer 3 scrolls vertically to keep track of how much it scrolled. It's used to make layer 3 scroll with the camera in levels that scroll vertically, when the layer 3 vertical scroll is not "None".
Routine that updates the player's X and Y position ($94 and $13DA, $96 and $13DC) by X and Y speed ($7B and $7D).
The rate of movement is in “subpixels” per frame-- 1/16th of a pixel for more precise movement, using fixed point arithmetic. Note that stuff using position besides speed related data, such as hitboxes will only take the pixel position and not the subpixel position.
Normally this routine is called after JSR to $00DC2D. It then JSRs into $00DC4F with:
JSL for sprites interacting with objects. Actually calls routine at $019140.
During processing GPS blocks:
$0A-$0D: Position (in pixels) of the collision point currently being processed for sprite interaction with blocks in the level:
$0A-$0B (2 bytes): X position
$0C-$0D (2 bytes): Y position
Note, just like $98-9B, coordinates are respective to the top-left of the layer currently being processed. Hence, if Layer 1 and Layer 2 are offset from each other, this value will differ between the two, even when the sprite is at the same position with respect to the level.
$0F (1 byte): Index of one of the 4 collision points currently in use. Also used to eject sprite out of block horizontally:
#$00 = SpriteH: Right (touches blocks from left)
#$01 = SpriteH: Left (touches blocks from right)
#$02 = SpriteV: Down (touches blocks from above)
#$03 = SpriteV: Up (touches blocks from below)
Be careful when using custom blocks, $0F remains used before and after custom block processing at $019533. If $0F is modified and not restored, sprite interaction glitches can occur.
Message to mods: SpriteV and SpriteH are swapped on the info about $0F. I fixed it.
Part of the main Sprite<->Sprite interaction subroutine. Called from $018032
How this works:
The current sprite that call this subroutine is sprite_A, and the other sprite to compare with will be Sprite_B.
If the frame counter $13 is an odd number and sprite_A is also odd, or if both are even, then this subroutine terminates to save performance. Otherwise if one is odd and other is even, the proceed with the subroutine. The reason for this is because it is very performance-heavy. If all 12 sprites uses this, then there are 66 possible pairs to check for collision.
The routine loops through all the sprite slots below (indexes lower than) sprite_A's index. With Sprite_B starting at sprite_A's index, minus 1, then decreasing until $FF, then finishes.
The sprite which comes out of a Yoshi egg when spawned from a question mark block. The first byte is the sprite ID when no Yoshi exists and the second byte is the sprite ID when Yoshi does exist. By default, these are $35 (Yoshi) and $78 (1-up).
Subroutine run on bounce sprite INIT (for all bounce sprites except turnblocks), which is responsible for the bug where a coin on top of hittable block and hitting said block will cause the coin to turn into an invisible solid block.
$029330 is the block on page 0 which is to be collected. Keep in mind that this is independent of the acts like setting and has to be implemented manually.
Code that generates a spinning coin at the position of a bounce sprite. This is used to be able to collect with a bounce block. However, this routine doesn't handle the removal of the coin which is instead handled by $0291B8.
8x8 fireball GFX subroutine. Is it also used as a base for various other extended sprites' graphics (they JSR to it and then change the tile numbers and properties) as well as despawning them when they leave the screen.
"Get Fireball clipping" subroutine. Valid for Yoshi's and Mario's fireballs, Stores the clipping X displacement low byte to $00, the clipping X displacement high byte to $08, the clipping width (#0C) to $02, the clipping Y displacement low byte to $01, the clipping Y displacement high byte to $09, and the clipping height (#$13) to $03 (so it's equivalent to the "Get sprite clipping B" routine).
- Y: which extended sprite slot to get clipping of (should be #$08, #$09 for Fireball #1 and #2)
Suboutine that updates the extended sprite's X and Y position ($171F/$1733/$175B and $1715/$1729/$1751) by its speed ($1747 and $173D). This alone is without gravity. The rate of movement is “subpixels” (1/16th of a pixels) per frame, similarly to Mario's speed handler at $00DC4F
$02B5BC-$02B5C7: Calls $02B5C8 with the current extended sprite index +10 (number of existing extended sprite slots) to use the X position instead of Y.
Modified by Lunar Magic:
- $03BB90: Start of Lunar Magic's modified Message Box routine.
- $03BC0B: Pointer to message locations. Note that this changes every time you use LM to edit the messages.
- $03BC7F: Table of the first 2 bytes of the stripe header for message boxes.
- $03BE80: Table of offsets to find the correct message. Indexed by ($13BF * 2 + ($1426 - 1)) * 2
- $03BCDC: (LM 3.00+) Routine (ends in RTL) that computes the current screen exit number Mario is in and puts it in X (required to use for the new horizontal level modes). Note: if the level uses one of the new horizontal modes, the routine will overwrite Y.
The X position where Mario stops in the Yoshi's House at Ending.
If you change this value, Peach and Green Yoshi's stopping positions will also change to match Mario's. (The spacing will remain the same, but the positions will shift.)