From 224aa7dfdda6063ff26a7eca81e301012b669e71 Mon Sep 17 00:00:00 2001 From: Jdog Date: Tue, 11 Aug 2020 18:59:46 -0700 Subject: [PATCH] Added item_entity struct and related stuff. More matching functions --- papermario/include/common_structs.h | 56 ++++++++++++++++++++++++++++ papermario/include/functions.h | 2 + papermario/include/variables.h | 5 ++- papermario/src/code_111f0_len_860.c | 4 +- papermario/src/code_de740_len_23f0.c | 2 +- papermario/src/code_fa4c0_len_3bf0.c | 45 +++++++++++++--------- papermario/undefined_syms.txt | 4 +- 7 files changed, 96 insertions(+), 22 deletions(-) diff --git a/papermario/include/common_structs.h b/papermario/include/common_structs.h index 3eff5cdfc6..f2b26328ba 100644 --- a/papermario/include/common_structs.h +++ b/papermario/include/common_structs.h @@ -48,6 +48,62 @@ typedef struct { /* 0x168 */ s32 unk_168; } game_status; +typedef enum eItemEntityState { + CollisionWithPlayer=3, + FellBelowWorld=2, + Init=0, + Initialized=1 +} eItemEntityState; + +typedef struct { + /* 0x00 */ f32 verticalVelocity; + /* 0x04 */ f32 gravity; /* 2 = normal, 1 = low gravity, higher values never 'settle' */ + /* 0x08 */ f32 field_0x8; + /* 0x0C */ f32 constVelocity; /* ? */ + /* 0x10 */ f32 velx; + /* 0x14 */ f32 velz; + /* 0x18 */ f32 moveAngle; + /* 0x1C */ f32 field_0x1c; + /* 0x20 */ f32 field_0x20; +} item_entity_physics_data; + +typedef struct { + /* 0x00 */ s32 flags; + /* 0x04 */ s16 boundVar; /* see make_item_entity */ + /* 0x06 */ s16 field_0x6; + /* 0x08 */ f32 position[3]; + /* 0x14 */ struct item_entity_physics_data* physicsData; + /* 0x24 */ s16 itemID; /* into item table, also worldIconID */ + /* 0x1A */ eItemEntityState state; + /* 0x1B */ s8 type; + /* 0x1C */ s8 pickupDelay; /* num frames before item can be picked up */ + /* 0x1D */ s8 field_0x1d; + /* 0x1E */ s16 wsFaceAngle; /* < 0 means none */ + /* 0x20 */ s16 shadowIndex; + /* 0x22 */ char unk_22[2]; + /* 0x24 */ u32* readPos; + /* 0x28 */ u32 savedReadPos; + /* 0x2C */ s8 field_0x2c; + /* 0x2D */ s8 field_0x2d; + /* 0x2E */ s8 unkCounter; + /* 0x2F */ s8 field_0x2f; + /* 0x30 */ f32 scale; + /* 0x34 */ s16 field_0x34; + /* 0x36 */ s16 field_0x36; + /* 0x38 */ s16 field_0x38; + /* 0x3A */ char unk_3a[2]; + /* 0x3C */ s32 field_0x3c; /* coin related? timer? state? */ + /* 0x40 */ s32 field_0x40; /* coin sound related? */ + /* 0x44 */ char unk_44[4]; + /* 0x48 */ s32 field_0x48; /* coin sound related? */ + /* 0x4C */ s32 field_0x4c; + /* 0x50 */ s32 field_0x50; + /* 0x54 */ char unk_54[2]; + /* 0x56 */ s16 field_0x56; + /* 0x58 */ char unk_58[2]; + /* 0x5A */ s16 field_0x5a; +} item_entity; + typedef struct { /* 0x00 */ s32 nameString; /* 0x04 */ s16 iconID; diff --git a/papermario/include/functions.h b/papermario/include/functions.h index 2c21d3691b..c15ad959a3 100644 --- a/papermario/include/functions.h +++ b/papermario/include/functions.h @@ -13,4 +13,6 @@ f32 get_float_variable(script_context* script, s32 pos); f32 sin_deg(f32 x); f32 cos_deg(f32 x); +s32 play_sound_at_position(s32 soundID, s32 value2, f32 posX, f32 posY, f32 posZ); + #endif diff --git a/papermario/include/variables.h b/papermario/include/variables.h index 8122d0e6af..bf28b81f71 100644 --- a/papermario/include/variables.h +++ b/papermario/include/variables.h @@ -13,12 +13,15 @@ extern s16* D_80151328; extern s16 D_8010CD10; extern s16 D_8010CD12; -extern u16 mapTransitionAlpha; +extern u16 gMapTransitionAlpha; extern u16 D_800A0942; extern s16 D_800A0944; extern s16 D_80151308; +extern s16 D_8010F304[]; // Key Items +extern s16 D_8010F444[]; // Items + extern s16 gCurrentDoorSoundsSet; diff --git a/papermario/src/code_111f0_len_860.c b/papermario/src/code_111f0_len_860.c index f550c344f9..4dda7fb0e1 100644 --- a/papermario/src/code_111f0_len_860.c +++ b/papermario/src/code_111f0_len_860.c @@ -25,7 +25,7 @@ void func_800360FC(void) { void func_80036130(void) { game_status* gameStatus = *gGameStatusPtr; - mapTransitionAlpha = 0x00; + gMapTransitionAlpha = 0x00; D_800A0942 = 0x14; D_800A0944 = 0x00; @@ -52,7 +52,7 @@ s32 func_800363FC(void) { s32 func_80036430(void) { player_status* pPlayerStatus = &gPlayerStatus; - mapTransitionAlpha = 0xFF; + gMapTransitionAlpha = 0xFF; D_800A0942 = 0x14; D_800A0944 = 0x01; diff --git a/papermario/src/code_de740_len_23f0.c b/papermario/src/code_de740_len_23f0.c index 82daaaeda2..fe3710fc01 100644 --- a/papermario/src/code_de740_len_23f0.c +++ b/papermario/src/code_de740_len_23f0.c @@ -44,7 +44,7 @@ INCLUDE_ASM(code_de740_len_23f0, play_sound_at_player); INCLUDE_ASM(code_de740_len_23f0, play_sound_at_npc); -INCLUDE_ASM(code_de740_len_23f0, play_sound_at_position); +s32 INCLUDE_ASM(code_de740_len_23f0, play_sound_at_position, s32 soundID, s32 value2, f32 posX, f32 posY, f32 posZ); INCLUDE_ASM(code_de740_len_23f0, func_80149E04); diff --git a/papermario/src/code_fa4c0_len_3bf0.c b/papermario/src/code_fa4c0_len_3bf0.c index 9daa231a94..5549705359 100644 --- a/papermario/src/code_fa4c0_len_3bf0.c +++ b/papermario/src/code_fa4c0_len_3bf0.c @@ -46,8 +46,6 @@ s32 func_802D617C(script_context* script, s32 initialCall) { return 2; } -INCLUDE_ASM(code_fa4c0_len_3bf0, PlaySoundAt); -/* s32 PlaySoundAt(script_context* script, s32 initialCall) { s32* ptrReadPos = script->ptrReadPos; s32 soundID = get_variable(script, *ptrReadPos++); @@ -56,10 +54,9 @@ s32 PlaySoundAt(script_context* script, s32 initialCall) { s32 y = get_variable(script, *ptrReadPos++); s32 z = get_variable(script, *ptrReadPos++); - play_sound_at_position(soundID, value2, x, y, z); + play_sound_at_position(soundID, value2, (f32) x, (f32) y, (f32) z); return 2; } -*/ s32 StopSound(script_context* script, s32 initialCall) { s32* ptrReadPos = script->ptrReadPos; @@ -91,9 +88,24 @@ s32 func_802D6340(script_context* script, s32 initialCall) { INCLUDE_ASM(code_fa4c0_len_3bf0, PlaySoundAtF); -INCLUDE_ASM(code_fa4c0_len_3bf0, RemoveKeyItemAt); +s32 RemoveKeyItemAt(script_context* script, s32 initialCall) { + s32* ptrReadPos = script->ptrReadPos; + s32 index = get_variable(script, *ptrReadPos++); + s16* ptrTemp = D_8010F304; + ptrTemp[index] = 0; -INCLUDE_ASM(code_fa4c0_len_3bf0, RemoveItemAt); + return 2; +} + +s32 RemoveItemAt(script_context* script, s32 initialCall) { + s32* ptrReadPos = script->ptrReadPos; + s32 index = get_variable(script, *ptrReadPos++); + s16* ptrTemp = D_8010F444; + ptrTemp[index] = 0; + + sort_items(); + return 2; +} INCLUDE_ASM(code_fa4c0_len_3bf0, AddKeyItem); @@ -142,25 +154,24 @@ s32 AddBadge(script_context* script, s32 initialCall) { INCLUDE_ASM(code_fa4c0_len_3bf0, RemoveBadge); -INCLUDE_ASM(code_fa4c0_len_3bf0, SetItemPos); -/* s32 SetItemPos(script_context* script, s32 initialCall) { s32* ptrReadPos = script->ptrReadPos; - s32 itemEntityIndex, value2, value3, value4; - s32* ptrItemEntity; + item_entity* ptrItemEntity; + s32 itemEntityIndex; + s32 x, y, z; itemEntityIndex = get_variable(script, *ptrReadPos++); - value2 = get_variable(script, *ptrReadPos++); - value3 = get_variable(script, *ptrReadPos++); - value4 = get_variable(script, *ptrReadPos++); + x = get_variable(script, *ptrReadPos++); + y = get_variable(script, *ptrReadPos++); + z = get_variable(script, *ptrReadPos++); ptrItemEntity = get_item_entity(itemEntityIndex); - *(ptrItemEntity + 0x08) = (f64) value2; - *(ptrItemEntity + 0x0C) = (f64) value3; - *(ptrItemEntity + 0x10) = (f64) value4; + ptrItemEntity->position[0] = (f32) x; + ptrItemEntity->position[1] = (f32) y; + ptrItemEntity->position[2] = (f32) z; + return 2; } -*/ INCLUDE_ASM(code_fa4c0_len_3bf0, SetItemFlags); diff --git a/papermario/undefined_syms.txt b/papermario/undefined_syms.txt index 81dd6c91b1..ceb7fce283 100644 --- a/papermario/undefined_syms.txt +++ b/papermario/undefined_syms.txt @@ -4,7 +4,7 @@ gPlayerData = 0x8010F290; gPlayerStatus = 0x8010EFC8; gItemTable = 0x800878E0; -mapTransitionAlpha = 0x800A0940; +gMapTransitionAlpha = 0x800A0940; D_800A0942 = 0x800A0942; D_800A0944 = 0x800A0944; @@ -29,6 +29,8 @@ D_8009A5D8 = 0x8009A5D8; D_8009A650 = 0x8009A650; D_800DC500 = 0x800DC500; D_8010F6D0 = 0x8010F6D0; +D_8010F304 = 0x8010F304; +D_8010F444 = 0x8010F444; D_802C3000 = 0x802C3000; D_802DBD40 = 0x802DBD40; D_802E0D90 = 0x802E0D90;