Moved access on some struct arrays to overload instead of property

This commit is contained in:
KiritoDv 2025-03-14 21:21:08 -06:00
parent 29523e168c
commit 056163ddfb
4 changed files with 852 additions and 676 deletions

File diff suppressed because it is too large Load diff

View file

@ -12,7 +12,7 @@
#define TEAMSTATUS_FALCO (0x000000FF)
#define TEAMSTATUS_ALIVE (0x00FFFFFF)
typedef struct {
typedef struct PlanetData {
/* bit 0 */ u8 unk_0 : 3; // unused
/* bit 3 */ u8 expertMedal : 1;
/* bit 4 */ u8 expertClear : 1;

View file

@ -306,12 +306,12 @@ lua.new_usertype<Player>("Player",
"unk_014", sol::property(&Player::unk_014, &Player::unk_014),
"unk_018", sol::property(&Player::unk_018, &Player::unk_018),
"unk_01C", sol::property(&Player::unk_01C, &Player::unk_01C),
"pad20", sol::property(&Player::pad20, &Player::pad20),
"pad20", sol::overload([] (Player& self, int index) -> int32_t { return self.pad20[index]; }, [] (Player& self, int index, int32_t value) { self.pad20[index] = value; }),
"unk_028", sol::property(&Player::unk_028, &Player::unk_028),
"unk_02C", sol::property(&Player::unk_02C, &Player::unk_02C),
"unk_030", sol::property(&Player::unk_030, &Player::unk_030),
"camRoll", sol::property(&Player::camRoll, &Player::camRoll),
"pad38", sol::property(&Player::pad38, &Player::pad38),
"pad38", sol::overload([] (Player& self, int index) -> int32_t { return self.pad38[index]; }, [] (Player& self, int index, int32_t value) { self.pad38[index] = value; }),
"cam", sol::property(&Player::cam, &Player::cam),
"camYaw", sol::property(&Player::camYaw, &Player::camYaw),
"camPitch", sol::property(&Player::camPitch, &Player::camPitch),
@ -351,12 +351,12 @@ lua.new_usertype<Player>("Player",
"yRotVel_11C", sol::property(&Player::yRotVel_11C, &Player::yRotVel_11C),
"xRot_120", sol::property(&Player::xRot_120, &Player::xRot_120),
"pathChangePitch", sol::property(&Player::pathChangePitch, &Player::pathChangePitch),
"pad128", sol::property(&Player::pad128, &Player::pad128),
"pad128", sol::overload([] (Player& self, int index) -> int32_t { return self.pad128[index]; }, [] (Player& self, int index, int32_t value) { self.pad128[index] = value; }),
"zRotBank", sol::property(&Player::zRotBank, &Player::zRotBank),
"zRotBarrelRoll", sol::property(&Player::zRotBarrelRoll, &Player::zRotBarrelRoll),
"damageShake", sol::property(&Player::damageShake, &Player::damageShake),
"trueZpos", sol::property(&Player::trueZpos, &Player::trueZpos),
"pad13C", sol::property(&Player::pad13C, &Player::pad13C),
"pad13C", sol::overload([] (Player& self, int index) -> int32_t { return self.pad13C[index]; }, [] (Player& self, int index, int32_t value) { self.pad13C[index] = value; }),
"zPathVel", sol::property(&Player::zPathVel, &Player::zPathVel),
"zPath", sol::property(&Player::zPath, &Player::zPath),
"unk_148", sol::property(&Player::unk_148, &Player::unk_148),
@ -365,7 +365,7 @@ lua.new_usertype<Player>("Player",
"unk_154", sol::property(&Player::unk_154, &Player::unk_154),
"unk_158", sol::property(&Player::unk_158, &Player::unk_158),
"unk_15C", sol::property(&Player::unk_15C, &Player::unk_15C),
"pad160", sol::property(&Player::pad160, &Player::pad160),
"pad160", sol::overload([] (Player& self, int index) -> int32_t { return self.pad160[index]; }, [] (Player& self, int index, int32_t value) { self.pad160[index] = value; }),
"unk_164", sol::property(&Player::unk_164, &Player::unk_164),
"unk_168", sol::property(&Player::unk_168, &Player::unk_168),
"unk_16C", sol::property(&Player::unk_16C, &Player::unk_16C),
@ -383,10 +383,10 @@ lua.new_usertype<Player>("Player",
"unk_19C", sol::property(&Player::unk_19C, &Player::unk_19C),
"unk_1A0", sol::property(&Player::unk_1A0, &Player::unk_1A0),
"dmgType", sol::property(&Player::dmgType, &Player::dmgType),
"pad1A8", sol::property(&Player::pad1A8, &Player::pad1A8),
"pad1A8", sol::overload([] (Player& self, int index) -> int32_t { return self.pad1A8[index]; }, [] (Player& self, int index, int32_t value) { self.pad1A8[index] = value; }),
"turretState", sol::property(&Player::turretState, &Player::turretState),
"turretActor", sol::property(&Player::turretActor, &Player::turretActor),
"pad1B8", sol::property(&Player::pad1B8, &Player::pad1B8),
"pad1B8", sol::overload([] (Player& self, int index) -> int32_t { return self.pad1B8[index]; }, [] (Player& self, int index, int32_t value) { self.pad1B8[index] = value; }),
"turretRecoil", sol::property(&Player::turretRecoil, &Player::turretRecoil),
"turretLockOnCount", sol::property(&Player::turretLockOnCount, &Player::turretLockOnCount),
"num", sol::property(&Player::num, &Player::num),
@ -425,21 +425,21 @@ lua.new_usertype<Player>("Player",
"shadowRotX", sol::property(&Player::shadowRotX, &Player::shadowRotX),
"shadowRotZ", sol::property(&Player::shadowRotZ, &Player::shadowRotZ),
"unk_250", sol::property(&Player::unk_250, &Player::unk_250),
"pad254", sol::property(&Player::pad254, &Player::pad254),
"pad254", sol::overload([] (Player& self, int index) -> int32_t { return self.pad254[index]; }, [] (Player& self, int index, int32_t value) { self.pad254[index] = value; }),
"meteoWarpSpinSpeed", sol::property(&Player::meteoWarpSpinSpeed, &Player::meteoWarpSpinSpeed),
"contrailScale", sol::property(&Player::contrailScale, &Player::contrailScale),
"pad260", sol::property(&Player::pad260, &Player::pad260),
"pad260", sol::overload([] (Player& self, int index) -> int32_t { return self.pad260[index]; }, [] (Player& self, int index, int32_t value) { self.pad260[index] = value; }),
"shields", sol::property(&Player::shields, &Player::shields),
"damage", sol::property(&Player::damage, &Player::damage),
"heal", sol::property(&Player::heal, &Player::heal),
"unk_270", sol::property(&Player::unk_270, &Player::unk_270),
"pad274", sol::property(&Player::pad274, &Player::pad274),
"pad274", sol::overload([] (Player& self, int index) -> int32_t { return self.pad274[index]; }, [] (Player& self, int index, int32_t value) { self.pad274[index] = value; }),
"timer_278", sol::property(&Player::timer_278, &Player::timer_278),
"meteoWarpTimer", sol::property(&Player::meteoWarpTimer, &Player::meteoWarpTimer),
"barrelRollAlpha", sol::property(&Player::barrelRollAlpha, &Player::barrelRollAlpha),
"unk_284", sol::property(&Player::unk_284, &Player::unk_284),
"attacker", sol::property(&Player::attacker, &Player::attacker),
"pad28C", sol::property(&Player::pad28C, &Player::pad28C),
"pad28C", sol::overload([] (Player& self, int index) -> int32_t { return self.pad28C[index]; }, [] (Player& self, int index, int32_t value) { self.pad28C[index] = value; }),
"boostCooldown", sol::property(&Player::boostCooldown, &Player::boostCooldown),
"boostActive", sol::property(&Player::boostActive, &Player::boostActive),
"boostMeter", sol::property(&Player::boostMeter, &Player::boostMeter),
@ -3290,6 +3290,15 @@ lua.set_function("RCP_SetupDL_50", RCP_SetupDL_50);
lua.set_function("RCP_SetupDL_61", RCP_SetupDL_61);
lua["Game"]["gRcpSetupDLs"] = sol::overload([](int index1, int index2) -> Gfx { return gRcpSetupDLs[index1][index2]; }, [](int index1, int index2, Gfx value) { gRcpSetupDLs[index1][index2] = value; });
lua["Game"]["D_80178580"] = sol::overload([](int index) -> u8 { return D_80178580[index]; }, [](int index, u8 value) { D_80178580[index] = value; });
lua.new_usertype<PlanetData>("PlanetData",
"unk_0", sol::property([] (PlanetData& self) -> u8 { return self.unk_0; }, [] (PlanetData& self, u8 value) { self.unk_0 = value; }),
"expertMedal", sol::property([] (PlanetData& self) -> u8 { return self.expertMedal; }, [] (PlanetData& self, u8 value) { self.expertMedal = value; }),
"expertClear", sol::property([] (PlanetData& self) -> u8 { return self.expertClear; }, [] (PlanetData& self, u8 value) { self.expertClear = value; }),
"played", sol::property([] (PlanetData& self) -> u8 { return self.played; }, [] (PlanetData& self, u8 value) { self.played = value; }),
"normalMedal", sol::property([] (PlanetData& self) -> u8 { return self.normalMedal; }, [] (PlanetData& self, u8 value) { self.normalMedal = value; }),
"normalClear", sol::property([] (PlanetData& self) -> u8 { return self.normalClear; }, [] (PlanetData& self, u8 value) { self.normalClear = value; })
);
lua.new_usertype<PlanetStats>("PlanetStats",
"hitCount", sol::property([] (PlanetStats& self) -> u16 { return self.hitCount; }, [] (PlanetStats& self, u16 value) { self.hitCount = value; }),
"planetId", sol::property([] (PlanetStats& self) -> u8 { return self.planetId; }, [] (PlanetStats& self, u8 value) { self.planetId = value; }),
@ -3301,18 +3310,18 @@ lua.new_usertype<PlanetStats>("PlanetStats",
lua.new_usertype<SaveData>("SaveData",
"planet", sol::property(&SaveData::planet, &SaveData::planet),
"pad10", sol::property(&SaveData::pad10, &SaveData::pad10),
"pad10", sol::overload([] (SaveData& self, int index) -> int32_t { return self.pad10[index]; }, [] (SaveData& self, int index, int32_t value) { self.pad10[index] = value; }),
"soundMode", sol::property(&SaveData::soundMode, &SaveData::soundMode),
"musicVolume", sol::property(&SaveData::musicVolume, &SaveData::musicVolume),
"voiceVolume", sol::property(&SaveData::voiceVolume, &SaveData::voiceVolume),
"sfxVolume", sol::property(&SaveData::sfxVolume, &SaveData::sfxVolume),
"rankingRoute", sol::property(&SaveData::rankingRoute, &SaveData::rankingRoute),
"rankingLives", sol::property(&SaveData::rankingLives, &SaveData::rankingLives),
"rankingRoute", sol::overload([] (SaveData& self, int index) -> int32_t { return self.rankingRoute[index]; }, [] (SaveData& self, int index, int32_t value) { self.rankingRoute[index] = value; }),
"rankingLives", sol::overload([] (SaveData& self, int index) -> int32_t { return self.rankingLives[index]; }, [] (SaveData& self, int index, int32_t value) { self.rankingLives[index] = value; }),
"rankingMedal", sol::property(&SaveData::rankingMedal, &SaveData::rankingMedal),
"unk_EA", sol::property(&SaveData::unk_EA, &SaveData::unk_EA),
"textLanguage", sol::property(&SaveData::textLanguage, &SaveData::textLanguage),
"voiceLanguage", sol::property(&SaveData::voiceLanguage, &SaveData::voiceLanguage),
"padEE", sol::property(&SaveData::padEE, &SaveData::padEE),
"padEE", sol::overload([] (SaveData& self, int index) -> int32_t { return self.padEE[index]; }, [] (SaveData& self, int index, int32_t value) { self.padEE[index] = value; }),
"GetPlanetStats", &SaveData::GetPlanetStats
);
@ -4929,7 +4938,7 @@ lua.new_usertype<Scenery360>("Scenery360",
"obj", sol::property(&Scenery360::obj, &Scenery360::obj),
"info", sol::property(&Scenery360::info, &Scenery360::info),
"pathIndex", sol::property(&Scenery360::pathIndex, &Scenery360::pathIndex),
"unk_41", sol::property(&Scenery360::unk_41, &Scenery360::unk_41),
"unk_41", sol::overload([] (Scenery360& self, int index) -> int32_t { return self.unk_41[index]; }, [] (Scenery360& self, int index, int32_t value) { self.unk_41[index] = value; }),
"sfxSource", sol::property(&Scenery360::sfxSource, &Scenery360::sfxSource),
"unk_54", sol::property(&Scenery360::unk_54, &Scenery360::unk_54),
"asRef", &Scenery360::asRef
@ -4947,7 +4956,7 @@ lua.new_usertype<Scenery>("Scenery",
"effectVel", sol::property(&Scenery::effectVel, &Scenery::effectVel),
"vel", sol::property(&Scenery::vel, &Scenery::vel),
"sfxSource", sol::property(&Scenery::sfxSource, &Scenery::sfxSource),
"pad7C", sol::property(&Scenery::pad7C, &Scenery::pad7C),
"pad7C", sol::overload([] (Scenery& self, int index) -> int32_t { return self.pad7C[index]; }, [] (Scenery& self, int index, int32_t value) { self.pad7C[index] = value; }),
"asRef", &Scenery::asRef
);
@ -4955,7 +4964,7 @@ lua.new_usertype<Sprite>("Sprite",
"obj", sol::property(&Sprite::obj, &Sprite::obj),
"info", sol::property(&Sprite::info, &Sprite::info),
"index", sol::property(&Sprite::index, &Sprite::index),
"pad44", sol::property(&Sprite::pad44, &Sprite::pad44),
"pad44", sol::overload([] (Sprite& self, int index) -> int32_t { return self.pad44[index]; }, [] (Sprite& self, int index, int32_t value) { self.pad44[index] = value; }),
"sceneryId", sol::property(&Sprite::sceneryId, &Sprite::sceneryId),
"destroy", sol::property(&Sprite::destroy, &Sprite::destroy),
"toLeft", sol::property(&Sprite::toLeft, &Sprite::toLeft),
@ -4991,7 +5000,7 @@ lua.new_usertype<Effect>("Effect",
"unk_4C", sol::property(&Effect::unk_4C, &Effect::unk_4C),
"state", sol::property(&Effect::state, &Effect::state),
"timer_50", sol::property(&Effect::timer_50, &Effect::timer_50),
"pad52", sol::property(&Effect::pad52, &Effect::pad52),
"pad52", sol::overload([] (Effect& self, int index) -> int32_t { return self.pad52[index]; }, [] (Effect& self, int index, int32_t value) { self.pad52[index] = value; }),
"vel", sol::property(&Effect::vel, &Effect::vel),
"unk_60", sol::property(&Effect::unk_60, &Effect::unk_60),
"scale1", sol::property(&Effect::scale1, &Effect::scale1),
@ -4999,7 +5008,7 @@ lua.new_usertype<Effect>("Effect",
"unk_74", sol::property(&Effect::unk_74, &Effect::unk_74),
"unk_78", sol::property(&Effect::unk_78, &Effect::unk_78),
"unk_7A", sol::property(&Effect::unk_7A, &Effect::unk_7A),
"pad7C", sol::property(&Effect::pad7C, &Effect::pad7C),
"pad7C", sol::overload([] (Effect& self, int index) -> int32_t { return self.pad7C[index]; }, [] (Effect& self, int index, int32_t value) { self.pad7C[index] = value; }),
"sfxSource", sol::property(&Effect::sfxSource, &Effect::sfxSource),
"asRef", &Effect::asRef
);
@ -5052,7 +5061,7 @@ lua.new_usertype<Actor>("Actor",
"eventType", sol::property(&Actor::eventType, &Actor::eventType),
"animFrame", sol::property(&Actor::animFrame, &Actor::animFrame),
"state", sol::property(&Actor::state, &Actor::state),
"pad0BA", sol::property(&Actor::pad0BA, &Actor::pad0BA),
"pad0BA", sol::overload([] (Actor& self, int index) -> int32_t { return self.pad0BA[index]; }, [] (Actor& self, int index, int32_t value) { self.pad0BA[index] = value; }),
"timer_0BC", sol::property(&Actor::timer_0BC, &Actor::timer_0BC),
"timer_0BE", sol::property(&Actor::timer_0BE, &Actor::timer_0BE),
"timer_0C0", sol::property(&Actor::timer_0C0, &Actor::timer_0C0),
@ -5061,7 +5070,7 @@ lua.new_usertype<Actor>("Actor",
"timer_0C6", sol::property(&Actor::timer_0C6, &Actor::timer_0C6),
"unk_0C8", sol::property(&Actor::unk_0C8, &Actor::unk_0C8),
"drawShadow", sol::property(&Actor::drawShadow, &Actor::drawShadow),
"lockOnTimers", sol::property(&Actor::lockOnTimers, &Actor::lockOnTimers),
"lockOnTimers", sol::overload([] (Actor& self, int index) -> int32_t { return self.lockOnTimers[index]; }, [] (Actor& self, int index, int32_t value) { self.lockOnTimers[index] = value; }),
"health", sol::property(&Actor::health, &Actor::health),
"dmgType", sol::property(&Actor::dmgType, &Actor::dmgType),
"dmgPart", sol::property(&Actor::dmgPart, &Actor::dmgPart),

View file

@ -107,7 +107,8 @@ def sanitize_type(member_type):
member_type = member_type.replace('*', '')
member_type = member_type.replace('&', '')
member_type = member_type.replace('const', '')
member_type = member_type.replace('bool', 'boolean')
if(member_type == 'bool'):
member_type = 'boolean'
member_type = member_type.replace('int', 'number')
member_type = member_type.replace('float', 'number')
member_type = member_type.replace('char', 'string')
@ -297,8 +298,8 @@ def parse_structs(header):
continue
struct[struct_name].append({
'name': line.split('[')[0].split(' ')[-1],
'export': 'variable',
'type': sanitize_type(line.split('[')[0].split(' ')[-2])
'export': 'table',
'type': line.split('[')[0].split(' ')[-2]
})
else:
struct[struct_name].append({
@ -321,17 +322,28 @@ def parse_structs(header):
print(f' "{key}", sol::property([] ({struct_name}& self) -> {type} {{ return self.{key}; }}, [] ({struct_name}& self, {type} value) {{ self.{key} = value; }}){"," if i < len(members) - 1 else ""}')
elif export == 'function':
print(f' "{key}", &{struct_name}::{key}{"," if i < len(members) - 1 else ""}')
elif export == 'table':
if type == 'char' or type == 'u8' or type == 'uint8_t':
type = 'int32_t'
print(f' "{key}", sol::overload([] ({struct_name}& self, int index) -> {type} {{ return self.{key}[index]; }}, [] ({struct_name}& self, int index, {type} value) {{ self.{key}[index] = value; }}){"," if i < len(members) - 1 else ""}')
else:
type = sanitize_type(type)
print(f' "{key}", sol::property(&{struct_name}::{key}, &{struct_name}::{key}){"," if i < len(members) - 1 else ""}')
else:
print(f' "{key}", sol::property(&{struct_name}::{key}, &{struct_name}::{key}){"," if i < len(members) - 1 else ""}')
print(');')
print('')
elif export_type == OutputType.LUA:
print(f'---@class {struct_name}')
print(f'{struct_name} = {{}}')
# Sort tables to the end
members.sort(key=lambda x: x['export'])
# Reverse the list to get tables at the end
members = members[::-1]
for i, member in enumerate(members):
key = member['name'].replace('*', '')
export = member['export']
type = member['type']
original_type = member['type']
type = sanitize_type(original_type)
if export == 'bitfield':
print(f'---@return {type}')
print(f'function {struct_name}:{key}() end')
@ -341,8 +353,19 @@ def parse_structs(header):
elif export == 'function':
print(f'---@return {type}')
print(f'function {struct_name}:{key}() end')
elif export == 'table':
if original_type == 'char' or original_type == 'u8' or original_type == 'uint8_t':
print(f'---@param index number')
print(f'---@return number')
print(f'function {struct_name}:{key}(index) end')
print(f'---@param index number')
print(f'---@param value number')
print(f'function {struct_name}:{key}(index, value) end')
else:
print(f'---@field {key} {type}')
else:
print(f'---@field {key} {type}')
print(f'{struct_name} = {{}}')
print('')
def parse_events(header):
@ -383,12 +406,21 @@ def parse_events(header):
event[event_name].append(member_name)
for event_name, members in event.items():
print(f'lua.new_usertype<{event_name}>("{event_name}",')
for i, key in enumerate(members):
key = key.replace('*', '')
print(f' "{key}", sol::property(&{event_name}::{key}, &{event_name}::{key}){"," if i < len(members) - 1 else ""}')
print(');')
print('')
if export_type == OutputType.CPP:
print(f'lua.new_usertype<{event_name}>("{event_name}",')
for i, key in enumerate(members):
key = key.replace('*', '')
print(f' "{key}", sol::property(&{event_name}::{key}, &{event_name}::{key}){"," if i < len(members) - 1 else ""}')
print(');')
print('')
elif export_type == OutputType.LUA:
print(f'---@class {event_name}')
event_list.append(event_name)
for i, key in enumerate(members):
key = key.replace('*', '')
print(f'---@field {key}')
print(f'{event_name} = {{}}')
print('')
def parse_externs(header, namespace=None):
try: