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.

Final Fantasy I & II: Dawn of Souls/FF1 Animation Scripting

From Data Crystal
Jump to navigation Jump to search

This is a sub-page of Final Fantasy I & II: Dawn of Souls.

Spell and attack animations in Final Fantasy I use a shared scripting language to define how animations play out. Here follows a list of known script commands; there are many more yet to be discovered and understood.


0x00: End animation
 0x4 bytes long
0x01: Execute previous commands
 0x8 Bytes long
 And do some bookkeeping too?
 Repeat until all previous commands are finished?
 Don't load subsequent commands until that time either
0x02: Conditional Test
 If the conditional fails, skip to the next 0x4 or 0x3 command
 0xC bytes long
 $00: Which $1F130 test to run
 $04: Test parameter (if applicable)
0x03: Failed conditional marker 1
 0x04 bytes
 -When this is encountered after a 0x02 fail, execute all of the following chunks until
 an 0x4 is reached
0x04: Failed conditional marker 2
 0x04 bytes
 -used as an end marker for failed 0x02 conditionals
 -Set the command after this one as the place to begin reading from
 -Used by Kill to skip part of its animation if it fails to inflict Death
0x05:
 -Used to handle spells like Blind that play an effect on individual targets before proceeding with 'main' effect
 -Loops for all 9 monsters or all 4 PCs, depending on who the target is
 -For each target, 
 $04: Mode byte; indexes to a routine jump table
  $1F130
  Run for each target to determine if that target will have the effect played	
  0x00: Return 0x1
  0x01: Return 0x1 for all living targets
  0x02: If caster is a monster, return 0x0; if a PC, return 0x1
  0x03: If target(s) is/are monster(s), return 0x0; if targets are PC, return 0x1
  0x04: Return 0x1 only on targets who are effected by the spell? (for Kill, etc?)
  0x05: (same as 0x01)
  0x06: Depending on Encounter ID, returns a variable:
 $08: Some number that becomes the Param1 of a 0x7 Chunk - delay between each iteration
 $0C: Number of subsequent chunks to load
(these next chunks are applied to every valid target)
After loading those chunks, a 0x7 Chunk is created, and the delay set to $08's value
0x06, Jump to different script offsets based on conditional
 0x18 bytes
 -If the conditional returns 0x1, choose Branch A; if 0x0, choose Branch B
 $04: Delay
 $08: Conditional ID:
   $00: Return 0x1
   $01: Return 0x1 if unit of parameter's ID may be targeted; else return 0x0
   $02: If caster is a PC, return 0x1; if a monster, return 0x0
   $03: If target(s) is/are PCs, return 0x1; if monster(s), return 0x0
   $04: If target (or any among targets) received a status effect from this attack return 0x1; else 0x0
   $05: Same as $01
   $06: Checks encounter ID for special type; if equal to Parameter return 0x1; else 0x0
 $0C: Conditional Parameter
 $10: Branch A offset
 $14: Branch B offset
0x07, Perform some animation-related bookkeeping for a targeted animation
 0x8 bytes
 $04: Delay in frames
0x08, Play Sound:
 0xC Bytes
 $04: Sound delay, in frames(?), from when this command is first read
 $08: Sound Effect ID
0x0A, Animate standing tile
 0x1C Bytes
 $04: Spawn Delay
 $08: TSA/animation pointer? Affects how the tile GFX are loaded and animated
 $0C: More TSA/animation stuff?
 $10: Origin point type of GFX:
   0x00: Top-left corner of screen
   0x01: Center of screen
   0x02: Mid-left of screen
   0x03: Just above caster?
   0x04: Caster
   0x05: First enemy/target?
   0x06: Target?
   0x07: Caster?
   0x08: Top-left corner of screen?
 $14: Y-displacement (positive is down), hw
 $16: X-displacement (positive is right), hw
 $18: Same deal as $14 in Chunk 0x17...a zoom factor??
0x0B, (used for Kill)
 0x10 bytes
 $04: Pointer to compressed tile data
 $08: Some parameter...an identifier?
0x0D, Animate tile from target?
 0x20 bytes
 $04: Spawn delay
 $08: TSA/animation pointer
 $0C: Origin point type
 $10: Y-displacement from origin
 $12: X-displacement from origin
 $14: ??
 $18: ??
 $1C: ?? (zero?)
0x0F, Animated moving object (straight line)
 0x24 bytes
 $04: Delay
 $08: Tile data pointer?
 $0C: Origin type
 $10: Y starting pos
 $12: X starting pos
 $14: Some layering/zoom param:
   0x10000000: Flip horizontally
 $18: Y-speed; positive values are down, negative are up
 $1A: X-speed; positive values are to the right, negative to the left
 $1C: Index to tile data?
 $20: Time, in frames, this object will last; affects speed as well
