typedef struct {
uint16_t nb_objects; // Number of background objects contained in the file
uint16_t nb_faces; // Number of faces/quads for the aforementioned objects
uint32_t faces_offset;
uint32_t script_offset;
uint32_t unknown; // Always 0
char stage_name[128]; // Name of the stage in SHIFT_JIS
char song1_name[128]; // Name of the first song in SHIFT_JIS
char song2_name[128]; // Name of the second song in SHIFT_JIS
char song3_name[128]; // ? A single blank if unused
char song4_name[128]; // ? A single blank if unused
char song1_path[128];
char song2_path[128];
char song3_path[128]; // ? A single blank if unused
char song4_path[128]; // ? A single blank if unused
uint32_t offsets[nb_objects]; // offsets of the start of each object of section 1
} thstd_header_t;
This section is responsible for creating objects from the stgxbg.anm file.
typedef struct {
uint16_t id; // Always equal to the object's number. Not used by the game.
uint16_t unknown; //TODO
// The bounding box.
float x;
float y;
float z;
float width;
float height;
float depth;
} object_header_t;
typedef struct {
uint16_t unknown; // 0 means a quad, 0xffff means the end.
uint16_t size; // 0x1c for a quad, 4 for the end marker.
uint16_t script_index; // Index of a script entry in the corresponding anm file
uint16_t _padding; // Unused, padding
float x; // x coordinate of the bottom-left corner of the quad
float y; // y coordinate of the bottom-left corner of the quad
float z; // z coordinate of the bottom-left corner of the quad
float width; // If not 0, override the sprite's width (else, use anm info)
float height; // If not 0, override the sprite's height (else, use anm info)
} thstd_object_t;
typedef struct {
struct object_header header;
struct object_quad quads[]; // Stop when quads.unknown == 0x0004ff
} object_t;
This section is responsible for placing objects from section 1 in the space.
typedef struct {
uint16_t object_id; // must not exceed header.nb_objects
uint16_t unknown1; // Always 256, doesn't seem to change anything
float x;
float y;
float z;
} thstd_object_instance_t;
// ends with 16 \xFF
This section is responsible for camera movement, fog effects, and such things.
typedef struct {
uint32_t frame_num;
uint16_t type;
uint16_t size; // always 0x0c, ignored by the game
uint32_t arg1;
float arg2;
float arg3;
} thstd_instr_t;
typedef struct {
uint8_t b;
uint8_t g;
uint8_t r;
uint8_t unknown; //TODO: Seems useless. padding? Alpha?
} color_t;
typedef struct { // .type == 1
color_t color;
float fog_start;
float fog_end;
} thstd_fog_instr_t;
typedef struct { // type == 0
float x;
float y;
float z;
} thstd_viewpos_instr_t;
typedef struct { // type == 2
float center_dx; // x delta between the camera position and its view center
float center_dy; // y delta between the camera position and its view center
float dz; // z coordinate of the camera, divided by -835.979370
} thstd_viewpos2_instr_t;
typedef struct { // type == 3
uint32_t duration; // Duration of the interpolation, in frames
uint32_t unused[2];
} thstd_start_interpolating_viewpos_instr_t;
typedef struct { // type == 4
uint32_t duration; // Duration of the interpolation, in frames
uint32_t unused[2];
} thstd_start_interpolating_fog_instr_t;
// ends with 20 \xFF
typedef struct {
thstd_header_t header;
uint32_t* offsets;
list_t objects;
list_t faces;
list_t messages;
} thstd_t;