Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2,251 changes: 1,129 additions & 1,122 deletions ASM/build/asm_symbols.txt

Large diffs are not rendered by default.

Binary file modified ASM/build/bundle.o
Binary file not shown.
1,496 changes: 751 additions & 745 deletions ASM/build/c_symbols.txt

Large diffs are not rendered by default.

97 changes: 59 additions & 38 deletions ASM/c/z64.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define Z64_H
#include <stdint.h>
#include <n64.h>
#include <assert.h>
#include "z64_math.h"
#include "color.h"
#include "z64collision_check.h"
Expand Down Expand Up @@ -805,6 +806,8 @@ typedef struct {
/* 0x1450 */
} z64_file_t;

static_assert(sizeof(z64_file_t) == 0x1450, "Size of z64_file_t has changed");

typedef struct {
uint8_t* readBuff; /* 0x00 */
} SramContext; // size = 0x4
Expand Down Expand Up @@ -1027,6 +1030,39 @@ struct z64_actor_s
/* 0x013C */
};

typedef struct {
/* file loading params */
uint32_t vrom_addr;
void *dram_addr;
uint32_t size;
/* unknown, seem to be unused */
void *unk_00_;
uint32_t unk_01_;
uint32_t unk_02_;
/* completion notification params */
OSMesgQueue *notify_queue;
OSMesg notify_message;
} z64_getfile_t;

/* object structs */
typedef struct {
int16_t id;
void *data;
z64_getfile_t getfile;
OSMesgQueue load_mq;
OSMesg load_m;
} z64_mem_obj_t;

typedef struct {
void *obj_space_start;
void *obj_space_end;
uint8_t n_objects;
uint8_t n_spawned_objects;
uint8_t keep_index;
uint8_t skeep_index;
z64_mem_obj_t objects[19];
} z64_obj_ctxt_t;

