summaryrefslogtreecommitdiff
path: root/src/code
diff options
context:
space:
mode:
authorengineer124 <engineer124engineer124@gmail.com>2022-10-05 13:54:29 -0400
committerengineer124 <engineer124engineer124@gmail.com>2022-10-05 13:54:29 -0400
commitabd997d27f4a4238bd75a34f38f2c7fce48856b7 (patch)
tree9e750de21f3ecf6490d20b1c7ff5e8108113270c /src/code
parentf85afc978f48f9a31253dd6be9c7817f02b1826c (diff)
parentf379012742c07f2e069b24d77e4f30a614f63080 (diff)
merge master
Diffstat (limited to 'src/code')
-rw-r--r--src/code/audio/audio_load.c2
-rw-r--r--src/code/audio/audio_synthesis.c6
-rw-r--r--src/code/audio/code_8019AF00.c2
-rw-r--r--src/code/code_8012EC80.c109
-rw-r--r--src/code/title_setup.c36
-rw-r--r--src/code/z_actor.c12
-rw-r--r--src/code/z_collision_check.c1
-rw-r--r--src/code/z_demo.c1
-rw-r--r--src/code/z_effect_soft_sprite_old_init.c2
-rw-r--r--src/code/z_en_hy_code.c6
-rw-r--r--src/code/z_en_item00.c4
-rw-r--r--src/code/z_fbdemo_circle.c143
-rw-r--r--src/code/z_fbdemo_dlftbls.c53
-rw-r--r--src/code/z_kaleido_setup.c24
-rw-r--r--src/code/z_lib.c20
-rw-r--r--src/code/z_map_exp.c4
-rw-r--r--src/code/z_message.c25
-rw-r--r--src/code/z_message_nes.c66
-rw-r--r--src/code/z_overlay.c101
-rw-r--r--src/code/z_parameter.c1
-rw-r--r--src/code/z_player_lib.c4
-rw-r--r--src/code/z_room.c4
-rw-r--r--src/code/z_scene.c27
-rw-r--r--src/code/z_scene_proc.c4
-rw-r--r--src/code/z_skelanime.c4
25 files changed, 473 insertions, 188 deletions
diff --git a/src/code/audio/audio_load.c b/src/code/audio/audio_load.c
index ccdc7488d..c9b5ad30b 100644
--- a/src/code/audio/audio_load.c
+++ b/src/code/audio/audio_load.c
@@ -37,7 +37,7 @@ void* AudioLoad_SyncLoad(s32 tableType, u32 id, s32* didAllocate);
u32 AudioLoad_GetRealTableIndex(s32 tableType, u32 id);
void* AudioLoad_SearchCaches(s32 tableType, s32 id);
AudioTable* AudioLoad_GetLoadTable(s32 tableType);
-void AudioLoad_SyncDma(uintptr_t devAddr, u8* addr, size_t size, s32 medium);
+void AudioLoad_SyncDma(uintptr_t devAddr, u8* ramAddr, size_t size, s32 medium);
void AudioLoad_SyncDmaUnkMedium(uintptr_t devAddr, u8* addr, size_t size, s32 unkMediumParam);
s32 AudioLoad_Dma(OSIoMesg* mesg, u32 priority, s32 direction, uintptr_t devAddr, void* ramAddr, size_t size,
OSMesgQueue* reqQueue, s32 medium, const char* dmaFuncType);
diff --git a/src/code/audio/audio_synthesis.c b/src/code/audio/audio_synthesis.c
index 17b3ff4be..d3b25f446 100644
--- a/src/code/audio/audio_synthesis.c
+++ b/src/code/audio/audio_synthesis.c
@@ -21,14 +21,14 @@ typedef enum {
/* 2 */ HAAS_EFFECT_DELAY_RIGHT // Delay right channel so that left channel is heard first
} HaasEffectDelaySide;
-Acmd* AudioSynth_SaveResampledReverbSamplesImpl(Acmd* cmd, u16 dmem, u16 arg2, uintptr_t arg3);
+Acmd* AudioSynth_SaveResampledReverbSamplesImpl(Acmd* cmd, u16 dmem, u16 size, uintptr_t startAddr);
Acmd* AudioSynth_LoadReverbSamplesImpl(Acmd* cmd, u16 dmem, u16 startPos, s32 size, SynthesisReverb* reverb);
Acmd* AudioSynth_SaveReverbSamplesImpl(Acmd* cmd, u16 dmem, u16 startPos, s32 size, SynthesisReverb* reverb);
Acmd* AudioSynth_ProcessSamples(s16* aiBuf, s32 numSamplesPerUpdate, Acmd* cmd, s32 updateIndex);
Acmd* AudioSynth_ProcessSample(s32 noteIndex, NoteSampleState* sampleState, NoteSynthesisState* synthState, s16* aiBuf,
s32 numSamplesPerUpdate, Acmd* cmd, s32 updateIndex);
-Acmd* AudioSynth_ApplySurroundEffect(Acmd* cmd, NoteSampleState* sampleState, NoteSynthesisState* synthState, s32 size,
- s32 dmem, s32 flags);
+Acmd* AudioSynth_ApplySurroundEffect(Acmd* cmd, NoteSampleState* sampleState, NoteSynthesisState* synthState,
+ s32 numSamplesPerUpdate, s32 haasDmem, s32 flags);
Acmd* AudioSynth_FinalResample(Acmd* cmd, NoteSynthesisState* synthState, s32 size, u16 pitch, u16 inpDmem,
s32 resampleFlags);
Acmd* AudioSynth_ProcessEnvelope(Acmd* cmd, NoteSampleState* sampleState, NoteSynthesisState* synthState,
diff --git a/src/code/audio/code_8019AF00.c b/src/code/audio/code_8019AF00.c
index 98be41397..6d1468d82 100644
--- a/src/code/audio/code_8019AF00.c
+++ b/src/code/audio/code_8019AF00.c
@@ -70,7 +70,7 @@ s32 Audio_SetGanonsTowerBgmVolume(u8 targetVolume);
void Audio_StartMorningSceneSequence(u16 seqId);
void Audio_StartSceneSequence(u16 seqId);
-void Audio_PlaySequenceWithSeqPlayerIO(s8 playerIndex, u16 seqId, u8 fadeTimer, s8 arg3, u8 arg4);
+void Audio_PlaySequenceWithSeqPlayerIO(s8 playerIndex, u16 seqId, u8 fadeInDuration, s8 ioPort, u8 ioData);
void func_801A4428(u8 reverbIndex);
void func_801A3038(void);
void Audio_PlayAmbience(u8 ambienceId);
diff --git a/src/code/code_8012EC80.c b/src/code/code_8012EC80.c
index be13b050a..b3204df70 100644
--- a/src/code/code_8012EC80.c
+++ b/src/code/code_8012EC80.c
@@ -96,7 +96,7 @@ u32 gGsFlagsShift[] = {
};
// TODO: use symbols for these icon textures once textures are properly in C
-void* gItemIcons[] = {
+TexturePtr gItemIcons[] = {
0x08000000, // ITEM_OCARINA
0x08001000, // ITEM_BOW
0x08002000, // ITEM_ARROW_FIRE
@@ -249,7 +249,7 @@ u8 gItemSlots[] = {
SLOT_LENS, // ITEM_LENS
SLOT_HOOKSHOT, // ITEM_HOOKSHOT
SLOT_SWORD_GREAT_FAIRY, // ITEM_SWORD_GREAT_FAIRY
- SLOT_BOTTLE_1, //
+ SLOT_BOTTLE_1, // ITEM_LONGSHOT
SLOT_BOTTLE_1, // ITEM_BOTTLE
SLOT_BOTTLE_1, // ITEM_POTION_RED
SLOT_BOTTLE_1, // ITEM_POTION_GREEN
@@ -365,8 +365,8 @@ s16 gItemPrices[] = {
};
// Used to map scene indexes to their region in Termina
-u16 gSceneIdsPerRegion[11][27] = {
- // Great Bay
+u16 gSceneIdsPerRegion[REGION_MAX][27] = {
+ // REGION_GREAT_BAY
{
SCENE_30GYOSON,
SCENE_LABO,
@@ -378,15 +378,15 @@ u16 gSceneIdsPerRegion[11][27] = {
SCENE_PIRATE,
SCENE_35TAKI,
SCENE_KINDAN2,
- -1,
+ 0xFFFF,
},
- // Zora Hall
+ // REGION_ZORA_HALL
{
SCENE_33ZORACITY,
SCENE_BANDROOM,
- -1,
+ 0xFFFF,
},
- // Romani Ranch
+ // REGION_ROMANI_RANCH
{
SCENE_F01,
SCENE_ROMANYMAE,
@@ -394,17 +394,17 @@ u16 gSceneIdsPerRegion[11][27] = {
SCENE_F01C,
SCENE_F01_B,
SCENE_KOEPONARACE,
- -1,
+ 0xFFFF,
},
- // Deku Palace
+ // REGION_DEKU_PALACE
{
SCENE_22DEKUCITY,
SCENE_DEKU_KING,
SCENE_26SARUNOMORI,
SCENE_DANPEI,
- -1,
+ 0xFFFF,
},
- // Southern Swamp
+ // REGION_WOODFALL
{
SCENE_20SICHITAI,
SCENE_20SICHITAI2,
@@ -412,21 +412,18 @@ u16 gSceneIdsPerRegion[11][27] = {
SCENE_WITCH_SHOP,
SCENE_21MITURINMAE,
SCENE_KINSTA1,
- -1,
+ 0xFFFF,
},
- // Clock Town
+ // REGION_CLOCK_TOWN
{
- SCENE_00KEIKOKU, SCENE_TENMON_DAI, SCENE_13HUBUKINOMITI,
- SCENE_24KEMONOMITI, SCENE_SYATEKI_MORI, SCENE_IKANAMAE,
- SCENE_TOWN, SCENE_SYATEKI_MIZU, SCENE_BOWLING,
- SCENE_TAKARAYA, SCENE_YADOYA, SCENE_SONCHONOIE,
- SCENE_MILK_BAR, SCENE_ICHIBA, SCENE_BOMYA,
- SCENE_AYASHIISHOP, SCENE_8ITEMSHOP, SCENE_DOUJOU,
- SCENE_POSTHOUSE, SCENE_TAKARAKUJI, SCENE_BACKTOWN,
- SCENE_CLOCKTOWER, SCENE_INSIDETOWER, SCENE_OKUJOU,
- SCENE_ALLEY, SCENE_DEKUTES, -1,
+ SCENE_00KEIKOKU, SCENE_TENMON_DAI, SCENE_13HUBUKINOMITI, SCENE_24KEMONOMITI, SCENE_SYATEKI_MORI,
+ SCENE_IKANAMAE, SCENE_TOWN, SCENE_SYATEKI_MIZU, SCENE_BOWLING, SCENE_TAKARAYA,
+ SCENE_YADOYA, SCENE_SONCHONOIE, SCENE_MILK_BAR, SCENE_ICHIBA, SCENE_BOMYA,
+ SCENE_AYASHIISHOP, SCENE_8ITEMSHOP, SCENE_DOUJOU, SCENE_POSTHOUSE, SCENE_TAKARAKUJI,
+ SCENE_BACKTOWN, SCENE_CLOCKTOWER, SCENE_INSIDETOWER, SCENE_OKUJOU, SCENE_ALLEY,
+ SCENE_DEKUTES, 0xFFFF,
},
- // Snowhead
+ // REGION_SNOWHEAD
{
SCENE_10YUKIYAMANOMURA,
SCENE_10YUKIYAMANOMURA2,
@@ -437,15 +434,15 @@ u16 gSceneIdsPerRegion[11][27] = {
SCENE_GORON_HAKA,
SCENE_17SETUGEN,
SCENE_17SETUGEN2,
- -1,
+ 0xFFFF,
},
- // Ikana Graveyard
+ // REGION_IKANA_GRAVEYARD
{
SCENE_BOTI,
SCENE_DANPEI2TEST,
- -1,
+ 0xFFFF,
},
- // Ikana Canyon
+ // REGION_IKANA_CANYON
{
SCENE_CASTLE,
SCENE_IKNINSIDE,
@@ -456,21 +453,21 @@ u16 gSceneIdsPerRegion[11][27] = {
SCENE_REDEAD,
SCENE_TOUGITES,
SCENE_HAKASHITA,
- -1,
+ 0xFFFF,
},
- // Goron Village
+ // REGION_GORON_VILLAGE
{
SCENE_11GORONNOSATO,
SCENE_11GORONNOSATO2,
SCENE_16GORON_HOUSE,
SCENE_GORONSHOP,
- -1,
+ 0xFFFF,
},
- // Stone Tower
+ // REGION_STONE_TOWER
{
SCENE_F40,
SCENE_F41,
- -1,
+ 0xFFFF,
},
};
@@ -553,9 +550,9 @@ s32 Inventory_IsMapVisible(s16 sceneId) {
return false;
}
-static u16 sSceneIdsPerTingleMap[6][12] = {
+static u16 sSceneIdsPerTingleMap[TINGLE_MAP_MAX][12] = {
{
- // Clock Town Tingle Map
+ // TINGLE_MAP_CLOCK_TOWN
SCENE_00KEIKOKU,
SCENE_BOTI,
SCENE_13HUBUKINOMITI,
@@ -566,20 +563,20 @@ static u16 sSceneIdsPerTingleMap[6][12] = {
SCENE_BACKTOWN,
SCENE_CLOCKTOWER,
SCENE_ALLEY,
- -1,
+ 0xFFFF,
},
{
- // Woodfall Tingle Map
+ // TINGLE_MAP_WOODFALL
SCENE_20SICHITAI,
SCENE_20SICHITAI2,
SCENE_21MITURINMAE,
SCENE_22DEKUCITY,
SCENE_DEKU_KING,
SCENE_KINSTA1,
- -1,
+ 0xFFFF,
},
{
- // Snowhead Tingle Map
+ // TINGLE_MAP_SNOWHEAD
SCENE_10YUKIYAMANOMURA,
SCENE_10YUKIYAMANOMURA2,
SCENE_11GORONNOSATO,
@@ -590,20 +587,20 @@ static u16 sSceneIdsPerTingleMap[6][12] = {
SCENE_GORONRACE,
SCENE_17SETUGEN,
SCENE_17SETUGEN2,
- -1,
+ 0xFFFF,
},
{
- // Romani Ranch Tingle Map
+ // TINGLE_MAP_ROMANI_RANCH
SCENE_F01,
SCENE_ROMANYMAE,
SCENE_OMOYA,
SCENE_F01C,
SCENE_F01_B,
SCENE_KOEPONARACE,
- -1,
+ 0xFFFF,
},
{
- // Great Bay Tingle Map
+ // TINGLE_MAP_GREAT_BAY
SCENE_30GYOSON,
SCENE_SINKAI,
SCENE_31MISAKI,
@@ -611,28 +608,28 @@ static u16 sSceneIdsPerTingleMap[6][12] = {
SCENE_KAIZOKU,
SCENE_33ZORACITY,
SCENE_35TAKI,
- -1,
+ 0xFFFF,
},
{
- // Stone Tower Tingle Map
+ // TINGLE_MAP_STONE_TOWER
SCENE_F40,
SCENE_F41,
SCENE_CASTLE,
SCENE_IKANA,
SCENE_REDEAD,
- -1,
+ 0xFFFF,
},
};
/**
- * Map visibility is achieved by purchasing a tingle map
+ * Removing clouds from the World Map is achieved by purchasing a tingle map
*/
-void Inventory_SetMapVisibility(s16 tingleIndex) {
+void Inventory_SetWorldMapCloudVisibility(s16 tingleIndex) {
s16 i = 0;
s16 index = 0;
u16(*tingleMapSceneIds)[] = &sSceneIdsPerTingleMap[tingleIndex];
- if ((tingleIndex >= 0) && (tingleIndex < 6)) {
+ if ((tingleIndex >= 0) && (tingleIndex < TINGLE_MAP_MAX)) {
while (true) {
if ((*tingleMapSceneIds)[i] == 0xFFFF) {
break;
@@ -665,21 +662,21 @@ void Inventory_SetMapVisibility(s16 tingleIndex) {
}
if ((*tingleMapSceneIds) == sSceneIdsPerTingleMap[0]) {
- gSaveContext.save.mapsVisible |= 3;
+ gSaveContext.save.worldMapCloudVisibility |= 3;
} else if ((*tingleMapSceneIds) == sSceneIdsPerTingleMap[1]) {
- gSaveContext.save.mapsVisible |= 0x1C;
+ gSaveContext.save.worldMapCloudVisibility |= 0x1C;
} else if ((*tingleMapSceneIds) == sSceneIdsPerTingleMap[2]) {
- gSaveContext.save.mapsVisible |= 0xE0;
+ gSaveContext.save.worldMapCloudVisibility |= 0xE0;
} else if ((*tingleMapSceneIds) == sSceneIdsPerTingleMap[3]) {
- gSaveContext.save.mapsVisible |= 0x100;
+ gSaveContext.save.worldMapCloudVisibility |= 0x100;
} else if ((*tingleMapSceneIds) == sSceneIdsPerTingleMap[4]) {
- gSaveContext.save.mapsVisible |= 0x1E00;
+ gSaveContext.save.worldMapCloudVisibility |= 0x1E00;
} else if ((*tingleMapSceneIds) == sSceneIdsPerTingleMap[5]) {
- gSaveContext.save.mapsVisible |= 0x6000;
+ gSaveContext.save.worldMapCloudVisibility |= 0x6000;
}
}
- XREG(95) = 0;
+ R_MINIMAP_DISABLED = false;
}
/**
diff --git a/src/code/title_setup.c b/src/code/title_setup.c
index 374a7373a..8cebfe554 100644
--- a/src/code/title_setup.c
+++ b/src/code/title_setup.c
@@ -11,25 +11,25 @@ void Setup_SetRegs(void) {
R_MAGIC_CONSUME_TIMER_GIANTS_MASK = 80;
XREG(43) = 0xFC54;
- XREG(44) = 215;
- XREG(45) = 218;
- XREG(68) = 97;
- XREG(69) = 147;
- XREG(70) = 40;
- XREG(73) = 30;
- XREG(74) = 66;
- XREG(75) = 30;
- XREG(76) = 28;
- XREG(77) = 60;
- XREG(78) = 47;
- XREG(79) = 98;
- XREG(87) = 0;
- XREG(88) = 86;
- XREG(89) = 600;
- XREG(90) = 450;
+ XREG(44) = 0xD7;
+ XREG(45) = 0xDA;
+ XREG(68) = 0x61;
+ XREG(69) = 0x93;
+ XREG(70) = 0x28;
+ XREG(73) = 0x1E;
+ XREG(74) = 0x42;
+ XREG(75) = 0x1E;
+ XREG(76) = 0x1C;
+ XREG(77) = 0x3C;
+ XREG(78) = 0x2F;
+ XREG(79) = 0x62;
+ R_PAUSE_OWLWARP_ALPHA = 0;
+ XREG(88) = 0x56;
+ XREG(89) = 0x258;
+ XREG(90) = 0x1C2;
R_STORY_FILL_SCREEN_ALPHA = 0;
- XREG(94) = 0;
- XREG(95) = 0;
+ R_REVERSE_FLOOR_INDEX = 0;
+ R_MINIMAP_DISABLED = false;
YREG(32) = 0x50;
YREG(33) = 0x3C;
diff --git a/src/code/z_actor.c b/src/code/z_actor.c
index 389f7a051..c5783f4d7 100644
--- a/src/code/z_actor.c
+++ b/src/code/z_actor.c
@@ -861,10 +861,11 @@ void TitleCard_Draw(GameState* gameState, TitleCardContext* titleCtx) {
OPEN_DISPS(gameState->gfxCtx);
- height = (width * height > TMEM_SIZE) ? TMEM_SIZE / width : height;
- spB4 = spB8 + (height * 4);
+ if (width * height > TMEM_SIZE) {
+ height = TMEM_SIZE / width;
+ }
- if (1) {}
+ spB4 = spB8 + (height * 4);
OVERLAY_DISP = func_8012C014(OVERLAY_DISP);
@@ -1060,7 +1061,7 @@ void Actor_SetScale(Actor* actor, f32 scale) {
}
void Actor_SetObjectDependency(PlayState* play, Actor* actor) {
- gSegments[0x06] = PHYSICAL_TO_VIRTUAL(play->objectCtx.status[actor->objBankIndex].segment);
+ gSegments[0x06] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[actor->objBankIndex].segment);
}
void Actor_Init(Actor* actor, PlayState* play) {
@@ -2609,7 +2610,8 @@ s32 Actor_RecordUndrawnActor(PlayState* play, Actor* actor) {
}
void Actor_DrawLensOverlay(Gfx** gfxP, s32 lensMaskSize) {
- func_80164C14(gfxP, &gCircleTex, 4, 0, 6, 6, ((LENS_MASK_ACTIVE_SIZE - lensMaskSize) * 0.003f) + 1.0f);
+ TransitionCircle_LoadAndSetTexture(gfxP, gCircleTex, 4, 0, 6, 6,
+ ((LENS_MASK_ACTIVE_SIZE - lensMaskSize) * 0.003f) + 1.0f);
}
#ifdef NON_EQUIVALENT
diff --git a/src/code/z_collision_check.c b/src/code/z_collision_check.c
index edaa159c6..0e36f1c54 100644
--- a/src/code/z_collision_check.c
+++ b/src/code/z_collision_check.c
@@ -1,3 +1,4 @@
+#include "prevent_bss_reordering.h"
#include "global.h"
Vec3f D_801EDE00;
diff --git a/src/code/z_demo.c b/src/code/z_demo.c
index e1df23c77..73fdd5ab7 100644
--- a/src/code/z_demo.c
+++ b/src/code/z_demo.c
@@ -1,3 +1,4 @@
+#include "prevent_bss_reordering.h"
#include "global.h"
#include "z64quake.h"
#include "z64rumble.h"
diff --git a/src/code/z_effect_soft_sprite_old_init.c b/src/code/z_effect_soft_sprite_old_init.c
index bbdd528a4..4f24651d1 100644
--- a/src/code/z_effect_soft_sprite_old_init.c
+++ b/src/code/z_effect_soft_sprite_old_init.c
@@ -50,7 +50,7 @@ void EffectSs_DrawGEffect(PlayState* play, EffectSs* this, TexturePtr texture) {
SkinMatrix_SetScale(&mfScale, scale, scale, scale);
SkinMatrix_MtxFMtxFMult(&mfTrans, &play->billboardMtxF, &mfTrans11DA0);
SkinMatrix_MtxFMtxFMult(&mfTrans11DA0, &mfScale, &mfResult);
- gSegments[0x06] = PHYSICAL_TO_VIRTUAL(object);
+ gSegments[0x06] = VIRTUAL_TO_PHYSICAL(object);
gSPSegment(POLY_XLU_DISP++, 0x06, object);
mtx = SkinMatrix_MtxFToNewMtx(gfxCtx, &mfResult);
diff --git a/src/code/z_en_hy_code.c b/src/code/z_en_hy_code.c
index 5e32e5c95..19a52c1b4 100644
--- a/src/code/z_en_hy_code.c
+++ b/src/code/z_en_hy_code.c
@@ -84,7 +84,7 @@ EnDoor* EnHy_FindNearestDoor(Actor* actor, PlayState* play) {
}
void EnHy_ChangeObjectAndAnim(EnHy* enHy, PlayState* play, s16 animIndex) {
- gSegments[6] = PHYSICAL_TO_VIRTUAL(play->objectCtx.status[enHy->animObjIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[enHy->animObjIndex].segment);
EnHy_ChangeAnim(&enHy->skelAnime, animIndex);
}
@@ -92,7 +92,7 @@ s32 EnHy_UpdateSkelAnime(EnHy* enHy, PlayState* play) {
s32 isUpdated = false;
if (enHy->actor.draw != NULL) {
- gSegments[6] = PHYSICAL_TO_VIRTUAL(play->objectCtx.status[enHy->animObjIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[enHy->animObjIndex].segment);
SkelAnime_Update(&enHy->skelAnime);
isUpdated = true;
}
@@ -119,7 +119,7 @@ s32 EnHy_Init(EnHy* enHy, PlayState* play, FlexSkeletonHeader* skeletonHeaderSeg
enHy->actor.objBankIndex = enHy->skelLowerObjIndex;
isInitialized = true;
ActorShape_Init(&enHy->actor.shape, 0.0f, NULL, 0.0f);
- gSegments[6] = PHYSICAL_TO_VIRTUAL(play->objectCtx.status[enHy->actor.objBankIndex].segment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[enHy->actor.objBankIndex].segment);
SkelAnime_InitFlex(play, &enHy->skelAnime, skeletonHeaderSeg, NULL, enHy->jointTable, enHy->morphTable,
ENHY_LIMB_MAX);
EnHy_ChangeObjectAndAnim(enHy, play, animIndex);
diff --git a/src/code/z_en_item00.c b/src/code/z_en_item00.c
index 437728f0e..d6ab737c7 100644
--- a/src/code/z_en_item00.c
+++ b/src/code/z_en_item00.c
@@ -843,10 +843,10 @@ void EnItem00_DrawSprite(EnItem00* this, PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
}
-void EnItem00_DrawHeartContainer(EnItem00* actor, PlayState* play) {
+void EnItem00_DrawHeartContainer(EnItem00* this, PlayState* play) {
s32 pad[2];
- if (Object_GetIndex(&play->objectCtx, OBJECT_GI_HEARTS) == actor->actor.objBankIndex) {
+ if (Object_GetIndex(&play->objectCtx, OBJECT_GI_HEARTS) == this->actor.objBankIndex) {
OPEN_DISPS(play->state.gfxCtx);
func_8012C2DC(play->state.gfxCtx);
diff --git a/src/code/z_fbdemo_circle.c b/src/code/z_fbdemo_circle.c
index a822262ee..2a8144ea4 100644
--- a/src/code/z_fbdemo_circle.c
+++ b/src/code/z_fbdemo_circle.c
@@ -1,19 +1,144 @@
#include "global.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo_circle/TransitionCircle_Start.s")
+Gfx D_801D0D00[] = {
+ gsDPPipeSync(),
+ gsDPSetOtherMode(G_AD_DISABLE | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ G_AC_THRESHOLD | G_ZS_PRIM | AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA | FORCE_BL |
+ GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) |
+ GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)),
+ gsDPSetPrimColor(0, 255, 0, 0, 0, 1),
+ gsDPSetBlendColor(0, 0, 0, 1),
+ gsSPEndDisplayList(),
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo_circle/TransitionCircle_Init.s")
+//! @bug: TransitionCircle_Update should take an additional argument `s32 updateRate`
+TransitionInit TransitionCircle_InitVars = {
+ TransitionCircle_Init, TransitionCircle_Destroy, (void*)TransitionCircle_Update, TransitionCircle_Draw,
+ TransitionCircle_Start, TransitionCircle_SetType, TransitionCircle_SetColor, NULL,
+ TransitionCircle_IsDone,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo_circle/TransitionCircle_Destroy.s")
+void TransitionCircle_Start(void* thisx) {
+ TransitionCircle* this = (TransitionCircle*)thisx;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo_circle/TransitionCircle_Update.s")
+ this->stepValue = 0.1f;
+ if (this->direction == TRANSITION_CIRCLE_IN) {
+ this->targetRadius = 0.0f;
+ this->startingRadius = 1.0f;
+ } else {
+ this->startingRadius = 0.0f;
+ this->targetRadius = 1.0f;
+ }
+ this->referenceRadius = this->startingRadius;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo_circle/TransitionCircle_SetColor.s")
+void* TransitionCircle_Init(void* thisx) {
+ TransitionCircle* this = (TransitionCircle*)thisx;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo_circle/TransitionCircle_SetType.s")
+ bzero(this, sizeof(TransitionCircle));
+ this->maskType = 1;
+ this->texture = gCircleTex;
+ this->masks = 6;
+ this->maskt = 6;
+ this->unk_1E = 4;
+ this->unk_1F = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo_circle/func_80164C14.s")
+ return this;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo_circle/TransitionCircle_Draw.s")
+void TransitionCircle_Destroy(void* thisx) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo_circle/TransitionCircle_IsDone.s")
+void TransitionCircle_Update(void* thisx) {
+ TransitionCircle* this = (TransitionCircle*)thisx;
+
+ this->isDone = Math_StepToF(&this->referenceRadius, this->targetRadius, this->stepValue);
+}
+
+void TransitionCircle_SetColor(void* thisx, u32 color) {
+ TransitionCircle* this = (TransitionCircle*)thisx;
+
+ this->color.rgba = color;
+}
+
+void TransitionCircle_SetType(void* thisx, s32 type) {
+ TransitionCircle* this = (TransitionCircle*)thisx;
+
+ if (type & TC_SET_PARAMS) {
+ this->maskType = FBDEMO_CIRCLE_GET_MASK_TYPE(type);
+ } else if (type == 1) {
+ this->direction = TRANSITION_CIRCLE_OUT;
+ } else {
+ this->direction = TRANSITION_CIRCLE_IN;
+ }
+}
+
+void TransitionCircle_LoadAndSetTexture(Gfx** gfxp, TexturePtr texture, s32 fmt, s32 arg3, s32 masks, s32 maskt,
+ f32 arg6) {
+ Gfx* gfx = *gfxp;
+ s32 xh = D_801FBBCC;
+ s32 yh = D_801FBBCE;
+ s32 width = 1 << masks;
+ s32 height = 1 << maskt;
+ f32 s;
+ f32 t;
+ s32 dtdy;
+ s32 dsdx;
+
+ gDPLoadTextureBlock_4b(gfx++, texture, fmt, width, height, 0, G_TX_MIRROR | G_TX_CLAMP, G_TX_MIRROR | G_TX_CLAMP,
+ masks, maskt, G_TX_NOLOD, G_TX_NOLOD);
+ gDPSetTileSize(gfx++, G_TX_RENDERTILE, ((SCREEN_WIDTH / 2) - width) << 2, ((SCREEN_HEIGHT / 2) - height) << 2,
+ ((SCREEN_WIDTH / 2) + (width - 1)) << 2, ((SCREEN_HEIGHT / 2) + (height - 1)) << 2);
+
+ s = ((1.0f - (1.0f / arg6)) * (SCREEN_WIDTH / 2)) + 70.0f;
+ t = ((1.0f - (1.0f / arg6)) * (SCREEN_HEIGHT / 2)) + 50.0f;
+
+ if (s < -1023.0f) {
+ s = -1023.0f;
+ }
+ if (t < -1023.0f) {
+ t = -1023.0f;
+ }
+
+ if ((s <= -1023.0f) || (t <= -1023.0f)) {
+ dsdx = 0;
+ dtdy = 0;
+ } else {
+ dsdx = ((SCREEN_WIDTH - (2.0f * s)) / gScreenWidth) * (1 << 10);
+ dtdy = ((SCREEN_HEIGHT - (2.0f * t)) / gScreenHeight) * (1 << 10);
+ }
+
+ gSPTextureRectangle(gfx++, 0, 0, xh << 2, yh << 2, G_TX_RENDERTILE, (s32)(s * (1 << 5)), (s32)(t * (1 << 5)), dsdx,
+ dtdy);
+ gDPPipeSync(gfx++);
+
+ *gfxp = gfx;
+}
+
+void TransitionCircle_Draw(void* thisx, Gfx** gfxp) {
+ Gfx* gfx = *gfxp;
+ TransitionCircle* this = (TransitionCircle*)thisx;
+
+ gDPPipeSync(gfx++);
+ gSPDisplayList(gfx++, &D_801D0D00);
+ gDPSetPrimColor(gfx++, 0, this->color.a, this->color.r, this->color.g, this->color.b, 1);
+ if (this->maskType == 0) {
+ gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIM_LOD_FRAC, PRIMITIVE, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
+ PRIM_LOD_FRAC, PRIMITIVE);
+ } else {
+ gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, 1, TEXEL0, PRIM_LOD_FRAC, PRIMITIVE, 0, 0, 0, PRIMITIVE, 1, TEXEL0,
+ PRIM_LOD_FRAC, PRIMITIVE);
+ }
+ TransitionCircle_LoadAndSetTexture(&gfx, this->texture, G_IM_FMT_I, 0, this->masks, this->maskt,
+ this->referenceRadius);
+ gDPPipeSync(gfx++);
+
+ *gfxp = gfx;
+}
+
+s32 TransitionCircle_IsDone(void* thisx) {
+ TransitionCircle* this = (TransitionCircle*)thisx;
+
+ return this->isDone;
+}
diff --git a/src/code/z_fbdemo_dlftbls.c b/src/code/z_fbdemo_dlftbls.c
index 7ebce9e69..9d3685a45 100644
--- a/src/code/z_fbdemo_dlftbls.c
+++ b/src/code/z_fbdemo_dlftbls.c
@@ -1,5 +1,54 @@
#include "global.h"
+#include "initvars.h"
+#include "overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.h"
+#include "overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.h"
+#include "overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.h"
+#include "overlays/fbdemos/ovl_fbdemo_wipe4/z_fbdemo_wipe4.h"
+#include "overlays/fbdemos/ovl_fbdemo_wipe5/z_fbdemo_wipe5.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo_dlftbls/func_80163C90.s")
+#define TRANSITION_OVERLAY(name, filename) \
+ { \
+ { 0, 0 }, SEGMENT_START(ovl_##filename), SEGMENT_END(ovl_##filename), SEGMENT_ROM_START(ovl_##filename), \
+ SEGMENT_ROM_END(ovl_##filename), &name##_InitVars, sizeof(name) \
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_fbdemo_dlftbls/func_80163D80.s")
+#define TRANSITION_OVERLAY_INTERNAL(name) \
+ { { 0, 0 }, NULL, NULL, 0, 0, &name##_InitVars, sizeof(name) }
+
+#define TRANSITION_OVERLAY_UNSET \
+ { 0 }
+
+TransitionOverlay gTransitionOverlayTable[] = {
+ TRANSITION_OVERLAY_INTERNAL(TransitionFade), TRANSITION_OVERLAY(TransitionTriforce, fbdemo_triforce),
+ TRANSITION_OVERLAY(TransitionWipe1, fbdemo_wipe1), TRANSITION_OVERLAY(TransitionWipe3, fbdemo_wipe3),
+ TRANSITION_OVERLAY(TransitionWipe4, fbdemo_wipe4), TRANSITION_OVERLAY_INTERNAL(TransitionCircle),
+ TRANSITION_OVERLAY(TransitionWipe5, fbdemo_wipe5),
+};
+
+void Transition_Init(TransitionContext* transitionCtx) {
+ TransitionOverlay* overlayEntry;
+ ptrdiff_t relocOffset;
+ TransitionInit* initInfo[1];
+
+ overlayEntry = &gTransitionOverlayTable[transitionCtx->fbdemoType];
+ TransitionOverlay_Load(overlayEntry);
+
+ relocOffset = (uintptr_t)Lib_PhysicalToVirtual(overlayEntry->loadInfo.addr) - (uintptr_t)overlayEntry->vramStart;
+ initInfo[0] = NULL;
+ initInfo[0] = (overlayEntry->initInfo != NULL) ? (TransitionInit*)((uintptr_t)overlayEntry->initInfo + relocOffset)
+ : initInfo[0];
+
+ transitionCtx->init = initInfo[0]->init;
+ transitionCtx->destroy = initInfo[0]->destroy;
+ transitionCtx->start = initInfo[0]->start;
+ transitionCtx->isDone = initInfo[0]->isDone;
+ transitionCtx->draw = initInfo[0]->draw;
+ transitionCtx->update = initInfo[0]->update;
+ transitionCtx->setType = initInfo[0]->setType;
+ transitionCtx->setColor = initInfo[0]->setColor;
+ transitionCtx->setEnvColor = initInfo[0]->setEnvColor;
+}
+
+void Transition_Destroy(TransitionContext* transitionCtx) {
+ TransitionOverlay_Free(&gTransitionOverlayTable[transitionCtx->fbdemoType]);
+}
diff --git a/src/code/z_kaleido_setup.c b/src/code/z_kaleido_setup.c
index ec9ae8824..0063548b9 100644
--- a/src/code/z_kaleido_setup.c
+++ b/src/code/z_kaleido_setup.c
@@ -22,19 +22,19 @@ void func_800F4A10(PlayState* play) {
pauseCtx->unk_27E = -40;
for (i = 0; i < ARRAY_COUNT(pauseCtx->worldMapPoints); i++) {
- pauseCtx->worldMapPoints[i] = 0;
+ pauseCtx->worldMapPoints[i] = false;
}
if (pauseCtx->state == 1) {
- for (i = 0; i < 11; i++) {
- if ((gSaveContext.save.mapsVisited >> i) & 1) {
- pauseCtx->worldMapPoints[i] = 1;
+ for (i = 0; i < REGION_MAX; i++) {
+ if ((gSaveContext.save.regionsVisited >> i) & 1) {
+ pauseCtx->worldMapPoints[i] = true;
}
}
} else {
- for (i = 9; i >= 0; i--) {
+ for (i = OWL_WARP_STONE_TOWER; i >= OWL_WARP_GREAT_BAY_COAST; i--) {
if ((gSaveContext.save.playerData.owlActivationFlags >> i) & 1) {
- pauseCtx->worldMapPoints[i] = 1;
+ pauseCtx->worldMapPoints[i] = true;
pauseCtx->cursorPoint[PAUSE_WORLD_MAP] = i;
}
}
@@ -57,9 +57,9 @@ void func_800F4A10(PlayState* play) {
YREG(21) = -0x0622;
YREG(22) = -0x0C44;
YREG(23) = 0x0622;
- YREG(24) = -0x0622;
- YREG(25) = -0x005A;
- YREG(26) = -0x3840;
+ R_PAUSE_WORLD_MAP_YAW = -0x622;
+ R_PAUSE_WORLD_MAP_Y_OFFSET = -90;
+ R_PAUSE_WORLD_MAP_DEPTH = -14400;
}
void KaleidoSetup_Update(PlayState* play) {
@@ -124,18 +124,18 @@ void KaleidoSetup_Init(PlayState* play) {
pauseCtx->unk_20C = 936.0f;
pauseCtx->unk_220 = -314.0f;
- pauseCtx->cursorPoint[PAUSE_MAP] = XREG(94) + 3;
+ pauseCtx->cursorPoint[PAUSE_MAP] = R_REVERSE_FLOOR_INDEX + (DUNGEON_FLOOR_INDEX_4 - 1);
pauseCtx->cursorSpecialPos = PAUSE_CURSOR_PAGE_RIGHT;
pauseCtx->pageSwitchTimer = 0;
pauseCtx->cursorItem[PAUSE_ITEM] = PAUSE_ITEM_NONE;
- pauseCtx->cursorItem[PAUSE_MAP] = XREG(94) + 3;
+ pauseCtx->cursorItem[PAUSE_MAP] = R_REVERSE_FLOOR_INDEX + (DUNGEON_FLOOR_INDEX_4 - 1);
pauseCtx->cursorItem[PAUSE_QUEST] = PAUSE_ITEM_NONE;
pauseCtx->cursorItem[PAUSE_MASK] = PAUSE_ITEM_NONE;
pauseCtx->cursorSlot[PAUSE_ITEM] = 0;
- pauseCtx->cursorSlot[PAUSE_MAP] = XREG(94) + 3;
+ pauseCtx->cursorSlot[PAUSE_MAP] = R_REVERSE_FLOOR_INDEX + (DUNGEON_FLOOR_INDEX_4 - 1);
pauseCtx->cursorColorSet = 2;
pauseCtx->unk_2A0 = -1;
diff --git a/src/code/z_lib.c b/src/code/z_lib.c
index 03e6c395c..6466b337c 100644
--- a/src/code/z_lib.c
+++ b/src/code/z_lib.c
@@ -704,20 +704,30 @@ void* Lib_SegmentedToVirtual(void* ptr) {
void* Lib_SegmentedToVirtualNull(void* ptr) {
if (((uintptr_t)ptr >> 28) == 0) {
return ptr;
+ } else {
+ return SEGMENTED_TO_VIRTUAL(ptr);
}
-
- return SEGMENTED_TO_VIRTUAL(ptr);
}
-void* Lib_PhysicalToVirtual(void* ptr) {
+/*
+ * Converts a 32-bit virtual address (0x80XXXXXX) to a 24-bit physical address (0xXXXXXX). The NULL case accounts for
+ * the NULL virtual address being 0x00000000 and not 0x80000000. Used by transition overlays, which store their
+ * addresses in 24-bit fields.
+ */
+void* Lib_VirtualToPhysical(void* ptr) {
if (ptr == NULL) {
return NULL;
} else {
- return (void*)PHYSICAL_TO_VIRTUAL(ptr);
+ return (void*)VIRTUAL_TO_PHYSICAL(ptr);
}
}
-void* Lib_PhysicalToVirtualNull(void* ptr) {
+/*
+ * Converts a 24-bit physical address (0xXXXXXX) to a 32-bit virtual address (0x80XXXXXX). The NULL case accounts for
+ * the NULL virtual address being 0x00000000 and not 0x80000000. Used by transition overlays, which store their
+ * addresses in 24-bit fields.
+ */
+void* Lib_PhysicalToVirtual(void* ptr) {
if (ptr == NULL) {
return NULL;
} else {
diff --git a/src/code/z_map_exp.c b/src/code/z_map_exp.c
index 2b5eb1aac..57f51a20a 100644
--- a/src/code/z_map_exp.c
+++ b/src/code/z_map_exp.c
@@ -245,14 +245,14 @@ void Map_Update(PlayState* play) {
if (floor != -1) {
gSaveContext.save.permanentSceneFlags[Play_GetOriginalSceneId(play->sceneId)].unk_14 |=
gBitFlags[FLOOR_INDEX_MAX - floor];
- XREG(94) = FLOOR_INDEX_MAX - floor;
+ R_REVERSE_FLOOR_INDEX = FLOOR_INDEX_MAX - floor;
if (interfaceCtx->mapRoomNum != sLastRoomNum) {
sLastRoomNum = interfaceCtx->mapRoomNum;
}
}
} else if (Map_IsInBossArea(play)) {
func_80105294();
- XREG(94) = FLOOR_INDEX_MAX - func_80105318();
+ R_REVERSE_FLOOR_INDEX = FLOOR_INDEX_MAX - func_80105318();
}
}
}
diff --git a/src/code/z_message.c b/src/code/z_message.c
index 94b0e4b91..0465513f4 100644
--- a/src/code/z_message.c
+++ b/src/code/z_message.c
@@ -256,34 +256,33 @@ void func_8014CCB4(PlayState* play, s16* decodedBufPos, s32* offset, f32* arg3)
#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/func_8014D304.s")
-extern u16 D_801D0188[][9];
-extern s16 D_801D0250[];
+extern u16 D_801D0188[OWL_WARP_MAX][9];
+extern s16 D_801D0250[OWL_WARP_MAX];
void func_8014D62C(PlayState* play, s32* arg1, f32* arg2, s16* arg3) {
MessageContext* msgCtx = &play->msgCtx;
PauseContext* pauseCtx = &play->pauseCtx;
- s16 temp_s6;
+ s16 stringLimit;
s16 temp_s1 = *arg3;
s32 temp_s2 = *arg1;
f32 sp3C = *arg2;
- s16 phi_v0;
+ s16 owlWarpId;
s16 phi_s0;
- if ((func_8010A0A4(play) != 0) || (play->sceneId == SCENE_SECOM)) {
- phi_v0 = 0xA;
+ if (func_8010A0A4(play) || (play->sceneId == SCENE_SECOM)) {
+ owlWarpId = OWL_WARP_ENTRANCE;
} else {
- phi_v0 = pauseCtx->cursorPoint[PAUSE_WORLD_MAP];
+ owlWarpId = pauseCtx->cursorPoint[PAUSE_WORLD_MAP];
}
+ stringLimit = D_801D0250[owlWarpId];
- temp_s6 = D_801D0250[phi_v0];
-
- for (phi_s0 = 0; phi_s0 < temp_s6; phi_s0++, temp_s1++, temp_s2 += 0x80) {
- msgCtx->decodedBuffer.wchar[temp_s1] = D_801D0188[phi_v0][phi_s0];
- Font_LoadChar(play, D_801D0188[phi_v0][phi_s0], temp_s2);
+ for (phi_s0 = 0; phi_s0 < stringLimit; phi_s0++, temp_s1++, temp_s2 += 0x80) {
+ msgCtx->decodedBuffer.wchar[temp_s1] = D_801D0188[owlWarpId][phi_s0];
+ Font_LoadChar(play, D_801D0188[owlWarpId][phi_s0], temp_s2);
}
temp_s1--;
- sp3C += (temp_s6 - 1) * (16.0f * msgCtx->unk12098);
+ sp3C += (stringLimit - 1) * (16.0f * msgCtx->unk12098);
*arg3 = temp_s1;
*arg1 = temp_s2;
diff --git a/src/code/z_message_nes.c b/src/code/z_message_nes.c
index fef293b46..fb8dbfcbf 100644
--- a/src/code/z_message_nes.c
+++ b/src/code/z_message_nes.c
@@ -17,31 +17,43 @@ u8 D_801D06F0[4][8] = { { "rupee(s)" }, //EN
// rupeesTextLength
u8 D_801D0710[4] = {8,8,5,8};
-//TextArea
-char D_801D0714[11][16] = {
- "Great Bay Coast",
- "Zora Cape",
- "Snowhead",
- "Mountain Village",
- "Clock Town",
- "Milk Road",
- "Woodfall",
- "Southern Swamp",
- "Ikana Canyon",
- "Stone Tower",
- "Entrance"
- };
-
-//TextAreaLength
-s16 D_801D07C4[11] = {15,9,8,16,10,9,8,14,12,11,8};
+// sOwlWarpText
+char D_801D0714[OWL_WARP_MAX][16] = {
+ "Great Bay Coast", // OWL_WARP_GREAT_BAY_COAST
+ "Zora Cape", // OWL_WARP_ZORA_CAPE
+ "Snowhead", // OWL_WARP_SNOWHEAD
+ "Mountain Village", // OWL_WARP_MOUNTAIN_VILLAGE
+ "Clock Town", // OWL_WARP_CLOCK_TOWN
+ "Milk Road", // OWL_WARP_MILK_ROAD
+ "Woodfall", // OWL_WARP_WOODFALL
+ "Southern Swamp", // OWL_WARP_SOUTHERN_SWAMP
+ "Ikana Canyon", // OWL_WARP_IKANA_CANYON
+ "Stone Tower", // OWL_WARP_STONE_TOWER
+ "Entrance", // OWL_WARP_ENTRANCE
+};
+
+// sOwlWarpTextLength
+s16 D_801D07C4[OWL_WARP_MAX] = {
+ 15, // OWL_WARP_GREAT_BAY_COAST
+ 9, // OWL_WARP_ZORA_CAPE
+ 8, // OWL_WARP_SNOWHEAD
+ 16, // OWL_WARP_MOUNTAIN_VILLAGE
+ 10, // OWL_WARP_CLOCK_TOWN
+ 9, // OWL_WARP_MILK_ROAD
+ 8, // OWL_WARP_WOODFALL
+ 14, // OWL_WARP_SOUTHERN_SWAMP
+ 12, // OWL_WARP_IKANA_CANYON
+ 11, // OWL_WARP_STONE_TOWER
+ 8, // OWL_WARP_ENTRANCE
+};
#endif
extern f32 D_801D0470[159];
extern u8 D_801D06F0[4][8];
extern u8 D_801D0710[4];
-extern u8 D_801D0714[11][16];
-extern s16 D_801D07C4[11];
+extern u8 D_801D0714[OWL_WARP_MAX][16];
+extern s16 D_801D07C4[OWL_WARP_MAX];
void Message_FindMessageNES(PlayState* play, u16 textId) {
MessageContext* msgCtx = &play->msgCtx;
@@ -244,28 +256,28 @@ void Message_LoadTimeNES(PlayState* play, u8 arg1, s32* offset, f32* arg3, s16*
*arg3 = f;
}
-void Message_LoadAreaTextNES(PlayState* play, s32* offset, f32* arg2, s16* decodedBufPos) {
+void Message_LoadOwlWarpTextNES(PlayState* play, s32* offset, f32* arg2, s16* decodedBufPos) {
MessageContext* msgCtx = &play->msgCtx;
s16 p = *decodedBufPos;
s32 o = *offset;
f32 f = *arg2;
s16 i;
u8 currentChar;
- s16 currentArea;
+ s16 owlWarpId;
s16 stringLimit;
- if ((func_8010A0A4(play) != 0) || (play->sceneId == SCENE_SECOM)) {
- currentArea = 10;
+ if (func_8010A0A4(play) || (play->sceneId == SCENE_SECOM)) {
+ owlWarpId = OWL_WARP_ENTRANCE;
} else {
- currentArea = play->pauseCtx.cursorPoint[PAUSE_WORLD_MAP];
+ owlWarpId = play->pauseCtx.cursorPoint[PAUSE_WORLD_MAP];
}
- stringLimit = D_801D07C4[currentArea];
+ stringLimit = D_801D07C4[owlWarpId];
for (i = 0; i < stringLimit; i++) {
- msgCtx->decodedBuffer.schar[p] = D_801D0714[currentArea][i];
+ msgCtx->decodedBuffer.schar[p] = D_801D0714[owlWarpId][i];
currentChar = msgCtx->decodedBuffer.schar[p];
if (currentChar != ' ') {
- Font_LoadCharNES(play, D_801D0714[currentArea][i], o);
+ Font_LoadCharNES(play, D_801D0714[owlWarpId][i], o);
o += FONT_CHAR_TEX_SIZE;
}
currentChar = msgCtx->decodedBuffer.schar[p];
diff --git a/src/code/z_overlay.c b/src/code/z_overlay.c
index a358cefe6..2c8c8d6d7 100644
--- a/src/code/z_overlay.c
+++ b/src/code/z_overlay.c
@@ -1,14 +1,103 @@
+/**
+ * @file z_overlay.c
+ *
+ * Functions for handling transition overlays in memory
+ *
+ * Status codes returned from TransitionOverlay_Load and TransitionOverlay_Free:
+ *
+ * -1 : failed allocation or null reference
+ * 0 : successfully loaded/freed overlay
+ * 1 : successfully added/removed instance
+ * 2 : overlay is loaded but has no instances (?) TODO: Figure out why this exists
+ * 3 : internal overlay, so always loaded
+ */
+
#include "global.h"
#include "z64load.h"
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_overlay/func_801651B0.s")
+void* TransitionOverlay_VramToRam(TransitionOverlay* overlayEntry, void* vramAddr) {
+ void* loadedRamAddr = Lib_PhysicalToVirtual(overlayEntry->loadInfo.addr);
+
+ if ((loadedRamAddr != NULL) && (vramAddr >= overlayEntry->vramStart) && (vramAddr < overlayEntry->vramEnd)) {
+ return ((uintptr_t)loadedRamAddr - (uintptr_t)overlayEntry->vramStart) + (uintptr_t)vramAddr;
+ }
+ return vramAddr;
+}
+
+void TransitionOverlay_VramToRamArray(TransitionOverlay* overlayEntry, void** vramAddrs, s32 count) {
+ s32 i;
+
+ for (i = 0; i < count; i++) {
+ vramAddrs[i] = TransitionOverlay_VramToRam(overlayEntry, vramAddrs[i]);
+ }
+}
+
+s32 TransitionOverlay_Load(TransitionOverlay* overlayEntry) {
+ s32 count;
+ void* loadedRamAddr;
+
+ if (overlayEntry->vromStart == 0) {
+ return 3;
+ }
+ if (Lib_PhysicalToVirtual(overlayEntry->loadInfo.addr) == NULL) {
+ loadedRamAddr = ZeldaArena_Malloc(VRAM_PTR_SIZE(overlayEntry));
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_overlay/func_80165224.s")
+ if (loadedRamAddr == NULL) {
+ return -1;
+ }
+ Load2_LoadOverlay(overlayEntry->vromStart, overlayEntry->vromEnd, overlayEntry->vramStart,
+ overlayEntry->vramEnd, loadedRamAddr);
+ overlayEntry->loadInfo.addr = Lib_VirtualToPhysical(loadedRamAddr);
+ overlayEntry->loadInfo.count = 1;
+ return 0;
+ } else {
+ count = overlayEntry->loadInfo.count;
+ if (count != 0) {
+ count++;
+ overlayEntry->loadInfo.count = count;
+ if (count == 0) {
+ return 2;
+ } else {
+ return 1;
+ }
+ }
+ return 2;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_overlay/func_80165288.s")
+s32 TransitionOverlay_Free(TransitionOverlay* overlayEntry) {
+ s32 count;
+ void* loadedRamAddr;
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_overlay/func_8016537C.s")
+ if (overlayEntry->vromStart == 0) {
+ return 3;
+ }
+ loadedRamAddr = Lib_PhysicalToVirtual(overlayEntry->loadInfo.addr);
+ if (loadedRamAddr != NULL) {
+ count = overlayEntry->loadInfo.count;
+ if (count != 0) {
+ count--;
+ overlayEntry->loadInfo.count = count;
+ if (count == 0) {
+ ZeldaArena_Free(loadedRamAddr);
+ overlayEntry->loadInfo.addr = Lib_VirtualToPhysical(NULL);
+ return 0;
+ }
+ return 1;
+ }
+ return 2;
+ }
+ return -1;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_overlay/func_80165438.s")
+void TransitionOverlay_ClearLoadInfo(TransitionOverlay* overlayEntry) {
+ overlayEntry->loadInfo.word = 0; // Equivalent to overlayEntry->loadInfo.count = 0, overlayEntry->loadInfo.addr = 0;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/code/z_overlay/func_80165444.s")
+void TransitionOverlay_SetSegment(TransitionOverlay* overlayEntry, void* vramStart, void* vramEnd, uintptr_t vromStart,
+ uintptr_t vromEnd) {
+ overlayEntry->vramStart = vramStart;
+ overlayEntry->vramEnd = vramEnd;
+ overlayEntry->vromStart = vromStart;
+ overlayEntry->vromEnd = vromEnd;
+}
diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c
index dc90b540e..87f94c3ff 100644
--- a/src/code/z_parameter.c
+++ b/src/code/z_parameter.c
@@ -6419,7 +6419,6 @@ void Interface_Draw(PlayState* play) {
gSPTextureRectangle(OVERLAY_DISP++, YREG(42) * 4, YREG(43) * 4, (YREG(42) + 0x20) * 4, (YREG(43) + 0x8) * 4,
G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
- if (1) {}
}
// Draw pictograph photo
diff --git a/src/code/z_player_lib.c b/src/code/z_player_lib.c
index fb39b0fe9..c2c438c4b 100644
--- a/src/code/z_player_lib.c
+++ b/src/code/z_player_lib.c
@@ -1107,7 +1107,7 @@ void Player_DrawGetItemImpl(PlayState* play, Player* player, Vec3f* refPos, s32
OPEN_DISPS(play->state.gfxCtx);
- gSegments[6] = PHYSICAL_TO_VIRTUAL(player->giObjectSegment);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(player->giObjectSegment);
gSPSegment(POLY_OPA_DISP++, 0x06, player->giObjectSegment);
gSPSegment(POLY_XLU_DISP++, 0x06, player->giObjectSegment);
@@ -1187,7 +1187,7 @@ void func_80127488(PlayState* play, Player* player, u8 alpha) {
}
void Player_DrawCouplesMask(PlayState* play, Player* player) {
- gSegments[0xA] = PHYSICAL_TO_VIRTUAL(player->maskObjectSegment);
+ gSegments[0xA] = VIRTUAL_TO_PHYSICAL(player->maskObjectSegment);
AnimatedMat_DrawOpa(play, Lib_SegmentedToVirtual(&object_mask_meoto_Matanimheader_001CD8));
}
diff --git a/src/code/z_room.c b/src/code/z_room.c
index e198e95ed..eb615c409 100644
--- a/src/code/z_room.c
+++ b/src/code/z_room.c
@@ -105,7 +105,7 @@ s32 Room_HandleLoadCallbacks(PlayState* play, RoomContext* roomCtx) {
roomCtx->unk31 = 0;
roomCtx->curRoom.segment = roomCtx->activeRoomVram;
// TODO: Segment number enum
- gSegments[0x03] = PHYSICAL_TO_VIRTUAL(roomCtx->activeRoomVram);
+ gSegments[0x03] = VIRTUAL_TO_PHYSICAL(roomCtx->activeRoomVram);
Scene_ProcessHeader(play, (SceneCmd*)roomCtx->curRoom.segment);
func_80123140(play, GET_PLAYER(play));
@@ -130,7 +130,7 @@ s32 Room_HandleLoadCallbacks(PlayState* play, RoomContext* roomCtx) {
void Room_Draw(PlayState* play, Room* room, u32 flags) {
if (room->segment != NULL) {
// TODO: Segment number enum
- gSegments[0x03] = PHYSICAL_TO_VIRTUAL(room->segment);
+ gSegments[0x03] = VIRTUAL_TO_PHYSICAL(room->segment);
roomDrawFuncs[room->mesh->type0.type](play, room, flags);
}
return;
diff --git a/src/code/z_scene.c b/src/code/z_scene.c
index 2c9edb6aa..4e0da3745 100644
--- a/src/code/z_scene.c
+++ b/src/code/z_scene.c
@@ -52,7 +52,7 @@ void Object_InitBank(GameState* gameState, ObjectContext* objectCtx) {
objectCtx->spaceEnd = (void*)((u32)objectCtx->spaceStart + spaceSize);
objectCtx->mainKeepIndex = Object_Spawn(objectCtx, GAMEPLAY_KEEP);
- gSegments[0x04] = PHYSICAL_TO_VIRTUAL(objectCtx->status[objectCtx->mainKeepIndex].segment);
+ gSegments[0x04] = VIRTUAL_TO_PHYSICAL(objectCtx->status[objectCtx->mainKeepIndex].segment);
}
void Object_UpdateBank(ObjectContext* objectCtx) {
@@ -108,7 +108,7 @@ s32 Object_IsLoaded(ObjectContext* objectCtx, s32 index) {
void Object_LoadAll(ObjectContext* objectCtx) {
s32 i;
s32 id;
- u32 vromSize;
+ uintptr_t vromSize;
for (i = 0; i < objectCtx->num; i++) {
id = objectCtx->status[i].id;
@@ -124,7 +124,7 @@ void Object_LoadAll(ObjectContext* objectCtx) {
void* func_8012F73C(ObjectContext* objectCtx, s32 iParm2, s16 id) {
u32 addr;
- u32 vromSize;
+ uintptr_t vromSize;
RomFile* fileTableEntry;
objectCtx->status[iParm2].id = -id;
@@ -224,7 +224,7 @@ void Scene_HeaderCmdSpecialFiles(PlayState* play, SceneCmd* cmd) {
if (cmd->specialFiles.subKeepIndex != 0) {
play->objectCtx.subKeepIndex = Object_Spawn(&play->objectCtx, cmd->specialFiles.subKeepIndex);
// TODO: Segment number enum?
- gSegments[0x05] = PHYSICAL_TO_VIRTUAL(play->objectCtx.status[play->objectCtx.subKeepIndex].segment);
+ gSegments[0x05] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[play->objectCtx.subKeepIndex].segment);
}
if (cmd->specialFiles.cUpElfMsgNum != 0) {
@@ -350,7 +350,7 @@ void Scene_LoadAreaTextures(PlayState* play, s32 fileIndex) {
{ SEGMENT_ROM_START(scene_texture_07), SEGMENT_ROM_END(scene_texture_07) },
{ SEGMENT_ROM_START(scene_texture_08), SEGMENT_ROM_END(scene_texture_08) },
};
- u32 vromStart = sceneTextureFiles[fileIndex].vromStart;
+ uintptr_t vromStart = sceneTextureFiles[fileIndex].vromStart;
size_t size = sceneTextureFiles[fileIndex].vromEnd - vromStart;
if (size != 0) {
@@ -468,8 +468,8 @@ void Scene_HeaderCmdAltHeaderList(PlayState* play, SceneCmd* cmd) {
// SceneTableEntry Header Command 0x17: Cutscene List
void Scene_HeaderCmdCutsceneList(PlayState* play, SceneCmd* cmd) {
- play->csCtx.sceneCsCount = cmd->base.data1;
- play->csCtx.sceneCsList = Lib_SegmentedToVirtual(cmd->base.data2);
+ play->csCtx.sceneCsCount = cmd->cutsceneList.sceneCsCount;
+ play->csCtx.sceneCsList = Lib_SegmentedToVirtual(cmd->cutsceneList.segment);
}
// SceneTableEntry Header Command 0x1B: Actor Cutscene List
@@ -492,8 +492,8 @@ void Scene_HeaderCmdMiniMapCompassInfo(PlayState* play, SceneCmd* cmd) {
func_8010565C(play, cmd->minimapChests.num, cmd->minimapChests.segment);
}
-// SceneTableEntry Header Command 0x1A: Sets Area Visited Flag
-void Scene_HeaderCmdSetAreaVisitedFlag(PlayState* play, SceneCmd* cmd) {
+// SceneTableEntry Header Command 0x19: Sets Region Visited Flag
+void Scene_HeaderCmdSetRegionVisitedFlag(PlayState* play, SceneCmd* cmd) {
s16 j = 0;
s16 i = 0;
@@ -502,7 +502,7 @@ void Scene_HeaderCmdSetAreaVisitedFlag(PlayState* play, SceneCmd* cmd) {
i++;
j = 0;
- if (i == ARRAY_COUNT(gSceneIdsPerRegion)) {
+ if (i == REGION_MAX) {
break;
}
}
@@ -514,8 +514,9 @@ void Scene_HeaderCmdSetAreaVisitedFlag(PlayState* play, SceneCmd* cmd) {
j++;
}
- if (i < ARRAY_COUNT(gSceneIdsPerRegion)) {
- gSaveContext.save.mapsVisited = (gBitFlags[i] | gSaveContext.save.mapsVisited) | gSaveContext.save.mapsVisited;
+ if (i < REGION_MAX) {
+ gSaveContext.save.regionsVisited =
+ (gBitFlags[i] | gSaveContext.save.regionsVisited) | gSaveContext.save.regionsVisited;
}
}
@@ -561,7 +562,7 @@ s32 Scene_ProcessHeader(PlayState* play, SceneCmd* header) {
Scene_HeaderCmdEchoSetting,
Scene_HeaderCmdCutsceneList,
Scene_HeaderCmdAltHeaderList,
- Scene_HeaderCmdSetAreaVisitedFlag,
+ Scene_HeaderCmdSetRegionVisitedFlag,
Scene_HeaderCmdAnimatedMaterials,
Scene_HeaderCmdActorCutsceneList,
Scene_HeaderCmdMiniMap,
diff --git a/src/code/z_scene_proc.c b/src/code/z_scene_proc.c
index 8ddde8a82..4de83bcaa 100644
--- a/src/code/z_scene_proc.c
+++ b/src/code/z_scene_proc.c
@@ -459,8 +459,8 @@ void AnimatedMat_DrawStep(PlayState* play, AnimatedMaterial* matAnim, u32 step)
/**
* Draws an animated material with a step to only the OPA buffer.
*/
-void AnimatedMat_DrawStepOpa(PlayState* play, AnimatedMaterial* textures, u32 step) {
- AnimatedMat_DrawMain(play, textures, 1, step, 1);
+void AnimatedMat_DrawStepOpa(PlayState* play, AnimatedMaterial* matAnim, u32 step) {
+ AnimatedMat_DrawMain(play, matAnim, 1, step, 1);
}
/**
diff --git a/src/code/z_skelanime.c b/src/code/z_skelanime.c
index 8321a309e..088f1469f 100644
--- a/src/code/z_skelanime.c
+++ b/src/code/z_skelanime.c
@@ -8,9 +8,9 @@ s32 SkelAnime_LoopFull(SkelAnime* skelAnime);
s32 SkelAnime_LoopPartial(SkelAnime* skelAnime);
s32 SkelAnime_Once(SkelAnime* skelAnime);
void Animation_PlayLoop(SkelAnime* skelAnime, AnimationHeader* animation);
-void SkelAnime_UpdateTranslation(SkelAnime* skelAnime, Vec3f* pos, s16 angle);
+void SkelAnime_UpdateTranslation(SkelAnime* skelAnime, Vec3f* diff, s16 angle);
void LinkAnimation_Change(PlayState* play, SkelAnime* skelAnime, LinkAnimationHeader* animation, f32 playSpeed,
- f32 frame, f32 frameCount, u8 animationMode, f32 morphFrames);
+ f32 startFrame, f32 endFrame, u8 mode, f32 morphFrames);
void SkelAnime_CopyFrameTable(SkelAnime* skelAnime, Vec3s* dst, Vec3s* src);
static AnimationEntryCallback sAnimationLoadDone[] = {