User Tools

Site Tools


super:technical_information:data_structures

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
super:technical_information:data_structures [2019/02/07 21:41] – Special x-ray blocks and PLM populations p.jboysuper:technical_information:data_structures [2019/03/02 17:50] – [Special x-ray blocks] added flexglow note p.jboy
Line 31: Line 31:
 | 7 | Debug | | 7 | Debug |
 </hidden> </hidden>
 + 
  
 Notes: Notes:
Line 98: Line 99:
 | 4 | Area torizo (Bomb Torizo, Golden Torizo) | | 4 | Area torizo (Bomb Torizo, Golden Torizo) |
 </hidden> </hidden>
 + 
 ===== Door list ===== ===== Door list =====
    _________________ First door pointer (door BTS 0)    _________________ First door pointer (door BTS 0)
Line 233: Line 234:
 | 7 | Song 2 | | 7 | Song 2 |
 </hidden> </hidden>
 + 
  
 Notes: Notes:
Line 387: Line 389:
 | ::: | ::: | 4Fh || Critters escape block | | ::: | ::: | 4Fh || Critters escape block |
 </hidden> </hidden>
 + 
 ==== FX ==== ==== FX ====
    __________________________________________ Door pointer    __________________________________________ Door pointer
Line 462: Line 464:
 | 80h | Small tide (liquid fluctuates up and down) | | 80h | Small tide (liquid fluctuates up and down) |
 </hidden> </hidden>
 + 
 ==== Enemy population ==== ==== Enemy population ====
    ____________________________________ Enemy ID    ____________________________________ Enemy ID
