Skip to content

ANM Animation

Robert Jordan edited this page Oct 5, 2020 · 3 revisions

Format somewhat deciphered except for 1 unknown 4-byte value and 20 zero-bytes after the header.

The extension (.anm) and file signature (ANM) stands for "Animation Script" (as dictated by common sense).

Internally, Command Lines/Command Line Count are referred to as Timelines/Timeline Count (as shown from assembly log message: "kcAnmScript : タイムライン数が不正です").
(It's undetermined whether this is a difference in translation)

File Structure

Data Type Value Description
char[4] "ANM" File Signature
uint32 Unknown Second half of 8-byte file signature?
uint32 TimelineCount Number of Timelines in animation script
byte[20] Unknown Seems to always be zeros,
initial values for Max, Blend, Disp, PosXY, etc.?
Timeline[TimelineCount] Timelines Table of animation timeline commands

Timeline

These always immediately follow the previous Timeline.

Data Type Value Description
uint32 CommandType Command performed by the line
Parameter[8] Parameters Table of 8 parameters (only 3 are ever used)

Timeline Parameter

Data Type Value Description
uint32 ParameterType 0 for literal, 1 for variable,
2 for label (treated as literal, unused)
uint32 Value Value of parameter or index of Variable

Command Types

At the time of writing, every command type is known, as their names were ripped from the ac.exe assembly and then tested via compiling.

The commands max, blend, disp and pos have not been tested, but can be guessed on their functionality. All commands have been compared to the decompiled assembly for the script execution.

x = command name
[x] = required parameter
(x) = optional parameter

Command Val Description
[ID] [min] (max) 0 Display image Id for range of ticks
set [var] [min] (max) 1 Set variable from range of values
loop [var] [label] 2 Jump to label if variable > 0 else --variable
jump [label] 3 Jump to label
if [var] [label] 4 Jump to label if variable > 0
ife [var] [value] [label] 5 Jump to label if variable == value
ifn [var] [value] [label] 6 Jump to label if variable != value
ifg [var] [value] [label] 7 Jump to label if variable > value
ifs [var] [value] [label] 8 Jump to label if variable < value
ifge [var] [value] [label] 9 Jump to label if variable >= value
ifse [var] [value] [label] 10 Jump to label if variable <= value
max [var] 11 Get "max" value and assign to variable
blend [value] 12 Set blend value
disp [value] 13 Set display value
pos [x] [y] 14 Set position of image
wait [min] (max) 15 Stay on image for range of ticks
add [var] [value] 16 Add variable += value
sub [var] [value] 17 Subtract variable -= value

About Compiled Parameters

If a command has an optional parameter, this parameter will always be present whether or not it was specified. In the case of (max), it's value will be the same as [min].

Command parameters that ask for a variable do not set the ParameterType field in the parameter like expected. A variable will still be listed as a Literal, unless the user specifies a reference (@) to a variable. In fact, it's possible to pass a variable in its place (with @) and the variable's value will be the index of the variable.

Labels in animation scripts get converted to the index of the first command after the label when compiled. A label at the beginning of the file will have a value of 0 in the parameter. The parameter type of a label is always changed to 0 (by ac.exe), even though 2 exists and is treated identically in assembly.

All Timelines have 8 parameters no matter the number of parameters the command type requires, any parameters after the total count will be ignored.

Parameter Types

Example Val Description
14 0 A literal number
@5 1 A variable (pointer/reference between)
(variables: 0-63, data type: int32)
mylabel 2 A label name (treated as literal)
(changed to 0 on compile, but still supported)

Each parameter type can be used for any parameter of any command. If a label is used for a parameter not asking for a label, then the result will be a parameter with its value set to the label index. (Which is what happens even with parameters asking for labels.)

Clone this wiki locally