m_scene OK (#165)

This commit is contained in:
Prakxo
2024-04-10 03:57:33 +02:00
committed by GitHub
parent fcdb637629
commit fce490d951
18 changed files with 730 additions and 209 deletions
+3 -2
View File
@@ -4,12 +4,13 @@
#include "ultra64.h"
struct Game;
struct Game_Play;
// void func_800BF410_jp();
// void func_800BF480_jp();
// void func_800BF4F4_jp();
void mScn_ObtainCarpetBank(struct Game_Play*);
// void func_800BF56C_jp();
// void func_800BF580_jp();
void mScn_ObtainMyRoomBank(struct Game_Play*);
// void func_800BF5A0_jp();
// void func_800BF5F4_jp();
// void func_800BF770_jp();
+85 -11
View File
@@ -16,6 +16,7 @@ struct ToolClip;
struct ShadowData;
struct FurnitureActor;
struct WeatherClip;
struct ObjectExchangeBank;
typedef UNK_RET (*Clip_unk_040_unk_04)(struct ActorOverlay*, const struct struct_801161E8_jp*, size_t, s32);
typedef UNK_RET (*Clip_unk_040_unk_08)(void);
@@ -29,6 +30,7 @@ typedef UNK_RET (*Clip_unk_040_unk_C8)(struct Actor*, struct Game_Play*);
typedef UNK_RET (*Clip_unk_040_unk_CC)(struct Actor*, struct Game_Play*);
typedef UNK_RET (*Clip_unk_040_unk_D0)(void);
typedef UNK_RET (*Clip_unk_040_unk_E4)(void);
typedef UNK_RET (*Clip_unk_040_unk_E8)(void);
typedef UNK_RET (*Clip_unk_040_unk_EC)(struct ObjectStatus*, s16, s16);
typedef UNK_RET (*Clip_unk_040_unk_F0)(struct ObjectStatus*, struct Actor*);
typedef s32 (*Clip_unk_040_unk_F4)(struct ObjectStatus*, struct Actor*);
@@ -50,7 +52,7 @@ typedef struct Clip_unk_040 {
/* 0x0D0 */ Clip_unk_040_unk_D0 unk_D0;
/* 0x0D4 */ UNK_TYPE1 unk_D4[0x10];
/* 0x0E4 */ Clip_unk_040_unk_E4 unk_E4;
/* 0x0E8 */ UNK_TYPE1 unk_E8[0x4];
/* 0x0E8 */ Clip_unk_040_unk_E8 unk_E8;
/* 0x0EC */ Clip_unk_040_unk_EC unk_EC;
/* 0x0F0 */ Clip_unk_040_unk_F0 unk_F0;
/* 0x0F4 */ Clip_unk_040_unk_F4 unk_F4;
@@ -58,6 +60,14 @@ typedef struct Clip_unk_040 {
/* 0x118 */ Clip_unk_040_unk_118 unk_118;
} Clip_unk_040; // size >= 0x11C
typedef UNK_RET (*Clip_unk_060_unk_04)(void);
typedef struct Clip_unk_060 {
/* 0x0 */ UNK_TYPE1 unk_0[0x4];
/* 0x4 */ Clip_unk_060_unk_04 unk_4;
} Clip_unk_060; // size >= 0x4
typedef UNK_RET (*Clip_unk_068)(void);
typedef UNK_RET (*Clip_unk_06C_unk_00)(UNK_TYPE);
typedef UNK_RET (*Clip_unk_06C_unk_04)(UNK_TYPE);
typedef UNK_RET (*Clip_unk_06C_unk_08)(UNK_TYPE);
@@ -68,6 +78,12 @@ typedef struct Clip_unk_078 {
/* 0x08 */ Clip_unk_06C_unk_08 unk_08;
} Clip_unk_06C; // size >= 0xC
typedef s32 (*Clip_unk_070_unk_0C)(void);
typedef struct Clip_unk_070 {
/* 0x00 */ UNK_TYPE1 unk_0[0xC];
/* 0x04 */ Clip_unk_070_unk_0C unk_C;
} Clip_unk_070; // size >= 0x10
typedef UNK_RET (*Clip_unk_074_unk_00)(UNK_TYPE);
typedef void (*Clip_unk_074_unk_04)(struct Game_Play* game_play, struct ShadowData* shadowData, s16 unk2);
@@ -76,10 +92,18 @@ typedef struct Clip_unk_074 {
/* 0x04 */ Clip_unk_074_unk_04 unk_04;
} Clip_unk_074; // size >= 0x8
typedef void (*Clip_unk_07C_unk_4)(struct ObjectExchangeBank*);
typedef struct Clip_unk_07C {
/* 0x00 */ s8 unk_0[0x4];
/* 0x04 */ Clip_unk_07C_unk_4 unk_4;
} Clip_unk_07C; // size >= 0x8
typedef void (*Clip_unk_080_unk_24)(void);
typedef UNK_RET (*Clip_unk_080_unk_34)(struct FurnitureActor* furnitureActor, struct Actor* myHouseActor, struct Game_Play* game_play, f32 arg0, f32 arg1);
typedef struct Clip_unk_080 {
/* 0x00 */ UNK_TYPE1 unk_00[0x34];
/* 0x00 */ UNK_TYPE1 unk_00[0x24];
/* 0x24 */ Clip_unk_080_unk_24 unk_24;
/* 0x28 */ UNK_TYPE1 unk_28[0xC];
/* 0x34 */ Clip_unk_080_unk_34 unk_34; // open close proc
} Clip_unk_080; // size >= 0x8
@@ -87,6 +111,7 @@ typedef UNK_RET (*Clip_unk_08C_unk_4)(struct ActorOverlay*, size_t);
typedef UNK_RET (*Clip_unk_08C_unk_8)(void);
typedef UNK_PTR (*Clip_unk_08C_unk_0C)(void);
typedef UNK_RET (*Clip_unk_08C_unk_10)(struct Actor*);
typedef void (*Clip_unk_08C_unk_A4)(struct ObjectExchangeBank*);
typedef UNK_RET (*Clip_unk_08C_unk_A8)(UNK_PTR, UNK_TYPE, u16 name, struct Actor* actor);
typedef UNK_RET (*Clip_unk_08C_unk_AC)(u16);
typedef UNK_RET (*Clip_unk_08C_unk_450)(u16);
@@ -97,7 +122,8 @@ typedef struct Clip_unk_08C {
/* 0x08 */ Clip_unk_08C_unk_8 unk_08;
/* 0x0C */ Clip_unk_08C_unk_0C unk_0C;
/* 0x10 */ Clip_unk_08C_unk_10 unk_10;
/* 0x014 */ UNK_TYPE1 unk_14[0x94];
/* 0x014 */ UNK_TYPE1 unk_14[0x90];
/* 0x0A4 */ Clip_unk_08C_unk_A4 unk_A4;
/* 0x0A8 */ Clip_unk_08C_unk_A8 unk_A8; // unload object
/* 0x0AC */ Clip_unk_08C_unk_AC unk_AC; // load object
/* 0x0B0 */ UNK_TYPE unk_B0;
@@ -114,6 +140,39 @@ typedef struct Clip_unk_090 {
/* 0x30 */ Clip_unk_090_unk_30 unk_30;
} Clip_unk_090; // size >= 0x34
typedef void (*Clip_unk_09C_unk_C)(void);
typedef struct Clip_unk_09C {
/* 0x00 */ UNK_TYPE1 unk_00[0xC];
/* 0x0C */ Clip_unk_09C_unk_C unk_C;
} Clip_unk_09C; // size >= 0x10
typedef void (*Clip_unk_0A4_unk_4)(void);
typedef struct Clip_unk_0A4 {
/* 0x00 */ UNK_TYPE1 unk_00[0x04];
/* 0x04 */ Clip_unk_0A4_unk_4 unk_4;
} Clip_unk_0A4;
typedef UNK_RET (*Clip_unk_0A8_unk_4)(void*);
typedef struct Clip_unk_0A8 {
/* 0x00 */ UNK_TYPE1 unk_00[0x04];
/* 0x04 */ Clip_unk_0A8_unk_4 unk_4;
} Clip_unk_0A8; // size >= 0x8
typedef void (*Clip_unk_0B4_unk_4)(void);
typedef struct Clip_unk_0B4 {
/* 0x00 */ UNK_TYPE1 unk_00[0x04];
/* 0x04 */ Clip_unk_0B4_unk_4 unk_4;
} Clip_unk_0B4; // size >= 0x8
typedef void (*Clip_unk_0B8_unk_4)(void);
typedef struct Clip_unk_0B8 {
/* 0x00 */ UNK_TYPE1 unk_00[0x04];
/* 0x04 */ Clip_unk_0B8_unk_4 unk_4;
} Clip_unk_0B8; // size >= 0x8
typedef void (*Clip_unk_0D0)(void);
typedef void (*Clip_unk_0D8_unk_00)(struct Game_Play* game_play);
typedef struct Clip_unk_0D8 {
/* 0x00 */ Clip_unk_0D8_unk_00 unk_00;
@@ -121,21 +180,36 @@ typedef struct Clip_unk_0D8 {
typedef struct Clip {
/* 0x000 */ UNK_TYPE1 unk000[0x40];
/* 0x000 */ s8 unk000[0x20];
/* 0x020 */ s32 unk_020;
/* 0x024 */ s8 unk_024[0x1C];
/* 0x040 */ Clip_unk_040* unk_040;
/* 0x044 */ UNK_TYPE1 unk_044[0x28];
/* 0x044 */ s8 unk_044[0x1C];
/* 0x060 */ Clip_unk_060* unk_060;
/* 0x064 */ s8 unk_064[0x4];
/* 0x068 */ Clip_unk_068 unk_068;
/* 0x06C */ Clip_unk_06C* unk_06C;
/* 0x070 */ UNK_TYPE1 unk_070[0x4];
/* 0x070 */ Clip_unk_070* unk_070;
/* 0x074 */ Clip_unk_074* unk_074;
/* 0x078 */ struct WeatherClip* weatherClip;
/* 0x07C */ UNK_TYPE1 unk_07C[0x4];
/* 0x07C */ Clip_unk_07C* unk_07C;
/* 0x080 */ Clip_unk_080* unk_080;
/* 0x084 */ UNK_TYPE1 unk_084[0x8];
/* 0x08C */ Clip_unk_08C* unk_08C;
/* 0x084 */ s8 unk_084[0x8];
/* 0x08C */ Clip_unk_08C* unk_08C;
/* 0x090 */ Clip_unk_090* unk_090;
/* 0x094 */ struct ToolClip* toolClip;
/* 0x098 */ UNK_TYPE1 unk_098[0x40];
/* 0x0D8 */ Clip_unk_0D8* unk_0D8;
/* 0x098 */ s8 unk_098[0x4];
/* 0x09C */ Clip_unk_09C* unk_09C;
/* 0x0A0 */ s8 unk_0A0[0x4];
/* 0x0A4 */ Clip_unk_0A4* unk_0A4;
/* 0x0A8 */ Clip_unk_0A8* unk_0A8;
/* 0x0AC */ s8 unk_0AC[0x8];
/* 0x0B4 */ Clip_unk_0B4* unk_0B4;
/* 0x0B8 */ Clip_unk_0B8* unk_0B8;
/* 0x0BC */ s8 unk_0BC[0x14];
/* 0x0D0 */ Clip_unk_0D0 unk_0D0;
/* 0x0D4 */ s8 unk_0D4[0x4];
/* 0x0D8 */ Clip_unk_0D8* unk_0D8;
/* 0x0DC */ u8 unk_0DC[0x24];
} Clip; // size = 0x100
+12 -9
View File
@@ -16,6 +16,7 @@
#include "unk.h"
#include "m_snowman.h"
#include "m_clip.h"
#include "m_scene.h"
typedef enum Season {
/* 0 */ SPRING,
@@ -112,7 +113,7 @@ typedef struct CommonData {
/* 0x0F8B2 */ UNK_TYPE1 unk_0F8B2[0x74E];
/* 0x10000 */ u8 unk_10000; // named "game_started" in AC GCN decomp
/* 0x10001 */ u8 unk_10001;
/* 0x10002 */ u8 unk_10002[0x1];
/* 0x10002 */ u8 unk_10002;
/* 0x10003 */ u8 playerNumber;
/* 0x10004 */ s32 unk_10004; // named "last_scene_no" in AC GCN decomp
/* 0x10008 */ s32 unk_10008;
@@ -126,13 +127,13 @@ typedef struct CommonData {
/* 0x10149 */ u8 unk_10149;
/* 0x1014A */ u8 unk_1014A;
/* 0x1014B */ u8 unk_1014B; // named "wipeType" in AC GCN decomp
/* 0x1014C */ UNK_TYPE1 unk_1014C[0x2];
/* 0x1014C */ s16 unk_1014C;
/* 0x1014E */ s16 unk_1014E;
/* 0x10150 */ UNK_TYPE1 unk_10150[0x10];
/* 0x10160 */ NpcList npclist[ANIMAL_NUM_MAX];
/* 0x104A8 */ u16 houseOwnerName;
/* 0x104AA */ u16 lastFieldId;
/* 0x104AC */ UNK_TYPE1 unk_104AC[0x1];
/* 0x104AC */ u8 unk_104AC;
/* 0x104AD */ u8 unk_104AD;
/* 0x104AE */ u8 sunlightFlag;
/* 0x104AF */ UNK_TYPE1 unk_104AF[0x1];
@@ -151,16 +152,18 @@ typedef struct CommonData {
/* 0x1074C */ s32 unk_1074C;
/* 0x10750 */ s16 moneyPower;
/* 0x10752 */ s16 goodsPower;
/* 0x10754 */ s32 unk_10754;
/* 0x10758 */ UNK_TYPE1 unk_10758[0x48];
/* 0x107A0 */ UNK_TYPE unk_107A0;
/* 0x107A4 */ UNK_TYPE1 unk_107A4[0x12];
/* 0x10754 */ DoorData doorData;
/* 0x10768 */ s8 unk_10768[0x38];
/* 0x107A0 */ DoorData famicomEmuDoorData;
/* 0x107B4 */ s16 unk_107B4;
/* 0x107B6 */ s16 unk_107B6; // named "demo_profile" in AC GCN decomp (though it's an array of two s16s in that game)
/* 0x107B8 */ UNK_TYPE1 unk_107B8[0x28];
/* 0x107E0 */ s8 playerDecoyFlag;
/* 0x107E1 */ UNK_TYPE1 unk_107E1[0x3];
/* 0x107E4 */ s16 unk_107E4;
/* 0x107E6 */ UNK_TYPE1 unk107E6[0x252];
/* 0x107E4 */ s16 unk_107E4;
/* 0x107E6 */ UNK_TYPE1 unk107E6[0x212];
/* 0x109F8 */ u8 unk109F8;
/* 0x109FC */ s8 unk109F9[0x3F];
/* 0x10A38 */ s8 beeStingFlag;
/* 0x10A39 */ UNK_TYPE1 unk_10A39[0x1];
/* 0x10A3A */ u8 gokiShockedFlag;
+1 -1
View File
@@ -78,7 +78,7 @@ typedef struct FieldMakeBlockInfo {
// void func_80086E30_jp();
// void func_80086F08_jp();
// void func_80086FA8_jp();
// void func_80086FEC_jp();
void mFM_SetFieldInitData(s32,s32);
void func_80087004_jp(void);
void func_80087280_jp(void);
// void func_80087380_jp();
+7 -7
View File
@@ -26,14 +26,14 @@ UNK_RET func_800B131C_jp(UNK_TYPE arg0);
void func_800B167C_jp(s32 arg0, UNK_RET arg1);
// void func_800B16D0_jp();
// void func_800B16F8_jp();
void func_800B1784_jp(UNK_TYPE);
void func_800B1784_jp(struct Game_Play*);
// void func_800B1838_jp();
void func_800B190C_jp(UNK_TYPE);
void func_800B190C_jp(struct Game_Play*);
// void func_800B1944_jp();
void func_800B1960_jp(UNK_TYPE, UNK_TYPE, UNK_TYPE);
void func_800B19C4_jp(UNK_TYPE, UNK_TYPE, UNK_TYPE);
void func_800B1A28_jp(UNK_TYPE);
void func_800B1A60_jp(UNK_TYPE);
void func_800B1960_jp(struct Game_Play*, UNK_TYPE, UNK_TYPE);
void func_800B19C4_jp(struct Game_Play*, UNK_TYPE, UNK_TYPE);
void func_800B1A28_jp(struct Game_Play*);
void func_800B1A60_jp(struct Game_Play*);
void mPlib_Object_Exchange_keep_Player_dt(struct Game_Play* game_play);
// void func_800B1AE0_jp();
// void func_800B1B3C_jp();
@@ -69,7 +69,7 @@ void mPlib_change_player_cloth_info_lv2(struct PrivateInfo*, u16);
// void func_800B22D0_jp();
// void func_800B22FC_jp();
// void func_800B2350_jp();
// void func_800B23A4_jp();
void mPlib_request_main_invade_type1(struct Game_Play*);
// void func_800B23DC_jp();
// void func_800B2414_jp();
// void func_800B2450_jp();
+98 -36
View File
@@ -3,8 +3,11 @@
#include "ultra64.h"
#include "z64math.h"
#include "libc/stdint.h"
#include "m_std_dma.h"
struct Game_Play;
struct Game;
typedef struct ActorEntry {
/* 0x0 */ s16 id;
@@ -16,11 +19,10 @@ typedef struct ActorEntry {
typedef struct ObjectStatus {
/* 0x00 */ s16 id;
/* 0x04 */ void* segment;
/* 0x08 */ UNK_TYPE unk_08;
/* 0x08 */ void* vram;
/* 0x0C */ uintptr_t vrom;
/* 0x10 */ size_t size;
/* 0x14 */ UNK_TYPE unk14;
/* 0x18 */ char pad18[0x1C];
/* 0x14 */ DmaRequest unk14;
/* 0x34 */ OSMesgQueue unk34;
/* 0x4C */ UNK_TYPE unk4C;
/* 0x50 */ s16 unk50;
@@ -37,59 +39,119 @@ typedef struct ObjectExchangeBank {
/* 0x17FC */ UNK_TYPE unk17FC;
/* 0x1800 */ UNK_TYPE unk1800;
/* 0x1804 */ UNK_TYPE unk1804;
/* 0x1808 */ UNK_TYPE unk1808;
/* 0x180C */ UNK_TYPE unk180C;
/* 0x1810 */ UNK_TYPE unk1810;
/* 0x1814 */ UNK_TYPE unk1814;
/* 0x1808 */ s32 unk1808[2];
/* 0x1810 */ s32 unk1810[2];
/* 0x1818 */ UNK_PTR unk1818;
/* 0x181C */ UNK_TYPE unk181C;
/* 0x1820 */ UNK_TYPE unk1820;
} ObjectExchangeBank; // size = 0x1824
typedef struct {
/* 0x0000 */ u8 unk0;
/* 0x0001 */ u8 unk1;
/* 0x0004 */ UNK_PTR unk4;
} MSceneUnkStruct;
typedef struct DoorData {
/* 0x00 */ s32 nextSceneId;
/* 0x04 */ u8 exitOrientation;
/* 0x05 */ u8 exitType;
/* 0x06 */ u16 params;
/* 0x08 */ s_xyz exitPos;
/* 0x0E */ u16 fgName;
/* 0x10 */ u8 wipeType;
/* 0x11 */ u8 alignment[3];
} DoorData; // size = 0x14
typedef struct DoorInfo {
/* 0x00 */ u8 numDoors;
/* 0x04 */ DoorData* doorDataPtr;
} DoorInfo; // size = 0x8
typedef struct SceneDataDoor {
/* 0x00 */ u8 type;
/* 0x01 */ u8 numDoors;
/* 0x04 */ DoorData* doorDataPtr;
} SceneDataDoor; // size = 0x8
typedef struct SceneDataActor {
/* 0x00 */ u8 type;
/* 0x01 */ u8 numActors;
/* 0x04 */ ActorEntry* actorDataPtr;
} SceneDataActor; // size = 0x8
typedef struct SceneDataCtrlActor {
/* 0x00 */ u8 type;
/* 0x01 */ u8 numCtrlActors;
/* 0x04 */ s16* ctrlActorDataPtr;
} SceneDataCtrlActor; // size = 0x8
typedef struct SceneDataObjectBank {
/* 0x00 */ u8 type;
/* 0x01 */ u8 numBanks;
/* 0x04 */ s16* banksDataPtr;
} SceneDataObjectBank; // size = 0x8
typedef struct SceneDataField {
/* 0x00 */ u8 type;
/* 0x01 */ u8 itemType;
/* 0x02 */ u8 bgNum;
/* 0x04 */ u16 bgDispSize;
/* 0x06 */ u8 unk_06;
/* 0x07 */ u8 drawType;
} SceneDataField; // size = 0x8
typedef struct SceneDataArrangeFtr {
/* 0x00 */ u8 type;
/* 0x01 */ u8 arrangeFtrNum;
} SceneDataArrangeFtr; // size = 0x2
typedef struct SceneDataMisc {
/* 0x01 */ u8 type;
} SceneDataMisc; // size = 0x1
typedef union SceneData {
SceneDataMisc misc;
SceneDataActor actor;
SceneDataCtrlActor controlActor;
SceneDataObjectBank objectBank;
SceneDataDoor doorData;
SceneDataField field;
SceneDataArrangeFtr arrangeFtr;
} SceneData; // size = 0x8
s32 func_800C59B0_jp(ObjectExchangeBank* objectExchangeBank);
s32 func_800C5A08_jp(ObjectExchangeBank* objectExchangeBank);
s32 func_800C5A60_jp(ObjectExchangeBank* objectExchangeBank);
s32 func_800C5AA0_jp(ObjectStatus* objectStatus, ObjectExchangeBank* objectExchangeBank, s16 objectBankIndex);
void func_800C5B30_jp(ObjectStatus* objectStatus);
void mSc_set_bank_status_after(ObjectStatus* objectStatus);
void mSc_clear_bank_status(ObjectStatus* objectStatus);
s32 func_800C5B74_jp(ObjectExchangeBank* objectExchangeBank, s16 id);
void Object_Exchange_keep_new_Player(s32 arg0);
void Object_Exchange_keep_new_Player(struct Game_Play* arg0);
u32 mSc_secure_exchange_keep_bank(ObjectExchangeBank* objectExchangeBank, s16 id, s32 size);
void func_800C5D68_jp(ObjectExchangeBank*);
s32 func_800C5D68_jp(ObjectExchangeBank* objectExchangeBank);
void func_800C5E10_jp(ObjectExchangeBank* objectExchangeBank);
// void func_800C5EA0_jp();
void func_800C5EA0_jp(ObjectExchangeBank* objectExchangeBank);
s32 func_800C5F0C_jp(ObjectStatus* objectStatus, ObjectExchangeBank* objectExchangeBank);
void mSc_dmacopy_data_bank(ObjectExchangeBank* objectExchangeBank);
s32 mSc_bank_regist_check(ObjectExchangeBank* objectExchangeBank, s16 id);
s32 func_800C6144_jp(ObjectExchangeBank* objectExchangeBank, s16 arg1);
void mSc_regist_initial_exchange_bank(struct Game_Play* game_play);
void func_800C62C4_jp(ObjectStatus*, ObjectExchangeBank*, s32);
void mSc_dmacopy_all_exchange_bank(ObjectExchangeBank* objectExchangeBank);
void mSc_dmacopy_all_exchange_bank_sub(ObjectStatus* status, ObjectExchangeBank* objectExchangeBank, s32 idx);
void mSc_dmacopy_all_exchange_bank(ObjectExchangeBank* exchange);
void mSc_data_bank_ct(struct Game_Play* game_play, ObjectExchangeBank* objectExchangeBank);
void mSc_decide_exchange_bank(ObjectExchangeBank* objectExchangeBank);
// void func_800C6690_jp();
void Scene_ct(struct Game_Play* game_play, void* arg1);
// void func_800C6960_jp();
void Scene_Proc_Ctrl_Actor_Ptr(struct Game_Play* game_play, MSceneUnkStruct* arg1);
void Scene_Proc_Actor_Ptr(struct Game_Play* game_play, MSceneUnkStruct* arg1);
void Scene_Proc_Object_Exchange_Bank_Ptr(struct Game_Play* game_play, MSceneUnkStruct* arg1);
void Scene_Proc_Door_Data_Ptr(struct Game_Play* game_play, MSceneUnkStruct* arg1);
void Door_info_ct(s8* arg0);
void Scene_Proc_Sound(UNK_TYPE arg0, UNK_TYPE arg1);
// void func_800C6AE0_jp();
// void func_800C6B50_jp();
// void func_800C6BB0_jp();
// void func_800C6BD4_jp();
// void func_800C6BF8_jp();
// void func_800C6C10_jp();
// void func_800C6D14_jp();
// void func_800C6D5C_jp();
// void func_800C6E14_jp();
void Scene_player_select(s32 sceneNo, s32 npcActor);
void Scene_ct(struct Game_Play* play, SceneData* sceneData);
void Scene_Proc_Player_Ptr(struct Game_Play* play, SceneData* scene_data);
void Scene_Proc_CtrlActor_Ptr(struct Game_Play* play, SceneData* scene_data);
void Scene_Proc_Actor_Ptr(struct Game_Play* play, SceneData* scene_data);
void Scene_Proc_Object_Exchange_Bank_Ptr(struct Game_Play* play, SceneData* scene_data);
void Scene_Proc_Door_Data_Ptr(struct Game_Play* play, SceneData* scene_data);
void Door_info_ct(DoorInfo* door_info);
void Scene_Proc_Sound(struct Game_Play* play, SceneData* scene_data);
void set_item_info(struct Game_Play* play, SceneDataField* field);
void Scene_Proc_Field_ct(struct Game_Play* play, SceneData* scene_data);
void Scene_Proc_ArrangeRoom_ct(struct Game_Play* play, SceneData* data);
void Scene_Proc_ArrangeFurniture_ct(struct Game_Play* play, SceneData* data);
s32 goto_other_scene(struct Game_Play* play, DoorData* door_data, s32 updatePlayer);
s32 goto_next_scene(struct Game_Play* play, s32 nextScene, s32 updatePlayer);
s32 goto_emu_game(struct Game_Play* play, s16 famicomRomId);
void return_emu_game(struct Game* game);
#endif
+9 -2
View File
@@ -3,7 +3,13 @@
#include "ultra64.h"
#include "z64math.h"
#include "unknown_structs.h"
typedef struct SceneDmaStatus {
/* 0x00 */ RomOffset vromStart;
/* 0x04 */ RomOffset vromEnd;
/* 0x08 */ char unk08[0xB];
/* 0x13 */ u8 unk_13;
} SceneDmaStatus;
typedef enum SceneTable {
/* 00 */ SCENE_TEST1,
@@ -43,6 +49,7 @@ typedef enum SceneTable {
/* 34 */ SCENE_PLAYERSELECT_SAVE,
/* 35 */ SCENE_NUM
} SceneTable;
extern Struct_8010EAA0 scene_data_status[];
extern SceneDmaStatus scene_data_status[];
#endif
+1 -1
View File
@@ -118,7 +118,7 @@ u32 mSM_check_open_inventory_itemlist(InventoryItemList itemlist, s32 arg1) ;
// void mSM_Object_Exchange_keep_new();
// void mSM_Object_Exchange_keep_new_MenuTexAndPallet();
// void mSM_Object_Exchange_keep_new_Menu();
void mSM_Object_Exchange_keep_new_Menu(struct Game_Play*);
// void mSM_Get_ground_tex_p();
// void mSM_Get_ground_pallet_p();
-7
View File
@@ -7,13 +7,6 @@
#include "unk.h"
#include "other_types.h"
typedef struct Struct_8010EAA0 {
/* 0x00 */ RomOffset unk_00;
/* 0x04 */ RomOffset unk_04;
/* 0x08 */ char unk08[0xB];
/* 0x13 */ u8 unk_13;
} Struct_8010EAA0; // size = 0x14
typedef struct struct_801161E8_jp {
/* 0x0 */ UNK_TYPE1 unk_0[0x8];
} struct_801161E8_jp; // size <= 0x8
+14 -14
View File
@@ -1283,7 +1283,7 @@ func_80086DE0_jp = 0x80086DE0; // type:func
func_80086E30_jp = 0x80086E30; // type:func
func_80086F08_jp = 0x80086F08; // type:func
func_80086FA8_jp = 0x80086FA8; // type:func
func_80086FEC_jp = 0x80086FEC; // type:func
mFM_SetFieldInitData = 0x80086FEC; // type:func
func_80087004_jp = 0x80087004; // type:func
func_80087280_jp = 0x80087280; // type:func
func_80087380_jp = 0x80087380; // type:func
@@ -2564,7 +2564,7 @@ func_800B22A4_jp = 0x800B22A4; // type:func
func_800B22D0_jp = 0x800B22D0; // type:func
func_800B22FC_jp = 0x800B22FC; // type:func
func_800B2350_jp = 0x800B2350; // type:func
func_800B23A4_jp = 0x800B23A4; // type:func
mPlib_request_main_invade_type1 = 0x800B23A4; // type:func
func_800B23DC_jp = 0x800B23DC; // type:func
func_800B2414_jp = 0x800B2414; // type:func
func_800B2450_jp = 0x800B2450; // type:func
@@ -2934,9 +2934,9 @@ mRmTp_DrawFamicomInfo = 0x800BF27C; // type:func
mRmTp_MakeFamicom_Fdebug = 0x800BF338; // type:func
func_800BF410_jp = 0x800BF410; // type:func
func_800BF480_jp = 0x800BF480; // type:func
func_800BF4F4_jp = 0x800BF4F4; // type:func
mScn_ObtainCarpetBank = 0x800BF4F4; // type:func
func_800BF56C_jp = 0x800BF56C; // type:func
func_800BF580_jp = 0x800BF580; // type:func
mScn_ObtainMyRoomBank = 0x800BF580; // type:func
func_800BF5A0_jp = 0x800BF5A0; // type:func
func_800BF5F4_jp = 0x800BF5F4; // type:func
func_800BF770_jp = 0x800BF770; // type:func
@@ -3091,11 +3091,11 @@ mSc_dmacopy_data_bank = 0x800C5F64; // type:func
mSc_bank_regist_check = 0x800C60EC; // type:func
func_800C6144_jp = 0x800C6144; // type:func
mSc_regist_initial_exchange_bank = 0x800C61CC; // type:func
func_800C62C4_jp = 0x800C62C4; // type:func
mSc_dmacopy_all_exchange_bank_sub = 0x800C62C4; // type:func
mSc_dmacopy_all_exchange_bank = 0x800C639C; // type:func
mSc_data_bank_ct = 0x800C65E4; // type:func
mSc_decide_exchange_bank = 0x800C6678; // type:func
func_800C6690_jp = 0x800C6690; // type:func
Scene_player_select = 0x800C6690; // type:func
Scene_ct = 0x800C68C8; // type:func
Scene_Proc_Player_Ptr = 0x800C6960; // type:func
Scene_Proc_Ctrl_Actor_Ptr = 0x800C69F4; // type:func
@@ -3104,14 +3104,14 @@ Scene_Proc_Object_Exchange_Bank_Ptr = 0x800C6A5C; // type:func
Scene_Proc_Door_Data_Ptr = 0x800C6A90; // type:func
Door_info_ct = 0x800C6AC4; // type:func
Scene_Proc_Sound = 0x800C6AD0; // type:func
func_800C6AE0_jp = 0x800C6AE0; // type:func
func_800C6B50_jp = 0x800C6B50; // type:func
func_800C6BB0_jp = 0x800C6BB0; // type:func
func_800C6BD4_jp = 0x800C6BD4; // type:func
func_800C6BF8_jp = 0x800C6BF8; // type:func
func_800C6C10_jp = 0x800C6C10; // type:func
func_800C6D14_jp = 0x800C6D14; // type:func
func_800C6D5C_jp = 0x800C6D5C; // type:func
set_item_info = 0x800C6AE0; // type:func
Scene_Proc_Field_ct = 0x800C6B50; // type:func
Scene_Proc_MyRoom_ct = 0x800C6BB0; // type:func
Scene_Proc_ArrangeRoom_ct = 0x800C6BD4; // type:func
Scene_Proc_ArrangeFurniture_ct = 0x800C6BF8; // type:func
goto_other_scene = 0x800C6C10; // type:func
goto_next_scene = 0x800C6D14; // type:func
goto_emu_game = 0x800C6D5C; // type:func
return_emu_game = 0x800C6E14; // type:func
Skin_Matrix_PrjMulVector = 0x800C6E80; // type:func
Skin_Matrix_MulVector = 0x800C6F68; // type:func
+1 -1
View File
@@ -199,7 +199,7 @@ draw_version = 0x80803E40; // type:func
Game_play_draw = 0x80803F48; // type:func
play_main = 0x8080407C; // type:func
func_80804138_jp = 0x80804138; // type:func
func_808041A4_jp = 0x808041A4; // type:func
VR_Box_ct = 0x808041A4; // type:func
Gameplay_Scene_Init = 0x808041C4; // type:func
mPl_SceneNo2SoundRoomType = 0x80804240; // type:func
Gameplay_Scene_Read = 0x80804288; // type:func
+484 -103
View File
@@ -1,3 +1,4 @@
#include "overlays/actors/ovl_Weather/ac_weather.h"
#include "unk.h"
#include "libc/stdint.h"
#include "m_scene.h"
@@ -11,6 +12,10 @@
#include "m_object.h"
#include "m_player_lib.h"
#include "m_std_dma.h"
#include "m_scene_table.h"
#include "6E30B0.h"
#include "m_player_lib.h"
#include "overlays/actors/player_actor/m_player.h"
s32 func_800C59B0_jp(ObjectExchangeBank* objectExchangeBank) {
ObjectStatus* objectStatus = &objectExchangeBank->status[objectExchangeBank->unk17FC];
@@ -51,36 +56,34 @@ s32 func_800C5A08_jp(ObjectExchangeBank* objectExchangeBank) {
}
s32 func_800C5A60_jp(ObjectExchangeBank* objectExchangeBank) {
s32 temp_v0;
s32 var_v1;
s32 ret;
temp_v0 = func_800C59B0_jp(objectExchangeBank);
var_v1 = temp_v0;
ret = func_800C59B0_jp(objectExchangeBank);
if (temp_v0 == -1) {
var_v1 = func_800C5A08_jp(objectExchangeBank);
if (ret == -1) {
ret = func_800C5A08_jp(objectExchangeBank);
}
return var_v1;
return ret;
}
s32 func_800C5AA0_jp(ObjectStatus* objectStatus, ObjectExchangeBank* objectExchangeBank, s16 objectBankIndex) {
s32 ret = 1;
s32 objectSize = gObjectTable[objectBankIndex].vromEnd - gObjectTable[objectBankIndex].vromStart;
u32 temp_t0 = (objectExchangeBank->unk1800 + objectSize + 0xF) & ~0xF;
u32 alignedSize = ALIGN16(objectExchangeBank->unk1800 + objectSize);
if (temp_t0 >= objectExchangeBank->unk1804) {
if (alignedSize >= objectExchangeBank->unk1804) {
ret = 0;
} else {
objectStatus->id = -objectBankIndex;
objectStatus->unk_08 = objectExchangeBank->unk1800;
objectStatus->vram = (void*)objectExchangeBank->unk1800;
objectStatus->segment = 0;
objectStatus->vrom = gObjectTable[objectBankIndex].vromStart;
objectStatus->size = objectSize;
objectStatus->unk50 = 0;
objectStatus->unk53 = 1;
objectExchangeBank->unk1800 = temp_t0;
objectExchangeBank->unk1800 = alignedSize;
}
return ret;
@@ -89,17 +92,16 @@ s32 func_800C5AA0_jp(ObjectStatus* objectStatus, ObjectExchangeBank* objectExcha
void mSc_set_bank_status_after(ObjectStatus* objectStatus) {
objectStatus->id = (objectStatus->id >= 0) ? objectStatus->id : -objectStatus->id;
objectStatus->unk53 = 0;
objectStatus->segment = (void*)objectStatus->unk_08;
objectStatus->segment = objectStatus->vram;
}
void mSc_clear_bank_status(ObjectStatus* objectStatus) {
objectStatus->id = 0;
objectStatus->size = 0;
objectStatus->unk_08 = 0;
objectStatus->segment = 0;
objectStatus->vram = NULL;
objectStatus->segment = NULL;
}
// object_spawn equivalent
s32 func_800C5B74_jp(ObjectExchangeBank* objectExchangeBank, s16 id) {
s32 ret = 0;
@@ -107,9 +109,7 @@ s32 func_800C5B74_jp(ObjectExchangeBank* objectExchangeBank, s16 id) {
ObjectStatus* objectStatus = &objectExchangeBank->status[objectExchangeBank->num];
if (func_800C5AA0_jp(objectStatus, objectExchangeBank, id) == 1) {
DmaMgr_RequestSyncDebug((void*)objectStatus->unk_08, objectStatus->vrom, objectStatus->size, "../m_scene.c",
317);
DmaMgr_RequestSyncDebug(objectStatus->vram, objectStatus->vrom, objectStatus->size, "../m_scene.c", 317);
mSc_set_bank_status_after(objectStatus);
objectStatus->unk50 = 1;
objectExchangeBank->num++;
@@ -120,7 +120,7 @@ s32 func_800C5B74_jp(ObjectExchangeBank* objectExchangeBank, s16 id) {
return ret;
}
void Object_Exchange_keep_new_Player(s32 arg0) {
void Object_Exchange_keep_new_Player(Game_Play* arg0) {
func_800B1784_jp(arg0);
func_800B190C_jp(arg0);
func_800B190C_jp(arg0);
@@ -138,14 +138,14 @@ u32 mSc_secure_exchange_keep_bank(ObjectExchangeBank* objectExchangeBank, s16 id
u32 ret = 0;
if (objectExchangeBank->num < OBJECT_EXCHANGE_BANK_MAX) {
ret = (objectExchangeBank->unk1800 + size + 0xF) & ~0xF;
ret = ALIGN16(objectExchangeBank->unk1800 + size);
if (ret >= objectExchangeBank->unk1804) {
ret = 0;
} else {
objectStatus->id = id;
objectStatus->segment = (void*)objectExchangeBank->unk1800;
objectStatus->unk_08 = objectExchangeBank->unk1800;
objectStatus->vram = (void*)objectExchangeBank->unk1800;
objectStatus->vrom = 0;
objectStatus->size = size;
objectStatus->unk50 = 0;
@@ -158,45 +158,116 @@ u32 mSc_secure_exchange_keep_bank(ObjectExchangeBank* objectExchangeBank, s16 id
return ret;
}
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C5D68_jp.s")
s32 func_800C5D68_jp(ObjectExchangeBank* objectExchangeBank) {
ObjectStatus* objectStatus;
s32 res = objectExchangeBank->unk181C;
if (common_data.unk_10001 == 0) {
s32 i;
objectStatus = &objectExchangeBank->status[objectExchangeBank->unk17FC];
res = (objectExchangeBank->unk181C + 1) % 2;
for (i = objectExchangeBank->unk17FC; i < OBJECT_EXCHANGE_BANK_MAX; i++) {
if ((objectStatus->id != 0) && (res == objectStatus->unk52) &&
((objectStatus->unk50 != 0) || (objectStatus->unk53 != 0))) {
res = objectExchangeBank->unk181C;
break;
}
objectStatus++;
}
}
return res;
}
void func_800C5E10_jp(ObjectExchangeBank* objectExchangeBank) {
s32 temp_s3 = objectExchangeBank->unk181C;
s32 var_s1 = objectExchangeBank->unk17FC;
s32 statusIndex = objectExchangeBank->unk17FC;
ObjectStatus* objectStatus = &objectExchangeBank->status[objectExchangeBank->unk17FC];
if (var_s1 < OBJECT_EXCHANGE_BANK_MAX) {
if (statusIndex < OBJECT_EXCHANGE_BANK_MAX) {
do {
if ((objectStatus->id != 0) && (temp_s3 == objectStatus->unk52)) {
mSc_clear_bank_status(objectStatus);
objectStatus++;
}
var_s1++;
} while (var_s1 < OBJECT_EXCHANGE_BANK_MAX);
statusIndex++;
} while (statusIndex < OBJECT_EXCHANGE_BANK_MAX);
}
}
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C5EA0_jp.s")
void func_800C5EA0_jp(ObjectExchangeBank* objectExchangeBank) {
if (objectExchangeBank->unk1820 == 1) {
s32 res = func_800C5D68_jp(objectExchangeBank);
if (res != objectExchangeBank->unk181C) {
objectExchangeBank->unk181C = res;
objectExchangeBank->unk1800 = objectExchangeBank->unk1808[res];
objectExchangeBank->unk1804 = objectExchangeBank->unk1810[res];
func_800C5E10_jp(objectExchangeBank);
}
objectExchangeBank->unk1820 = 0;
}
}
s32 func_800C5F0C_jp(ObjectStatus* objectStatus, ObjectExchangeBank* objectExchangeBank) {
s32 var_v1 = 1;
u32 temp_v0 = (objectExchangeBank->unk1800 + objectStatus->size + 0xF) & ~0xF;
s32 res = 1;
u32 alignedRam = ALIGN16(objectExchangeBank->unk1800 + objectStatus->size);
if (temp_v0 >= (u32)objectExchangeBank->unk1804) {
var_v1 = 0;
if (alignedRam >= (u32)objectExchangeBank->unk1804) {
res = 0;
} else {
objectStatus->unk_08 = objectExchangeBank->unk1800;
objectStatus->vram = (void*)objectExchangeBank->unk1800;
objectStatus->unk52 = objectExchangeBank->unk181C;
objectStatus->unk53 = 1;
objectStatus->unk14 = 0;
objectExchangeBank->unk1800 = temp_v0;
objectStatus->unk14.vrom = 0;
objectExchangeBank->unk1800 = alignedRam;
}
return var_v1;
return res;
}
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/mSc_dmacopy_data_bank.s")
void mSc_dmacopy_data_bank(ObjectExchangeBank* objectExchangeBank) {
s32 i;
OSMesgQueue* msgq;
ObjectStatus* objectStatus = objectExchangeBank->status;
func_800C5EA0_jp(objectExchangeBank);
for (i = 0; i < OBJECT_EXCHANGE_BANK_MAX; i++) {
if ((i >= objectExchangeBank->unk17FC) && (objectStatus->id != 0) &&
(objectStatus->unk52 != objectExchangeBank->unk181C)) {
if (objectStatus->unk50 != 0) {
if (objectStatus->unk53 != 2) {
func_800C5F0C_jp(objectStatus, objectExchangeBank);
}
} else if (objectStatus->unk53 == 0) {
mSc_clear_bank_status(objectStatus);
}
}
switch (objectStatus->unk53) {
case 1:
msgq = &objectStatus->unk34;
if (objectStatus->unk14.vrom == 0) {
osCreateMesgQueue(msgq, (OSMesg)&objectStatus->unk4C, 1);
DmaMgr_RequestAsync(&objectStatus->unk14, objectStatus->vram, objectStatus->vrom,
objectStatus->size, 0, msgq, NULL, "../m_scene.c", 613);
objectStatus->unk53 = 2;
}
break;
case 2:
msgq = &objectStatus->unk34;
if (osRecvMesg(msgq, NULL, OS_MESG_NOBLOCK) == 0) {
mSc_set_bank_status_after(objectStatus);
}
break;
}
objectStatus++;
}
}
s32 mSc_bank_regist_check(ObjectExchangeBank* objectExchangeBank, s16 id) {
ObjectStatus* objectStatus;
@@ -216,17 +287,17 @@ s32 mSc_bank_regist_check(ObjectExchangeBank* objectExchangeBank, s16 id) {
}
s32 func_800C6144_jp(ObjectExchangeBank* objectExchangeBank, s16 arg1) {
s32 temp_v0;
s32 idx;
s32 ret = 0;
temp_v0 = func_800C5A60_jp(objectExchangeBank);
idx = func_800C5A60_jp(objectExchangeBank);
if (temp_v0 != -1) {
ObjectStatus* temp_a0 = &objectExchangeBank->status[temp_v0];
if (idx != -1) {
ObjectStatus* status = &objectExchangeBank->status[idx];
if (func_800C5AA0_jp(temp_a0, objectExchangeBank, arg1) == 1) {
temp_a0->unk14 = 0;
temp_a0->unk52 = objectExchangeBank->unk181C;
if (func_800C5AA0_jp(status, objectExchangeBank, arg1) == 1) {
status->unk14.vrom = 0;
status->unk52 = objectExchangeBank->unk181C;
ret = 1;
}
}
@@ -237,62 +308,146 @@ s32 func_800C6144_jp(ObjectExchangeBank* objectExchangeBank, s16 arg1) {
void mSc_regist_initial_exchange_bank(Game_Play* game_play) {
ObjectExchangeBank* objectExchangeBank = &game_play->objectExchangeBank;
s16* var_s1 = game_play->unk_1EB4;
s32 var_s2;
s32 i;
objectExchangeBank->unk181C = 0;
var_s2 = 0;
i = 0;
objectExchangeBank->unk17FC = objectExchangeBank->num;
if (game_play->unk_1EA7 > 0) {
do {
func_800C6144_jp(objectExchangeBank, *var_s1);
var_s2 += 1;
i += 1;
var_s1 += 1;
objectExchangeBank->num += 1;
} while (var_s2 < game_play->unk_1EA7);
} while (i < game_play->unk_1EA7);
}
if (common_data.unk_10001 == 0) {
//! FAKE
u32 temp = ((u32)(objectExchangeBank->unk1804 - objectExchangeBank->unk1800) >> 1);
s32 temp_v0 = (objectExchangeBank->unk1800 + temp + 0xF) & ~0xF;
u32 size = ((u32)(objectExchangeBank->unk1804 - objectExchangeBank->unk1800) / 2);
s32 ram = ALIGN16(objectExchangeBank->unk1800 + size);
objectExchangeBank->unk1814 = objectExchangeBank->unk1804;
objectExchangeBank->unk1810 = temp_v0;
objectExchangeBank->unk180C = temp_v0;
objectExchangeBank->unk1804 = temp_v0;
temp = objectExchangeBank->unk1800;
objectExchangeBank->unk1808 = temp;
objectExchangeBank->unk1810[1] = objectExchangeBank->unk1804;
objectExchangeBank->unk1810[0] = ram;
objectExchangeBank->unk1808[1] = ram;
objectExchangeBank->unk1804 = ram;
size = objectExchangeBank->unk1800;
objectExchangeBank->unk1808[0] = size;
} else {
objectExchangeBank->unk1808 = objectExchangeBank->unk1800;
objectExchangeBank->unk180C = objectExchangeBank->unk1800;
objectExchangeBank->unk1810 = objectExchangeBank->unk1804;
objectExchangeBank->unk1814 = objectExchangeBank->unk1804;
objectExchangeBank->unk1808[0] = objectExchangeBank->unk1800;
objectExchangeBank->unk1808[1] = objectExchangeBank->unk1800;
objectExchangeBank->unk1810[0] = objectExchangeBank->unk1804;
objectExchangeBank->unk1810[1] = objectExchangeBank->unk1804;
}
objectExchangeBank->unk17FC = objectExchangeBank->num;
}
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C62C4_jp.s")
void mSc_dmacopy_all_exchange_bank_sub(ObjectStatus* status, ObjectExchangeBank* objectExchangeBank, s32 idx) {
if (idx >= objectExchangeBank->unk17FC) {
u32 area = (u32)ALIGN16(objectExchangeBank->unk1800 + status->size);
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/mSc_dmacopy_all_exchange_bank.s")
if (area >= objectExchangeBank->unk1804) {
objectExchangeBank->unk181C = (objectExchangeBank->unk181C + 1) % 2;
objectExchangeBank->unk1800 = objectExchangeBank->unk1808[objectExchangeBank->unk181C];
objectExchangeBank->unk1804 = objectExchangeBank->unk1810[objectExchangeBank->unk181C];
area = (u32)ALIGN16(objectExchangeBank->unk1800 + status->size);
}
status->vram = (void*)objectExchangeBank->unk1800;
status->unk52 = objectExchangeBank->unk181C;
objectExchangeBank->unk1800 = area;
}
DmaMgr_RequestSyncDebug(status->vram, status->vrom, status->size, "../m_scene.c", 828);
mSc_set_bank_status_after(status);
}
void mSc_dmacopy_all_exchange_bank(ObjectExchangeBank* exchange) {
ObjectStatus* bank;
s32 i;
bank = &exchange->status[exchange->unk17F8];
exchange->unk1800 = exchange->unk1808[exchange->unk181C];
for (i = exchange->unk17F8; i < OBJECT_EXCHANGE_BANK_MAX; i++) {
if (bank->id != 0 && bank->unk53 != 3) {
if (bank->id < 0) {
mSc_dmacopy_all_exchange_bank_sub(bank, exchange, i);
} else if (bank->unk50 != 0) {
mSc_dmacopy_all_exchange_bank_sub(bank, exchange, i);
} else if (i >= exchange->unk17FC) {
mSc_clear_bank_status(bank);
} else {
bank->id = 0;
}
}
bank++;
}
if (common_data.clip.unk_08C != NULL) {
if (common_data.clip.unk_08C->unk_A4 != NULL) {
common_data.clip.unk_08C->unk_A4(exchange);
}
}
if (common_data.clip.unk_040 != NULL) {
common_data.clip.unk_040->unk_E8();
}
if (common_data.clip.unk_07C != NULL) {
if (common_data.clip.unk_07C->unk_4 != NULL) {
common_data.clip.unk_07C->unk_4(exchange);
}
}
if (common_data.clip.unk_0A8 != NULL) {
if (common_data.clip.unk_0A8->unk_4 != NULL) {
common_data.clip.unk_0A8->unk_4(exchange);
}
}
if (common_data.clip.unk_068 != NULL) {
common_data.clip.unk_068();
}
if (common_data.clip.unk_060 != NULL) {
common_data.clip.unk_060->unk_4();
}
if (common_data.clip.unk_070 != NULL) {
common_data.clip.unk_070->unk_C();
}
if (common_data.clip.weatherClip != NULL) {
common_data.clip.weatherClip->changingWeather();
}
if (common_data.clip.unk_080 != NULL) {
common_data.clip.unk_080->unk_24();
}
if (common_data.clip.unk_09C != NULL) {
common_data.clip.unk_09C->unk_C();
}
if (common_data.clip.unk_0B8 != NULL) {
common_data.clip.unk_0B8->unk_4();
}
if (common_data.clip.unk_0B4 != NULL) {
common_data.clip.unk_0B4->unk_4();
}
if (common_data.clip.unk_0D0 != NULL) {
common_data.clip.unk_0D0();
}
}
void mSc_data_bank_ct(Game_Play* game_play, ObjectExchangeBank* objectExchangeBank) {
u32 temp_v0;
u32 temp_v1;
bzero(objectExchangeBank, 0x1824);
bzero(objectExchangeBank, sizeof(ObjectExchangeBank));
objectExchangeBank->unk17F8 = -1;
objectExchangeBank->unk17FC = -1;
temp_v0 = (u32)THA_alloc16(&game_play->state.heap, 0x93400);
temp_v1 = temp_v0 + 0x93400;
objectExchangeBank->unk1800 = temp_v0;
objectExchangeBank->unk1808 = temp_v0;
objectExchangeBank->unk180C = temp_v0;
objectExchangeBank->unk1804 = temp_v1;
objectExchangeBank->unk1810 = temp_v1;
objectExchangeBank->unk1814 = temp_v1;
objectExchangeBank->unk1808[0] = temp_v0;
objectExchangeBank->unk1808[1] = temp_v0;
temp_v0 = temp_v0 + 0x93400;
objectExchangeBank->unk1804 = temp_v0;
objectExchangeBank->unk1810[0] = temp_v0;
objectExchangeBank->unk1810[1] = temp_v0;
func_800C5B74_jp(objectExchangeBank, GAMEPLAY_KEEP);
gSegments[4] = (uintptr_t)OS_PHYSICAL_TO_K0(objectExchangeBank->status[0].segment);
}
@@ -302,65 +457,291 @@ void mSc_decide_exchange_bank(ObjectExchangeBank* objectExchangeBank) {
objectExchangeBank->unk1818 = (void*)objectExchangeBank->unk1800;
}
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6690_jp.s")
void Scene_player_select(s32 sceneNo, s32 npcActor) {
Animal_c* animal;
s32 metVillagersNum;
s32 i;
u16 npcId;
s32 found;
s32 j;
s32 metVillagersBitfield;
s32 selected;
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/Scene_ct.s")
metVillagersBitfield = 0;
animal = common_data.animals;
if (sceneNo != common_data.sceneNo) {
return;
}
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/Scene_Proc_Player_Ptr.s")
metVillagersNum = 0;
{ UNUSED s32 scopedTemp; }
void Scene_Proc_Ctrl_Actor_Ptr(Game_Play* game_play, MSceneUnkStruct* arg1) {
void* temp = arg1->unk4;
for (i = 0; i < ANIMAL_NUM_MAX; i++) {
if (mNpc_CheckFreeAnimalPersonalID(&animal->id) == FALSE) {
Anmmem_c* memory = animal->memories;
game_play->unk_1EA6 = arg1->unk1;
game_play->unk_1EB0 = Lib_SegmentedToVirtual(temp);
for (j = 0; j < ANIMAL_MEMORY_NUM; j++) {
if (memory->memoryPlayerId.landId == common_data.landInfo.id &&
mLd_CheckCmpLandName(memory->memoryPlayerId.landName, common_data.landInfo.name) == TRUE) {
metVillagersBitfield |= 1 << i;
metVillagersNum++;
break;
}
memory++;
}
}
animal++;
}
/* Roll a random villager if none have met a player in town before */
if (metVillagersNum == 0) {
do {
selected = RANDOM(ANIMAL_NUM_MAX);
} while (mNpc_CheckFreeAnimalPersonalID(&common_data.animals[selected].id));
if (1) {};
npcId = common_data.animals[selected].id.npcId;
found = mNpc_SearchAnimalinfo(common_data.animals, npcId, ANIMAL_NUM_MAX);
} else {
/* Pick a random villager which has met a player in town */
selected = RANDOM(metVillagersNum);
for (found = 0; found < ANIMAL_NUM_MAX; found++) {
if (metVillagersBitfield & 1) {
if (selected == 0) {
break;
}
selected--;
}
metVillagersBitfield >>= 1;
}
npcId = common_data.animals[found].id.npcId;
}
mNpc_RegistEventNpc(npcActor, npcId, npcId, common_data.animals[found].cloth);
}
void Scene_Proc_Actor_Ptr(Game_Play* game_play, MSceneUnkStruct* arg1) {
void* temp = arg1->unk4;
void Scene_Proc_Player_Ptr(Game_Play* play, SceneData* data);
void Scene_Proc_Ctrl_Actor_Ptr(Game_Play* play, SceneData* data);
void Scene_Proc_Actor_Ptr(Game_Play* play, SceneData* data);
void Scene_Proc_Object_Exchange_Bank_Ptr(Game_Play* play, SceneData* data);
void Scene_Proc_Door_Data_Ptr(Game_Play* play, SceneData* data);
void Scene_Proc_Field_ct(Game_Play* play, SceneData* data);
void Scene_Proc_MyRoom_ct(Game_Play* play, SceneData* data);
void Scene_Proc_ArrangeRoom_ct(Game_Play* play, SceneData* data);
void Scene_Proc_ArrangeFurniture_ct(Game_Play* play, SceneData* data);
void Scene_Proc_Sound(Game_Play* play, SceneData* data);
game_play->unk_1EA5 = arg1->unk1;
game_play->unk_1EAC = Lib_SegmentedToVirtual(temp);
typedef void (*SceneDataProc)(Game_Play*, SceneData*);
void Scene_ct(Game_Play* play, SceneData* sceneData) {
static SceneDataProc Scene_Proc[] = {
&Scene_Proc_Player_Ptr,
&Scene_Proc_Ctrl_Actor_Ptr,
&Scene_Proc_Actor_Ptr,
&Scene_Proc_Object_Exchange_Bank_Ptr,
&Scene_Proc_Door_Data_Ptr,
&Scene_Proc_Field_ct,
&Scene_Proc_MyRoom_ct,
&Scene_Proc_ArrangeRoom_ct,
&Scene_Proc_ArrangeFurniture_ct,
&Scene_Proc_Sound,
NULL,
};
while (TRUE) {
u32 type = sceneData->misc.type;
if (type == 10) {
break;
}
if (type < 11) {
Scene_Proc[type](play, sceneData);
}
sceneData++;
}
/* Setup player select actors */
Scene_player_select(SCENE_PLAYERSELECT_2, 0xD01F); // load
Scene_player_select(SCENE_PLAYERSELECT_SAVE, 0xD06A); // save
}
void Scene_Proc_Object_Exchange_Bank_Ptr(Game_Play* game_play, MSceneUnkStruct* arg1) {
game_play->unk_1EA7 = arg1->unk1;
game_play->unk_1EB4 = Lib_SegmentedToVirtual(arg1->unk4);
void Scene_Proc_Player_Ptr(Game_Play* play, SceneData* scene_data) {
static s16 angle_table[] = {
0x0000, 0x2000, 0x4000, 0x6000, 0x8000, 0xA000, 0xC000, 0xE000,
};
ActorEntry* data = Lib_SegmentedToVirtual(scene_data->actor.actorDataPtr);
play->unk_1EA8 = data;
if (common_data.doorData.nextSceneId != 0) {
mem_copy((u8*)&data->pos, (u8*)&common_data.doorData.exitPos, sizeof(s_xyz));
data->rot.y = angle_table[common_data.doorData.exitOrientation];
}
data->params = common_data.doorData.params;
Object_Exchange_keep_new_Player(play);
mSM_Object_Exchange_keep_new_Menu(play);
}
void Scene_Proc_Door_Data_Ptr(Game_Play* game_play, MSceneUnkStruct* arg1) {
UNK_PTR temp = arg1->unk4;
void Scene_Proc_Ctrl_Actor_Ptr(Game_Play* play, SceneData* scene_data) {
s16* data = scene_data->controlActor.ctrlActorDataPtr;
game_play->unk_1E10 = arg1->unk1;
game_play->unk_1E14 = Lib_SegmentedToVirtual(temp);
play->unk_1EA6 = scene_data->controlActor.numCtrlActors;
play->unk_1EB0 = Lib_SegmentedToVirtual(data);
}
void Door_info_ct(s8* arg0) {
*arg0 = 0;
void Scene_Proc_Actor_Ptr(Game_Play* play, SceneData* scene_data) {
ActorEntry* data = scene_data->actor.actorDataPtr;
play->unk_1EA5 = scene_data->actor.numActors;
play->unk_1EAC = Lib_SegmentedToVirtual(data);
}
void Scene_Proc_Sound(UNK_TYPE arg0 UNUSED, UNK_TYPE arg1 UNUSED) {
void Scene_Proc_Object_Exchange_Bank_Ptr(Game_Play* play, SceneData* scene_data) {
play->unk_1EA7 = scene_data->objectBank.numBanks;
play->unk_1EB4 = Lib_SegmentedToVirtual(scene_data->objectBank.banksDataPtr);
}
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6AE0_jp.s")
void Scene_Proc_Door_Data_Ptr(Game_Play* play, SceneData* scene_data) {
DoorData* data = scene_data->doorData.doorDataPtr;
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6B50_jp.s")
play->sceneDoorInfo.numDoors = scene_data->doorData.numDoors;
play->sceneDoorInfo.doorDataPtr = Lib_SegmentedToVirtual(data);
}
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6BB0_jp.s")
void Door_info_ct(DoorInfo* door_info) {
door_info->numDoors = 0;
}
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6BD4_jp.s")
void Scene_Proc_Sound(UNUSED Game_Play* play, UNUSED SceneData* scene_data) {
}
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6BF8_jp.s")
void set_item_info(Game_Play* play, SceneDataField* field) {
s16 bank;
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6C10_jp.s")
static s16 profile_table[4] = { 0x1, 0xB4, 0x4E, 0x52 };
s32 itemType = field->itemType;
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6D14_jp.s")
if (itemType == 0) {
bank = common_data.time.bgitemBank;
common_data.unk_1014E = common_data.time.bgitemProfile;
} else {
bank = -1;
common_data.unk_1014E = profile_table[itemType];
}
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6D5C_jp.s")
common_data.unk_1014C = itemType;
if (bank != -1) {
func_800C5B74_jp(&play->objectExchangeBank, bank);
}
}
void Scene_Proc_Field_ct(Game_Play* play, SceneData* scene_data) {
mFM_SetFieldInitData(scene_data->field.bgNum, scene_data->field.bgDispSize);
set_item_info(play, &scene_data->field);
common_data.unk_10002 = scene_data->field.drawType;
common_data.unk_10000 = FALSE;
common_data.unk_104AC = TRUE;
common_data.sunlightFlag = TRUE;
}
void Scene_Proc_MyRoom_ct(Game_Play* play, UNUSED SceneData* data) {
mScn_ObtainMyRoomBank(play);
}
void Scene_Proc_ArrangeRoom_ct(Game_Play* play, UNUSED SceneData* data) {
mScn_ObtainCarpetBank(play);
}
void Scene_Proc_ArrangeFurniture_ct(UNUSED Game_Play* play, SceneData* data) {
common_data.clip.unk_020 = data->arrangeFtr.arrangeFtrNum;
}
s32 goto_other_scene(Game_Play* play, DoorData* door_data, s32 updatePlayer) {
Player* player = get_player_actor_withoutCheck(play);
s32 res = 0;
if (player != NULL) {
if (play->unk_1EE3 == 0) {
play->unk_1EE0 = 2;
if (door_data->wipeType == 0) {
play->unk_1EE1 = 3;
} else {
play->unk_1EE1 = door_data->wipeType;
}
if (common_data.unk_1014B == 0xFF) {
common_data.unk_1014B = play->unk_1EE1;
}
common_data.doorData = *door_data;
common_data.doorData.nextSceneId = door_data->nextSceneId + 1;
play->unk_1E18 = door_data->nextSceneId;
if (updatePlayer) {
mPlib_request_main_invade_type1(play);
}
restore_fgdata_all(play);
play->state.unk_74 = FALSE;
res = 1;
} else {
res = 2;
}
}
return res;
}
s32 goto_next_scene(Game_Play* play, s32 nextScene, s32 updatePlayer) {
s32 res = FALSE;
if (play->sceneDoorInfo.numDoors != 0) {
res = goto_other_scene(play, play->sceneDoorInfo.doorDataPtr + nextScene, updatePlayer);
}
return res;
}
s32 goto_emu_game(Game_Play* play, s16 famicomRomId) {
Player* player = get_player_actor_withoutCheck(play);
s32 res = FALSE;
if (player != NULL) {
DoorData* door_data;
play->unk_1EE0 = 3;
play->unk_1EE1 = 3;
res = TRUE;
door_data = &common_data.famicomEmuDoorData;
door_data->nextSceneId = common_data.sceneNo;
door_data->exitOrientation = 0;
door_data->exitType = 0;
door_data->params = 0;
door_data->exitPos.x = player->actor.world.pos.x;
door_data->exitPos.y = player->actor.world.pos.y;
door_data->exitPos.z = player->actor.world.pos.z;
door_data->fgName = 0;
common_data.unk109F8 = famicomRomId;
}
return res;
}
void return_emu_game(Game* game) {
mem_copy((u8*)&common_data.unk_10754, (u8*)&common_data.unk_107A0, 0x14);
common_data.unk_10754 = common_data.unk_107A0 + 1;
game->unk_74 = 0;
mem_copy((u8*)&common_data.doorData, (u8*)&common_data.famicomEmuDoorData, sizeof(DoorData));
common_data.doorData.nextSceneId = common_data.famicomEmuDoorData.nextSceneId + 1;
game->unk_74 = FALSE;
game_goto_next_game_play(game);
common_data.sceneNo = common_data.unk_107A0;
common_data.sceneNo = common_data.famicomEmuDoorData.nextSceneId;
}
+1 -1
View File
@@ -64,7 +64,7 @@ s32 aTOL_check_data_bank(ObjectExchangeBank* objectExchangeBank, ToolName toolNa
objectStatus->size = objectSize;
objectStatus->unk50 = 0;
objectStatus->unk53 = 1;
objectStatus->unk14 = 0;
objectStatus->unk14.vrom = 0;
}
} else {
ret = common_data.clip.toolClip->umbrellaObjectIndex;
+1 -1
View File
@@ -26,7 +26,7 @@ typedef struct WeatherPrv {
/* 0x2E */ u8 status;
} WeatherPrv; // size = 0x30
typedef void (*ChangingWeatherProc)();
typedef void (*ChangingWeatherProc)(void);
typedef void (*ChangeWeatherProc)(Actor* thisx, s16 status, s16 level);
typedef s32 (*GetWeatherPrvvNumProc)(Actor* thisx);
typedef void (*RemoveWeatherPrvProc)(Actor* thisx, s32 id);
+8 -8
View File
@@ -806,15 +806,15 @@ void play_main(Game* game) {
game_play->state.unk_9D = 0xBE;
}
void* func_80804138_jp(Game_Play* game_play, Struct_8010EAA0* arg1) {
u32 sp24 = arg1->unk_04 - arg1->unk_00;
void* sp20 = THA_alloc16(&game_play->state.heap, sp24);
void* func_80804138_jp(Game_Play* game_play, SceneDmaStatus* arg1) {
u32 sceneDataSize = arg1->vromEnd - arg1->vromStart;
void* sp20 = THA_alloc16(&game_play->state.heap, sceneDataSize);
DmaMgr_RequestSyncDebug(sp20, arg1->unk_00, sp24, "../m_play.c", 2302);
DmaMgr_RequestSyncDebug(sp20, arg1->vromStart, sceneDataSize, "../m_play.c", 2302);
return sp20;
}
void func_808041A4_jp(Game_Play* game_play) {
void VR_Box_ct(Game_Play* game_play) {
Global_kankyo_ct(game_play, &game_play->kankyo);
}
@@ -826,11 +826,11 @@ void Gameplay_Scene_Init(Game_Play* game_play) {
game_play->unk_1EB8 = 0;
mSc_data_bank_ct(game_play, &game_play->objectExchangeBank);
Global_light_ct(&game_play->glight);
Door_info_ct(&game_play->unk_1E10);
Door_info_ct(&game_play->sceneDoorInfo);
common_data_clear();
Scene_ct(game_play, game_play->unk_010C);
mSc_decide_exchange_bank(&game_play->objectExchangeBank);
func_808041A4_jp(game_play);
VR_Box_ct(game_play);
}
s32 mPl_SceneNo2SoundRoomType(s32 arg0) {
@@ -858,7 +858,7 @@ s32 mPl_SceneNo2SoundRoomType(s32 arg0) {
}
void Gameplay_Scene_Read(Game_Play* game_play, s16 arg1) {
Struct_8010EAA0* sp1C = &scene_data_status[arg1];
SceneDmaStatus* sp1C = &scene_data_status[arg1];
sp1C->unk_13 = 0;
game_play->unk_2210 = sp1C;
+3 -3
View File
@@ -26,6 +26,7 @@
struct Actor;
struct ActorEntry;
struct Game_Play;
struct SceneDmaStatus;
typedef void (*Game_Play_unk_1C58)(struct Actor*);
typedef UNK_RET (*Game_Play_unk_2208)(struct Actor*, struct Game_Play*);
@@ -79,8 +80,7 @@ typedef struct Game_Play {
/* 0x1DAD */ UNK_TYPE1 unk_1DAD[0x3];
/* 0x1DB0 */ UNK_TYPE1 unk_1DB0[0x10];
/* 0x1DC0 */ PreRender unk_1DC0;
/* 0x1E10 */ s8 unk_1E10;
/* 0x1E14 */ UNK_PTR unk_1E14;
/* 0x1E10 */ DoorInfo sceneDoorInfo;
/* 0x1E18 */ s32 unk_1E18;
/* 0x1E1C */ MtxF viewProjectionMtxF;
/* 0x1E5C */ MtxF billboardMtxF;
@@ -107,7 +107,7 @@ typedef struct Game_Play {
/* 0x2138 */ CollisionCheck unk_2138;
/* 0x2208 */ Game_Play_unk_2208 unk_2208;
/* 0x220C */ s32 unk_220C;
/* 0x2210 */ Struct_8010EAA0* unk_2210;
/* 0x2210 */ struct SceneDmaStatus* unk_2210;
/* 0x2214 */ UNK_TYPE1 unk_2214[0x1FC];
} Game_Play; // size = 0x2410
@@ -54,7 +54,7 @@ void game_next_play(Game* game, s32 scene) {
STOP_GAMESTATE(game);
SET_NEXT_GAMESTATE(game, play_init, sizeof(Game_Play));
mHm_SetNowHome();
common_data.unk_10754 = 0;
common_data.doorData.nextSceneId = 0;
func_800968C0_jp();
common_data.unk_10140 = 1;
}
+1 -1
View File
@@ -165,7 +165,7 @@
- [0x730B60, data, code/730B60]
- [0x731940, .data, code/m_start_data_init]
- [0x731980, .data, code/m_submenu]
- [0x731A20, data, code/731A20]
- [0x731A20, .data, code/m_scene]
- [0x731A70, .data, code/m_object] # made-up name
- [0x732740, data, code/732740]
- [0x732A00, .data, code/m_skin_matrix]