summaryrefslogtreecommitdiff
path: root/src/code
diff options
context:
space:
mode:
authorPrakxo <87568477+Prakxo@users.noreply.github.com>2024-04-10 03:57:33 +0200
committerGitHub <noreply@github.com>2024-04-09 18:57:33 -0700
commitfce490d951900c593f25329cdfef0f47263d5e43 (patch)
tree2324932640b707ad47350d1722c63b63542faa45 /src/code
parentfcdb6376299d9374d31c498f3204894e23c414b3 (diff)
m_scene OK (#165)
Diffstat (limited to 'src/code')
-rw-r--r--src/code/m_scene.c587
1 files changed, 484 insertions, 103 deletions
diff --git a/src/code/m_scene.c b/src/code/m_scene.c
index 9e294c9..4514b2f 100644
--- a/src/code/m_scene.c
+++ b/src/code/m_scene.c
@@ -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);
+
+ 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);
+ }
+ }
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/mSc_dmacopy_all_exchange_bank.s")
+ 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;
+
+ metVillagersBitfield = 0;
+ animal = common_data.animals;
+ if (sceneNo != common_data.sceneNo) {
+ return;
+ }
+
+ metVillagersNum = 0;
+ { UNUSED s32 scopedTemp; }
+
+ for (i = 0; i < ANIMAL_NUM_MAX; i++) {
+ if (mNpc_CheckFreeAnimalPersonalID(&animal->id) == FALSE) {
+ Anmmem_c* memory = animal->memories;
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/Scene_ct.s")
+ 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;
+ }
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/Scene_Proc_Player_Ptr.s")
+ memory++;
+ }
+ }
-void Scene_Proc_Ctrl_Actor_Ptr(Game_Play* game_play, MSceneUnkStruct* arg1) {
- void* temp = arg1->unk4;
+ 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 */
- game_play->unk_1EA6 = arg1->unk1;
- game_play->unk_1EB0 = Lib_SegmentedToVirtual(temp);
+ 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);
+
+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++;
+ }
- game_play->unk_1EA5 = arg1->unk1;
- game_play->unk_1EAC = Lib_SegmentedToVirtual(temp);
+ /* 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;
+
+ play->sceneDoorInfo.numDoors = scene_data->doorData.numDoors;
+ play->sceneDoorInfo.doorDataPtr = Lib_SegmentedToVirtual(data);
+}
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6B50_jp.s")
+void Door_info_ct(DoorInfo* door_info) {
+ door_info->numDoors = 0;
+}
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6BB0_jp.s")
+void Scene_Proc_Sound(UNUSED Game_Play* play, UNUSED SceneData* scene_data) {
+}
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6BD4_jp.s")
+void set_item_info(Game_Play* play, SceneDataField* field) {
+ s16 bank;
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6BF8_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_800C6C10_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_800C6D14_jp.s")
+ common_data.unk_1014C = itemType;
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_scene/func_800C6D5C_jp.s")
+ 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;
}