0x10, Non-animated moving object (straight line)
 0x24 bytes
 $04: Delay
 $08: Tile data pointer?
 $0C: Some stuff to do with the origin...
 $10: Y origin
 $12: X origin
 $14: Y displacement (total)
 $16: X displacement (total)
 $18: Some sort of layering/zoom param?
  If 0x10000000, flip horizontally?
 $1C: Some sort of index to sprites within a spritesheet
 $20: Time; number of frames movement will take; lower values = faster, shorter
0x13, Animate tile 
 0x28 bytes
 $04: Delay (frames)
 $08: TSA/animation pointer
 $0C: Origin
 $10: Y-offset (hw)
 $12: X-offset
 $14: Some zoom factor? Same as $14 in Chunk 0x17
 $18: ??
 $1C: ??
 $20: ??
 $24: If non-0x1, tile stops animating...
 $26: If 0x1, tile is drawn beneath PC sprites
0x14, Draw object spiraling in
 0x30 (!!) bytes long
 $04: Delay
 $08: Tile data pointer
 $0C: Origin type to base destination coords off of
 $10: Destination Y-coord
 $12: Destination X-coord
 $14: Spiral Y magnitude
 $16: Spiral X magnitude
 $18: ???
 $1C: Direction/distance A and starting position on spiral
 $20: Direction/distance B
   -If A > B, go counterclockwise a distance of A - B
   -If A < B, go clockwise a distance of B - A
   -A's value also determines starting position along the spiral
 $24: More zoom params; same 0x10000000 bit to flip horizontally
 $28: Animation mode and flags?
   0x400000: Flicker
 $2C: Total time
0x17, Animate moving tile:
 $04: Spawn delay, in frames, from the start of the animation
 $08: Some ROM pointer that affects how the GFX tiles are loaded
 $0C: Origin point of moving tile, to be modified by coordinates
 $10: Displacement from the origin for the GFX tile to emerge from
  $10-11: Y-coord
  $12-13: X-coord (both are signed)
 $14: Something...displacement after spawning?
 $18:
 $19-1A:
 $1B: Layer to draw on? (in front of/behind sprites)
 $1C: Path? Only values below 0x1F are accepted; indexes to a jump table of routines
   0x00: Move in a circle?
   0x02: Spiral outwards?
   0x05: Wobble downwards (fast)
   0x06: Wobble down-right (slow)
   0x12: Sway up+down then change
   0x16: Move to left edge of screen...or mid-left at least?
   0x18: Move to right edge of screen
 $20: Parameter relating to the $1C param
0x1C, Load fixed tile?
 0x10  bytes long
 $04: Anim/Tile data pointer
 $08: Palette pointer
 $0C: ?
0x1E, Something for the end of anims
 0x08 bytes long
 $04: Delay
0x1D, load BG overlay?
 0x18 bytes long
 $04: Delay
 $08: Tile data pointer
 $0C: Y-offset in tile data
 $0E: X-offset in tile data
 $10: ?
 $14: ?
0x1F, set anim data for fixed tile?
 0x0C bytes long
 $04: Delay
 $08: Layering?
  0x1 Draw translucently over sprites
  0x2 Draw under sprites
  0x3 Draw, and remove PC sprites!
0x21: Something to do with palettes...loads palette for cycling, sets the params
 0x18 bytes long
 $04: Delay
 $08: Palette pointer
 $0C: Number of frames to play before looping
 $10: Palette cycling speed
 $14: Total time to pause before moving on
0x23: Something about activating an animation...
 0x10 bytes long
 $04: Delay
 $08: Tile data pointer..?
0x24: Restore normal brightness
 0x0C bytes long
 $04: Delay
 $08: Light speed
0x26: Tint spell GFX
 0x18 bytes long
 $04: Delay
 $08: ?
 $0C: ?           0xC and 0xC makes a faded tint...
0x27: Darken screen
 0x18 bytes long
 $04: Delay (before beginning)
 $08: Colour (only red?)
 $0C: Intensity
 $10: Flags:
   0x00: Fade BG
   0x01: Fade PCs
   0x02: Fade Monsters
   0x04: Fade spell animation
   0x05: Fade everything?
 $14: Fade speed (frames) - don't move to next command until finished darkening
0x30: Create screen distortion effect (w/ extra BG layer?)

0x18 bytes long $04: Delay $08: If nonzero, don't animate $0C: Distortion frequency $10: Distortion intensity $14: What to distort?

     0x00: BG only
     0x01: BG and monsters
     0x02: ?
     0x03: ?
0x31: (BG distortion-related)
 0x0C bytes long
 $04: Delay
 $08: Some modifier for BG overlay distortion pattern?
    very high values = less distortion
0x38: (BG effect-related)
 0x0C bytes long
 $04: Delay
 $08: Y-coord?
 $0A: X-coord?