Skip to content
Merged
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
259 changes: 205 additions & 54 deletions code/include/game/context.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,137 @@ namespace game {
WarpingToStoneTower = 0x25,
};

// Incomplete
enum class OcarinaMode : u16 {
OCARINA_MODE_NONE = 0,
OCARINA_MODE_ACTIVE = 1,
OCARINA_MODE_WARP = 2,
OCARINA_MODE_EVENT = 3,
OCARINA_MODE_END = 4,
OCARINA_MODE_PLAYED_TIME = 5,
OCARINA_MODE_PLAYED_HEALING = 6,
OCARINA_MODE_PLAYED_EPONAS = 7,
OCARINA_MODE_PLAYED_SOARING = 8,
OCARINA_MODE_PLAYED_STORMS = 9,
OCARINA_MODE_PLAYED_SUNS = 10,
OCARINA_MODE_PLAYED_INVERTED_TIME = 11,
OCARINA_MODE_PLAYED_DOUBLE_TIME = 12,
OCARINA_MODE_PLAYED_SCARECROW_SPAWN = 13,
OCARINA_MODE_E = 14,
OCARINA_MODE_F = 15,
OCARINA_MODE_10 = 16,
OCARINA_MODE_11 = 17,
OCARINA_MODE_PROCESS_SOT = 18,
OCARINA_MODE_PROCESS_INVERTED_TIME = 19,
OCARINA_MODE_14 = 20,
OCARINA_MODE_PROCESS_DOUBLE_TIME = 21,
OCARINA_MODE_APPLY_SOT = 22,
OCARINA_MODE_17 = 23,
OCARINA_MODE_APPLY_INV_SOT_FAST = 24,
OCARINA_MODE_APPLY_INV_SOT_SLOW = 25,
OCARINA_MODE_APPLY_DOUBLE_SOT = 26,
OCARINA_MODE_1B = 27,
OCARINA_MODE_WARP_TO_GREAT_BAY_COAST = 28,
OCARINA_MODE_WARP_TO_ZORA_CAPE = 29,
OCARINA_MODE_WARP_TO_SNOWHEAD = 30,
OCARINA_MODE_WARP_TO_MOUNTAIN_VILLAGE = 31,
OCARINA_MODE_WARP_TO_SOUTH_CLOCK_TOWN = 32,
OCARINA_MODE_WARP_TO_MILK_ROAD = 33,
OCARINA_MODE_WARP_TO_WOODFALL = 34,
OCARINA_MODE_WARP_TO_SOUTHERN_SWAMP = 35,
OCARINA_MODE_WARP_TO_IKANA_CANYON = 36,
OCARINA_MODE_WARP_TO_STONE_TOWER = 37,
OCARINA_MODE_WARP_TO_ENTRANCE = 38,
OCARINA_MODE_PROCESS_RESTRICTED_SONG = 39,
OCARINA_MODE_28 = 40,
OCARINA_MODE_29 = 41,
OCARINA_MODE_PLAYED_FULL_EVAN_SONG = 42
};

