summaryrefslogtreecommitdiff
path: root/src/overlays/actors
diff options
context:
space:
mode:
authorPrakxo <87568477+Prakxo@users.noreply.github.com>2024-10-09 17:46:35 +0200
committerGitHub <noreply@github.com>2024-10-09 08:46:35 -0700
commitc7a6aa2b880c34fafc10fd8238ee3b7c222fee8c (patch)
treefe8a760d848610f7b2168194cd0a647d3b80c59a /src/overlays/actors
parent8639fa43c74e7052d94eaaa4c5b13218f5006621 (diff)
ac_arrange_room OK (#220)
* ac_arrange_room OK * fix?
Diffstat (limited to 'src/overlays/actors')
-rw-r--r--src/overlays/actors/ovl_Arrange_Room/ac_arrange_room.c204
-rw-r--r--src/overlays/actors/ovl_Arrange_Room/ac_arrange_room.h10
-rw-r--r--src/overlays/actors/ovl_Structure/ac_structure.c3
3 files changed, 197 insertions, 20 deletions
diff --git a/src/overlays/actors/ovl_Arrange_Room/ac_arrange_room.c b/src/overlays/actors/ovl_Arrange_Room/ac_arrange_room.c
index 358044a..bb1721e 100644
--- a/src/overlays/actors/ovl_Arrange_Room/ac_arrange_room.c
+++ b/src/overlays/actors/ovl_Arrange_Room/ac_arrange_room.c
@@ -2,13 +2,16 @@
#include "m_actor_dlftbls.h"
#include "m_object.h"
#include "overlays/gamestates/ovl_play/m_play.h"
+#include "m_common_data.h"
+#include "segment_symbols.h"
+#include "m_rcp.h"
-void Arrange_Room_Actor_ct(Actor* thisx, Game_Play* game_play);
-void Arrange_Room_Actor_dt(Actor* thisx, Game_Play* game_play);
+void Arrange_Room_Actor_ct(Actor* actor, Game_Play* play);
+void Arrange_Room_Actor_dt(Actor* actor, Game_Play* game_play);
void Arrange_Room_Actor_move(Actor* thisx, Game_Play* game_play);
-void Arrange_Room_Actor_draw(Actor* thisx, Game_Play* game_play);
+void Arrange_Room_Actor_draw(Actor* actor, Game_Play* play);
+void aAR_Redma();
-#if 0
ActorProfile Arrange_Room_Profile = {
/* */ ACTOR_ARRANGE_ROOM,
/* */ ACTOR_PART_5,
@@ -22,26 +25,195 @@ ActorProfile Arrange_Room_Profile = {
/* */ Arrange_Room_Actor_draw,
/* */ NULL,
};
-#endif
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/ovl_Arrange_Room/ac_arrange_room/func_80950E50_jp.s")
+extern Gfx rom_myhome2_floor_model[];
+extern Gfx rom_myhome2_wall_model[];
+extern Gfx rom_myhome2_wall_modelT[];
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/ovl_Arrange_Room/ac_arrange_room/func_80950EC8_jp.s")
+#define AR_WALL_ROOM_SIZE 0x1020
+#define AR_FLOOR_ROOM_SIZE 0x2020
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/ovl_Arrange_Room/ac_arrange_room/func_80950F1C_jp.s")
+#define AR_TEXTURE_SIZE 0x800
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/ovl_Arrange_Room/ac_arrange_room/func_80950F70_jp.s")
+void* aAR_SecureDmaRam(Game_Play* play, s32 size) {
+ s32 id = 0;
+ u8* segment;
+ s32 num = play->objectExchangeBank.num;
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/ovl_Arrange_Room/ac_arrange_room/Arrange_Room_Actor_ct.s")
+ if (mSc_secure_exchange_keep_bank(&play->objectExchangeBank, id, ALIGN8(size))) {
+ segment = play->objectExchangeBank.status[num].segment;
+ return segment;
+ } else {
+ return NULL;
+ }
+}
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/ovl_Arrange_Room/ac_arrange_room/Arrange_Room_Actor_dt.s")
+// refactored to mRmTp_CopyWallData, name unknown
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/ovl_Arrange_Room/ac_arrange_room/func_80951124_jp.s")
+void aAR_CopyWallData(void* vram, s32 idx) {
+ if (vram != NULL) {
+ DmaMgr_RequestSyncDebug(vram, SEGMENT_ROM_START(object_0182A000) + (AR_WALL_ROOM_SIZE * idx), AR_WALL_ROOM_SIZE,
+ "../ac_arrange_room.c", 169);
+ }
+}
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/ovl_Arrange_Room/ac_arrange_room/func_809512C4_jp.s")
+// refactored to mRmTp_CopyFloorData, name unknown
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/ovl_Arrange_Room/ac_arrange_room/Arrange_Room_Actor_draw.s")
+void aAR_CopyFloorData(void* vram, s32 idx) {
+ if (vram != NULL) {
+ DmaMgr_RequestSyncDebug(vram, SEGMENT_ROM_START(object_017A1000) + (AR_FLOOR_ROOM_SIZE * idx),
+ AR_FLOOR_ROOM_SIZE, "../ac_arrange_room.c", 190);
+ }
+}
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/ovl_Arrange_Room/ac_arrange_room/Arrange_Room_Actor_move.s")
+void aAR_SetClip(Actor* actor, s32 flag) {
+ Arrange_Room* arrangeRoom = (Arrange_Room*)actor;
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/ovl_Arrange_Room/ac_arrange_room/func_80951480_jp.s")
+ if (flag != FALSE) {
+ arrangeRoom->clip.arrangeRoomActor = arrangeRoom;
+ arrangeRoom->clip.proc = aAR_Redma;
+ common_data.clip.arrangeRoomClip = &arrangeRoom->clip;
+ } else {
+ common_data.clip.arrangeRoomClip = NULL;
+ }
+}
+
+void Arrange_Room_Actor_ct(Actor* actor, Game_Play* play) {
+ Arrange_Room* arrangeRoom = (Arrange_Room*)actor;
+ s16 wallFloorIdx;
+ s16 wallIdx;
+ s16 floorIdx;
+ UNUSED s32 pad;
+
+ mNpc_RenewalNpcRoom(&wallFloorIdx);
+ actor->params = wallFloorIdx;
+ aAR_SetClip(actor, TRUE);
+ wallIdx = (wallFloorIdx >> 8) & 0xFF;
+ floorIdx = (u8)wallFloorIdx;
+
+ if (floorIdx < 0) {
+ floorIdx = 0;
+ } else if (floorIdx >= 0x40) {
+ floorIdx = 0x3F;
+ }
+
+ if (wallIdx < 0) {
+ wallIdx = 0;
+ } else if (wallIdx >= 0x40) {
+ wallIdx = 0x3F;
+ }
+
+ arrangeRoom->vram = NULL;
+ arrangeRoom->wallDataPtr = NULL;
+ arrangeRoom->wallIdx = wallIdx;
+ arrangeRoom->floorDataPtr = NULL;
+ arrangeRoom->floorIdx = floorIdx;
+
+ {
+ s32 size;
+ size = SEGMENT_ROM_SIZE(segment_013E7000);
+ size = ALIGN8(size);
+ arrangeRoom->vram = aAR_SecureDmaRam(play, size);
+
+ if (arrangeRoom->vram != NULL) {
+ DmaMgr_RequestSyncDebug(arrangeRoom->vram, SEGMENT_ROM_START(segment_013E7000), size,
+ "../ac_arrange_room.c", 332);
+ }
+ }
+
+ arrangeRoom->wallDataPtr = aAR_SecureDmaRam(play, AR_WALL_ROOM_SIZE);
+
+ if (arrangeRoom->wallDataPtr != NULL) {
+ aAR_CopyWallData(arrangeRoom->wallDataPtr, arrangeRoom->wallIdx);
+ }
+
+ arrangeRoom->floorDataPtr = aAR_SecureDmaRam(play, AR_FLOOR_ROOM_SIZE);
+
+ if (arrangeRoom->floorDataPtr != NULL) {
+ aAR_CopyFloorData(arrangeRoom->floorDataPtr, arrangeRoom->floorIdx);
+ }
+}
+
+void Arrange_Room_Actor_dt(Actor* actor, UNUSED Game_Play* play) {
+ aAR_SetClip(actor, FALSE);
+}
+
+void aAR_DrawFloor(Actor* actor, Game_Play* play) {
+ u8* ptr;
+ UNUSED u8* ptr2;
+ UNUSED u8* ptr3;
+ UNUSED u8* ptr4;
+ UNUSED u8* ptr5;
+ Arrange_Room* arrangeRoom = (Arrange_Room*)actor;
+ UNUSED s32 pad;
+
+ ptr = arrangeRoom->floorDataPtr;
+ _texture_z_light_fog_prim(play->state.gfxCtx);
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Matrix_translate(0.0f, 0.0f, 0.0f, 0);
+ Matrix_scale(0.05f, 0.05f, 0.05f, 1);
+
+ gSPMatrix(POLY_OPA_DISP++, _Matrix_to_Mtx_new(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+
+ gSPSegment(POLY_OPA_DISP++, G_MWO_SEGMENT_6, arrangeRoom->vram);
+ gSPSegment(POLY_OPA_DISP++, G_MWO_SEGMENT_C, ptr);
+ gSPSegment(POLY_OPA_DISP++, G_MWO_SEGMENT_8, ptr + (0x20 + (AR_TEXTURE_SIZE * 0)));
+ gSPSegment(POLY_OPA_DISP++, G_MWO_SEGMENT_9, ptr + (0x20 + (AR_TEXTURE_SIZE * 1)));
+ gSPSegment(POLY_OPA_DISP++, G_MWO_SEGMENT_A, ptr + (0x20 + (AR_TEXTURE_SIZE * 2)));
+ gSPSegment(POLY_OPA_DISP++, G_MWO_SEGMENT_B, ptr + (0x20 + (AR_TEXTURE_SIZE * 3)));
+ gSPDisplayList(POLY_OPA_DISP++, rom_myhome2_floor_model);
+
+ CLOSE_DISPS(graph);
+}
+
+void aAR_DrawWall(Actor* actor, Game_Play* play) {
+ Arrange_Room* arrangeRoom = (Arrange_Room*)actor;
+ u8* ptr;
+ UNUSED u8* ptr2;
+ UNUSED u8* ptr3;
+ UNUSED s32 pad;
+
+ ptr = arrangeRoom->wallDataPtr;
+
+ _texture_z_light_fog_prim(play->state.gfxCtx);
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ Matrix_translate(0.0f, 0.0f, 0.0f, 0);
+ Matrix_scale(0.05f, 0.05f, 0.05f, 1);
+
+ gSPMatrix(POLY_OPA_DISP++, _Matrix_to_Mtx_new(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPSegment(POLY_OPA_DISP++, G_MWO_SEGMENT_6, arrangeRoom->vram);
+ gSPSegment(POLY_OPA_DISP++, G_MWO_SEGMENT_8, ptr + (0x20 + (AR_TEXTURE_SIZE * 0)));
+ gSPSegment(POLY_OPA_DISP++, G_MWO_SEGMENT_9, ptr + (0x20 + (AR_TEXTURE_SIZE * 1)));
+ gSPSegment(POLY_OPA_DISP++, G_MWO_SEGMENT_A, ptr);
+
+ gSPDisplayList(POLY_OPA_DISP++, rom_myhome2_wall_model);
+ gSPDisplayList(POLY_OPA_DISP++, rom_myhome2_wall_modelT);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
+
+void Arrange_Room_Actor_draw(Actor* actor, Game_Play* play) {
+ Global_kankyo_set_room_prim(play);
+ aAR_DrawFloor(actor, play);
+ aAR_DrawWall(actor, play);
+}
+
+void Arrange_Room_Actor_move(UNUSED Actor* actor, UNUSED Game_Play* play) {
+}
+
+void aAR_Redma() {
+ Arrange_Room* arrangeRoom = common_data.clip.arrangeRoomClip->arrangeRoomActor;
+
+ if (arrangeRoom != NULL) {
+ u32 start = SEGMENT_ROM_START(segment_013E7000);
+ s32 size = ALIGN8(SEGMENT_ROM_SIZE(segment_013E7000));
+
+ DmaMgr_RequestSyncDebug(arrangeRoom->vram, start, size, "../ac_arrange_room.c", 545);
+ aAR_CopyWallData(arrangeRoom->wallDataPtr, arrangeRoom->wallIdx);
+ aAR_CopyFloorData(arrangeRoom->floorDataPtr, arrangeRoom->floorIdx);
+ }
+}
diff --git a/src/overlays/actors/ovl_Arrange_Room/ac_arrange_room.h b/src/overlays/actors/ovl_Arrange_Room/ac_arrange_room.h
index 1e6de9e..603c955 100644
--- a/src/overlays/actors/ovl_Arrange_Room/ac_arrange_room.h
+++ b/src/overlays/actors/ovl_Arrange_Room/ac_arrange_room.h
@@ -4,15 +4,19 @@
#include "ultra64.h"
#include "m_actor.h"
#include "unk.h"
+#include "m_clip.h"
struct Game_Play;
struct Arrange_Room;
-typedef void (*Arrange_RoomActionFunc)(struct Arrange_Room*, struct Game_Play*);
-
typedef struct Arrange_Room {
/* 0x000 */ Actor actor;
- /* 0x174 */ UNK_TYPE1 unk_174[0x1C];
+ /* 0x174 */ u8* vram;
+ /* 0x178 */ u8* wallDataPtr;
+ /* 0x17C */ s32 wallIdx;
+ /* 0x180 */ u8* floorDataPtr;
+ /* 0x184 */ s32 floorIdx;
+ /* 0x188 */ Arrange_RoomClip clip;
} Arrange_Room; // size = 0x190
#endif
diff --git a/src/overlays/actors/ovl_Structure/ac_structure.c b/src/overlays/actors/ovl_Structure/ac_structure.c
index 635f06c..bec0ca9 100644
--- a/src/overlays/actors/ovl_Structure/ac_structure.c
+++ b/src/overlays/actors/ovl_Structure/ac_structure.c
@@ -1,4 +1,3 @@
-#include "prevent_bss_reordering.h"
#include "ac_structure.h"
#include "macros.h"
#include "m_actor_dlftbls.h"
@@ -8,6 +7,8 @@
#include "m_object.h"
#include "overlays/gamestates/ovl_play/m_play.h"
#include "segment_symbols.h"
+#include "prevent_bss_reordering2.h"
+#include "prevent_bss_reordering.h"
#define THIS ((Structure*)thisx)