1212int dungeon_count = 13 ;
1313
1414dungeon_entry_t dungeons [] = {
15- { 0 , 0 , 0 , 0 , 1 , 0x0F , "Deku" , {-1 , -1 , -1 , -1 }, {-1 , -1 , -1 , -1 } },
16- { 1 , 0 , 0 , 0 , 1 , 0x1F , "Dodongo" , {-1 , -1 , -1 , -1 }, { 0 , -1 , -1 , -1 } },
17- { 2 , 0 , 0 , 0 , 1 , 0x0F , "Jabu" , {-1 , -1 , -1 , -1 }, {-1 , -1 , -1 , -1 } },
18-
19- { 3 , 1 , 1 , 0 , 1 , 0x1F , "Forest" , {-1 , -1 , -1 , -1 }, {-1 , -1 , -1 , -1 } },
20- { 4 , 1 , 1 , 0 , 1 , 0x1F , "Fire" , {-1 , -1 , -1 , -1 }, {-1 , -1 , -1 , -1 } },
21- { 5 , 1 , 1 , 0 , 1 , 0x1F , "Water" , {-1 , -1 , -1 , -1 }, {-1 , -1 , -1 , -1 } },
22- { 7 , 1 , 1 , 0 , 1 , 0x1F , "Shadow" , { 4 , 6 , 7 , -1 }, { 4 , 5 , 6 , 7 } },
23- { 6 , 1 , 1 , 0 , 1 , 0x1F , "Spirit" , {11 , 14 , 12 , -1 }, {13 , 15 , -1 , -1 } },
24-
25- { 8 , 1 , 0 , 0 , 1 , 0x07 , "BotW" , { 3 , -1 , -1 , -1 }, {-1 , -1 , -1 , -1 } },
26- { 9 , 0 , 0 , 0 , 1 , 0x07 , "Ice" , { 1 , 2 , -1 , -1 }, {-1 , -1 , -1 , -1 } },
27- { 12 , 1 , 0 , 1 , 0 , 0x00 , "Hideout" , {-1 , -1 , -1 , -1 }, {-1 , -1 , -1 , -1 } },
28- { 11 , 1 , 0 , 0 , 0 , 0x00 , "GTG" , { 8 , 9 , 10 , -1 }, { 8 , 9 , 10 , -1 } },
29- { 13 , 1 , 1 , 0 , 0 , 0x00 , "Ganon" , {16 , 17 , 18 , 21 }, {18 , 19 , 20 , -1 } },
30- { 16 , 1 , 0 , 0 , 0 , 0x00 , "Chest Game" ,{-1 , -1 , -1 , -1 }, {-1 , -1 , -1 , -1 } },
15+ { 0 , 0 , 0 , 0 , 1 , 0x0F , "Deku" , {-1 , -1 , -1 , -1 }, {-1 , -1 , -1 , -1 }, OPT_HINT_AREA_DEKU_TREE },
16+ { 1 , 0 , 0 , 0 , 1 , 0x1F , "Dodongo" , {-1 , -1 , -1 , -1 }, { 0 , -1 , -1 , -1 }, OPT_HINT_AREA_DODONGOS_CAVERN },
17+ { 2 , 0 , 0 , 0 , 1 , 0x0F , "Jabu" , {-1 , -1 , -1 , -1 }, {-1 , -1 , -1 , -1 }, OPT_HINT_AREA_JABU_JABUS_BELLY },
18+
19+ { 3 , 1 , 1 , 0 , 1 , 0x1F , "Forest" , {-1 , -1 , -1 , -1 }, {-1 , -1 , -1 , -1 }, OPT_HINT_AREA_FOREST_TEMPLE },
20+ { 4 , 1 , 1 , 0 , 1 , 0x1F , "Fire" , {-1 , -1 , -1 , -1 }, {-1 , -1 , -1 , -1 }, OPT_HINT_AREA_FIRE_TEMPLE },
21+ { 5 , 1 , 1 , 0 , 1 , 0x1F , "Water" , {-1 , -1 , -1 , -1 }, {-1 , -1 , -1 , -1 }, OPT_HINT_AREA_WATER_TEMPLE },
22+ { 7 , 1 , 1 , 0 , 1 , 0x1F , "Shadow" , { 4 , 6 , 7 , -1 }, { 4 , 5 , 6 , 7 }, OPT_HINT_AREA_SHADOW_TEMPLE },
23+ { 6 , 1 , 1 , 0 , 1 , 0x1F , "Spirit" , {11 , 14 , 12 , -1 }, {13 , 15 , -1 , -1 }, OPT_HINT_AREA_SPIRIT_TEMPLE },
24+
25+ { 8 , 1 , 0 , 0 , 1 , 0x07 , "BotW" , { 3 , -1 , -1 , -1 }, {-1 , -1 , -1 , -1 }, OPT_HINT_AREA_BOTTOM_OF_THE_WELL },
26+ { 9 , 0 , 0 , 0 , 1 , 0x07 , "Ice" , { 1 , 2 , -1 , -1 }, {-1 , -1 , -1 , -1 }, OPT_HINT_AREA_ICE_CAVERN },
27+ { 12 , 1 , 0 , 1 , 0 , 0x00 , "Hideout" , {-1 , -1 , -1 , -1 }, {-1 , -1 , -1 , -1 }, OPT_HINT_AREA_THIEVES_HIDEOUT },
28+ { 11 , 1 , 0 , 0 , 0 , 0x00 , "GTG" , { 8 , 9 , 10 , -1 }, { 8 , 9 , 10 , -1 }, OPT_HINT_AREA_GERUDO_TRAINING_GROUND },
29+ { 13 , 1 , 1 , 0 , 0 , 0x00 , "Ganon" , {16 , 17 , 18 , 21 }, {18 , 19 , 20 , -1 }, OPT_HINT_AREA_INSIDE_GANONS_CASTLE },
30+ { 16 , 1 , 0 , 0 , 0 , 0x00 , "Chest Game" ,{-1 , -1 , -1 , -1 }, {-1 , -1 , -1 , -1 }, OPT_HINT_AREA_MARKET },
3131};
3232
3333boss_entry_t bosses [] = {
@@ -58,11 +58,52 @@ medal_t medals[] = {
5858 { 3 , 0xFF , 0x82 , 0x00 }, // Spirit
5959};
6060
61+ char hint_area_names [OPT_HINT_AREA_MAX ][0x17 ] = {
62+ [OPT_HINT_AREA_UNKNOWN ] = "? " ,
63+ [OPT_HINT_AREA_ROOT ] = "Free " ,
64+ [OPT_HINT_AREA_HYRULE_FIELD ] = "Hyrule Field " ,
65+ [OPT_HINT_AREA_LON_LON_RANCH ] = "Lon Lon Ranch " ,
66+ [OPT_HINT_AREA_MARKET ] = "Market " ,
67+ [OPT_HINT_AREA_TEMPLE_OF_TIME ] = "Temple of Time " ,
68+ [OPT_HINT_AREA_HYRULE_CASTLE ] = "Hyrule Castle " ,
69+ [OPT_HINT_AREA_OUTSIDE_GANONS_CASTLE ] = "Outside Ganon's Castle" ,
70+ [OPT_HINT_AREA_INSIDE_GANONS_CASTLE ] = "Inside Ganon's Castle " ,
71+ [OPT_HINT_AREA_KOKIRI_FOREST ] = "Kokiri Forest " ,
72+ [OPT_HINT_AREA_DEKU_TREE ] = "Deku Tree " ,
73+ [OPT_HINT_AREA_LOST_WOODS ] = "Lost Woods " ,
74+ [OPT_HINT_AREA_SACRED_FOREST_MEADOW ] = "Sacred Forest Meadow " ,
75+ [OPT_HINT_AREA_FOREST_TEMPLE ] = "Forest Temple " ,
76+ [OPT_HINT_AREA_DEATH_MOUNTAIN_TRAIL ] = "Death Mountain Trail " ,
77+ [OPT_HINT_AREA_DODONGOS_CAVERN ] = "Dodongo's Cavern " ,
78+ [OPT_HINT_AREA_GORON_CITY ] = "Goron City " ,
79+ [OPT_HINT_AREA_DEATH_MOUNTAIN_CRATER ] = "Death Mountain Crater " ,
80+ [OPT_HINT_AREA_FIRE_TEMPLE ] = "Fire Temple " ,
81+ [OPT_HINT_AREA_ZORA_RIVER ] = "Zora's River " ,
82+ [OPT_HINT_AREA_ZORAS_DOMAIN ] = "Zora's Domain " ,
83+ [OPT_HINT_AREA_ZORAS_FOUNTAIN ] = "Zora's Fountain " ,
84+ [OPT_HINT_AREA_JABU_JABUS_BELLY ] = "Jabu Jabu's Belly " ,
85+ [OPT_HINT_AREA_ICE_CAVERN ] = "Ice Cavern " ,
86+ [OPT_HINT_AREA_LAKE_HYLIA ] = "Lake Hylia " ,
87+ [OPT_HINT_AREA_WATER_TEMPLE ] = "Water Temple " ,
88+ [OPT_HINT_AREA_KAKARIKO_VILLAGE ] = "Kakariko Village " ,
89+ [OPT_HINT_AREA_BOTTOM_OF_THE_WELL ] = "Bottom of the Well " ,
90+ [OPT_HINT_AREA_GRAVEYARD ] = "Graveyard " ,
91+ [OPT_HINT_AREA_SHADOW_TEMPLE ] = "Shadow Temple " ,
92+ [OPT_HINT_AREA_GERUDO_VALLEY ] = "Gerudo Valley " ,
93+ [OPT_HINT_AREA_GERUDO_FORTRESS ] = "Gerudo's Fortress " ,
94+ [OPT_HINT_AREA_THIEVES_HIDEOUT ] = "Thieves' Hideout " ,
95+ [OPT_HINT_AREA_GERUDO_TRAINING_GROUND ] = "Gerudo Training Ground" ,
96+ [OPT_HINT_AREA_HAUNTED_WASTELAND ] = "Haunted Wasteland " ,
97+ [OPT_HINT_AREA_DESERT_COLOSSUS ] = "Desert Colossus " ,
98+ [OPT_HINT_AREA_SPIRIT_TEMPLE ] = "Spirit Temple " ,
99+ };
100+
61101uint8_t reward_rows [] = { 0 , 1 , 2 , 8 , 3 , 4 , 5 , 7 , 6 };
62102uint8_t bk_display = 0 ;
63103bool world_display = false;
64104bool boss_display = false;
65105
106+ extern uint8_t PLAYER_ID ;
66107extern uint32_t CFG_DUNGEON_INFO_MQ_ENABLE ;
67108extern uint32_t CFG_DUNGEON_INFO_MQ_NEED_MAP ;
68109extern uint32_t CFG_DUNGEON_INFO_REWARD_ENABLE ;
@@ -74,7 +115,7 @@ extern bool CFG_DUNGEON_INFO_REWARD_WORLDS_ENABLE;
74115extern uint8_t SHUFFLE_CHEST_GAME ;
75116
76117extern int8_t CFG_DUNGEON_REWARDS [14 ];
77- extern char CFG_DUNGEON_REWARD_AREAS [9 ][ 0x17 ];
118+ extern opt_hint_area_t CFG_DUNGEON_REWARD_AREAS [9 ];
78119extern uint8_t CFG_DUNGEON_REWARD_WORLDS [9 ];
79120
80121extern uint8_t CFG_DUNGEON_INFO_SILVER_RUPEES ;
@@ -85,6 +126,7 @@ extern extended_savecontext_static_t extended_savectx;
85126extern silver_rupee_data_t silver_rupee_vars [0x16 ][2 ];
86127
87128extern uint8_t EVERDRIVE_READ_BUF [16 ];
129+ extern uint8_t everdrive_protocol_state ;
88130
89131void draw_background (z64_disp_buf_t * db , int bg_left , int bg_top , int bg_width , int bg_height ) {
90132 gDPSetCombineMode (db -> p ++ , G_CC_PRIMITIVE , G_CC_PRIMITIVE );
@@ -521,6 +563,7 @@ void draw_world_info(z64_disp_buf_t* db) {
521563
522564void draw_dungeon_info (z64_disp_buf_t * db ) {
523565 show_dungeon_info = 0 ;
566+ uint8_t everdrive_new_dungeon_info [0x13 ] = { 0x05 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };
524567 pad_t pad_held = z64_ctxt .input [0 ].raw .pad ;
525568 int draw = CAN_DRAW_DUNGEON_INFO && !CAN_DRAW_TRADE_DPAD && (
526569 ((pad_held .dl || pad_held .dr || pad_held .dd || pad_held .du ) && CFG_DPAD_DUNGEON_INFO_ENABLE ) ||
@@ -613,6 +656,10 @@ void draw_dungeon_info(z64_disp_buf_t* db) {
613656 } else if (reward == 5 ) {
614657 reward_index = 0 ;
615658 }
659+
660+ everdrive_new_dungeon_info [2 * reward + 7 ] = PLAYER_ID ; // CFG_DUNGEON_INFO_REWARD_SUMMARY_ENABLE implies own world
661+ everdrive_new_dungeon_info [2 * reward + 8 ] = d -> hint_area ;
662+
616663 medal_t * c = & (medals [reward_index ]);
617664 gDPSetPrimColor (db -> p ++ , 0 , 0 , c -> r , c -> g , c -> b , 0xFF );
618665
@@ -637,6 +684,9 @@ void draw_dungeon_info(z64_disp_buf_t* db) {
637684 int reward = CFG_DUNGEON_REWARDS [d -> index ];
638685 if (reward < 0 || reward >= 3 ) continue ;
639686
687+ everdrive_new_dungeon_info [2 * reward + 1 ] = PLAYER_ID ; // CFG_DUNGEON_INFO_REWARD_SUMMARY_ENABLE implies own world
688+ everdrive_new_dungeon_info [2 * reward + 2 ] = d -> hint_area ;
689+
640690 int top = start_top + ((icon_size + padding ) * i );
641691 sprite_draw (db , & stones_sprite , reward ,
642692 left , top , icon_size , icon_size );
@@ -871,7 +921,6 @@ void draw_dungeon_info(z64_disp_buf_t* db) {
871921
872922 } else if (pad_held .du ) {
873923 extern uint8_t everdrive_detection_state ;
874- extern uint8_t everdrive_protocol_state ;
875924
876925 int icon_size = 16 ;
877926 int padding = 1 ;
@@ -1089,8 +1138,12 @@ void draw_dungeon_info(z64_disp_buf_t* db) {
10891138 if (!display_area ) {
10901139 continue ;
10911140 }
1141+
1142+ everdrive_new_dungeon_info [2 * i + 1 ] = CFG_DUNGEON_REWARD_WORLDS [i ];
1143+ everdrive_new_dungeon_info [2 * i + 2 ] = CFG_DUNGEON_REWARD_AREAS [i ];
1144+
10921145 int top = start_top + ((icon_size + padding ) * i ) + 1 ;
1093- text_print (db , CFG_DUNGEON_REWARD_AREAS [i ], left , top );
1146+ text_print (db , hint_area_names [ CFG_DUNGEON_REWARD_AREAS [i ] ], left , top );
10941147 }
10951148 }
10961149
@@ -1381,6 +1434,21 @@ void draw_dungeon_info(z64_disp_buf_t* db) {
13811434 }
13821435
13831436 // Finish
1437+ if (show_dungeon_info && everdrive_detect () && everdrive_protocol_state == EVERDRIVE_PROTOCOL_STATE_MW ) {
1438+ bool changed = false;
1439+ for (int i = 0 ; i < 0x13 ; i ++ ) {
1440+ if (everdrive_new_dungeon_info [i ] != everdrive_last_dungeon_info [i ]) {
1441+ changed = true;
1442+ break ;
1443+ }
1444+ }
1445+ if (changed ) {
1446+ everdrive_write (19 , everdrive_new_dungeon_info );
1447+ for (int i = 0 ; i < 0x13 ; i ++ ) {
1448+ everdrive_last_dungeon_info [i ] = everdrive_new_dungeon_info [i ];
1449+ }
1450+ }
1451+ }
13841452}
13851453
13861454int dungeon_info_is_drawn () {
0 commit comments