2020-10-03 17:22:44 +02:00
|
|
|
#include "global.h"
|
2022-11-02 00:17:11 +01:00
|
|
|
#include "terminal.h"
|
2020-03-17 00:31:30 -04:00
|
|
|
|
2024-02-29 05:15:04 -08:00
|
|
|
#define KALEIDO_OVERLAY(name, nameString) \
|
|
|
|
{ NULL, ROM_FILE(ovl_##name), _ovl_##name##SegmentStart, _ovl_##name##SegmentEnd, 0, nameString, }
|
2020-03-17 00:31:30 -04:00
|
|
|
|
2021-05-03 01:15:16 +02:00
|
|
|
KaleidoMgrOverlay gKaleidoMgrOverlayTable[] = {
|
2022-06-06 21:51:03 +02:00
|
|
|
KALEIDO_OVERLAY(kaleido_scope, "kaleido_scope"),
|
|
|
|
KALEIDO_OVERLAY(player_actor, "player_actor"),
|
2020-03-17 00:31:30 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
void* sKaleidoAreaPtr = NULL;
|
2021-05-03 01:15:16 +02:00
|
|
|
KaleidoMgrOverlay* gKaleidoMgrCurOvl = NULL;
|
|
|
|
u8 gBossMarkState = 0;
|
2020-03-17 00:31:30 -04:00
|
|
|
|
2021-05-03 01:15:16 +02:00
|
|
|
void KaleidoManager_LoadOvl(KaleidoMgrOverlay* ovl) {
|
2024-01-16 06:59:02 -08:00
|
|
|
LOG_UTILS_CHECK_NULL_POINTER("KaleidoArea_allocp", sKaleidoAreaPtr, "../z_kaleido_manager.c", 99);
|
2021-05-03 01:15:16 +02:00
|
|
|
|
2020-03-17 00:31:30 -04:00
|
|
|
ovl->loadedRamAddr = sKaleidoAreaPtr;
|
2024-02-29 05:15:04 -08:00
|
|
|
Overlay_Load(ovl->file.vromStart, ovl->file.vromEnd, ovl->vramStart, ovl->vramEnd, ovl->loadedRamAddr);
|
2021-05-03 01:15:16 +02:00
|
|
|
|
2024-01-12 07:38:13 -08:00
|
|
|
PRINTF(VT_FGCOL(GREEN));
|
|
|
|
PRINTF("OVL(k):Seg:%08x-%08x Ram:%08x-%08x Off:%08x %s\n", ovl->vramStart, ovl->vramEnd, ovl->loadedRamAddr,
|
|
|
|
(uintptr_t)ovl->loadedRamAddr + (uintptr_t)ovl->vramEnd - (uintptr_t)ovl->vramStart,
|
|
|
|
(uintptr_t)ovl->vramStart - (uintptr_t)ovl->loadedRamAddr, ovl->name);
|
|
|
|
PRINTF(VT_RST);
|
2021-05-03 01:15:16 +02:00
|
|
|
|
2023-07-10 21:03:01 +02:00
|
|
|
ovl->offset = (uintptr_t)ovl->loadedRamAddr - (uintptr_t)ovl->vramStart;
|
2020-03-17 00:31:30 -04:00
|
|
|
gKaleidoMgrCurOvl = ovl;
|
|
|
|
}
|
|
|
|
|
2021-05-03 01:15:16 +02:00
|
|
|
void KaleidoManager_ClearOvl(KaleidoMgrOverlay* ovl) {
|
|
|
|
if (ovl->loadedRamAddr != NULL) {
|
|
|
|
ovl->offset = 0;
|
2023-07-10 21:03:01 +02:00
|
|
|
bzero(ovl->loadedRamAddr, (uintptr_t)ovl->vramEnd - (uintptr_t)ovl->vramStart);
|
2020-03-17 00:31:30 -04:00
|
|
|
ovl->loadedRamAddr = NULL;
|
|
|
|
gKaleidoMgrCurOvl = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-05-21 14:23:43 -04:00
|
|
|
void KaleidoManager_Init(PlayState* play) {
|
2021-05-03 01:15:16 +02:00
|
|
|
s32 largestSize = 0;
|
|
|
|
s32 size;
|
|
|
|
u32 i;
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(gKaleidoMgrOverlayTable); i++) {
|
2023-07-10 21:03:01 +02:00
|
|
|
size = (uintptr_t)gKaleidoMgrOverlayTable[i].vramEnd - (uintptr_t)gKaleidoMgrOverlayTable[i].vramStart;
|
2021-05-03 01:15:16 +02:00
|
|
|
if (size > largestSize) {
|
|
|
|
largestSize = size;
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
}
|
2021-05-03 01:15:16 +02:00
|
|
|
|
2024-01-12 07:38:13 -08:00
|
|
|
PRINTF(VT_FGCOL(GREEN));
|
2024-08-22 22:33:50 +02:00
|
|
|
PRINTF(T("KaleidoArea の最大サイズは %d バイトを確保します\n", "The maximum size of KaleidoArea is %d bytes\n"),
|
|
|
|
largestSize);
|
2024-01-12 07:38:13 -08:00
|
|
|
PRINTF(VT_RST);
|
2021-05-03 01:15:16 +02:00
|
|
|
|
2024-01-09 04:59:03 -08:00
|
|
|
sKaleidoAreaPtr = GAME_STATE_ALLOC(&play->state, largestSize, "../z_kaleido_manager.c", 150);
|
2024-01-16 06:59:02 -08:00
|
|
|
LOG_UTILS_CHECK_NULL_POINTER("KaleidoArea_allocp", sKaleidoAreaPtr, "../z_kaleido_manager.c", 151);
|
2021-05-03 01:15:16 +02:00
|
|
|
|
2024-01-12 07:38:13 -08:00
|
|
|
PRINTF(VT_FGCOL(GREEN));
|
|
|
|
PRINTF("KaleidoArea %08x - %08x\n", sKaleidoAreaPtr, (uintptr_t)sKaleidoAreaPtr + largestSize);
|
|
|
|
PRINTF(VT_RST);
|
2021-05-03 01:15:16 +02:00
|
|
|
|
2022-10-04 07:18:50 +02:00
|
|
|
gKaleidoMgrCurOvl = NULL;
|
2020-03-17 00:31:30 -04:00
|
|
|
}
|
2021-02-14 00:49:40 +00:00
|
|
|
|
2022-03-21 15:49:11 -04:00
|
|
|
void KaleidoManager_Destroy(void) {
|
2021-05-03 01:15:16 +02:00
|
|
|
if (gKaleidoMgrCurOvl != NULL) {
|
2020-03-17 00:31:30 -04:00
|
|
|
KaleidoManager_ClearOvl(gKaleidoMgrCurOvl);
|
|
|
|
gKaleidoMgrCurOvl = NULL;
|
|
|
|
}
|
2021-05-03 01:15:16 +02:00
|
|
|
|
2020-03-17 00:31:30 -04:00
|
|
|
sKaleidoAreaPtr = NULL;
|
|
|
|
}
|
|
|
|
|
2021-10-03 05:17:09 +02:00
|
|
|
// NOTE: this function looks messed up and probably doesn't work how it was intended to
|
2020-03-22 22:19:43 +01:00
|
|
|
void* KaleidoManager_GetRamAddr(void* vram) {
|
2021-05-03 01:15:16 +02:00
|
|
|
KaleidoMgrOverlay* iter = gKaleidoMgrCurOvl;
|
|
|
|
KaleidoMgrOverlay* ovl = iter;
|
2020-03-17 00:31:30 -04:00
|
|
|
|
2021-02-14 00:49:40 +00:00
|
|
|
if (ovl == NULL) {
|
2024-02-09 00:40:08 +11:00
|
|
|
u32 i;
|
|
|
|
|
2020-03-17 00:31:30 -04:00
|
|
|
iter = &gKaleidoMgrOverlayTable[0];
|
2021-05-03 01:15:16 +02:00
|
|
|
for (i = 0; i < ARRAY_COUNT(gKaleidoMgrOverlayTable); i++) {
|
2023-07-10 21:03:01 +02:00
|
|
|
if (((uintptr_t)vram >= (uintptr_t)iter->vramStart) && ((uintptr_t)iter->vramEnd >= (uintptr_t)vram)) {
|
2020-03-17 00:31:30 -04:00
|
|
|
KaleidoManager_LoadOvl(iter);
|
|
|
|
ovl = iter;
|
|
|
|
goto KaleidoManager_GetRamAddr_end;
|
|
|
|
}
|
2021-10-03 05:17:09 +02:00
|
|
|
//! @bug Probably missing iter++ here
|
2020-03-17 00:31:30 -04:00
|
|
|
}
|
2020-03-22 22:19:43 +01:00
|
|
|
|
2024-08-22 22:33:50 +02:00
|
|
|
PRINTF(T("異常\n", "Abnormal\n"));
|
2020-03-17 00:31:30 -04:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
KaleidoManager_GetRamAddr_end:
|
2023-07-10 21:03:01 +02:00
|
|
|
if ((ovl == NULL) || ((uintptr_t)vram < (uintptr_t)ovl->vramStart) ||
|
|
|
|
((uintptr_t)vram >= (uintptr_t)ovl->vramEnd)) {
|
2020-03-17 00:31:30 -04:00
|
|
|
return NULL;
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
2023-07-10 21:03:01 +02:00
|
|
|
return (void*)((uintptr_t)vram + ovl->offset);
|
2020-03-17 00:31:30 -04:00
|
|
|
}
|