typedef struct {
/* 0x00 */ uint16_t id;
/* 0x02 */ z64_xyz_t pos;
Expand All @@ -1038,7 +1074,12 @@ typedef struct {
z64_actor_t common; /* 0x0000 */
char unk_00_[0x0013]; /* 0x013C */
uint8_t current_mask; /* 0x014F */
char unk_01_[0x02D4]; /* 0x0150 */
char unk_01_[0x0014]; /* 0x0150 */
z64_getfile_t giObjectDmaRequest; /* 0x0164 */
OSMesgQueue giObjectLoadQueue; /* 0x0184 */
OSMesg giObjectLoadMsg; /* 0x019C */
void* giObjectSegment; /* 0x01A0 */
char unk_01b_[0x0280]; /* 0x01A4 */
int8_t incoming_item_id; /* 0x0424 */
char unk_02_[0x0003]; /* 0x0425 */
z64_actor_t* incoming_item_actor; /* 0x0428 */
Expand All @@ -1065,6 +1106,8 @@ typedef struct {
/* 0x0888 */
} z64_link_t;

static_assert(sizeof(z64_link_t) == 0x0888, "Size of z64_link_t has changed");

typedef struct DynaPolyActor {
z64_actor_t actor; /* 0x000 */
int32_t bgId; /* 0x14C */
Expand Down Expand Up @@ -1112,39 +1155,6 @@ typedef struct {
/* 0x00A4 */
} z64_ctxt_t;

typedef struct {
/* file loading params */
uint32_t vrom_addr;
void *dram_addr;
uint32_t size;
/* unknown, seem to be unused */
void *unk_00_;
uint32_t unk_01_;
uint32_t unk_02_;
/* completion notification params */
OSMesgQueue *notify_queue;
OSMesg notify_message;
} z64_getfile_t;

/* object structs */
typedef struct {
int16_t id;
void *data;
z64_getfile_t getfile;
OSMesgQueue load_mq;
OSMesg load_m;
} z64_mem_obj_t;

typedef struct {
void *obj_space_start;
void *obj_space_end;
uint8_t n_objects;
uint8_t n_spawned_objects;
uint8_t keep_index;
uint8_t skeep_index;
z64_mem_obj_t objects[19];
} z64_obj_ctxt_t;

typedef struct {
uint8_t code;
uint8_t data1;
Expand Down Expand Up @@ -1438,7 +1448,12 @@ typedef struct {
int8_t cutscene_state; /* 0x01D6C */
char unk_0F_[0x036B]; /* 0x01D6D */
MessageContext msgContext; /* 0x020D8 */
char unk_12_[0x0246]; /* 0x104EC */
char unk_12_[0x0134]; /* 0x104EC */
uint8_t* parameterSegment; /* 0x10620 */
uint8_t* doActionSegment; /* 0x10624 */
uint8_t* iconItemSegment; /* 0x10628 */
uint8_t* mapSegment; /* 0x1062C */
char unk_12b_[0x0102]; /* 0x10630 */
struct {
uint16_t unk_00_;
uint16_t fadeout;
Expand Down Expand Up @@ -1471,9 +1486,12 @@ typedef struct {
char unk_15_[0x0D90]; /* 0x10A14 */
z64_obj_ctxt_t obj_ctxt; /* 0x117A4 */
int8_t room_index; /* 0x11CBC */
char unk_16_[0x000B]; /* 0x11CBD */
void *room_ptr; /* 0x11CC8 */
char unk_17_[0x00D4]; /* 0x11CCC */
char unk_16_[0x0037]; /* 0x11CBD */
z64_getfile_t roomDmaRequest; /* 0x11CF4 */
OSMesgQueue roomLoadQueue; /* 0x11D14 */
OSMesg roomLoadMsg; /* 0x11D2C */
char drawParams[4]; /* 0x11D30 */
char unk_17_[0x006c]; /* 0x11D34 */
float billboard_mtx[4][4]; /* 0x11DA0 */
char unk_18_[0x0004]; /* 0x11DE0 */
uint32_t gameplay_frames; /* 0x11DE4 */
Expand All @@ -1500,6 +1518,7 @@ typedef struct {
char unk_26_[0x00FC]; /* 0x1241C */
} z64_game_t; // 0x12518

static_assert(sizeof(z64_game_t) == 0x12518, "Size of z64_game_t has changed");

typedef struct {
char unk_00_[0x01D8]; /* 0x00000 */
Expand Down Expand Up @@ -2485,5 +2504,7 @@ extern void Fault_AddHungupAndCrashImpl(const char* msg1, const char* msg2);
extern int32_t sprintf(char* dst, char* fmt, ...);
extern int32_t CutsceneFlags_Get(void* play, int16_t flag);
extern int32_t DemoKankyo_CutsceneFlags_Get_Hook(void* play, int16_t flag);
extern int32_t DmaMgr_RequestAsync(z64_getfile_t* req, void* ram, uintptr_t vrom,
size_t size, uint32_t unk, OSMesgQueue* queue, OSMesg msg);

#endif
38 changes: 38 additions & 0 deletions ASM/c/z_map_exp.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#include "z64.h"

// For other parts of the struct, see decomp
typedef struct MapData {
/* 0x00 */ char known_01[0x24];
/* 0x24 */ uint16_t* owMinimapTexSize;
/* 0x28 */ char known_02[0x48];
} MapData; // size = 0x70

extern MapData* gMapData;

// Load extended minimap of Gerudo Fortress if receive Gerudo Card there
void GerudoCard_ChangeMinimap() {
z64_game_t* play = &z64_game;
z64_link_t* player = &z64_link;

if (play->scene_index == 0x5D) { // SCENE_GERUDOS_FORTRESS
// Using GI object DMA variables
// 0x00974600 address to ext minimap data, 0xC = mapIndex
DmaMgr_RequestAsync(&player->giObjectDmaRequest, play->mapSegment, 0x00974600,
gMapData->owMinimapTexSize[0xC], 0, &player->giObjectLoadQueue, NULL);
}
}

// Switch minimap of Lake Hylia when changing water level
void LakeHylia_ChangeMinimap(z64_game_t* play) {
z64_link_t* player = &z64_link;
uintptr_t minimapAddress;

if (z64_file.event_chk_inf[6] & 0x200) { // water level flag
minimapAddress = 0x0096A9F8; // filled
} else {
minimapAddress = 0x00972F30; // drained
}

DmaMgr_RequestAsync(&player->giObjectDmaRequest, play->mapSegment, minimapAddress,
gMapData->owMinimapTexSize[6], 0, &player->giObjectLoadQueue, NULL);
}
3 changes: 3 additions & 0 deletions ASM/ootSymbols.ld
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/* Addresses should be listed in order */
z64_EquippedItemOutlineTex = 0x2000E00;
DmaMgr_RequestAsync = 0x80000d28;
DmaMgr_RequestSync = 0x80000df0;
Flags_GetSwitch = 0x8002049C;
Flags_SetSwitch = 0x800204D0;
Expand All @@ -17,6 +18,7 @@ Flags_SetTempClear = 0x800206AC;
Flags_UnsetTempClear = 0x800206C8;
Flags_GetCollectible = 0x800206E8;
Flags_SetCollectible = 0x8002071C;
Actor_SpawnEntry = 0x800255c4;
Actor_SetColorFilter = 0x80027090;
CutsceneFlags_Get = 0x8005991C;
z64_Gfx_SetupDL_42Opa = 0x8007E868;
Expand All @@ -32,6 +34,7 @@ gObjectTable = 0x800f8ff8;
z64_SfxDefaultPos = 0x80104394;
z64_SfxDefaultFreqAndVolScale = 0x801043A0;
z64_SfxDefaultReverb = 0x801043A8;
gMapData = 0x8011bf10;
KaleidoScope_DrawAmmoCount = 0x8038EA10;
KaleidoScope_SetCursorVtx = 0x8038EF94;
KaleidoScope_QuadTextureIA8 = 0x80394200;
Expand Down
1 change: 1 addition & 0 deletions ASM/src/build.asm
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ RANDO_CONTEXT:
.include "en_dns.asm"
.include "bg_gate_shutter.asm"
.include "big_poe.asm"
.include "message_gerudocardminimap.asm"
.include "player_laddercutscenefix.asm"
.include "player_bunny_hover_matrix.asm"
.include "player_hookshotcheckspawn.asm"
Expand Down
29 changes: 23 additions & 6 deletions ASM/src/hacks.asm
Original file line number Diff line number Diff line change
Expand Up @@ -2566,15 +2566,31 @@ skip_bombchu_bowling_prize_switch:
;==================================================================================================
; Add ability to control Lake Hylia's water level
;==================================================================================================
.orga 0xD5B264
jal Check_Fill_Lake
.headersize (0x809cae60 - 0x00d5afe0)

.orga 0xD5B660
j Fill_Lake_Destroy
; Replaces: li t5,48
; addiu v1,v1,-23088
; sw t5,4(s0)
; lw t6,4(v1)
.org 0x809cb0d8 ; in BgSpot06Objects_Init
jal HyliaWater_SetupWaterFunction
addiu v1,-23088 ; displaced
bnez v0,0x809cb218 ; if water action func set, skip rest, else run child/etc
nop

.orga 0xEE7E4C
jal Hit_Gossip_Stone
; Make the lock position follow water level
; Replaces: lw a0,24(sp)
; lh v0,346(a0)
.org 0x809cbb50 ; in BgSpot06Objects_LockFloat
jal HyliaWater_LockPosition
lw a0,24(sp) ; displaced

.headersize (0)

; If hit water Gossip Stone, set flag to change level
; Replaces jal Message_StartTextbox
.orga 0xEE7E4C ; 0x80B6C72C in func_80A4E910
jal EnGs_HitGossipStone

.orga 0x26C10E3
.byte 0xFF ; Set generic grotto text ID to load from grotto ID
Expand Down Expand Up @@ -4167,6 +4183,7 @@ DemoEffect_DrawJewel_AfterHook:
.include "hacks/ovl_en_okarina_tag.asm"
.include "hacks/sound.asm"
.include "hacks/z_player.asm"
.include "hacks/z_map_exp.asm"
.include "hacks/z_en_sa.asm"
.include "hacks/en_box.asm"
.include "hacks/z_scene.asm"
13 changes: 13 additions & 0 deletions ASM/src/hacks/message.asm
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,16 @@
; Replaces li t7,1 (msgCtx->stateTimer = 1)
.org 0x800debb8 ; in Message_DrawMain
li t7,2 ; Add one extra frame between Ocarina effect and Nayru killed

;================================================================================
; If receiving Gerudo Card in Gerudo Fortress, load new minimap
;================================================================================
; Replaces: bnezl t4,800e14a0
; lw t2,52(sp)
; lhu v0,25336(t1)
; li at,8289
.org 0x800e13d8 ; in Message_Update
jal Message_GerudoCardMinimap
lw a0,96(sp)
bnezl t4,0x800e14a0
lw t2,52(sp)
44 changes: 44 additions & 0 deletions ASM/src/hacks/z_map_exp.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
.headersize (0x800110a0 - 0x00a87000)

;==================================================================================================
; Extended minimap changes on scene entry
;==================================================================================================

; Graveyard: Always show extended minimap
; Replaces: lui t9,0x8010
; lw t9,-29672(t9)
.org 0x8006bf88 ; in Map_InitData
b 0x8006c064 ; Go directly to DMA request
li a3,20 ; Extended minimap index

; Gerudo Fortress: Make extended minimap depend on Gerudo Membership Card
; instead of freeing carpenters (switch on get item: see z_message)
; Replaces: lhu t1,3814(a2)
; li at,15
; andi t2,t1,0xf
; bne v1,at,8006c064
; nop
; li a3,23
.org 0x8006c04c ; in Map_InitData
lw v0,164(a2) ; Check Gerudo Card flag (a2 saveCtx)
lui v1,0x40
and v0,v0,v1
bnezl v0,0x8006c064 ; If zero/no flag, no extended minimap
li a3,23 ; If flag, load extended minimap index
nop

; Lake Hylia: Switch minimap on scene entry depending on water level (on switch toggle:
; see Lake Hylia water level function)
; Replaces: lw t4,-29704(t4)
; lw t5,164(a2)
; and t6,t4,t5
; bnez t6,8006c064
; nop
; b 8006c064
.org 0x8006bfd8 ; in Map_InitData
lhu t3,0x0EE0(a2) ; Lake filled flag (a2 saveCtx)
andi t4,t3,0x0200
bnez t4,0x8006c064 ; If flag zero, not filled => load extended minimap
nop
b 0x8006c064
li a3,21 ; Extended minimap index
Loading
Loading