enum class OcarinaSongActionId : u16 {
OCARINA_ACTION_0 = 0,
OCARINA_ACTION_FREE_PLAY = 1,
OCARINA_ACTION_DEMONSTRATE_SONATA = 2,
OCARINA_ACTION_DEMONSTRATE_GORON_LULLABY = 3,
OCARINA_ACTION_DEMONSTRATE_NEW_WAVE = 4,
OCARINA_ACTION_DEMONSTRATE_ELEGY = 5,
OCARINA_ACTION_DEMONSTRATE_OATH = 6,
OCARINA_ACTION_DEMONSTRATE_SARIAS = 7,
OCARINA_ACTION_DEMONSTRATE_TIME = 8,
OCARINA_ACTION_DEMONSTRATE_HEALING = 9,
OCARINA_ACTION_DEMONSTRATE_EPONAS = 10,
OCARINA_ACTION_DEMONSTRATE_SOARING = 11,
OCARINA_ACTION_DEMONSTRATE_STORMS = 12,
OCARINA_ACTION_DEMONSTRATE_SUNS = 13,
OCARINA_ACTION_DEMONSTRATE_INVERTED_TIME = 14,
OCARINA_ACTION_DEMONSTRATE_DOUBLE_TIME = 15,
OCARINA_ACTION_DEMONSTRATE_GORON_LULLABY_INTRO = 16,
OCARINA_ACTION_11 = 17,
OCARINA_ACTION_PROMPT_SONATA = 18,
OCARINA_ACTION_PROMPT_GORON_LULLABY = 19,
OCARINA_ACTION_PROMPT_NEW_WAVE = 20,
OCARINA_ACTION_PROMPT_ELEGY = 21,
OCARINA_ACTION_PROMPT_OATH = 22,
OCARINA_ACTION_PROMPT_SARIAS = 23,
OCARINA_ACTION_PROMPT_TIME = 24,
OCARINA_ACTION_PROMPT_HEALING = 25,
OCARINA_ACTION_PROMPT_EPONAS = 26,
OCARINA_ACTION_PROMPT_SOARING = 27,
OCARINA_ACTION_PROMPT_STORMS = 28,
OCARINA_ACTION_PROMPT_SUNS = 29,
OCARINA_ACTION_PROMPT_INVERTED_TIME = 30,
OCARINA_ACTION_PROMPT_DOUBLE_TIME = 31,
OCARINA_ACTION_PROMPT_GORON_LULLABY_INTRO = 32,
OCARINA_ACTION_21 = 33,
OCARINA_ACTION_CHECK_SONATA = 34,
OCARINA_ACTION_CHECK_GORON_LULLABY = 35,
OCARINA_ACTION_CHECK_NEW_WAVE = 36,
OCARINA_ACTION_CHECK_ELEGY = 37,
OCARINA_ACTION_CHECK_OATH = 38,
OCARINA_ACTION_CHECK_SARIAS = 39,
OCARINA_ACTION_CHECK_TIME = 40,
OCARINA_ACTION_CHECK_HEALING = 41,
OCARINA_ACTION_CHECK_EPONAS = 42,
OCARINA_ACTION_CHECK_SOARING = 43,
OCARINA_ACTION_CHECK_STORMS = 44,
OCARINA_ACTION_CHECK_SUNS = 45,
OCARINA_ACTION_CHECK_INVERTED_TIME = 46,
OCARINA_ACTION_CHECK_DOUBLE_TIME = 47,
OCARINA_ACTION_CHECK_GORON_LULLABY_INTRO = 48,
OCARINA_ACTION_CHECK_SCARECROW_SPAWN = 49,
OCARINA_ACTION_FREE_PLAY_DONE = 50,
OCARINA_ACTION_SCARECROW_LONG_RECORDING = 51,
OCARINA_ACTION_SCARECROW_LONG_DEMONSTRATION = 52,
OCARINA_ACTION_SCARECROW_SPAWN_RECORDING = 53,
OCARINA_ACTION_SCARECROW_SPAWN_DEMONSTRATION = 54,
OCARINA_ACTION_37 = 55,
OCARINA_ACTION_CHECK_NOTIME = 56,
OCARINA_ACTION_CHECK_NOTIME_DONE = 57,
OCARINA_ACTION_3A = 58,
OCARINA_ACTION_3B = 59,
OCARINA_ACTION_3C = 60,
OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_FIRST_HALF = 61,
OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_FIRST_HALF = 62,
OCARINA_ACTION_DEMONSTRATE_EVAN_PART1_SECOND_HALF = 63,
OCARINA_ACTION_DEMONSTRATE_EVAN_PART2_SECOND_HALF = 64,
OCARINA_ACTION_PROMPT_EVAN_PART1_SECOND_HALF = 65,
OCARINA_ACTION_PROMPT_EVAN_PART2_SECOND_HALF = 66,
OCARINA_ACTION_PROMPT_WIND_FISH_HUMAN = 67,
OCARINA_ACTION_PROMPT_WIND_FISH_GORON = 68,
OCARINA_ACTION_PROMPT_WIND_FISH_ZORA = 69,
OCARINA_ACTION_PROMPT_WIND_FISH_DEKU = 70,
OCARINA_ACTION_TIMED_PROMPT_SONATA = 71,
OCARINA_ACTION_TIMED_PROMPT_GORON_LULLABY = 72,
OCARINA_ACTION_TIMED_PROMPT_NEW_WAVE = 73,
OCARINA_ACTION_TIMED_PROMPT_ELEGY = 74,
OCARINA_ACTION_TIMED_PROMPT_OATH = 75,
OCARINA_ACTION_TIMED_PROMPT_SARIAS = 76,
OCARINA_ACTION_TIMED_PROMPT_TIME = 77,
OCARINA_ACTION_TIMED_PROMPT_HEALING = 78,
OCARINA_ACTION_TIMED_PROMPT_EPONAS = 79,
OCARINA_ACTION_TIMED_PROMPT_SOARING = 80,
OCARINA_ACTION_TIMED_PROMPT_STORMS = 81
};