Line 547: Line 549:
 The **X/Y position** is specified in (16px x 16px) block units. The **X/Y position** is specified in (16px x 16px) block units.
 The **block** uses the level data block format, except that the block type is ignored. The **block** uses the level data block format, except that the block type is ignored.
 +
 +Note that [[http://metroidconstruction.com/resource.php?id=54|flowglow]] uses this pointer for the flexglow table instead.
  
 ==== PLM population ==== ==== PLM population ====
Line 583: Line 587:
 | Ch | | Clear Kraid's layer 2 | | Ch | | Clear Kraid's layer 2 |
 | Eh | DDDD ssssss dddd nnnn | Transfer ''n'' bytes from ''s'' to ''d'' in VRAM //if the current door pointer = ''D''// | | Eh | DDDD ssssss dddd nnnn | Transfer ''n'' bytes from ''s'' to ''d'' in VRAM //if the current door pointer = ''D''// |
 +
 +
 +====== Object formats ======
 +Super Metroid has lots of specialised **object formats**, which are defined with an **instruction list** possibly combined with an "initialisation ASM".
 +In general, **object formats** have a handler that, for each object, executes a **pre-instruction** and then interprets the **instruction list**.
 +
 +The **instruction list** is a list of **ASM instructions** and **special instructions**.
 +**ASM instructions** have a negative value (meaning $8000..FFFF), which is a pointer to a function to be executed, followed by any parameter values that the function requires.
 +**Special instructions** (usually graphical in nature) have a positive value (meaning $0000..7FFF), usually a timer value, followed by any parameter values.
 +
 +Common **ASM instructions** include looping, conditional execution, setting the pre-instruction, deleting the object and sleeping.
 +The pre-instruction is a function that's executed before the object's instruction list is processed for the current frame.
 +Objects that are sleeping are suspended from handling until they are awakened (usually by a pre-instruction set earlier in the object instruction list).
 +
 +===== PLMs =====
 +PLMs (post-load modifications) are objects that modify level data blocks in real-time.
 +They exist in bank $84 and are typically loaded with a room from a room header (e.g. items, doors) or spawned as part of a block interaction (e.g. shot block crumbling).
 +
 +PLM header:
 +   ______ Initialisation ASM pointer
 +  |     _ Instruction list pointer
 +  |    |
 +  aaaa iiii
 +
 +Door PLM header:
 +   ___________ Initialisation ASM pointer
 +  |     ______ Instruction list pointer
 +  |    |     _ Instruction list pointer - door closing
 +  |    |    |
 +  aaaa iiii dddd
 +
 +The third pointer for door PLMs is used instead of the second pointer when the PLM is placed where a blue door would normally be closing when Samus enters a room.
 +
 +The **special instructions** for PLMs have the format:
 +   ______ Draw timer
 +  |     _ Pointer to draw instruction
 +  |    |
 +  tttt dddd
 +
 +The **draw timer** is how many frames to wait until the next instruction in the instruction list is proceeded to.
 +
 +The **draw instruction** format is a list of:
 +  nnnn       ; Number of blocks
 +  bbbb [...] ; Blocks
 +  xx yy      ; X and Y offsets from origin to start drawing from
 +
 +where the list is terminated by ''xx yy = 00 00''.
 +
 +Blocks are drawn from the PLM's position, the direction they're drawn in is given by the most significant bit of ''n''.
 +If ''n'' < 8000h, the blocks are drawn in a horizontal line to the right.
 +If ''n'' >= 8000h, ''n'' & 7FFFh blocks are drawn in a vertical line downwards.
 +
 +===== Enemy projectiles =====
 +Enemy projectiles exist in bank $86 and are typically spawned by enemies and can use their graphics and palette.
 +
 +Enemy projectile header:
 +   __________________________________ Initialisation AI
 +  |     _____________________________ (Initial) pre-instruction
 +  |    |     ________________________ Instruction list pointer
 +  |    |    |     ___________________ X radius
 +  |    |    |    |   ________________ Y radius
 +  |    |    |    |  |   _____________ Damage/properties
 +  |    |    |    |  |  |     ________ Touch AI
 +  |    |    |    |  |  |    |     ___ Shot AI
 +  |    |    |    |  |  |    |    |
 +  iiii pppp IIII xx yy Pddd tttt ssss
 +
 +The **properties** are as follows:
 +
 +| 8000h | Detect collisions with projectiles |
 +| 4000h | Don't die on contact |
 +| 2000h | Disable collisions with Samus |
 +| 1000h | Low priority (drawn under enemies/Samus/projectiles) |
 +
 +The **special instructions** for enemy projectiles have the format:
 +   ______ Spritemap timer
 +  |     _ Pointer to spritemap
 +  |    |
 +  tttt ssss
 +
 +The **spritemap timer** is how many frames to wait until the next instruction in the instruction list is proceeded to.
 +Within the spritemap, the tile numbers added to the base tile number set when the enemy projectile was spawned (so the projectile can access enemy graphics).
 +
 +===== Animated tiles objects =====
 +Animated tiles objects are objects that modify tile graphics in real-time.
 +They exist in bank $87 and are loaded with a room from an FX header.
 +
 +Animated tiles object header format:
 +   ___________ Instruction list pointer
 +  |     ______ Size
 +  |    |     _ VRAM address
 +  |    |    |
 +  iiii ssss vvvv
 +
 +The **special instructions** for animated tiles objects have the format:
 +   ______ Animation timer
 +  |     _ Pointer to tile graphics
 +  |    |
 +  tttt ssss
 +
 +The **animation timer** is how many frames to wait until the next instruction in the instruction list is proceeded to.
 +
 +===== HDMA objects =====
 +HDMA objects exist in bank $88 and are typically loaded with a room as part of FX or spawned by power bombs / x-ray.
 +
 +HDMA object header format:
 +   _______ HDMA options
 +  |   ____ PPU register index
 +  |  |   _ Instruction list pointer
 +  |  |  |
 +  dd pp iiii
 +
 +The **special instructions** for HDMA objects have the format:
 +   ______ Table timer
 +  |     _ Pointer to HDMA table
 +  |    |
 +  tttt ssss
 +
 +The **table timer** is how many frames to wait until the next instruction in the instruction list is proceeded to.
 +
 +===== Palette FX objects =====
 +Palette FX objects are objects that modify palette data in real-time.
 +They exist in bank $8D and are loaded with a room from an FX header.
 +
 +Palette FX object header format:
 +   ______ Initialisation ASM pointer
 +  |     _ Instruction list pointer
 +  |    |
 +  aaaa iiii
 +
 +The **special instructions** for palette FX objects have the format:
 +   ______ Palette timer
 +  |     _ Palette instruction list
 +  |    |
 +  tttt [...]
 +
 +The **palette timer** is how many frames to wait until the next instruction in the instruction list is proceeded to.
 +
 +The ASM instructions are usually used for setting the initial colour index,
 +which is an index into CGRAM equal to ''(p * 10h + c) * 2'' where ''p'' is the palette number and ''c'' is the colour index within the palette.
 +
 +**Palette instructions** are a mix of colours (which are positive values) and ASM instructions (negative values).
 +Colours are written to successive positions in CGRAM starting from initial colour index.
 +ASM instructions can modify the colour index between listed colour values,
 +and the instruction $C595 is used to terminate the palette instruction list.
  
super/technical_information/data_structures.txt · Last modified: 2024/03/22 16:09 by p.jboy