Starship/src/engine/fox_load.c

200 lines
7.0 KiB
C
Raw Normal View History

#include "global.h"
#include "sf64dma.h"
u8 sFillTimer = 3;
#include "fox_load_inits.c"
Scene sCurrentScene = {
NO_OVERLAY,
{ /* 0x1 */ NO_SEGMENT,
/* 0x2 */ NO_SEGMENT,
/* 0x3 */ NO_SEGMENT,
/* 0x4 */ NO_SEGMENT,
/* 0x5 */ NO_SEGMENT,
/* 0x6 */ NO_SEGMENT,
/* 0x7 */ NO_SEGMENT,
/* 0x8 */ NO_SEGMENT,
/* 0x9 */ NO_SEGMENT,
/* 0xA */ NO_SEGMENT,
/* 0xB */ NO_SEGMENT,
/* 0xC */ NO_SEGMENT,
/* 0xD */ NO_SEGMENT,
/* 0xE */ NO_SEGMENT,
/* 0xF */ NO_SEGMENT },
};
void Load_RomFile(void* vRomAddress, void* dest, ptrdiff_t size) {
s32 i;
for (i = 0; gDmaTable[i].pRom.end != NULL; i++) {
if (gDmaTable[i].vRomAddress == vRomAddress) {
if (gDmaTable[i].compFlag == 0) {
Lib_DmaRead(gDmaTable[i].pRom.start, dest, size);
} else {
Lib_FillScreen(true);
sFillTimer = 3;
gGameStandby = true;
Lib_DmaRead(gDmaTable[i].pRom.start, gFrameBuffers, SEGMENT_SIZE(gDmaTable[i].pRom));
Mio0_Decompress(gFrameBuffers, dest);
}
break;
}
}
}
u8 Load_SceneFiles(Scene* scene) {
u8* ramPtr = SEGMENT_VRAM_START(ovl_i1);
u8 segment;
u8 changeScene = false;
if (scene->ovl.rom.start == (0, sCurrentScene.ovl.rom.start)) { // fake because D_800CBDD4 is probably 2D array
ramPtr = ramPtr + SEGMENT_SIZE(scene->ovl.rom);
ramPtr = ramPtr + SEGMENT_SIZE(scene->ovl.bss);
} else {
sCurrentScene.ovl.rom.start = scene->ovl.rom.start;
sCurrentScene.ovl.rom.end = ramPtr;
if (scene->ovl.rom.start != 0) {
changeScene = true;
Load_RomFile(scene->ovl.rom.start, ramPtr, SEGMENT_SIZE(scene->ovl.rom));
ramPtr = ramPtr + SEGMENT_SIZE(scene->ovl.rom);
bzero(scene->ovl.bss.start, SEGMENT_SIZE(scene->ovl.bss));
ramPtr = ramPtr + SEGMENT_SIZE(scene->ovl.bss);
}
}
segment = 0;
while ((segment < 15) && (scene->assets[segment].start == sCurrentScene.assets[segment].start) &&
(changeScene == false)) {
if (scene->assets[segment].start != 0) {
gSegments[segment + 1] = K0_TO_PHYS(ramPtr);
gSPSegment(gUnkDisp1++, segment + 1, K0_TO_PHYS(ramPtr));
ramPtr = ramPtr + SEGMENT_SIZE(scene->assets[segment]);
}
segment += 1; // can't be ++
}
for (segment; segment < 15; segment += 1) {
sCurrentScene.assets[segment].start = scene->assets[segment].start;
sCurrentScene.assets[segment].end = ramPtr;
if (scene->assets[segment].start != 0) {
gSegments[segment + 1] = K0_TO_PHYS(ramPtr);
gSPSegment(gUnkDisp1++, segment + 1, K0_TO_PHYS(ramPtr));
Load_RomFile(scene->assets[segment].start, ramPtr, SEGMENT_SIZE(scene->assets[segment]));
ramPtr = ramPtr + SEGMENT_SIZE(scene->assets[segment]);
}
}
if (sFillTimer != 0) {
sFillTimer--;
} else if (gStartNMI == 0) {
Lib_FillScreen(false);
}
return changeScene;
}
u8 Load_SceneSetup(u8 sceneId, u8 sceneSetup) {
u8 changeScene;
switch (sceneId) {
case SCENE_TITLE:
changeScene = Load_SceneFiles(&sOvlmenu_Title[sceneSetup]);
if (changeScene == true) {
AUDIO_SET_SPEC(SFXCHAN_0, AUDIOSPEC_22);
}
break;
case SCENE_MENU:
changeScene = Load_SceneFiles(&sOvlmenu_Option[sceneSetup]);
break;
case SCENE_MAP:
changeScene = Load_SceneFiles(&sOvlmenu_Map[sceneSetup]);
break;
case SCENE_GAME_OVER:
changeScene = Load_SceneFiles(&sOvlmenu_GameOver[sceneSetup]);
break;
case SCENE_CORNERIA:
changeScene = Load_SceneFiles(&sOvli1_Corneria[sceneSetup]);
break;
case SCENE_METEO:
changeScene = Load_SceneFiles(&sOvli2_Meteo[sceneSetup]);
break;
case SCENE_TITANIA:
changeScene = Load_SceneFiles(&sOvli5_Titania[sceneSetup]);
break;
case SCENE_SECTOR_X:
changeScene = Load_SceneFiles(&sOvli2_SectorX[sceneSetup]);
break;
case SCENE_SECTOR_Z:
changeScene = Load_SceneFiles(&sOvli4_SectorZ[sceneSetup]);
break;
case SCENE_AQUAS:
changeScene = Load_SceneFiles(&sOvli3_Aquas[sceneSetup]);
break;
case SCENE_AREA_6:
changeScene = Load_SceneFiles(&sOvli3_Area6[sceneSetup]);
break;
case SCENE_FORTUNA:
changeScene = Load_SceneFiles(&sOvli4_Fortuna[sceneSetup]);
break;
case SCENE_UNK_4:
changeScene = Load_SceneFiles(&sOvli3_Unk4[sceneSetup]);
break;
case SCENE_SECTOR_Y:
changeScene = Load_SceneFiles(&sOvli6_SectorY[sceneSetup]);
break;
case SCENE_SOLAR:
changeScene = Load_SceneFiles(&sOvli3_Solar[sceneSetup]);
break;
case SCENE_ZONESS:
changeScene = Load_SceneFiles(&sOvli3_Zoness[sceneSetup]);
break;
case SCENE_VENOM_ANDROSS:
changeScene = Load_SceneFiles(&sOvli6_Andross[sceneSetup]);
break;
case SCENE_TRAINING:
changeScene = Load_SceneFiles(&sOvli1_Training[sceneSetup]);
break;
case SCENE_VENOM_1:
changeScene = Load_SceneFiles(&sOvli1_Venom1[sceneSetup]);
break;
case SCENE_VENOM_2:
changeScene = Load_SceneFiles(&sOvli6_Venom2[sceneSetup]);
break;
case SCENE_20:
changeScene = Load_SceneFiles(&sOvli2_Setup20[sceneSetup]);
break;
case SCENE_BOLSE:
changeScene = Load_SceneFiles(&sOvli4_Bolse[sceneSetup]);
break;
case SCENE_KATINA:
changeScene = Load_SceneFiles(&sOvli4_Katina[sceneSetup]);
break;
case SCENE_MACBETH:
changeScene = Load_SceneFiles(&sOvli5_Macbeth[sceneSetup]);
break;
case SCENE_VERSUS:
changeScene = Load_SceneFiles(&sOvli2_Versus[sceneSetup]);
if (changeScene == true) {
AUDIO_SET_SPEC_ALT(SFXCHAN_3, AUDIOSPEC_16);
}
break;
case SCENE_LOGO:
changeScene = Load_SceneFiles(&sNoOvl_Logo[sceneSetup]); // Logo does not load an overlay file
if (changeScene == true) {
AUDIO_SET_SPEC(SFXCHAN_0, AUDIOSPEC_MA);
}
break;
case SCENE_CREDITS:
changeScene = Load_SceneFiles(&sOvlending_Ending[sceneSetup]);
break;
default:
PRINTF("DMA MODE ERROR %d\n");
changeScene = false;
break;
}
return changeScene;
}
void Load_InitDmaAndMsg(void) {
Lib_DmaRead(SEGMENT_ROM_START(dma_table), SEGMENT_VRAM_START(dma_table), SEGMENT_ROM_SIZE(dma_table));
Load_RomFile(SEGMENT_ROM_START(ast_radio), SEGMENT_VRAM_START(ast_radio), SEGMENT_ROM_SIZE(ast_radio));
}