Skip to content

Commit 4620bad

Browse files
committed
everdrive: Implement dungeon reward info packet
1 parent 8af447e commit 4620bad

File tree

16 files changed

+45947
-45535
lines changed

16 files changed

+45947
-45535
lines changed

ASM/build/asm_symbols.txt

Lines changed: 1510 additions & 1507 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ASM/build/bundle.o

1.35 KB
Binary file not shown.

ASM/build/c_symbols.txt

Lines changed: 749 additions & 747 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ASM/c/dungeon_info.c

Lines changed: 87 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,22 @@
1212
int dungeon_count = 13;
1313

1414
dungeon_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

3333
boss_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+
61101
uint8_t reward_rows[] = { 0, 1, 2, 8, 3, 4, 5, 7, 6 };
62102
uint8_t bk_display = 0;
63103
bool world_display = false;
64104
bool boss_display = false;
65105

106+
extern uint8_t PLAYER_ID;
66107
extern uint32_t CFG_DUNGEON_INFO_MQ_ENABLE;
67108
extern uint32_t CFG_DUNGEON_INFO_MQ_NEED_MAP;
68109
extern uint32_t CFG_DUNGEON_INFO_REWARD_ENABLE;
@@ -74,7 +115,7 @@ extern bool CFG_DUNGEON_INFO_REWARD_WORLDS_ENABLE;
74115
extern uint8_t SHUFFLE_CHEST_GAME;
75116

76117
extern 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];
78119
extern uint8_t CFG_DUNGEON_REWARD_WORLDS[9];
79120

80121
extern uint8_t CFG_DUNGEON_INFO_SILVER_RUPEES;
@@ -85,6 +126,7 @@ extern extended_savecontext_static_t extended_savectx;
85126
extern silver_rupee_data_t silver_rupee_vars[0x16][2];
86127

87128
extern uint8_t EVERDRIVE_READ_BUF[16];
129+
extern uint8_t everdrive_protocol_state;
88130

89131
void 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

522564
void 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