enum class OcarinaSong : u16 {
SonataOfAwakening = 0,
GoronLullaby = 1,
Expand All @@ -98,14 +228,31 @@ namespace game {
EponaSong = 8,
SongOfSoaring = 9,
SongOfStorms = 10,
SunsSong = 11,
InvertedSongOfTime = 12,
SongOfDoubleTime = 13,
ScarecrowSong = 21,
GoronLullablyIntro = 14,
WindFishHuman = 15,
WindFishGoron = 16,
WindFishZora = 17,
WindFishDeku = 18,
EvansSongPart1 = 19,
EvansSongPart2 = 20,
ZeldasLullaby = 21,
ScarecrowSong = 22,
TerminaWallSong = 23,
SongMax = 24,

InvalidDetecting = 0xfe,
Invalid = 0xff,
};

struct OcarinaStaff {
u8 buttonIndex;
u8 song;
u8 pos;
};

struct HudState {
u32 field_0;
u8 gap_4[86];
Expand Down Expand Up @@ -160,6 +307,59 @@ namespace game {
};
static_assert(sizeof(HudState) == 0x280);

struct MessageContext {
void* notebook_stuff;
u8 gap_8024[536];
OcarinaStaff* ocarinaStaff_maybe;
u16 field_8220;
u8 gap_8222[10];
int field_822C;
u16 field_8230;
u16 field_8232;
u8 gap_8234[10];
u8 hide_hud;
u8 field_823F;
u8 gap_8240[160];
u32 field_82E0;
u8 gap_82E4[28];
int field_8300;
u8 gap_8304[28];
int field_8320;
u8 gap_8324[28];
int state_timer;
u8 gap_8343[2];
OcarinaMode ocarinaMode;
OcarinaSongActionId ocarinaSongActionId;
OcarinaSong lastPlayedSong;
u8 gap_834A[19];
u8 some_ocarina_timer;
u16 field_8360;
u16 field_8362;
OcarinaSong ocarina_song2;
OcarinaState ocarina_state;
OcarinaState ocarina_state2;
OcarinaSong ocarina_song;
u16 field_836C;
u8 field_836E;
u8 field_836F;
int field_8370;
int field_8374;
int field_8378;
game::act::Actor* message_actor;
u16 field_8380;
u16 field_8382;
u8 gap_8384[4]; /* ocaEff Spawned here? */
int item_cost;
int item_cost_two;
u8 gap_8390[61];
u8 bombers_notebook_event_queue_count;
u8 gap_83CE[58];
};
static_assert(offsetof(MessageContext, field_8232) == 0x232);
static_assert(offsetof(MessageContext, ocarinaStaff_maybe) == 0x21c);
static_assert(offsetof(MessageContext, gap_8324) == 0x324);
static_assert(sizeof(MessageContext) == 0x408);

// Likely incomplete.
struct GlobalContext : State {
bool IsPaused() const { return pause_flags.IsOneSet(PauseFlag::PauseCalc, PauseFlag::PauseDraw); }
Expand Down Expand Up @@ -259,54 +459,11 @@ namespace game {
u8 gap_3DFE[16898];
u32 field_8000;
u8 gap_8004[28];
void* notebook_stuff;
u8 gap_8024[536];
void* ocarinaData;
u16 field_8220;
u8 gap_8222[10];
int field_822C;
u8 gap_8230[2];
u16 field_8232;
u8 gap_8234[10];
u8 hide_hud;
u8 field_823F;
u8 gap_8240[160];
u32 field_8300;
u8 gap_8304[28];
int field_8320;
u8 gap_8324[59];
u8 some_ocarina_timer;
u16 field_8360;
u16 field_8362;
OcarinaSong ocarina_song2;
OcarinaState ocarina_state;
OcarinaState ocarina_state2;
OcarinaSong ocarina_song;
u16 field_836C;
char field_836E;
char field_836F;
int field_8370;
int field_8374;
int field_8378;
act::Actor* messageActor;
u16 field_8380;
u16 field_8382;
u8 gap_8384[4]; // ocaeffSpawned in here.
int item_cost;
int another_item_cost_maybe;
u8 gap_8390[62];
u16 field_83CE; // frame counter for notebook?
u8 field_83CD;
u8 gap_83D0[10];
u32 field_83DE; // Checks during song
u16 field_83E0;
u16 field_83E2; // Stored message ID for after notebook collection. Mainly used for fishing
// pass/PoH/rupee text.
u8 gap_83E0[68];
MessageContext msg_context;
HudState hud_state;
u8 gap_86A8[4];
u16 field_86AC;
__attribute__((aligned(4))) u8 gap_86B0[272];
u8 gap_86B0[272];
u32 field_87C0;
u8 gap_87C4[59];
u8 field_87FF;
Expand Down Expand Up @@ -460,15 +617,9 @@ namespace game {
static_assert(offsetof(GlobalContext, pause_flags) == 0xAAC);
static_assert(offsetof(GlobalContext, elegy_statues) == 0x2394);
static_assert(offsetof(GlobalContext, field_C000) == 0xc000);
static_assert(offsetof(GlobalContext, ocarina_state) == 0x8366);
static_assert(offsetof(GlobalContext, ocarina_song) == 0x836A);
static_assert(offsetof(GlobalContext, hide_hud) == 0x825E);
static_assert(offsetof(GlobalContext, field_836E) == 0x836E);
static_assert(offsetof(GlobalContext, gap_8390) == 0x8390);
static_assert(offsetof(GlobalContext, field_C4C8) == 0xC4C8);
static_assert(offsetof(GlobalContext, gap_AC6C) == 0xAC6C);
static_assert(offsetof(GlobalContext, field_83CE) == 0x83CE);
static_assert(offsetof(GlobalContext, gap_8384) == 0x8384);
static_assert(offsetof(GlobalContext, msg_context) == 0x8020);
static_assert(offsetof(GlobalContext, gap_404) == 0x0404);
static_assert(offsetof(GlobalContext, object_context) == 0x9438);
static_assert(sizeof(GlobalContext) == 0x11030);
Expand Down
2 changes: 1 addition & 1 deletion code/include/game/items.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ namespace game {

InvertedSongOfTime = 0x71,
SongOfDoubleTime = 0x72,
X73 = 0x73,
GoronLullabyIntro = 0x73,

BossKey = 0x74,
Compass = 0x75,
Expand Down
1 change: 1 addition & 0 deletions code/include/rnd/input.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ namespace rnd {
btn_t up;
btn_t pressed;
btn_t old;
cp_t cp_curr;
} InputContext;

void Input_Update(void);
Expand Down
12 changes: 7 additions & 5 deletions code/include/rnd/item_override.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,15 +104,15 @@ namespace rnd {
/* 0x4D */ // GI_ERROR_NOTHING_4D, // ***ERROR TEXT Get Item Nothing in hand - Green Rupee with
// Ocarina in Inventory
/* 0x4E */ // GI_ERROR_NOTHING_4E, // ***ERROR TEXT Get Item Nothing in hand - Green Rupee with
// Ocarina in Inventory
// Ocarina in Inventory - New Wave Bossa Nova
/* 0x4F */ // GI_ERROR_NOTHING_4F, // ***ERROR TEXT Get Item Nothing in hand - Green Rupee with
// Ocarina in Inventory
/* 0x50 */ GI_BOMBERS_NOTEBOOK = 0x50,
/* 0x51 */ // GI_ERROR_YELLOW_RUPPEE, // ***ERROR TEXT Get Item Nothing in hand at first - then
// subsequently yellow rupee. No rupee increment.
/* 0x52 */ GI_GOLD_SKULLTULA_SPIRIT = 0x52, // Pickup model is whacky since we usually don't have one.
/* 0x53 */ // GI_ERROR_NOTHING_53, // ***ERROR TEXT Get Item Nothing in hand - Green Rupee with
// Ocarina in Inventory
// Ocarina in Inventory Song of Time
/* 0x54 */ // GI_ERROR_NOTHING_54, // ***ERROR TEXT Get Item Nothing in hand - Green Rupee with
// Ocarina in Inventory
/* 0x55 */ GI_ODOLWAS_REMAINS = 0x55, // Also softlocks!
Expand Down Expand Up @@ -146,7 +146,7 @@ namespace rnd {
/* 0x70 */ GI_BOTTLE_MYSTERY_MILK, // Activates Timer
/* 0x71 */ GI_BOTTLE_MOLDY_MILK, // Mystery milk text followed by tatl.
/* 0x72 */ // GI_ERROR_NOTHING_72, // ***ERROR TEXT Get Item Nothing in hand - Green Rupee with
// Ocarina in Inventory
// Ocarina in Inventory. Song of Soaring.
/* 0x73 */ // GI_ERROR_NOTHING_73, // ***ERROR TEXT Get Item Nothing in hand - Green Rupee with
// Ocarina in Inventory
/* 0x74 */ // GI_ERROR_NOTHING_74, // ***ERROR TEXT Get Item Nothing in hand - Green Rupee with
Expand Down Expand Up @@ -448,9 +448,9 @@ namespace rnd {
void ItemOverride_GetItemTextAndItemID(game::act::Player*);
void ItemOverride_GetItem(game::GlobalContext*, game::act::Actor*, game::act::Player*, s16);
void ItemOverride_GetFairyRewardItem(game::GlobalContext*, game::act::GreatFairy*, s16);
void ItemOverride_GetSoHItem(game::GlobalContext*, game::act::Actor*, s16);
void ItemOverride_GetSoHOrSongItem(game::GlobalContext*, game::act::Actor*, s16);
int ItemOverride_CheckInventoryItemOverride(game::ItemId);
void ItemOverride_SwapSoHGetItemText(game::GlobalContext*, u16, game::act::Actor*);
void ItemOverride_SwapSoHAndSongGetItemText(game::GlobalContext*, u16, game::act::Actor*);
bool ItemOverride_CheckTingleMaps(u16, game::GlobalContext*);
u32 ItemOverride_GetGaboraExtData();
u32 ItemOverride_GetOshExtData();
Expand All @@ -459,6 +459,8 @@ namespace rnd {
u8 ItemOverride_OverrideSkullToken(game::act::Actor*);
u8 ItemOverride_CheckBossStatus();
u8 ItemOverride_ReceivedOcarinaFromSkt();
u8 ItemOverride_ReceivedSongOverride(s16);
u8 ItemOverride_CheckIfSongOfTimeAwarded(u8);
}
extern "C" u32 rActiveItemGraphicId;
extern "C" ItemOverride rItemOverrides[640];
Expand Down
17 changes: 17 additions & 0 deletions code/include/rnd/savefile.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,23 @@ namespace rnd {
BitField<59, 5, u64> unused;
};
GivenItemRegister givenItemChecks;
union GivenSongRegister {
u16 raw;

BitField<0, 1, u16> sonataGiven;
BitField<1, 1, u16> goronLullabyGiven;
BitField<2, 1, u16> goronLullabyIntroGiven;
BitField<3, 1, u16> newWaveBossaNovaGiven;
BitField<4, 1, u16> elegyOfEmptinessGiven;
BitField<5, 1, u16> oathToOrderGiven;
BitField<6, 1, u16> songOfTimeGiven;
BitField<7, 1, u16> songOfHealingGiven;
BitField<8, 1, u16> eponasSongGiven;
BitField<9, 1, u16> songOfSoaringGiven;
BitField<10, 1, u16> songOfStormsGiven;
BitField<11, 5, u16> unused;
};
GivenSongRegister givenSongChecks;
union FairyCollectRegister {
u8 raw;

Expand Down
Loading