mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-10-30 08:01:01 +00:00
autogen array implementation
arrays are pushed to Lua via tables
This commit is contained in:
parent
14101ce10c
commit
ff83d6a037
13 changed files with 2531 additions and 2407 deletions
|
|
@ -1,10 +1,21 @@
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
from vec_types import *
|
from vec_types import *
|
||||||
|
|
||||||
usf_types = ['u8', 'u16', 'u32', 'u64', 's8', 's16', 's32', 's64', 'f32']
|
usf_types = ['u8', 'u16', 'u32', 'u64', 's8', 's16', 's32', 's64', 'f32']
|
||||||
vec_types = list(VEC_TYPES.keys())
|
vec_types = list(VEC_TYPES.keys())
|
||||||
typedef_pointers = ['BehaviorScript', 'ObjectAnimPointer', 'Collision', 'LevelScript', 'Trajectory']
|
typedef_pointers = ['BehaviorScript', 'ObjectAnimPointer', 'Collision', 'LevelScript', 'Trajectory']
|
||||||
|
|
||||||
|
type_mappings = {
|
||||||
|
'char': 's8',
|
||||||
|
'short': 's16',
|
||||||
|
'int': 's32',
|
||||||
|
'long': 's32',
|
||||||
|
'long long': 's64',
|
||||||
|
'float': 'f32',
|
||||||
|
'double': 'f64',
|
||||||
|
}
|
||||||
|
|
||||||
exclude_structs = [
|
exclude_structs = [
|
||||||
'SPTask',
|
'SPTask',
|
||||||
'VblankHandler',
|
'VblankHandler',
|
||||||
|
|
@ -13,10 +24,23 @@ exclude_structs = [
|
||||||
'UnusedArea28',
|
'UnusedArea28',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
def extract_integer_datatype(c_type):
|
||||||
|
c_type = c_type.strip().lower()
|
||||||
|
c_type = re.sub(r'\*|\[.*?\]', '', c_type)
|
||||||
|
if 'unsigned' in c_type:
|
||||||
|
base_type = c_type.replace('unsigned', '').strip()
|
||||||
|
base_type_internal = type_mappings.get(base_type, None)
|
||||||
|
if base_type_internal: return 'u' + base_type_internal[1:]
|
||||||
|
elif 'signed' in c_type or c_type in type_mappings:
|
||||||
|
base_type = c_type.replace('signed', '').strip()
|
||||||
|
base_type_internal = type_mappings.get(base_type, None)
|
||||||
|
if base_type_internal: return base_type_internal
|
||||||
|
return None
|
||||||
|
|
||||||
def get_path(p):
|
def get_path(p):
|
||||||
return os.path.dirname(os.path.realpath(__file__)) + '/../' + p
|
return os.path.dirname(os.path.realpath(__file__)) + '/../' + p
|
||||||
|
|
||||||
def translate_type_to_lvt(ptype):
|
def translate_type_to_lvt(ptype, allowArrays=False):
|
||||||
pointerLvl = 0
|
pointerLvl = 0
|
||||||
|
|
||||||
if ptype == "char":
|
if ptype == "char":
|
||||||
|
|
@ -28,6 +52,10 @@ def translate_type_to_lvt(ptype):
|
||||||
if ("char" in ptype and "[" in ptype):
|
if ("char" in ptype and "[" in ptype):
|
||||||
return "LVT_STRING"
|
return "LVT_STRING"
|
||||||
|
|
||||||
|
# Remove array symbols so they can be identified
|
||||||
|
if allowArrays and re.search(r'\[([^\]]+)\]', ptype):
|
||||||
|
ptype = re.sub(r'\[[^\]]*\]', '', ptype).strip()
|
||||||
|
|
||||||
if "[" in ptype or "{" in ptype:
|
if "[" in ptype or "{" in ptype:
|
||||||
return "LVT_???"
|
return "LVT_???"
|
||||||
|
|
||||||
|
|
@ -61,6 +89,14 @@ def translate_type_to_lvt(ptype):
|
||||||
return "LVT_" + ptype.upper() + "_P"
|
return "LVT_" + ptype.upper() + "_P"
|
||||||
return "LVT_" + ptype.upper()
|
return "LVT_" + ptype.upper()
|
||||||
|
|
||||||
|
type = extract_integer_datatype(ptype)
|
||||||
|
if type:
|
||||||
|
if pointerLvl > 1:
|
||||||
|
return "LVT_???"
|
||||||
|
if pointerLvl == 1:
|
||||||
|
return "LVT_" + ptype.upper() + "_P"
|
||||||
|
return "LVT_" + ptype.upper()
|
||||||
|
|
||||||
if ptype in vec_types:
|
if ptype in vec_types:
|
||||||
if pointerLvl > 1:
|
if pointerLvl > 1:
|
||||||
return "LVT_???"
|
return "LVT_???"
|
||||||
|
|
@ -92,9 +128,9 @@ def translate_type_to_lvt(ptype):
|
||||||
|
|
||||||
return "LVT_???"
|
return "LVT_???"
|
||||||
|
|
||||||
def translate_type_to_lot(ptype):
|
def translate_type_to_lot(ptype, allowArrays=True):
|
||||||
pointerLvl = 0
|
pointerLvl = 0
|
||||||
lvt = translate_type_to_lvt(ptype)
|
lvt = translate_type_to_lvt(ptype, allowArrays=allowArrays)
|
||||||
|
|
||||||
if ptype == 'void':
|
if ptype == 'void':
|
||||||
return 'LOT_NONE'
|
return 'LOT_NONE'
|
||||||
|
|
@ -105,6 +141,10 @@ def translate_type_to_lot(ptype):
|
||||||
if ptype == 'char*' or ('char' in ptype and '[' in ptype):
|
if ptype == 'char*' or ('char' in ptype and '[' in ptype):
|
||||||
return 'LOT_NONE'
|
return 'LOT_NONE'
|
||||||
|
|
||||||
|
# Remove array symbols so they can be identified
|
||||||
|
if allowArrays and re.search(r'\[([^\]]+)\]', ptype):
|
||||||
|
ptype = re.sub(r'\[[^\]]*\]', '', ptype).strip()
|
||||||
|
|
||||||
if 'const ' in ptype:
|
if 'const ' in ptype:
|
||||||
ptype = ptype.replace('const ', '')
|
ptype = ptype.replace('const ', '')
|
||||||
|
|
||||||
|
|
@ -156,10 +196,6 @@ def translate_type_to_lot(ptype):
|
||||||
return 'LOT_???'
|
return 'LOT_???'
|
||||||
|
|
||||||
def translate_type_to_lua(ptype):
|
def translate_type_to_lua(ptype):
|
||||||
if ptype.startswith('struct '):
|
|
||||||
ptype = ptype.split(' ')[1].replace('*', '')
|
|
||||||
return ptype, 'structs.md#%s' % ptype
|
|
||||||
|
|
||||||
if ptype == 'const char*':
|
if ptype == 'const char*':
|
||||||
return '`string`', None
|
return '`string`', None
|
||||||
|
|
||||||
|
|
@ -168,6 +204,16 @@ def translate_type_to_lua(ptype):
|
||||||
|
|
||||||
ptype = ptype.replace('const ', '')
|
ptype = ptype.replace('const ', '')
|
||||||
|
|
||||||
|
# Detect arrays
|
||||||
|
if re.search(r'\[([^\]]+)\]', ptype):
|
||||||
|
ptype = re.sub(r'\[[^\]]*\]', '', ptype).strip()
|
||||||
|
s = '`Array` <%s>' % translate_type_to_lua(ptype)[0]
|
||||||
|
return s, None
|
||||||
|
|
||||||
|
if ptype.startswith('struct '):
|
||||||
|
ptype = ptype.split(' ')[1].replace('*', '')
|
||||||
|
return ptype, 'structs.md#%s' % ptype
|
||||||
|
|
||||||
if 'Vec3' in ptype:
|
if 'Vec3' in ptype:
|
||||||
return ptype, 'structs.md#%s' % ptype
|
return ptype, 'structs.md#%s' % ptype
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -73,6 +73,9 @@ pretend_find = [
|
||||||
seen_constants = []
|
seen_constants = []
|
||||||
totalConstants = 0
|
totalConstants = 0
|
||||||
verbose = len(sys.argv) > 1 and (sys.argv[1] == "-v" or sys.argv[1] == "--verbose")
|
verbose = len(sys.argv) > 1 and (sys.argv[1] == "-v" or sys.argv[1] == "--verbose")
|
||||||
|
overrideConstant = {
|
||||||
|
'VERSION_REGION': '"US"',
|
||||||
|
}
|
||||||
|
|
||||||
############################################################################
|
############################################################################
|
||||||
|
|
||||||
|
|
@ -114,6 +117,9 @@ def allowed_identifier(filename, ident):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
if ident in overrideConstant:
|
||||||
|
return False
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def process_enum(filename, line):
|
def process_enum(filename, line):
|
||||||
|
|
@ -218,6 +224,8 @@ def process_files():
|
||||||
files = sorted(in_files, key=lambda d: d.split('/')[-1])
|
files = sorted(in_files, key=lambda d: d.split('/')[-1])
|
||||||
for f in files:
|
for f in files:
|
||||||
processed_files.append(process_file(f))
|
processed_files.append(process_file(f))
|
||||||
|
for key, item in overrideConstant.items():
|
||||||
|
processed_files[0]['constants'].append([key, item])
|
||||||
return processed_files
|
return processed_files
|
||||||
|
|
||||||
############################################################################
|
############################################################################
|
||||||
|
|
|
||||||
|
|
@ -144,13 +144,13 @@ override_allowed_structs = {
|
||||||
sLuaManuallyDefinedStructs = [{
|
sLuaManuallyDefinedStructs = [{
|
||||||
'path': 'n/a',
|
'path': 'n/a',
|
||||||
'structs': [
|
'structs': [
|
||||||
'struct %s { %s }' % (
|
*['struct %s { %s }' % (
|
||||||
type_name,
|
type_name,
|
||||||
' '.join([
|
' '.join([
|
||||||
'%s %s;' % (vec_type['field_c_type'], lua_field)
|
'%s %s;' % (vec_type['field_c_type'], lua_field)
|
||||||
for lua_field in vec_type['fields_mapping'].keys()
|
for lua_field in vec_type['fields_mapping'].keys()
|
||||||
])
|
])
|
||||||
) for type_name, vec_type in VEC_TYPES.items()
|
) for type_name, vec_type in VEC_TYPES.items()]
|
||||||
]
|
]
|
||||||
}]
|
}]
|
||||||
|
|
||||||
|
|
@ -342,7 +342,7 @@ def output_fuzz_struct(struct):
|
||||||
|
|
||||||
s_out += ' local funcs = {\n'
|
s_out += ' local funcs = {\n'
|
||||||
for field in struct['fields']:
|
for field in struct['fields']:
|
||||||
fid, ftype, fimmutable, lvt, lot = get_struct_field_info(struct, field)
|
fid, ftype, fimmutable, lvt, lot, size = get_struct_field_info(struct, field)
|
||||||
if fimmutable == 'true':
|
if fimmutable == 'true':
|
||||||
continue
|
continue
|
||||||
if sid in override_field_invisible:
|
if sid in override_field_invisible:
|
||||||
|
|
@ -409,7 +409,7 @@ def build_vec_types():
|
||||||
]
|
]
|
||||||
sorted_fields_with_order = sorted(combined_fields, key=lambda x: x[1]) # sort alphabetically
|
sorted_fields_with_order = sorted(combined_fields, key=lambda x: x[1]) # sort alphabetically
|
||||||
for original_index, lua_field in sorted_fields_with_order:
|
for original_index, lua_field in sorted_fields_with_order:
|
||||||
s += ' { "%s", LVT_%s, sizeof(%s) * %d, false, LOT_NONE },\n' % (lua_field, field_c_type.upper(), field_c_type, original_index)
|
s += ' { "%s", LVT_%s, sizeof(%s) * %d, false, LOT_NONE, 1, sizeof(%s) },\n' % (lua_field, field_c_type.upper(), field_c_type, original_index, field_c_type)
|
||||||
|
|
||||||
s += '};\n\n'
|
s += '};\n\n'
|
||||||
|
|
||||||
|
|
@ -433,6 +433,7 @@ def get_struct_field_info(struct, field):
|
||||||
sid = struct['identifier']
|
sid = struct['identifier']
|
||||||
fid = field['identifier']
|
fid = field['identifier']
|
||||||
ftype = field['type']
|
ftype = field['type']
|
||||||
|
size = 1
|
||||||
|
|
||||||
if sid in override_field_names and fid in override_field_names[sid]:
|
if sid in override_field_names and fid in override_field_names[sid]:
|
||||||
fid = override_field_names[sid][fid]
|
fid = override_field_names[sid][fid]
|
||||||
|
|
@ -440,8 +441,8 @@ def get_struct_field_info(struct, field):
|
||||||
if sid in override_field_types and fid in override_field_types[sid]:
|
if sid in override_field_types and fid in override_field_types[sid]:
|
||||||
ftype = override_field_types[sid][fid]
|
ftype = override_field_types[sid][fid]
|
||||||
|
|
||||||
lvt = translate_type_to_lvt(ftype)
|
lvt = translate_type_to_lvt(ftype, allowArrays=True)
|
||||||
lot = translate_type_to_lot(ftype)
|
lot = translate_type_to_lot(ftype, allowArrays=True)
|
||||||
fimmutable = str(lvt == 'LVT_COBJECT' or 'const ' in ftype).lower()
|
fimmutable = str(lvt == 'LVT_COBJECT' or 'const ' in ftype).lower()
|
||||||
if lvt.startswith('LVT_') and lvt.endswith('_P') and 'OBJECT' not in lvt and 'COLLISION' not in lvt and 'TRAJECTORY' not in lvt:
|
if lvt.startswith('LVT_') and lvt.endswith('_P') and 'OBJECT' not in lvt and 'COLLISION' not in lvt and 'TRAJECTORY' not in lvt:
|
||||||
fimmutable = 'true'
|
fimmutable = 'true'
|
||||||
|
|
@ -454,7 +455,18 @@ def get_struct_field_info(struct, field):
|
||||||
if fid in override_field_mutable[sid] or '*' in override_field_mutable[sid]:
|
if fid in override_field_mutable[sid] or '*' in override_field_mutable[sid]:
|
||||||
fimmutable = 'false'
|
fimmutable = 'false'
|
||||||
|
|
||||||
return fid, ftype, fimmutable, lvt, lot
|
if not ('char' in ftype and '[' in ftype):
|
||||||
|
array_match = re.search(r'\[([^\]]+)\]', ftype)
|
||||||
|
if array_match:
|
||||||
|
array_size = array_match.group(1).strip()
|
||||||
|
if array_size.isdigit():
|
||||||
|
size = int(array_size)
|
||||||
|
elif array_size.startswith("0x") and all(c in "0123456789abcdef" for c in array_size[2:]):
|
||||||
|
size = int(array_size, 16)
|
||||||
|
else:
|
||||||
|
lvt, lot = 'LVT_???', "LOT_???" # array size not provided, so not supported
|
||||||
|
|
||||||
|
return fid, ftype, fimmutable, lvt, lot, size
|
||||||
|
|
||||||
def build_struct(struct):
|
def build_struct(struct):
|
||||||
# debug print out lua fuzz functions
|
# debug print out lua fuzz functions
|
||||||
|
|
@ -466,7 +478,10 @@ def build_struct(struct):
|
||||||
# build up table and track column width
|
# build up table and track column width
|
||||||
field_table = []
|
field_table = []
|
||||||
for field in struct['fields']:
|
for field in struct['fields']:
|
||||||
fid, ftype, fimmutable, lvt, lot = get_struct_field_info(struct, field)
|
fid, ftype, fimmutable, lvt, lot, size = get_struct_field_info(struct, field)
|
||||||
|
|
||||||
|
if re.search(r'\[([^\]]+)\]', ftype):
|
||||||
|
ftype = re.sub(r'\[[^\]]*\]', '', ftype).strip()
|
||||||
|
|
||||||
if sid in override_field_invisible:
|
if sid in override_field_invisible:
|
||||||
if fid in override_field_invisible[sid]:
|
if fid in override_field_invisible[sid]:
|
||||||
|
|
@ -487,7 +502,9 @@ def build_struct(struct):
|
||||||
row.append('%s, ' % lvt )
|
row.append('%s, ' % lvt )
|
||||||
row.append('offsetof(struct %s, %s), ' % (sid, field['identifier']) )
|
row.append('offsetof(struct %s, %s), ' % (sid, field['identifier']) )
|
||||||
row.append('%s, ' % fimmutable )
|
row.append('%s, ' % fimmutable )
|
||||||
row.append("%s" % lot )
|
row.append('%s, ' % lot )
|
||||||
|
row.append('%s, ' % size )
|
||||||
|
row.append('sizeof(%s)' % ftype )
|
||||||
row.append(endStr )
|
row.append(endStr )
|
||||||
field_table.append(row)
|
field_table.append(row)
|
||||||
|
|
||||||
|
|
@ -586,7 +603,7 @@ def doc_struct_index(structs):
|
||||||
return s
|
return s
|
||||||
|
|
||||||
def doc_struct_field(struct, field):
|
def doc_struct_field(struct, field):
|
||||||
fid, ftype, fimmutable, lvt, lot = get_struct_field_info(struct, field)
|
fid, ftype, fimmutable, lvt, lot, size = get_struct_field_info(struct, field)
|
||||||
|
|
||||||
sid = struct['identifier']
|
sid = struct['identifier']
|
||||||
if sid in override_field_invisible:
|
if sid in override_field_invisible:
|
||||||
|
|
@ -679,7 +696,7 @@ def def_struct(struct):
|
||||||
s = '\n--- @class %s\n' % stype
|
s = '\n--- @class %s\n' % stype
|
||||||
|
|
||||||
for field in struct['fields']:
|
for field in struct['fields']:
|
||||||
fid, ftype, fimmutable, lvt, lot = get_struct_field_info(struct, field)
|
fid, ftype, fimmutable, lvt, lot, size = get_struct_field_info(struct, field)
|
||||||
|
|
||||||
if sid in override_field_invisible:
|
if sid in override_field_invisible:
|
||||||
if fid in override_field_invisible[sid]:
|
if fid in override_field_invisible[sid]:
|
||||||
|
|
|
||||||
|
|
@ -324,6 +324,9 @@ INSTANT_WARP_INDEX_STOP = 0x04
|
||||||
--- @type integer
|
--- @type integer
|
||||||
MAX_AREAS = 16
|
MAX_AREAS = 16
|
||||||
|
|
||||||
|
--- @type string
|
||||||
|
VERSION_REGION = "US"
|
||||||
|
|
||||||
--- @type integer
|
--- @type integer
|
||||||
WARP_TRANSITION_FADE_FROM_BOWSER = 0x12
|
WARP_TRANSITION_FADE_FROM_BOWSER = 0x12
|
||||||
|
|
||||||
|
|
@ -12525,17 +12528,5 @@ SM64COOPDX_VERSION = "v1.2.0"
|
||||||
--- @type integer
|
--- @type integer
|
||||||
VERSION_NUMBER = 38
|
VERSION_NUMBER = 38
|
||||||
|
|
||||||
--- @type string
|
|
||||||
VERSION_REGION = "JP"
|
|
||||||
|
|
||||||
--- @type string
|
|
||||||
VERSION_REGION = "EU"
|
|
||||||
|
|
||||||
--- @type string
|
|
||||||
VERSION_REGION = "SH"
|
|
||||||
|
|
||||||
--- @type string
|
|
||||||
VERSION_REGION = "US"
|
|
||||||
|
|
||||||
--- @type string
|
--- @type string
|
||||||
VERSION_TEXT = "v"
|
VERSION_TEXT = "v"
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@
|
||||||
|
|
||||||
--- @class Area
|
--- @class Area
|
||||||
--- @field public camera Camera
|
--- @field public camera Camera
|
||||||
|
--- @field public dialog Array_integer
|
||||||
--- @field public flags integer
|
--- @field public flags integer
|
||||||
--- @field public index integer
|
--- @field public index integer
|
||||||
--- @field public instantWarps InstantWarp
|
--- @field public instantWarps InstantWarp
|
||||||
|
|
@ -48,6 +49,7 @@
|
||||||
--- @field public terrainData Pointer_integer
|
--- @field public terrainData Pointer_integer
|
||||||
--- @field public terrainType integer
|
--- @field public terrainType integer
|
||||||
--- @field public warpNodes ObjectWarpNode
|
--- @field public warpNodes ObjectWarpNode
|
||||||
|
--- @field public whirlpools Array_Whirlpool
|
||||||
|
|
||||||
--- @class BehaviorDialogs
|
--- @class BehaviorDialogs
|
||||||
--- @field public BobombBuddyBob1Dialog DialogId
|
--- @field public BobombBuddyBob1Dialog DialogId
|
||||||
|
|
@ -216,6 +218,8 @@
|
||||||
--- @field public cutscene integer
|
--- @field public cutscene integer
|
||||||
--- @field public defMode integer
|
--- @field public defMode integer
|
||||||
--- @field public doorStatus integer
|
--- @field public doorStatus integer
|
||||||
|
--- @field public filler31 Array_integer
|
||||||
|
--- @field public filler3C Array_integer
|
||||||
--- @field public focus Vec3f
|
--- @field public focus Vec3f
|
||||||
--- @field public mode integer
|
--- @field public mode integer
|
||||||
--- @field public mtx Mat4
|
--- @field public mtx Mat4
|
||||||
|
|
@ -641,6 +645,7 @@
|
||||||
--- @field public normalY number
|
--- @field public normalY number
|
||||||
--- @field public normalZ number
|
--- @field public normalZ number
|
||||||
--- @field public originOffset number
|
--- @field public originOffset number
|
||||||
|
--- @field public unused Array_number
|
||||||
|
|
||||||
--- @class FnGraphNode
|
--- @class FnGraphNode
|
||||||
--- @field public node GraphNode
|
--- @field public node GraphNode
|
||||||
|
|
@ -863,6 +868,7 @@
|
||||||
--- @class GraphNodeCullingRadius
|
--- @class GraphNodeCullingRadius
|
||||||
--- @field public cullingRadius integer
|
--- @field public cullingRadius integer
|
||||||
--- @field public node GraphNode
|
--- @field public node GraphNode
|
||||||
|
--- @field public pad1E Array_integer
|
||||||
|
|
||||||
--- @class GraphNodeDisplayList
|
--- @class GraphNodeDisplayList
|
||||||
--- @field public node GraphNode
|
--- @field public node GraphNode
|
||||||
|
|
@ -961,6 +967,7 @@
|
||||||
|
|
||||||
--- @class GraphNodeTranslation
|
--- @class GraphNodeTranslation
|
||||||
--- @field public node GraphNode
|
--- @field public node GraphNode
|
||||||
|
--- @field public pad1E Array_integer
|
||||||
--- @field public translation Vec3s
|
--- @field public translation Vec3s
|
||||||
|
|
||||||
--- @class GraphNodeTranslationRotation
|
--- @class GraphNodeTranslationRotation
|
||||||
|
|
@ -998,6 +1005,9 @@
|
||||||
--- @field public curFocus Vec3f
|
--- @field public curFocus Vec3f
|
||||||
--- @field public curPos Vec3f
|
--- @field public curPos Vec3f
|
||||||
--- @field public defMode integer
|
--- @field public defMode integer
|
||||||
|
--- @field public filler30 Array_integer
|
||||||
|
--- @field public filler3E Array_integer
|
||||||
|
--- @field public filler72 Array_integer
|
||||||
--- @field public focHSpeed number
|
--- @field public focHSpeed number
|
||||||
--- @field public focVSpeed number
|
--- @field public focVSpeed number
|
||||||
--- @field public focus Vec3f
|
--- @field public focus Vec3f
|
||||||
|
|
@ -1093,6 +1103,7 @@
|
||||||
|
|
||||||
--- @class MarioAnimation
|
--- @class MarioAnimation
|
||||||
--- @field public currentAnimAddr Pointer_integer
|
--- @field public currentAnimAddr Pointer_integer
|
||||||
|
--- @field public padding Array_integer
|
||||||
--- @field public targetAnim Animation
|
--- @field public targetAnim Animation
|
||||||
|
|
||||||
--- @class MarioBodyState
|
--- @class MarioBodyState
|
||||||
|
|
@ -1101,6 +1112,7 @@
|
||||||
--- @field public capState integer
|
--- @field public capState integer
|
||||||
--- @field public eyeState integer
|
--- @field public eyeState integer
|
||||||
--- @field public grabPos integer
|
--- @field public grabPos integer
|
||||||
|
--- @field public handFootPos Array_Vec3f
|
||||||
--- @field public handState integer
|
--- @field public handState integer
|
||||||
--- @field public headAngle Vec3s
|
--- @field public headAngle Vec3s
|
||||||
--- @field public headPos Vec3f
|
--- @field public headPos Vec3f
|
||||||
|
|
@ -1236,6 +1248,7 @@
|
||||||
|
|
||||||
--- @class ModFile
|
--- @class ModFile
|
||||||
--- @field public cachedPath string
|
--- @field public cachedPath string
|
||||||
|
--- @field public dataHash Array_integer
|
||||||
--- @field public relativePath string
|
--- @field public relativePath string
|
||||||
--- @field public wroteBytes integer
|
--- @field public wroteBytes integer
|
||||||
|
|
||||||
|
|
@ -1295,6 +1308,7 @@
|
||||||
--- @field public bhvDelayTimer integer
|
--- @field public bhvDelayTimer integer
|
||||||
--- @field public bhvStackIndex integer
|
--- @field public bhvStackIndex integer
|
||||||
--- @field public collidedObjInteractTypes integer
|
--- @field public collidedObjInteractTypes integer
|
||||||
|
--- @field public collidedObjs Array_Object
|
||||||
--- @field public collisionData Pointer_Collision
|
--- @field public collisionData Pointer_Collision
|
||||||
--- @field public coopFlags integer
|
--- @field public coopFlags integer
|
||||||
--- @field public ctx integer
|
--- @field public ctx integer
|
||||||
|
|
@ -2109,6 +2123,8 @@
|
||||||
--- @field public yaw number
|
--- @field public yaw number
|
||||||
|
|
||||||
--- @class PaintingMeshVertex
|
--- @class PaintingMeshVertex
|
||||||
|
--- @field public norm Array_integer
|
||||||
|
--- @field public pos Array_integer
|
||||||
|
|
||||||
--- @class PaintingValues
|
--- @class PaintingValues
|
||||||
--- @field public bob_painting Painting
|
--- @field public bob_painting Painting
|
||||||
|
|
@ -2292,6 +2308,7 @@
|
||||||
--- @field public offsetY number
|
--- @field public offsetY number
|
||||||
--- @field public radius number
|
--- @field public radius number
|
||||||
--- @field public unused integer
|
--- @field public unused integer
|
||||||
|
--- @field public walls Array_Surface
|
||||||
--- @field public x number
|
--- @field public x number
|
||||||
--- @field public y number
|
--- @field public y number
|
||||||
--- @field public z number
|
--- @field public z number
|
||||||
|
|
|
||||||
|
|
@ -87,6 +87,7 @@
|
||||||
- INSTANT_WARP_INDEX_START
|
- INSTANT_WARP_INDEX_START
|
||||||
- INSTANT_WARP_INDEX_STOP
|
- INSTANT_WARP_INDEX_STOP
|
||||||
- MAX_AREAS
|
- MAX_AREAS
|
||||||
|
- VERSION_REGION
|
||||||
- WARP_TRANSITION_FADE_FROM_BOWSER
|
- WARP_TRANSITION_FADE_FROM_BOWSER
|
||||||
- WARP_TRANSITION_FADE_FROM_CIRCLE
|
- WARP_TRANSITION_FADE_FROM_CIRCLE
|
||||||
- WARP_TRANSITION_FADE_FROM_COLOR
|
- WARP_TRANSITION_FADE_FROM_COLOR
|
||||||
|
|
@ -4518,10 +4519,6 @@
|
||||||
- MINOR_VERSION_NUMBER
|
- MINOR_VERSION_NUMBER
|
||||||
- SM64COOPDX_VERSION
|
- SM64COOPDX_VERSION
|
||||||
- VERSION_NUMBER
|
- VERSION_NUMBER
|
||||||
- VERSION_REGION
|
|
||||||
- VERSION_REGION
|
|
||||||
- VERSION_REGION
|
|
||||||
- VERSION_REGION
|
|
||||||
- VERSION_TEXT
|
- VERSION_TEXT
|
||||||
|
|
||||||
[:arrow_up_small:](#)
|
[:arrow_up_small:](#)
|
||||||
|
|
|
||||||
|
|
@ -175,6 +175,7 @@
|
||||||
| Field | Type | Access |
|
| Field | Type | Access |
|
||||||
| ----- | ---- | ------ |
|
| ----- | ---- | ------ |
|
||||||
| camera | [Camera](structs.md#Camera) | |
|
| camera | [Camera](structs.md#Camera) | |
|
||||||
|
| dialog | `Array` <`integer`> | |
|
||||||
| flags | `integer` | |
|
| flags | `integer` | |
|
||||||
| index | `integer` | |
|
| index | `integer` | |
|
||||||
| instantWarps | [InstantWarp](structs.md#InstantWarp) | |
|
| instantWarps | [InstantWarp](structs.md#InstantWarp) | |
|
||||||
|
|
@ -192,6 +193,7 @@
|
||||||
| terrainData | `Pointer` <`integer`> | read-only |
|
| terrainData | `Pointer` <`integer`> | read-only |
|
||||||
| terrainType | `integer` | |
|
| terrainType | `integer` | |
|
||||||
| warpNodes | [ObjectWarpNode](structs.md#ObjectWarpNode) | read-only |
|
| warpNodes | [ObjectWarpNode](structs.md#ObjectWarpNode) | read-only |
|
||||||
|
| whirlpools | `Array` <Whirlpool> | |
|
||||||
|
|
||||||
[:arrow_up_small:](#)
|
[:arrow_up_small:](#)
|
||||||
|
|
||||||
|
|
@ -395,6 +397,8 @@
|
||||||
| cutscene | `integer` | |
|
| cutscene | `integer` | |
|
||||||
| defMode | `integer` | |
|
| defMode | `integer` | |
|
||||||
| doorStatus | `integer` | |
|
| doorStatus | `integer` | |
|
||||||
|
| filler31 | `Array` <`integer`> | |
|
||||||
|
| filler3C | `Array` <`integer`> | |
|
||||||
| focus | [Vec3f](structs.md#Vec3f) | read-only |
|
| focus | [Vec3f](structs.md#Vec3f) | read-only |
|
||||||
| mode | `integer` | |
|
| mode | `integer` | |
|
||||||
| mtx | `Mat4` | read-only |
|
| mtx | `Mat4` | read-only |
|
||||||
|
|
@ -979,6 +983,7 @@
|
||||||
| normalY | `number` | |
|
| normalY | `number` | |
|
||||||
| normalZ | `number` | |
|
| normalZ | `number` | |
|
||||||
| originOffset | `number` | |
|
| originOffset | `number` | |
|
||||||
|
| unused | `Array` <`number`> | |
|
||||||
|
|
||||||
[:arrow_up_small:](#)
|
[:arrow_up_small:](#)
|
||||||
|
|
||||||
|
|
@ -1271,6 +1276,7 @@
|
||||||
| ----- | ---- | ------ |
|
| ----- | ---- | ------ |
|
||||||
| cullingRadius | `integer` | |
|
| cullingRadius | `integer` | |
|
||||||
| node | [GraphNode](structs.md#GraphNode) | read-only |
|
| node | [GraphNode](structs.md#GraphNode) | read-only |
|
||||||
|
| pad1E | `Array` <`integer`> | |
|
||||||
|
|
||||||
[:arrow_up_small:](#)
|
[:arrow_up_small:](#)
|
||||||
|
|
||||||
|
|
@ -1474,6 +1480,7 @@
|
||||||
| Field | Type | Access |
|
| Field | Type | Access |
|
||||||
| ----- | ---- | ------ |
|
| ----- | ---- | ------ |
|
||||||
| node | [GraphNode](structs.md#GraphNode) | read-only |
|
| node | [GraphNode](structs.md#GraphNode) | read-only |
|
||||||
|
| pad1E | `Array` <`integer`> | |
|
||||||
| translation | [Vec3s](structs.md#Vec3s) | read-only |
|
| translation | [Vec3s](structs.md#Vec3s) | read-only |
|
||||||
|
|
||||||
[:arrow_up_small:](#)
|
[:arrow_up_small:](#)
|
||||||
|
|
@ -1553,6 +1560,9 @@
|
||||||
| curFocus | [Vec3f](structs.md#Vec3f) | read-only |
|
| curFocus | [Vec3f](structs.md#Vec3f) | read-only |
|
||||||
| curPos | [Vec3f](structs.md#Vec3f) | read-only |
|
| curPos | [Vec3f](structs.md#Vec3f) | read-only |
|
||||||
| defMode | `integer` | |
|
| defMode | `integer` | |
|
||||||
|
| filler30 | `Array` <`integer`> | |
|
||||||
|
| filler3E | `Array` <`integer`> | |
|
||||||
|
| filler72 | `Array` <`integer`> | |
|
||||||
| focHSpeed | `number` | |
|
| focHSpeed | `number` | |
|
||||||
| focVSpeed | `number` | |
|
| focVSpeed | `number` | |
|
||||||
| focus | [Vec3f](structs.md#Vec3f) | read-only |
|
| focus | [Vec3f](structs.md#Vec3f) | read-only |
|
||||||
|
|
@ -1669,6 +1679,7 @@
|
||||||
| Field | Type | Access |
|
| Field | Type | Access |
|
||||||
| ----- | ---- | ------ |
|
| ----- | ---- | ------ |
|
||||||
| currentAnimAddr | `Pointer` <`integer`> | read-only |
|
| currentAnimAddr | `Pointer` <`integer`> | read-only |
|
||||||
|
| padding | `Array` <`integer`> | |
|
||||||
| targetAnim | [Animation](structs.md#Animation) | |
|
| targetAnim | [Animation](structs.md#Animation) | |
|
||||||
|
|
||||||
[:arrow_up_small:](#)
|
[:arrow_up_small:](#)
|
||||||
|
|
@ -1684,6 +1695,7 @@
|
||||||
| capState | `integer` | |
|
| capState | `integer` | |
|
||||||
| eyeState | `integer` | |
|
| eyeState | `integer` | |
|
||||||
| grabPos | `integer` | |
|
| grabPos | `integer` | |
|
||||||
|
| handFootPos | `Array` <Vec3f> | read-only |
|
||||||
| handState | `integer` | |
|
| handState | `integer` | |
|
||||||
| headAngle | [Vec3s](structs.md#Vec3s) | read-only |
|
| headAngle | [Vec3s](structs.md#Vec3s) | read-only |
|
||||||
| headPos | [Vec3f](structs.md#Vec3f) | read-only |
|
| headPos | [Vec3f](structs.md#Vec3f) | read-only |
|
||||||
|
|
@ -1879,6 +1891,7 @@
|
||||||
| Field | Type | Access |
|
| Field | Type | Access |
|
||||||
| ----- | ---- | ------ |
|
| ----- | ---- | ------ |
|
||||||
| cachedPath | `string` | read-only |
|
| cachedPath | `string` | read-only |
|
||||||
|
| dataHash | `Array` <`integer`> | read-only |
|
||||||
| relativePath | `string` | read-only |
|
| relativePath | `string` | read-only |
|
||||||
| wroteBytes | `integer` | read-only |
|
| wroteBytes | `integer` | read-only |
|
||||||
|
|
||||||
|
|
@ -1963,6 +1976,7 @@
|
||||||
| bhvDelayTimer | `integer` | |
|
| bhvDelayTimer | `integer` | |
|
||||||
| bhvStackIndex | `integer` | read-only |
|
| bhvStackIndex | `integer` | read-only |
|
||||||
| collidedObjInteractTypes | `integer` | |
|
| collidedObjInteractTypes | `integer` | |
|
||||||
|
| collidedObjs | `Array` <Object> | |
|
||||||
| collisionData | `Pointer` <`Collision`> | |
|
| collisionData | `Pointer` <`Collision`> | |
|
||||||
| coopFlags | `integer` | read-only |
|
| coopFlags | `integer` | read-only |
|
||||||
| ctx | `integer` | |
|
| ctx | `integer` | |
|
||||||
|
|
@ -2827,6 +2841,8 @@
|
||||||
|
|
||||||
| Field | Type | Access |
|
| Field | Type | Access |
|
||||||
| ----- | ---- | ------ |
|
| ----- | ---- | ------ |
|
||||||
|
| norm | `Array` <`integer`> | |
|
||||||
|
| pos | `Array` <`integer`> | |
|
||||||
|
|
||||||
[:arrow_up_small:](#)
|
[:arrow_up_small:](#)
|
||||||
|
|
||||||
|
|
@ -3190,6 +3206,7 @@
|
||||||
| offsetY | `number` | |
|
| offsetY | `number` | |
|
||||||
| radius | `number` | |
|
| radius | `number` | |
|
||||||
| unused | `integer` | |
|
| unused | `integer` | |
|
||||||
|
| walls | `Array` <Surface> | |
|
||||||
| x | `number` | |
|
| x | `number` | |
|
||||||
| y | `number` | |
|
| y | `number` | |
|
||||||
| z | `number` | |
|
| z | `number` | |
|
||||||
|
|
|
||||||
|
|
@ -741,12 +741,6 @@ NEXT_OPTION:
|
||||||
if (configDjuiTheme >= DJUI_THEME_MAX) { configDjuiTheme = 0; }
|
if (configDjuiTheme >= DJUI_THEME_MAX) { configDjuiTheme = 0; }
|
||||||
if (configDjuiScale >= 5) { configDjuiScale = 0; }
|
if (configDjuiScale >= 5) { configDjuiScale = 0; }
|
||||||
|
|
||||||
if (configExCoopTheme) {
|
|
||||||
configDjuiTheme = DJUI_THEME_LIGHT;
|
|
||||||
configDjuiThemeCenter = false;
|
|
||||||
configDjuiThemeFont = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gCLIOpts.fullscreen == 1) {
|
if (gCLIOpts.fullscreen == 1) {
|
||||||
configWindow.fullscreen = true;
|
configWindow.fullscreen = true;
|
||||||
} else if (gCLIOpts.fullscreen == 2) {
|
} else if (gCLIOpts.fullscreen == 2) {
|
||||||
|
|
|
||||||
|
|
@ -98,23 +98,19 @@ void djui_panel_main_menu_create(struct DjuiBase* caller) {
|
||||||
djui_themes_init();
|
djui_themes_init();
|
||||||
|
|
||||||
{
|
{
|
||||||
struct DjuiCheckbox* center = djui_checkbox_create(body, DLANG(DJUI_THEMES, CENTER), &configDjuiThemeCenter, djui_panel_menu_options_djui_setting_change);
|
djui_checkbox_create(body, DLANG(DJUI_THEMES, CENTER), &configDjuiThemeCenter, djui_panel_menu_options_djui_setting_change);
|
||||||
if (configExCoopTheme) { djui_base_set_enabled(¢er->base, false); }
|
|
||||||
|
|
||||||
char* themeChoices[DJUI_THEME_MAX];
|
char* themeChoices[DJUI_THEME_MAX];
|
||||||
for (int i = 0; i < DJUI_THEME_MAX; i++) {
|
for (int i = 0; i < DJUI_THEME_MAX; i++) {
|
||||||
themeChoices[i] = (char*)gDjuiThemes[i]->name;
|
themeChoices[i] = (char*)gDjuiThemes[i]->name;
|
||||||
}
|
}
|
||||||
struct DjuiSelectionbox* theme = djui_selectionbox_create(body, DLANG(DJUI_THEMES, DJUI_THEME), themeChoices, DJUI_THEME_MAX, &configDjuiTheme, djui_panel_menu_options_djui_setting_change);
|
djui_selectionbox_create(body, DLANG(DJUI_THEMES, DJUI_THEME), themeChoices, DJUI_THEME_MAX, &configDjuiTheme, djui_panel_menu_options_djui_setting_change);
|
||||||
if (configExCoopTheme) { djui_base_set_enabled(&theme->base, false); }
|
|
||||||
|
|
||||||
char* djuiScaleChoices[5] = {DLANG(DJUI_THEMES, AUTO), "x0.5", "x0.85", "x1.0", "x1.5"};
|
char* djuiScaleChoices[5] = {DLANG(DJUI_THEMES, AUTO), "x0.5", "x0.85", "x1.0", "x1.5"};
|
||||||
struct DjuiSelectionbox* scale = djui_selectionbox_create(body, DLANG(DJUI_THEMES, DJUI_SCALE), djuiScaleChoices, 5, &configDjuiScale, djui_panel_menu_options_djui_setting_change);
|
djui_selectionbox_create(body, DLANG(DJUI_THEMES, DJUI_SCALE), djuiScaleChoices, 5, &configDjuiScale, djui_panel_menu_options_djui_setting_change);
|
||||||
if (configExCoopTheme) { djui_base_set_enabled(&scale->base, false); }
|
|
||||||
|
|
||||||
char* djuiFontChoices[2] = {DLANG(DJUI_THEMES, FONT_NORMAL), DLANG(DJUI_THEMES, FONT_ALIASED)};
|
char* djuiFontChoices[2] = {DLANG(DJUI_THEMES, FONT_NORMAL), DLANG(DJUI_THEMES, FONT_ALIASED)};
|
||||||
struct DjuiSelectionbox* font = djui_selectionbox_create(body, DLANG(DJUI_THEMES, DJUI_FONT), djuiFontChoices, 2, &configDjuiThemeFont, djui_panel_menu_options_djui_setting_change);
|
djui_selectionbox_create(body, DLANG(DJUI_THEMES, DJUI_FONT), djuiFontChoices, 2, &configDjuiThemeFont, djui_panel_menu_options_djui_setting_change);
|
||||||
if (configExCoopTheme) { djui_base_set_enabled(&font->base, false); }
|
|
||||||
|
|
||||||
if (gDjuiInMainMenu) {
|
if (gDjuiInMainMenu) {
|
||||||
// get level choices
|
// get level choices
|
||||||
|
|
|
||||||
|
|
@ -327,6 +327,97 @@ struct LuaObjectField* smlua_get_custom_field(lua_State* L, u32 lot, int keyInde
|
||||||
// CObject get/set //
|
// CObject get/set //
|
||||||
/////////////////////
|
/////////////////////
|
||||||
|
|
||||||
|
static bool smlua_push_field(lua_State* L, u8* p, struct LuaObjectField *data) {
|
||||||
|
switch (data->valueType) {
|
||||||
|
case LVT_BOOL: lua_pushboolean(L, *(u8* )p); break;
|
||||||
|
case LVT_U8: lua_pushinteger(L, *(u8* )p); break;
|
||||||
|
case LVT_U16: lua_pushinteger(L, *(u16*)p); break;
|
||||||
|
case LVT_U32: lua_pushinteger(L, *(u32*)p); break;
|
||||||
|
case LVT_S8: lua_pushinteger(L, *(s8* )p); break;
|
||||||
|
case LVT_S16: lua_pushinteger(L, *(s16*)p); break;
|
||||||
|
case LVT_S32: lua_pushinteger(L, *(s32*)p); break;
|
||||||
|
case LVT_F32: lua_pushnumber( L, *(f32*)p); break;
|
||||||
|
case LVT_U64: lua_pushinteger(L, *(u64*)p); break;
|
||||||
|
case LVT_COBJECT: smlua_push_object(L, data->lot, p); break;
|
||||||
|
case LVT_COBJECT_P: smlua_push_object(L, data->lot, *(u8**)p); break;
|
||||||
|
case LVT_STRING: lua_pushstring(L, (char*)p); break;
|
||||||
|
case LVT_STRING_P: lua_pushstring(L, *(char**)p); break;
|
||||||
|
case LVT_BEHAVIORSCRIPT: lua_pushinteger(L, *(s32*)p); break;
|
||||||
|
case LVT_OBJECTANIMPOINTER: lua_pushinteger(L, *(s32*)p); break;
|
||||||
|
case LVT_COLLISION: lua_pushinteger(L, *(s32*)p); break;
|
||||||
|
case LVT_LEVELSCRIPT: lua_pushinteger(L, *(s32*)p); break;
|
||||||
|
case LVT_TRAJECTORY: lua_pushinteger(L, *(s16*)p); break;
|
||||||
|
|
||||||
|
// pointers
|
||||||
|
case LVT_BOOL_P:
|
||||||
|
case LVT_U8_P:
|
||||||
|
case LVT_U16_P:
|
||||||
|
case LVT_U32_P:
|
||||||
|
case LVT_S8_P:
|
||||||
|
case LVT_S16_P:
|
||||||
|
case LVT_S32_P:
|
||||||
|
case LVT_F32_P:
|
||||||
|
case LVT_U64_P:
|
||||||
|
case LVT_BEHAVIORSCRIPT_P:
|
||||||
|
case LVT_OBJECTANIMPOINTER_P:
|
||||||
|
case LVT_COLLISION_P:
|
||||||
|
case LVT_LEVELSCRIPT_P:
|
||||||
|
case LVT_TRAJECTORY_P:
|
||||||
|
smlua_push_pointer(L, data->valueType, *(u8**)p);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool smlua_set_field(lua_State* L, u8* p, struct LuaObjectField *data) {
|
||||||
|
void* valuePointer = NULL;
|
||||||
|
switch (data->valueType) {
|
||||||
|
case LVT_BOOL:*(u8*) p = smlua_to_boolean(L, 3); break;
|
||||||
|
case LVT_U8: *(u8*) p = smlua_to_integer(L, 3); break;
|
||||||
|
case LVT_U16: *(u16*)p = smlua_to_integer(L, 3); break;
|
||||||
|
case LVT_U32: *(u32*)p = smlua_to_integer(L, 3); break;
|
||||||
|
case LVT_S8: *(s8*) p = smlua_to_integer(L, 3); break;
|
||||||
|
case LVT_S16: *(s16*)p = smlua_to_integer(L, 3); break;
|
||||||
|
case LVT_S32: *(s32*)p = smlua_to_integer(L, 3); break;
|
||||||
|
case LVT_F32: *(f32*)p = smlua_to_number(L, 3); break;
|
||||||
|
case LVT_U64: *(s64*)p = smlua_to_integer(L, 3); break;
|
||||||
|
|
||||||
|
case LVT_COBJECT_P:
|
||||||
|
valuePointer = smlua_to_cobject(L, 3, data->lot);
|
||||||
|
if (gSmLuaConvertSuccess) {
|
||||||
|
*(u8**)p = valuePointer;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
// pointers
|
||||||
|
case LVT_BOOL_P:
|
||||||
|
case LVT_U8_P:
|
||||||
|
case LVT_U16_P:
|
||||||
|
case LVT_U32_P:
|
||||||
|
case LVT_S8_P:
|
||||||
|
case LVT_S16_P:
|
||||||
|
case LVT_S32_P:
|
||||||
|
case LVT_F32_P:
|
||||||
|
case LVT_U64_P:
|
||||||
|
case LVT_BEHAVIORSCRIPT_P:
|
||||||
|
case LVT_OBJECTANIMPOINTER_P:
|
||||||
|
case LVT_COLLISION_P:
|
||||||
|
case LVT_TRAJECTORY_P:
|
||||||
|
valuePointer = smlua_to_cpointer(L, 3, data->valueType);
|
||||||
|
if (gSmLuaConvertSuccess) {
|
||||||
|
*(u8**)p = valuePointer;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static int smlua__get_field(lua_State* L) {
|
static int smlua__get_field(lua_State* L) {
|
||||||
LUA_STACK_CHECK_BEGIN_NUM(1);
|
LUA_STACK_CHECK_BEGIN_NUM(1);
|
||||||
|
|
||||||
|
|
@ -367,48 +458,22 @@ static int smlua__get_field(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
u8* p = ((u8*)(intptr_t)pointer) + data->valueOffset;
|
u8* p = ((u8*)(intptr_t)pointer) + data->valueOffset;
|
||||||
switch (data->valueType) {
|
if (data->count == 1) {
|
||||||
case LVT_BOOL: lua_pushboolean(L, *(u8* )p); break;
|
if (smlua_push_field(L, p, data)) {
|
||||||
case LVT_U8: lua_pushinteger(L, *(u8* )p); break;
|
|
||||||
case LVT_U16: lua_pushinteger(L, *(u16*)p); break;
|
|
||||||
case LVT_U32: lua_pushinteger(L, *(u32*)p); break;
|
|
||||||
case LVT_S8: lua_pushinteger(L, *(s8* )p); break;
|
|
||||||
case LVT_S16: lua_pushinteger(L, *(s16*)p); break;
|
|
||||||
case LVT_S32: lua_pushinteger(L, *(s32*)p); break;
|
|
||||||
case LVT_F32: lua_pushnumber( L, *(f32*)p); break;
|
|
||||||
case LVT_U64: lua_pushinteger(L, *(u64*)p); break;
|
|
||||||
case LVT_COBJECT: smlua_push_object(L, data->lot, p); break;
|
|
||||||
case LVT_COBJECT_P: smlua_push_object(L, data->lot, *(u8**)p); break;
|
|
||||||
case LVT_STRING: lua_pushstring(L, (char*)p); break;
|
|
||||||
case LVT_STRING_P: lua_pushstring(L, *(char**)p); break;
|
|
||||||
case LVT_BEHAVIORSCRIPT: lua_pushinteger(L, *(s32*)p); break;
|
|
||||||
case LVT_OBJECTANIMPOINTER: lua_pushinteger(L, *(s32*)p); break;
|
|
||||||
case LVT_COLLISION: lua_pushinteger(L, *(s32*)p); break;
|
|
||||||
case LVT_LEVELSCRIPT: lua_pushinteger(L, *(s32*)p); break;
|
|
||||||
case LVT_TRAJECTORY: lua_pushinteger(L, *(s16*)p); break;
|
|
||||||
|
|
||||||
// pointers
|
|
||||||
case LVT_BOOL_P:
|
|
||||||
case LVT_U8_P:
|
|
||||||
case LVT_U16_P:
|
|
||||||
case LVT_U32_P:
|
|
||||||
case LVT_S8_P:
|
|
||||||
case LVT_S16_P:
|
|
||||||
case LVT_S32_P:
|
|
||||||
case LVT_F32_P:
|
|
||||||
case LVT_U64_P:
|
|
||||||
case LVT_BEHAVIORSCRIPT_P:
|
|
||||||
case LVT_OBJECTANIMPOINTER_P:
|
|
||||||
case LVT_COLLISION_P:
|
|
||||||
case LVT_LEVELSCRIPT_P:
|
|
||||||
case LVT_TRAJECTORY_P:
|
|
||||||
smlua_push_pointer(L, data->valueType, *(u8**)p);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
LOG_LUA_LINE("_get_field on unimplemented type '%d', key '%s'", data->valueType, key);
|
LOG_LUA_LINE("_get_field on unimplemented type '%d', key '%s'", data->valueType, key);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
lua_newtable(L);
|
||||||
|
for (u16 i = 0; i < data->count; i++) {
|
||||||
|
lua_pushinteger(L, i + 1);
|
||||||
|
if (smlua_push_field(L, p + (i * data->size), data)) {
|
||||||
|
LOG_LUA_LINE("_get_field on unimplemented type '%d', key '%s'", data->valueType, key);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
lua_settable(L, -3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
LUA_STACK_CHECK_END();
|
LUA_STACK_CHECK_END();
|
||||||
return 1;
|
return 1;
|
||||||
|
|
@ -447,47 +512,9 @@ static int smlua__set_field(lua_State* L) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* valuePointer = NULL;
|
|
||||||
u8* p = ((u8*)(intptr_t)pointer) + data->valueOffset;
|
u8* p = ((u8*)(intptr_t)pointer) + data->valueOffset;
|
||||||
switch (data->valueType) {
|
if (data->count == 1) {
|
||||||
case LVT_BOOL:*(u8*) p = smlua_to_boolean(L, 3); break;
|
if (smlua_set_field(L, p, data)) {
|
||||||
case LVT_U8: *(u8*) p = smlua_to_integer(L, 3); break;
|
|
||||||
case LVT_U16: *(u16*)p = smlua_to_integer(L, 3); break;
|
|
||||||
case LVT_U32: *(u32*)p = smlua_to_integer(L, 3); break;
|
|
||||||
case LVT_S8: *(s8*) p = smlua_to_integer(L, 3); break;
|
|
||||||
case LVT_S16: *(s16*)p = smlua_to_integer(L, 3); break;
|
|
||||||
case LVT_S32: *(s32*)p = smlua_to_integer(L, 3); break;
|
|
||||||
case LVT_F32: *(f32*)p = smlua_to_number(L, 3); break;
|
|
||||||
case LVT_U64: *(s64*)p = smlua_to_integer(L, 3); break;
|
|
||||||
|
|
||||||
case LVT_COBJECT_P:
|
|
||||||
valuePointer = smlua_to_cobject(L, 3, data->lot);
|
|
||||||
if (gSmLuaConvertSuccess) {
|
|
||||||
*(u8**)p = valuePointer;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// pointers
|
|
||||||
case LVT_BOOL_P:
|
|
||||||
case LVT_U8_P:
|
|
||||||
case LVT_U16_P:
|
|
||||||
case LVT_U32_P:
|
|
||||||
case LVT_S8_P:
|
|
||||||
case LVT_S16_P:
|
|
||||||
case LVT_S32_P:
|
|
||||||
case LVT_F32_P:
|
|
||||||
case LVT_U64_P:
|
|
||||||
case LVT_BEHAVIORSCRIPT_P:
|
|
||||||
case LVT_OBJECTANIMPOINTER_P:
|
|
||||||
case LVT_COLLISION_P:
|
|
||||||
case LVT_TRAJECTORY_P:
|
|
||||||
valuePointer = smlua_to_cpointer(L, 3, data->valueType);
|
|
||||||
if (gSmLuaConvertSuccess) {
|
|
||||||
*(u8**)p = valuePointer;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
LOG_LUA_LINE("_set_field on unimplemented type '%d', key '%s'", data->valueType, key);
|
LOG_LUA_LINE("_set_field on unimplemented type '%d', key '%s'", data->valueType, key);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -495,6 +522,21 @@ static int smlua__set_field(lua_State* L) {
|
||||||
LOG_LUA_LINE("_set_field failed to retrieve value type '%d', key '%s'", data->valueType, key);
|
LOG_LUA_LINE("_set_field failed to retrieve value type '%d', key '%s'", data->valueType, key);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
lua_newtable(L);
|
||||||
|
for (u16 i = 0; i < data->count; i++) {
|
||||||
|
lua_pushinteger(L, i + 1);
|
||||||
|
if (smlua_set_field(L, p + (i * data->size), data)) {
|
||||||
|
LOG_LUA_LINE("_set_field on unimplemented type '%d', key '%s'", data->valueType, key);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!gSmLuaConvertSuccess) {
|
||||||
|
LOG_LUA_LINE("_set_field failed to retrieve value type '%d', key '%s'", data->valueType, key);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
lua_settable(L, -3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
LUA_STACK_CHECK_END();
|
LUA_STACK_CHECK_END();
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,8 @@ struct LuaObjectField {
|
||||||
size_t valueOffset;
|
size_t valueOffset;
|
||||||
bool immutable;
|
bool immutable;
|
||||||
u16 lot;
|
u16 lot;
|
||||||
|
u16 count;
|
||||||
|
u32 size;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct LuaObjectTable {
|
struct LuaObjectTable {
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -292,6 +292,7 @@ char gSmluaConstants[] = ""
|
||||||
"WARP_TRANSITION_FADE_INTO_MARIO = 0x11\n"
|
"WARP_TRANSITION_FADE_INTO_MARIO = 0x11\n"
|
||||||
"WARP_TRANSITION_FADE_FROM_BOWSER = 0x12\n"
|
"WARP_TRANSITION_FADE_FROM_BOWSER = 0x12\n"
|
||||||
"WARP_TRANSITION_FADE_INTO_BOWSER = 0x13\n"
|
"WARP_TRANSITION_FADE_INTO_BOWSER = 0x13\n"
|
||||||
|
"VERSION_REGION = 'US'\n"
|
||||||
"id_bhv1Up = 0\n"
|
"id_bhv1Up = 0\n"
|
||||||
"id_bhv1upJumpOnApproach = 1\n"
|
"id_bhv1upJumpOnApproach = 1\n"
|
||||||
"id_bhv1upRunningAway = 2\n"
|
"id_bhv1upRunningAway = 2\n"
|
||||||
|
|
@ -4323,9 +4324,5 @@ char gSmluaConstants[] = ""
|
||||||
"VERSION_TEXT = 'v'\n"
|
"VERSION_TEXT = 'v'\n"
|
||||||
"VERSION_NUMBER = 38\n"
|
"VERSION_NUMBER = 38\n"
|
||||||
"MINOR_VERSION_NUMBER = 1\n"
|
"MINOR_VERSION_NUMBER = 1\n"
|
||||||
"VERSION_REGION = 'JP'\n"
|
|
||||||
"VERSION_REGION = 'EU'\n"
|
|
||||||
"VERSION_REGION = 'SH'\n"
|
|
||||||
"VERSION_REGION = 'US'\n"
|
|
||||||
"MAX_VERSION_LENGTH = 32\n"
|
"MAX_VERSION_LENGTH = 32\n"
|
||||||
;
|
;
|
||||||
Loading…
Add table
Reference in a new issue