Fix autogen documentation (#769)

* Fix autogen documentation

* verbose
This commit is contained in:
PeachyPeach 2025-04-27 23:24:29 +02:00 committed by GitHub
parent 04ae492e8b
commit 507e6f6102
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 73 additions and 151 deletions

View file

@ -3,6 +3,7 @@ from extract_constants import *
import sys
in_filename = 'autogen/lua_constants/built-in.lua'
deprecated_filename = 'autogen/lua_constants/deprecated.lua'
out_filename = 'src/pc/lua/smlua_constants_autogen.c'
out_filename_docs = 'docs/lua/constants.md'
out_filename_defs = 'autogen/lua_definitions/constants.lua'
@ -54,6 +55,10 @@ in_files = [
exclude_constants = {
"*": [ "^MAXCONTROLLERS$", "^AREA_[^T].*", "^AREA_T[HTO]", "^CONT_ERR.*", "^READ_MASK$", "^SIGN_RANGE$", ],
"include/sm64.h": [ "END_DEMO" ],
"include/types.h": [ "GRAPH_NODE_GUARD" ],
"src/audio/external.h": [ "DS_DIFF" ],
"src/game/save_file.h": [ "EEPROM_SIZE" ],
"src/game/obj_behaviors.c": [ "^o$" ],
"src/pc/djui/djui_console.h": [ "CONSOLE_MAX_TMP_BUFFER" ],
"src/pc/lua/smlua_hooks.h": [ "MAX_HOOKED_MOD_MENU_ELEMENTS" ],
@ -102,6 +107,12 @@ include_constants = {
]
}
# Constants that exist in the source code but should not appear
# in the documentation or VSCode autocomplete
hide_constants = {
"interaction.h": [ "INTERACT_UNKNOWN_08" ],
}
pretend_find = [
"SOUND_ARG_LOAD"
]
@ -113,7 +124,6 @@ verbose = len(sys.argv) > 1 and (sys.argv[1] == "-v" or sys.argv[1] == "--verbos
overrideConstant = {
'VERSION_REGION': '"US"',
}
forced_defines = ['F3DEX_GBI_2']
defined_values = {
'VERSION_US': True,
'VERSION_EU': False,
@ -314,7 +324,7 @@ def process_files():
############################################################################
def build_constant(processed_constant):
def build_constant(processed_constant, skip_constant):
constants = processed_constant
s = ''
@ -326,16 +336,25 @@ def build_constant(processed_constant):
for c in constants:
if c[0].startswith('#'):
s += '%s\n' % c[0]
if c[0].startswith('#ifdef'):
skip_constant = not defined_values[c[0].split()[1]]
elif c[0].startswith('#else'):
skip_constant = not skip_constant
elif c[0].startswith('#endif'):
skip_constant = False
continue
if skip_constant:
continue
s += '%s=%s\n' % (c[0], c[1].replace('"', "'"))
return s
return s, skip_constant
def build_file(processed_file):
s = ''
skip_constant = False
for c in processed_file['constants']:
s += build_constant(c)
cs, skip_constant = build_constant(c, skip_constant)
s += cs
return s
@ -348,18 +367,17 @@ def build_files(processed_files):
def build_to_c(built_files):
txt = ''
with open(get_path(in_filename), 'r') as f:
txt = ''
for line in f.readlines():
txt += line.strip() + '\n'
for filename in [in_filename, deprecated_filename]:
with open(get_path(filename), 'r') as f:
for line in f.readlines():
txt += line.strip() + '\n'
txt += '\n' + built_files
while ('\n\n' in txt):
txt = txt.replace('\n\n', '\n')
lines = txt.splitlines()
txt = "".join(f"#define {item}\n" for item in forced_defines)
txt += 'char gSmluaConstants[] = ""\n'
txt = 'char gSmluaConstants[] = ""\n'
for line in lines:
if line.startswith("#"):
txt += '%s\n' % line
@ -370,6 +388,13 @@ def build_to_c(built_files):
############################################################################
def doc_should_document(fname, identifier):
if fname in hide_constants:
for pattern in hide_constants[fname]:
if re.search(pattern, identifier) != None:
return False
return True
def doc_constant_index(processed_files):
s = '# Supported Constants\n'
for processed_file in processed_files:
@ -380,7 +405,7 @@ def doc_constant_index(processed_files):
s += '\n<br />\n\n'
return s
def doc_constant(processed_constant):
def doc_constant(fname, processed_constant):
constants = processed_constant
s = ''
@ -401,6 +426,8 @@ def doc_constant(processed_constant):
for c in [processed_constant]:
if c[0].startswith('#'):
continue
if not doc_should_document(fname, c[0]):
continue
s += '- %s\n' % (c[0])
return s
@ -409,7 +436,7 @@ def doc_file(processed_file):
s = '## [%s](#%s)\n' % (processed_file['filename'], processed_file['filename'])
constants = processed_file['constants']
for c in constants:
s += doc_constant(c)
s += doc_constant(processed_file['filename'], c)
s += '\n[:arrow_up_small:](#)\n'
s += '\n<br />\n\n'
@ -425,7 +452,7 @@ def doc_files(processed_files):
############################################################################
def def_constant(processed_constant, skip_constant):
def def_constant(fname, processed_constant, skip_constant):
global totalConstants
constants = processed_constant
s = ''
@ -461,6 +488,8 @@ def def_constant(processed_constant, skip_constant):
continue
if skip_constant:
continue
if not doc_should_document(fname, c[0]):
continue
if '"' in c[1]:
s += '\n--- @type string\n'
else:
@ -480,7 +509,7 @@ def build_to_def(processed_files):
constants = file['constants']
skip_constant = False
for c in constants:
cs, skip_constant = def_constant(c, skip_constant)
cs, skip_constant = def_constant(file['filename'], c, skip_constant)
s += cs
return s

View file

@ -1,10 +1,11 @@
import os
import re
import math
import sys
from extract_functions import *
from common import *
from vec_types import *
verbose = len(sys.argv) > 1 and (sys.argv[1] == "-v" or sys.argv[1] == "--verbose")
rejects = ""
integer_types = ["u8", "u16", "u32", "u64", "s8", "s16", "s32", "s64", "int"]
number_types = ["f32", "float", "f64", "double"]
@ -1004,8 +1005,8 @@ def build_function(function, do_extern):
if function['description'] != "":
global total_doc_functions
total_doc_functions += 1
else:
print(function['filename'] + ": " + function['line'])
elif verbose:
print("UNDOCUMENTED: " + function['filename'] + ": " + function['line'])
return s + "\n"
@ -1387,12 +1388,15 @@ def doc_files(processed_files):
def_pointers = []
def def_function(function):
def def_function(fname, function):
s = ''
if not function['implemented']:
return ''
fid = function['identifier']
if not doc_should_document(fname, fid):
return ''
rtype, rlink = translate_type_to_lua(function['type'])
param_str = ', '.join([x['identifier'] for x in function['params']])
@ -1430,7 +1434,7 @@ def def_files(processed_files):
s = '-- AUTOGENERATED FOR CODE EDITORS --\n\n'
for processed_file in processed_files:
for function in processed_file['functions']:
s += def_function(function)
s += def_function(processed_file['filename'], function)
for def_pointer in def_pointers:
s += '--- @alias %s %s\n' % (def_pointer, def_pointer[8:])

View file

@ -311,4 +311,5 @@ end
-- legacy font --
-----------------
--- @type integer
FONT_TINY = -1

View file

@ -0,0 +1,2 @@
--- @type integer
ANIM_FLAG_FORWARD = (1 << 1)

View file

@ -313,6 +313,7 @@ end
-- legacy font --
-----------------
--- @type integer
FONT_TINY = -1
--- @type integer
@ -2610,9 +2611,6 @@ DS_NONE = 0xff --- @type DialogSound
--- | `DS_MAX`
--- | `DS_NONE`
--- @type integer
DS_DIFF = DS_TUXIE
--- @type integer
FIRST_PERSON_DEFAULT_FOV = 70
@ -2866,9 +2864,6 @@ GEO_CONTEXT_AREA_INIT = 4
--- @type integer
GEO_CONTEXT_HELD_OBJ = 5
--- @type integer
INTERACT_UNKNOWN_08 = (1 << 8)
INTERACT_HOOT = (1 << 0) --- @type InteractionType
INTERACT_GRABBABLE = (1 << 1) --- @type InteractionType
INTERACT_DOOR = (1 << 2) --- @type InteractionType
@ -6484,9 +6479,6 @@ METAL = CAP --- @type PlayerPart
--- | `PLAYER_PART_MAX`
--- | `METAL`
--- @type integer
EEPROM_SIZE = 0x200
--- @type integer
NUM_SAVE_FILES = 4
@ -7751,9 +7743,6 @@ ACT_HOLDING_BOWSER = 0x00000391
--- @type integer
ACT_RELEASING_BOWSER = 0x00000392
--- @type integer
END_DEMO = (1 << 7)
--- @type integer
VALID_BUTTONS = (A_BUTTON | B_BUTTON | Z_TRIG | START_BUTTON | U_JPAD | D_JPAD | L_JPAD | R_JPAD | L_TRIG | R_TRIG | X_BUTTON | Y_BUTTON | U_CBUTTONS | D_CBUTTONS | L_CBUTTONS | R_CBUTTONS )
@ -10739,7 +10728,7 @@ AREA_TIMER_TYPE_MAXIMUM = 2 --- @type AreaTimerType
ANIM_FLAG_NOLOOP = (1 << 0)
--- @type integer
ANIM_FLAG_FORWARD = (1 << 1)
ANIM_FLAG_BACKWARD = (1 << 1)
--- @type integer
ANIM_FLAG_2 = (1 << 2)
@ -10759,9 +10748,6 @@ ANIM_FLAG_6 = (1 << 6)
--- @type integer
ANIM_FLAG_7 = (1 << 7)
--- @type integer
GRAPH_NODE_GUARD = 0xAA
--- @type integer
OBJECT_MAX_BHV_STACK = 16

View file

@ -6840,24 +6840,6 @@ function get_network_player_smallest_global()
-- ...
end
--- @param np NetworkPlayer
--- @param part PlayerPart
--- @param index integer
--- @return integer
--- Gets a red, green, or blue value from a part in `np`'s color palette
function network_player_get_palette_color_channel(np, part, index)
-- ...
end
--- @param np NetworkPlayer
--- @param part PlayerPart
--- @param index integer
--- @return integer
--- Gets a red, green, or blue value from a part in `np`'s override color palette
function network_player_get_override_palette_color_channel(np, part, index)
-- ...
end
--- @param np NetworkPlayer
--- @param part PlayerPart
--- @param color Color
@ -9619,57 +9601,6 @@ function smlua_collision_util_find_surface_types(data)
-- ...
end
--- @deprecated
--- @param enable boolean
--- [DEPRECATED: Use `HOOK_ON_HUD_RENDER_BEHIND` instead] Sets if DJUI should render behind the vanilla HUD
function djui_hud_set_render_behind_hud(enable)
-- ...
end
--- @deprecated
--- @param audio ModAudio
--- @return number
--- [DEPRECATED: There may be a replacement for this function in the future]
function audio_stream_get_tempo(audio)
-- ...
end
--- @deprecated
--- @param audio ModAudio
--- @param tempo number
--- [DEPRECATED: There may be a replacement for this function in the future]
function audio_stream_set_tempo(audio, tempo)
-- ...
end
--- @deprecated
--- @param audio ModAudio
--- @param initial_freq number
--- @param speed number
--- @param pitch boolean
--- [DEPRECATED: There may be a replacement for this function in the future]
function audio_stream_set_speed(audio, initial_freq, speed, pitch)
-- ...
end
--- @deprecated
--- @param np NetworkPlayer
--- @param part PlayerPart
--- @param color Color
--- [DEPRECATED: Use `network_player_set_override_palette_color` instead]
function network_player_color_to_palette(np, part, color)
-- ...
end
--- @deprecated
--- @param np NetworkPlayer
--- @param part PlayerPart
--- @param out Color
--- [DEPRECATED: Use `network_player_get_palette_color` or `network_player_get_override_palette_color` instead]
function network_player_palette_to_color(np, part, out)
-- ...
end
--- @param fov number
--- Sets the override FOV
function set_override_fov(fov)

View file

@ -1219,8 +1219,6 @@
| DS_YOSHI | 10 |
| DS_MAX | 11 |
| DS_NONE | 0xff |
- DS_DIFF
- DS_DIFF
[:arrow_up_small:](#)
@ -1360,7 +1358,6 @@
<br />
## [interaction.h](#interaction.h)
- INTERACT_UNKNOWN_08
### [enum InteractionType](#InteractionType)
| Identifier | Value |
@ -2915,7 +2912,6 @@
<br />
## [save_file.h](#save_file.h)
- EEPROM_SIZE
- NUM_SAVE_FILES
### [enum SaveFileIndex](#SaveFileIndex)
@ -3373,7 +3369,6 @@
- ACT_PICKING_UP_BOWSER
- ACT_HOLDING_BOWSER
- ACT_RELEASING_BOWSER
- END_DEMO
- VALID_BUTTONS
- C_BUTTONS
@ -4588,14 +4583,13 @@
| AREA_TIMER_TYPE_LOOP | 1 |
| AREA_TIMER_TYPE_MAXIMUM | 2 |
- ANIM_FLAG_NOLOOP
- ANIM_FLAG_FORWARD
- ANIM_FLAG_BACKWARD
- ANIM_FLAG_2
- ANIM_FLAG_HOR_TRANS
- ANIM_FLAG_VERT_TRANS
- ANIM_FLAG_5
- ANIM_FLAG_6
- ANIM_FLAG_7
- GRAPH_NODE_GUARD
- OBJECT_MAX_BHV_STACK
- OBJECT_NUM_REGULAR_FIELDS
- OBJECT_NUM_CUSTOM_FIELDS

View file

@ -86,7 +86,7 @@ struct VblankHandler
};
#define ANIM_FLAG_NOLOOP (1 << 0) // 0x01
#define ANIM_FLAG_FORWARD (1 << 1) // 0x02
#define ANIM_FLAG_BACKWARD (1 << 1) // 0x02
#define ANIM_FLAG_2 (1 << 2) // 0x04
#define ANIM_FLAG_HOR_TRANS (1 << 3) // 0x08
#define ANIM_FLAG_VERT_TRANS (1 << 4) // 0x10

View file

@ -798,7 +798,7 @@ void geo_obj_init_animation(struct GraphNodeObject *graphNode, const struct Anim
if (graphNode->animInfo.curAnim != anim) {
graphNode->animInfo.curAnim = (struct Animation*)anim;
graphNode->animInfo.animFrame = anim->startFrame + ((anim->flags & ANIM_FLAG_FORWARD) ? 1 : -1);
graphNode->animInfo.animFrame = anim->startFrame + ((anim->flags & ANIM_FLAG_BACKWARD) ? 1 : -1);
graphNode->animInfo.animAccel = 0;
graphNode->animInfo.animYTrans = 0;
}
@ -815,7 +815,7 @@ void geo_obj_init_animation_accel(struct GraphNodeObject *graphNode, const struc
graphNode->animInfo.curAnim = (struct Animation*)anim;
graphNode->animInfo.animYTrans = 0;
graphNode->animInfo.animFrameAccelAssist =
(anim->startFrame << 16) + ((anim->flags & ANIM_FLAG_FORWARD) ? animAccel : -animAccel);
(anim->startFrame << 16) + ((anim->flags & ANIM_FLAG_BACKWARD) ? animAccel : -animAccel);
graphNode->animInfo.animFrame = graphNode->animInfo.animFrameAccelAssist >> 16;
}
@ -900,7 +900,7 @@ s16 geo_update_animation_frame(struct AnimInfo *obj, s32 *accelAssist) {
return obj->animFrame;
}
if (anim->flags & ANIM_FLAG_FORWARD) {
if (anim->flags & ANIM_FLAG_BACKWARD) {
if (obj->animAccel) {
result = obj->animFrameAccelAssist - obj->animAccel;
} else {

View file

@ -95,7 +95,7 @@ static s16 mario_set_animation_internal(struct MarioState *m, s32 targetAnimID,
if (targetAnim->flags & ANIM_FLAG_2) {
o->header.gfx.animInfo.animFrameAccelAssist = (targetAnim->startFrame << 0x10);
} else {
if (targetAnim->flags & ANIM_FLAG_FORWARD) {
if (targetAnim->flags & ANIM_FLAG_BACKWARD) {
o->header.gfx.animInfo.animFrameAccelAssist = (targetAnim->startFrame << 0x10) + accel;
} else {
o->header.gfx.animInfo.animFrameAccelAssist = (targetAnim->startFrame << 0x10) - accel;
@ -151,13 +151,13 @@ void set_anim_to_frame(struct MarioState *m, s16 animFrame) {
if (animInfo == NULL) { return; }
if (animInfo->animAccel) {
if (curAnim != NULL && curAnim->flags & ANIM_FLAG_FORWARD) {
if (curAnim != NULL && curAnim->flags & ANIM_FLAG_BACKWARD) {
animInfo->animFrameAccelAssist = (animFrame << 0x10) + animInfo->animAccel;
} else {
animInfo->animFrameAccelAssist = (animFrame << 0x10) - animInfo->animAccel;
}
} else {
if (curAnim != NULL && curAnim->flags & ANIM_FLAG_FORWARD) {
if (curAnim != NULL && curAnim->flags & ANIM_FLAG_BACKWARD) {
animInfo->animFrame = animFrame + 1;
} else {
animInfo->animFrame = animFrame - 1;
@ -176,7 +176,7 @@ s32 is_anim_past_frame(struct MarioState *m, s16 animFrame) {
struct Animation *curAnim = animInfo->curAnim;
if (animInfo->animAccel) {
if (curAnim->flags & ANIM_FLAG_FORWARD) {
if (curAnim->flags & ANIM_FLAG_BACKWARD) {
isPastFrame =
(animInfo->animFrameAccelAssist > acceleratedFrame)
&& (acceleratedFrame >= (animInfo->animFrameAccelAssist - animInfo->animAccel));
@ -186,7 +186,7 @@ s32 is_anim_past_frame(struct MarioState *m, s16 animFrame) {
&& (acceleratedFrame <= (animInfo->animFrameAccelAssist + animInfo->animAccel));
}
} else {
if (curAnim->flags & ANIM_FLAG_FORWARD) {
if (curAnim->flags & ANIM_FLAG_BACKWARD) {
isPastFrame = (animInfo->animFrame == (animFrame + 1));
} else {
isPastFrame = ((animInfo->animFrame + 1) == animFrame);

View file

@ -1,4 +1,3 @@
#define F3DEX_GBI_2
char gSmluaConstants[] = ""
"math.randomseed(get_time())\n"
"_SyncTable = {\n"
@ -279,7 +278,10 @@ char gSmluaConstants[] = ""
"-----------------\n"
"-- legacy font --\n"
"-----------------\n"
"--- @type integer\n"
"FONT_TINY = -1\n"
"--- @type integer\n"
"ANIM_FLAG_FORWARD = (1 << 1)\n"
"INSTANT_WARP_INDEX_START=0x00\n"
"INSTANT_WARP_INDEX_STOP=0x04\n"
"MAX_AREAS=16\n"
@ -1302,16 +1304,10 @@ char gSmluaConstants[] = ""
"DS_YOSHI=10\n"
"DS_MAX=11\n"
"DS_NONE=0xff\n"
#ifdef VERSION_JP
"DS_DIFF=DS_KOOPA\n"
#else // #ifdef VERSION_JP
"DS_DIFF=DS_TUXIE\n"
#endif // #ifdef VERSION_JP
"FIRST_PERSON_DEFAULT_FOV=70\n"
"FIRST_PERSON_MARIO_HEAD_POS=120\n"
"FIRST_PERSON_MARIO_HEAD_POS_SHORT=60\n"
"G_COPYMEM=0xd2\n"
#ifdef F3DEX_GBI_2
"G_NOOP=0x00\n"
"G_SETOTHERMODE_H=0xe3\n"
"G_SETOTHERMODE_L=0xe2\n"
@ -1326,20 +1322,6 @@ char gSmluaConstants[] = ""
"G_VTX=0x01\n"
"G_TRI1=0x05\n"
"G_TRI2=0x06\n"
#else // #ifdef F3DEX_GBI_2
"G_MTX=1\n"
"G_MOVEMEM=3\n"
"G_VTX=4\n"
"G_DL=6\n"
"G_TRI1=(G_IMMFIRST-0)\n"
"G_POPMTX=(G_IMMFIRST-2)\n"
"G_MOVEWORD=(G_IMMFIRST-3)\n"
"G_TEXTURE=(G_IMMFIRST-4)\n"
"G_SETOTHERMODE_H=(G_IMMFIRST-5)\n"
"G_SETOTHERMODE_L=(G_IMMFIRST-6)\n"
"G_ENDDL=(G_IMMFIRST-7)\n"
"G_NOOP=0xc0\n"
#endif // #ifdef F3DEX_GBI_2
"G_SETCIMG=0xff\n"
"G_SETZIMG=0xfe\n"
"G_SETTIMG=0xfd\n"
@ -2796,7 +2778,6 @@ char gSmluaConstants[] = ""
"EMBLEM=7\n"
"PLAYER_PART_MAX=8\n"
"METAL=CAP\n"
"EEPROM_SIZE=0x200\n"
"NUM_SAVE_FILES=4\n"
"SAVE_FILE_A=0\n"
"SAVE_FILE_B=1\n"
@ -3230,7 +3211,6 @@ char gSmluaConstants[] = ""
"ACT_PICKING_UP_BOWSER=0x00000390\n"
"ACT_HOLDING_BOWSER=0x00000391\n"
"ACT_RELEASING_BOWSER=0x00000392\n"
"END_DEMO=(1 << 7)\n"
"VALID_BUTTONS=(A_BUTTON | B_BUTTON | Z_TRIG | START_BUTTON | U_JPAD | D_JPAD | L_JPAD | R_JPAD | L_TRIG | R_TRIG | X_BUTTON | Y_BUTTON | U_CBUTTONS | D_CBUTTONS | L_CBUTTONS | R_CBUTTONS )\n"
"C_BUTTONS=(U_CBUTTONS | D_CBUTTONS | L_CBUTTONS | R_CBUTTONS )\n"
"HOOK_UPDATE=0\n"
@ -3901,11 +3881,7 @@ char gSmluaConstants[] = ""
"SOUND_GENERAL_UNKNOWN1_2=SOUND_ARG_LOAD(SOUND_BANK_GENERAL, 0x25, 0x00, SOUND_VIBRATO | SOUND_DISCRETE)\n"
"SOUND_GENERAL_CLAM_SHELL2=SOUND_ARG_LOAD(SOUND_BANK_GENERAL, 0x26, 0x40, SOUND_DISCRETE)\n"
"SOUND_GENERAL_CLAM_SHELL3=SOUND_ARG_LOAD(SOUND_BANK_GENERAL, 0x27, 0x40, SOUND_DISCRETE)\n"
#ifdef VERSION_JP
"SOUND_GENERAL_PAINTING_EJECT=SOUND_ARG_LOAD(SOUND_BANK_GENERAL, 0x28, 0x00, SOUND_CONSTANT_FREQUENCY | SOUND_DISCRETE)\n"
#else // #ifdef VERSION_JP
"SOUND_GENERAL_PAINTING_EJECT=SOUND_ARG_LOAD(SOUND_BANK_GENERAL, 0x28, 0x00, SOUND_NO_VOLUME_LOSS | SOUND_CONSTANT_FREQUENCY | SOUND_DISCRETE)\n"
#endif // #ifdef VERSION_JP
"SOUND_GENERAL_LEVEL_SELECT_CHANGE=SOUND_ARG_LOAD(SOUND_BANK_GENERAL, 0x2B, 0x00, SOUND_DISCRETE)\n"
"SOUND_GENERAL_PLATFORM=SOUND_ARG_LOAD(SOUND_BANK_GENERAL, 0x2D, 0x80, SOUND_DISCRETE)\n"
"SOUND_GENERAL_DONUT_PLATFORM_EXPLOSION=SOUND_ARG_LOAD(SOUND_BANK_GENERAL, 0x2E, 0x20, SOUND_DISCRETE)\n"
@ -4380,14 +4356,13 @@ char gSmluaConstants[] = ""
"AREA_TIMER_TYPE_LOOP=1\n"
"AREA_TIMER_TYPE_MAXIMUM=2\n"
"ANIM_FLAG_NOLOOP=(1 << 0)\n"
"ANIM_FLAG_FORWARD=(1 << 1)\n"
"ANIM_FLAG_BACKWARD=(1 << 1)\n"
"ANIM_FLAG_2=(1 << 2)\n"
"ANIM_FLAG_HOR_TRANS=(1 << 3)\n"
"ANIM_FLAG_VERT_TRANS=(1 << 4)\n"
"ANIM_FLAG_5=(1 << 5)\n"
"ANIM_FLAG_6=(1 << 6)\n"
"ANIM_FLAG_7=(1 << 7)\n"
"GRAPH_NODE_GUARD=0xAA\n"
"OBJECT_MAX_BHV_STACK=16\n"
"OBJECT_NUM_REGULAR_FIELDS=0x50\n"
"OBJECT_NUM_CUSTOM_FIELDS=0x40\n"