mirror of
https://github.com/leoetlino/project-restoration
synced 2025-10-06 00:32:43 +02:00
450 lines
8.7 KiB
C++
450 lines
8.7 KiB
C++
#pragma once
|
|
|
|
#include "common/flags.h"
|
|
#include "common/types.h"
|
|
#include "common/utils.h"
|
|
#include "game/actor.h"
|
|
#include "game/context.h"
|
|
#include "game/items.h"
|
|
#include "game/pad.h"
|
|
|
|
namespace game::act {
|
|
|
|
enum class FormParamIndex : u8 {
|
|
FierceDeity = 0,
|
|
Human = 1,
|
|
Giant = 2,
|
|
Deku = 3,
|
|
Zora = 4,
|
|
ZoraDiving = 5,
|
|
Goron = 6,
|
|
Unknown = 7,
|
|
};
|
|
|
|
struct FormParam {
|
|
u16 run_accel;
|
|
u16 run_decel;
|
|
u16 field_4;
|
|
u16 field_6;
|
|
u16 field_8;
|
|
u16 field_A;
|
|
u16 field_C;
|
|
u16 field_E;
|
|
u16 field_10;
|
|
u16 field_12;
|
|
u16 roll_decel_maybe;
|
|
u16 walk_speed;
|
|
u16 field_18;
|
|
u16 field_1A;
|
|
u16 field_1C;
|
|
u16 field_1E;
|
|
u16 field_20;
|
|
u16 field_22;
|
|
u16 field_24;
|
|
u16 field_26;
|
|
};
|
|
|
|
FormParam& GetFormParam(FormParamIndex idx);
|
|
|
|
// XXX: Very incomplete.
|
|
struct Player : public Actor {
|
|
enum class Form : u8 {
|
|
FierceDeity = 0,
|
|
Goron = 1,
|
|
Zora = 2,
|
|
Deku = 3,
|
|
Human = 4,
|
|
};
|
|
|
|
enum class ActionType : u8 {
|
|
Type1 = 1,
|
|
Type2 = 2,
|
|
Type3 = 3,
|
|
Type4 = 4,
|
|
OcarinaOrTransformation = 5,
|
|
};
|
|
|
|
enum class Flag1 : u32 {
|
|
Locked = 0x1,
|
|
Unk2 = 0x2,
|
|
Unk4 = 0x4,
|
|
Unk8 = 0x8,
|
|
Unk10 = 0x10,
|
|
Unk20 = 0x20,
|
|
Unk40 = 0x40,
|
|
Unk80 = 0x80,
|
|
Unk100 = 0x100,
|
|
Unk200 = 0x200,
|
|
Unk400 = 0x400,
|
|
Unk800 = 0x800,
|
|
Unk1000 = 0x1000,
|
|
Unk2000 = 0x2000,
|
|
Unk4000 = 0x4000,
|
|
Unk8000 = 0x8000,
|
|
Unk10000 = 0x10000,
|
|
Unk20000 = 0x20000,
|
|
Unk40000 = 0x40000,
|
|
Unk80000 = 0x80000,
|
|
Unk100000 = 0x100000,
|
|
Unk200000 = 0x200000,
|
|
Unk400000 = 0x400000,
|
|
Unk800000 = 0x800000,
|
|
Unk1000000 = 0x1000000,
|
|
Unk2000000 = 0x2000000,
|
|
Unk4000000 = 0x4000000,
|
|
InWater = 0x8000000,
|
|
FreezeWorld = 0x10000000,
|
|
FreezeLink = 0x20000000,
|
|
Unk40000000 = 0x40000000,
|
|
Unk80000000 = 0x80000000,
|
|
};
|
|
|
|
enum class Flag3 : u32 {
|
|
Unk1 = 0x1,
|
|
Unk2 = 0x2,
|
|
Unk4 = 0x4,
|
|
AttackingB = 0x8,
|
|
Unk10 = 0x10,
|
|
Unk20 = 0x20,
|
|
Shooting = 0x40,
|
|
Unk80 = 0x80,
|
|
DekuInFlower = 0x100,
|
|
DekuLaunching = 0x200,
|
|
DekuStuffMaybe = 0x400,
|
|
Unk800 = 0x800,
|
|
GoronRolling = 0x1000,
|
|
DekuFlyingCamera = 0x2000,
|
|
Unk4000 = 0x4000,
|
|
ZoraFastSwimCamera = 0x8000,
|
|
Unk10000 = 0x10000,
|
|
AfterChangeMask = 0x20000,
|
|
Unk40000 = 0x40000,
|
|
GoronRollingFast = 0x80000,
|
|
DekuSpin = 0x100000,
|
|
Unk200000 = 0x200000,
|
|
Unk400000 = 0x400000,
|
|
AfterUseBoomerang = 0x800000,
|
|
DekuNutsOnB = 0x1000000,
|
|
Unk2000000 = 0x2000000,
|
|
Unk4000000 = 0x4000000,
|
|
Unk8000000 = 0x8000000,
|
|
Unk10000000 = 0x10000000,
|
|
Unk20000000 = 0x20000000,
|
|
Unk40000000 = 0x40000000,
|
|
Unk80000000 = 0x80000000,
|
|
};
|
|
|
|
char field_1F8;
|
|
FormParamIndex form_param_idx;
|
|
char field_1FA;
|
|
u8 current_action_flags;
|
|
ItemId held_item;
|
|
FormParamIndex form_param_idx2;
|
|
Action action;
|
|
Form active_form;
|
|
ItemId transform_mask_item_id;
|
|
char field_201;
|
|
char field_202;
|
|
u8 gap_203[4];
|
|
u8 field_207;
|
|
u8 gap208[3];
|
|
MaskId active_mask_id;
|
|
char field_20C;
|
|
MaskId previous_mask_id;
|
|
char field_20E;
|
|
u8 gap_20F[293];
|
|
u32 field_334;
|
|
u8 gap_338[48];
|
|
u32 field_368;
|
|
u8 gap_36C[4];
|
|
u32 field_370;
|
|
float field_374;
|
|
u8 gap_378[4];
|
|
float field_37C;
|
|
float field_380;
|
|
u8 gap_384[4];
|
|
float field_388;
|
|
u8 gap_38C[6];
|
|
__attribute__((packed)) __attribute__((aligned(1))) u32 field_392;
|
|
u8 gap_396[30];
|
|
u32 field_3B4;
|
|
u32 field_3B8;
|
|
u8 gap_3BC;
|
|
u8 gap_3BD[19];
|
|
u32 field_3D0;
|
|
u8 gap_3D4[128];
|
|
u32 field_454;
|
|
u8 gap_458[24];
|
|
u32 field_470;
|
|
u8 gap_474[652];
|
|
u32 field_700;
|
|
u8 gap_704[12];
|
|
u32 field_710;
|
|
u8 gap_714[196];
|
|
u32 field_7D8;
|
|
u8 gap_7DC[136];
|
|
int field_864;
|
|
int field_868;
|
|
u8 gap_86C[116];
|
|
u32 field_8E0;
|
|
u32 field_8E4;
|
|
u8 gap_8E8[8];
|
|
float field_8F0;
|
|
u8 gap_8F4[8];
|
|
u32 field_8FC;
|
|
u32 field_900;
|
|
u8 gap_904[16];
|
|
char field_914[12];
|
|
int field_920;
|
|
u8 gap_924[4];
|
|
u32 field_928;
|
|
u8 some_fn_idx;
|
|
char other_fn_idx;
|
|
char field_92E;
|
|
char field_92F;
|
|
u8 gap_930[8];
|
|
Vec3 field_938;
|
|
u32 field_944;
|
|
u8 gap_948[10];
|
|
u16 field_952;
|
|
s16 field_954;
|
|
u8 gap_956[22];
|
|
char field_96C;
|
|
__attribute__((aligned(2))) u8 gap_96E[50];
|
|
u32 field_9A0;
|
|
u32 field_9A4;
|
|
u8 gap_9A8[20];
|
|
u32 field_9BC;
|
|
u8 gap_9C0[12];
|
|
char field_9CC;
|
|
char field_9CD;
|
|
char field_9CE;
|
|
char field_9CF;
|
|
u8 gap_9D0[4];
|
|
int field_9D4;
|
|
u8 gap_9D8[4];
|
|
float field_9DC;
|
|
u8 gap_9E0[28];
|
|
float field_9FC;
|
|
float field_A00;
|
|
float field_A04;
|
|
u8 gapA08[1];
|
|
u8 gapA09[11];
|
|
u16 field_A14;
|
|
u8 gap_A16[126];
|
|
u16 field_A94;
|
|
u8 gap_A96[126];
|
|
u16 field_B14;
|
|
u8 gap_B16[126];
|
|
u16 field_B94;
|
|
u8 gap_B96[126];
|
|
u16 field_C14;
|
|
u8 gap_C16[126];
|
|
u32 field_C94;
|
|
u8 gap_C98[13];
|
|
char field_CA5[7];
|
|
u32 field_CAC;
|
|
u8 gap_CB0[17];
|
|
char field_CC1[1];
|
|
char field_CC2[2];
|
|
u32 field_CC4;
|
|
u8 gap_CC8[4];
|
|
u32 field_CCC;
|
|
u8 gap_CD0[4];
|
|
float field_CD4;
|
|
float field_CD8;
|
|
float field_CDC;
|
|
u8 gap_CE0[12];
|
|
u16 field_CEC;
|
|
u8 gap_CEE[270];
|
|
u32 field_DFC;
|
|
u8 gap_E00[4];
|
|
u32 field_E04;
|
|
u32 field_E08;
|
|
u32 field_E0C;
|
|
u32 field_E10;
|
|
void (*state_handler_fn)(Player*, GlobalContext*);
|
|
u8 gap_E18[4763];
|
|
u8 field_20B3;
|
|
u8 gap_20B4[61260];
|
|
|
|
char field_11000;
|
|
u8 gap1[3071];
|
|
u32 field_11C00;
|
|
u8 gap_11C04[252];
|
|
u32 field_11D00;
|
|
u8 gap_11D04[168];
|
|
u32 field_11DAC;
|
|
rst::Flags<Flag1> flags1;
|
|
u32 flags2;
|
|
rst::Flags<Flag3> flags3;
|
|
u32 flags4;
|
|
int field_11DC0;
|
|
u32 field_11DC4;
|
|
u8 gap_DC8[4];
|
|
u16 field_DCC;
|
|
char field_11DCE;
|
|
char active_item_id;
|
|
u32 field_11DD0;
|
|
int field_11DD4;
|
|
int field_11DD8;
|
|
float field_11DDC;
|
|
u8 gap_11DE0[4];
|
|
int field_11DE4;
|
|
float field_11DE8;
|
|
float field_11DEC;
|
|
u8 gap_11DF0;
|
|
ActionType action_type;
|
|
u16 field_11DF2;
|
|
u16 field_11DF4;
|
|
u16 field_11DF6;
|
|
u16 field_11DF8;
|
|
u8 gap_11DFA;
|
|
u8 gap_11DFB;
|
|
u16 field_11DFC;
|
|
u16 field_11DFE;
|
|
u16 field_11E00;
|
|
__attribute__((packed)) __attribute__((aligned(1))) u32 field_11E02;
|
|
u16 field_11E06;
|
|
u16 field_11E08;
|
|
u16 field_11E0A;
|
|
u16 field_11E0C;
|
|
u16 field_11E0E;
|
|
u16 field_11E10;
|
|
u8 gap_11E12[2];
|
|
u32 field_11E14;
|
|
float field_11E18;
|
|
float field_11E1C;
|
|
u32 field_11E20;
|
|
u8 gap_11E24[8];
|
|
u32 field_11E2C;
|
|
float lin_vel;
|
|
u16 angle;
|
|
u16 field_11E36;
|
|
u32 field_11E38;
|
|
u8 gap_11E3C;
|
|
char field_11E3D[1];
|
|
char field_111E3E;
|
|
u8 field_11E3F;
|
|
char field_11E40;
|
|
char field_11E41;
|
|
u8 gap_11E42[10];
|
|
char field_11E4C;
|
|
char field_11E4D;
|
|
u16 field_11E4E;
|
|
u8 gap_11E50[4];
|
|
u16 field_11E54;
|
|
u8 gap_11E56[22];
|
|
float lin_vel_xxx;
|
|
float lin_vel_xxx2;
|
|
float field_11E74;
|
|
float field_11E78;
|
|
u32 field_11E7C;
|
|
u32 field_11E80;
|
|
u32 field_11E84;
|
|
float field_E88;
|
|
u16 field_11E8C;
|
|
u16 field_11E8E;
|
|
u8 gap_11E90;
|
|
char field_11E91;
|
|
char field_11E92;
|
|
char field_11E93;
|
|
float field_11E94;
|
|
u32 field_11E98;
|
|
u8 gap_11E9C[20];
|
|
float lin_vel_max;
|
|
int field_11EB4;
|
|
float field_11EB8;
|
|
float field_11EBC;
|
|
u8 gap_11EC0[6];
|
|
char field_11EC6;
|
|
char field_11EC7;
|
|
u16 field_11EC8;
|
|
u16 zora_barrier_timer;
|
|
u16 field_11ECC;
|
|
char field_11ECE[1];
|
|
char field_11ECF;
|
|
u8 gapED0[3];
|
|
u8 gap_11ED3;
|
|
u32 field_11ED4;
|
|
u8 gap_11ED8[4];
|
|
u32 field_11EDC;
|
|
u8 gap_11EE0;
|
|
char field_11EE1[11];
|
|
float field_11EEC;
|
|
u16 field_11EF0;
|
|
u16 is_zora_slow_swim;
|
|
u16 field_EF4;
|
|
u16 field_EF6;
|
|
u16 field_EF8;
|
|
u16 field_EFA;
|
|
u16 field_EFC;
|
|
u16 zora_fast_swim_countdown;
|
|
u16 field_F00;
|
|
u16 field_F02;
|
|
u16 field_F04;
|
|
u16 field_F06;
|
|
u32 field_11F08;
|
|
u32 field_11F0C;
|
|
u8 gap_11F10[20];
|
|
u32 field_11F24;
|
|
u8 gap_11F28[20];
|
|
u32 field_11F3C;
|
|
u8 gap_11F40[48];
|
|
u32 field_11F70;
|
|
u8 gap_11F74[140];
|
|
u32 field_12000;
|
|
u8 gap_12004[110];
|
|
__attribute__((packed)) __attribute__((aligned(1))) int field_12072;
|
|
u8 gap_1076[66];
|
|
u32 field_10B8;
|
|
u8 gap_10BC[172];
|
|
u32 field_1168;
|
|
u8 gap_116C[492];
|
|
u32 field_1358;
|
|
u8 gap_135C[160];
|
|
u32 field_13FC;
|
|
u8 gap_1400[160];
|
|
u32 field_14A0;
|
|
u8 gap_14A4[860];
|
|
int field_12800;
|
|
u8 gap_1804[436];
|
|
u32 field_19B8;
|
|
u32 field_129BC;
|
|
u8 gap_129C0[12];
|
|
|
|
pad::ControllerInfo controller_info;
|
|
u8 gap_12A14[36];
|
|
u32 field_12A38;
|
|
u8 gap_12A3C[4];
|
|
u32 field_12A40;
|
|
u8 gap_12A44[12];
|
|
u32 field_12A50;
|
|
u8 gap_12A54[28];
|
|
u32 field_12A70;
|
|
u8 gap_12A74[40];
|
|
s16 field_12A9C;
|
|
s16 field_12A9E;
|
|
u32 field_12AA0;
|
|
u16 field_12AA4;
|
|
u8 gap_12AA6[62];
|
|
float field_12AE4;
|
|
u8 gap_12AE8[4];
|
|
bool field_12AEC;
|
|
u8 field_12AED;
|
|
u8 gap_12AEE[2];
|
|
u8 gap_12AF0[292];
|
|
float field_12C14;
|
|
u8 gap_12C18[32];
|
|
float field_12C38;
|
|
u8 gap_12C3C[8];
|
|
float field_12C44;
|
|
u8 gap_12C48[134];
|
|
s16 field_12CCE;
|
|
};
|
|
static_assert(rst::util::OffsetOf(&Player::transform_mask_item_id) == 0x200);
|
|
static_assert(rst::util::OffsetOf(&Player::field_12CCE) == 0x12CCE);
|
|
// TODO: complete the struct and add a size assertion.
|
|
|
|
} // namespace game::act
|