13861454
int dungeon_info_is_drawn() {

ASM/c/dungeon_info.h

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,48 @@
44
#include "util.h"
55
#include "z64.h"
66

7+
typedef enum {
8+
/* 0x00 */ OPT_HINT_AREA_UNKNOWN,
9+
/* 0x01 */ OPT_HINT_AREA_ROOT,
10+
/* 0x02 */ OPT_HINT_AREA_HYRULE_FIELD,
11+
/* 0x03 */ OPT_HINT_AREA_LON_LON_RANCH,
12+
/* 0x04 */ OPT_HINT_AREA_MARKET,
13+
/* 0x05 */ OPT_HINT_AREA_TEMPLE_OF_TIME,
14+
/* 0x06 */ OPT_HINT_AREA_HYRULE_CASTLE,
15+
/* 0x07 */ OPT_HINT_AREA_OUTSIDE_GANONS_CASTLE,
16+
/* 0x08 */ OPT_HINT_AREA_INSIDE_GANONS_CASTLE,
17+
/* 0x09 */ OPT_HINT_AREA_KOKIRI_FOREST,
18+
/* 0x0A */ OPT_HINT_AREA_DEKU_TREE,
19+
/* 0x0B */ OPT_HINT_AREA_LOST_WOODS,
20+
/* 0x0C */ OPT_HINT_AREA_SACRED_FOREST_MEADOW,
21+
/* 0x0D */ OPT_HINT_AREA_FOREST_TEMPLE,
22+
/* 0x0E */ OPT_HINT_AREA_DEATH_MOUNTAIN_TRAIL,
23+
/* 0x0F */ OPT_HINT_AREA_DODONGOS_CAVERN,
24+
/* 0x10 */ OPT_HINT_AREA_GORON_CITY,
25+
/* 0x11 */ OPT_HINT_AREA_DEATH_MOUNTAIN_CRATER,
26+
/* 0x12 */ OPT_HINT_AREA_FIRE_TEMPLE,
27+
/* 0x13 */ OPT_HINT_AREA_ZORA_RIVER,
28+
/* 0x14 */ OPT_HINT_AREA_ZORAS_DOMAIN,
29+
/* 0x15 */ OPT_HINT_AREA_ZORAS_FOUNTAIN,
30+
/* 0x16 */ OPT_HINT_AREA_JABU_JABUS_BELLY,
31+
/* 0x17 */ OPT_HINT_AREA_ICE_CAVERN,
32+
/* 0x18 */ OPT_HINT_AREA_LAKE_HYLIA,
33+
/* 0x19 */ OPT_HINT_AREA_WATER_TEMPLE,
34+
/* 0x1A */ OPT_HINT_AREA_KAKARIKO_VILLAGE,
35+
/* 0x1B */ OPT_HINT_AREA_BOTTOM_OF_THE_WELL,
36+
/* 0x1C */ OPT_HINT_AREA_GRAVEYARD,
37+
/* 0x1D */ OPT_HINT_AREA_SHADOW_TEMPLE,
38+
/* 0x1E */ OPT_HINT_AREA_GERUDO_VALLEY,
39+
/* 0x1F */ OPT_HINT_AREA_GERUDO_FORTRESS,
40+
/* 0x20 */ OPT_HINT_AREA_THIEVES_HIDEOUT,
41+
/* 0x21 */ OPT_HINT_AREA_GERUDO_TRAINING_GROUND,
42+
/* 0x22 */ OPT_HINT_AREA_HAUNTED_WASTELAND,
43+
/* 0x23 */ OPT_HINT_AREA_DESERT_COLOSSUS,
44+
/* 0x24 */ OPT_HINT_AREA_SPIRIT_TEMPLE,
45+
46+
/* 0x25 */ OPT_HINT_AREA_MAX,
47+
} opt_hint_area_t;
48+
749
typedef struct {
850
uint8_t index;
951
struct {
@@ -16,6 +58,7 @@ typedef struct {
1658
char name[11];
1759
uint8_t silver_rupee_puzzles_vanilla[4];
1860
uint8_t silver_rupee_puzzles_mq[4];
61+
opt_hint_area_t hint_area;
1962
} dungeon_entry_t;
2063

2164
typedef struct {
@@ -42,6 +85,7 @@ extern char CFG_DUNGEON_ENTRANCES[12][0x9];
4285
extern char CFG_BOSSES[21][0x9];
4386

4487
static int show_dungeon_info = 0;
88+
static uint8_t everdrive_last_dungeon_info[0x13] = { 0x05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
4589

4690
#define CAN_DRAW_DUNGEON_INFO (CFG_DUNGEON_INFO_ENABLE != 0 && \
4791
z64_game.pause_ctxt.state == PAUSE_STATE_MAIN && \

ASM/c/everdrive.c

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -223,9 +223,8 @@ bool everdrive_read(uint8_t *buf) {
223223
}
224224
}
225225

226-
bool everdrive_write(uint8_t *buf) {
226+
bool everdrive_write(uint32_t len, uint8_t *buf) {
227227
cart_lock_safe();
228-
uint32_t len = 16; // for simplicity, the protocol is designed so each packet size is the EverDrive's minimum of 16 bytes
229228
uint32_t usb_cfg = reg_rd(REG_USB_CFG);
230229
if (!(usb_cfg & USB_STA_PWR)) {
231230
// cannot read or write (no USB device connected?)
@@ -297,10 +296,10 @@ void everdrive_handshake() {
297296
CFG_FILE_SELECT_HASH[3],
298297
CFG_FILE_SELECT_HASH[4],
299298
};
300-
everdrive_write(reply);
299+
everdrive_write(16, reply);
301300
everdrive_protocol_state = EVERDRIVE_PROTOCOL_STATE_HANDSHAKE;
302301
} else {
303-
everdrive_write(EVERDRIVE_MESSAGE_RESET);
302+
everdrive_write(16, EVERDRIVE_MESSAGE_RESET);
304303
everdrive_protocol_state = EVERDRIVE_PROTOCOL_STATE_INIT;
305304
}
306305
}
@@ -313,7 +312,7 @@ void everdrive_update_in_game(bool in_game) {
313312
z64_file.ammo[5], // internal item count, lo
314313
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //TODO send relevant parts of save data (which?)
315314
};
316-
everdrive_write(state_packet);
315+
everdrive_write(16, state_packet);
317316
everdrive_in_game = 1;
318317
} else {
319318
uint8_t state_packet[16] = {
@@ -328,7 +327,7 @@ void everdrive_update_in_game(bool in_game) {
328327
z64_file.file_name[7],
329328
0, 0, 0, 0, 0, 0, 0,
330329
};
331-
everdrive_write(state_packet);
330+
everdrive_write(16, state_packet);
332331
everdrive_in_game = 0;
333332
for (int i = 0; i < 8; i++) {
334333
everdrive_file_name[i] = z64_file.file_name[i];
@@ -340,7 +339,7 @@ void everdrive_frame(bool in_game) {
340339
if (everdrive_detect()) {
341340
if (everdrive_protocol_state == EVERDRIVE_PROTOCOL_STATE_MW) {
342341
if (++frames_since_last_ping >= 5 * 20) {
343-
everdrive_write(EVERDRIVE_MESSAGE_PING);
342+
everdrive_write(16, EVERDRIVE_MESSAGE_PING);
344343
frames_since_last_ping = 0;
345344
}
346345
if (in_game) {
@@ -374,7 +373,7 @@ void everdrive_frame(bool in_game) {
374373
case EVERDRIVE_PROTOCOL_STATE_HANDSHAKE: {
375374
if (EVERDRIVE_READ_BUF[0] == 'M' && EVERDRIVE_READ_BUF[1] == 'W') {
376375
if (EVERDRIVE_READ_BUF[2] != EVERDRIVE_PROTOCOL_VERSION) {
377-
everdrive_write(EVERDRIVE_MESSAGE_RESET);
376+
everdrive_write(16, EVERDRIVE_MESSAGE_RESET);
378377
everdrive_protocol_state = EVERDRIVE_PROTOCOL_STATE_INIT;
379378
} else {
380379
MW_SEND_OWN_ITEMS = EVERDRIVE_READ_BUF[3];
@@ -393,7 +392,7 @@ void everdrive_frame(bool in_game) {
393392
} else if (EVERDRIVE_READ_BUF[0] == 'c') {
394393
everdrive_handshake();
395394
} else {
396-
everdrive_write(EVERDRIVE_MESSAGE_RESET);
395+
everdrive_write(16, EVERDRIVE_MESSAGE_RESET);
397396
everdrive_protocol_state = EVERDRIVE_PROTOCOL_STATE_INIT;
398397
}
399398
break;
@@ -421,7 +420,7 @@ void everdrive_frame(bool in_game) {
421420
} else if (EVERDRIVE_READ_BUF[0] == 'c') {
422421
everdrive_handshake();
423422
} else {
424-
everdrive_write(EVERDRIVE_MESSAGE_RESET);
423+
everdrive_write(16, EVERDRIVE_MESSAGE_RESET);
425424
everdrive_protocol_state = EVERDRIVE_PROTOCOL_STATE_INIT;
426425
}
427426
break;

ASM/c/everdrive.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
bool everdrive_detect();
1515
bool everdrive_read(uint8_t *buf);
16-
bool everdrive_write(uint8_t *buf);
16+
bool everdrive_write(uint32_t len, uint8_t *buf);
1717
void everdrive_frame(bool in_game);
1818

1919
#endif

ASM/c/get_items.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ void move_outgoing_queue() {
315315
OUTGOING_PLAYER,
316316
0, 0, 0, 0,
317317
};
318-
everdrive_write(send_item_packet);
318+
everdrive_write(16, send_item_packet);
319319
OUTGOING_ITEM = 0;
320320
OUTGOING_PLAYER = 0;
321321
OUTGOING_KEY.all = 0;
@@ -371,7 +371,7 @@ void after_key_received(override_key_t key) {
371371
uint8_t EVERDRIVE_MESSAGE_ITEM_RECEIVED[16] = { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
372372

373373
if (everdrive_detect() && everdrive_protocol_state == EVERDRIVE_PROTOCOL_STATE_MW) {
374-
everdrive_write(EVERDRIVE_MESSAGE_ITEM_RECEIVED);
374+
everdrive_write(16, EVERDRIVE_MESSAGE_ITEM_RECEIVED);
375375
}
376376
INCOMING_ITEM = 0;
377377
INCOMING_PLAYER = 0;

ASM/src/config.asm

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ DOT_CONDITION:
288288
; Any changes made here should be documented in Notes/auto-tracker-ctx.md
289289
AUTO_TRACKER_CONTEXT:
290290
AUTO_TRACKER_VERSION:
291-
.word 6 ; Increment this if the auto-tracker context layout changes
291+
.word 7 ; Increment this if the auto-tracker context layout changes
292292

293293
CFG_DUNGEON_INFO_ENABLE:
294294
.word 0
@@ -346,10 +346,14 @@ TRIFORCE_PIECES_REQUIRED:
346346
SPECIAL_DEAL_COUNTS:
347347
.endarea
348348

349-
.area 9 * 0x17, 0x00
349+
.area 9, 0x00
350350
CFG_DUNGEON_REWARD_AREAS:
351351
.endarea
352352

353+
.area 0 * 0x16, 0x00
354+
; space used by CFG_DUNGEON_REWARD_AREAS in previous versions, now available again
355+
.endarea
356+
353357
CFG_ADULT_TRADE_SHUFFLE:
354358
.byte 0x00
355359
CFG_CHILD_TRADE_SHUFFLE:

0 commit comments

Comments
 (0)