97 Commits

Author SHA1 Message Date
37ee113f9d Merge in dungeon map changes (#1)
known issues:
- in-room stairs in door shuffle draw slightly bugged sometimes
- entrance sprites in non-doors are sometimes drawn on the wrong floor
- in some modes, sanctuary will open HC map instead of sewers/HC2 map

Reviewed-on: #1
Co-authored-by: Kara Alexandra <ardnaxelarak@gmail.com>
Co-committed-by: Kara Alexandra <ardnaxelarak@gmail.com>
2026-01-25 22:43:02 +00:00
5831117e36 Fix light cone not showing after torches extinguish 2026-01-16 18:28:21 -06:00
420f2477fc Invert bitfield for pseudoflute 2026-01-15 04:05:30 -06:00
727c265811 Fix/update (de)compress utils 2026-01-15 03:37:02 -06:00
8de358d99f (de)compression src fixes and windows binaries 2025-12-30 16:35:43 -06:00
1ba813f068 Add src and linux binaries for (de)compression code 2025-12-28 14:30:49 -06:00
13372307c2 Include bosses in option to make baserom playable 2025-12-28 14:29:18 -06:00
63e8d5687b Fix timer and add drop-to-ganon mode 2025-12-14 11:10:23 -06:00
a6ad4c082b Finish pseudoflute 2025-12-13 22:48:03 -06:00
74d9c72cc8 Pseudoflute 2025-12-13 19:06:11 -06:00
18a73e3b88 Add flag to make the baserom work 2025-12-12 21:33:08 -06:00
4f0703ea62 Merge remote-tracking branch 'codemann/OWMain' into GKNew 2025-12-12 18:16:07 -06:00
codemann8
a97f8fbb48 Merged in DR v1.5.2 2025-12-09 16:44:50 -06:00
aerinon
ac7f50fc62 fix: revert to old way 2025-12-09 14:43:47 -07:00
codemann8
dd9ea4d38e Merge branch 'DRUnstable' into OWMain 2025-12-09 09:23:48 -06:00
codemann8
5b7a4c11ed Fixed issue with bonk drops not showing sparkles in DW 2025-12-08 20:40:39 -06:00
aerinon
4437194cfe fix: key counts again 2025-12-08 16:37:51 -07:00
codemann8
0d827eadd2 Merge branch 'DRUnstable' into OWMain 2025-12-04 19:12:35 -06:00
aerinon
fca7f214bc fix: key counts for pot keys and normal absorbed keys 2025-12-04 15:37:02 -07:00
codemann8
a277fb12ac Completed Rain State fixes for Bonk Drops 2025-12-04 12:39:19 -06:00
codemann8
1242198bea Merged in DR v1.5.0 2025-12-03 10:53:43 -06:00
codemann8
96333b22a2 Fixed cucco storm to actually work on first trigger 2025-12-03 10:11:47 -06:00
codemann8
4f4f483647 Completed Rain State fixes for Bonk Drops 2025-12-03 10:10:14 -06:00
codemann8
dfe49a11c4 Merged in DR v1.5.0 2025-12-03 10:09:50 -06:00
codemann8
581e45a63c Merge branch 'DRUnstable' into OWMain 2025-12-03 09:37:31 -06:00
aerinon
b583cc58ff fix: not sure what I was thinking - fix branches and width 2025-12-02 11:09:37 -07:00
KrisDavie
761365927f Prevent prizes dropping in dungeons where they shouldn't (including cave state) and fix rain state items/tablets. 2025-12-02 08:28:08 -07:00
aerinon
68c511d6be fix: skip map check based on "compass" mode 2025-12-02 08:26:33 -07:00
codemann8
94efc26bf3 Merge branch 'limited' into OWMain 2025-12-02 08:57:32 -06:00
codemann8
029f687470 Merge branch 'limited' of https://github.com/codemann8/z3randomizer into limited 2025-12-02 08:57:16 -06:00
codemann8
4dd7bac4d6 Fixed cucco storm to actually work on first trigger 2025-12-02 08:56:53 -06:00
codemann8
1368e15872 Merge branch 'limited' into OWMain 2025-12-01 23:45:56 -06:00
codemann8
2fa0bfc4ef Fixed cucco storm to actually work on first trigger 2025-12-01 23:45:31 -06:00
codemann8
2418c1b322 Fix for post-mirror follower sprite gfx 2025-11-22 06:52:45 -06:00
codemann8
00fb9e6c5d Adding compress/decompress script for use with gfx 2025-11-21 09:20:59 -06:00
aerinon
5936b08497 fix: skip map check only when maps aren't shuffled 2025-11-20 10:04:53 -07:00
aerinon
70a23191ba fix: bunch of fixes for key counting system 2025-11-19 16:29:40 -07:00
codemann8
d21daccf4c changed TF item to use its own gfx id 2025-11-19 08:56:12 -06:00
codemann8
7b93b4b4eb Added new gfx for 10/11 keys rather than A/B keys 2025-11-18 23:54:10 -06:00
aerinon
fee689e583 feat: hud shows all keys, instead of chest keys. Dropped Map requirement for key info. 2025-11-18 15:19:28 -07:00
aerinon
08ecc9b673 feat: pot lose coloring upon collection
fix: normal lamp cone
2025-11-18 10:43:16 -07:00
codemann8
d451b531e7 Added default VRAM values for OWR edge data 2025-11-18 06:09:33 -06:00
aerinon
7f7ffeb5fb feat: lamp cone bitmask settings 2025-11-14 14:37:15 -07:00
aerinon
b27d7c996b feat: enemy "spies" during enemy drop 2025-11-14 09:06:07 -07:00
codemann8
57b8b04f0b Merged in DR v1.4.11 2025-11-13 19:21:33 -06:00
codemann8
7334dd02db Fix to allow VRAM corruption in Blind fight 2025-11-12 10:04:21 +01:00
codemann8
0fdec905d6 Fix to allow VRAM corruption in Blind fight 2025-11-12 02:29:01 -06:00
codemann8
f91e2eb1a2 Re-fixed purple chest follower dupe 2025-11-08 11:12:09 -06:00
codemann8
5a802eda70 Fixed issue with GT Cutscene freezing 2025-11-08 10:29:41 -06:00
codemann8
4d3c2bd7dc Added custom gfx for Ped and Murahdahla 2025-11-03 10:59:08 -06:00
codemann8
fa72adb53d Restore Kodongo AI when in vanilla rooms 2025-10-31 10:37:09 -06:00
codemann8
b24e440597 Fix issue with music silence in DR when straight stairs lead to pre-Aga room 2025-10-31 10:36:23 -06:00
aerinon
44b014fc65 fix: fix for pot drops at sprite limit 2025-10-31 10:29:29 -06:00
codemann8
78fa8b7dd9 Fixed Bosses goal condition check 2025-10-31 01:00:56 -05:00
codemann8
db62d4c660 Fixed issue with Locksmith despawning after purple chest turn-in when a follower is stored 2025-10-29 15:01:47 -05:00
codemann8
2ffcb1c3bd Implemented Custom Goal Framework 2025-10-29 00:08:16 -05:00
codemann8
a9ef09e2d0 Fixed Ganon silvers hint for free-standing items 2025-10-18 02:26:42 -05:00
codemann8
dfc182a2d5 New fix for pot drops when at sprite limit 2025-10-14 11:35:07 -05:00
codemann8
a8b1fc989e Fixed pogdor (frogdor at PoD entrance) with Kiki following while exiting at PoD 2025-09-21 13:40:51 -05:00
codemann8
c3616f2d65 Fixed issue with Duck overwriting GT cutscene gfx 2025-09-21 13:38:02 -05:00
codemann8
912df0be14 Re-fixed old man spawn on pyramid issue 2025-09-07 10:47:23 -05:00
codemann8
2ed9de827b Some follower fixes to support Zelda in TT Prison 2025-09-07 10:47:23 -05:00
9b7e5646b3 Improve junk item configuration 2025-09-05 20:47:36 -05:00
e4f9c4cffc Add variable ganon vulnerability mode 2025-09-03 19:53:10 -05:00
cef41b1674 Merge branch 'OWMain' into GKNew 2025-09-01 10:56:43 -05:00
codemann8
060554a5fb Implemented ability to change GT cutscene gfx 2025-08-25 15:20:36 -05:00
codemann8
e236543180 New gfx for chicken item 2025-08-19 10:17:04 -05:00
codemann8
ea4f39e116 Corrected some music fade-outs during mosaic transitions 2025-08-19 10:16:16 -05:00
codemann8
8ac480947d Fix for music so it doesn't change when going into special OW screens 2025-08-19 10:12:05 -05:00
codemann8
11ff5825ae Fix music change after dig game ends 2025-08-19 10:10:51 -05:00
codemann8
34fa1cd98e Fix issue with music silence in DR when straight stairs lead to pre-Aga room 2025-08-19 10:10:08 -05:00
codemann8
4c5adfbee2 Fix issue with LH/BS half volume issue when exiting to Kakariko 2025-08-19 10:08:36 -05:00
02b07528bb Merge branch 'OWmain' into GKNew 2025-07-22 11:33:34 -05:00
codemann8
6566aa6d48 Restore Kodongo AI when in vanilla rooms 2025-07-13 00:27:22 -05:00
codemann8
7164c3159d Fix crash when Old Man exits out of his House entrance 2025-07-11 04:54:28 -05:00
codemann8
d75d912c7d Added some compass icons to DR pause menu 2025-07-10 22:59:51 -05:00
codemann8
953c115719 Fix HUD to show prize, key count, and compass count if seen by player 2025-07-07 15:03:14 -05:00
9256f48f5e Merge branch 'OWMain' into GKNew 2025-07-01 14:08:48 -05:00
codemann8
1995d8747c Fixed issue with Quake scaring Kiki 2025-06-13 23:39:32 -05:00
codemann8
d8341c650d Fixed issue with Kiki running away at maze if Link spawns from Sanc 2025-06-12 10:28:38 -05:00
codemann8
021ba9d8a6 Actual fix for issue with no music in LH after S+Q from Kakariko 2025-06-12 01:50:21 -05:00
codemann8
4088698af9 Undo MSU Kak Music Fix 2025-06-12 00:54:23 -05:00
codemann8
d19e22cc7d Fix issue with Boots not showing in menu until S+Q 2025-06-10 02:47:08 -05:00
codemann8
e266d351cd Fix issue with despawning follower sprite after purple chest item get 2025-06-08 14:34:16 -05:00
codemann8
baec6954a3 Reset MSU Resume on S+Q 2025-06-05 20:52:13 -05:00
codemann8
faadd1d7f1 Fixing boss behavior in Swamp Palace Arrghus' room 2025-06-05 19:50:49 -05:00
2344f9490e copy skulls manually instead of DMA 2025-05-18 02:56:13 -05:00
642aec9112 Fix gloom heart icons to be loaded via DMA 2025-05-18 02:32:39 -05:00
bc0f396275 Challenge modes: OHKO and Gloom 2025-05-18 00:59:34 -05:00
codemann8
936ff5a882 Locksmith follower now behaves closer to vanilla 2025-05-16 22:20:48 -05:00
a3f892975f Merge branch 'OWMain' into GKNew 2025-05-04 15:18:54 -05:00
codemann8
86efa74185 Various bug fixes for Follower Shuffle post-launch
- Fix issue with infinite purple chest item get
- Fix issue with Kiki running away on iframe ledge hops
- Fix issue with bad follower gfx on screens with followers
- Fix issue with Zelda appearing in conditional follower locations
2025-05-04 09:24:33 -05:00
codemann8
7b4470ddae Merge branch 'DRUnstable' into OWMain 2025-04-30 06:58:20 -05:00
codemann8
2d84f7431e Minor consistency 2025-04-30 06:48:54 -05:00
codemann8
ed7fb312d5 Fixed some incorrect bunny music behavior 2025-04-30 06:26:33 -05:00
codemann8
aabb649578 Initial Follower Shuffle Implementation 2025-04-30 06:18:08 -05:00
aerinon
e86cccad52 fix: fix conveyor bug, unless Helmasaur is present 2025-04-28 14:15:31 -06:00
112 changed files with 10495 additions and 1045 deletions

View File

@@ -50,6 +50,7 @@ dw !ROM_VERSION_HIGH
function hexto555(h) = ((((h&$FF)/8)<<10)|(((h>>8&$FF)/8)<<5)|(((h>>16&$FF)/8)<<0))
; Feature flags, run asar with -DFEATURE_X=1 to enable
!FEATURE_FIX_BASEROM ?= 0
;================================================================================
@@ -118,6 +119,7 @@ incsrc doorframefixes.asm
incsrc music.asm
incsrc roomloading.asm
incsrc icepalacegraphics.asm
incsrc follower.asm
warnpc $A18000
org $9C8000 ; text tables for translation
@@ -177,12 +179,10 @@ incsrc toast.asm
incsrc fastcredits.asm
incsrc msu.asm
incsrc menu/overworldmap.asm ; Overwrites some code in bank $8A
incsrc dungeonmap.asm
incsrc bossicons.asm
incsrc hextodec.asm
incsrc multiworld.asm
incsrc textrenderer.asm
incsrc crystalswitchbook.asm
incsrc mimicdash.asm
warnpc $A58000
org $A28000
@@ -202,6 +202,24 @@ incsrc inventory.asm
incsrc menu/hudalpha.asm
warnpc $A38000
org $B98000
incsrc gk/crystalswitchbook.asm
incsrc gk/mimicdash.asm
incsrc gk/gloom.asm
incsrc gk/special_weapons.asm
incsrc gk/variable_ganon_vulnerability.asm
incsrc gk/pseudoflute.asm
incsrc gk/fast_junk.asm
incsrc gk/dungeon_maps.asm
print "End of B9: ", pc
warnpc $B9EE00
org $B9EE00
incsrc gk_meta.asm
org $B9F000
incsrc gk/settings.asm
org $A38000
incsrc stats/credits.asm ; Statically mapped
incsrc stats/main.asm
@@ -244,7 +262,7 @@ warnpc $B1A000
org $B1A000
GFX_HUD_Items:
incbin "menu/drsheetdc.2bppc"
incbin "menu/dr_sheet_dc.2bppc"
warnpc $B1A800
org $B1A800
@@ -297,6 +315,24 @@ NewFontInverted:
incbin "data/newfont_inverted.bin"
SmallCharacters:
incbin "data/smallchars.2bpp"
DungeonMapIcons1:
incbin "menu/map_icons_1.3bppc"
DungeonMapIcons2:
incbin "menu/map_icons_2.3bppc"
DungeonMapIcons3:
incbin "menu/map_icons_3.3bppc"
DungeonMapIcons4:
incbin "menu/map_icons_4.3bppc"
DungeonMapIcons5:
incbin "menu/map_icons_5.3bppc"
DungeonMapIcons6:
incbin "menu/map_icons_6.3bppc"
DungeonMapDoorConnectors:
incbin "menu/door_connectors.3bppc"
MapSheetD4:
incbin "menu/map_sheet_d4.3bppc"
org $8CD7DF
incsrc data/playernamecharmap.asm
org $8CE73D
@@ -354,6 +390,7 @@ warnpc $B08000
;$33 Graphics Bank
;$36 reserved for Enemizer
;$37 Room data if needed for DR/Pottery/Enemizer
;$39 GwaaKiwi Code Bank
;$3A reserved for downstream use
;$3B reserved for downstream use
;$3F reserved for internal debugging

BIN
bin/linux/compress Normal file

Binary file not shown.

BIN
bin/linux/decompress Normal file

Binary file not shown.

249
bin/src/compress.c Normal file
View File

@@ -0,0 +1,249 @@
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <sys/stat.h>
const int MAXLENGTH = 0x300;
struct section {
int mode;
int length;
unsigned char data[2];
int datalength;
};
int find_duplicate(off_t loc, off_t size, unsigned char buf[], struct section *out) {
int i, j;
struct section result;
result.mode = 4;
result.length = 0;
for (i = 0; i < loc && i < 0x10000; i++) {
if (buf[i] != buf[loc]) {
continue;
}
for (j = 0; j < MAXLENGTH; j++) {
if (buf[i + j] != buf[loc + j]) {
break;
}
}
if (j > result.length) {
result.length = j;
result.data[0] = i & 0xFF;
result.data[1] = (i >> 8) & 0xFF;
result.datalength = 2;
}
}
if (result.length < 4) {
return -1;
}
*out = result;
return 0;
}
int find_repeat_byte(off_t loc, off_t size, unsigned char buf[], struct section *out) {
int i;
for (i = 0; i < MAXLENGTH && loc + i < size; i++) {
if (buf[loc + i] != buf[loc]) {
break;
}
}
if (i > 2) {
struct section result;
result.mode = 1;
result.length = i;
result.data[0] = buf[loc];
result.datalength = 1;
*out = result;
return 0;
}
return -1;
}
int find_repeat_word(off_t loc, off_t size, unsigned char buf[], struct section *out) {
int i;
for (i = 0; i < MAXLENGTH && loc + i + 1 < size; i += 1) {
if (buf[loc + i] != buf[loc + (i & 1)]) {
break;
}
}
if (i > 3) {
struct section result;
result.mode = 2;
result.length = i;
result.data[0] = buf[loc];
result.data[1] = buf[loc + 1];
result.datalength = 2;
*out = result;
return 0;
}
return -1;
}
int find_incrementing_byte(off_t loc, off_t size, unsigned char buf[], struct section *out) {
int i;
for (i = 0; i < MAXLENGTH && loc + i < size; i++) {
if (buf[loc] + i < i) {
break;
}
if (buf[loc + i] != buf[loc] + i) {
break;
}
}
if (i > 2) {
struct section result;
result.mode = 3;
result.length = i;
result.data[0] = buf[loc];
result.datalength = 1;
*out = result;
return 0;
}
return -1;
}
int get_section(off_t loc, off_t size, unsigned char buf[], struct section *out) {
struct section best, current;
best.length = 0;
if (!find_repeat_byte(loc, size, buf, &current)) {
if (current.length > best.length) {
best = current;
}
}
if (!find_repeat_word(loc, size, buf, &current)) {
if (current.length > best.length) {
best = current;
}
}
if (!find_incrementing_byte(loc, size, buf, &current)) {
if (current.length > best.length) {
best = current;
}
}
if (!find_duplicate(loc, size, buf, &current)) {
if (current.length > best.length) {
best = current;
}
}
if (best.length > 0) {
// printf("byte %06X: mode %d length %02X\n", loc, best.mode, best.length);
*out = best;
return 0;
} else {
return -1;
}
}
int write_section(struct section section, unsigned char data[], unsigned char buf[], int loc) {
int nloc = loc;
int len = section.length - 1;
if (len > 0x1F) {
buf[nloc++] = 0xE0 | (section.mode << 2) | (len >> 8);
buf[nloc++] = len & 0xFF;
} else {
buf[nloc++] = (section.mode << 5) | len;
}
for (int i = 0; i < section.datalength; i++) {
buf[nloc++] = data[i];
}
return nloc;
}
int main(int argc, char *argv[]) {
if (argc < 3) {
printf("Usage: %s infile outfile [start [length]]\n", argv[0]);
return 1;
}
off_t seek = 0;
if (argc > 3) {
seek = strtol(argv[3], NULL, 0);
}
FILE *inptr;
if ((inptr = fopen(argv[1], "rb")) == NULL) {
printf("%s does not exist.\n", argv[1]);
return 1;
}
int fd = fileno(inptr);
if (fd < 0) {
printf("Error stating file: %s\n", argv[1]);
return 1;
}
struct stat buf;
if (fstat(fd, &buf) != 0) {
printf("Error stating file: %s\n", argv[1]);
return 1;
}
off_t size = buf.st_size - seek;
if (argc > 4) {
size = strtol(argv[4], NULL, 0);
}
unsigned char inbuf[size];
fseek(inptr, seek, SEEK_SET);
if (fread(inbuf, 1, size, inptr) < size) {
printf("Error reading file: %s\n", argv[1]);
return 1;
}
fclose(inptr);
unsigned char outbuf[size * 2];
unsigned char m0data[MAXLENGTH];
int oloc = 0;
struct section m0;
m0.mode = 0;
m0.length = 0;
int i;
off_t loc = 0;
while (loc < size) {
struct section section;
if (!get_section(loc, size, inbuf, &section)) {
if (m0.length > 0) {
m0.datalength = m0.length;
oloc = write_section(m0, m0data, outbuf, oloc);
m0.length = 0;
}
oloc = write_section(section, section.data, outbuf, oloc);
loc += section.length;
} else {
if (m0.length == MAXLENGTH) {
m0.datalength = m0.length;
oloc = write_section(m0, m0data, outbuf, oloc);
m0.length = 0;
}
m0data[m0.length++] = inbuf[loc];
loc += 1;
}
}
if (m0.length > 0) {
m0.datalength = m0.length;
oloc = write_section(m0, m0data, outbuf, oloc);
m0.length = 0;
}
outbuf[oloc++] = 0xFF;
FILE *outptr;
if ((outptr = fopen(argv[2], "wb")) == NULL) {
printf("Error opening file: %s\n", argv[2]);
return 1;
}
if (fwrite(outbuf, 1, oloc, outptr) < oloc) {
printf("Error writing to file: %s\n", argv[2]);
return 1;
}
fclose(outptr);
printf("Input file: %lX bytes. Compressed: %X bytes.\n", size, oloc);
return 0;
}

155
bin/src/decompress.c Normal file
View File

@@ -0,0 +1,155 @@
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <sys/stat.h>
struct section {
int mode;
int length;
unsigned char data[2];
int datalength;
};
int read_section(unsigned char buf[], int loc, struct section *out) {
int nloc = loc;
unsigned char header = buf[nloc++];
if (header == 0xFF) {
return -1;
}
struct section result;
result.data[0] = buf[loc];
result.datalength = 1;
if ((header & 0xE0) == 0xE0) {
result.mode = (header & 0x1C) >> 2;
result.length = (((header & 0x03) << 8) | buf[nloc++]) + 1;
} else {
result.mode = (header & 0xE0) >> 5;
result.length = (header & 0x1F) + 1;
}
switch (result.mode) {
case 0:
result.datalength = 0;
break;
case 1:
result.datalength = 1;
break;
case 2:
result.datalength = 2;
break;
case 3:
result.datalength = 1;
break;
case 4:
result.datalength = 2;
break;
}
for (int i = 0; i < result.datalength; i++) {
result.data[i] = buf[nloc++];
}
*out = result;
return nloc;
}
int main(int argc, char *argv[]) {
if (argc < 3) {
printf("Usage: %s infile outfile [start [length]]\n", argv[0]);
return 1;
}
off_t seek = 0;
if (argc > 3) {
seek = strtol(argv[3], NULL, 0);
}
FILE *inptr;
if ((inptr = fopen(argv[1], "rb")) == NULL) {
printf("%s does not exist.\n", argv[1]);
return 1;
}
int fd = fileno(inptr);
if (fd < 0) {
printf("Error stating file: %s\n", argv[1]);
return 1;
}
struct stat buf;
if (fstat(fd, &buf) != 0) {
printf("Error stating file: %s\n", argv[1]);
return 1;
}
off_t size = buf.st_size - seek;
if (argc > 4) {
size = strtol(argv[4], NULL, 0);
}
fseek(inptr, seek, SEEK_SET);
unsigned char inbuf[size];
if (fread(inbuf, 1, size, inptr) < size) {
printf("Error reading file: %s\n", argv[1]);
return 1;
}
fclose(inptr);
unsigned char outbuf[size * 256];
int oloc = 0;
struct section section;
int i;
off_t loc = 0;
while ((loc = read_section(inbuf, loc, &section)) >= 0) {
if (section.mode == 0) {
for (i = 0; i < section.length; i++) {
outbuf[oloc++] = inbuf[loc++];
}
} else if (section.mode == 1) {
for (i = 0; i < section.length; i++) {
outbuf[oloc++] = section.data[0];
}
} else if (section.mode == 2) {
for (i = 0; i < section.length; i++) {
outbuf[oloc++] = section.data[0];
if (++i < section.length) {
outbuf[oloc++] = section.data[1];
}
}
} else if (section.mode == 3) {
for (i = 0; i < section.length; i++) {
outbuf[oloc++] = (section.data[0] + i) & 0xff;
}
} else if (section.mode == 4) {
int offset = section.data[0] | (section.data[1] << 8);
for (i = 0; i < section.length; i++) {
outbuf[oloc++] = outbuf[offset + i];
}
}
}
FILE *outptr;
if ((outptr = fopen(argv[2], "wb")) == NULL) {
printf("Error opening file: %s\n", argv[2]);
return 1;
}
if (fwrite(outbuf, 1, oloc, outptr) < oloc) {
printf("Error writing to file: %s\n", argv[2]);
return 1;
}
fclose(outptr);
printf("Input file: %lX bytes. Decompressed: %X bytes.\n", size, oloc);
return 0;
}

BIN
bin/windows/compress.exe Normal file

Binary file not shown.

BIN
bin/windows/decompress.exe Normal file

Binary file not shown.

View File

@@ -16,7 +16,7 @@ DrawLibraryItemGFX:
RTL
;--------------------------------------------------------------------------------
SetLibraryItem:
LDY.w SprItemReceipt, X
LDY.w SprSourceItemId, X
JSL ItemSet_Library ; contains thing we wrote over
RTL
;--------------------------------------------------------------------------------
@@ -52,7 +52,7 @@ RTL
;--------------------------------------------------------------------------------
GiveBonkItem:
LDA.w SprItemMWPlayer, X : STA.l !MULTIWORLD_ITEM_PLAYER_ID
LDA.w SprItemReceipt, X
LDA.w SprSourceItemId, X
JSR AbsorbKeyCheck : BCC .notKey
PHY : LDY.b #$24 : JSL AddInventory : PLY ; do inventory processing for a small key
LDA.l CurrentSmallKeys : INC A : STA.l CurrentSmallKeys

View File

@@ -20,7 +20,12 @@ DoDungeonMapBossIcon:
; get sprite pointer for room
LDA.l UWSpritesPointers,X
STA.b Scrap00 ; pointer in $00
LDA.w #$0028 : STA.b Scrap02 ; set the bank to 28 for now
if !FEATURE_FIX_BASEROM
LDA.w #$0089
else
LDA.w #$0028 ; set the bank to 28 for now
endif
STA.b Scrap02
LDY.w #$0001 ; to skip the "sort"
; get first byte to make sure it isn't an empty room

View File

@@ -1,12 +1,5 @@
;================================================================================
;--------------------------------------------------------------------------------
AssignKiki:
LDA.b #$00 : STA.l FollowerDropped ; defuse bomb
LDA.b #$0A : STA.l FollowerIndicator ; assign kiki as follower
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Name: AllowSQ
; Returns: Accumulator = 0 if S&Q is disallowed, 1 if allowed
@@ -187,6 +180,25 @@ LDA.b IndoorsFlag : BNE +
+
RTL
PostFixMirrorGfxPrep:
LDA.b #$01 : STA.w OWTransitionFlag
JML HandleFollowersAfterMirroring ; what we wrote over
; warning, this is called on frames after PostFixMirrorGfxPrep but for
; several frames after, so we use OWTransitionFlag to run something once
PostFixMirrorGfx:
STA.w SubModuleInterface ; what we wrote over
LDA.w OWTransitionFlag : CMP.b #$01 : BNE .done
LDA.b #$08 : STA.w OWTransitionFlag
JML FollowerGfxRedraw
.done
RTL
PostFixOAMGfx:
JSL FollowerGfxRedraw
REP #$30 : LDA.w #$2000 ; what we wrote over
RTL
;--------------------------------------------------------------------------------
; Fix losing VRAM gfx when using quake
PostNMIUpdateBGCharHalf:
@@ -259,73 +271,10 @@ ParadoxCaveGfxFix:
LDA.b #$01 : STA.w DMAENABLE
.skipLine
RTL
JML FollowerGfxRedraw
.skipMostOfLine
; Set line length to 192 bytes (the first 6 8x8 tiles in the line)
LDX.w #$00C0 : STX.w DAS0L
BRA .uploadLine
;--------------------------------------------------------------------------------
SetItemRiseTimer:
LDA.w ItemReceiptMethod : CMP.b #$01 : BNE .not_from_chest
LDA.b #$38 : STA.w AncillaTimer, X
RTL
.not_from_chest
LDA.l MultiworldJunkItemTimer : BEQ .default
LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE .multiworld
LDA.l !MULTIWORLD_RECEIVING_ITEM : BNE .multiworld
BRA .default
.multiworld
LDA.l !MULTIWORLD_ITEM_ID
JSL.l ItemIsJunk
BEQ .default
.junk
LDA.l MultiworldJunkItemTimer : STA.w AncillaTimer, X
RTL
.default
TYA : STA.w AncillaTimer, X ; What we wrote over
RTL
;--------------------------------------------------------------------------------
ItemIsJunk:
PHX
LDX.b #JunkItems_end-JunkItems-1
-
CMP.l JunkItems, X : BEQ .junk
DEX : BPL -
PLX
LDA.b #$00
RTL
.junk
PLX
LDA.b #$01
RTL
RTL
JunkItems:
db $27 ; Bomb
db $28 ; 3 bombs
db $31 ; 10 bombs
db $34 ; 1 rupee
db $35 ; 5 rupees
db $36 ; 20 rupees
db $40 ; 100 rupees
db $41 ; 50 rupees
db $42 ; Heart
db $43 ; Arrow
db $44 ; 10 arrows
db $45 ; Small magic
db $46 ; 300 rupees
db $47 ; 20 rupees green
db $59 ; Rupoor
db $D1 ; Apples
db $D2 ; Fairy
db $D3 ; Chicken
db $D4 ; Big Magic
db $D5 ; 5 Arrows
db $D6 ; Good Bee
.end
;--------------------------------------------------------------------------------

View File

@@ -3,6 +3,7 @@
!INERT = $00
!INIT = $08
!ALIVE = $09
!OAMPROPS = $09
!CUCCO_ENRAGED = $23
CuccoStorm:
@@ -12,6 +13,7 @@ CuccoStorm:
LDA.b GameMode : CMP.b #$09 : BNE + ; only if outdoors
LDA.l LoopFrames : AND.b #$7F : BNE + ; check every 128 frames
.activate
-
;==== Find a Cucco
@@ -40,7 +42,11 @@ CuccoStorm:
PLY
CPY.b #$FF : BEQ + ; fail if no slots found
LDA.b #!CUCCO : STA.w SpriteTypeTable, Y
LDA.b #!INIT : STA.w SpriteAITable, Y
LDA.b #!ALIVE : STA.w SpriteAITable, Y
PHX
TYX : JSL ResetSpriteProperties
PLX
LDA.b #!OAMPROPS : STA.w SpriteOAMProp, Y
LDA.b LinkPosY : STA.w SpritePosYLow, Y
LDA.b LinkPosY+1 : STA.w SpritePosYHigh, Y
LDA.b LinkPosX : STA.w SpritePosXLow, Y

View File

@@ -2,7 +2,6 @@
; Dark World Spawn Location Fix & Master Sword Grove Fix
;--------------------------------------------------------------------------------
DarkWorldSaveFix:
LDA.b #$70 : PHA : PLB ; thing we wrote over - data bank change
JSL MasterSwordFollowerClear
JML StatSaveCounter
;--------------------------------------------------------------------------------
@@ -12,6 +11,7 @@ DoWorldFix:
+
LDA.l Bugfix_MirrorlessSQToLW : BEQ .skip_mirror_check
LDA.l FollowerIndicator : CMP.b #$04 : BNE + ; if old man following, skip mirror/aga check
LDA.l FollowerTravelAllowed : CMP.b #$02 : BEQ +
LDA.l OldManRetrievalWorld
BRA .noMirror
+ LDA.l MirrorEquipment : AND.b #$02 : BEQ .noMirror ; check if we have the mirror
@@ -60,6 +60,7 @@ RTL
DoWorldFix_Inverted:
LDA.l Bugfix_MirrorlessSQToLW : BEQ .skip_mirror_check
LDA.l FollowerIndicator : CMP.b #$04 : BNE + ; if old man following, skip mirror/aga check
LDA.l FollowerTravelAllowed : CMP.b #$02 : BEQ +
LDA.l OldManRetrievalWorld
BRA .setWorld
+ LDA.l MirrorEquipment : AND.b #$02 : BEQ .noMirror ; check if we have the mirror
@@ -115,12 +116,13 @@ FakeWorldFix:
RTL
;--------------------------------------------------------------------------------
GetCurrentWorldForLoad:
LDA FollowerIndicator : CMP #$04 : BNE .default
LDA InvertedMode : BEQ +
LDA #$40
+ RTL
LDA.l FollowerTravelAllowed : CMP.b #$02 : BEQ .default
LDA.l FollowerIndicator : CMP.b #$04 : BNE .default
LDA.l InvertedMode : BEQ +
LDA.b #$40
+ RTL
.default
LDA CurrentWorld
LDA.l CurrentWorld
RTL
;--------------------------------------------------------------------------------
MasterSwordFollowerClear:
@@ -131,7 +133,9 @@ MasterSwordFollowerClear:
RTL
;--------------------------------------------------------------------------------
FixAgahnimFollowers:
LDA.b #$00 : STA.l FollowerIndicator ; clear follower
LDA.l FollowerTravelAllowed : CMP.b #$02 : BEQ +
LDA.b #$00 : STA.l FollowerIndicator ; clear follower
+
JML PrepDungeonExit ; thing we wrote over
;--------------------------------------------------------------------------------

Binary file not shown.

Binary file not shown.

BIN
data/skull.bin Normal file

Binary file not shown.

View File

@@ -202,6 +202,8 @@ DecompressAllItemGraphics:
LDX.b #$5C+$73 : JSR AddGfxSheetToBigBuffer
LDX.b #$5B+$73 : JSR AddGfxSheetToBigBuffer
LDX.b #$5A+$73 : JSR AddGfxSheetToBigBuffer
JSR AddCherryPickGfxToBigBuffer
LDX.b #$01 : STX.w $06FA
LDX.b #$06+$73 : JSR AddGfxSheetToBigBuffer
LDX.b #$07+$73 : JSR AddGfxSheetToBigBuffer
@@ -497,6 +499,11 @@ macro DoPlanesA(offset)
XBA
ORA.b Decomp3BPPScratch
PHY
LDY.w $06FA : BEQ +
AND.w #$00FF ; idk why this line works but some sheets we pull in aren't correct without it
+
PLY
STA.w BigDecompressionBuffer+$10+<offset>+<offset>,X
endmacro
@@ -520,7 +527,11 @@ macro DoIndirectPlanesA(offset)
XBA
ORA.b Decomp3BPPScratch
AND.w #$00FF ; idk why this line works but the 2 sheets we pull in aren't correct without it
PHY
LDY.w $06FA : BEQ +
AND.w #$00FF ; idk why this line works but some sheets we pull in aren't correct without it
+
PLY
STA.l BigDecompressionBuffer+$10+<offset>+<offset>,X
endmacro
@@ -612,4 +623,57 @@ Unrolled3BPPConvert:
;===================================================================================================
macro CherryPickGfx(source,dest,length)
LDX.w #BigDecompressionBuffer+<source>
LDY.w #BigDecompressionBuffer+<dest>
LDA.w #<length>-1
MVN BigDecompressionBuffer>>16,BigDecompressionBuffer>>16
LDX.w #BigDecompressionBuffer+<source>+$200
LDY.w #BigDecompressionBuffer+<dest>+$200
LDA.w #<length>-1
MVN BigDecompressionBuffer>>16,BigDecompressionBuffer>>16
endmacro
;===================================================================================================
AddCherryPickGfxToBigBuffer:
; this is mostly to load and rearrange follower gfx to save on space
; assumes DecompBufferOffset left off at $A000 (#BigDecompressionBuffer+$2000)
; adjustments will be needed if anything prior to this changes
LDX.b #$01 : STX.w $06FA
LDX.b #$35+$73 : JSR AddGfxSheetToBigBuffer
LDX.b #$55+$73 : JSR AddGfxSheetToBigBuffer
REP #$30
%CherryPickGfx($2400,$2140,$40) ; move old man head
%CherryPickGfx($2D40,$20C0,$40) ; move zelda body
LDA.b DecompBufferOffset : SEC : SBC.w #$0C00 : STA.b DecompBufferOffset
SEP #$30
LDX.b #$11+$73 : JSR AddGfxSheetToBigBuffer
LDX.b #$15+$73 : JSR AddGfxSheetToBigBuffer
REP #$30
%CherryPickGfx($2940,$2180,$80) ; move locksmith head/body
%CherryPickGfx($2D00,$0440,$40) ; move frog
%CherryPickGfx($31C0,$0500,$40) ; move purple chest
LDA.b DecompBufferOffset : SEC : SBC.w #$1000 : STA.b DecompBufferOffset
SEP #$30
LDX.b #$59+$73 : JSR AddGfxSheetToBigBuffer
LDX.b #$58+$73 : JSR AddGfxSheetToBigBuffer
REP #$30
%CherryPickGfx($2880,$0480,$40) ; move kiki head
%CherryPickGfx($2900,$04C0,$40) ; move kiki body
%CherryPickGfx($30C0,$0540,$40) ; move big bomb
%CherryPickGfx($2C40,$0180,$40) ; move duck
LDA.b DecompBufferOffset : SEC : SBC.w #$1000 : STA.b DecompBufferOffset
SEP #$30
LDX.b #$4D+$73 : JSR AddGfxSheetToBigBuffer
LDX.b #$50+$73 : JSR AddGfxSheetToBigBuffer
REP #$30
%CherryPickGfx($2880,$0580,$40) ; move smith
%CherryPickGfx($3140,$0140,$40) ; move chicken
LDA.b DecompBufferOffset : SEC : SBC.w #$1000 : STA.b DecompBufferOffset
SEP #$30
STZ.w $06FA
RTS

View File

@@ -265,7 +265,7 @@ RTL
RTL
;--------------------------------------------------------------------------------
DialogGanon1:
JSL CheckGanonVulnerability
LDA.b #$01 : JSL CheckConditionPass
REP #$20
LDA.w #$018C
BCC +
@@ -284,28 +284,68 @@ RTL
; s = silver arrow bow
; p = 2nd progressive bow
DialogGanon2:
JSL CheckGanonVulnerability
LDA.b #$01 : JSL CheckConditionPass
REP #$20
BCS +
LDA.w #$018D : BRA ++
+
LDA.l BowTracking
REP #$20
BCS +
LDA.w #$018D : JMP .done
+
LDA.l GanonVulnerabilityItem : AND.w #$00FF
BEQ .silver_arrows
CMP.w #$0001 : BEQ .silver_arrows
CMP.w #$0004 : BEQ .bombs
CMP.w #$0005 : BEQ .powder
CMP.w #$0010 : BEQ .bee
BIT.w #$0080 : BNE + ; branch if bow
LDA.w #$0192 : BRA ++
+
BIT.w #$0040 : BEQ + ; branch if no silvers
LDA.w #$0195 : BRA ++
+
BIT.w #$0020 : BNE + ; branch if p bow
LDA.w #$0194 : BRA ++
+
LDA.w #$0193 : BRA ++
++
STA.w TextID
SEP #$20
JSL Sprite_ShowMessageMinimal_Alt
PHX : TAX
LDA.l EquipmentWRAM-1, X
PLX
AND.w #$00FF : BNE .have
BRA .dont_have
.silver_arrows
LDA.l BowTracking
BIT.w #$0080 : BEQ .dont_have ; no bow
BIT.w #$0040 : BNE .have ; have silvers
BIT.w #$0020 : BNE +
LDA.w #$0194 : BRA .done ; have p bow
+ LDA.w #$0193 : BRA .done ; don't have p bow
.dont_have
LDA.w #$0192 : BRA .done
.have
LDA.w #$0195 : BRA .done
.bombs
LDA.l BombsEquipment : AND.w #$00FF : BNE .have
LDA.l InfiniteBombs : AND.w #$00FF : BNE .have
BRA .dont_have
.powder
LDA.l InventoryTracking : BIT.w #$0010 : BNE .have
BRA .dont_have
.bee
LDA.l BottleContentsOne : AND.w #$00FF
CMP.w #$0007 : BEQ .have
CMP.w #$0008 : BEQ .have
LDA.l BottleContentsTwo : AND.w #$00FF
CMP.w #$0007 : BEQ .have
CMP.w #$0008 : BEQ .have
LDA.l BottleContentsThree : AND.w #$00FF
CMP.w #$0007 : BEQ .have
CMP.w #$0008 : BEQ .have
LDA.l BottleContentsFour : AND.w #$00FF
CMP.w #$0007 : BEQ .have
CMP.w #$0008 : BEQ .have
BRA .dont_have
.done
STA.w TextID
SEP #$20
JSL Sprite_ShowMessageMinimal_Alt
RTL
;--------------------------------------------------------------------------------
DialogEtherTablet:
@@ -372,8 +412,8 @@ RTL
;---------------------------------------------------------------------------------------------------
AgahnimAsksAboutPed:
LDA.l GanonVulnerableMode
CMP.b #$06 : BNE .vanilla
; seems light_speed option to change some aga text is unused for now
BRA .vanilla
LDA.l OverworldEventDataWRAM+$80 ; check ped flag
AND.b #$40

View File

@@ -13,6 +13,7 @@ PHP
SetDefaultWorld:
PHP : SEP #$20
LDA.l FollowerTravelAllowed : CMP.b #$02 : BEQ .default
LDA.l FollowerIndicator : CMP.b #$04 : BNE .default
LDA.l OldManRetrievalWorld : BRA +
.default

View File

@@ -45,35 +45,49 @@ DRHUD_BossIndicator:
LDA.w CompassField : AND.l DungeonMask, x
SEP #$20
BEQ .draw_indicator
LDA.l CompassBossIndicator, x : CMP.b RoomIndex : BNE .draw_indicator
LDY.w #!RedSquare
LDA.l CompassBossIndicator, x : CMP.b RoomIndex : BNE .draw_indicator
LDY.w #!RedSquare
.draw_indicator
STY.w HUDMultiIndicator
STY.w HUDMultiIndicator
BRA DRHUD_DrawCurrentDungeonIndicator
DRHUD_EnemyDropIndicator:
REP #$30
LDA.w EnemyDropIndicator : STA.w HUDMultiIndicator
SEP #$20
LDA.w DungeonID : CMP.b #$1B : BCS DRHUD_Finished
LDA.w DungeonID : CMP.b #$1B : BCC + : JMP DRHUD_Finished : +
SEP #$10 : TAX : REP #$10
DRHUD_DrawCurrentDungeonIndicator: ; mX
LDA.l DRMode : BIT.b #$02 : BEQ DRHUD_Finished
LDY.w #!BlankTile
LDA.w CurrentHealth : BEQ .draw_indicator
LDA.l DRMode : BIT.b #$02 : BNE + : JMP DRHUD_Finished : +
LDY.w #!BlankTile
LDA.w CurrentHealth : BEQ .draw_indicator
REP #$20 : LDA.l DungeonReminderTable,X : TAY
SEP #$20
LDA.b GameMode
CMP.b #$0E : BNE .get_indicator
LDA.b GameSubMode
CMP.b #$03 : BNE .get_indicator
LDA.w SubModuleInterface
CMP.b #$06 : BEQ .draw_indicator
.get_indicator
REP #$20 : LDA.l DungeonReminderTable,X : TAY
SEP #$20
.draw_indicator
STY.w HUDCurrentDungeonWorld
DRHUD_DrawKeyCounter:
LDA.l DRFlags : AND.b #$04 : BEQ DRHUD_Finished
REP #$20
LDA.w MapField : AND.l DungeonMask, X : BEQ DRHUD_Finished
TXA : LSR : TAX
LDA.l GenericKeys : AND.w #$00FF : BNE .total_only
LDA.l DRFlags : AND.b #$04 : BEQ DRHUD_Finished
LDA.l CompassMode : BIT.b #$03 : BEQ DRHUD_Finished
REP #$20
BIT.w #$0002 : BNE .skip_map_check
LDA.w MapField : AND.l DungeonMask, X : BEQ DRHUD_Finished
.skip_map_check
TXA : LSR : BNE .dungeon_id
INC
.dungeon_id
TAX
LDA.l GenericKeys : LSR : BCS .total_only
LDA.w DungeonCollectedKeys, X : JSR ConvertToDisplay : STA.w HUDKeysObtained
LDA.w #!SlashTile : STA.w HUDKeysSlash
.total_only
@@ -111,95 +125,102 @@ dw $0000, $0000, $0000, $0000, $000a, $000a, $000a, $0014, $000a, $0014, $0000,
DrHudDungeonItemsAdditions:
{
jsl DrawHUDDungeonItems
lda.l DRMode : cmp.b #$02 : beq + : rtl : +
jsl DrawHUDDungeonItems
lda.l DRMode : cmp.b #$02 : beq + : rtl : +
phx : phy : php
rep #$30
phx : phy : php
rep #$30
lda.w #$24f5 : sta.w $1606 : sta.w $1610 : sta.w $161a : sta.w $1624
sta.w $1644 : sta.w $164a : sta.w $1652 : sta.w $1662 : sta.w $1684 : sta.w $16c4
ldx.w #$0000
- sta.w $1704, x : sta.w $170e, x : sta.w $1718, x
inx #2 : cpx.w #$0008 : !BLT -
lda.w #$24f5 : sta.w $1606 : sta.w $1610 : sta.w $161a : sta.w $1624
sta.w $1644 : sta.w $164a : sta.w $1652 : sta.w $1662 : sta.w $1684 : sta.w $16c4
ldx.w #$0000
- sta.w $1704, x : sta.w $170e, x : sta.w $1718, x
inx #2 : cpx.w #$0008 : !BLT -
lda.l HudFlag : and.w #$0020 : beq + : JMP ++ : +
lda.l HUDDungeonItems : and.w #$0007 : bne + : JMP ++ : +
; bk symbols
lda.l HudFlag : and.w #$0020 : beq + : JMP ++ : +
lda.l HUDDungeonItems : and.w #$001F : bne + : JMP ++ : +
; bk symbols
lda.w #$2811 : sta.w $1606 : sta.w $1610 : sta.w $161a : sta.w $1624
; sm symbols
lda.w #$2810 : sta.w $160a : sta.w $1614 : sta.w $161e : sta.w $16e4
; blank out stuff
lda.w #$24f5 : sta.w $1724
; blank out stuff
lda.w #$24f5 : sta.w $1724
ldx.w #$0002
- lda.w #$0000 : !ADD.l RowOffsets,x : !ADD.l ColumnOffsets, x : tay
lda.l DungeonReminderTable, x : sta.w $1644, y : iny #2
lda.w #$24f5 : sta.w $1644, y
lda.l MapField : and.l DungeonMask, x : beq + ; must have map
jsr BkStatus : sta.w $1644, y : bra .smallKey ; big key status
+ lda.l BigKeyField : and.l DungeonMask, x : beq .smallKey
lda.w #$2826 : sta.w $1644, y
.smallKey
+ iny #2
ldx.w #$0002
- lda.w #$0000 : !ADD.l RowOffsets,x : !ADD.l ColumnOffsets, x : tay
JSR BossStatus : STA.w $1644, Y
INY #2
lda.w #$24f5 : sta.w $1644, y
lda.l MapField : and.l DungeonMask, x : beq + ; must have map
jsr BkStatus : sta.w $1644, y : bra .smallKey ; big key status
+ lda.l BigKeyField : and.l DungeonMask, x : beq .smallKey
lda.w #$2826 : sta.w $1644, y
.smallKey
+ iny #2
cpx.w #$001a : bne +
tya : !ADD.w #$003c : tay
+ stx.b Scrap00
txa : lsr : tax
lda.w #$24f5 : sta.w $1644, y
lda.l GenericKeys : and.w #$00FF : bne +
lda.l DungeonKeys, x : and.w #$00FF : beq +
jsr ConvertToDisplay2 : sta.w $1644, y
+ iny #2 : lda.w #$24f5 : sta.w $1644, y
phx : ldx.b Scrap00
lda.l MapField : and.l DungeonMask, x : beq + ; must have map
plx : sep #$30 : lda.l ChestKeys, x : sta.b Scrap02
lda.l GenericKeys : bne +++
lda.b Scrap02 : !SUB.l DungeonCollectedKeys, x : sta.b Scrap02
+++ lda.b Scrap02
rep #$30
jsr ConvertToDisplay2 : sta.w $1644, y ; small key totals
bra .skipStack
+ plx
.skipStack iny #2
cpx.w #$000d : beq +
lda.w #$24f5 : sta.w $1644, y
+
ldx.b Scrap00
+ inx #2 : cpx.w #$001b : bcs ++ : JMP -
++
lda.l HudFlag : and.w #$0020 : bne + : JMP ++ : +
; map symbols (do I want these) ; note compass symbol is 2c20
lda.w #$2821 : sta.w $1606 : sta.w $1610 : sta.w $161a : sta.w $1624
; blank out a couple thing from old hud
lda.w #$24f5 : sta.w $16e4 : sta.w $1724
sta.w $160a : sta.w $1614 : sta.w $161e ; blank out sm key indicators
ldx.w #$0002
- lda.w #$0000 ; start of hud area
!ADD.l RowOffsets, x : !ADD.l ColumnOffsets, x : tay
lda.l DungeonReminderTable, x : sta.w $1644, y
iny #2
lda.w #$24f5 : sta.w $1644, y ; blank out map spot
lda.l MapField : and.l DungeonMask, x : beq + ; must have map
JSR MapIndicatorShort : STA.w $1644, Y
+ stx.b Scrap00
txa : lsr : tax
lda.w #$24f5 : sta.w $1644, y
lda.l GenericKeys : and.w #$00FF : bne +
lda.l DungeonKeys, x : and.w #$00FF : beq +
jsr ConvertToDisplay2 : sta.w $1644, y
+ iny #2 : lda.w #$24f5 : sta.w $1644, y
phx : ldx.b Scrap00
LDA.l CompassMode : BIT.w #$0002 : BNE .skip_map_check
LDA.l MapField : AND.l DungeonMask, x : BEQ .key_info_done ; must have map
.skip_map_check
plx : sep #$30 : lda.l ChestKeys, x : sta.b Scrap02
lda.l GenericKeys : bne +++
lda.b Scrap02 : !SUB.l DungeonCollectedKeys, x : sta.b Scrap02
+++ lda.b Scrap02
rep #$30
jsr ConvertToDisplay2 : sta.w $1644, y ; small key totals
bra .skipStack
.key_info_done
plx
.skipStack iny #2
cpx.w #$000d : beq +
lda.w #$24f5 : sta.w $1644, y
+
ldx.b Scrap00
+ inx #2 : cpx.w #$001b : bcs ++ : JMP -
++
lda.l HudFlag : and.w #$0020 : bne + : JMP ++ : +
; map symbols
lda.w #$2821 : sta.w $1606 : sta.w $1610 : sta.w $161a
; compass symbols
lda.w #$2c20 : sta.w $160a : sta.w $1614 : sta.w $161e : sta.w $16e4
; blank out a couple thing from old hud
lda.w #$24f5 : sta.w $1624 : sta.w $1724
ldx.w #$0002
- lda.w #$0000 ; start of hud area
!ADD.l RowOffsets, x : !ADD.l ColumnOffsets, x : tay
JSR BossStatus : STA.w $1644, Y
INY #2
lda.w #$24f5 : sta.w $1644, y ; blank out map spot
lda.l MapField : ora.l MapCountDisplay : ora.l MapOverlay
and.l DungeonMask, x : beq + ; must have map
JSR MapIndicatorShort : STA.w $1644, Y
+ iny #2
cpx.w #$001a : bne +
cpx.w #$001a : bne +
tya : !ADD.w #$003c : tay
+ lda.l CompassField : and.l DungeonMask, x : beq + ; must have compass
phx ; total chest counts
LDA.l CompassTotalsWRAM, x : !SUB.l DungeonLocationsChecked, x
SEP #$30 : JSR HudHexToDec2DigitCopy : REP #$30
lda.b Scrap06 : jsr ConvertToDisplay2 : sta.w $1644, y : iny #2
lda.b Scrap07 : jsr ConvertToDisplay2 : sta.w $1644, y
plx
bra .skipBlanks
+ lda.l CompassField : ora.l CompassCountDisplay
and.l DungeonMask, x : beq + ; must have compass
phx ; total chest counts
LDA.l CompassTotalsWRAM, x : !SUB.l DungeonLocationsChecked, x
SEP #$30 : JSR HudHexToDec2DigitCopy : REP #$30
lda.b Scrap06 : jsr ConvertToDisplay2 : sta.w $1644, y : iny #2
lda.b Scrap07 : jsr ConvertToDisplay2 : sta.w $1644, y
plx
bra .skipBlanks
+ lda.w #$24f5 : sta.w $1644, y : iny #2 : sta.w $1644, y
.skipBlanks iny #2
cpx.w #$001a : beq +
.skipBlanks iny #2
cpx.w #$001a : beq +
lda.w #$24f5 : sta.w $1644, y ; blank out spot
+ inx #2 : cpx.w #$001b : !BGE ++ : JMP -
++
plp : ply : plx : rtl
+ inx #2 : cpx.w #$001b : !BGE ++ : JMP -
++
plp : ply : plx : rtl
}
MapIndicatorLong:
@@ -239,20 +260,72 @@ BkStatus:
+ lda.w #$24f5 : rts ; black otherwise
+++ lda.w #$2826 : rts ; check mark
BossStatus:
LDA.l HUDDungeonItems : BIT.w #$0010 : BEQ .normal
PHX
LDA.l DungeonMapBossRooms, X
CMP.w #$000F
BEQ .no_boss
ASL A
TAX
LDA.l SaveDataWRAM, X
PLX
BIT.w #$0800
BEQ .boss_alive
.boss_dead
LDA.l HudFlag : BIT.w #$0020 : BNE .skull
; palette 3 - white
LDA.l DungeonReminderTable, X : AND.w #$E3FF : ORA.w #$0C00 : RTS
.skull
LDA.w #$280F : RTS
.no_boss
PLX
; palette 0 - light gray
LDA.l DungeonReminderTable, X : AND.w #$E3FF : RTS
.boss_alive
; palette 4 - gray
LDA.l DungeonReminderTable, X : AND.w #$E3FF : ORA.w #$1000 : RTS
.normal
; default palette 3 - white
LDA.l DungeonReminderTable, X : RTS
ConvertToDisplay:
and.w #$00ff : cmp.w #$000a : !BLT +
!ADD.w #$2553 : rts
!ADD.w #$2519 : rts
+ !ADD.w #$2490 : rts
ConvertToDisplay2:
and.w #$00ff : beq ++
cmp.w #$000a : !BLT +
!ADD.w #$2553 : rts ; 2580 with 258A as "A" for non transparent digits
!ADD.w #$2517 : rts ; 2580 with 258A as "A" for non transparent digits
+ !ADD.w #$2816 : rts
++ lda.w #$2827 : rts ; 0/O for 0 or placeholder digit ;2483
CountAbsorbedKeys:
JML IncrementSmallKeysNoPrimary
JML IncrementSmallKeysNoPrimary
; This function apporach doesn't currently work
CountAbsorbedKeysViaCountAllKey:
PHA : PHX
LDA.l StandingItemsOn : BEQ .count_it
; LDA.w SpawnedItemKeyCounted : BNE .done ; this was added because pot keys were being double counted when they weren't shuffled
CPY.b #$24 : BEQ .count_it ; small key for this dungeon
LDA.w DungeonID : LSR : TAX
TYA : CMP.l KeyTable, X : BNE .done
.count_it
STY.b Scrap02 : LDY.b #$24 ; for non-24 items (w/o standing_items a small key is just $C), fake it
LDX.b #$84 ; pretend this isn't a smallkey, but an absorbed object (small heart)
REP #$10 : JSL CountAllKey : SEP #$10
LDY.b Scrap02
.done
; STZ.w SpawnedItemKeyCounted ; reset to zero for next time
PLX : PLA
JML IncrementSmallKeysNoPrimary
;================================================================================
; 8-bit registers

View File

@@ -11,6 +11,7 @@ rtl
OnFileLoadOverride:
jsl OnFileLoad ; what I wrote over
jsl StartingFollower
+ lda.l DRFlags : and.b #$02 : beq + ; Mirror Scroll
lda.l MirrorEquipment : bne +
lda.b #$01 : sta.l MirrorEquipment
@@ -52,8 +53,9 @@ GuruguruFix:
BlindAtticFix:
lda.l DRMode : beq +
lda.b #$01 : rtl
+ lda.l FollowerIndicator : cmp.b #$06
- lda.b #$01 : rtl
+ lda.l FollowerTravelAllowed : cmp.b #$02 : beq -
lda.l FollowerIndicator : cmp.b #$06
rtl
SuctionOverworldFix:
@@ -119,12 +121,6 @@ BlindsAtticHint:
SEP #$20 : RTL ; skip the dialog box if the hole is already open
+ SEP #$20 : JML Main_ShowTextMessage
BlindZeldaDespawnFix:
CMP.b #06 : BEQ +
LDA.w SpritePosYLow,X : BEQ + ; don't despawn follower if maiden isn't "present"
PLA : PLA : PEA.w SpritePrep_BlindMaiden_despawn_follower-1 : RTL
+ PLA : PLA : PEA.w SpritePrep_BlindMaiden_kill_the_girl-1 : RTL
BigKeyDoorCheck:
CPY.w #$001E : BNE + ; skip if it isn't a BK door
LDA.l DRFlags : AND.w #$0400 : BNE + ; skip if the flag is set - bk doors can be double-sided

View File

@@ -3,6 +3,16 @@
;--------------------------------------------------------------------------------
SpawnDungeonPrize:
PHX : PHB
PHA
; Don't spawn prize in Cave state, Hyrule Castle, Escape, Castle Tower, or Ganon's Tower
LDA.w DungeonID : BMI .skip_prize_drop ; Cave state
CMP.b #$00 : BEQ .skip_prize_drop ; Escape
CMP.b #$02 : BEQ .skip_prize_drop ; Hyrule Castle
CMP.b #$1A : BEQ .skip_prize_drop ; Ganon's Tower
CMP.b #$08 : BEQ .skip_prize_drop ; Agahnim's Tower (Castle Tower)
PLA
STA.w ItemReceiptID
TAX
LDA.b $06,S : STA.b ScrapBuffer72 ; Store current RoomTag index
@@ -18,6 +28,10 @@ SpawnDungeonPrize:
PLB : PLX
RTL
.skip_prize_drop:
PLA : PLB : PLX
RTL
AddDungeonPrizeAncilla:
LDY.w ItemReceiptID
STZ.w AncillaVelocityY,X
@@ -453,6 +467,7 @@ RTL
MaybeSkipCrystalCutsceneFollowerReset:
PHA
LDA.l FollowerTravelAllowed : CMP.b #$02 : BEQ .skip
; skip if prizes are shuffled outside of normal boss drops
LDA.l InventoryTable_properties+($37*2) : AND.b #$01 : BEQ .continue
.skip

View File

@@ -39,32 +39,30 @@ RTL
Elder_Code:
{
REP #$20
LDA.l GoalItemRequirement : BEQ .despawn
LDA.l GanonVulnerableMode : AND.w #$00FF : CMP.w #$0005 : BEQ .despawn
LDA.l TurnInGoalItems : AND.w #$00FF : BNE +
TXY : LDX.b #$06
REP #$30
LDA.l GoalConditionTable, X
TAX : LDA.l $B00000, X
SEP #$30
TYX
CMP.b #$00 : BEQ .despawn ; no goal, despawn
LDA.l TurnInGoalItems : BNE +
.despawn
SEP #$20
STZ.w SpriteAITable, X ; despawn self
RTS
+
SEP #$20
LDA.b GameSubMode
BNE .done
LDA.b #$96
LDY.b #$01
JSL Sprite_ShowSolicitedMessageIfPlayerFacing_PreserveMessage : BCC .dont_show
REP #$20
LDA.l GoalCounter
CMP.l GoalItemRequirement : !BLT +
SEP #$20
LDA.b #$03 : JSL CheckConditionPass : BCC +
JSL ActivateTriforceCutscene
+
.dont_show
.done
SEP #$20
LDA.b FrameCounter : LSR #5 : AND.b #$01 : STA.w SpriteGFXControl, X
RTS
}
@@ -144,19 +142,35 @@ MasterSword_CheckIfPulled:
MasterSword_ConditionalActivateCutscene:
LDA.w SpriteMovement,X : BNE .specialCutscene
PHX
REP #$30
LDA.w SprRedrawFlag, X : BNE .doNormalPed
INC.w SprRedrawFlag, X
LDA.l PedPullGfx : BEQ .doNormalPed
LDX.w ItemStackPtr : STA.l ItemGFXStack,X
LDA.w #$BCE0>>1 : STA.l ItemTargetStack,X
TXA : INC #2 : STA.w ItemStackPtr
.doNormalPed
SEP #$30
PLX
JML Sprite_CheckDamageToPlayerSameLayerLong ; what we wrote over
.specialCutscene
LDA.b #$02 : STA.w ItemReceiptPose ; Link's 2-hands-up pose
STA.b LinkLayer ; draw Link on top
; draw Triforce piece in VRAM
LDA.w SprRedrawFlag, X : BNE .skipTransfer
INC.w SprRedrawFlag, X
PHX
REP #$30
LDX.w #$006A<<1
LDA.l StandingItemGraphicsOffsets,X : LDX.w ItemStackPtr : STA.l ItemGFXStack,X
LDA.l MurahdahlaGfx : BNE .submitRequest
LDX.w #$006A<<1 : LDA.l StandingItemGraphicsOffsets,X
.submitRequest
LDX.w ItemStackPtr : STA.l ItemGFXStack,X
LDA.w #$9CE0>>1 : STA.l ItemTargetStack,X
TXA : INC #2 : STA.w ItemStackPtr
SEP #$30
PLX
.skipTransfer
PLA : PLA : PLA : JML MasterSword_InPedestal_DoCutscene ; do cutscene
MasterSword_ConditionalGrabPose:
@@ -173,10 +187,20 @@ RTL
MasterSword_SpawnPendantProp_ChangePalette:
STA.w SpriteVelocityY,Y : PLX ; what we wrote over
LDA.w SpriteMovement,X : BNE .specialCutscene
LDA.l PedPullGfx : BNE .customPedGfx
LDA.l PedPullGfx+1 : BNE .customPedGfx
BRA .done
.customPedGfx
LDA.l PedPullPalette : ASL : INC : BRA .setPalette
.specialCutscene
LDA.b #$08 : STA.w SpriteOAMProp,Y ; change palette
LDA.b #$02 : STA.w SpriteLayer,Y ; change layer
LDA.l MurahdahlaGfx : BNE .customGfx
LDA.l MurahdahlaGfx+1 : BNE .customGfx
LDA.b #$08 : BRA .setPalette
.customGfx
LDA.l MurahdahlaPalette : ASL
.setPalette
STA.w SpriteOAMProp,Y ; change palette
.done
JML MasterSword_SpawnPendantProp_ChangePalette_return

View File

@@ -23,12 +23,13 @@ boss_move:
+
CMP.b #41 : BNE + ; Is it Skull Woods Boss Room
; TODO: Add moving floor sprite
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
LDA.b #$07 : STA.w $0B00 ;Spawn the moving floor sprite
STZ.w $0B28
INC.w OverlordXLow
LDA.w $0E20 : CMP.b #$92 : BNE ++ ; Is it Helmasuar King?
LDA.b #$07 : STA.w $0B00 ;Spawn the bugged moving floor sprite
STZ.w $0B28
INC.w OverlordXLow
++
BRL .move_to_bottom_right
+
@@ -287,3 +288,16 @@ new_trinexx_code:
RTL
;--------------------------------------------------------------------------------
;================================================================================
; Check if water tile in Swamp boss room, skip interaction
;--------------------------------------------------------------------------------
swamp_boss_tile_interaction:
LDA.l Sprite_ReducedTileInteractionTable, X : BEQ .return
CPX.b #$09 : BNE .return ; return if non-water tile
LDX.b IndoorsFlag : BEQ .return ; return if overworld
LDX.b RoomIndex : CPX.b #$06 : BNE .return ; return if not swamp boss room
LDA.b #$00
.return
RTL
;--------------------------------------------------------------------------------

View File

@@ -14,4 +14,13 @@ incsrc hooks/damage_hooks.asm
incsrc hooks/overworld_sprite_hooks.asm
incsrc hooks/underworld_sprite_hooks.asm
incsrc hooks/underworld_sprite_hooks.asm
org $85B8BA
JSL GeldmanDrawOverride
org $9EAAAC
JSL StalfosKnightDrawOverride
org $9EB209
JSL BlobDrawOverride

View File

@@ -11,14 +11,16 @@ Sprite_ResetAll: ; Bank09.asm(1344)
;================================================================================
; On Room Transition -> Move Sprite depending on the room loaded
;--------------------------------------------------------------------------------
org $828979 ; JSL Dungeon_ResetSprites ; REPLACE THAT (Sprite initialization) original jsl : $09C114
JSL boss_move
org $828C16 ; JSL Dungeon_ResetSprites ; REPLACE THAT (Sprite initialization) original jsl : $09C114
JSL boss_move
org $829338 ; JSL Dungeon_ResetSprites ; REPLACE THAT (Sprite initialization) original jsl : $09C114
JSL boss_move
org $828256 ; JSL Dungeon_ResetSprites ; REPLACE THAT (Sprite initialization) original jsl : $09C114
JSL boss_move
if not(!FEATURE_FIX_BASEROM)
org $828979 ; JSL Dungeon_ResetSprites ; REPLACE THAT (Sprite initialization) original jsl : $09C114
JSL boss_move
org $828C16 ; JSL Dungeon_ResetSprites ; REPLACE THAT (Sprite initialization) original jsl : $09C114
JSL boss_move
org $829338 ; JSL Dungeon_ResetSprites ; REPLACE THAT (Sprite initialization) original jsl : $09C114
JSL boss_move
org $828256 ; JSL Dungeon_ResetSprites ; REPLACE THAT (Sprite initialization) original jsl : $09C114
JSL boss_move
endif
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
@@ -39,3 +41,10 @@ JSL new_kholdstare_code ; Write new gfx in the vram
org $1DAD67 ; sprite_trinexx.asm (62) : LDA.b #$03 : STA $0DC0, X
JSL new_trinexx_code : NOP
;--------------------------------------------------------------------------------
;================================================================================
; Swamp Boss Room Water Fix
;--------------------------------------------------------------------------------
org $06E81A
JSL swamp_boss_tile_interaction
;--------------------------------------------------------------------------------

View File

@@ -2,7 +2,11 @@
; New bush mob randomization
;--------------------------------------------------------------------------------
org $868279
NOP #$0A
BRA +
MaybeSkipTerrainDebris:
JSL MaybeSkipTerrainDebris_long : RTS ; sticking this here, no other free space in bank 06
NOP #3
+
JSL sprite_bush_spawn
NOP ; we keep the branch
;--------------------------------------------------------------------------------

View File

@@ -18,10 +18,3 @@ org $9DD88E
;0EDBB2 0EDBB3
; LDX.b #$01
;}
org $85B8BA ; geldman
JSL Sprite_MaybeForceDrawShadow
org $9EAAAC ; stalfos knight
JSL Sprite_MaybeForceDrawShadow
org $9EB209 ; blob
JSL Sprite_MaybeForceDrawShadow

View File

@@ -61,7 +61,3 @@ LDA.b [Scrap00],Y
org $89C416
LDA.b [Scrap00],Y

View File

@@ -2,8 +2,7 @@ pushpc
org $9EC147
JSL NewKodongoCollision
JMP .continue : NOP #2
.continue
BRA + : NOP #3 : +
org $9EC152
Kodongo_SetDirection:
@@ -12,8 +11,18 @@ pullpc
NewKodongoCollision:
LDA.w SpriteMoveDirection, X : INC A : AND.b #$03 : STA.w SpriteMoveDirection, X
JSL Kodongo_InVanillaRoom : BEQ .continue
;If they collide more than 4 times just set direction
LDA.w SpriteAuxTable, X : INC A : STA.w SpriteAuxTable, X : CMP.b #$04 : BCC .continue
PLA : PLA : PEA.w Kodongo_SetDirection-1
.continue
RTL
RTL
Kodongo_InVanillaRoom:
LDA.b RoomIndex+1 : BNE .return
LDA.b RoomIndex : CMP.b #$19 : BEQ .return
CMP.b #$27 : BEQ .return
CMP.b #$77 : BEQ .return
.return
RTL
nop #10

View File

@@ -52,8 +52,5 @@ incsrc falling_death.asm
incsrc shell_gfx.asm
warnpc $B6FFFF ;if we hit this we need to split stuff by bank
org $8684BD
Sprite_Get16BitCoords_long:
org $9EC6FA ;F46FA
SpritePrep_Eyegore:

View File

@@ -1,11 +1,48 @@
LoadUnderworldSprites:
STA.b Scrap00 ; part one of what we replaced
LDA.w #UWSpritesData>>16 : STA.b Scrap02 ; set the bank to 28 for now
LDA.w $048E
LDA.w #UWSpritesData>>16 ; set the bank to 28 for now
STA.b Scrap02
LDA.w $048E
RTL
GetSpriteSlot16Bit:
LDA.b Scrap03 : AND.w #$00FF
ASL A
TAY
RTL
RTL
GeldmanDrawOverride:
PLA : PLA : PLA ; fix the call stack
LDA.l DRFlags+1 : AND.b #$08 : BEQ .vanilla
LDA.b #$01
STA.w $0DC0,X
JML Sprite_4C_Geldman_do_indeed_draw
.vanilla
JSL Sprite_PrepOAMCoordLong
JML Sprite_4C_Geldman_continue
StalfosKnightDrawOverride:
LDA.l DRFlags+1 : AND.b #$08 : BEQ .vanilla
JSL Sprite_PrepOAMCoordLong
LDA.b #$12
JML Sprite_DrawShadowLong
.vanilla
JSL Sprite_PrepOAMCoordLong
RTL
BlobDrawOverride:
PLA : PLA : PLA ; fix the call stack
LDA.l DRFlags+1 : AND.b #$08 : BEQ .vanilla
LDA.b #$05
STA.w $0DC0,X
JML SpriteDraw_Blob_head_popping_out
.vanilla
JSL Sprite_PrepOAMCoordLong
JML SpriteDraw_Blob_bad_gfx

View File

@@ -25,15 +25,3 @@ NewFireBarDamage:
RTL
.NotSameLayer
RTL
;--------------------------------------------------------------------------------
Sprite_MaybeForceDrawShadow:
JSL Sprite_PrepOAMCoordLong
LDA.l DRFlags+1 : AND.b #$08 : BEQ .return
LDA.b GameMode : CMP.b #$07 : BNE .return
JSL Sprite_DrawShadowLong
; LDA.w SpriteTypeTable,X : CMP.b #$91 : BNE .return ; stalfos knight
; ; move shadow down by 8 pixels
; + LDA.w SpriteOAMProperties,X : AND.b #$1F : ASL #2 : TAY : INY ; get OAM offset
; LDA.b (OAMPtr),Y : CLC : ADC.b #$08 : STA.b (OAMPtr),Y
.return
RTL

View File

@@ -63,8 +63,8 @@ RTS
RTS
;--------------------------------------------------------------------------------
SmithDoorCheck:
LDA.l SmithTravelsFreely : AND.w #$00FF : BEQ .orig
;If SmithTravelsFreely is set Frog/Smith can enter multi-entrance overworld doors
LDA.l FollowerTravelAllowed : AND.w #$00FF : BEQ .orig
;If FollowerTravelAllowed is set Frog/Smith can enter multi-entrance overworld doors
JML Overworld_Entrance_BRANCH_RHO
.orig ; The rest is equivlent to what we overwrote

View File

@@ -61,13 +61,22 @@ OnDungeonExit:
PLP : PLA
RTL
;--------------------------------------------------------------------------------
OnSave:
LDA.b #$70 : PHA : PLB ; thing we wrote over - data bank change
JSL DarkWorldSaveFix
JML MSUResumeReset
;--------------------------------------------------------------------------------
OnQuit:
JSL SQEGFix
JSL MSUResumeReset
LDA.b #$00 : STA.l AltTextFlag ; bandaid patch bug with mirroring away from text
LDA.b #$10 : STA.b MAINDESQ ; thing we wrote over
RTL
;--------------------------------------------------------------------------------
OnDeathNoSave:
JSL MSUResumeReset
LDA.b #$05 : STA.b $10 ; what we wrote over
RTL
;--------------------------------------------------------------------------------
OnUncleItemGet:
PHA
@@ -98,8 +107,8 @@ RTL
;--------------------------------------------------------------------------------
OnAga1Defeated:
STA.l ProgressIndicator ; vanilla game state stuff we overwrote
LDA.l GanonVulnerableMode
CMP.b #$06 : BNE +
; seems light_speed option to auto triforce room is unused for now
BRA +
.light_speed
REP #$20
LDA.w #$0019 : STA.b GameMode
@@ -135,7 +144,7 @@ OnFileCreation:
; Resolve instant post-aga if standard
SEP #$20
LDA.l InitProgressIndicator : BIT #$80 : BEQ +
LDA.l InitProgressIndicator : BIT.b #$80 : BEQ +
LDA.b #$00 : STA.l ProgressIndicatorSRAM ; set post-aga after zelda rescue
LDA.b #$00 : STA.l OverworldEventDataSRAM+$02 ; keep rain state vanilla
+
@@ -208,18 +217,37 @@ OnInitFileSelect:
JSL EnableForceBlank
RTL
;--------------------------------------------------------------------------------
OnGloomDamage:
LDA.b #$01
STA.l UpdateHUDFlag
LDA.l MaximumHealth
SEC : SBC.b #$08
STA.l CurrentHealth
BEQ +
STA.l MaximumHealth
+ RTL
;--------------------------------------------------------------------------------
OnLinkDamaged:
JSL IncrementDamageTakenCounter_Arb
LDA.l ChallengeModes : AND.b #$03 : CMP.b #$02 : BEQ .gloom
JML OHKOTimer
.gloom
STZ.b $00
JML OnGloomDamage
;--------------------------------------------------------------------------------
;OnEnterWater:
; JSL UnequipCapeQuiet ; what we wrote over
;RTL
;--------------------------------------------------------------------------------
OnLinkDamagedFromPit:
LDA.l ChallengeModes : AND.b #$03 : CMP.b #$02 : BEQ .gloom
JSL OHKOTimer
BRA +
.gloom
JSL OnGloomDamage
CLC : ADC.b #$08 : STA.l CurrentHealth
LDA.l AllowAccidentalMajorGlitch
+ LDA.l AllowAccidentalMajorGlitch
BEQ ++
-- LDA.b #$14 : STA.b GameSubMode ; thing we wrote over
@@ -231,7 +259,12 @@ OnLinkDamagedFromPit:
RTL
;--------------------------------------------------------------------------------
OnLinkDamagedFromPitOutdoors:
LDA.l ChallengeModes : AND.b #$03 : CMP.b #$02 : BEQ .gloom
JML OHKOTimer ; make sure this is last
.gloom
JSL OnGloomDamage
CLC : ADC.b #$08
RTL
;--------------------------------------------------------------------------------
OnOWTransition:
JSL FloodGateReset
@@ -244,6 +277,7 @@ OnOWTransition:
RTL
;--------------------------------------------------------------------------------
OnLoadDuckMap:
JSL SelectFirstFluteSpot
LDA.l DuckMapFlag
BNE +
INC : STA.l DuckMapFlag

View File

@@ -248,8 +248,12 @@ DrawPlayerFileShared:
; Flute
LDA.l InventoryTrackingSRAM : AND.w #$0003 : BEQ +
LDA.l $7003C2 : AND.w #$00FF : BNE .pseudo
%fs_drawItem(7,16,FileSelectItems_flute)
BRA ++
.pseudo
%fs_drawItem(7,16,FileSelectItems_flute_green)
BRA ++
+
%fs_drawItemGray(7,16,FileSelectItems_flute)
++
@@ -539,6 +543,8 @@ FileSelectItems:
dw #$0264|!FS_COLOR_BROWN, #$0265|!FS_COLOR_BROWN, #$0274|!FS_COLOR_BROWN, #$0275|!FS_COLOR_BROWN
.flute
dw #$0266|!FS_COLOR_BLUE, #$0267|!FS_COLOR_BLUE, #$0276|!FS_COLOR_BLUE, #$0277|!FS_COLOR_BLUE
.flute_green
dw #$0266|!FS_COLOR_GREEN, #$0267|!FS_COLOR_GREEN, #$0276|!FS_COLOR_GREEN, #$0277|!FS_COLOR_GREEN
.book
dw #$026A|!FS_COLOR_GREEN, #$026B|!FS_COLOR_GREEN, #$027A|!FS_COLOR_GREEN, #$027B|!FS_COLOR_GREEN
.redcane

942
follower.asm Normal file
View File

@@ -0,0 +1,942 @@
pushpc
; follower hooks
org $81EBB6
JSL MaybeSetZeldaCheckpoint
org $899FA1
db $FF, $FF, $FF ; disable timed follower messages
org $89A647
JSL MaybeSkipFollowerTrigger : NOP
org $89F544
JSL MaybeDeleteFollowersOnDeath
org $85EBCF
JSL SpritePrep_ZeldaFollower : NOP #2
org $85EC9E
JSL SpriteDraw_ZeldaMaiden
org $85ECD9
JSL Zelda_WaitingInCell
org $85ED46
JSL Zelda_BecomeFollower : NOP #2
org $9EE902
JSL SpritePrep_OldManFollower : NOP #2 : db $F0 ; BEQ
org $9DFF18
JSL SpriteDraw_OldManFollower
org $9EE9BC
JSL Follower_CheckMessageCollision
org $9EE9CC
JSL OldMan_BecomeFollower : NOP #2
org $86899C
JSL SpritePrep_BlindMaiden : NOP #2
org $8689A7
JSL BlindZeldaDespawnFix : NOP #2
org $9EE8B0
JSL SpriteDraw_ZeldaMaiden
org $9EE8CD
JSL Follower_CheckCollision
org $9EE8D7
JSL BlindMaiden_BecomeFollower : NOP
org $868A7E
JSL SpritePrep_SmithyFrog : BRA + : NOP #8 : +
org $86B2AA
JSL Follower_CheckMessageCollision
org $86B2B4
JSL Frog_BecomeFollower : NOP #2
org $86B341
JSL SpriteDraw_FrogFollower
org $868A53
JSL SpritePrep_PurpleChest : NOP #2
org $9EE0D7
JSL SpriteDraw_PurpleChest
org $9EE0E7
JSL Follower_CheckMessageCollision
org $9EE0ED
JSL PurpleChest_FollowCheck
org $9EE0F7
JSL PurpleChest_BecomeFollower : NOP
org $868A0A
JSL SpritePrep_SuperBomb
org $868A4A
SuperBomb_BecomeFollower_exit:
org $9EE16E
BRA + : NOP #6 : + ; fix bomb shop dialog for dwarfless big bomb
org $9EE1E8
JSL SuperBomb_FollowCheck
org $9EE1F1
JSL SuperBomb_BecomeFollower : NOP #2
org $9EE2C0
JSL SpriteDraw_SuperBomb
org $868D51
JSL SpritePrep_Kiki : NOP #2
org $9EE3E6
JSL Kiki_OfferToFollow
org $9EE495
JSL Kiki_FollowCheck : BRA + : NOP #12 : +
org $9EE4AF
JSL Kiki_BecomeFollower : NOP #2
org $9EE4F7
JSL Kiki_FixTeleportOnExit
org $89A1B2
JSL Kiki_DontScareTheMonke : NOP #3
org $868D63
JSL SpritePrep_Locksmith : NOP #2 : db $90 ; BCC
org $868D7E
db $80 ; BRA
org $86BCD9
JML Locksmith_Chillin_PostMessage
org $86BD09
JSL Locksmith_BecomeFollower : NOP #2
org $86BD7A ; allow follower pickup after purple chest item
LDA.b #$00 : STA.w SpriteActivity, X
JSL Locksmith_RespondToAnswer_PostItem
org $86BDB4
JSL SpriteDraw_LocksmithFollower
pullpc
MaybeSkipFollowerTrigger:
LDA.b GameMode : AND.w #$00FF : CMP.w #$0010 : BNE .normal
.no_trigger
INC : RTL
.normal
LDA.w $02F2 : AND.b Scrap06 ; what we wrote over
RTL
MaybeDeleteFollowersOnDeath:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
; s+q = favor keeping current follower
; death = favor replacing with unfulfilled starting followers
; during escape = always favor keeping zelda
LDA.b GameMode : CMP.b #$17 : BEQ .keep
LDA.w DungeonID : NOP #2 : BPL .keep
LDA.l InitFollowerIndicator : BEQ .keep
JSL DetermineFollowerSpawn_check_resolved : BCS .keep
LDA.l ProgressIndicator : CMP.b #$02 : BCS .delete
LDA.l FollowerIndicator : CMP.b #$01 : BEQ .keep
.delete
PLA : PLA : PEA.w $89F558-1
RTL
.keep
PLA : PLA : PEA.w $89F55E-1
RTL
.vanilla
LDA.l FollowerIndicator ; what we wrote over
RTL
StartingFollower:
LDA.l InitFollowerIndicator : BEQ .return
PHA
REP #$20
; possible spawn points
LDA.b RoomIndex : CMP.w #$0104 : BEQ + ; links house
CMP.w #$0012 : BEQ + ; sanc
CMP.w #$00E4 : BEQ + ; old man
CMP.w #$0112 : BEQ + ; dark sanc
CMP.w #$011C : BEQ + ; bomb shop
SEP #$20 : PLA : RTL
+
SEP #$20
LDA.l FollowerIndicator : BEQ +
LDA.l FollowerDropped : CMP.b #$80 : PLA : BCC .return : PHA
+ LDA.l ProgressIndicator : CMP.b #$02 : PLA : BCC .escape_check
PHA
JSL DetermineFollowerSpawn_check_resolved
PLA
BCC .issue_follower
BRA .return
.escape_check
CMP.b #$01 : BNE .return
PHA : LDA.l ProgressFlags : AND.b #$04 : CMP.b #$04 : PLA : BCS .return
.issue_follower
STA.l FollowerIndicator
LDA.b #$00 : STA.l FollowerDropped
.return
RTL
MaybeSetZeldaCheckpoint:
AND.w #$7FFF : TAX ; what we wrote over
SEP #$20
LDA.l ProgressFlags : AND.b #$04 : BNE .return ; zelda rescued
LDA.l StartingEntrance : CMP.b #$02 : BEQ .return ; cell checkpoint set
CMP.b #$04 : BEQ .return ; throne room checkpoint set
LDA.l FollowerIndicator : CMP.b #$01 : BNE .return ; zelda following
LDA.b RoomIndex : CMP.b #$80 : BNE + ;zelda cell
LDA.l Follower_Zelda : CMP.b #$01 : BNE .return
BRA .set_checkpoint
+ CMP.b #$45 : BNE .return ; maiden cell
CPX.w #$0964 : BNE .return ; top big lock
LDA.l Follower_Maiden : CMP.b #$01 : BNE .return
.set_checkpoint
LDA.b #$02 : STA.l StartingEntrance
PHX
SEP #$10
JSL SaveDeathCount
JSL Dungeon_SaveRoomQuadrantData
REP #$10
PLX
.return
REP #$30
RTL
FollowerGfxRedraw:
PHP : SEP #$30
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .return
PHY
LDY.b #$0F
.next
LDA.w SpriteAITable,Y : BEQ ++
LDA.w SpriteTypeTable,Y : CMP.b #$76 : BEQ + ; zelda
CMP.b #$AD : BEQ + ; old man
CMP.b #$B7 : BEQ + ; maiden
CMP.b #$1A : BEQ + ; frog
CMP.b #$39 : BEQ + ; locksmith
CMP.b #$B6 : BEQ + ; kiki
CMP.b #$B4 : BEQ + ; purple chest
CMP.b #$B5 : BNE ++ ; big bomb
LDA.w SpriteJumpIndex,Y : CMP.b #$02 : BEQ +
BRA ++
+ LDA.b #$01 : STA.w SprRedrawFlag,Y
++ DEY : BPL .next
PLY
.return
PLP
RTL
; A = 2 byte VRAM position in OAM2 for head/body
; Scrap06/07/08 = address to OAM group
; Returns with carry flag set if draw occurred
TransferAndDrawFollowerGfx:
PHA
LDA.w SpriteTimerE, X : AND.w #$0008 : BNE .skip_draw ; skip drawing every other frame
LDA.b 1,S
JSR TransferFollowerSpriteGfx ; returns with SEP #$20
LDA.w SpriteTypeTable, X : CMP.b #$39 : BNE +
; locksmith location flicker if quest completed but purple chest remains
LDA.w SpriteAux, X : BNE .continue
JSL DetermineFollowerSpawn : BCS .flicker
+ BRA .continue
.flicker
LDA.w SpriteTimerE, X : NOP #2 : BNE .continue
LDA.b #$0C : STA.w SpriteTimerE, X
.continue
PLA : XBA : PLA : XBA
JSL SpriteDraw_Follower
SEC
RTL
.skip_draw
PLA
SEP #$20
CLC
RTL
; A = 2 byte VRAM position in OAM2 for head/body
TransferFollowerSpriteGfx_skip_transfer:
PLA : PLA
RTS
TransferFollowerSpriteGfx:
PHA : SEP #$20
LDA.w SprRedrawFlag, X : BEQ .skip_transfer
.redraw
STZ.w SprRedrawFlag, X
JSL DetermineFollower
CMP.b #$01 : BNE +
PLA : XBA : LDA.b #$83 ; zelda body
JSR QueueFollowerSpriteGfx
PLA : XBA : LDA.b #$82 ; zelda head
JMP QueueFollowerSpriteGfx
+ CMP.b #$04 : BNE +
PLA : XBA : LDA.b #$84 ; old man body
JSR QueueFollowerSpriteGfx
PLA : XBA : LDA.b #$85 ; old man head
JMP QueueFollowerSpriteGfx
+ CMP.b #$06 : BNE +
PLA : XBA : LDA.b #$81 ; maiden body
JSR QueueFollowerSpriteGfx
PLA : XBA : LDA.b #$80 ; maiden head
JMP QueueFollowerSpriteGfx
+ CMP.b #$07 : BNE +
PLA : XBA : PLA : LDA.b #$11 ; frog
JMP QueueFollowerSpriteGfx
+ CMP.b #$08 : BNE +
PLA : XBA : PLA : LDA.b #$16 ; smith
JMP QueueFollowerSpriteGfx
+ CMP.b #$09 : BNE +
PLA : XBA : LDA.b #$87 ; locksmith body
JSR QueueFollowerSpriteGfx
PLA : XBA : LDA.b #$86 ; locksmith head
JMP QueueFollowerSpriteGfx
+ CMP.b #$0A : BNE +
PLA : XBA : LDA.b #$13 ; kiki body
JSR QueueFollowerSpriteGfx
PLA : XBA : LDA.b #$12 ; kiki head
JMP QueueFollowerSpriteGfx
+ CMP.b #$0C : BNE +
PLA : XBA : PLA : LDA.b #$14 ; purple chest
JMP QueueFollowerSpriteGfx
+ PLA : XBA : PLA : LDA.b #$15 ; super bomb
JMP QueueFollowerSpriteGfx
; A = 2 bytes, dest/src
QueueFollowerSpriteGfx:
PHX : REP #$20
PHA
AND.w #$00FF : CMP.w #$00FF : BEQ +
ASL #6 : EOR.w #$8000 : BRA .write_src
+ LDA.w #$0020 ; blank tile
.write_src
LDX.w ItemStackPtr : STA.l ItemGFXStack,X
PLA : XBA
AND.w #$00FF : ASL #4 : EOR.w #$5000
STA.l ItemTargetStack,X
TXA : INC #2 : STA.w ItemStackPtr
SEP #$20 : PLX
RTS
; A = 2 byte VRAM position in OAM2 for head/body
; Scrap06/07/08 = address to OAM group
; Scrap09/0A = address to palette data
SpriteDraw_Follower:
PHB : LDY.b #$7E : PHY : PLB
REP #$20
PHA
LDY.b #$0E
- LDA.b [Scrap06], Y : STA.w SpriteDynamicOAM, Y
DEY #2 : BPL -
LDA.b Scrap09 : STA.b Scrap06
PLA
SEP #$20
STA.w SpriteDynamicOAM+$0C : XBA : STA.w SpriteDynamicOAM+$04
JSL DetermineFollower : PHA
PHX
TAX : DEX
LDA.b Scrap06 : ORA.b Scrap07 : BEQ +
TXY
LDA.b [Scrap06], Y
BRA .set_palette
+
LDA.l .palette_data, X
.set_palette
STA.w SpriteDynamicOAM+$05 : STA.w SpriteDynamicOAM+$0D
PLX
REP #$20
LDA.w #$0002 : STA.b Scrap06
LDA.w #SpriteDynamicOAM : STA.b Scrap08
SEP #$20
PLA : CMP.b #$07 : BCC + : CMP.b #$09 : BEQ + : CMP.b #$0A : BEQ +
; only draw body
PHA
LDA.b #$01 : STA.b Scrap06
LDA.b #SpriteDynamicOAM+8 : STA.b Scrap08
PLA
+
; follower specific adjustments
CMP.b #$04 : BNE +
LDA.w SpriteDynamicOAM+$0A : SEC : SBC.b #8 : STA.w SpriteDynamicOAM+$02 ; old man coords
+
CMP.b #$0A : BNE +
LDA.w SpriteDynamicOAM+$0A : SEC : SBC.b #6 : STA.w SpriteDynamicOAM+$02 ; kiki coords
LDA.w SpriteTypeTable, X : CMP.b #$1A : BEQ ++ : CMP.b #$B4 : BCS ++ : BRA .draw
++ LDA.w SpriteDynamicOAM+$05 : ORA.b #$40
STA.w SpriteDynamicOAM+$05 : STA.w SpriteDynamicOAM+$0D ; kiki horiz flip
+
.draw
JSL Sprite_DrawMultiple_player_deferred
PLB
RTL
.palette_data
; 01 04 06 07 08 09 0A 0C 0D
db $00, $00, $00, $00, $00, $06, $00, $00, $06, $00, $00, $00, $00
DetermineFollower:
LDA.w SpriteAux, X : BEQ .skip_stored : RTL ; stored follower
.skip_stored
+ LDA.w $0E20,X : CMP.b #$1A : BNE +
LDA.l Follower_Frog : BRA .finalize
+ CMP.b #$39 : BNE +
LDA.l Follower_Locksmith : BRA .finalize
+ CMP.b #$AD : BNE +
LDA.l Follower_OldMan : BRA .finalize
+ CMP.b #$B6 : BNE +
LDA.l Follower_Kiki : BRA .finalize
+ CMP.b #$B7 : BNE +
LDA.l Follower_Maiden : BRA .finalize
+ CMP.b #$76 : BNE +
LDA.l Follower_Zelda : BRA .finalize
+ CMP.b #$B4 : BNE +
LDA.l Follower_PurpleChest : BRA .finalize
+ LDA.l Follower_SuperBomb
.finalize
PHA
CMP.b #$07 : BNE +
LDA.l CurrentWorld : BNE +
PLA : LDA.b #$08 : RTL
+
PLA
RTL
SetAndLoadFollower:
LDA.l FollowerIndicator
.skip_current
PHA
LDA.b #$00 : STA.l FollowerDropped
JSL DetermineFollower : STA.l FollowerIndicator
CMP.b #$01 : BNE +
JSL DetermineFollower_skip_stored : CMP.b #$01 : BNE +
LDA.b #$02 : STA.l StartingEntrance
JSL SaveDeathCount
PHX
JSL Dungeon_SaveRoomQuadrantData
PLX
+ CMP.b #$09 : BNE +
LDA.b #$40 : STA.w $02CD : STZ.w $02CE ; locksmith timed message
+
PHX
JSL Tagalong_LoadGfx
PLX
PLA : BNE +
JSL Follower_Initialize
JML Sprite_BecomeFollower
+
RTL
StoreAndLoadFollower:
LDA.l FollowerDropped : BNE .no_storage
LDA.l FollowerIndicator : BEQ .no_storage
PHA
JSL SetAndLoadFollower_skip_current
PLA : STA.w SpriteAux, X
LDA.b #$13 : JSL Sound_SetSfx3PanLong
LDA.b #$01 : STA.w SprRedrawFlag, X
STZ.w SpriteActivity, X
LDA.b #$90 : STA.w SpriteTimerE, X
SEC : RTL
.no_storage
JSL SetAndLoadFollower_skip_current
CLC : RTL
; return SEC if destination resolved
DetermineFollowerSpawn_locksmith_check:
; locksmith location needs to spawn if purple chest reward not acquired
LDA.l FollowerIndicator : CMP.b #$0C : BEQ .always_spawn
JSL DetermineFollower_skip_stored : CMP.l FollowerIndicator : BEQ .matched_following
LDA.l NpcFlagsVanilla : AND.b #$10 : BEQ .always_spawn
BRA DetermineFollowerSpawn
.always_spawn
CLC : RTL
.matched_following
SEC : RTL
DetermineFollowerSpawn_include_stored:
JSL DetermineFollower
BRA DetermineFollowerSpawn_byof
DetermineFollowerSpawn:
JSL DetermineFollower_skip_stored
.byof
CMP.l FollowerIndicator : BEQ .matched_following
.skip_match_check
PHA
; despawn if pre-requisite not met
LDA.w SpriteTypeTable, X : CMP.b #$B4 : BNE +
LDA.l NpcFlagsVanilla : AND.b #$20 : EOR.b #$20 : CMP.b #$20
BRA .prereq_check
+ CMP.b #$B5 : BNE +
LDA.l CrystalsField : AND.b #$05 : CMP.b #$05
LDA.b #$FF : ADC.b #$00 : ROR ; flip carry flag
.prereq_check
PLA : BCC .check_resolved
RTL
+
PLA
.check_resolved
CMP.b #$01 : BNE +
LDA.l ProgressFlags : AND.b #$04 : CMP.b #$04 : RTL
+ CMP.b #$04 : BNE +
JML ItemCheck_OldMan
+ CMP.b #$06 : BNE +
LDA.l RoomDataWRAM[$AC].high : AND.b #$08 : CMP.b #$08 : BCS ++
LDA.l EnemizerFlags_close_blind_door : CMP.b #$01
++
RTL
+ CMP.b #$09 : BCS + ; if frog or smith
LDA.l NpcFlagsVanilla : AND.b #$20 : CMP.b #$20 : RTL
+ CMP.b #$0A : BNE +
LDA.l OverworldEventDataWRAM+$5E : AND.b #$20 : CMP.b #$20 : RTL
+ CMP.b #$0C : BNE +
LDA.l NpcFlagsVanilla : AND.b #$10 : CMP.b #$10 : RTL
+
.always_spawn
CLC : RTL ; big bomb and locksmith have no completion condition in code
.matched_following
SEC : RTL
Follower_CheckMessageCollision:
PHA
LDA.w SpriteTimerE, X : BNE .skip_collision_check
PLA
JML Sprite_ShowMessageFromPlayerContact ; what we wrote over
.skip_collision_check
PLA
CLC : RTL
Follower_CheckTileCollision:
LDA.w SpriteTimerE, X : BNE .skip_collision_check
JML Sprite_CheckTileCollisionLong ; what we wrote over
.skip_collision_check
RTL
Follower_CheckCollision:
LDA.w SpriteTimerE, X : BNE .skip_collision_check
JML Sprite_CheckDamageToPlayerSameLayerLong ; what we wrote over
.skip_collision_check
CLC : RTL
SpritePrep_ZeldaFollower:
LDA.b RoomIndex : CMP.b #$12 : BEQ .no_follower_shuffle_sanc
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .no_follower_shuffle
JSL DetermineFollowerSpawn : BCC + : RTL : +
LDA.b #$01 : STA.w SprRedrawFlag, X
PLA : PLA : PEA.w $EC4B-1 ; return to spawn
RTL
.no_follower_shuffle
LDA.l FollowerIndicator : CMP.b #$01
RTL
.no_follower_shuffle_sanc
LDA.l FollowerIndicator : CMP.b #$02
RTL
Zelda_WaitingInCell:
JSL Follower_CheckCollision ; what we wrote over, kinda
BCC .return
PHP
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE +
INC.w SpriteActivity, X
PLP
PLA : PLA : PEA.w $ECF9-1 : RTL ; skip sprite movement
+
PLP
.return
RTL
Zelda_BecomeFollower:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
PLA : PLA
JSL StoreAndLoadFollower : BCC +
PEA.w $ED68-1 : RTL ; jump to avoid sprite despawn
+
PEA.w $ED60-1 ; jump to despawn
RTL
.vanilla
LDA.b #$02 : STA.l StartingEntrance ; what we wrote over
RTL
SpritePrep_BlindMaiden:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
JSL DetermineFollowerSpawn : BCC +
LDA.b #$01 : RTL
+
LDA.b #$01 : STA.w SprRedrawFlag, X
INC.w SpriteAncillaInteract, X
STZ.w FollowerNoDraw
PLA : PLA : PEA.w $89C8-1 ; return to spawn
RTL
.vanilla
LDA.l RoomDataWRAM[$AC].high : AND.b #$08 ; what we wrote over
RTL
; Prevent followers from causing blind/maiden to despawn:
; Door rando: let zelda despawn the maiden.
BlindZeldaDespawnFix:
LDA.l FollowerIndicator ; what we wrote over
CMP.b #06 : BEQ +
LDA.w SpritePosYLow,X : BEQ +
LDA.b #$00 : RTL ; don't despawn follower if maiden isn't "present"
+
LDA.b #$01 : RTL
SpriteDraw_ZeldaMaiden:
LDA.b RoomIndex : CMP.b #$12 : BEQ .vanilla
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
LDA.b #.oam_group>>16 : STA.b Scrap08
LDA.w SpriteTypeTable, X : CMP.b #$76 : BNE +
REP #$20
LDA.w #.oam_group : STA.b Scrap06
LDA.w #0000 : STA.b Scrap09
LDA.l Follower_Zelda_vram
BRA .transfer
+
REP #$20
LDA.w #.oam_group : STA.b Scrap06
LDA.w #.palette_data_maiden : STA.b Scrap09
LDA.l Follower_Maiden_vram
.transfer
JML TransferAndDrawFollowerGfx
.skip_draw
RTL
.vanilla:
JML SpriteDraw_Maiden
.oam_group:
dw 1, -7 : db $20, $00, $00, $02
dw 1, 3 : db $22, $00, $00, $02
.palette_data_maiden
; 01 04 06 07 08 09 0A 0C 0D
db $02, $00, $00, $02, $00, $04, $02, $02, $04, $02, $00, $02, $02
BlindMaiden_BecomeFollower:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
PLA : PLA
JSL StoreAndLoadFollower : BCS .return
STZ.w SpriteAITable, X
.return
PEA.w $E8EA-1 ; jump ahead on return
RTL
.vanilla
STZ.w SpriteAITable, X : LDA.b #$06 ; what we wrote over
RTL
SpritePrep_OldManFollower:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .no_follower_shuffle
PLA : PLA
JSL DetermineFollowerSpawn : BCC +
PEA.w $E928-1 ; return to despawn
RTL
+
LDA.b #$01 : STA.w SprRedrawFlag, X
PEA.w $E927-1 ; return to spawn
RTL
.no_follower_shuffle
LDA.l FollowerIndicator : CMP.b #$04
RTL
SpriteDraw_OldManFollower:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
LDA.w SpriteJumpIndex, X : CMP.b #$01 : BEQ .vanilla
LDA.b #.oam_group>>16 : STA.b Scrap08
REP #$20
LDA.w #.oam_group : STA.b Scrap06
LDA.w #0000 : STA.b Scrap09
PLA : PEA.w $FF45-1 ; skip vanilla draw
LDA.l Follower_OldMan_vram
JML TransferAndDrawFollowerGfx
.vanilla
LDA.b #$02 : STA.b Scrap06 ; what we wrote over
RTL
.oam_group
dw 0, 0 : db $AC, $00, $00, $02
dw 0, 8 : db $AE, $00, $00, $02
OldMan_BecomeFollower:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BCC .set_follower_and_despawn
PLA : PLA
JSL StoreAndLoadFollower : BCC +
PEA.w $E9DF-1 : RTL ; jump to avoid sprite despawn
+
PEA.w $E9DC-1 ; jump to despawn
RTL
.set_follower_and_despawn
JSL SetAndLoadFollower
PLA : PLA : PEA.w $E9D6-1
SpritePrep_SmithyFrog:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .no_follower_shuffle
JSL DetermineFollowerSpawn : BCC +
LDA.b #$01 ; return to despawn
RTL
+
LDA.b #$01 : STA.w SprRedrawFlag, X
DEC ; return to spawn
RTL
.no_follower_shuffle
LDA.l FollowerIndicator : BNE + ; what we wrote over
LDA.l NpcFlagsVanilla : AND.b #$20 ; what we wrote over
+ RTL
SpriteDraw_FrogFollower:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
LDA.b #.oam_group>>16 : STA.b Scrap08
REP #$20
LDA.w #.oam_group : STA.b Scrap06
LDA.w #0000 : STA.b Scrap09
PLA : PEA.w $DCD6-1
LDA.l Follower_Frog_vram
JML TransferAndDrawFollowerGfx
.vanilla
LDA.b #$01 : STA.b Scrap06 ; what we wrote over
RTL
.oam_group:
dw 1, -8 : db $FF, $00, $00, $02
dw 1, 0 : db $C8, $00, $00, $02
Frog_BecomeFollower:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BCC .set_follower_and_despawn
PLA : PLA
JSL StoreAndLoadFollower : BCC +
PEA.w $B2C7-1 : RTL ; jump to avoid sprite despawn
+
PEA.w $B2C4-1 ; jump to despawn
RTL
.set_follower_and_despawn
JSL SetAndLoadFollower
PLA : PLA : PEA.w $B2C4-1 ; jump to despawn
RTL
SpritePrep_PurpleChest:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
JSL DetermineFollowerSpawn : BCC +
LDA.b #$00 ; return to despawn
RTL
+
PLA : PLA : PEA.w $8A69-1 ; return to spawn
LDA.b #$01 : STA.w SprRedrawFlag, X
RTL
.vanilla
LDA.l FollowerIndicator : CMP.b #$0C
RTL
SpriteDraw_PurpleChest:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
LDA.b #.oam_group>>16 : STA.b Scrap08
REP #$20
LDA.w #.oam_group : STA.b Scrap06
LDA.w #0000 : STA.b Scrap09
LDA.l Follower_PurpleChest_vram
JML TransferAndDrawFollowerGfx
.vanilla
JML Sprite_PrepAndDrawSingleLargeLong ; what we wrote over
.oam_group:
dw 0, -8 : db $C8, $00, $00, $02
dw 0, 0 : db $EE, $00, $00, $02
PurpleChest_FollowCheck:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
LDA.b #$00
RTL
.vanilla
LDA.l FollowerIndicator ; what we wrote over
RTL
PurpleChest_BecomeFollower:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
PLA : PLA
JSL StoreAndLoadFollower : BCS .return
STZ.w SpriteAITable, X
.return
PEA.w $E10A-1 ; jump ahead on return
RTL
.vanilla
STZ.w SpriteAITable, X : LDA.b #$0C ; what we wrote over
RTL
SpritePrep_SuperBomb:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
JSL DetermineFollowerSpawn : BCC +
LDA.b #$00 ; despawn on exit
RTL
+
LDA.b #$05
RTL
.vanilla
LDA.l CrystalsField ; what we wrote over
RTL
SpriteDraw_SuperBomb:
LDA.w SpriteJumpIndex, X : CMP.b #$02 : BNE .vanilla
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
LDA.b #.oam_group>>16 : STA.b Scrap08
REP #$20
LDA.w #.oam_group : STA.b Scrap06
LDA.w #.palette_data : STA.b Scrap09
PLA : PEA.w $E2E2-1 ; skip vanilla draw
LDA.l Follower_SuperBomb_vram
JML TransferAndDrawFollowerGfx
.vanilla
LDA.b #$01 : STA.b Scrap06 ; what we wrote over
RTL
.oam_group:
dw 0, -8 : db $AE, $08, $00, $02
dw 0, 0 : db $4E, $08, $00, $02
.palette_data
; 01 04 06 07 08 09 0A 0C 0D
db $08, $00, $00, $08, $00, $06, $08, $08, $06, $08, $00, $08, $08
SuperBomb_FollowCheck:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
LDA.w SpriteTimerE, X : BNE .skip_follow
LDA.w SpriteAux, X : BEQ .vanilla
PLA : PLA : PEA.w $E1F1-1 ; jump to skip cost, no double charge
RTL
.skip_follow
PLA : PLA : PEA.w $E20C-1 ; jump to exit
RTL
.vanilla
LDA.b #$64 : LDY.b #$00 ; what we wrote over
RTL
SuperBomb_BecomeFollower:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
PLA : PLA
JSL StoreAndLoadFollower : BCC +
PEA.w $E20C-1 : RTL ; jump to exit
+
PEA.w $E201-1 ; jump to despawn
RTL
.vanilla
LDA.b #$0D : STA.l FollowerIndicator ; what we wrote over
RTL
pushpc
org $868A14
NOP #3 ; fix bomb shop spawn for dwarfless big bomb
LDA.b #$B5 : JSL Sprite_SpawnDynamically
BMI SuperBomb_BecomeFollower_exit
LDA.b #$01 : STA.w SprRedrawFlag, Y ; force redraw for super bomb gfx
pullpc
SpritePrep_Kiki:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
JSL DetermineFollowerSpawn : BCC +
LDA.b #$20 : RTL ; despawn on exit
+
LDA.b #$00
RTL
.vanilla
LDX.b OverworldIndex : LDA.l OverworldEventDataWRAM,X ; what we wrote over
RTL
Kiki_OfferToFollow:
PHA
LDA.w SpriteTimerE, X : BNE .skip_collision_check
PLA
JML Sprite_ShowMessageUnconditional ; what we wrote over
.skip_collision_check
PLA
CLC : RTL
Kiki_FollowCheck:
JSL DetermineFollowerSpawn_include_stored : BCS .skip_follow
LDA.w SpriteTimerE, X
RTL
.skip_follow
LDA.b #$20
RTL
Kiki_BecomeFollower:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .no_follower_shuffle
PLA : PLA : PEA.w $E4C2-1 ; jump to exit
STZ.w FollowerNoDraw
JML StoreAndLoadFollower
.no_follower_shuffle
LDA.b #$00 : STA.l FollowerDropped ; defuse bomb
LDA.b #$0A : STA.l FollowerIndicator
RTL
Kiki_FixTeleportOnExit:
REP #$30
LDA.b LinkPosX : STA.w LinkPosXCache
LDA.b LinkPosY : STA.w LinkPosYCache
SEP #$30
LDA.b #$19 : LDY.b #$01 ; what we wrote over
RTL
; on return it checks BEQ and if non-zero, kiki get spook
Kiki_DontScareTheMonke:
LDA.b LinkJumping : BEQ .return
CMP.b #$02 : BEQ .no_spook ; needed for quake usage
LDA.w NoDamage : BNE .no_spook
LDA.w LinkThud : BNE .no_spook
.spook
LDA.b #$01 : RTL
.no_spook
LDA.b #$00
.return
RTL
SpritePrep_Locksmith:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
JSL DetermineFollowerSpawn_locksmith_check : BCS +
LDA.b #$01 : STA.w SprRedrawFlag, X
+
LDA.l FollowerIndicator
RTL
.vanilla
LDA.l FollowerIndicator : CMP.b #$09 ; what we wrote over
BEQ +
CLC : RTL
+
SEC : RTL
SpriteDraw_LocksmithFollower:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
LDA.b #.oam_group>>16 : STA.b Scrap08
REP #$20
LDA.w #.oam_group : STA.b Scrap06
LDA.w #.palette_data : STA.b Scrap09
PLA : PEA.w $DCD6-1 ; skip draw on exit
LDA.l Follower_Locksmith_vram
JML TransferAndDrawFollowerGfx
.vanilla
LDA.b #$02 : STA.b Scrap06 ; what we wrote over
RTL
.oam_group:
dw 0, -8 : db $EA, $00, $00, $02
dw 0, 0 : db $EC, $00, $00, $02
.palette_data
; 01 04 06 07 08 09 0A 0C 0D
db $00, $00, $00, $0E, $00, $00, $0E, $0E, $00, $0E, $00, $0E, $0E
Locksmith_Chillin_PostMessage:
LDA.w SpriteAux, X : BEQ +
; when a follower is stored, merely walk near them
LDA.w SpritePosXLow, X : PHA
JSL Follower_CheckCollision : BCC .return
BRA .continue
+
LDA.w SpritePosXLow, X : PHA
SEC : SBC.b #$10 : STA.w SpritePosXLow, X
LDA.b #$01 : STA.w SpriteVelocityX, X
JSL Sprite_Get16BitCoords_long
JSL Follower_CheckTileCollision : BNE .return
.continue
INC.w SpriteActivity, X ; award follower
LDA.l FollowerIndicator : CMP.b #$0C : BEQ .purple_chest_prize
LDA.l FollowerTravelAllowed : CMP.b #$02 : BEQ .return
LDA.l FollowerIndicator : CMP.b #$00 : BEQ .return
LDA.b #$05 : STA.w SpriteActivity, X ; forever do nothing
BRA .return
.purple_chest_prize
INC.w SpriteActivity, X ; prep for purple chest prize
.return
PLA : STA.w SpritePosXLow, X
JML $86BD08 ; jump back to immediately RTS
Locksmith_BecomeFollower:
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .vanilla
STZ.w FollowerNoDraw
PLA : PLA
JSL StoreAndLoadFollower : BCS +
LDA.l FollowerIndicator : CMP.b #$0C : BEQ +
PEA.w $BD24-1 : RTL ; jump to despawn
+
PEA.w $BD27-1 ; jump to exit
RTL
.vanilla
LDA.b #$09 : STA.l FollowerIndicator
RTL
Locksmith_RespondToAnswer_PostItem:
STA.l FollowerIndicator ; what we wrote over
LDA.l FollowerTravelAllowed : CMP.b #$02 : BNE .no_despawn
LDA.w SpriteAux, X : CMP.b #$0C : BEQ .despawn
CMP.b #$00 : BNE .no_despawn
LDA.l Follower_Locksmith : CMP.b #$0C : BEQ .despawn
JSL DetermineFollowerSpawn_include_stored : BCC .no_despawn
.despawn
STZ.w SpriteAITable, X
.no_despawn
RTL

View File

@@ -48,7 +48,7 @@ JML NMIHookReturn
;--------------------------------------------------------------------------------
PostNMIHookAction:
LDA.w NMIAux : BEQ +
PHK : PEA .return-1 ; push stack for RTL return
PHK : PEA.w .return-1 ; push stack for RTL return
JMP.w [NMIAux]
.return
STZ.w NMIAux ; zero bank byte of NMI hook pointer

108
gk/blink_loot.asm Normal file
View File

@@ -0,0 +1,108 @@
; we want the icons indicating what is left in a room to blink
; but we don't want to redraw to BG1 every few frames
; so we duplicate the left side of BG1 to a lower portion and just toggle vertical scroll
BlinkLoot:
; do not show icons if we're scrolling
LDA.w $0210
BNE .hide
LDA.b FrameCounter
AND.b #$20
BEQ .show
.hide
LDA.b #$01
.show
STZ.b $E6
STA.w $E7
JSL $8AE96B
RTL
StartDoubleWrite:
; what we wrote over
LDA.l DRMode
BEQ .draw
INC.w $020D ; next subsubmode
PLA : PLA : PLA ; pull our jump to here off the stack
PLB
RTL
.draw
REP #$30
STZ.w GFXStripes
STZ.w $021B
RTL
CheckDoubleWrite:
LDA.w $021C
BNE .done
LDA.b #$08
STA.w $021C
REP #$30
JML $8AE20B
.done
; what we wrote over
REP #$10
LDY.w GFXStripes
LDA.b #$FF
JML $8AE2E7
DrawMountain:
LDX.w GFXStripes
PHX
LDY.w #$0000
.next_word
LDA.w $8AEFEF, Y
STA.w GFXStripes+2, X
INX : INX
INY : INY
CPY.w #$002A
BCC .next_word
PLY
LDA.w $021B
BEQ .done
; if second copy of mountain, adjust VRAM addresses
SEP #$20
LDA.w GFXStripes+$02, Y
ORA.w $021C
STA.w GFXStripes+$02, Y
LDA.w GFXStripes+$08, Y
ORA.w $021C
STA.w GFXStripes+$08, Y
LDA.w GFXStripes+$10, Y
ORA.w $021C
STA.w GFXStripes+$10, Y
LDA.w GFXStripes+$20, Y
ORA.w $021C
STA.w GFXStripes+$20, Y
LDA.w GFXStripes+$26, Y
ORA.w $021C
STA.w GFXStripes+$26, Y
REP #$20
.done
RTL
WriteBigEndianAddressX:
ORA.w $021B
XBA
STA.w GFXStripes+2, X
AND.w #$FFF7
RTL
WriteBigEndianAddressY:
ORA.w $021B
XBA
STA.w GFXStripes+2, Y
AND.w #$FFF7
RTL

645
gk/check_loot.asm Normal file
View File

@@ -0,0 +1,645 @@
; A = room_id
; out A = level of loot
CheckLoot:
PHP
REP #$30
PHB : PHX : PHY
STA.b $CA
LDA.b $06 : PHA
LDA.b $0E : PHA
STZ.b $02 ; best item class found
LDA.l ShowItems_default
AND.w #$00FF
STA.b $0E
LDA.b $CA
AND.w #$00FF
ASL A
TAX
LDA.l SaveDataWRAM, X
AND.w #$000F
BEQ +
LDA.l ShowItems_visited_tile
AND.w #$00FF
CMP.b $0E
BCC +
STA.b $0E
+ LDA.w DungeonID
TAX
LDA.l MapField
AND.l DungeonMask, X
BEQ +
LDA.l ShowItems_have_map
AND.w #$00FF
CMP.b $0E
BCC +
STA.b $0E
+ LDA.l CompassField
AND.l DungeonMask, X
BEQ +
LDA.l ShowItems_have_compass
AND.w #$00FF
CMP.b $0E
BCC +
STA.b $0E
+
LDA.l ItemSources : BIT.w #$0001 : BEQ +
JSR CheckChests
+
LDA.l ItemSources : BIT.w #$0002 : BEQ +
JSR CheckPots
+
LDA.l ItemSources : BIT.w #$0004 : BEQ +
JSR CheckEnemies
+
LDA.l ItemSources : BIT.w #$0008 : BEQ +
JSR CheckBoss
+
LDA.l ItemSources : BIT.w #$0010 : BEQ +
JSR CheckPrize
+
.done
PLA : STA.b $0E
PLA : STA.b $06
PLY : PLX : PLB
PLP
LDA.b $02
RTL
CheckChests:
LDA.b $CA
AND.w #$00FF
STA.b $00
ASL A
TAX
LDA.w #($81<<8)
PHA
PLB : PLB
LDA.w #$0008
STA.b $04
STZ.b $06
LDY.w #$FFFD
.increment_mask
LDA.b $04
ASL A
STA.b $04
.next_chest
INY #3
CPY.w #$01F8
BCS .done
LDA.w RoomData_ChestItems, Y
AND.w #$7FFF
CMP.b $00
BNE .next_chest
LDA.b $06
JSR CheckChestSection
INC.b $06
BCC .increment_mask
LDA.l SaveDataWRAM, X
AND.b $04
BNE .increment_mask ; already got item
LDA.w RoomData_ChestItems+2, Y
AND.w #$00FF
JSR GetLootClass
BRA .increment_mask
.done
RTS
CheckBoss:
; we assume all bosses are in section 1 of split sections
; mainly to simplify hera cage key and GT torch
; which use the same flow
; and bosses are always in their own section anyway
LDA.b $CA
AND.w #$F000
XBA
CMP.w #$0020
BCC +
RTS
+
LDA.b $CA
AND.w #$00FF
STA.b $04
LDX.w #$FFFA
.next_boss
INX #6
LDA.l MiscLocations, X
BPL .check
RTS
.check
CMP.b $04
BNE .next_boss
TXY
CMP.b RoomIndex
BEQ .current_room
ASL A
TAX
LDA.l SaveDataWRAM, X
BRA .continue
.current_room
LDA.w RoomItemsTaken ; if checking our current room, $0403 has fresher flags
ASL #4
.continue
STA.b $04
TYX
LDA.l MiscLocations+2, X ; get bit of room data to check
AND.w #$00FF
ASL A
TAX
LDA.l DungeonMask, X
TYX
BIT.b $04
BNE .next_boss ; continue checking if we already got the item
LDA.l MiscLocations+4, X
STA.b $05
LDA.l MiscLocations+3, X
STA.b $04
LDA.b [$04]
AND.w #$00FF
JSR GetLootClass
BRA .next_boss
CheckPrize:
LDA.b $CA
AND.w #$00FF
STA.b $04
LDX.w #$FFFD
.next_prize
INX #3
LDA.l PrizeLocations, X
BPL .check
RTS
.check
CMP.b $04
BNE .next_prize
TXY
ASL A
TAX
LDA.l SaveDataWRAM, X
TYX
BIT.w #$0800
BNE .next_prize
LDA.l PrizeLocations+2, X ; get which prize to look at
AND.w #$00FF
TAX
LDA.l DungeonPrizeReceiptID, X
TYX
AND.w #$00FF
JSR GetLootClass
BRA .next_prize
CheckPots:
LDA.b $CA
AND.w #$00FF
ASL A
TAX
LDA.l UWPotsPointers, X
STA.b $04
LDA.w #bank(UWPotsData)
STA.b $06
LDY.w #$0000
LDX.w #$FFFF
.next_pot
LDA.b [$04], Y
CMP.w #$FFFF : BEQ .done
INX : INY : INY
BIT.w #$4000 : BNE .multi_item ; marked as multi item
BIT.w #$8000 : BNE .major_item ; marked as major item
LDA.b [$04], Y
AND.w #$00FF
CMP.w #$0008 : BEQ .small_key
LDA.l PotCountMode
BEQ +
JSR CheckJunkPot
+
INY
BRA .next_pot
.small_key
LDA.w #$8000 : STA.b $08
LDA.w #$0024
PHA
PHX
INY
BRA .mask_set
.multi_item
LDA.b [$04], Y
PHX
AND.w #$00FF
ASL A
TAX
LDA.l PotMultiWorldTable, X
PLX
BRA .item_id_set
.major_item
LDA.b [$04], Y
.item_id_set
PHA
PHX
INY
TXA : ASL A
TAX
LDA.l DungeonMask, X : STA.b $08
TXA : LSR A : TAX
.mask_set
TXA
JSR CheckPotSection
BCS +
PLX
PLA
BRA .next_pot
+
LDA.b $CA
AND.w #$00FF
ASL A
TAX
if !FEATURE_FIX_BASEROM
LDA.l SpriteDropData, X
else
LDA.l RoomPotData, X
endif
PLX
AND.b $08
BEQ .not_obtained
PLA
BRA .next_pot
.not_obtained
PLA
AND.w #$00FF
JSR GetLootClass
BRA .next_pot
.done
RTS
CheckJunkPot:
LDA.b [$04], Y
PHA
PHX
TXA : ASL A : TAX
LDA.l DungeonMask, X : STA.b $08
TXA : LSR A
JSR CheckPotSection
BCS +
PLX
PLA
RTS
+
LDA.b $CA
AND.w #$00FF
ASL A
TAX
LDA.l PotCollectionRateTable, X
AND.b $08
BEQ .not_important
if !FEATURE_FIX_BASEROM
LDA.l SpriteDropData, X
else
LDA.l RoomPotData, X
endif
AND.b $08
BNE .not_important
PLX
PLA
AND.w #$00FF
JSR GetPotJunkClass
RTS
.not_important
PLX
PLA
RTS
CheckEnemies:
LDA.b $CA
AND.w #$00FF
ASL A
TAX
LDA.l UWSpritesPointers, X
INC A ; skip the layered/unlayered indicator
STA.b $04
LDA.w #bank(UWSpritesData)
STA.b $06
LDY.w #$0000
LDX.w #$FFFF
.next_enemy
LDA.b [$04], Y
AND.w #$00FF
CMP.w #$00FF
BNE +
JMP .done
+
LDA.b [$04], Y
AND.w #$E000
CMP.w #$E000
BEQ .overlord
INY : INY
LDA.b [$04], Y
AND.w #$00FF
CMP.w #$00F8 : BEQ .major ; major item
CMP.w #$00F9 : BEQ .major ; major item in other world
CMP.w #$00E4 : BEQ .vanilla_key
INY
INX
BRA .next_enemy
.overlord
INY : INY : INY
BRA .next_enemy
.vanilla_key
DEY : DEY
LDA.w #$8000 : STA.b $08
LDA.b [$04], Y
INY #3
AND.w #$00FF
CMP.w #$00FD ; big key
BEQ .big_key
CMP.w #$00FE ; small key
BEQ .small_key
; false alarm -- probably hera basement key
INX ; since it's an actual sprite it advances the counter
BRA .next_enemy
.small_key
LDA.w #$0024
PHA : PHX
BRA .mask_set
.big_key
LDA.w #$0032
PHA : PHX
BRA .mask_set
.major
DEY : DEY
LDA.b [$04], Y
AND.w #$00FF
.proceed
INY : INY : INY
PHA
PHX
TXA : ASL A
TAX
LDA.l DungeonMask, X : STA.b $08
TXA : LSR A : TAX
.mask_set
TXA
JSR CheckEnemySection
BCS +
PLX
PLA
JMP .next_enemy
+
LDA.b $CA
AND.w #$00FF
ASL A
TAX
LDA.l SpriteDropData, X
PLX
AND.b $08
BEQ .not_obtained
PLA
JMP .next_enemy
.not_obtained
PLA
AND.w #$00FF
JSR GetLootClass
JMP .next_enemy
.done
RTS
; A = item id
; updates "best loot" value if better
GetLootClass:
PHX
TAX
CMP.w #$0025 : BEQ .compass
AND.w #$00F0
CMP.w #$0080 : BNE .not_compass
.compass
LDA.l AlwaysShowCompass : BNE .check_value
.not_compass
LDA.b $0E
BEQ .done
CMP.w #$0001
BEQ .value_set
.check_value
LDA.l LootTypeMapping, X
AND.w #$00FF
.value_set
CMP.b $02
BCC .done
STA.b $02
.done
PLX
RTS
; A = item id
; updates "best loot" value if better
GetPotJunkClass:
PHX
TAX
LDA.b $0E
BEQ .done
CMP.w #$0001
BEQ .value_set
; hardcode as junk for now
LDA.w #$0002
.value_set
CMP.b $02
BCC .done
STA.b $02
.done
PLX
RTS
macro DefineGetFooSection(type, offset)
Get<type>Section:
PHX
LDA.b $CA
AND.w #$00FF
ASL A
TAX
LDA.l SplitRooms, X
TAX
LDA.l SplitRooms, X
AND.w #$00FF
STA.b $CE
BEQ .found
INX
.check_next_section
PHX
LDA.l SplitRooms+<offset>, X
TAX
-
LDA.l SplitRooms, X
AND.w #$00FF
CMP.w #$00FF
BEQ .not_this_section
CMP.b $CC
BEQ .plx_found
INX
BRA -
.not_this_section
PLX
TXA : CLC : ADC.w #$000D : TAX
DEC.b $CE
BNE .check_next_section
BRA .found
.plx_found
PLX
.found
PLX
LDA.b $CE
RTS
endmacro
macro DefineCheckFooSection(type)
Check<type>Section:
STA.b $CC
LDA.b $CB
AND.w #$00FF
BEQ .yes
JSR Get<type>Section
LDA.b $CB
AND.w #$00FF
LSR A : LSR A : LSR A : LSR A
DEC A
CMP.b $CE
BEQ .yes
.no
CLC
RTS
.yes
SEC
RTS
endmacro
%DefineGetFooSection(Door, 3)
%DefineGetFooSection(Stair, 5)
%DefineGetFooSection(Chest, 7)
%DefineGetFooSection(Pot, 9)
%DefineGetFooSection(Enemy, 11)
%DefineCheckFooSection(Door)
%DefineCheckFooSection(Stair)
%DefineCheckFooSection(Chest)
%DefineCheckFooSection(Pot)
%DefineCheckFooSection(Enemy)
GetIncomingStairSection:
PHX
AND.w #$0300
XBA
ASL A
TAX
LDA.l $8098D8, X
STA.b $CC
LDA.b $CA
AND.w #$00FF
ASL A
TAX
LDA.l SplitRooms, X
TAX
LDA.l SplitRooms, X
AND.w #$00FF
STA.b $CE
BEQ .found
INX
.check_next_section
LDA.l SplitRooms+0, X
AND.w #$00FF
AND.b $CC
BNE .found
TXA : CLC : ADC.w #$000D : TAX
DEC.b $CE
BNE .check_next_section
BRA .found
.found
PLX
LDA.b $CE
RTS

View File

@@ -0,0 +1,43 @@
DoorConnectionTiles:
.vertical
dw $0000, $0000 ; $00
dw $01C0, $0000 ; $01 left -> left
dw $01D0, $01D1 ; $02 left -> middle
dw $81C3, $41C3 ; $03 left -> right
dw $81D0, $81D1 ; $04 middle -> left
dw $01C1, $41C1 ; $05 middle -> middle
dw $C1D1, $C1D0 ; $06 middle -> right
dw $01C3, $C1C3 ; $07 right -> left
dw $41D1, $41D0 ; $08 right -> middle
dw $0000, $01C0 ; $09 right -> right
dw $41C2, $41C1 ; $0A left-middle -> left-middle
dw $81D2, $C1D0 ; $0B left-middle -> left-right
dw $41D3, $81D3 ; $0C left-middle -> middle-right
dw $01D2, $41D0 ; $0D left-right -> left-middle
dw $01C0, $01C0 ; $0E left-right -> left-right
dw $01D0, $41D2 ; $0F left-right -> middle-right
dw $C1D3, $01D3 ; $10 middle-right -> left-middle
dw $81D0, $C1D2 ; $11 middle-right -> left-right
dw $01C1, $01C2 ; $12 middle-right -> middle-right
dw $41C2, $01C2 ; $13 triple -> triple
.horizontal
dw $0300, $0300 ; $00
dw $01C4, $0300 ; $01 top -> top
dw $C1D4, $C1D5 ; $02 top -> middle
dw $81C7, $41C7 ; $03 top -> bottom
dw $81D4, $81D5 ; $04 middle -> top
dw $01C5, $81C5 ; $05 middle -> middle
dw $01D5, $01D4 ; $06 middle -> bottom
dw $C1C7, $01C7 ; $07 bottom -> top
dw $41D5, $41D4 ; $08 bottom -> middle
dw $0300, $01C4 ; $09 bottom -> bottom
dw $41C6, $41C5 ; $0A top-middle -> top-middle
dw $41D6, $01D4 ; $0B top-middle -> top-bottom
dw $41D7, $81D7 ; $0C top-middle -> middle-bottom
dw $01D6, $41D4 ; $0D top-bottom -> top-middle
dw $01C4, $01C4 ; $0E top-bottom -> top-bottom
dw $C1D4, $81D6 ; $0F top-bottom -> middle-bottom
dw $C1D7, $01D7 ; $10 middle-bottom -> top-middle
dw $81D4, $C1D6 ; $11 middle-bottom -> top-bottom
dw $01C5, $01C6 ; $12 middle-bottom -> middle-bottom
dw $81C6, $01C6 ; $13 triple -> triple

309
gk/data/doors_display.asm Normal file
View File

@@ -0,0 +1,309 @@
DoorSlotsSprites:
; center
dw $48A8
; north
dw $2090, $20A8, $20C0
dw $2098, $20B8
; west
dw $3080, $4880, $6080
dw $3880, $5880
; south
dw $7090, $70A8, $70C0
dw $7098, $70B8
; east
dw $30D0, $48D0, $60D0
dw $38D0, $58D0
; stairs
dw $B080, $B098, $B0B0
; drop/warp
dw $B0D0
DoorSlotsBG1:
; center
dw $1135
; north
dw $1092, $1095, $1098
dw $1093, $1097
; west
dw $10D0, $1130, $1190
dw $10F0, $1170
; south
dw $11D2, $11D5, $11D8
dw $11D3, $11D7
; east
dw $10DA, $113A, $119A
dw $10FA, $117A
; stairs
dw $12D0, $12D3, $12D6
; drop/warp
dw $12DA
DoorSlotsBG2:
; center
dw $0000
; north
dw $FEBA, $FEC0, $FEC6
dw $FEBC, $FEC4
; west
dw $FF36, $FFF6, $00B6
dw $FF76, $0076
; south
dw $013A, $0140, $0146
dw $013C, $0144
; east
dw $FF4A, $000A, $00CA
dw $FF8A, $008A
; stairs
dw $0336, $033C, $0342
; drop/warp
dw $034A
DoorSlotSides:
db $02, $0C, $16, $20
DoorSlotOffsets:
db $02, $02, $06, $00
; up, left, down, right
NextCursorSlot:
db $80, $81, $82, $83
; top
db $FF, $C1, $00, $04
db $FF, $04, $00, $05
db $FF, $05, $00, $C3
db $FF, $01, $00, $02
db $FF, $02, $00, $03
; left
db $C0, $FF, $09, $00
db $09, $FF, $0A, $00
db $0A, $FF, $C2, $00
db $06, $FF, $07, $00
db $07, $FF, $08, $00
; bottom
db $00, $E1, $85, $0E
db $00, $0E, $85, $0F
db $00, $0F, $85, $E3
db $00, $0B, $85, $0C
db $00, $0C, $85, $0D
; right
db $E0, $00, $13, $FF
db $13, $00, $14, $FF
db $14, $00, $E2, $FF
db $10, $00, $11, $FF
db $11, $00, $12, $FF
; stairs
db $84, $18, $FF, $16
db $84, $15, $FF, $17
db $84, $16, $FF, $18
; drop/warp
db $84, $17, $FF, $15
NextCursorSpecial:
.center
db $02, $04, $05, $01, $03, $FF
db $07, $09, $0A, $06, $08, $FF
db $0C, $0E, $0F, $0B, $0D, $15, $16, $17, $18, $FF
db $11, $13, $14, $10, $12, $FF
db $0C, $0E, $0F, $0B, $0D, $00, $FF
db $17, $16, $15, $18, $FF
.center_offset
db $00, $06, $0C, $16, $1C, $23
.start_index
db $01, $06, $0B, $10, $15
.start_direction
db $03, $02, $03, $02, $03
.end_index
db $03, $08, $0D, $12, $18
.end_direction
db $01, $00, $01, $00, $01
SingleEdgeCurrentRoomConnectors:
.north
dw $01C0, $0300, $01C0, $0300, $01C0, $0300 ; left -> left
dw $01C1, $41C1, $81D0, $81D1, $01C0, $0300 ; left -> middle
dw $41D1, $41D0, $01C1, $41C1, $81D0, $81D1 ; left -> right
dw $01C0, $0300, $01D0, $01D1, $01C1, $41C1 ; middle -> left
dw $01C1, $41C1, $01C1, $41C1, $01C1, $41C1 ; middle -> middle
dw $0300, $01C0, $41D1, $41D0, $01C1, $41C1 ; middle -> right
dw $01D0, $01D1, $01C1, $41C1, $C1D1, $C1D0 ; right -> left
dw $01C1, $41C1, $C1D1, $C1D0, $0300, $01C0 ; right -> middle
dw $0300, $01C0, $0300, $01C0, $0300, $01C0 ; right -> right
.west
dw $01C4, $01C4, $01C4, $0300, $0300, $0300 ; top -> top
dw $01C5, $81D4, $01C4, $C1C5, $81D5, $0300 ; top -> middle
dw $41D5, $01C5, $81D4, $41D4, $C1C5, $81D5 ; top -> bottom
dw $01C4, $C1D4, $01C5, $0300, $C1D5, $C1C5 ; middle -> top
dw $01C5, $01C5, $01C5, $C1C5, $C1C5, $C1C5 ; middle -> middle
dw $0300, $41D5, $01C5, $01C4, $41D4, $C1C5 ; middle -> bottom
dw $C1D4, $01C5, $01D5, $C1D5, $C1C5, $01D4 ; bottom -> top
dw $01C5, $01D5, $0300, $C1C5, $01D4, $01C4 ; bottom -> middle
dw $0300, $0300, $0300, $01C4, $01C4, $01C4 ; bottom -> bottom
.south
dw $01C0, $0300, $01C0, $0300, $01C0, $0300 ; left -> left
dw $01C0, $0300, $01D0, $01D1, $01C1, $41C1 ; left -> middle
dw $01D0, $01D1, $01C1, $41C1, $C1D1, $C1D0 ; left -> right
dw $01C1, $41C1, $81D0, $81D1, $01C0, $0300 ; middle -> left
dw $01C1, $41C1, $01C1, $41C1, $01C1, $41C1 ; middle -> middle
dw $01C1, $41C1, $C1D1, $C1D0, $0300, $01C0 ; middle -> right
dw $41D1, $41D0, $01C1, $41C1, $81D0, $81D1 ; right -> left
dw $0300, $01C0, $41D1, $41D0, $01C1, $41C1 ; right -> middle
dw $0300, $01C0, $0300, $01C0, $0300, $01C0 ; right -> right
.east
dw $01C4, $01C4, $01C4, $0300, $0300, $0300 ; top -> top
dw $01C4, $C1D4, $01C5, $0300, $C1D5, $81C5 ; top -> middle
dw $C1D4, $01C5, $01D5, $C1D5, $81C5, $01D4 ; top -> bottom
dw $01C5, $81D4, $01C4, $81C5, $81D5, $0300 ; middle -> top
dw $01C5, $01C5, $01C5, $81C5, $81C5, $81C5 ; middle -> middle
dw $01C5, $01D5, $0300, $81C5, $01D4, $01C4 ; middle -> bottom
dw $41D5, $01C5, $81D4, $41D4, $81C5, $81D5 ; bottom -> top
dw $0300, $41D5, $01C5, $01C4, $41D4, $81C5 ; bottom -> middle
dw $0300, $0300, $0300, $01C4, $01C4, $01C4 ; bottom -> bottom
QuadrantMasks:
; north
dw $0008, $000C, $0004
; west
dw $0008, $000A, $0002
; south
dw $0002, $0003, $0001
; east
dw $0004, $0005, $0001
EntranceQuadrantMasks:
dw $0002
dw $0003
dw $0001
DropdownQuadrantMasks:
dw $0008
dw $000C
dw $0004
MultiConnectorMapping:
.two
db $02, $00
.three
db $02, $01, $00
MultiConnectorTiles:
.north
..two
dw $41C7, $81C7, $C1C7, $01C7
..three
dw $41C7, $01C4, $81F7, $C1F7, $01C4, $01C7
.west
..two
dw $81C7, $41C7, $C1C7, $01C7
..three
dw $81C7, $01C0, $41E7, $C1E7, $01C0, $01C7
.south
..two
dw $C1C7, $01C7, $41C7, $81C7
..three
dw $C1C7, $01C4, $01F7, $41F7, $01C4, $81C7
.east
..two
dw $C1C7, $01C7, $81C7, $41C7
..three
dw $C1C7, $01C0, $01E7, $81E7, $01C0, $41C7
.direction_index
db $00, $14, $28, $3C
.start_offset
..two
dw $FF7E, $FFBC, $00BE, $FFC6
..three
dw $FF7C, $FF7C, $00BC, $FF86
.increment
db $02, $40
EdgePositions:
.north
db $01, $00 ; HC Basement
db $02 ; Desert West Wing
db $00, $01, $02 ; Desert Lobby
db $00 ; Desert East Wing
db $01, $02 ; TT
db $00, $01 ; different TT
.west
db $02 ; TT Attic
db $02, $02 ; Desert North Hall
db $00, $02 ; HC Basement
db $00 ; Desert East Wing
db $02, $00 ; TT Triple
db $02 ; TT Big Key Chest
.south
db $01, $00 ; HC Basement
db $02 ; Desert West Wing
db $00, $01, $02 ; Desert Lobby
db $00 ; Desert East Wing
db $01, $02 ; TT
db $00, $01 ; different TT
.east
db $02 ; TT Attic
db $02, $02 ; Desert North Hall
db $02, $00 ; HC Basement
db $00 ; Desert East Wing
db $02, $00 ; TT Triple
db $02 ; TT Big Key Chest
EdgeConnectionIndices:
; North
dw $0182, $0000
dw $0082, $0003
dw $0283, $0006
dw $0084, $0009
dw $0184, $000C
dw $0284, $000F
dw $0085, $0012
dw $01DB, $0015
dw $02DB, $0018
dw $00DC, $001B
dw $01DC, $001E
; South
dw $0772, $0021
dw $0672, $0024
dw $0873, $0027
dw $0674, $002A
dw $0774, $002D
dw $0874, $0030
dw $0675, $0033
dw $07CB, $0036
dw $08CB, $0039
dw $06CC, $003C
dw $07CC, $003F
; West
dw $0565, $0042
dw $0574, $0045
dw $0575, $0048
dw $0582, $004B
dw $0382, $004E
dw $0385, $0051
dw $05CC, $0054
dw $03CC, $0057
dw $05DC, $005A
; East
dw $0B64, $005D
dw $0B73, $0060
dw $0B74, $0063
dw $0981, $0066
dw $0B81, $0069
dw $0984, $006C
dw $0BCB, $006F
dw $09CB, $0072
dw $0BDB, $0075
dw $FFFF
InRoomConnectionIndices:
dw $020B, $0000
dw $081B, $0002
dw $023F, $0004
dw $081F, $0006
dw $007E, $0008
dw $065E, $000A
dw $0296, $000C
dw $083D, $000E
dw $FFFF

View File

@@ -0,0 +1,26 @@
dw $200C
dw $100E
dw $2012
dw $1023
dw $1024
dw $2028
dw $204A
dw $4056
dw $4057
dw $4058
dw $4059
dw $1060
dw $2061
dw $4062
dw $4063
dw $2077
dw $4083
dw $2084
dw $1085
dw $4098
dw $20C9
dw $40D5
dw $10D6
dw $20DB
dw $40E0
dw $FFFF

38
gk/data/fall_warps.asm Normal file
View File

@@ -0,0 +1,38 @@
FallTable:
dw $1007, $1017 ; Moldorm Arena
dw $1017, $1027 ; Below Moldorm drop to Big Chest
dw $101E, $103E ; IP first drop
dw $1027, $1031 ; ToH Big Chest drop
dw $1031, $1077 ; Second Floor ToH
dw $1039, $1029 ; Mothula drop
dw $103A, $100A ; Pod front drop
dw $103D, $1096 ; GT Torches drop
dw $104D, $10A6 ; Moldorm 2 drop
dw $1054, $1034 ; Left side Swamp
dw $105E, $107E ; IP drop to tall icy room
dw $107E, $109E ; Freezors drop (to big chest)
dw $208C, $101C ; Ice Armos drop
dw $1097, $10D1 ; Mire Cutscene
dw $109E, $10BE ; IP Big Chest tile (push blocks)
dw $10CE, $10DE ; Kholdstare drop
; db $65, $AC ; TT Attic
; db $77, $A7 ; ToH drop to fairy room (Herapot)
; db $A9, $89 ; EP drop to fairy room
; db $BE, $4F ; IP drop to fairy room
dw $FFFF
WarpTable:
dw $2009, $104B ; PoD Basement (start)
dw $100A, $1009 ; PoD Stalfos Basement
dw $100B, $206A ; PoD Turtle Room to Boss
dw $104B, $2009 ; PoD Basement (mimics)
dw $207B, $209D ; GT post-compass island hardhat
dw $207D, $109B ; GT warp maze
dw $109D, $307B ; GT compass room
dw $109B, $207D ; GT warp maze
dw $10B1, $20B2 ; South of Fishbone warp
dw $10D1, $10B1 ; Mire Big Key Chest warp
; db $89, $A9 ; EP Fairy Room
; db $A7, $17 ; ToH Fairy Room
; db $4F, $BE ; IP Fairy Room
dw $FFFF

276
gk/data/item_mapping.asm Normal file
View File

@@ -0,0 +1,276 @@
!TIER_UNKNOWN = $01
!TIER_JUNK = $02
!TIER_LOW_KEY = $03
!TIER_HEALTH = $05
!TIER_MINOR = $06
!TIER_MAP = $07
!TIER_COMPASS = $08
!TIER_SM_KEY = $09
!TIER_BIG_KEY = $0A
!TIER_MAJOR = $0B
!TIER_PENDANT = $0C
!TIER_CRYSTAL = $0D
!TIER_TFP = $0E
!TIER_TFORCE = $0F
db !TIER_MAJOR ; 00 - Fighter Sword and Shield
db !TIER_MAJOR ; 01 - Master Sword
db !TIER_MAJOR ; 02 - Tempered Sword
db !TIER_MAJOR ; 03 - Butter Sword
db !TIER_JUNK ; 04 - Fighter Shield
db !TIER_MINOR ; 05 - Fire Shield
db !TIER_MINOR ; 06 - Mirror Shield
db !TIER_MAJOR ; 07 - Fire Rod
db !TIER_MAJOR ; 08 - Ice Rod
db !TIER_MAJOR ; 09 - Hammer
db !TIER_MAJOR ; 0A - Hookshot
db !TIER_MAJOR ; 0B - Bow
db !TIER_MINOR ; 0C - Boomerang
db !TIER_MINOR ; 0D - Powder
db !TIER_JUNK ; 0E - Bottle Refill (bee)
db !TIER_MAJOR ; 0F - Bombos
db !TIER_MAJOR ; 10 - Ether
db !TIER_MAJOR ; 11 - Quake
db !TIER_MAJOR ; 12 - Lamp
db !TIER_MINOR ; 13 - Shovel
db !TIER_MAJOR ; 14 - Flute
db !TIER_MAJOR ; 15 - Somaria
db !TIER_MINOR ; 16 - Bottle
db !TIER_HEALTH ; 17 - Heartpiece
db !TIER_MINOR ; 18 - Byrna
db !TIER_MINOR ; 19 - Cape
db !TIER_MAJOR ; 1A - Mirror
db !TIER_MAJOR ; 1B - Glove
db !TIER_MAJOR ; 1C - Mitts
db !TIER_MAJOR ; 1D - Book
db !TIER_MAJOR ; 1E - Flippers
db !TIER_MAJOR ; 1F - Pearl
db !TIER_CRYSTAL ; 20 - Crystal
db !TIER_MINOR ; 21 - Net
db !TIER_MINOR ; 22 - Blue Mail
db !TIER_MINOR ; 23 - Red Mail
db !TIER_LOW_KEY ; 24 - Small Key
db !TIER_COMPASS ; 25 - Compass
db !TIER_HEALTH ; 26 - Heart Container from 4/4
db !TIER_JUNK ; 27 - Bomb
db !TIER_JUNK ; 28 - 3 bombs
db !TIER_MINOR ; 29 - Mushroom
db !TIER_MINOR ; 2A - Red boomerang
db !TIER_MINOR ; 2B - Full bottle (red)
db !TIER_MINOR ; 2C - Full bottle (green)
db !TIER_MINOR ; 2D - Full bottle (blue)
db !TIER_HEALTH ; 2E - Potion refill (red)
db !TIER_HEALTH ; 2F - Potion refill (green)
db !TIER_HEALTH ; 30 - Potion refill (blue)
db !TIER_JUNK ; 31 - 10 bombs
db !TIER_BIG_KEY ; 32 - Big key
db !TIER_MAP ; 33 - Map
db !TIER_JUNK ; 34 - 1 rupee
db !TIER_JUNK ; 35 - 5 rupees
db !TIER_JUNK ; 36 - 20 rupees
db !TIER_PENDANT ; 37 - Green pendant
db !TIER_PENDANT ; 38 - Blue pendant
db !TIER_PENDANT ; 39 - Red pendant
db !TIER_MAJOR ; 3A - Tossed bow
db !TIER_MAJOR ; 3B - Silvers
db !TIER_MINOR ; 3C - Full bottle (bee)
db !TIER_MINOR ; 3D - Full bottle (fairy)
db !TIER_HEALTH ; 3E - Boss heart
db !TIER_HEALTH ; 3F - Sanc heart
db !TIER_JUNK ; 40 - 100 rupees
db !TIER_JUNK ; 41 - 50 rupees
db !TIER_JUNK ; 42 - Heart
db !TIER_JUNK ; 43 - Arrow
db !TIER_JUNK ; 44 - 10 arrows
db !TIER_JUNK ; 45 - Small magic
db !TIER_JUNK ; 46 - 300 rupees
db !TIER_JUNK ; 47 - 20 rupees green
db !TIER_MINOR ; 48 - Full bottle (good bee)
db !TIER_MAJOR ; 49 - Tossed fighter sword
db !TIER_MAJOR ; 4A - Active Flute
db !TIER_MAJOR ; 4B - Boots
db !TIER_MINOR ; 4C - Bomb capacity (50)
db !TIER_MINOR ; 4D - Arrow capacity (70)
db !TIER_MINOR ; 4E - 1/2 magic
db !TIER_MINOR ; 4F - 1/4 magic
db !TIER_MAJOR ; 50 - Safe master sword
db !TIER_MINOR ; 51 - Bomb capacity (+5)
db !TIER_MINOR ; 52 - Bomb capacity (+10)
db !TIER_MINOR ; 53 - Arrow capacity (+5)
db !TIER_MINOR ; 54 - Arrow capacity (+10)
db !TIER_JUNK ; 55 - Programmable item 1
db !TIER_JUNK ; 56 - Programmable item 2
db !TIER_JUNK ; 57 - Programmable item 3
db !TIER_MAJOR ; 58 - Upgrade-only silver arrows
db !TIER_JUNK ; 59 - Rupoor
db !TIER_JUNK ; 5A - Nothing
db !TIER_JUNK ; 5B - Red clock
db !TIER_JUNK ; 5C - Blue clock
db !TIER_JUNK ; 5D - Green clock
db !TIER_MAJOR ; 5E - Progressive sword
db !TIER_MINOR ; 5F - Progressive shield
db !TIER_MINOR ; 60 - Progressive armor
db !TIER_MAJOR ; 61 - Progressive glove
db !TIER_JUNK ; 62 - RNG pool item (single)
db !TIER_JUNK ; 63 - RNG pool item (multi)
db !TIER_MAJOR ; 64 - Progressive bow
db !TIER_MAJOR ; 65 - Progressive bow
db !TIER_JUNK ; 66 -
db !TIER_JUNK ; 67 -
db !TIER_JUNK ; 68 -
db !TIER_JUNK ; 69 -
db !TIER_TFORCE ; 6A - Triforce
db !TIER_TFP ; 6B - Power star
db !TIER_TFP ; 6C - Triforce Piece
db !TIER_JUNK ; 6D - Server request item
db !TIER_JUNK ; 6E - Server request item (dungeon drop)
db !TIER_JUNK ; 6F -
db !TIER_MAP ; 70 - Map of Light World
db !TIER_MAP ; 71 - Map of Dark World
db !TIER_MAP ; 72 - Map of Ganon's Tower
db !TIER_MAP ; 73 - Map of Turtle Rock
db !TIER_MAP ; 74 - Map of Thieves' Town
db !TIER_MAP ; 75 - Map of Tower of Hera
db !TIER_MAP ; 76 - Map of Ice Palace
db !TIER_MAP ; 77 - Map of Skull Woods
db !TIER_MAP ; 78 - Map of Misery Mire
db !TIER_MAP ; 79 - Map of Dark Palace
db !TIER_MAP ; 7A - Map of Swamp Palace
db !TIER_MAP ; 7B - Map of Agahnim's Tower
db !TIER_MAP ; 7C - Map of Desert Palace
db !TIER_MAP ; 7D - Map of Eastern Palace
db !TIER_MAP ; 7E - Map of Hyrule Castle
db !TIER_MAP ; 7F - Map of Sewers
db !TIER_COMPASS ; 80 - Compass of Light World
db !TIER_COMPASS ; 81 - Compass of Dark World
db !TIER_COMPASS ; 82 - Compass of Ganon's Tower
db !TIER_COMPASS ; 83 - Compass of Turtle Rock
db !TIER_COMPASS ; 84 - Compass of Thieves' Town
db !TIER_COMPASS ; 85 - Compass of Tower of Hera
db !TIER_COMPASS ; 86 - Compass of Ice Palace
db !TIER_COMPASS ; 87 - Compass of Skull Woods
db !TIER_COMPASS ; 88 - Compass of Misery Mire
db !TIER_COMPASS ; 89 - Compass of Dark Palace
db !TIER_COMPASS ; 8A - Compass of Swamp Palace
db !TIER_COMPASS ; 8B - Compass of Agahnim's Tower
db !TIER_COMPASS ; 8C - Compass of Desert Palace
db !TIER_COMPASS ; 8D - Compass of Eastern Palace
db !TIER_COMPASS ; 8E - Compass of Hyrule Castle
db !TIER_COMPASS ; 8F - Compass of Sewers
db !TIER_BIG_KEY ; 90 - Skull key
db !TIER_BIG_KEY ; 91 - Reserved
db !TIER_BIG_KEY ; 92 - Big key of Ganon's Tower
db !TIER_BIG_KEY ; 93 - Big key of Turtle Rock
db !TIER_BIG_KEY ; 94 - Big key of Thieves' Town
db !TIER_BIG_KEY ; 95 - Big key of Tower of Hera
db !TIER_BIG_KEY ; 96 - Big key of Ice Palace
db !TIER_BIG_KEY ; 97 - Big key of Skull Woods
db !TIER_BIG_KEY ; 98 - Big key of Misery Mire
db !TIER_BIG_KEY ; 99 - Big key of Dark Palace
db !TIER_BIG_KEY ; 9A - Big key of Swamp Palace
db !TIER_BIG_KEY ; 9B - Big key of Agahnim's Tower
db !TIER_BIG_KEY ; 9C - Big key of Desert Palace
db !TIER_BIG_KEY ; 9D - Big key of Eastern Palace
db !TIER_BIG_KEY ; 9E - Big key of Hyrule Castle
db !TIER_BIG_KEY ; 9F - Big key of Sewers
db !TIER_SM_KEY ; A0 - Small key of Sewers
db !TIER_SM_KEY ; A1 - Small key of Hyrule Castle
db !TIER_SM_KEY ; A2 - Small key of Eastern Palace
db !TIER_SM_KEY ; A3 - Small key of Desert Palace
db !TIER_SM_KEY ; A4 - Small key of Agahnim's Tower
db !TIER_SM_KEY ; A5 - Small key of Swamp Palace
db !TIER_SM_KEY ; A6 - Small key of Dark Palace
db !TIER_SM_KEY ; A7 - Small key of Misery Mire
db !TIER_SM_KEY ; A8 - Small key of Skull Woods
db !TIER_SM_KEY ; A9 - Small key of Ice Palace
db !TIER_SM_KEY ; AA - Small key of Tower of Hera
db !TIER_SM_KEY ; AB - Small key of Thieves' Town
db !TIER_SM_KEY ; AC - Small key of Turtle Rock
db !TIER_SM_KEY ; AD - Small key of Ganon's Tower
db !TIER_JUNK ; AE - Reserved
db !TIER_LOW_KEY ; AF - Generic small key
db !TIER_CRYSTAL ; B0 - Crystal 6
db !TIER_CRYSTAL ; B1 - Crystal 1
db !TIER_CRYSTAL ; B2 - Crystal 5
db !TIER_CRYSTAL ; B3 - Crystal 7
db !TIER_CRYSTAL ; B4 - Crystal 2
db !TIER_CRYSTAL ; B5 - Crystal 4
db !TIER_CRYSTAL ; B6 - Crystal 3
db !TIER_JUNK ; B7 - Reserved
db !TIER_JUNK ; B8 -
db !TIER_JUNK ; B9 -
db !TIER_JUNK ; BA -
db !TIER_JUNK ; BB -
db !TIER_JUNK ; BC -
db !TIER_JUNK ; BD -
db !TIER_JUNK ; BE -
db !TIER_JUNK ; BF -
db !TIER_JUNK ; C0 -
db !TIER_JUNK ; C1 -
db !TIER_JUNK ; C2 -
db !TIER_JUNK ; C3 -
db !TIER_JUNK ; C4 -
db !TIER_JUNK ; C5 -
db !TIER_JUNK ; C6 -
db !TIER_JUNK ; C7 -
db !TIER_JUNK ; C8 -
db !TIER_JUNK ; C9 -
db !TIER_JUNK ; CA -
db !TIER_JUNK ; CB -
db !TIER_JUNK ; CC -
db !TIER_JUNK ; CD -
db !TIER_JUNK ; CE -
db !TIER_JUNK ; CF -
db !TIER_JUNK ; D0 - Bee trap
db !TIER_JUNK ; D1 - Apples
db !TIER_JUNK ; D2 - Fairy
db !TIER_JUNK ; D3 - Chicken
db !TIER_JUNK ; D4 - Big Magic
db !TIER_JUNK ; D5 - 5 Arrows
db !TIER_JUNK ; D6 - Good Bee
db !TIER_JUNK ; D7 -
db !TIER_JUNK ; D8 -
db !TIER_JUNK ; D9 -
db !TIER_JUNK ; DA -
db !TIER_JUNK ; DB -
db !TIER_JUNK ; DC -
db !TIER_JUNK ; DD -
db !TIER_JUNK ; DE -
db !TIER_JUNK ; DF -
db !TIER_JUNK ; E0 -
db !TIER_JUNK ; E1 -
db !TIER_JUNK ; E2 -
db !TIER_JUNK ; E3 -
db !TIER_JUNK ; E4 -
db !TIER_JUNK ; E5 -
db !TIER_JUNK ; E6 -
db !TIER_JUNK ; E7 -
db !TIER_JUNK ; E8 -
db !TIER_JUNK ; E9 -
db !TIER_JUNK ; EA -
db !TIER_JUNK ; EB -
db !TIER_JUNK ; EC -
db !TIER_JUNK ; ED -
db !TIER_JUNK ; EE -
db !TIER_JUNK ; EF -
db !TIER_JUNK ; F0 -
db !TIER_JUNK ; F1 -
db !TIER_JUNK ; F2 -
db !TIER_JUNK ; F3 -
db !TIER_JUNK ; F4 -
db !TIER_JUNK ; F5 -
db !TIER_JUNK ; F6 -
db !TIER_JUNK ; F7 -
db !TIER_JUNK ; F8 -
db !TIER_JUNK ; F9 -
db !TIER_JUNK ; FA -
db !TIER_JUNK ; FB -
db !TIER_JUNK ; FC -
db !TIER_JUNK ; FD -
db !TIER_JUNK ; FE - Server request (async)
db !TIER_JUNK ; FF -

261
gk/data/junk_items.asm Normal file
View File

@@ -0,0 +1,261 @@
db $00 ; 00 - Fighter Sword and Shield
db $00 ; 01 - Master Sword
db $00 ; 02 - Tempered Sword
db $00 ; 03 - Butter Sword
db $00 ; 04 - Fighter Shield
db $00 ; 05 - Fire Shield
db $00 ; 06 - Mirror Shield
db $00 ; 07 - Fire Rod
db $00 ; 08 - Ice Rod
db $00 ; 09 - Hammer
db $00 ; 0A - Hookshot
db $00 ; 0B - Bow
db $00 ; 0C - Boomerang
db $00 ; 0D - Powder
db $00 ; 0E - Bottle Refill (bee)
db $00 ; 0F - Bombos
db $00 ; 10 - Ether
db $00 ; 11 - Quake
db $00 ; 12 - Lamp
db $00 ; 13 - Shovel
db $00 ; 14 - Flute
db $00 ; 15 - Somaria
db $00 ; 16 - Bottle
db $00 ; 17 - Heartpiece
db $00 ; 18 - Byrna
db $00 ; 19 - Cape
db $00 ; 1A - Mirror
db $00 ; 1B - Glove
db $00 ; 1C - Mitts
db $00 ; 1D - Book
db $00 ; 1E - Flippers
db $00 ; 1F - Pearl
db $00 ; 20 - Crystal
db $00 ; 21 - Net
db $00 ; 22 - Blue Mail
db $00 ; 23 - Red Mail
db $00 ; 24 - Small Key
db $00 ; 25 - Compass
db $00 ; 26 - Heart Container from 4/4
db $01 ; 27 - Bomb
db $01 ; 28 - 3 bombs
db $00 ; 29 - Mushroom
db $00 ; 2A - Red boomerang
db $00 ; 2B - Full bottle (red)
db $00 ; 2C - Full bottle (green)
db $00 ; 2D - Full bottle (blue)
db $00 ; 2E - Potion refill (red)
db $00 ; 2F - Potion refill (green)
db $00 ; 30 - Potion refill (blue)
db $01 ; 31 - 10 bombs
db $00 ; 32 - Big key
db $00 ; 33 - Map
db $01 ; 34 - 1 rupee
db $01 ; 35 - 5 rupees
db $01 ; 36 - 20 rupees
db $00 ; 37 - Green pendant
db $00 ; 38 - Blue pendant
db $00 ; 39 - Red pendant
db $00 ; 3A - Tossed bow
db $00 ; 3B - Silvers
db $00 ; 3C - Full bottle (bee)
db $00 ; 3D - Full bottle (fairy)
db $00 ; 3E - Boss heart
db $00 ; 3F - Sanc heart
db $01 ; 40 - 100 rupees
db $01 ; 41 - 50 rupees
db $01 ; 42 - Heart
db $01 ; 43 - Arrow
db $01 ; 44 - 10 arrows
db $01 ; 45 - Small magic
db $01 ; 46 - 300 rupees
db $01 ; 47 - 20 rupees green
db $00 ; 48 - Full bottle (good bee)
db $00 ; 49 - Tossed fighter sword
db $00 ; 4A - Active Flute
db $00 ; 4B - Boots
db $00 ; 4C - Bomb capacity (50)
db $00 ; 4D - Arrow capacity (70)
db $00 ; 4E - 1/2 magic
db $00 ; 4F - 1/4 magic
db $00 ; 50 - Safe master sword
db $00 ; 51 - Bomb capacity (+5)
db $00 ; 52 - Bomb capacity (+10)
db $00 ; 53 - Arrow capacity (+5)
db $00 ; 54 - Arrow capacity (+10)
db $00 ; 55 - Programmable item 1
db $00 ; 56 - Programmable item 2
db $00 ; 57 - Programmable item 3
db $00 ; 58 - Upgrade-only silver arrows
db $01 ; 59 - Rupoor
db $01 ; 5A - Nothing
db $00 ; 5B - Red clock
db $00 ; 5C - Blue clock
db $00 ; 5D - Green clock
db $00 ; 5E - Progressive sword
db $00 ; 5F - Progressive shield
db $00 ; 60 - Progressive armor
db $00 ; 61 - Progressive glove
db $00 ; 62 - RNG pool item (single)
db $00 ; 63 - RNG pool item (multi)
db $00 ; 64 - Progressive bow
db $00 ; 65 - Progressive bow
db $00 ; 66 -
db $00 ; 67 -
db $00 ; 68 -
db $00 ; 69 -
db $00 ; 6A - Triforce
db $01 ; 6B - Power star
db $01 ; 6C - Triforce Piece
db $00 ; 6D - Server request item
db $00 ; 6E - Server request item (dungeon drop)
db $00 ; 6F -
db $00 ; 70 - Map of Light World
db $00 ; 71 - Map of Dark World
db $00 ; 72 - Map of Ganon's Tower
db $00 ; 73 - Map of Turtle Rock
db $00 ; 74 - Map of Thieves' Town
db $00 ; 75 - Map of Tower of Hera
db $00 ; 76 - Map of Ice Palace
db $00 ; 77 - Map of Skull Woods
db $00 ; 78 - Map of Misery Mire
db $00 ; 79 - Map of Dark Palace
db $00 ; 7A - Map of Swamp Palace
db $00 ; 7B - Map of Agahnim's Tower
db $00 ; 7C - Map of Desert Palace
db $00 ; 7D - Map of Eastern Palace
db $00 ; 7E - Map of Hyrule Castle
db $00 ; 7F - Map of Sewers
db $00 ; 80 - Compass of Light World
db $00 ; 81 - Compass of Dark World
db $00 ; 82 - Compass of Ganon's Tower
db $00 ; 83 - Compass of Turtle Rock
db $00 ; 84 - Compass of Thieves' Town
db $00 ; 85 - Compass of Tower of Hera
db $00 ; 86 - Compass of Ice Palace
db $00 ; 87 - Compass of Skull Woods
db $00 ; 88 - Compass of Misery Mire
db $00 ; 89 - Compass of Dark Palace
db $00 ; 8A - Compass of Swamp Palace
db $00 ; 8B - Compass of Agahnim's Tower
db $00 ; 8C - Compass of Desert Palace
db $00 ; 8D - Compass of Eastern Palace
db $00 ; 8E - Compass of Hyrule Castle
db $00 ; 8F - Compass of Sewers
db $00 ; 90 - Skull key
db $00 ; 91 - Reserved
db $00 ; 92 - Big key of Ganon's Tower
db $00 ; 93 - Big key of Turtle Rock
db $00 ; 94 - Big key of Thieves' Town
db $00 ; 95 - Big key of Tower of Hera
db $00 ; 96 - Big key of Ice Palace
db $00 ; 97 - Big key of Skull Woods
db $00 ; 98 - Big key of Misery Mire
db $00 ; 99 - Big key of Dark Palace
db $00 ; 9A - Big key of Swamp Palace
db $00 ; 9B - Big key of Agahnim's Tower
db $00 ; 9C - Big key of Desert Palace
db $00 ; 9D - Big key of Eastern Palace
db $00 ; 9E - Big key of Hyrule Castle
db $00 ; 9F - Big key of Sewers
db $00 ; A0 - Small key of Sewers
db $00 ; A1 - Small key of Hyrule Castle
db $00 ; A2 - Small key of Eastern Palace
db $00 ; A3 - Small key of Desert Palace
db $00 ; A4 - Small key of Agahnim's Tower
db $00 ; A5 - Small key of Swamp Palace
db $00 ; A6 - Small key of Dark Palace
db $00 ; A7 - Small key of Misery Mire
db $00 ; A8 - Small key of Skull Woods
db $00 ; A9 - Small key of Ice Palace
db $00 ; AA - Small key of Tower of Hera
db $00 ; AB - Small key of Thieves' Town
db $00 ; AC - Small key of Turtle Rock
db $00 ; AD - Small key of Ganon's Tower
db $00 ; AE - Reserved
db $00 ; AF - Generic small key
db $00 ; B0 - Crystal 6
db $00 ; B1 - Crystal 1
db $00 ; B2 - Crystal 5
db $00 ; B3 - Crystal 7
db $00 ; B4 - Crystal 2
db $00 ; B5 - Crystal 4
db $00 ; B6 - Crystal 3
db $00 ; B7 - Reserved
db $00 ; B8 -
db $00 ; B9 -
db $00 ; BA -
db $00 ; BB -
db $00 ; BC -
db $00 ; BD -
db $00 ; BE -
db $00 ; BF -
db $00 ; C0 -
db $00 ; C1 -
db $00 ; C2 -
db $00 ; C3 -
db $00 ; C4 -
db $00 ; C5 -
db $00 ; C6 -
db $00 ; C7 -
db $00 ; C8 -
db $00 ; C9 -
db $00 ; CA -
db $00 ; CB -
db $00 ; CC -
db $00 ; CD -
db $00 ; CE -
db $00 ; CF -
db $01 ; D0 - Bee trap
db $01 ; D1 - Apples
db $01 ; D2 - Fairy
db $01 ; D3 - Chicken
db $01 ; D4 - Big Magic
db $01 ; D5 - 5 Arrows
db $01 ; D6 - Good Bee
db $00 ; D7 -
db $00 ; D8 -
db $00 ; D9 -
db $00 ; DA -
db $00 ; DB -
db $00 ; DC -
db $00 ; DD -
db $00 ; DE -
db $00 ; DF -
db $00 ; E0 -
db $00 ; E1 -
db $00 ; E2 -
db $00 ; E3 -
db $00 ; E4 -
db $00 ; E5 -
db $00 ; E6 -
db $00 ; E7 -
db $00 ; E8 -
db $00 ; E9 -
db $00 ; EA -
db $00 ; EB -
db $00 ; EC -
db $00 ; ED -
db $00 ; EE -
db $00 ; EF -
db $00 ; F0 -
db $00 ; F1 -
db $00 ; F2 -
db $00 ; F3 -
db $00 ; F4 -
db $00 ; F5 -
db $00 ; F6 -
db $00 ; F7 -
db $00 ; F8 -
db $00 ; F9 -
db $00 ; FA -
db $00 ; FB -
db $00 ; FC -
db $00 ; FD -
db $00 ; FE - Server request (async)
db $00 ; FF -

87
gk/data/spiral_stairs.asm Normal file
View File

@@ -0,0 +1,87 @@
SpiralPropsIndex:
db $00, $04, $07, $00, $01, $00, $00, $0D, $00, $10, $04, $00, $15, $00, $0A, $00
db $00, $07, $00, $00, $00, $01, $07, $1C, $00, $00, $21, $00, $26, $07, $0A, $00
db $00, $00, $00, $00, $00, $00, $29, $30, $01, $00, $00, $00, $00, $00, $00, $00
db $00, $35, $00, $00, $3A, $00, $00, $00, $01, $00, $04, $00, $00, $00, $00, $3D
db $40, $07, $07, $00, $00, $01, $00, $00, $00, $00, $43, $00, $07, $07, $07, $00
db $00, $00, $00, $01, $48, $00, $00, $00, $00, $00, $00, $00, $07, $07, $00, $4B
db $00, $00, $00, $01, $50, $00, $07, $00, $00, $00, $53, $01, $01, $00, $58, $00
; 0 1 2 3 4 5 6 7 8 9 a b c d e f
db $5B, $01, $04, $00, $00, $00, $60, $67, $00, $00, $00, $00, $00, $00, $00, $6E
db $01, $00, $00, $00, $00, $00, $00, $71, $00, $00, $00, $00, $76, $00, $04, $00
db $00, $07, $00, $04, $00, $00, $00, $01, $7D, $0A, $00, $00, $00, $00, $04, $00
db $01, $00, $04, $00, $00, $01, $07, $00, $00, $00, $00, $0A, $00, $00, $07, $00
db $80, $00, $00, $00, $00, $01, $01, $00, $00, $00, $00, $00, $01, $00, $07, $00
db $85, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
db $8A, $92, $8F, $00, $00, $00, $00, $00, $00, $00, $0A, $00, $00, $00, $00, $00
db $04
SpiralProps:
db $00 ;null row
db $01, $00, $00 ; ($01) Single Top-Left Staircase
db $01, $00, $01 ; ($04) Single Top-Middle Staircase
db $01, $00, $02 ; ($07) Single Top-Right Staircase
db $01, $00, $05 ; ($0A) Single Staircase at Top of Bottom Left Quadrant
db $01, $00, $04 ; ($0D) Moldorm
db $02, $01, $00, $00, $02 ; ($10) Pod Basement
db $03, $01, $0A, $02, $01, $00, $0B ; ($15) GT Entrance
db $02, $01, $03, $00, $04 ; ($1C) Hera Below Moldorm
db $02, $00, $01, $01, $0B ; ($21) PoD Bridge
db $01, $00, $08 ; ($26) GT Ice Armos
db $03, $00, $01, $01, $0B, $02, $09 ; ($29) Swamp Statue
db $02, $01, $03, $00, $04 ; ($30) Hera Big Chest
db $02, $00, $04, $02, $09 ; ($35) Hera Startiles (middle value unused)
db $01, $00, $08 ; ($3A) West Swamp
db $01, $00, $05 ; ($3D) Ice Hamlift
db $01, $00, $07 ; ($40) Aga Guards
db $02, $01, $00, $00, $02 ; ($43) Pod Entrance
db $01, $00, $08 ; ($48) Swamp Attic
db $02, $03, $0C, $04, $06 ; ($4B) Ice U (1st three values unused)
db $01, $00, $05 ; ($50) TT Attic Left
db $02, $00, $01, $01, $0B ; ($53) Pod Rupees
db $01, $00, $04 ; ($58) Ice Gators
db $02, $01, $0A, $02, $01 ; ($5B) HC Tiny (first value placeholder)
db $03, $00, $01, $01, $0B, $02, $09 ; ($60) Swamp Sunken
db $03, $01, $00, $03, $08, $02, $09 ; ($67) Hera Entrance (first value unused)
db $01, $00, $08 ; ($6E) Ice Hookshot
db $02, $01, $00, $03, $08 ; ($71) Hera Basement (first and third values unused)
db $03, $01, $00, $00, $02, $03, $08 ; ($76) GT Circle (third value unused)
db $01, $00, $07 ; ($7D) Mire Entrance
db $02, $00, $02, $02, $09 ; ($80) Tower Usains (2nd value unused)
db $02, $00, $02, $02, $09 ; ($85) Tower Dark2 (2nd value unused)
db $02, $00, $02, $02, $09 ; ($8A) Tower Dark1 (2nd value unused)
db $01, $00, $09 ; ($8F) Mire2
db $01, $00, $0A ; ($92) Mire south of Torch Room
SpiralLabelOffsets:
db 1, -9
db 5, -9
db 9, -9
db -6, -1
db 15, -1
db 1, -1
db 5, -1
db 9, -1
db -6, 7
db 15, 7
db -3, -9
db 13, -9
db -3, -1
db 13, -1
SpiralLabelQuadrantMasks:
dw $0008
dw $000C
dw $0004
dw $0008
dw $0004
dw $0002
dw $0003
dw $0001
dw $0002
dw $0001
dw $0008
dw $0004
dw $0002
dw $0001

571
gk/data/split_room.asm Normal file
View File

@@ -0,0 +1,571 @@
IncomingDoorMap:
; north
db $06, $07, $08
; west
db $09, $0A, $0B
; south
db $00, $01, $02
; east
db $03, $04, $05
macro d(label)
dw <label>-SplitRooms
endmacro
macro sq(byte)
db <byte>
endmacro
SplitRooms:
; 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F
%d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no)
%d(.no) : %d(.09) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no)
%d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.14) : %d(.no) : %d(.no) : %d(.no)
%d(.no) : %d(.no) : %d(.1a) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no)
%d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no)
%d(.no) : %d(.no) : %d(.2a) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no)
%d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.35) : %d(.36) : %d(.37)
%d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no)
%d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no)
%d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no)
%d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.57)
%d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no)
%d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no)
%d(.no) : %d(.no) : %d(.6a) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no)
%d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.74) : %d(.75) : %d(.no) : %d(.no)
%d(.no) : %d(.no) : %d(.no) : %d(.7b) : %d(.7c) : %d(.7d) : %d(.no) : %d(.no)
; 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F
%d(.no) : %d(.no) : %d(.82) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.87)
%d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.8c) : %d(.no) : %d(.no) : %d(.no)
%d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no)
%d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.9d) : %d(.no) : %d(.no)
%d(.no) : %d(.no) : %d(.a2) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no)
%d(.no) : %d(.a9) : %d(.aa) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no)
%d(.no) : %d(.no) : %d(.b2) : %d(.no) : %d(.no) : %d(.no) : %d(.b6) : %d(.no)
%d(.no) : %d(.b9) : %d(.no) : %d(.no) : %d(.bc) : %d(.no) : %d(.no) : %d(.no)
%d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.c7)
%d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.no)
%d(.no) : %d(.d1) : %d(.no) : %d(.no) : %d(.no) : %d(.no) : %d(.d6) : %d(.no)
%d(.no) : %d(.no) : %d(.no) : %d(.db) : %d(.no) : %d(.no) : %d(.no) : %d(.no)
%d(.no)
.no
db $00
.no_items
db $FF
.09
db $01
%sq($04)
%d(..areas) : %d(.no_items) : %d(..stairs)
%d(.no_items) : %d(.no_items) : %d(..enemies)
..areas
db $03, $80, $FF, $00, $80
db $FF
..stairs
db $01
db $FF
..enemies
db $02
db $FF
.14
db $02
%sq($00)
%d(..areas3) : %d(..doors3) : %d(.no_items)
%d(.no_items) : %d(.no_items) : %d(.no_items)
%sq($00)
%d(..areas2) : %d(..doors2) : %d(.no_items)
%d(.no_items) : %d(.no_items) : %d(.no_items)
..areas3
db $03, $C0, $FF, $00, $50
db $03, $00, $28, $30, $50
db $03, $30, $50, $D0, $FF
db $FF
..doors3
db $03, $06, $09
db $FF
..areas2
db $03, $B0, $D0, $D0, $FF
db $03, $30, $50, $00, $28
db $FF
..doors2
db $00, $08
db $FF
.1a ; PoD Big Chest (2) // Falling bridge and such (1)
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items)
%d(..chests) : %d(.no_items) : %d(.no_items)
..areas
db $03, $00, $2C, $70, $98
db $FF
..doors
db $04
db $FF
..chests
db $00
db $FF
.2a ; PoD Arena Right-Side Chest (2) // Arena (1)
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items)
%d(..chests) : %d(.no_items) : %d(.no_items)
..areas
db $03, $D8, $FF, $A8, $C8
db $FF
..doors
db $0B
db $FF
..chests
db $00
db $FF
.35 ; Swamp BK Chest (2) // Swamp second trench (1)
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items)
%d(..chests) : %d(..pots) : %d(.no_items)
..areas
db $03, $00, $70, $00, $80
db $FF
..doors
db $03
db $FF
..chests
db $00
db $FF
..pots
db $01, $02, $03, $04, $05
db $FF
.36 ; Swamp Big Lobby (1) // Tiny Top-Right Blocked Corner (2)
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items)
%d(.no_items) : %d(..pots) : %d(.no_items)
..areas
db $03, $D4, $FF, $00, $48
db $FF
..doors
db $09
db $FF
..pots
db $00, $01
db $FF
.37 ; Swamp Second Chest (2) // Swamp first trench (1)
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items)
%d(..chests) : %d(.no_items) : %d(..enemies)
..areas
db $03, $90, $FF, $00, $80
db $FF
..doors
db $09
db $FF
..chests
db $00
db $FF
..enemies
db $02, $03
db $FF
.57 ; SW pot cage (2) // middle section (1)
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items)
%d(..chests) : %d(..pots) : %d(..enemies)
..areas
db $03, $80, $FF, $80, $FF
db $FF
..doors
db $08, $0B
db $FF
..chests
db $01
db $FF
..pots
db $02, $03, $04, $05
db $FF
..enemies
db $08, $09, $0A, $0B
db $FF
.6a ; pre-helmasaur-king (2) // PoD rupee basement (1)
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items)
%d(.no_items) : %d(.no_items) : %d(..enemies)
..areas
db $03, $B4, $C4, $00, $B4
db $03, $A8, $D0, $B0, $D0
db $FF
..doors
db $02
db $FF
..enemies
db $00, $01, $04, $05
db $FF
.74 ; desert north -- trapped area (2) // everything else (1)
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items)
%d(.no_items) : %d(.no_items) : %d(..enemies)
..areas
db $03, $4C, $C4, $CC, $FF
db $FF
..doors
db $07
db $FF
..enemies
db $06, $07
db $FF
.75 ; desert cannonball (2) // desert northeast + trap room (1)
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items) : %d(..chests) : %d(.no_items) : %d(..enemies)
..areas
db $03, $80, $FF, $00, $FF
db $FF
..doors
db $08
db $FF
..chests
db $00
db $FF
..enemies
db $06, $07
db $FF
.7b ; GT post-compass (3) // island hardhat (2) // DMs room (1)
db $02
%sq($00)
%d(..areas3) : %d(..doors3) : %d(.no_items)
%d(.no_items) : %d(..pots3) : %d(..enemies3)
%sq($00)
%d(..areas2) : %d(..doors2) : %d(.no_items)
%d(.no_items) : %d(.no_items) : %d(..enemies2)
..areas3
db $03, $00, $FF, $00, $80
db $FF
..doors3
db $09
db $FF
..pots3
db $00, $01, $02, $03, $04
db $FF
..enemies3
db $00, $01
db $FF
..areas2
db $03, $80, $FF, $80, $FF
db $FF
..doors2
db $0B
db $FF
..enemies2
db $06, $07
db $FF
.7c ; GT falling bridge // rando room
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items)
%d(.no_items) : %d(..pots) : %d(..enemies)
..areas
db $03, $00, $80, $00, $FF
db $FF
..doors
db $03, $05
db $FF
..pots
db $00, $01, $02, $03
db $FF
..enemies
db $01, $02, $03, $04
db $FF
.7d ; GT warp maze (section next to rando room)
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items)
%d(..chests) : %d(..pots) : %d(..enemies)
..areas
db $03, $00, $FF, $00, $80
db $03, $00, $80, $80, $FF
db $03, $CA, $DA, $9A, $A6
db $FF
..doors
db $05
db $FF
..chests
db $00
db $FF
..pots
db $00, $01, $02, $03
db $FF
..enemies
db $00, $01, $02, $03, $09
db $FF
.82 ; HC Basement (1) + catwalk (2)
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items)
%d(.no_items) : %d(.no_items) : %d(.no_items)
..areas
db $03, $00, $20, $00, $50
db $FF
..doors
db $00, $03
db $FF
.87 ; Hera basement: cage (0) // torches (1)
db $01
%sq($08)
%d(..areas) : %d(.no_items) : %d(..stairs)
%d(..chests) : %d(..pots) : %d(..enemies)
..areas
db $03, $00, $FF, $00, $80
db $03, $80, $FF, $80, $FF
db $FF
..stairs
db $00
db $FF
..chests
db $00
db $FF
..pots
db $00, $01, $02, $03, $04, $05, $06, $07
db $FF
..enemies
db $00, $01, $02, $05, $06, $09, $0C
db $FF
.8c
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items)
%d(..chests) : %d(..pots) : %d(..enemies)
..areas
db $03, $80, $FF, $80, $FF
db $FF
..doors
db $08
db $FF
..chests
db $03
db $FF
..pots
db $02, $03, $04, $05, $06
db $FF
..enemies
db $06, $07, $09
db $FF
.9d
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items)
%d(.no_items) : %d(.no_items) : %d(..enemies)
..areas
db $03, $00, $FF, $80, $FF
db $FF
..doors
db $05
db $FF
..enemies
db $06, $07, $08
db $FF
.a2 ; Mire abyss -- EW bridge (2), stairs to basement + hookable chest (1)
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items)
%d(.no_items) : %d(.no_items) : %d(.no_items)
..areas
db $01, $00, $FF, $70, $84
db $FF
..doors
db $04, $0A
db $FF
.a9
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items) : %d(.no_items) : %d(..pots) : %d(.no_items)
..areas
db $03, $00, $40, $70, $FF
db $03, $00, $FF, $A0, $FF
db $03, $C0, $FF, $70, $FF
db $FF
..doors
db $04, $07, $0A
db $FF
..pots
db $04, $05, $06, $07
db $FF
.aa
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items) : %d(.no_items) : %d(.no_items) : %d(.no_items)
..areas
db $02, $00, $80, $00, $FF
db $01, $34, $D4, $B8, $FF
db $FF
..doors
db $03, $06
db $FF
.b2
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items) : %d(.no_items) : %d(..pots) : %d(..enemies)
..areas
db $02, $00, $FF, $00, $80
db $03, $60, $A0, $00, $40
db $FF
..doors
db $01, $09
db $FF
..pots
db $00, $01, $02, $03, $04, $05, $06
db $FF
..enemies
db $00, $01, $02, $03, $04
db $FF
.b6
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items)
%d(.no_items) : %d(..pots) : %d(..enemies)
..areas
db $03, $80, $FF, $00, $FF
db $FF
..doors
db $08
db $FF
..pots
db $00
db $FF
..enemies
db $04
db $FF
.b9
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items) : %d(.no_items) : %d(.no_items) : %d(.no_items)
..areas
db $01, $00, $20, $28, $60
db $01, $E0, $FF, $28, $60
db $01, $00, $FF, $58, $60
db $FF
..doors
db $03, $09
db $FF
.bc
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items) : %d(.no_items) : %d(..pots) : %d(.no_items)
..areas
db $03, $2C, $4C, $CA, $FF
db $FF
..doors
db $06
db $FF
..pots
db $0C, $0D
db $FF
.c7 ; TR Torch Maze (1) // Tiny Bottom-Left Blocked Corner (2)
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items)
%d(.no_items) : %d(..pots) : %d(.no_items)
..areas
db $03, $00, $1C, $A8, $FF
db $FF
..doors
db $05
db $FF
..pots
db $02, $03
db $FF
.d1
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items)
%d(.no_items) : %d(..pots) : %d(..enemies)
..areas
db $03, $80, $FF, $00, $A8
db $FF
..doors
db $02
db $FF
..pots
db $02, $03, $04, $05
db $FF
..enemies
db $00, $01, $07
db $FF
.d6
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items)
%d(..chests) : %d(.no_items) : %d(..enemies)
..areas
db $03, $00, $80, $00, $FF
db $FF
..doors
db $00
db $FF
..chests
db $00
db $FF
..enemies
db $00, $01, $02
db $FF
.db
db $01
%sq($00)
%d(..areas) : %d(..doors) : %d(.no_items)
%d(..chests) : %d(.no_items) : %d(.no_items)
..areas
db $02, $B0, $FF, $90, $C0
db $FF
..doors
db $0B
db $FF
..chests
db $01
db $FF

View File

@@ -0,0 +1,258 @@
dw $FFFF, $83A5, $FFFF, $FFFF ; 00
dw $C388, $8388, $FFFF, $FFFF ; 01
dw $4348, $034A, $4342, $0342 ; 02
dw $FFFF, $FFFF, $438F, $FFFF ; 03 - Houlihan
dw $039A, $038F, $4365, $C39B ; 04
dw $FFFF, $FFFF, $FFFF, $FFFF ; 05 - unused
dw $FFFF, $FFFF, $438F, $FFFF ; 06 - Arrghus
dw $0100, $0101, $4111, $0111 ; 07 - Moldorm
dw $FFFF, $FFFF, $43B2, $03B2 ; 08 - useless fairy entrance
dw $C3A6, $837B, $FFFF, $FFFF ; 09
dw $C398, $835F, $FFFF, $FFFF ; 0A
dw $039B, $439C, $839B, $0381 ; 0B
dw $C371, $8371, $4354, $0354 ; 0C
dw $FFFF, $FFFF, $438F, $FFFF ; 0D - Aga 2
dw $FFFF, $FFFF, $8399, $439B ; 0E
dw $FFFF, $FFFF, $FFFF, $FFFF ; 0F - unused and should never be used, treated as non-id
dw $C340, $8340, $4350, $0340 ; 10
dw $83B7, $C3AC, $03B7, $438A ; 11
dw $C354, $8354, $4354, $0354 ; 12
dw $FFFF, $83B7, $FFFF, $03B7 ; 13
dw $012E, $012F, $013E, $013F ; 14
dw $C374, $8340, $4341, $0340 ; 15
dw $0108, $0109, $436B, $036B ; 16
dw $4104, $0104, $4114, $0114 ; 17
dw $C3B5, $FFFF, $43B4, $FFFF ; 18 - useless fairy drop
dw $FFFF, $8369, $FFFF, $035A ; 19
dw $03E7, $03E8, $03F7, $0361 ; 1A
dw $039B, $439C, $4361, $FFFF ; 1B
dw $038F, $038F, $037E, $C39B ; 1C
dw $C3B2, $83A7, $FFFF, $FFFF ; 1D
dw $FFFF, $4391, $0122, $0123 ; 1E
dw $FFFF, $FFFF, $4360, $C399 ; 1F
dw $FFFF, $FFFF, $438F, $FFFF ; 20
dw $4348, $0363, $C348, $8368 ; 21
dw $FFFF, $FFFF, $4368, $0348 ; 22
dw $FFFF, $FFFF, $FFFF, $039B ; 23
dw $4365, $0365, $0132, $0133 ; 24
dw $FFFF, $FFFF, $FFFF, $FFFF ; 25 - unused
dw $039B, $03E4, $4363, $0382 ; 26
dw $4104, $0104, $4114, $0114 ; 27
dw $C3A5, $FFFF, $4358, $0348 ; 28
dw $FFFF, $FFFF, $FFFF, $0396 ; 29 - Mothula
dw $C350, $8352, $4350, $03F8 ; 2A
dw $C36A, $FFFF, $03F9, $C38D ; 2B
dw $C340, $8340, $4350, $0350 ; 2C - hookshot cave back
dw $FFFF, $FFFF, $FFFF, $FFFF ; 2D - unused
dw $FFFF, $838F, $FFFF, $FFFF ; 2E
dw $C3B4, $FFFF, $436E, $03B2 ; 2F - Kakariko well
dw $C361, $FFFF, $839A, $FFFF ; 30 - inset stairs if possible
dw $0124, $0125, $0134, $0135 ; 31
dw $43C4, $03C4, $43D4, $03D4 ; 32
dw $FFFF, $FFFF, $438F, $FFFF ; 33
dw $0129, $012A, $0139, $013A ; 34
dw $C38D, $039B, $43B1, $037D ; 35
dw $0118, $0119, $0128, $4128 ; 36
dw $439B, $838D, $437D, $03B1 ; 37
dw $C3AC, $FFFF, $43B7, $FFFF ; 38
dw $FFFF, $FFFF, $039B, $0381 ; 39
dw $03C2, $03C3, $43D3, $03D3 ; 3A - make bespoke if feasible
dw $C3A5, $FFFF, $43B5, $FFFF ; 3B - inset stairs if feasible
dw $C340, $8350, $4340, $0350 ; 3C - hookshot cave front
dw $039B, $439B, $0361, $838E ; 3D
dw $FFFF, $438F, $43B2, $0373 ; 3E
dw $FFFF, $FFFF, $0130, $C399 ; 3F
dw $C3A5, $FFFF, $4372, $C399 ; 40 - inset stairs if feasible
dw $03C5, $03C6, $03D5, $03D6 ; 41
dw $03E9, $03EA, $FFFF, $FFFF ; 42
dw $C3B2, $03B2, $FFFF, $0361 ; 43
dw $038D, $839F, $838D, $039F ; 44
dw $C3AB, $83B4, $4364, $43B7 ; 45
dw $C375, $8375, $4373, $0373 ; 46
dw $FFFF, $FFFF, $FFFF, $FFFF ; 47 - unused
dw $FFFF, $FFFF, $FFFF, $FFFF ; 48 - unused
dw $839B, $8372, $039B, $0372 ; 49
dw $03E2, $03E3, $0386, $4386 ; 4A
dw $C361, $4391, $4373, $0373 ; 4B
dw $FFFF, $83A5, $FFFF, $03B7 ; 4C
dw $0102, $0103, $0112, $0113 ; 4D
dw $839B, $439C, $FFFF, $FFFF ; 4E
dw $FFFF, $8396, $838D, $FFFF ; 4F
dw $FFFF, $83B7, $FFFF, $03B5 ; 50
dw $C354, $8354, $4384, $0384 ; 51
dw $C3B7, $FFFF, $4359, $0348 ; 52
dw $039A, $83B5, $839B, $43B7 ; 53
dw $C390, $8390, $4380, $0340 ; 54
dw $C340, $8340, $4350, $0340 ; 55 - secret passage
dw $038F, $83B4, $4365, $039F ; 56
dw $039B, $438D, $0365, $039B ; 57
dw $C372, $439B, $0383, $0365 ; 58 - split
dw $838A, $8372, $03D1, $0372 ; 59
dw $FFFF, $FFFF, $FFFF, $038F ; 5A - Helmasaur King
dw $FFFF, $83B7, $FFFF, $03B5 ; 5B
dw $C3B1, $83AA, $FFFF, $838F ; 5C
dw $039B, $C399, $0361, $FFFF ; 5D
dw $FFFF, $0110, $839C, $0123 ; 5E
dw $FFFF, $FFFF, $43BB, $FFFF ; 5F
dw $FFFF, $8379, $FFFF, $036A ; 60
dw $C387, $8385, $4356, $0356 ; 61
dw $C346, $8354, $4352, $0340 ; 62
dw $039A, $FFFF, $0361, $FFFF ; 63
dw $FFFF, $FFFF, $8399, $0367 ; 64
dw $FFFF, $FFFF, $0367, $0381 ; 65
dw $038F, $039A, $0362, $83B2 ; 66
dw $83B4, $83B5, $03B7, $039F ; 67
dw $C340, $8350, $4341, $0340 ; 68
dw $FFFF, $FFFF, $FFFF, $FFFF ; 69 - unused
dw $FFFF, $03E1, $FFFF, $03F1 ; 6A
dw $039A, $0361, $839B, $C39B ; 6B
dw $039A, $FFFF, $839B, $0360 ; 6C - Lanmolas 2
dw $0361, $FFFF, $C39B, $FFFF ; 6D
dw $FFFF, $838E, $FFFF, $FFFF ; 6E
dw $FFFF, $FFFF, $FFFF, $FFFF ; 6F - unused
dw $43BA, $FFFF, $FFFF, $FFFF ; 70
dw $039A, $FFFF, $4365, $438D ; 71
dw $437A, $037A, $03C1, $0342 ; 72 - slight cheating I guess...
dw $038F, $038F, $839B, $0366 ; 73
dw $43B2, $03B2, $43A8, $03A8 ; 74
dw $038F, $83B4, $0365, $03B5 ; 75
dw $010D, $010E, $011D, $011E ; 76
dw $0126, $0127, $4137, $0137 ; 77
dw $FFFF, $FFFF, $FFFF, $FFFF ; 78 - unused
dw $FFFF, $FFFF, $FFFF, $FFFF ; 79 - unused
dw $FFFF, $FFFF, $FFFF, $FFFF ; 7A - unused
dw $0106, $0107, $438F, $4381 ; 7B
dw $C3B7, $83B4, $43B7, $03B7 ; 7C
dw $43B2, $835E, $034C, $0391 ; 7D
dw $FFFF, $83B7, $4393, $438A ; 7E
dw $439B, $FFFF, $838E, $FFFF ; 7F
dw $C3A7, $83B0, $FFFF, $FFFF ; 80
dw $C350, $8341, $4340, $0341 ; 81
dw $C39D, $8354, $4341, $0340 ; 82
dw $038F, $83B5, $4365, $43B7 ; 83
dw $C344, $8345, $4354, $0354 ; 84
dw $C38B, $C39B, $03B7, $439B ; 85
dw $FFFF, $FFFF, $FFFF, $FFFF ; 86 - unused
dw $0136, $0117, $4394, $838F ; 87
dw $FFFF, $FFFF, $FFFF, $FFFF ; 88 - unused
dw $C3B0, $83B0, $FFFF, $FFFF ; 89
dw $FFFF, $FFFF, $FFFF, $FFFF ; 8A - unused
dw $838A, $0360, $038A, $438D ; 8B
dw $83BE, $83BF, $03BD, $0391 ; 8C
dw $0360, $C38A, $038D, $438A ; 8D
dw $FFFF, $838E, $FFFF, $FFFF ; 8E
dw $FFFF, $FFFF, $FFFF, $FFFF ; 8F - unused
dw $FFFF, $FFFF, $438F, $FFFF ; 90
dw $FFFF, $83A5, $FFFF, $03B7 ; 91
dw $03D2, $C3B7, $0364, $039F ; 92
dw $C36C, $836C, $C39B, $838F ; 93
dw $FFFF, $FFFF, $FFFF, $FFFF ; 94 - unused
dw $FFFF, $83B7, $FFFF, $03B5 ; 95
dw $010F, $FFFF, $011F, $C39C ; 96
dw $039A, $83B4, $839B, $036F ; 97
dw $FFFF, $FFFF, $43B2, $0397 ; 98
dw $FFFF, $038F, $434A, $0363 ; 99
dw $FFFF, $FFFF, $FFFF, $FFFF ; 9A - unused
dw $839B, $0381, $435E, $0378 ; 9B
dw $C350, $8350, $4341, $0341 ; 9C
dw $0116, $83B2, $43B1, $035E ; 9D
dw $FFFF, $439A, $838D, $03B9 ; 9E
dw $FFFF, $FFFF, $439B, $FFFF ; 9F
dw $839B, $C39C, $FFFF, $FFFF ; A0
dw $C3B0, $835D, $FFFF, $036A ; A1
dw $03EE, $03EF, $03FE, $03FF ; A2
dw $C35A, $FFFF, $436A, $FFFF ; A3
dw $FFFF, $FFFF, $438F, $FFFF ; A4
dw $039A, $0361, $C3B2, $83B2 ; A5
dw $C340, $8370, $4340, $0340 ; A6
dw $C396, $FFFF, $FFFF, $FFFF ; A7 - ToH fairy basement room
dw $039B, $03E5, $839B, $03F5 ; A8
dw $C357, $8357, $4356, $0356 ; A9
dw $03E6, $439B, $03F6, $C39B ; AA
dw $FFFF, $FFFF, $439A, $FFFF ; AB
dw $FFFF, $FFFF, $FFFF, $038F ; AC - Blind
dw $FFFF, $FFFF, $FFFF, $FFFF ; AD - unused
dw $FFFF, $8399, $FFFF, $FFFF ; AE
dw $C39B, $FFFF, $FFFF, $FFFF ; AF
dw $039B, $C399, $839B, $C399 ; B0
dw $0391, $83B5, $434C, $438A ; B1
dw $C35C, $83A2, $039B, $0366 ; B2
dw $0365, $FFFF, $0365, $FFFF ; B3
dw $03FA, $83FD, $03EC, $03ED ; B4
dw $03EB, $83FD, $83FA, $03FD ; B5
dw $039A, $038F, $0361, $0361 ; B6
dw $C3B4, $FFFF, $43B5, $FFFF ; B7
dw $FFFF, $838A, $FFFF, $03B4 ; B8
dw $43F3, $03F3, $4354, $0354 ; B9
dw $0364, $438D, $FFFF, $FFFF ; BA
dw $838A, $8364, $4372, $0364 ; BB
dw $83BE, $C38A, $03D0, $438A ; BC
dw $FFFF, $FFFF, $FFFF, $FFFF ; BD - unused
dw $FFFF, $439A, $FFFF, $C365 ; BE
dw $FFFF, $FFFF, $438D, $FFFF ; BF
dw $C372, $C399, $4372, $C399 ; C0
dw $039B, $0364, $4365, $8364 ; C1
dw $C351, $8353, $4341, $0353 ; C2
dw $03E0, $C369, $03F0, $4369 ; C3 - show layers
dw $43C0, $03C0, $4340, $0341 ; C4
dw $C3B5, $FFFF, $438A, $FFFF ; C5
dw $03FA, $03FB, $83FA, $83FB ; C6
dw $43FB, $83FD, $03FC, $03FD ; C7
dw $FFFF, $FFFF, $FFFF, $038F ; C8 - Armos Knights
dw $03F2, $43F2, $0386, $4386 ; C9
dw $FFFF, $FFFF, $FFFF, $FFFF ; CA - unused
dw $C340, $8343, $4354, $0347 ; CB
dw $C353, $8350, $4347, $0354 ; CC
dw $FFFF, $FFFF, $FFFF, $FFFF ; CD - unused
dw $FFFF, $8391, $FFFF, $FFFF ; CE - Kholdstare drop
dw $FFFF, $FFFF, $FFFF, $FFFF ; CF - unused
dw $C372, $C399, $4372, $C399 ; D0
dw $C38E, $838F, $4381, $C38D ; D1
dw $FFFF, $83B5, $FFFF, $0395 ; D2
dw $FFFF, $FFFF, $FFFF, $FFFF ; D3 - unused
dw $FFFF, $FFFF, $FFFF, $FFFF ; D4 - unused
dw $C3B5, $FFFF, $43B5, $FFFF ; D5
dw $C3B5, $010A, $43B4, $011A ; D6
dw $FFFF, $FFFF, $FFFF, $FFFF ; D7 - unused
dw $FFFF, $8361, $FFFF, $839B ; D8
dw $FFFF, $FFFF, $4360, $0360 ; D9
dw $FFFF, $FFFF, $439C, $FFFF ; DA
dw $C354, $8346, $4354, $037F ; DB
dw $C346, $8354, $4343, $0340 ; DC
dw $FFFF, $FFFF, $FFFF, $FFFF ; DD - unused
dw $FFFF, $8396, $FFFF, $FFFF ; DE - Kholdstare
dw $FFFF, $FFFF, $43A0, $0354 ; DF - paradox top
dw $039B, $C399, $0361, $FFFF ; E0
; no more dungeon
dw $C340, $8340, $4350, $0340 ; E1 - lost woods thieves hideout
dw $C340, $8340, $4340, $0350 ; E2 - lumberjack cave
dw $FFFF, $83B4, $43B2, $036E ; E3 - magic bat
dw $C340, $8342, $4350, $0342 ; E4 - old man's house front
dw $C342, $8340, $4356, $0354 ; E5 - old man's house back
dw $C340, $8341, $4350, $0340 ; E6 - death mountain descent left
dw $C341, $8340, $4340, $0350 ; E7 - death mountain descent right
dw $C370, $8370, $4380, $0350 ; E8 - superbunny top
dw $FFFF, $FFFF, $FFFF, $FFFF ; E9 - unused
dw $C3A5, $FFFF, $43B5, $FFFF ; EA - spectacle top
dw $FFFF, $83A6, $FFFF, $03B5 ; EB - bumper top
dw $FFFF, $FFFF, $FFFF, $FFFF ; EC - unused
dw $C370, $8370, $4340, $0350 ; ED - fairy ascension top
dw $C340, $8390, $4340, $0350 ; EE - spiral top
dw $FFFF, $8340, $43A0, $0354 ; EF - paradox top
dw $C340, $8342, $4350, $0342 ; F0 - old man rescue left
dw $C342, $8342, $4340, $0350 ; F1 - old man rescue right
dw $FFFF, $FFFF, $FFFF, $03B2 ; F2 - Sahasrahla's Kakariko house left
dw $FFFF, $FFFF, $43B2, $FFFF ; F3 - Sahasrahla's Kakariko house right
dw $FFFF, $FFFF, $FFFF, $03B2 ; F4 - quarreling brothers left
dw $FFFF, $FFFF, $43B2, $FFFF ; F5 - quarreling brothers right
dw $FFFF, $FFFF, $FFFF, $FFFF ; F6 - unused
dw $FFFF, $FFFF, $FFFF, $FFFF ; F7 - unused
dw $C370, $8370, $43A0, $0354 ; F8 - superbunny bottom
dw $C340, $8341, $4350, $0340 ; F9 - spectacle left
dw $C374, $8340, $4350, $0340 ; FA - spectacle bottom
dw $FFFF, $83A5, $4348, $0358 ; FB - bumper bottom
dw $FFFF, $FFFF, $FFFF, $FFFF ; FC - unused
dw $C370, $8370, $4354, $0354 ; FD - fairy ascension bottom
dw $FFFF, $FFFF, $43B4, $03B5 ; FE - spiral bottom
dw $C3B4, $83B4, $436E, $036D ; FF - paradox bottom

2236
gk/doors_dungeon_map.asm Normal file

File diff suppressed because it is too large Load Diff

163
gk/draw_loot.asm Normal file
View File

@@ -0,0 +1,163 @@
RedrawLoot:
JSL DrawLoot
; what we wrote over
SEP #$20
STZ.w $0210
RTL
FirstDrawLoot:
LDA.b #$FF
STA.w $0215
LDA.b #$80
STA.w $0216
STA.w $0218
LDA.l DRMode
BEQ +
LDA.w DungeonID
ASL A
TAX
LDA.l DungeonMapData.floor, X
STA.b $A4
+
; what we wrote over
LDA.b #$08
STA.b $17
DrawLoot:
LDA.b $07
STA.w $021B
LDA.l DRMode
BNE .skip
REP #$30
PHX : PHY
STZ.b $0E
LDX.w DungeonID
LDA.l DungeonMapRoomPointers, X
STA.b $72
SEP #$20
LDA.l DungeonMapFloorCountData, X
AND.b #$0F
CLC : ADC.w DungeonMapCurrentFloor
PHA
JSR DrawSingleFloorLoot
INC.b $0F
LDA.b #$80
STA.b $0E
PLA : DEC A
JSR DrawSingleFloorLoot
LDX.w GFXStripes
LDA.b #$FF
STA.w GFXStripes+$02, X
LDA.b #$01
STA.b NMISTRIPES
PLY : PLX
.skip
LDA.b #$00
RTL
DrawSingleFloorLoot:
REP #$20
AND.w #$00FF
ASL A
TAX
LDA.l DungeonMapFloorToDataOffset, X
CLC : ADC.w #$0018 ; get to end of floor
TAY
SEP #$20
LDA.b #$04
STA.b $06
LDA.b #$04
STA.b $07
.next_row
REP #$20
LDA.w GFXStripes
TAX
CLC : ADC.w #$0030
STA.w GFXStripes
SEP #$20
LDA.b $07
CLC : ADC.b $07
REP #$20
AND.w #$00FF
ASL #5
CLC : ADC.w #$1092
ADC.b $0E
XBA
STA.w GFXStripes+$02, X
CLC : ADC.w #$2000
STA.w GFXStripes+$1A, X
LDA.w #$1300
STA.w GFXStripes+$04, X
STA.w GFXStripes+$1C, X
TXA
CLC : ADC.w #$0016
TAX
.next_room
REP #$20
LDA.b ($72), Y ; get room id
PHY
AND.w #$00FF
CMP.w #$000F ; $0F = empty room
BNE .valid_room
LDA.w #$0000
BRA +
.valid_room
JSL CheckLoot
+
ASL A : ASL A : ASL A
TXY
TAX
LDA.l LootTypeIcons+0, X
STA.w GFXStripes+$00, Y
LDA.l LootTypeIcons+2, X
STA.w GFXStripes+$02, Y
LDA.l LootTypeIcons+4, X
STA.w GFXStripes+$18, Y
LDA.l LootTypeIcons+6, X
STA.w GFXStripes+$1A, Y
TYX
PLY
DEY : DEX #4
SEP #$20
DEC.b $06
BPL .next_room
DEC.b $07
BMI .done
LDA.b #$00
XBA
LDA.b #$04
STA.b $06
JMP .next_row
.done
RTS

275
gk/draw_rooms.asm Normal file
View File

@@ -0,0 +1,275 @@
DrawNonexistentRoom:
REP #$20
LDA.w #$0F00
STA.l $7F0000, X
STA.l $7F0002, X
STA.l $7F0040, X
STA.l $7F0042, X
JML $8AE7F2
GetVisibilityProps:
PHX
ASL A : ASL A
TAX
LDA.b $0C
AND.l .visibility_props, X
ORA.l .visibility_props+2, X
STA.b $0C
PLX
RTS
.visibility_props:
dw $0000, $0F00
dw $C000, $174F
dw $C000, $174F
dw $0000, $1400
dw $0000, $1000
dw $0000, $0C00
dw $0000, $0800
; A = room shape
; $0C = visibility props
GetQuadrantTile:
PHA
LDA.b $0C
AND.w #$03FF
BNE .square
PLA
ORA.b $0C
RTS
.square
PLA
LDA.b $0C
RTS
NormalDrawDungeonMapRoom:
JSL DrawDungeonMapRoom
JML $8AE7F2
; $CA has room_id
; $0E has quadrant flags
; X has address to draw at
DrawDungeonMapRoom:
REP #$20
PHB : PHK : PLB ; need to keep this in same bank as data, or else specify bank
LDA.b $0A : PHA
JSR GetSpecificRoomVisibility
LDA.b $CA
AND.w #$00FF
ASL A : ASL A : ASL A
TAY
macro DrawQuadrant(quadrant, writeOffset)
.draw_quadrant_<quadrant>:
LDA.w #(3-<quadrant>)<<14
STA.b $0C
LDA.b $0E
BIT.w #1<<(3-<quadrant>)
BNE ..visited
LDA.b $0A
BRA ..continue
..visited
LDA.b $0B
..continue
AND.w #$00FF
JSR GetVisibilityProps
LDA.w SupertileRoomShapes+(2*<quadrant>), Y
CMP.w #$FFFF : BNE ..get_quadrant
LDA.b $0A
AND.w #$00FF
CMP.w #$0001
BNE ..empty
..full_square
LDA.b $0C
BRA ..write
..get_quadrant
JSR GetQuadrantTile
BRA ..write
..empty
LDA.w #$0F00
..write
STA.l $7F0000+<writeOffset>, X
endmacro
%DrawQuadrant(0, $00)
%DrawQuadrant(1, $02)
%DrawQuadrant(2, $40)
%DrawQuadrant(3, $42)
.done
PLA : STA.b $0A
PLB
RTL
DrawEntrances:
REP #$30
PHX : PHY
LDA.b $06 : PHA
LDX.w DungeonID
LDA.l DungeonMapRoomPointers, X
STA.b $72
SEP #$20
LDA.l DungeonMapFloorCountData, X
AND.b #$0F
CLC : ADC.w DungeonMapCurrentFloor
REP #$20
AND.w #$00FF
STZ.b $02
PHA
JSR DrawSingleFloorEntrances
INC.b $02
INC.b $02
PLA
DEC A
JSR DrawSingleFloorEntrances
.done
REP #$20
PLA : STA.b $06
PLY : PLX
SEP #$30
RTL
DrawSingleFloorEntrances:
ASL A
TAX
LDA.l DungeonMapFloorToDataOffset, X
TAY
STZ.b $06
.next_room
REP #$20
LDA.b ($72), Y ; get room id
AND.w #$00FF
CMP.w #$000F ; $0F = empty room
BEQ +
JSR DrawSingleRoomEntrances
+
INY
SEP #$20
INC.b $06
LDA.b $06
CMP.b #$05
BCC .next_room
STZ.b $06
- INC.b $07
LDA.b $07
CMP.b #$05
BCC .next_room
.done
REP #$20
RTS
macro DrawSingleEntrance(offset)
LDY.b $00
LDA.b #$00
STA.w OAMBufferAux, Y ; high x-bit and size bit
TYA
ASL #2
TAY
LDA.b $06
CPX.b #$02
BNE ?+
ASL A
?+
CLC : ADC.b $06
ASL #3
CLC : ADC.b #$90+<offset>
STA.w OAMBuffer+0, Y
PHX
LDA.b $07
CPX.b #$02
BNE ?+
ASL A
?+
CLC : ADC.b $07
ASL #3
LDX.b $02
CLC : ADC.l DungeonMapRoomMarkerYBase, X
PLX
CLC : ADC.b #$08
CLC : ADC.w $0213
SEC : SBC.b $E8
STA.w OAMBuffer+1, Y
LDA.b #$33
STA.w OAMBuffer+2, Y
LDA.b #$23
STA.w OAMBuffer+3, Y
INC.b $00
endmacro
DrawSingleRoomEntrances:
STA.b $0E
PHY
SEP #$10
LDX.b #$FE
.next_entry
INX : INX
LDA.l SupertileEntrances, X
BPL +
JMP .done
+
AND.w #$0FFF
CMP.b $0E
BNE .next_entry
SEP #$20
LDA.l SupertileEntrances+1, X
TYX
PHA : PHA
BIT.b #$40
BEQ +
%DrawSingleEntrance(0)
+
PLA
BIT.b #$20
BEQ +
%DrawSingleEntrance(4)
+
PLA
BIT.b #$10
BEQ +
%DrawSingleEntrance(8)
+
.done
REP #$30
PLY
RTS

214
gk/dungeon_map_hooks.asm Normal file
View File

@@ -0,0 +1,214 @@
; move aga boss icon to correct room
org $8AEE75
db $08
; use AA1 = $1C for map stuff
org $80E193
skip 4
db $61, $62, $63, $D6
org $8AE11D
LDA.b #$1C
org $8AE12B
LDA.b #$20
; dungeon map sheets
org $80DDD3 ; slot $8F
db $61, $56, $57, $62
; always use $8F in dungeon map
org $8AE122
NOP #4
LDA.b #$8F
; unused chest data
org $81E9A5
dw $000F ; freezor room, second chest (only one chest in supertile)
org $81EA6E
dw $000F ; mire spike room, second chest (only one chest in supertile)
org $81EAF8
dw $000F ; GT button/switch/bladetrap room (no chest in supertile)
; Dungeon Map Palettes 2-5 left half
org $9BE544
dw $0000, $71E7, $7FFF, $3B5F, $0000, $0000, $7EB5, $1CE7
org $9BE564
dw $0000, $5565, $7FFF, $331C, $0000, $0000, $7E27, $0C63
org $9BE584
dw $0000, $4100, $7FFF, $2656, $4100, $0000, $4100, $4100
org $9BE5A4
dw $0000, $34E0, $7FFF, $34E0, $34E0, $0000, $34E0, $34E0
; move BG1 to main screen in dungeon map screen
org $8AE130
LDA.b #$17 : STA.b $1C
LDA.b #$00 : STA.b $1D
; make skull icon blink opposite our loot icons
org $8AEE2B
AND.b #$10
NOP #2
db $F0 ; BEQ to replace BCS
;================================================================================
; Overhaul of Dungeon Map Screen
;--------------------------------------------------------------------------------
org $8AE64D
PLX
JML NormalDrawDungeonMapRoom
org $8AE606
PLX
JML DrawNonexistentRoom
org $8AE152
JSL LoadLastHUDPalette
org $808BD3
JSL LoadStripes
BRA + : NOP #9 : +
org $8AEAE8 ; vanilla checks number of sprites drawn instead of... counting...
LDA.b $0E
CMP.b #$02
;================================================================================
; Swapping Dungeon in Dungeon Map Screen (L/R)
;--------------------------------------------------------------------------------
org $8AE9A7
JSL CheckSwitchMap
BRA + : NOP #3 : +
org $8AEF06
DEC.b $13
BNE +
JML DungeonMapSwitch_Submodule
+ RTL
warnpc $8AEF29
org $8AEADA
JML SkipMapSprites
org $8AE9C7
JSL RestoreDungeonMapFloorIndex
NOP
org $98BC86
JSL CacheCurrentDungeon
org $8AEFC5
JSL RestoreCurrentDungeon
NOP
org $8AE1EC
PLB
JML DrawDungeonLabel
org $8AE83E
JSL StartCurrentRoomSearch
BRA + : NOP #6 : +
org $8AE86C
JML FindCurrentRoom
padbyte $EA
pad $8AE891
org $8AEBF8
LDA.w $0217
SEC : SBC.b $0F
BMI +
CMP.b #$18
BCS +
skip 7
+
org $8AEB9A
db -8, 8, -8, 8
db -8, -8, 8, 8
;================================================================================
; Show indicators of what is left in each room
;--------------------------------------------------------------------------------
org $8AEABA
JSL RedrawLoot
NOP
org $8AE42B
JSL FirstDrawLoot
;================================================================================
; Blink indicators of what is left in each room
;--------------------------------------------------------------------------------
org $8AE964
JSL BlinkLoot
org $8AE235
JSL WriteBigEndianAddressX
org $8AE290
JSL WriteBigEndianAddressY
org $8AE350
JSL WriteBigEndianAddressY
org $8AE206
JSL StartDoubleWrite
NOP
org $8AE2E0
JML CheckDoubleWrite
NOP
org $8AE21C
JSL DrawMountain
BRA + : NOP #9 : +
;================================================================================
; Draw Wacky Door Rando Layouts
;--------------------------------------------------------------------------------
org $8AE3D7
LDA.l DRMode
BEQ +
JSL DrawWackyDoorRandoStuff
JMP.w $8AE422
NOP
+
warnpc $8AE3EB
org $8AE439
dw $0F19, $4F19, $8F19, $CF19
org $8AE449
dw $0F1A, $8F1A
org $8AE451
dw $0F1B, $4F1B
org $8AE473
NOP #2
org $8AE4A4
NOP #2
org $8AE4DC
NOP #2
org $8AE4F9
dw $0F1E, $0F1F, $0F20, $0F21
dw $0F22, $0F23, $0F24, $0F25
org $8AE539
LDA.w #$0F1C
org $8AE573
LDA.w #$0F1D
org $8AE555
NOP #2
org $8AE576
NOP #2

40
gk/dungeon_maps.asm Normal file
View File

@@ -0,0 +1,40 @@
pushpc
incsrc dungeon_map_hooks.asm
macro WriteGFXSheetPointer(sheet, location)
pushpc
org $80CFC0+<sheet>
db <location>>>16
org $80D09F+<sheet>
db <location>>>8
org $80D17E+<sheet>
db <location>>>0
pullpc
endmacro
%WriteGFXSheetPointer($C9, DungeonMapIcons1)
%WriteGFXSheetPointer($CA, DungeonMapIcons2)
%WriteGFXSheetPointer($D5, DungeonMapIcons3)
%WriteGFXSheetPointer($D4, MapSheetD4)
%WriteGFXSheetPointer($D6, DungeonMapDoorConnectors)
%WriteGFXSheetPointer($61, DungeonMapIcons4)
%WriteGFXSheetPointer($62, DungeonMapIcons5)
%WriteGFXSheetPointer($63, DungeonMapIcons6)
pullpc
incsrc doors_dungeon_map.asm
incsrc draw_rooms.asm
incsrc map_bg3.asm
incsrc dungeon_switch.asm
incsrc draw_loot.asm
incsrc check_loot.asm
incsrc blink_loot.asm
incsrc data/doors_display.asm
incsrc data/spiral_stairs.asm
incsrc data/fall_warps.asm
incsrc data/split_room.asm
incsrc data/doors_connections.asm

381
gk/dungeon_switch.asm Normal file
View File

@@ -0,0 +1,381 @@
CheckSwitchMap:
LDA.l DRMode
BEQ .not_fancy_door_map
; fancy door map
SEP #$20
LDA.b $F6
BIT.b #$30
BNE .change_dungeon
BIT.b #$80
BNE .select_new_room
LDA.b $F4
BIT.b #$80
BNE .select_new_room
BIT.b #$20
BNE .next_entrance
BIT.b #$40
BNE .current_room
AND.b #$0F
BEQ .doors_done
BIT.b #$08 : BEQ + : LDA.b #$00 : BRA .doors_move_cursor : +
BIT.b #$04 : BEQ + : LDA.b #$02 : BRA .doors_move_cursor : +
BIT.b #$02 : BEQ + : LDA.b #$01 : BRA .doors_move_cursor : +
LDA.b #$03
.doors_move_cursor
STA.b $00
JSL MoveDoorsMapCursor
BRA .doors_done
.select_new_room
JSL DoorsMapSelectCursor
BRA .doors_done
.next_entrance
JSL DoorsMapNextEntrance
BRA .doors_done
.change_dungeon
JSL DoorsMapChangeDungeon
BRA .doors_done
.current_room
LDA.l CachedDungeonID
CMP.w DungeonID
BNE .doors_done
JSL DoorsMapCurrentRoom
BRA .doors_done
.doors_done
REP #$20
LDA.w #$0002 ; ignore input! nothing to see here!
RTL
.not_fancy_door_map
SEP #$20
LDA.b $F6
AND.b #$30
BNE +
; what we wrote over
REP #$20
LDA.w DungeonMapFloorCountData, X
AND.w #$000F
CLC : ADC.b $00
RTL
+ PHA
TXA
ASL A
TAX
PLA
BIT.b #$20
BNE +
INX
+ LDA.l DungeonMapData.prev, X
STA.w DungeonID
LDA.b #$04
STA.w SubModuleInterface
REP #$20
LDA.w #$0000
RTL
DungeonMapSwitch_Submodule:
JSL $80893D
JSL $80833F
LDA.b #$09
STA.b $14
STA.w $0710
LDA.b #$01
STA.w SubModuleInterface
STA.w $020D
STZ.w $0213
STZ.w $021B
STZ.w $021C
STZ.b $06
STZ.b $07
LDA.w DungeonID
CMP.l CachedDungeonID
BEQ .current_dungeon
ASL A
TAX
LDA.l DungeonMapData.floor, X
STA.b CurrentFloor
BRA .continue
.current_dungeon
LDA.l CachedCurrentFloor
STA.b CurrentFloor
.continue
REP #$20
STZ.b $E0
STZ.b $E2
STZ.b $E4
STZ.b $E6
STZ.b $E8
STZ.b $EA
JML $98BCA1
SkipMapSprites:
STZ.b $00
LDA.b $02 : PHA
LDA.b $03 : PHA
LDA.b $04 : PHA
LDA.l DRMode
BNE +
LDA.w SubModuleInterface
CMP.b #$04
BEQ +
JSL DrawEntrances
+
PLA : STA.b $04
PLA : STA.b $03
PLA : STA.b $02
STZ.b $0E
STZ.b $0F
LDA.w SubModuleInterface
CMP.b #$04
BNE +
JML $8AEAFC
+
LDA.l DRMode
BEQ +
JSL DrawDoorsMapSprites
JML $8AEAFC
+
LDA.l CachedDungeonID
CMP.w DungeonID
BEQ +
JML $8AEAF3
+ JML $8AEADE
CacheCurrentDungeon:
STA.l $7EC206
SEP #$20
LDA.w DungeonID
STA.l CachedDungeonID
LDA.b CurrentFloor
STA.l CachedCurrentFloor
REP #$20
RTL
RestoreCurrentDungeon:
LDA.b #$F3
STA.w $012C ; what we wrote over
LDA.l CachedDungeonID
STA.w DungeonID
LDA.l CachedCurrentFloor
STA.b CurrentFloor
RTL
RestoreDungeonMapFloorIndex:
STZ.w $020F ; first part we wrote over
LDA.w $021B
STA.b $07
STZ.b $06
LDA.b $0A ; the rest of what we wrote over
AND.b #$08
RTL
DrawDungeonLabel:
LDY.b #$00
LDA.w DungeonID
ASL A
TAX
LDA.b NMISTRIPES
BEQ +
LDY.b #$20
+
; Dungeon Label
REP #$20
LDA.w #$E660
STA.w GFXStripes+$02, Y
LDA.w #$0300
STA.w GFXStripes+$04, Y
LDA.l DungeonLabels+0, X
STA.w GFXStripes+$06, Y
LDA.l DungeonLabels+2, X
STA.w GFXStripes+$08, Y
TYA
CLC : ADC.w #$0008
TAY
; L/R switch indicators
LDA.w #$E310
STA.w GFXStripes+$02, Y
LDA.w #$E910
STA.w GFXStripes+$0A, Y
LDA.w #$E318
STA.w GFXStripes+$12, Y
LDA.w #$E918
STA.w GFXStripes+$1A, Y
LDA.w #$0300
STA.w GFXStripes+$04, Y
STA.w GFXStripes+$0C, Y
STA.w GFXStripes+$14, Y
STA.w GFXStripes+$1C, Y
LDA.w #$49AF
STA.w GFXStripes+$06, Y
STA.w GFXStripes+$16, Y
LDA.w #$099E
STA.w GFXStripes+$08, Y
STA.w GFXStripes+$18, Y
LDA.w #$099F
STA.w GFXStripes+$0E, Y
STA.w GFXStripes+$1E, Y
LDA.w #$09AF
STA.w GFXStripes+$10, Y
STA.w GFXStripes+$20, Y
TYA
CLC : ADC.w #$0020
TAY
LDA.l DRMode
BNE .doors
JMP .skip_doors
.doors
; Select for Next Entrance indicator
LDA.w #$E311
STA.w GFXStripes+$02, Y
LDA.w #$E319
STA.w GFXStripes+$16, Y
LDA.w #$0F00
STA.w GFXStripes+$04, Y
STA.w GFXStripes+$18, Y
LDA.w #$09B8
LDX.b #$07
-
STA.w GFXStripes+$06, Y
STA.w GFXStripes+$1A, Y
INC A
INY : INY
DEX
BPL -
TYA
CLC : ADC.w #$0018
TAY
LDA.l CachedDungeonID
AND.w #$00FF
CMP.w DungeonID
BNE .skip_doors
; Y for Current Location indicator
LDA.w #$A411
STA.w GFXStripes+$02, Y
LDA.w #$A419
STA.w GFXStripes+$12, Y
LDA.w #$0B00
STA.w GFXStripes+$04, Y
STA.w GFXStripes+$14, Y
LDA.w #$09A9
LDX.b #$05
-
STA.w GFXStripes+$06, Y
STA.w GFXStripes+$16, Y
INC A
INY : INY
DEX
BPL -
TYA
CLC : ADC.w #$0014
TAY
.skip_doors
SEP #$20
LDA.b #$FF
STA.w GFXStripes+$02, Y
LDA.b #$01
STA.b NMISTRIPES
INC.w $020D ; what we wrote over
RTL
StartCurrentRoomSearch:
LDA.w DungeonMapFloorCountData, X
LSR A : LSR A : LSR A : LSR A
STA.b $00
LDA.w DungeonMapFloorCountData, X
AND.b #$0F
CLC : ADC.b $00
ASL A
TAY
RTL
FindCurrentRoom:
LDA.w DungeonMapFloorToDataOffset, Y
STA.b $0C
LDY.w #$0000
SEP #$20
.next_room_check
CPY.b $0C
BCS .not_found
LDA.b ($04), Y
INY
CMP.b $0E
BEQ .found
LDA.b $00
CMP.b #$40
BCS .next_row
CLC : ADC.b #$10
STA.b $00
BRA .next_room_check
.next_row
STZ.b $00
LDA.b $02
CMP.b #$40
BCS .next_floor
CLC : ADC.b #$10
STA.b $02
BRA .next_room_check
.next_floor
STZ.b $02
BRA .next_room_check
.found
JML $8AE891
.not_found
JML $8AE8CD

67
gk/fast_junk.asm Normal file
View File

@@ -0,0 +1,67 @@
;--------------------------------------------------------------------------------
SetItemRiseTimer:
LDA.w ItemReceiptMethod : CMP.b #$01 : BNE .not_from_chest
LDA.b #$38 : STA.w AncillaTimer, X
RTL
.not_from_chest
JSL ItemIsJunk
BEQ .default
.junk
LDA.l JunkItemTimer : AND.b #$3F : STA.w AncillaTimer, X
RTL
.default
TYA : STA.w AncillaTimer, X ; What we wrote over
RTL
;--------------------------------------------------------------------------------
ItemIsJunk:
PHX
LDA.l JunkItemTimer : BIT.b #$3F : BEQ .not_junk
BIT.b #$80 : BNE .check
LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE .check
LDA.l !MULTIWORLD_RECEIVING_ITEM : BNE .check
BRA .not_junk
.check
LDA.w AncillaGet, X
TAX
LDA.l JunkTable, X
PLX
CMP.b #$00
RTL
.not_junk
PLX
LDA.b #$00
RTL
;--------------------------------------------------------------------------------
; A = item id being collected
ItemGetAlternateSFX:
PEA.w $C567 ; SNES to RTS to in bank 08
LDA.w AncillaGet, X : CMP.b #$4A : BNE +
; collecting pre-activated flute
LDA.b #$13 : JML Ancilla_SFX2_Near
+
JSL ItemIsJunk : BEQ .normal
LDA.b #$3B : JML Ancilla_SFX3_Near
.normal
LDA.b #$0F : JML Ancilla_SFX3_Near
;--------------------------------------------------------------------------------
; A = item id being collected
ItemGetOverworldAlternateSFX:
CPY.b #$4A : BNE +
; pre-activated flute
JSL Sound_SetSfxPanWithPlayerCoords : ORA.b #$13 : STA.w SFX2
RTL
+
JSL ItemIsJunk : BEQ .normal
.junk
JSL Sound_SetSfxPanWithPlayerCoords : ORA.b #$3B : STA.w SFX3
RTL
.normal
JSL Sound_SetSfxPanWithPlayerCoords : ORA.b #$0F : STA.w SFX3
RTL
;--------------------------------------------------------------------------------

29
gk/gloom.asm Normal file
View File

@@ -0,0 +1,29 @@
AdjustDefaultGraphics:
JSL $80E310
LDA.l ChallengeModes : AND.b #$03 : CMP.b #$02 : BEQ .gloom
RTL
.gloom
LDA.b #$80
STA.w $2115
REP #$20
LDA.w #$7500
STA.w $2116
LDY.b #SkullGfx_end-SkullGfx
LDX.b #$00
- LDA.l SkullGfx, X
STA.w $2118
INX #2
DEY #2
BNE -
SEP #$20
RTL
SkullGfx:
incbin "data/skull.bin"
.end

213
gk/map_bg3.asm Normal file
View File

@@ -0,0 +1,213 @@
LoadStripes:
CPY.b #$09
BEQ .dungeon_map
.not_dungeon_map
LDA.w $80937A, Y
STA.b $00
LDA.w $809383,Y
STA.b $01
LDA.w $80938C,Y
STA.b $02
RTL
.dungeon_map
LDA.l DRMode
BNE .6x6
.5x5
LDA.b #BG3DungeonMap5x5Stripes>>0
STA.b $00
LDA.b #BG3DungeonMap5x5Stripes>>8
STA.b $01
LDA.b #BG3DungeonMap5x5Stripes>>16
STA.b $02
RTL
.6x6
LDA.b #BG3DungeonMap6x6Stripes>>0
STA.b $00
LDA.b #BG3DungeonMap6x6Stripes>>8
STA.b $01
LDA.b #BG3DungeonMap6x6Stripes>>16
STA.b $02
RTL
LoadLastHUDPalette:
; what we wrote over
JSL $9BEE52
REP #$20
LDA.l MapHUDPalette
STA.l PaletteBuffer+$3A
LDA.l MapHUDPalette+2
STA.l PaletteBuffer+$3C
LDA.l MapHUDPalette+4
STA.l PaletteBuffer+$3E
SEP #$20
RTL
BG3DungeonMap5x5Stripes:
; vanilla stuff
dw $4260, $0100, $2100
dw $4360, $0E40, $2101
dw $4B60, $0100, $6100
dw $6260, $2EC0, $2110
dw $6B60, $2EC0, $6110
dw $6263, $0100, $A100
dw $6363, $0E40, $A101
dw $6B63, $0100, $E100
dw $8460, $0B00, $2102, $2103, $2104, $2105, $2106, $2107
dw $A460, $0B00, $2112, $2113, $2114, $2115, $2116, $2117
dw $5D60, $0100, $6100
dw $7D60, $2EC0, $6110
dw $7D63, $0100, $E100
dw $0060, $7E40, $2111
dw $8063, $3E41, $2111
dw $0060, $3EC0, $2111
dw $0160, $3EC0, $2111
dw $0C60, $3EC0, $2111
dw $0D60, $3EC0, $2111
dw $1E60, $3EC0, $2111
dw $1F60, $3EC0, $2111
; left edge of map border, from vanilla
dw $4E60, $0100, $2100
dw $4F60, $1A40, $2101
dw $6E60, $2EC0, $2110
dw $6E63, $0100, $A100
dw $6F63, $1A40, $A101
; horizontal borders
dw $7260, $1240, $1D11
dw $D261, $1240, $1D11
dw $F261, $1240, $1D11
dw $5263, $1240, $1D11
; vertical borders
dw $7160, $2EC0, $1D11
dw $7C60, $2EC0, $1D11
macro TopOfSquares(start)
; silly Big Endian
db <start>>>8, <start>, $00, $13
dw $5D4C, $1D4C, $5D4C, $1D4C, $5D4C, $1D4C, $5D4C, $1D4C, $5D4C, $1D4C
endmacro
macro BottomOfSquares(start)
; silly Big Endian
db <start>>>8, <start>, $00, $13
dw $DD4C, $9D4C, $DD4C, $9D4C, $DD4C, $9D4C, $DD4C, $9D4C, $DD4C, $9D4C
endmacro
macro FullRow(start)
%TopOfSquares(<start>)
%BottomOfSquares(<start>+$20)
endmacro
; top grid
%FullRow($6092)
%FullRow($60D2)
%FullRow($6112)
%FullRow($6152)
%FullRow($6192)
%FullRow($6212)
%FullRow($6252)
%FullRow($6292)
%FullRow($62D2)
%FullRow($6312)
db $FF
BG3DungeonMap6x6Stripes:
; vanilla
dw $4260, $0100, $2100
dw $4360, $0E40, $2101
dw $4B60, $0100, $6100
dw $8460, $0B00, $2102, $2103, $2104, $2105, $2106, $2107
dw $A460, $0B00, $2112, $2113, $2114, $2115, $2116, $2117
dw $0060, $7E40, $2111
dw $8063, $3E41, $2111
dw $0060, $3EC0, $2111
dw $0160, $3EC0, $2111
dw $0C60, $3EC0, $2111
dw $0D60, $3EC0, $2111
dw $1E60, $3EC0, $2111
dw $1F60, $3EC0, $2111
; left side border
dw $6260, $1AC0, $2110
dw $6B60, $1AC0, $6110
dw $2262, $0100, $A100
dw $2362, $0E40, $A101
dw $2B62, $0100, $E100
; right side top area border
dw $4E60, $0100, $2100
dw $4F60, $1A40, $2101
dw $5D60, $0100, $6100
dw $6E60, $1AC0, $2110
dw $7D60, $1AC0, $6110
dw $2E62, $0100, $A100
dw $2F62, $1A40, $A101
dw $3D62, $0100, $E100
; right side bottom area border
dw $8E62, $0100, $2100
dw $8F62, $1A40, $2101
dw $9D62, $0100, $6100
dw $AE62, $06C0, $2110
dw $BD62, $06C0, $6110
dw $2E63, $0100, $A100
dw $2F63, $1A40, $A101
dw $3D63, $0100, $E100
; blank below left side
dw $4262, $4440, $2111
dw $6262, $4440, $2111
dw $8262, $1240, $2111
dw $A262, $1240, $2111
dw $C262, $1240, $2111
dw $E262, $1240, $2111
dw $0263, $1240, $2111
dw $2263, $1240, $2111
dw $4263, $4440, $2111
dw $6263, $4440, $2111
; map area inside top area
dw $6F60, $1A40, $1D11
dw $8F60, $1A40, $1D11
dw $AF60, $1A40, $1D11
dw $CF60, $1A40, $1D11
dw $EF60, $1A40, $1D11
dw $0F61, $1A40, $1D11
dw $2F61, $1A40, $1D11
dw $4F61, $1A40, $1D11
dw $6F61, $1A40, $1D11
dw $8F61, $1A40, $1D11
dw $AF61, $1A40, $1D11
dw $CF61, $1A40, $1D11
dw $EF61, $1A40, $1D11
dw $0F62, $1A40, $1D11
; center square
dw $3561, $0300
dw $5D4C, $1D4C
dw $5561, $0300
dw $DD4C, $9D4C
; map area inside bottom area
dw $AF62, $1A40, $1D11
dw $CF62, $1B00
dw $1D11, $5D4C, $1D4C, $1D11, $5D4C, $1D4C, $1D11, $5D4C, $1D4C, $1D11, $1D11, $5D4C, $1D4C, $1D11
dw $EF62, $1B00
dw $1D11, $DD4C, $9D4C, $1D11, $DD4C, $9D4C, $1D11, $DD4C, $9D4C, $1D11, $1D11, $DD4C, $9D4C, $1D11
dw $0F63, $1A40, $1D11
db $FF

152
gk/pseudoflute.asm Normal file
View File

@@ -0,0 +1,152 @@
SelectFirstFluteSpot:
LDA.l FluteBitfield
CMP.b #$FF
BNE +
RTL
+ LDA.b #$07
STA.w FluteSelection
.try_next
LDA.w FluteSelection
INC A
AND.b #$07
STA.w FluteSelection
TAX
LDA.l FluteBitfield
AND.l FluteMenuNumbers_bits, X
BNE .try_next
RTL
SelectFluteNext:
LDA.l FluteBitfield
CMP.b #$FF
BEQ InvalidBeep
.try_next
LDA.w FluteSelection
INC A
AND.b #$07
STA.w FluteSelection
TAX
LDA.l FluteBitfield
AND.l FluteMenuNumbers_bits, X
BNE .try_next
LDA.b #$20
STA.w $012F
RTL
SelectFlutePrev:
LDA.l FluteBitfield
CMP.b #$FF
BEQ InvalidBeep
.try_next
LDA.w FluteSelection
DEC A
AND.b #$07
STA.w FluteSelection
TAX
LDA.l FluteBitfield
AND.l FluteMenuNumbers_bits, X
BNE .try_next
LDA.b #$20
STA.w $012F
RTL
InvalidBeep:
LDA.b #$3C
STA.w $012E
RTL
SetFluteSpotPalette:
XBA
LDA.l FluteBitfield
AND.l FluteMenuNumbers_bits, X
BNE .disabled
.enabled
XBA
STA.b $0C
BRA .done
.disabled
LDA.b #$30
STA.b $0C
.done
LDA.b #$00
STA.b $0B
RTL
MaybeMarkFluteSpotVisited:
; don't ever allow the portal in desert/mire to be marked visited
CMP.b #$30 : BEQ .done
CMP.b #$70 : BEQ .done
LDX.b #$0E
.next
CMP.l $02E849, X
BEQ .mark
DEX : DEX
BPL .next
BRA .done
.mark
TXA
LSR A
TAX
LDA.l FluteMenuNumbers_bits, X
EOR.b #$FF
AND.l FluteBitfield
STA.l FluteBitfield
.done
RTL
CheckEnterOverworld:
LDA.l $7EC213
STA.b $8A ; what we wrote over
SEP #$20
JSL MaybeMarkFluteSpotVisited
REP #$20
RTL
CheckTransitionOverworld:
STA.b $8A
STA.w $040A ; what we wrote over
JSL MaybeMarkFluteSpotVisited
LDA.b $8A
RTL
CheckFlute:
LDA.l FluteBitfield
AND.w #$00FF
BNE .pseudo
.real
LDA.w #$0003
BRA .done
.pseudo
LDA.w #$0002
.done
RTS
DrawFluteIcon:
AND.w #$00FF
CMP.w #$0002
BCC +
JSR CheckFlute
+
STA.b $02
RTL
CheckFluteInHUD:
LDA.l EquipmentWRAM-1, X
AND.w #$00FF ; what we wrote over
CPX.w #$000D
BNE +
CMP.w #$0002
BCC +
JSR CheckFlute
+
RTL

208
gk/settings.asm Normal file
View File

@@ -0,0 +1,208 @@
org $B9F000
SupertileRoomShapes:
incsrc data/supertile_shapes.asm
warnpc $B9F800
padbyte $FF
pad $B9F800
org $B9F800
DungeonMapData:
db $02, $04, $00, $00 ; Sewers
db $1A, $00, $00, $00 ; Hyrule Castle
db $00, $06, $00, $00 ; Eastern Palace
db $04, $14, $00, $00 ; Desert Palace
db $14, $0C, $01, $00 ; Castle Tower
db $0C, $10, $00, $00 ; Swamp Palace
db $08, $0A, $00, $00 ; Palace of Darkness
db $12, $18, $00, $00 ; Misery Mire
db $0A, $16, $FF, $00 ; Skull Woods
db $16, $0E, $00, $00 ; Ice Palace
db $06, $08, $01, $00 ; Tower of Hera
db $10, $12, $00, $00 ; Thieves Town
db $0E, $1A, $00, $00 ; Turtle Rock
db $18, $02, $01, $00 ; Ganon's Tower
db $1A, $02, $00, $00 ; Extra
db $1A, $02, $00, $00 ; Extra
struct DungeonMapData DungeonMapData
.prev: skip 1
.next: skip 1
.floor: skip 1
.unused: skip 1
endstruct
warnpc $B9F840
org $B9F840
DoorConnectionPointers:
skip $20
warnpc $B9F860
org $B9F860
CustomMapPointers:
skip $20
warnpc $B9F880
org $B9F880
LootTypeIcons:
dw $0B00, $0B00, $0B00, $0B00 ; 00 - nothing
dw $2DCB, $6DCB, $ADCB, $EDCB ; 01 - unknown - dot
dw $29EB, $69EB, $29FB, $69FB ; 02 - junk - pot
dw $29CA, $69CA, $29DA, $29DB ; 03 - small key
dw $29E9, $69E9, $29F9, $69F9 ; 04 - triforce piece
dw $29DD, $69DD, $A9DD, $E9DD ; 05 - safety - plus
dw $29EC, $69EC, $29FC, $69FC ; 06 - less important item - small chest
dw $29CE, $29CF, $29DE, $29DF ; 07 - map
dw $29E8, $69E8, $29F8, $69F8 ; 08 - compass
dw $29CA, $69CA, $29DA, $29DB ; 09 - small key
dw $29C8, $69C8, $29D8, $29D9 ; 0A - big key
dw $29ED, $69ED, $29FD, $69FD ; 0B - important inventory item - big chest
dw $29CC, $29CD, $29DC, $69DC ; 0C - pendant
dw $2DC9, $69C9, $A9C9, $EDC9 ; 0D - crystal
dw $29E9, $69E9, $29F9, $69F9 ; 0E - triforce piece
dw $29EA, $69EA, $29FA, $69FA ; 0F - triforce
warnpc $B9F900
org $B9F900
LootTypeMapping:
incsrc data/item_mapping.asm
warnpc $B9FA00
org $B9FA00
; Room ID mappings to bit to check for presence and address of item drop
MiscLocations:
dw $00C8 : db $04 : dl HeartContainer_ArmosKnights
dw $0033 : db $04 : dl HeartContainer_Lanmolas
dw $0007 : db $04 : dl HeartContainer_Moldorm
dw $005A : db $04 : dl HeartContainer_HelmasaurKing
dw $0006 : db $04 : dl HeartContainer_Arrghus
dw $0029 : db $04 : dl HeartContainer_Mothula
dw $00AC : db $04 : dl HeartContainer_Blind
dw $00DE : db $04 : dl HeartContainer_Kholdstare
dw $0090 : db $04 : dl HeartContainer_Vitreous
dw $00A4 : db $04 : dl HeartContainer_Trinexx
dw $0073 : db $05 : dl BonkKey_Desert ; torch
dw $008C : db $05 : dl BonkKey_GTower ; torch
dw $0087 : db $05 : dl StandingKey_Hera
dw $FFFF : db $FF : dl $FFFFFF ; Placeholders
dw $FFFF : db $FF : dl $FFFFFF
dw $FFFF : db $FF : dl $FFFFFF ; Aga 1? ($0020)
dw $FFFF : db $FF : dl $FFFFFF ; Ice Armos? ($001C)
dw $FFFF : db $FF : dl $FFFFFF ; Lanmolas 2? ($0033)
dw $FFFF : db $FF : dl $FFFFFF ; Moldorm 2? ($004D)
dw $FFFF : db $FF : dl $FFFFFF ; Aga 2? ($000D)
dw $FFFF
warnpc $B9FA9A
org $B9FA9A
MapHUDPalette:
dw $0000, $3ED8, $2E54
warnpc $B9FAA0
org $B9FAA0
PrizeLocations:
dw $00C8 : db $02 ; Armos Knights
dw $0033 : db $03 ; Lanmolas
dw $0006 : db $05 ; Arrghus
dw $005A : db $06 ; Helmasaur King
dw $0090 : db $07 ; Vitreous
dw $0029 : db $08 ; Mothula
dw $00DE : db $09 ; Kholdstare
dw $0007 : db $0A ; Moldorm
dw $00AC : db $0B ; Blind
dw $00A4 : db $0C ; Trinexx
dw $FFFF
warnpc $B9FAC0
org $B9FAC0
SupertileEntrances:
incsrc data/entrance_tiles.asm
warnpc $B9FB00
padbyte $FF
pad $B9FB00
; $B9FB00
DungeonLabels:
dw $2550, $2579 ; Sewers
dw $2564, $255F ; Hyrule Castle
dw $2561, $256C ; Eastern Palace
dw $2560, $256C ; Desert Palace
dw $255D, $2570 ; Agahnim's Tower
dw $256F, $256C ; Swamp Palace
dw $256C, $2560 ; Palace of Darkness
dw $2569, $2569 ; Misery Mire
dw $256F, $2573 ; Skull Woods
dw $2565, $256C ; Ice Palace
dw $2570, $2564 ; Tower of Hera
dw $2570, $2570 ; Thieves' Town
dw $2570, $256E ; Turtle Rock
dw $2563, $2570 ; Ganon's Tower
dw $25A4, $25A4 ; Reserved
dw $25A4, $25A4 ; Reserved
; $B9FB40
warnpc $B9FE00
org $B9FE00
JunkTable:
incsrc data/junk_items.asm
warnpc $B9FF00
org $B9FF00
; $00 - do not show anything
; $01 - show presence of supertile as dark square
; $02 - show presence of quadrants as dark squares
; $03 - show outline of shape with walls but no interior details (palette 5)
; $04 - show dark with stairs but no hole/internal walls (palette 4)
; $05 - show mostly lit with stairs and holes/internal walls (palette 3)
; $06 - show fully lit with stairs and holes/internal walls (palette 2)
ShowRooms:
.default
db $02
.have_map
db $05
.have_compass
db $03
.visited_tile
db $04
.reserved
skip 3
.dark_room_cap
db $01
warnpc $B9FF08
org $B9FF08
; $00 - do not show anything
; $01 - show presence of unobtained items
; $02 - show category of item
ShowItems:
.default
db $00
.have_map
db $00
.have_compass
db $02
.visited_tile
db $01
.reserved
skip 4
warnpc $B9FF10
org $B9FF10
; ---P bepc
; P - dungeon prizes
; b - bosses (and torches in GT and desert, plus hera basement standing item)
; e - enemy drops
; p - pots
; c - chests
ItemSources:
db $09
; $B9FF11
AlwaysShowCompass:
db $01

126
gk/special_weapons.asm Normal file
View File

@@ -0,0 +1,126 @@
DamageClassCalc:
PHA
LDA.l GanonVulnerabilityItem : BEQ +
LDA.w SpriteTypeTable, X : CMP.b #$D7 : BNE +
PLA
JSL Ganon_CheckAncillaVulnerability
RTL
+
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$06 : BEQ .cane_immune
PLA
CMP.b #$01 : BEQ .red_cane
CMP.b #$2C : BEQ .red_cane
CMP.b #$31 : BEQ .blue_cane
CMP.b #$0C : BEQ .beam
BRA .not_cane_or_beam
.red_cane
PHA
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$04 : BEQ .special_cane
CMP.b #$05 : BEQ .special_cane
LDA.l SpecialWeapons : BIT.b #$80 : BNE .cane_immune
BRA .normal
.blue_cane
PHA
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$03 : BEQ .special_cane
CMP.b #$05 : BEQ .special_cane
LDA.l SpecialWeapons : BIT.b #$80 : BNE .cane_immune
BRA .normal
.cane_immune
LDA.w SpriteTypeTable, X : CMP.b #$1E : BEQ .normal ; crystal switch
PLA
BRA .impervious
.special_cane
PLA
LDA.w SpriteTypeTable, X : CMP.b #$D6 : BEQ .unstunned_ganon
CMP.b #$88 : BEQ .mothula
BRA .special_level
.impervious
LDA.b #$FF
RTL
.beam
PHA
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$02 : BNE .normal
PLA
LDA.b #$05
RTL
.normal
PLA
.not_cane_or_beam
CMP.b #$07 : BNE .no_change
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BNE .normal_bombs
LDA.l SpecialWeaponLevel : BEQ .normal_bombs
LDA.w SpriteTypeTable, X : CMP.b #$D6 : BEQ .unstunned_ganon
CMP.b #$88 : BEQ .mothula
CMP.b #$91 : BEQ .stalfos_knight
CMP.b #$92 : BEQ .helmasaur_king
.special_level
LDA.l SpecialWeaponLevel
BRA .done
.mothula
LDA.l SpecialWeaponLevel
CMP.b #$04 : BCS .fix_mothula
BRA .done
.fix_mothula
LDA.b #$03
BRA .done
.stalfos_knight
LDA.l StalfosBombDamage : BEQ .special_level
LDA.b #$08
BRA .done
.helmasaur_king
LDA.w $0DB0, X : CMP.b #$03 : BCS .special_level
LDA.b #$08
BRA .done
.unstunned_ganon
LDA.w $04C5 : CMP.b #$02 : BNE .impervious
LDA.w $0EE0, X : BNE .impervious
LDA.b #$34 : STA.w $0EE0, X ; give the poor pig some i-frames
BRA .special_level
.normal_bombs
LDA.b #$07
.no_change
PHX : TAX
LDA.l $86EC84, X
PLX
CMP.b #$06 : BNE .done
LDA.l BowEquipment : CMP.b #$03 : BCS .actual_silver_arrows
.normal_arrows
LDA.b #$06
.done
RTL
.actual_silver_arrows
LDA.w SpriteTypeTable, X : CMP.b #$D7 : BNE +
LDA.b #$20 : STA.w SpriteTimerE, X
+ LDA.b #$09
RTL
;--------------------------------------------------------------------------------
Utility_CheckImpervious:
LDA.w SpriteControl, X : AND.b #$40 : BNE .impervious
LDA.w $0CF2 : CMP.b #$FF : BEQ .impervious
LDA.w UseY1 : AND.b #$0A : BEQ .not_impervious ; normal behavior if not hammering
JSL Ganon_CheckHammerVulnerability : BCS .not_impervious
.not_impervious
LDA.b #$00 : RTL
.impervious
LDA.b #$01 : RTL
;--------------------------------------------------------------------------------

View File

@@ -0,0 +1,130 @@
Ganon_CheckAncillaVulnerability:
PHA
LDA.w $0EE0, X : BNE .not_vulnerable_pla
PLA
PHX : PHA
LDA.l GanonVulnerabilityItem
BMI .no_weakness
TAX : PLA
CMP.l Ganon_CheckByAncilla, X : BNE +
PLX : BRA .vulnerable
+ PLX : PHA
LDA.l GanonVulnerabilityItem
BEQ .silver_arrows
CMP.b #$01 : BEQ .silver_arrows
CMP.b #$11 : BEQ .somaria
BRA .not_vulnerable_pla
.no_weakness
PLA : PLX
BRA .not_vulnerable
.silver_arrows
PLA : CMP.b #$09 : BNE .not_vulnerable
LDA.l BowEquipment : CMP.b #$03 : BCS +
LDA.b #$09 : BRA .not_vulnerable
+ BRA .vulnerable
.somaria
PLA
CMP.b #$01 : BEQ .vulnerable
CMP.b #$2C : BEQ .vulnerable
BRA .not_vulnerable
.vulnerable
PHX
LDA.l GanonVulnerabilityItem
TAX
LDA.l Ganon_IFrameDuration, X
PLX
STA.w $0EE0, X ; give the poor pig some iframes
LDA.b #$20 : STA.w SpriteTimerE, X
LDA.b #$09
RTL
.not_vulnerable_pla_pla
PLA
.not_vulnerable_pla
PLA
.not_vulnerable
PHX : TAX
LDA.l $86EC84, X
PLX
RTL
;--------------------------------------------------------------------------------
Ganon_CheckPowderVulnerability:
LDA.l GanonVulnerabilityItem : CMP.b #$05 : BNE .normal
LDA.w SpriteTypeTable, X : CMP.b #$D7 : BNE .normal
LDA.w $0EE0, X : BNE .normal ; ganon has i-frames
LDA.l Ganon_IFrameDuration+$05
STA.w $0EE0, X ; give ganon i-frames
LDA.b #$20 : STA.w SpriteTimerE, X
LDA.b #$09
BRA .done
.normal
LDA.b #$0A
.done
JML $86ECE6
;--------------------------------------------------------------------------------
Ganon_CheckBeeVulnerability:
; X is bee sprite index
; Y is target sprite index
LDA.l GanonVulnerabilityItem : CMP.b #$10 : BNE .normal
LDA.w SpriteTypeTable, Y : CMP.b #$D7 : BNE .normal
LDA.w $0EE0, Y : BNE .normal ; ganon has i-frames
LDA.l Ganon_IFrameDuration+$10
STA.w $0EE0, X ; give ganon i-frames
LDA.b #$20 : STA.w SpriteTimerE, X
LDA.b #$09
BRA .done
.normal
LDA.b #$01
.done
TYX
JML $86ECE6
;--------------------------------------------------------------------------------
Ganon_CheckInvincible:
LDA.w $04C5 : CMP.b #$02 : BEQ .not_transparent
LDA.w SpriteTypeTable, X : CMP.b #$D7 : BNE .transparent ; non-stunned ganon
LDA.w UseY1 : AND.b #$0A : BEQ .transparent ; normal behavior if not hammering
LDA.l GanonVulnerabilityItem : CMP.b #$0C : BNE .transparent
.not_transparent
LDA.b #$00 : RTL
.transparent
LDA.b #$01 : RTL
;--------------------------------------------------------------------------------
Ganon_CheckHammerVulnerability:
LDA.l GanonVulnerabilityItem : CMP.b #$0C : BNE .normal
LDA.w SpriteTypeTable, X : CMP.b #$D7 : BNE .normal
LDA.w $0EE0, X : BNE .normal ; ganon has i-frames
LDA.l Ganon_IFrameDuration+$0C
STA.w $0EE0, X ; give ganon i-frames
LDA.b #$20 : STA.w SpriteTimerE, X
LDA.b #$09 : STA.w $0CF2 ; set damage class to silver
SEC : RTL
.normal
CLC : RTL
;--------------------------------------------------------------------------------
CheckBeeBoss:
; Y is sprite index
LDA.l GanonVulnerabilityItem : CMP.b #$10 : BNE .normal
LDA.w SpriteTypeTable, Y : CMP.b #$D7 : BNE .normal
LDA.b #$00 : RTL
.normal
LDA.w $0B6B, Y : AND.b #$02
RTL
;--------------------------------------------------------------------------------
Ganon_CheckByAncilla:
db #$00 ; default behavior
db #$00, #$05, #$1F, #$07, #$00
db #$02, #$0B, #$19, #$18, #$1C
db #$00, #$00, #$00, #$00, #$00
db #$00, #$00, #$31, #$00, #$00
Ganon_IFrameDuration:
db #$00 ; default behavior
db #$00, #$00, #$00, #$34, #$00
db #$00, #$00, #$00, #$00, #$00
db #$00, #$00, #$00, #$00, #$00
db #$00, #$00, #$00, #$00, #$00
;--------------------------------------------------------------------------------

24
gk_meta.asm Normal file
View File

@@ -0,0 +1,24 @@
org $B9EE00
;================================================================================
warnpc $B9EEE0
org $B9EEE0
;--------------------------------------------------------------------------------
B9Source:
; $01 = GK Baserom
; $FF = GK Adjuster Patch
db $01
;--------------------------------------------------------------------------------
GKRomVersion:
; $01 = Dungeon Maps
; .., $01 = Dark rooms don't show on map from visition
db $01, $01, $00
;--------------------------------------------------------------------------------
;================================================================================
warnpc $B9EEF0
org $B9EEF0
GKRandomizerVersion:
padbyte $00
pad $B9EF00
;--------------------------------------------------------------------------------

View File

@@ -1,6 +1,6 @@
GoalItemGanonCheck:
LDA.w SpriteTypeTable, X : CMP.b #$D6 : BNE .success ; skip if not ganon
JSL CheckGanonVulnerability
LDA.b #$01 : JSL CheckConditionPass
BCS .success
.fail
@@ -11,104 +11,198 @@ RTL
LDA.b OAMOffsetY : CMP.b #$80 ; thing we wrote over
RTL
;--------------------------------------------------------------------------------
;Carry clear = ganon invincible
;Carry set = ganon vulnerable
CheckGanonVulnerability:
PHX
LDA.l GanonVulnerableMode
ASL
TAX
; Input A = Type of condition check
; Carry clear = failed check
; Carry set = successful check
CheckConditionPass:
PHX : PHY
PHB
LDY.b #GoalConditionTable>>16 : PHY : PLB : STY.b Scrap02
REP #$20
ASL : TAY
LDA.w GoalConditionTable, Y : STA.b Scrap00
PHK : PLB
SEP #$20
LDY.b #$00
- LDA.b [Scrap00], Y : CMP.b #$FF : BEQ .exit
INY : ROL : TAX
JSR (.conditions, X) : BCC .exit : BRA -
; Carry
; 0 - invulnerable
; 1 - vulnerable
JSR (.goals, X)
.exit
PLB : PLY : PLX
RTL
PLX
RTL
.goals
dw .vulnerable
dw .invulnerable
dw .all_dungeons
dw .crystals_and_aga
; Y = index after condition code
; Carry = Set if using default target value
.conditions
dw .always_fail
dw .pendants
dw .crystals
dw .pendant_bosses
dw .crystal_bosses
dw .prize_bosses
dw .agahnim_defeated
dw .agahnim2_defeated
dw .goal_item
dw .light_speed
dw .crystals_and_bosses
dw .bosses_only
dw .all_dungeons_no_agahnim
dw .all_items
dw .completionist
dw .collection_rate
dw .custom_goal
dw .bingo
dw .all_bosses
dw .success
dw .success
dw .success
; 00 = always vulnerable
.vulnerable
.agahnim2_defeated
LDA.l RoomDataWRAM[$0D].high : AND.b #$08 : BEQ .fail
.bingo ; not implemented yet
.success
SEC
RTS
; 01 = always invulnerable
.invulnerable
SEC : RTS
.always_fail
.fail
CLC
RTS
; 02 = All dungeons
.all_dungeons
LDA.l ProgressIndicator : CMP.b #$03 : BCC .fail ; require post-aga world state
; 09 = All dungeons except agahnim
.all_dungeons_no_agahnim
LDA.l PendantsField : AND.b #$07 : CMP.b #$07 : BNE .fail ; require all pendants
LDA.l CrystalsField : AND.b #$7F : CMP.b #$7F : BNE .fail ; require all crystals
LDA.l RoomDataWRAM[$0D].high : AND.b #$08 : BEQ .fail ; require aga2 defeated (pyramid hole open)
BRA .success
; 03 = crystals and aga 2
.crystals_and_aga
LDA.l RoomDataWRAM[$0D].high : AND.b #$08 : BEQ .fail ; check aga2 first then bleed in
; 04 = crystals only
CLC : RTS
.pendants
PHP
LDA.l PendantCounter : PLP : BCC +
CMP.b #$03 : RTS
.crystals
JSL CheckEnoughCrystalsForGanon
RTS
; 05 = require goal item
PHP
LDA.l CrystalCounter : PLP : BCC +
CMP.b #$07 : RTS
.pendant_bosses
PHP
LDA.b #$20
JSR CheckForBossesDefeated : PLP : BCC +
CMP.b #$03 : RTS
.crystal_bosses
PHP
LDA.b #$10
JSR CheckForBossesDefeated : PLP : BCC +
CMP.b #$07 : RTS
.all_bosses
PHP
LDA.b #$30
JSR CheckForBossesDefeated : PLP : BCC +
CMP.b #$10 : RTS
.prize_bosses
PHP
LDA.b #$00
JSR CheckForBossesDefeated : PLP : BCC +
CMP.b #$0A : RTS
+ CMP.b [Scrap00], Y : INY : RTS
.agahnim_defeated
LDA.l ProgressIndicator : CMP.b #$03 : RTS
.goal_item
REP #$20
LDA.l GoalCounter : CMP.l GoalItemRequirement
SEP #$20
REP #$20
LDA.l GoalCounter : BCC +
CMP.l GoalItemRequirement : BRA ++
.collection_rate
REP #$20
LDA.l TotalItemCounter : BCC +
CMP.l TotalItemCount : BRA ++
+ CMP.b [Scrap00], Y : INY : INY : ++
SEP #$20
RTS
.custom_goal
LDA.b [Scrap00], Y : INY ; options
PHA : AND.b #$07 : ASL : TAX : PLA
;JMP CheckConditionPassCustom
; flows into next function, do not insert code after without uncommenting above
; 06 = light speed
.light_speed
BRA .fail
; --------------------------------------------------------------------------------
; Input A = Options value, see GoalConditionTable for format
; Input X = Condition check type index
; Input Y = Index after Options byte
CheckConditionPassCustom:
PHX : PHA : BIT.b #$08 : PHP
REP #$30
LDA.b [Scrap00], Y : INY : INY ; address
PLP : REP #$30 : BEQ .byte
.word
TAX
SEP #$20
PLA
AND.b #$10
REP #$20
BNE +
LDA.l $7E0000, X : BRA ++
+
LDA.l $7F0000, X : ++
SEP #$10
PLX
REP #$10
JSR (.comparisons, X)
INY
SEP #$30
RTS
.byte
TAX
SEP #$20
PLA
AND.b #$10 : BNE +
LDA.l $7E0000, X : BRA ++
+
LDA.l $7F0000, X : ++
SEP #$10
PLX
JMP (.comparisons, X)
; 07 = Crystals and bosses
.crystals_and_bosses
JSL CheckEnoughCrystalsForGanon ; check crystals first then bleed in to next
BCC .fail
; 08 = Crystal bosses but no crystals
.bosses_only
JMP CheckForCrystalBossesDefeated
; 09 = 100% item collection rate
.all_items
REP #$20
LDA.l TotalItemCounter : CMP.l TotalItemCount
SEP #$20
RTS
; 0A = 100% item collection rate and all dungeons
.completionist
REP #$20
LDA.l TotalItemCounter : CMP.l TotalItemCount
SEP #$20
BCC .fail
BRA .all_dungeons
.comparisons
dw .minimum
dw .exact
dw .bitfield_nonzero
dw .bitfield_match
dw .count_bits
dw .fail
dw .fail
dw .fail
.pass
INY : SEC : RTS
.count_bits
JSL CountBits
.minimum
CMP.b [Scrap00], Y : INY
RTS
.bitfield_match
AND.b [Scrap00], Y
.exact
CMP.b [Scrap00], Y : BEQ .pass
INY : CLC : RTS
.bitfield_nonzero
AND.b [Scrap00], Y : BNE .pass
.fail
INY : CLC : RTS
;--------------------------------------------------------------------------------
GTCutscene_TransferGfx:
PHA
REP #$20
STZ.w DuckPose
LDA.l GanonsTowerOpenGfx : BEQ .original_crystal
PHX
LDX.w ItemStackPtr : STA.l ItemGFXStack,X
LDA.w #$81C0>>1 : STA.l ItemTargetStack,X
INX #2 : STX.w ItemStackPtr
PLX
SEP #$20
PLA
RTL
.original_crystal
SEP #$20
PLA
JML TransferItemReceiptToBuffer_using_GraphicsID
;--------------------------------------------------------------------------------
AncillaDraw_GTCutsceneCrystal_OAMPrep:
LDA.l GanonsTowerOpenGfx : ORA.l GanonsTowerOpenGfx+1 : BEQ .vanilla
LDA.b #$0E : STA.b (OAMPtr),Y
INY
LDA.l GanonsTowerOpenPalette : AND.b #$67 : ASL : ORA.b #$30
STA.b (OAMPtr),Y
RTL
.vanilla
LDA.b #$24 : STA.b (OAMPtr),Y
INY
LDA.b #$3C : STA.b (OAMPtr),Y
RTL
;--------------------------------------------------------------------------------
GTCutscene_CrystalMasks:
db %00000000 ; 0 crystals
@@ -171,48 +265,94 @@ GTCutscene_ActivateSparkle_SelectCrystal:
PLY
RTL
;--------------------------------------------------------------------------------
; prioritizes: number of gfx used > sum of targets > number of goals
; Scrap00 stores number of goals
; Y sums all goal target values
GTCutscene_NumberOfCrystals:
PHX : PHY : PHP
REP #$20
LDA.l GanonsTowerOpenAddress : CMP.w #CrystalCounter : BEQ +
LDA.w #$0001 : BRA .done
+ LDA.l GanonsTowerOpenTarget
.done
LDA.l GanonsTowerOpenGfx+2 : BEQ .not_multiple_gfx
LDX.b #$04
- LDA.l GanonsTowerOpenGfx, X : BEQ +
INX : INX : CPX.b #$0E : BCC -
+
TXA : LSR
JMP .done
.not_multiple_gfx
LDX.b #$00 : LDA.l GoalConditionTable, X
TXY : STY.b Scrap00
REP #$10
SEP #$20
TAX
.next
LDA.l $B00000, X : CMP.b #$FF : BNE + : JMP .use_y : +
INC.b Scrap00
ROL : PHP : CMP.b #$10 : BCS .not_8bit_compare
CMP.b #$0C : BEQ .agas_goal
CMP.b #$0E : BEQ .agas_goal
; uses 8-bit targets
PLP : BCC .use_8bit_target
CMP.b #$04 : BEQ .crystal_goal ; crystal goal
CMP.b #$08 : BEQ .crystal_goal ; crystal bosses goal
CMP.b #$02 : BEQ .pendant_goal ; pendant goal
CMP.b #$06 : BEQ .pendant_goal ; pendant bosses goal
BRA .bosses_goal
.crystal_goal
LDA.b #$07 : INX : BRA .add_to_y
.pendant_goal
LDA.b #$03 : INX : BRA .add_to_y
.bosses_goal
INY : INX : BRA .next ; just increment Y by 1 since default of 10 is already more than max 7
.agas_goal
PLP : INX : BRA .next
.use_8bit_target
INX : LDA.l $B00000, X : INX
.add_to_y
PHY : CLC : ADC.b 1,S : PLY : TAY : BRA .next
.not_8bit_compare
CMP.b #$14 : BEQ .custom_goal : BCS .unknown
; triforce hunt/collection rate - uses 16-bit targets
PLP : INX : BCC +
LDA.l $B00000, X : INX : INX : BRA .add_to_y
+ INY : BRA .next
.custom_goal
PLP
INX : LDA.l $B00000, X : BIT.b #$08 : PHP
INX : INX : INX : AND.b #$03 : BEQ .use_custom_target
; comparison method doesn't use a quantity, increment Y by 1
INY : INX : PLP : BEQ +
INX
+
BRA .next
.use_custom_target
PLP : BEQ ..8bit
; 16-bit target
REP #$20
LDA.l $B00000, X : CMP.w #$0008 : SEP #$20 : INX : BRA +
..8bit
LDA.l $B00000, X : CMP.b #$08 : + : BCC +
; target exceeds 7, just increment Y by 1
INY : INX : JMP .next
+
INX : BRA .add_to_y
.unknown ; unknown condition, exit with safe value
PLP : INY
.use_y
TYA : BEQ + : CMP.b #$08 : BCC .done
+ LDA.b Scrap00 : BEQ .use_one : CMP.b #$08 : BCC .done
.use_one
LDA.b #$01
.done
PLP : PLY : PLX
RTS
;--------------------------------------------------------------------------------
CheckEnoughCrystalsForGanon:
REP #$20
LDA.l CrystalCounter
CMP.l GanonVulnerableTarget
SEP #$20
RTL
;--------------------------------------------------------------------------------
CheckTowerOpen:
LDA.l GanonsTowerOpenMode : ASL : TAX
JSR (.tower_open_modes,X)
RTL
.tower_open_modes
dw .vanilla
dw .arbitrary_cmp
.vanilla
LDA.l CrystalsField
AND.b #$7F : CMP.b #$7F
RTS
.arbitrary_cmp
REP #$30
LDA.l GanonsTowerOpenAddress : TAX
LDA.l $7E0000,X
CMP.l GanonsTowerOpenTarget
SEP #$30
RTS
LDA.b #$00 : JML CheckConditionPass
;---------------------------------------------------------------------------------------------------
CheckAgaForPed:
REP #$20
LDA.l GanonVulnerableMode
CMP.w #$0006 : BNE .vanilla
; seems light_speed option to force blue balls is unused for now
BRA .vanilla
.light_speed
SEP #$20
@@ -233,73 +373,87 @@ CheckAgaForPed:
RTL
;---------------------------------------------------------------------------------------------------
CheckForCrystalBossesDefeated:
BossPrizeFlags:
; $00 = all prize bosses
db $00
db $01, $01, $01, $01, $01, $01, $01 ; crystals
db $01, $01, $01 ; pendants
db $00, $00, $00, $00, $00 ; padding
; $10 = all crystal bosses
db $00
db $01, $01, $01, $01, $01, $01, $01 ; crystals
db $00, $00, $00 ; pendants
db $00, $00, $00, $00, $00 ; padding
; $20 = all pendant bosses
db $00
db $00, $00, $00, $00, $00, $00, $00 ; crystals
db $01, $01, $01 ; pendants
db $00, $00, $00, $00, $00 ; padding
; $30 = all bosses
db $01 ; agas
db $01, $01, $01, $01, $01, $01, $01 ; crystals
db $01, $01, $01 ; pendants
db $00, $00, $00, $00, $00 ; padding
CheckForBossesDefeated:
PHB : PHX : PHY
LDA.b #CrystalPendantFlags_2>>16
; $00 = check prize bosses
; $10 = check crystal bosses
; $20 = check pendant bosses
; $30 = check all bosses
STA.b Scrap04
LDA.b #bank(CrystalPendantFlags_3)
PHA : PLB
STZ.b Scrap03 ; count of number of bosses killed
STZ.b Scrap05
REP #$30
; count of number of bosses killed
STZ.b Scrap00
LDY.w #10
LDY.w #11
.next_check
LDA.w CrystalPendantFlags_2+2,Y
BIT.w #$0040
BEQ ++
TYA
ASL
SEP #$30
LDA.w CrystalPendantFlags_3+2, Y
CLC : ADC.b Scrap04
TAX
LDA.l BossPrizeFlags, X
REP #$30
BEQ .skip
LDA.l DrawHUDDungeonItems_boss_room_ids-4,X
TAX
LDA.l RoomDataWRAM.l,X
TYA : ASL A : TAX
AND.w #$0800
BEQ ++
LDA.l DungeonMapBossRooms+4, X
ASL A : TAX
LDA.l RoomDataWRAM.l, X
INC.b Scrap00
AND.w #$0800 : BEQ .skip
INC.b Scrap03
++ DEY
BPL .next_check
.skip
DEY : BPL .next_check
SEP #$30
PLY : PLX : PLB
LDA.b Scrap00 : CMP.l GanonVulnerableTarget
LDA.b Scrap03
RTS
;---------------------------------------------------------------------------------------------------
CheckPedestalPull:
; Out: c - Successful ped pull if set, do nothing if unset.
PHX
LDA.l PedCheckMode : ASL : TAX
JSR (.pedestal_modes,X)
PLX
LDA.b #$02 : JSL CheckConditionPass : BCS .return
PHX : PHP
LDA.b GameMode : CMP.b #$0E : BEQ +
REP #$30
LDX.w #$0004 : LDA.l GoalConditionTable, X : TAX
LDA.l $B00000, X : CMP.w #$FF81 : BEQ +
SEP #$30
LDA.b #$97 : LDY.b #$01
JSL Sprite_ShowMessageUnconditional
+
PLP : PLX
.return
RTL
.pedestal_modes
dw .vanilla
dw .arbitrary_cmp
.vanilla
LDA.l PendantsField
AND.b #$07 : CMP.b #$07 : BNE ..nopull
SEC
RTS
..nopull
CLC
RTS
.arbitrary_cmp
REP #$30
LDA.l PedPullAddress : TAX
LDA.l $7E0000,X
CMP.l PedPullTarget
SEP #$30
RTS

View File

@@ -4,19 +4,10 @@
HeartPieceGet:
PHX : PHY
LDA.w SprItemMWPlayer, X : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID
LDY.w SprItemReceipt, X : BNE +
LDA.w SprSourceItemId, X : BNE ++
JSL LoadHeartPieceRoomValue
STA.w SprSourceItemId, X
++
JSL AttemptItemSubstitution
JSL ResolveLootIDLong
STA.w SprItemReceipt, X
TAY
+
LDY.w SprSourceItemId, X
JSL MaybeMarkDigSpotCollected
.skipLoad
LDA.w SprItemMWPlayer, X : STA.l !MULTIWORLD_ITEM_PLAYER_ID
LDA.w SprItemMWPlayer, X : STA.l !MULTIWORLD_ITEM_PLAYER_ID
CPY.b #$26 : BNE .not_heart ; don't add a 1/4 heart if it's not a heart piece
CMP.b #$00 : BNE .not_heart
LDA.l HeartPieceQuarter : INC A : AND.b #$03 : STA.l HeartPieceQuarter
@@ -32,16 +23,7 @@ RTL
HeartContainerGet:
PHX : PHY
JSL IncrementBossSword
LDY.w SprItemReceipt, X : BNE +
LDA.w SprSourceItemId, X : BNE ++
JSL LoadHeartContainerRoomValue
STA.w SprSourceItemId, X
++
JSL AttemptItemSubstitution
JSL ResolveLootIDLong
STA.w SprItemReceipt, X
TAY
+
LDY.w SprSourceItemId, X
BRA HeartPieceGet_skipLoad
;--------------------------------------------------------------------------------
DrawHeartPieceGFX:
@@ -260,6 +242,12 @@ LoadOutdoorValue:
PHP
REP #$20 ; set 16-bit accumulator
LDA.b OverworldIndex
; Rain state fix: In rain state DW, use LW screen ID for item lookup
BIT.w #$0040 : BEQ +
LDA.l ProgressIndicator : AND.w #$00FF : CMP.w #$0002
LDA.b OverworldIndex : BCS ++ : AND.w #$00BF
++
+
CMP.w #$00 : BNE +
LDA.l OWBonkPrizeTable[$00].loot
JMP .done

165
hooks.asm
View File

@@ -407,6 +407,16 @@ STA.l StalfosBombDamage
org $8AB76E ; <- 5376E - Bank0A.asm : 30 (JSL OverworldMap_InitGfx)
JSL OnLoadDuckMap
;================================================================================
; Fix Clobbered Gfx
;--------------------------------------------------------------------------------
org $80DB92
JSL PostFixMirrorGfxPrep
org $80D911
JML PostFixMirrorGfx
org $80E259
JSL PostFixOAMGfx : NOP
;================================================================================
; Infinite Bombs / Arrows / Magic
;--------------------------------------------------------------------------------
@@ -530,6 +540,8 @@ JML GTCutscene_ConditionalAnimateCrystals
org $88CE93
GTCutscene_DrawSingleCrystal:
JML GTCutscene_ConditionalDrawSingleCrystal
org $88CED1
JSL AncillaDraw_GTCutsceneCrystal_OAMPrep : BRA + : NOP #3 : +
;--------------------------------------------------------------------------------
org $88CF19 ; <- 44F19 - ancilla_break_tower_seal.asm : 336 (TXA : AND.b #$07 : TAX)
JSL GTCutscene_ActivateSparkle_SelectCrystal
@@ -555,12 +567,6 @@ JSL AgahnimAsksAboutPed
org $9ED6E8
JSL CheckAgaForPed : NOP
;================================================================================
; Zelda Sprite Fixes
;--------------------------------------------------------------------------------
org $85EBCF ; <- 2EBCF - sprite_zelda.asm : 23 (LDA $7EF359 : CMP.b #$02 : BCS .hasMasterSword)
JSL SpawnZelda : NOP #2
;================================================================================
; Alternate Goal
;--------------------------------------------------------------------------------
@@ -688,12 +694,6 @@ db $06, $1F, $40, $12, $01, $3F, $14, $01, $3F, $13, $1F, $42, $1A, $1F, $4B, $1
org $85DFB1 ; <- 2DFB1 - Bank05.asm : 2499
JSL SkipDrawEOR
;================================================================================
; Kiki Big Bomb Fix
;--------------------------------------------------------------------------------
org $9EE4AF ; <- f64af sprite_kiki.asm : 285 (LDA.b #$0A : STA $7EF3CC)
JSL AssignKiki : NOP #2
;================================================================================
; Wallmaster camera fix
;--------------------------------------------------------------------------------
@@ -840,15 +840,10 @@ JSL LoadModifiedIceFloorValue_a01 : NOP
org $83FC16 ; <- 1FC16 ($A8, $B8, $3D, $D0, $B8, $3D)
db $B1, $C6, $F9, $C9, $C6, $F9 ; data insert - 2 chests, fat fairy room
; unused item receipts
; unused item receipts - moved to pyramid fairy
org $81E97E
dw $0116 : db $08
dw $0116 : db $25
;--------------------------------------------------------------------------------
org $9EE16E ; <- F616E - sprite_bomb_shop_entity.asm : 73
NOP #8 ; fix bomb shop dialog for dwarfless big bomb
org $868A14 ; <- 30A14 - sprite_prep.asm : 716
NOP #8 ; fix bomb shop spawn for dwarfless big bomb
dw $0116 : db $5E
dw $0116 : db $64
;--------------------------------------------------------------------------------
org $86B489 ; <- 33489 - sprite_smithy_bros.asm : 473 (LDA $7EF359 : CMP.b #$03 : BCS .tempered_sword_or_better)
JML GetSmithSword : NOP #4
@@ -1819,7 +1814,9 @@ Sprite_ShowMessageUnconditional_Rest:
;--------------------------------------------------------------------------------
;-- Music restarting at zelda fix
org $85ED10 ; <- 2ED10 - sprite_zelda.asm : 233 - (LDA.b #$19 : STA $012C)
NOP #5
BRA + : NOP #3 : +
org $85ED63
BRA + : NOP #3 : +
;--------------------------------------------------------------------------------
org $9ECE47 ; <- F4E47 - sprite_crystal_maiden.asm : 220
JML MaidenCrystalScript
@@ -1881,11 +1878,14 @@ JSL CalculateSignIndex
; Dark World Spawn Location Fix & Follower Fixes
;--------------------------------------------------------------------------------
org $80894A ; <- 94A
PHB : JSL DarkWorldSaveFix
PHB : JSL OnSave
;--------------------------------------------------------------------------------
org $828046 ; <- 10046 - Bank02.asm : 217 (JSL EnableForceBlank) (Start of Module_LoadFile)
JSL OnFileLoad
;--------------------------------------------------------------------------------
org $89F5DF
JSL OnDeathNoSave
;--------------------------------------------------------------------------------
org $8280A2
JSL GetCurrentWorldForLoad
;--------------------------------------------------------------------------------
@@ -2241,8 +2241,6 @@ org $82A9B0 ; (BCS $A9B7)
NOP #2
org $82C1C8 ; (BCS $C1CC)
NOP #2
org $82ADA0 ; (LDA.b #$F1 : STA $012C)
JSL Overworld_MosaicDarkWorldChecks : NOP
;--------------------------------------------------------------------------------
org $85CC58 ; <- Bank05.asm:1307 (LDA $040A : CMP.b #$18)
JSL PsychoSolder_MusicCheck : NOP #1
@@ -2268,8 +2266,9 @@ JSL Overworld_DetermineMusic
BRA + : NOP #42 : +
;--------------------------------------------------------------------------------
org $82B0C4
LDA.b OverworldIndex : CMP.b #$80 : BCS +
JSL Overworld_DetermineAndSetMusic
BRA + : NOP #16 : +
BRA + : NOP #10 : +
;--------------------------------------------------------------------------------
org $82B1C1
JSL Overworld_DetermineAmbientSFX
@@ -2287,8 +2286,18 @@ BRA + : NOP #12 : +
org $88C442
JSL Overworld_DetermineAndSetMusic : NOP
;--------------------------------------------------------------------------------
org $9BD1CD
JSL Overworld_DetermineAndSetMusic : NOP
;--------------------------------------------------------------------------------
org $9DFD27
JSL Overworld_DetermineAndSetMusic : NOP
;--------------------------------------------------------------------------------
org $829253
JSL FixHalfVolumeOnSpawnExitToOverworld : NOP
;--------------------------------------------------------------------------------
org $8292D9
BRA + : NOP #4 : +
JSL FixPreAgaMusicFadeOut : db $B0 ; BCS
;================================================================================
;================================================================================
@@ -2347,24 +2356,6 @@ org $82A451 ; <- 12451 - Bank02.asm:6283 (LDA $F6 : AND.b #$40 : BEQ .xButtonNot
JSL QuickSwap
;================================================================================
;================================================================================
; Tagalong Fixes
;--------------------------------------------------------------------------------
org $8689AB ; <- 309AB - sprite_prep.asm: 647 (LDA $7EF3CC : CMP.b #$06 : BEQ .killSprite)
; Note: In JP 1.0 we have: (CMP.b #$00 : BNE .killSprite) appling US bugfix
; Prevent followers from causing blind/maiden to despawn:
; Door rando: let zelda despawn the maiden.
JSL BlindZeldaDespawnFix
org $8689AF
SpritePrep_BlindMaiden_despawn_follower: ; this is the normal execution path
org $8689C9
SpritePrep_BlindMaiden_kill_the_girl: ; not the follower
;--------------------------------------------------------------------------------
; Fix old man purple chest issues using the same method as above
org $9EE906 ; <- F6906 - sprite_old_mountain_man.asm : 31 (LDA $7EF3CC : CMP.b #$00 : BNE .already_have_tagalong)
CMP.b #$04 : db $F0 ; BEQ
;--------------------------------------------------------------------------------
;Control which doors frog/smith can enter
org $9BBCF0 ; <- DBCF0 - Bank1B.asm: 248 (LDA $04B8 : BNE BRANCH_MU)
@@ -2676,7 +2667,7 @@ org $898AEE : JSL TransferItemReceiptToBuffer_using_GraphicsID
org $898C85 : JSL TransferItemReceiptToBuffer_using_GraphicsID
; gt cutscene
org $899BBE : JSL TransferItemReceiptToBuffer_using_GraphicsID
org $899BBE : JSL GTCutscene_TransferGfx
;===================================================================================================
; gratuitous NOPs removed for speed
@@ -2738,12 +2729,92 @@ NOP #2 ; this fixes Link's direction after mirroring and falling after entering
;--------------------------------------------------------------------------------
; Enable new room header table
;--------------------------------------------------------------------------------
org $81B5E6
LDA.b #$30
if not(!FEATURE_FIX_BASEROM)
org $81B5E6
LDA.b #$30
endif
;===================================================================================================
;================================================================================
;--------------------------------------------------------------------------------
; Mimic dash changes
;--------------------------------------------------------------------------------
org $9EC7BE
JSL MimicDirection
;================================================================================
;--------------------------------------------------------------------------------
; Gloom VRAM overwrite
;--------------------------------------------------------------------------------
org $828068
JSL AdjustDefaultGraphics
;================================================================================
; Special Weapons Modes
;--------------------------------------------------------------------------------
org $86ECC3 ; Bank06.asm@4704 (PHX : TAX : LDA.l .damage_classes, X : PLX)
JSL DamageClassCalc
BRA + : NOP #29 : +
;--------------------------------------------------------------------------------
org $86ED94 ; Bank06.asm@4866 (LDA $0E60, X : AND.b #$40)
JSL Utility_CheckImpervious
NOP
;--------------------------------------------------------------------------------
;================================================================================
;--------------------------------------------------------------------------------
; Variable Ganon Vulnerability
;--------------------------------------------------------------------------------
org $88BBD4 ; ancilla_magic_powder.asm@253 (LDA #$0A : JSL Ancilla_CheckSpriteDamage.preset_class)
JSL Ganon_CheckPowderVulnerability
NOP #2
org $1D8F4E ; sprite_ganon.asm@325 (LDA $04C5 : CMP #$02)
JSL Ganon_CheckInvincible
NOP
org $0DD628 ; Bank0D.asm@1266 (LDA $0B6B, Y : AND #$02)
JSL CheckBeeBoss
NOP
org $0DD677 ; Bank0D.asm@1303 (JSL Ancilla_CheckSpriteDamage.preset_class)
JSL Ganon_CheckBeeVulnerability
;--------------------------------------------------------------------------------
;================================================================================
; PseudoFlute
;--------------------------------------------------------------------------------
org $8AB7D5 ; bank_0A.asm@5655 (DEC.w $1AF0 : LDA.b #$20 : STA.w $012F)
JSL SelectFlutePrev
BRA + : NOP #2 : +
;--------------------------------------------------------------------------------
org $8AB7E3 ; bank_0A.asm@5665 (INC.w $1AF0 : LDA.b #$20 : STA.w $012F)
JSL SelectFluteNext
BRA + : NOP #2 : +
;--------------------------------------------------------------------------------
org $8AB877 ; bank_0A.asm@5758 (STA.b $0C : LDA.b #$00 : STA.b $0B)
JSL SetFluteSpotPalette
NOP #2
;--------------------------------------------------------------------------------
org $8AB8BF ; bank_0A.asm@5800 (STA.b $0C : LDA.b #$00 : STA.b $0B)
JSL SetFluteSpotPalette
NOP #2
;--------------------------------------------------------------------------------
org $82AFBE ; bank_02.asm@8776 (LDA.l $7EC213 : STA.b $8A)
JSL CheckEnterOverworld
NOP #2
;--------------------------------------------------------------------------------
org $82A9A1 ; bank_02.asm@7655 (STA.b $8A : STA.w $040A)
JSL CheckTransitionOverworld
NOP
;--------------------------------------------------------------------------------
org $8DF741
dw $3CD4, $3CD5, $3CE4, $3CE5
;--------------------------------------------------------------------------------
org $8DE58E ; bank_0D.asm@15401 (AND.w #$00FF : STA.b $02)
JSL DrawFluteIcon
NOP
;--------------------------------------------------------------------------------
org $8DFB63 ; bank_0D.asm@18092 (LDA.l $7EF33F, X : AND.w #$00FF)
JSL CheckFluteInHUD
NOP #3
;--------------------------------------------------------------------------------

View File

@@ -114,7 +114,10 @@ StartingGenericKeys: skip 1 ; PC 0x18338B
InitInventoryTracking: skip 2 ; PC 0x18338C \ Need to set bits here for silver arrows,
InitBowTracking: skip 2 ; PC 0x18338E / boomerangs, powder/mushroom, etc
InitItemLimitCounts: skip 16 ; PC 0x183390
skip 37 ;
skip 34 ;
InitFluteBitfield: db $00 ;
InitSpecialWeaponLevel: db $00 ;
InitItemOnB: db $00 ;
InitProgressIndicator: db $02 ; PC 0x1833C5 - Set to $80 for instant post-aga with standard
InitProgressFlags: db $14 ; PC 0x1833C6 - Set to $00 for standard
InitMapIcons: skip 1 ; PC 0x1833C7
@@ -123,8 +126,8 @@ InitNpcFlagsVanilla: skip 1 ; PC 0x1833C9
InitCurrentWorld: skip 1 ; PC 0x1833CA
skip 1 ; PC 0x1833CB
InitFollowerIndicator: skip 1 ; PC 0x1833CC
InitFollowerXCoord: skip 2 ; PC 0x1833CD
InitFollowerYCoord: skip 2 ; PC 0x1833CF
InitFollowerYCoord: skip 2 ; PC 0x1833CD
InitFollowerXCoord: skip 2 ; PC 0x1833CF
InitDroppedFollowerIndoors: skip 1 ; PC 0x1833D1
InitDroppedFollowerLayer: skip 1 ; PC 0x1833D2
InitFollowerDropped: skip 1 ; PC 0x1833D3

View File

@@ -646,7 +646,7 @@ RTL
; CollectPowder:
;--------------------------------------------------------------------------------
CollectPowder:
LDY.w SprItemReceipt, X ; Retrieve stored item type
LDY.w SprSourceItemId, X ; Retrieve stored item type
BNE +
; if for any reason the item value is 0 reload it, just in case
%GetPossiblyEncryptedItem(WitchItem, SpriteItemValues) : TAY
@@ -792,51 +792,13 @@ RTL
}
;--------------------------------------------------------------------------------
MaybePlaySelectSFX:
LDA.w DungeonID : BMI .not_dungeon
.play
LDA.b #$20 : STA.w SFX3 ; menu select sound
RTL
.not_dungeon
LDA.l HUDDungeonItems : BIT.b #$13 : BEQ .dont_play
BIT.b #$0C : BEQ .dont_play
BRA .play
.dont_play
RTL
;--------------------------------------------------------------------------------
; A = item id being collected
ItemGetAlternateSFX:
PEA.w $C567 ; SNES to RTS to in bank 08
LDA.w AncillaGet, X : CMP.b #$4A : BNE +
; collecting pre-activated flute
LDA.b #$13 : JML Ancilla_SFX2_Near
+ ; not pre-activated flute
LDA.l !MULTIWORLD_RECEIVING_ITEM : BEQ .normal
LDA.l MultiworldJunkItemTimer : BEQ .normal
LDA.w AncillaGet, X
JSL.l ItemIsJunk : BEQ .normal
.multijunk
LDA.b #$3B : JML Ancilla_SFX3_Near ; what we wrote over
.normal
LDA.b #$0F : JML Ancilla_SFX3_Near ; what we wrote over
; A = item id being collected
ItemGetOverworldAlternateSFX:
CPY.b #$4A : BNE +
JSL Sound_SetSfxPanWithPlayerCoords : ORA.b #$13 : STA.w SFX2
LDA.w DungeonID : BMI .not_dungeon
.play
LDA.b #$20 : STA.w SFX3 ; menu select sound
RTL
+ ; normal itemget sfx
LDA.l !MULTIWORLD_RECEIVING_ITEM : BEQ .normal
LDA.l MultiworldJunkItemTimer : BEQ .normal
TYA
JSL.l ItemIsJunk : BEQ .normal
.multijunk
JSL Sound_SetSfxPanWithPlayerCoords : ORA.b #$3B : STA.w SFX3
.not_dungeon
LDA.l HUDDungeonItems : BIT.b #$13 : BEQ .dont_play
BIT.b #$0C : BEQ .dont_play
BRA .play
.dont_play
RTL
.normal
JSL Sound_SetSfxPanWithPlayerCoords : ORA.b #$0F : STA.w SFX3 ; what we wrote over
RTL
;--------------------------------------------------------------------------------

View File

@@ -243,7 +243,7 @@ endmacro
%ReceiptProps($67, -4, 0, $FF, $F36A, $FF, skip, skip) ; 67 -
%ReceiptProps($68, -4, 0, $FF, $F36A, $FF, skip, skip) ; 68 -
%ReceiptProps($69, -4, 0, $FF, $F36A, $FF, skip, skip) ; 69 -
%ReceiptProps($6A, -4, 0, $49, $F36A, $FF, triforce, skip) ; 6A - Triforce
%ReceiptProps($6A, -4, 0, $4A, $F36A, $FF, triforce, skip) ; 6A - Triforce
%ReceiptProps($6B, -4, 0, $50, $F36A, $FF, goal_item, skip) ; 6B - Power star
%ReceiptProps($6C, -4, 0, $49, $F36A, $FF, goal_item, skip) ; 6C - Triforce Piece
%ReceiptProps($6D, -4, 0, $FF, $F36A, $FF, request_F0, skip) ; 6D - Server request item
@@ -1437,7 +1437,7 @@ StandingItemGraphicsOffsets:
dw $0960 ; D0 - Bee trap
dw $0 ; D1 - Apples
dw $0 ; D2 - Fairy
dw $11E0 ; D3 - Chicken
dw BigDecompressionBuffer+$0140 ; D3 - Chicken
dw $01E0 ; D4 - Big Magic
dw $11E0 ; D5 - 5 Arrows
dw $0 ; D6 - Good Bee

View File

@@ -376,7 +376,7 @@ TransferCommonToVRAM:
REP #$21
SEP #$10
LDA.w #BigDecompressionBuffer+$2000
LDA.w #BigDecompressionBuffer+$2400
LDX.b #BigDecompressionBuffer>>16
STA.w $4302
STX.w $4304

View File

@@ -1,4 +1,7 @@
; hooks
org $81DB19
JSL MaybeSkipSmashTerrain : BCS $81DB11
org $81E6B0
JSL RevealPotItem
RTS
@@ -39,6 +42,9 @@ org $86d180
org $86d18d ; <- 3518D - sprite_absorbable.asm : 274 (LDA $7EF36F : INC A : STA $7EF36F)
JSL KeyGet
org $86E24A
JSR MaybeSkipTerrainDebris
org $86f9f3 ; bank06.asm : 6732 (JSL SpritePrep_LoadProperties)
JSL LoadProperties_PreserveCertainProps
@@ -46,6 +52,11 @@ org $86828A
Sprite_SpawnSecret_SpriteSpawnDynamically:
JSL CheckSprite_Spawn
org $87B114
JSL MaybeUnableToLiftPotSfx
NOP #4
db $30 ; BMI
org $87B169
JSL PreventPotSpawn : NOP
@@ -80,13 +91,25 @@ InitializeMirrorHDMA:
org $89D62E
UWSpritesPointers: ; 0x250 bytes for 0x128 rooms' 16-bit pointers
org $89D87E
if !FEATURE_FIX_BASEROM
org $81DB67
else
org $89D87E
endif
UWPotsPointers: ; 0x250 bytes for 0x128 rooms' 16-bit pointers
org $89DACE
if !FEATURE_FIX_BASEROM
org $01DDE7
else
org $89DACE
endif
UWPotsData: ; variable number of bytes (max 0x11D1) for all pots data
org $A88000
if !FEATURE_FIX_BASEROM
org $89D92E
else
org $A88000
endif
UWSpritesData: ; variable number of bytes (max 0x2800) for all sprites and sprite drop data
; First $2800 bytes of this bank (28) is reserved for the sprite tables
@@ -177,7 +200,7 @@ RevealPotItem:
LDA.b RoomIndex : ASL : TAX
LDA.l UWPotsPointers,X : STA.b Scrap00 ; we may move this
LDA.l UWPotsPointers, X : STA.b Scrap00 ; we may move this
LDA.w #UWPotsPointers>>16 : STA.b Scrap02
LDY.w #$FFFD : LDX.w #$FFFF
@@ -671,7 +694,7 @@ KeyGet:
PHA
LDA.l StandingItemsOn : BNE +
PLA : RTL
+ LDY.w SprItemReceipt, X
+ LDY.w SprSourceItemId, X
LDA.w SprItemIndex, X : STA.w SpawnedItemIndex
LDA.w SprItemFlags, X : STA.w SpawnedItemFlag
STY.b Scrap00
@@ -685,7 +708,7 @@ KeyGet:
+ LSR : TAX
LDA.b Scrap00 : CMP.l KeyTable, X : BNE +
.countIt
LDA.l StandingItemCounterMask : AND.w SpawnedItemFlag : BEQ ++
LDA.l StandingItemCounterMask : AND SpawnedItemFlag : BEQ ++
JSL AddInventory
++ PLX : PLA : RTL
+ CMP.b #$AF : beq .countIt ; universal key
@@ -693,7 +716,7 @@ KeyGet:
.skip PLX
.receive
JSL Player_HaltDashAttackLong
TYA : JSL AttemptItemSubstitution : JSL ResolveLootIDLong : TAY
TYA : JSL AttemptItemSubstitution : TAY
JSL Link_ReceiveItem
PLA : DEC : RTL
@@ -701,7 +724,7 @@ KeyTable:
db $A0, $A0, $A2, $A3, $A4, $A5, $A6, $A7, $A8, $A9, $AA, $AB, $AC, $AD
BigKeyGet:
LDY.w SprItemReceipt, X
LDY.w SprSourceItemId, X
CPY.b #$32 : BNE +
STZ.w ItemReceiptMethod : LDY.b #$32 ; what we wrote over
PHX : JSL Link_ReceiveItem : PLX ; what we wrote over
@@ -773,7 +796,6 @@ CheckSprite_Spawn:
RTL
.check
LDA.b Scrap0D : CMP.b #$08 : BNE +
LDA.w LinkDashing : BNE .error
LDX.b #$0F
; loop looking for a Sprite with state 0A (carried by the player)
@@ -784,7 +806,9 @@ RTL
LDA.b #$00 : STZ.w SpriteAITable, X
LDA.b #$E4 : JSL Sprite_SpawnDynamically
BMI .error
LDA.b #$40 : TSB.w AButtonAct : RTL
LDA.w UseY1 : AND.b #$02 : BNE ++
LDA.b #$40 : TSB.w AButtonAct
++ RTL
.error
LDA.b #$3C ; SFX2_3C - error beep
@@ -803,15 +827,102 @@ PreventPotSpawn2:
LDA.b #$01 : TSB.b LinkStrafe ; what we wrote over
+ RTL
MaybeSkipTerrainDebris_long:
STZ.w SecretId ; what we wrote over
LDA.w SpriteTypeTable, X : CMP.b #$EC
BEQ .return
PLA : PLA : PLA : PLA : PLA
LDA.b #Sprite_ScheduleForBreakage_exit>>16 : PHA
PEA.w Sprite_ScheduleForBreakage_exit-1
.return
RTL
MaybeSkipSmashTerrain:
STY.w ManipIndex : LDA.w ManipTileMapX, Y ; what we wrote over
PHA
SEP #$30
LDX.b #$0F
- LDA.w SpriteAITable, X : BEQ .continue
DEX
BPL -
.skip
PLA : PLA
LDA.b #$3C : STA.w SFX2 ; error beep
SEC
RTL
.continue
REP #$30
PLA
CLC
RTL
MaybeUnableToLiftPotSfx:
- LDA.w SpriteAITable,X : BEQ .return
DEX
BPL -
LDA.b #$3C : STA.w SFX2 ; error beep
LDA.b #$FF
.return
RTL
CheckIfPotIsSpecial:
TXA ; give index to A so we can do a CMP.l
CMP.l $018550 ; see if our current index is that of object 230
BEQ .specialpot
BNE .normal_pot
; Normal pot, so run the vanilla code
.special_pot
PHX
; get pot index and cache room ID offset
LDA.b RoomIndex : ASL : STA.b Scrap0E
TAX
LDA.b $08
BIT.b $BF : BVC .upper ; if $BF has bit 14 set, it's upper layer
ORA.w #$2000 ; set the lower layer bit ($2000)
.upper
STA.b $90 ; cache tilemap offset
LDA.l UWPotsPointers,X : TAX
LDY.w #$0000
.next_pot
LDA.l UWPotsPointers&$FF0000, X ; read only the bank
CMP.w #$FFFF
BEQ .nothing
AND.w #$3FFF ; mask out the first three bits (used for item indicators and layer)
CMP.b $90 ; check against the tilemap offset
BEQ .get_flag
INX #3
INY #2
BRA .next_pot
.get_flag
TYX
LDA.l BitFieldMasks,X
LDX.b Scrap0E ; get room ID
STA.b Scrap0E
LDA.l RoomPotData,X
BRA .check_pot
.nothing
INC ; from FFFF, A is now 0000 so the AND always fails
.check_pot
LDY.b $08 : PLX
AND.b Scrap0E
BEQ .exit ; zero flag will be set, which is what we want
LDX.w #$0E82 ; the normal pot obj. See RoomDrawObjectData_#obj0E82
.normal_pot
; Normal pot, so run the vanilla code
LDA.l CurrentWorld ; check for dark world
.specialpot ; zero flag already set, so gtg
RTL
.exit
RTL
SetTheSceneFix:
STZ.b $6C

View File

@@ -34,16 +34,19 @@ RTL
; Output: 0 locked, 1 open
;--------------------------------------------------------------------------------
CheckForZelda:
LDA.l ProgressIndicator : CMP.b #$02 : !BLT + ; Skip if rain is falling
LDA.b #$01 ; pretend we have zelda anyway
RTL
+
LDA.l FollowerIndicator
LDA.l ProgressIndicator : CMP.b #$02 : !BLT + ; Skip if rain is falling
LDA.b #$01 ; pretend we have zelda anyway
RTL
+
LDA.l FollowerIndicator
RTL
;================================================================================
SetOverlayIfLamp:
JSL LampCheck
STA.b SUBDESQ ; write it directly to the overlay, this isn't a terrible idea at all
JSL LampCheck
BEQ +
LDA.b #$01
+
STA.b SUBDESQ ; write it directly to the overlay, this isn't a terrible idea at all
RTL
;================================================================================
; Mantle Object Changes

View File

@@ -2,6 +2,13 @@
; Maiden Crystal Fixes
;================================================================================
pushpc
org $9ECE25
STZ.w $1F00 : NOP : NOP ; fix to allow VRAM corruption during Blind fight
pullpc
;--------------------------------------------------------------------------------
; MaidenCrystalScript
;--------------------------------------------------------------------------------

135
menu/compress.py Normal file
View File

@@ -0,0 +1,135 @@
import sys
import os
# Compression function reverse-engineered from ALTTP's decompression routine at $00E7DE
def compress(data):
out = bytearray()
i = 0
while i < len(data):
# Check for repeating byte pattern
if i + 1 < len(data) and data[i] == data[i + 1]:
length = 2
while i + length < len(data) and data[i] == data[i + length] and length < 32:
length += 1
# Repeating byte: 0x20-0x3F
out.append(0x20 | (length - 1))
out.append(data[i])
i += length
continue
# Check for incremental byte pattern
if i + 2 < len(data) and data[i + 1] == data[i] + 1 and data[i + 2] == data[i] + 2:
length = 3
while i + length < len(data) and data[i + length] == data[i] + length and length < 32:
length += 1
# Incremental: 0x60-0x7F
out.append(0x60 | (length - 1))
out.append(data[i])
i += length
continue
# Check for repeating word pattern (alternating two bytes)
if i + 3 < len(data):
# Check if we have an alternating pattern: A B A B...
byte_a = data[i]
byte_b = data[i + 1]
length = 2
while i + length < len(data) and length < 32:
if length % 2 == 0:
if data[i + length] != byte_a:
break
else:
if data[i + length] != byte_b:
break
length += 1
if length >= 4: # Need at least 4 bytes (2 alternations) to make it worthwhile
# Repeating word: 0x40-0x5F
out.append(0x40 | (length - 1))
out.append(byte_a)
out.append(byte_b)
i += length
continue
# Check for copy from past (LZ with absolute offset)
best_len = 0
best_off = 0
search_start = max(0, i - 65536) # Can reference anywhere in output
for j in range(search_start, i):
length = 0
while i + length < len(data) and data[j + length] == data[i + length] and length < 1024:
length += 1
if length >= 2 and length > best_len:
best_len = length
best_off = j # Absolute offset, not relative!
if best_len >= 2:
# Copy from past: 0x80-0xDF or 0xE0-0xFE (extended)
# Offset is ABSOLUTE position in the output buffer
if best_len <= 32:
# Standard copy: 0x80-0xDF (5 bits for length-1, 16 bits for absolute offset)
out.append(0x80 | ((best_len - 1) & 0x1F))
out.append(best_off & 0xFF)
out.append((best_off >> 8) & 0xFF)
else:
# Extended copy: 0xE0-0xFE
if best_len > 1024:
best_len = 1024
# Command byte: 111LLLLL where L is length bits
cmd = 0xE0 | (((best_len - 1) >> 8) & 0x1F)
out.append(cmd)
out.append((best_len - 1) & 0xFF)
out.append(best_off & 0xFF)
out.append((best_off >> 8) & 0xFF)
i += best_len
continue
# Raw copy (no pattern found)
size = 1
while size < 32 and i + size < len(data):
# Don't extend raw copy if we find a better pattern ahead
if i + size + 1 < len(data) and data[i + size] == data[i + size + 1]:
break
if i + size + 2 < len(data) and data[i + size + 1] == data[i + size] + 1:
break
# Check LZ
found_lz = False
for j in range(max(0, i + size - 2048), i + size):
if i + size + 1 < len(data) and data[j] == data[i + size] and data[j + 1] == data[i + size + 1]:
found_lz = True
break
if found_lz:
break
size += 1
# Raw copy: 0x00-0x1F
out.append(size - 1)
out.extend(data[i:i + size])
i += size
# End marker
out.append(0xFF)
return out
if __name__ == '__main__':
if len(sys.argv) != 3:
print("Usage: python compress.py <input_file> <output_file>")
sys.exit(1)
input_file_path = sys.argv[1]
output_file_path = sys.argv[2]
if not os.path.exists(input_file_path):
print(f"Error: Input file not found at {input_file_path}")
sys.exit(1)
with open(input_file_path, 'rb') as f:
input_data = f.read()
compressed_data = compress(input_data)
with open(output_file_path, 'wb') as f:
f.write(compressed_data)
print(f"Successfully compressed '{input_file_path}' to '{output_file_path}'")

112
menu/decompress.py Normal file
View File

@@ -0,0 +1,112 @@
import sys
def decompress(compressed_data):
out = bytearray()
i = 0
while i < len(compressed_data):
cmd = compressed_data[i]
if cmd == 0xFF:
# End marker
break
i += 1
# Decode based on top 3 bits
top_bits = cmd & 0xE0
if cmd < 0xE0:
# Standard commands
length = (cmd & 0x1F) + 1
if top_bits == 0x00:
# Raw copy
out.extend(compressed_data[i:i+length])
i += length
elif top_bits == 0x20:
# Repeating byte
byte_val = compressed_data[i]
out.extend([byte_val] * length)
i += 1
elif top_bits == 0x40:
# Repeating word - alternates between two bytes
byte_a = compressed_data[i]
byte_b = compressed_data[i+1]
for j in range(length):
if j % 2 == 0:
out.append(byte_a)
else:
out.append(byte_b)
i += 2
elif top_bits == 0x60:
# Incremental
start_val = compressed_data[i]
for j in range(length):
out.append((start_val + j) & 0xFF)
i += 1
elif top_bits >= 0x80:
# Copy from past (absolute offset)
offset = compressed_data[i] | (compressed_data[i+1] << 8)
for j in range(length):
out.append(out[offset + j])
i += 2
else:
# Extended command (0xE0-0xFE)
# Command type from bits 5-7 (after shifting)
cmd_type = ((cmd << 3) & 0xE0)
# Length from bits 0-1 of command (high) + next byte (low)
length_high = cmd & 0x03
length_low = compressed_data[i]
length = (length_high << 8) | length_low
length += 1
i += 1
if cmd_type == 0x00:
# Extended raw copy
out.extend(compressed_data[i:i+length])
i += length
elif cmd_type == 0x20:
# Extended repeating byte
byte_val = compressed_data[i]
out.extend([byte_val] * length)
i += 1
elif cmd_type == 0x40:
# Extended repeating word - alternates between two bytes
byte_a = compressed_data[i]
byte_b = compressed_data[i+1]
for j in range(length):
if j % 2 == 0:
out.append(byte_a)
else:
out.append(byte_b)
i += 2
elif cmd_type == 0x60:
# Extended incremental
start_val = compressed_data[i]
for j in range(length):
out.append((start_val + j) & 0xFF)
i += 1
elif cmd_type >= 0x80:
# Extended copy from past
offset = compressed_data[i] | (compressed_data[i+1] << 8)
for j in range(length):
out.append(out[offset + j])
i += 2
return out
if __name__ == '__main__':
if len(sys.argv) != 3:
print("Usage: python decompress.py <input_file> <output_file>")
sys.exit(1)
with open(sys.argv[1], 'rb') as f:
compressed = f.read()
decompressed = decompress(compressed)
with open(sys.argv[2], 'wb') as f:
f.write(decompressed)
print(f"Decompressed {len(compressed)} bytes to {len(decompressed)} bytes")

BIN
menu/door_connectors.3bpp Normal file

Binary file not shown.

BIN
menu/door_connectors.3bppc Normal file

Binary file not shown.

BIN
menu/dr_sheet_dc.2bpp Normal file

Binary file not shown.

BIN
menu/dr_sheet_dc.2bppc Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
menu/map_icons.3bpp Normal file

Binary file not shown.

BIN
menu/map_icons.dat Normal file

Binary file not shown.

BIN
menu/map_icons.pal Normal file

Binary file not shown.

BIN
menu/map_icons_1.3bppc Normal file

Binary file not shown.

BIN
menu/map_icons_2.3bppc Normal file

Binary file not shown.

BIN
menu/map_icons_3.3bppc Normal file

Binary file not shown.

BIN
menu/map_icons_4.3bppc Normal file

Binary file not shown.

BIN
menu/map_icons_5.3bppc Normal file

Binary file not shown.

BIN
menu/map_icons_6.3bppc Normal file

Binary file not shown.

BIN
menu/map_icons_b.3bpp Normal file

Binary file not shown.

BIN
menu/map_sheet_d4.3bpp Normal file

Binary file not shown.

BIN
menu/map_sheet_d4.3bppc Normal file

Binary file not shown.

View File

@@ -427,8 +427,6 @@ StoreMusicOnDeath:
MSUInit:
PHP
LDA.b #$00
STA.l MSULoadedTrack
JSL MSUResumeReset
LDA.l NoBGM : BNE .done
@@ -499,6 +497,7 @@ MSUInit:
;--------------------------------------------------------------------------------
MSUResumeReset:
LDA.b #$00
STA.l MSULoadedTrack
STA.l MSUResumeTrack
STA.l MSUResumeTime : STA.l MSUResumeTime+1 : STA.l MSUResumeTime+2 : STA.l MSUResumeTime+3
STA.l MSUResumeControl

View File

@@ -96,15 +96,14 @@ Overworld_DetermineMusic:
CMP.b #$43 : BEQ .darkMountain
CMP.b #$45 : BEQ .darkMountain
CMP.b #$47 : BEQ .darkMountain
LDX.b #$09 ; default dark world theme
BRA .default_set
+
LDX.b #$02 ; hyrule field theme
LDA.l CurrentWorld : BEQ +
LDX.b #$09 ; default dark world theme
.default_set
; Check if we're entering the village
+ LDA.b OverworldIndex : CMP.b #$18 : BNE +
LDA.b OverworldIndex : CMP.b #$18 : BNE +
; Check what phase we're in
; LDA ProgressIndicator : CMP.b #$03 : !BGE .bunny
LDX.b #$07 ; Default village theme (phase <3)
@@ -174,24 +173,21 @@ RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Additional dark world checks to determine whether or not to fade out music
; on mosaic transitions
;
; On entry, A = $8A (overworld area being loaded)
Overworld_MosaicDarkWorldChecks:
CMP.b #$40 : BEQ .checkCrystals
CMP.b #$42 : BEQ .checkCrystals
CMP.b #$50 : BEQ .checkCrystals
CMP.b #$51 : BNE .doFade
pushpc
org $82AD6C
; Determine whether or not to fade out music on mosaic transitions
OverworldMosaicTransition_HandleSong:
LDA.b GameSubMode : CMP.b #$0D : BNE .dont_fade
LDA.w CurrentControlRequest : CMP.b #$04 : BEQ .dont_fade
BRA .fade_song
.checkCrystals
LDA.l CrystalsField : CMP.b #$7F : BEQ .done
warnpc $82ADA0
org $82ADA0
.fade_song
org $82ADA5
.dont_fade
.doFade
LDA.b #$F1 : STA.w MusicControlRequest ; thing we wrote over, fade out music
.done
RTL
pullpc
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
@@ -230,3 +226,22 @@ FallingMusicFadeOut:
.return
RTL
;--------------------------------------------------------------------------------
FixHalfVolumeOnSpawnExitToOverworld:
BEQ .exit : STA.w MusicControlRequest ; what we wrote over
LDA.w DungeonID : BNE .exit
LDA.b LinkPosY+1 : ROR : LDA.b LinkPosY : ROR
CMP.b #$DC : BCS .exit ; check if link loading in room from a spawn
; set queue to half volume to trigger full volume on exit
LDA.b #$F2 : STA.w MusicControlQueue
.exit
RTL
;--------------------------------------------------------------------------------
FixPreAgaMusicFadeOut:
LDA.l DRMode : TAX : CPX.b #$01 : BCS .exit_no_fade+1
LDA.b RoomIndex : CMP.w #$0030 : BEQ .exit_and_fade ; what we
CMP.w #$0040 : BEQ .exit_and_fade ; wrote over
.exit_no_fade
SEC : RTL
.exit_and_fade
CLC : RTL
;--------------------------------------------------------------------------------

View File

@@ -152,14 +152,23 @@ NewHUD_DrawDungeonCounters:
;================================================================================
NewHUD_DrawPrizeIcon:
REP #$10
SEP #$20
REP #$10
SEP #$20
LDA.b GameMode
CMP.b #$12 : BEQ .no_prize
CMP.b #$0E : BEQ +
LDA.l UpdateHUDFlag : BEQ NewHUD_DrawItemCounter
+
LDA.w DungeonID
CMP.b #$12 : BEQ .no_prize
CMP.b #$0E : BNE .check_hud_flag
LDA.b GameSubMode
CMP.b #$03 : BNE .check_dungeon
LDA.w SubModuleInterface
CMP.b #$06 : BNE .check_hud_flag
LDA.l $7EC22A
BRA .know_dungeon
.check_hud_flag
LDA.l UpdateHUDFlag : BEQ NewHUD_DrawItemCounter
.check_dungeon
LDA.w DungeonID
.know_dungeon
CMP.b #$1A : BCS .no_prize
CMP.b #$04 : BCC .no_prize
CMP.b #$08 : BNE .dungeon
@@ -176,19 +185,19 @@ NewHUD_DrawPrizeIcon:
LDA.l MapMode
REP #$30
BEQ .prize
BEQ .prize
LDA.w MapField
AND.l DungeonItemMasks,X
BEQ .no_prize
.prize
TYX
LDA.l CrystalPendantFlags_3,X : AND.w #$00FF
ASL : TAX
LDA.l PrizeIconTiles_Transparent,X : BEQ .no_icon
TAY
BRA .draw_prize
.prize
TYX
LDA.l CrystalPendantFlags_3,X : AND.w #$00FF
ASL : TAX
LDA.l PrizeIconTiles_Transparent,X : BEQ .no_icon
TAY
BRA .draw_prize
.pendant
LDY.w #!PTile
@@ -451,6 +460,15 @@ HUDHex4Digit_Long:
REP #$20
RTL
;================================================================================
ClearHearts:
LDA.w #!BlankTile
LDX.b #$14
- STA.l HUDTileMapBuffer+$066, X
STA.l HUDTileMapBuffer+$0A6, X
DEX #2
BPL -
RTS
;================================================================================
UpdateHearts:
PHB
@@ -461,6 +479,22 @@ UpdateHearts:
PHX
PLB
; OHKO mode
LDA.l ChallengeModes : AND.w #$0003 : CMP.w #$0001 : BNE +
LDA.w #$240A
STA.l HUDTileMapBuffer+$068
INC
STA.l HUDTileMapBuffer+$06A
INC
STA.l HUDTileMapBuffer+$06C
JMP .skip_partial
+
; Gloom mode
LDA.l ChallengeModes : AND.w #$0003 : CMP.w #$0002 : BNE +
JSR ClearHearts
+
LDA.w MaximumHealth
LSR
LSR
@@ -480,11 +514,11 @@ UpdateHearts:
CPX.b #$01
BMI .done_hearts
PHX
LDA.l HUDHeartColors_index : ASL : TAX
LDA.l HUDHeartColors_masks_game_hud,X
PLX
ORA.w #$20A0
PHX
LDA.l HUDHeartColors_index : ASL : TAX
LDA.l HUDHeartColors_masks_game_hud,X
PLX
ORA.w #$20A0
CPY.b #$01
BPL .add_heart
@@ -526,16 +560,16 @@ UpdateHearts:
CMP.w #$0005
BCS .more_than_half
LDA.l HUDHeartColors_index : ASL : TAX
LDA.l HUDHeartColors_masks_game_hud,X
ORA.w #$20A1
LDA.l HUDHeartColors_index : ASL : TAX
LDA.l HUDHeartColors_masks_game_hud,X
ORA.w #$20A1
STA.b (Scrap09)
BRA .skip_partial
BRA .skip_partial
.more_than_half
LDA.l HUDHeartColors_index : ASL : TAX
LDA.l HUDHeartColors_masks_game_hud,X
ORA.w #$20A0
LDA.l HUDHeartColors_index : ASL : TAX
LDA.l HUDHeartColors_masks_game_hud,X
ORA.w #$20A0
STA.b (Scrap09)
.skip_partial
@@ -545,29 +579,29 @@ UpdateHearts:
RTL
CheckHeartPaletteFileSelect:
LDA.l HUDHeartColors_index : ASL : TAX
LDA.l HUDHeartColors_masks_file_select,X
ORA.w #$0200
LDX.w #$000A
LDA.l HUDHeartColors_index : ASL : TAX
LDA.l HUDHeartColors_masks_file_select,X
ORA.w #$0200
LDX.w #$000A
RTL
CheckHeartPalette:
PHX
LDA.l HUDHeartColors_index : ASL : TAX
LDA.l HUDHeartColors_masks_game_hud,X
ORA.w #$20A0
PLX
PHX
LDA.l HUDHeartColors_index : ASL : TAX
LDA.l HUDHeartColors_masks_game_hud,X
ORA.w #$20A0
PLX
RTS
ColorAnimatedHearts:
PHX
REP #$20
LDA.l HUDHeartColors_index : ASL : TAX
LDA.l HUDHeartColors_masks_game_hud,X
PLX
ORA.l HeartFramesBaseTiles,X
STA.b [Scrap00],Y
SEP #$20
PHX
REP #$20
LDA.l HUDHeartColors_index : ASL : TAX
LDA.l HUDHeartColors_masks_game_hud,X
PLX
ORA.l HeartFramesBaseTiles,X
STA.b [Scrap00],Y
SEP #$20
RTL
HeartFramesBaseTiles:

View File

@@ -188,10 +188,12 @@ ItemBehavior:
BRA .store_inventory_tracking
.flute_inactive
LDA.b #$00 : STA.l FluteBitfield
LDA.l InventoryTracking : ORA.b #$02
BRA .store_inventory_tracking
.flute_active
LDA.b #$00 : STA.l FluteBitfield
LDA.l InventoryTracking : ORA.b #$01
BRA .store_inventory_tracking
@@ -1210,7 +1212,7 @@ MaybeFlagDungeonTotalsEntrance:
LDA.l CompassMode : AND.w #$000F : BEQ .maps ; Skip if we're not showing compass counts
JSR FlagCompassCount
.maps
; LDA.l MapHUDMode : AND.w #$000F : BEQ .done
LDA.l MapHUDMode : AND.w #$000F
LDX.w DungeonID
JSR FlagMapCount
.done
@@ -1225,7 +1227,7 @@ FlagCompassCount:
RTS
;--------------------------------------------------------------------------------
FlagMapCount:
; CMP.w #$0002 : BEQ .mapShown
CMP.w #$0002 : BEQ .mapShown
LDA.l MapMode : AND.w #$00FF : BEQ .mapShown
LDA.l MapField : AND.l DungeonItemMasks, X : BEQ .done ; skip if we don't have map
.mapShown

View File

@@ -138,7 +138,7 @@ RTL
ItemSet_Mushroom:
PHA
LDA.l NpcFlags+1 : ORA.b #$10 : STA.l NpcFlags+1
LDY.w SprItemReceipt, X ; Retrieve stored item type
LDY.w SprSourceItemId, X ; Retrieve stored item type
BNE +
; if for any reason the item value is 0 reload it, just in case
%GetPossiblyEncryptedItem(MushroomItem, SpriteItemValues) : TAY

View File

@@ -320,6 +320,7 @@ OWLightWorldOrCrossed:
OWFluteCancel:
{
lda.l FluteBitfield : cmp.b #$FF : beq +
lda.l OWFlags+1 : and.b #$01 : bne +
jsl FluteMenu_LoadTransport : rtl
+ lda.w RandoOverworldTargetEdge : bne +
@@ -331,8 +332,10 @@ OWFluteCancel2:
lda.b Joy1B_All : ora.b Joy1A_All : and.b #$c0 : bne +
jml FluteMenu_HandleSelection_NoSelection
+ inc.w SubModuleInterface
lda.l FluteBitfield : cmp.b #$FF : beq .cancel
lda.l OWFlags+1 : and.b #$01 : beq +
lda.b Joy1B_All : cmp.b #$40 : bne +
.cancel
lda.b #$01 : sta.w RandoOverworldTargetEdge
+ rtl
}
@@ -613,7 +616,13 @@ OWBonkDrops:
LDA.w $0400 : ORA.b 1,S : STA.w $0400
BRA .increment_collection
++
LDX.b OverworldIndex : LDA.l OverworldEventDataWRAM,X : ORA.b 1,S : STA.l OverworldEventDataWRAM,X
LDA.b OverworldIndex
BIT.b #$40 : BEQ +
LDA.l ProgressIndicator : CMP.b #$02
LDA.b OverworldIndex : BCS ++ : AND.b #$BF
++
+
TAX : LDA.l OverworldEventDataWRAM,X : ORA.b 1,S : STA.l OverworldEventDataWRAM,X
.increment_collection
REP #$20
@@ -673,13 +682,19 @@ OWBonkDropLookup:
{
; loop thru rando bonk table to find match
LDA.b OverworldIndex
BIT.b #$40 : BEQ +
LDA.l ProgressIndicator : AND.b #$FF : CMP.b #$02
LDA.b OverworldIndex : BCS ++ : AND.b #$BF
++
+
LDX.b #((UWBonkPrizeData-OWBonkPrizeData)-sizeof(OWBonkPrizeTable)) ; 41 bonk items, 6 bytes each
- CMP.w OWBonkPrizeData,X : BNE +
INX
PHA
LDA.w SpritePosXLow,Y : LSR A : LSR A : LSR A : LSR A
EOR.w SpritePosYLow,Y : CMP.w OWBonkPrizeData,X : BNE ++ ; X = row + 1
SEC : RTS
++ DEX : LDA.b OverworldIndex
PLA : SEC : RTS
++ DEX : PLA
+ CPX.b #$00 : BNE +
CLC : RTS
+ DEX : DEX : DEX : DEX : DEX : DEX : BRA -
@@ -689,16 +704,22 @@ OWBonkDropLookup:
OWBonkDropCollected:
{
; check if collected
CLC
LDA.b IndoorsFlag : BEQ +
LDA.l RoomDataWRAM[$0120].high : AND.b 3,S : BEQ .return ; S = Collected, FlagBitmask, X (row + 2)
SEC : RTS
+
LDX.b OverworldIndex : LDA.l OverworldEventDataWRAM,X : AND.b 3,S : BEQ .return ; S = Collected, FlagBitmask, X (row + 2)
LDA.b OverworldIndex
BIT.b #$40 : BEQ +
LDA.l ProgressIndicator : CMP.b #$02
LDA.b OverworldIndex : BCS ++ : AND.b #$BF
++
+
TAX
LDA.l OverworldEventDataWRAM,X : AND.b 3,S : BEQ .return ; S = Collected, FlagBitmask, X (row + 2)
SEC : RTS
.return
RTS
CLC : RTS
}
; A = SprItemReceipt, Y = Sprite Slot Index, X = free/overwritten
@@ -1384,291 +1405,291 @@ db $80, $80, $81
org $aaa800 ;PC 152800
OWNorthEdges:
; Min Max Width Mid OW Slot/OWID VRAM Terrain Dest Index
dw $00a0, $00a0, $0000, $00a0, $0000, $0000, $0000, $B040 ;Lost Woods (exit only)
dw $0458, $0540, $00e8, $04cc, $0a0a, $0000, $0000, $0000
dw $0f38, $0f60, $0028, $0f4c, $0f0f, $0000, $0000, $2041 ;Waterfall (exit only)
dw $0058, $0058, $0000, $0058, $1010, $0000, $0000, $0001
dw $0178, $0178, $0000, $0178, $1010, $0000, $0000, $0002
dw $0388, $0388, $0000, $0388, $1111, $0000, $0000, $0003
dw $0480, $05b0, $0130, $0518, $1212, $0000, $0000, $0004
dw $0f70, $0f90, $0020, $0f80, $1717, $0000, $0000, $0005
dw $0078, $0098, $0020, $0088, $1818, $0000, $0000, $0006 ;Kakariko
dw $0138, $0158, $0020, $0148, $1818, $0000, $0000, $0007
dw $02e8, $0348, $0060, $0318, $1819, $0000, $0000, $0008
dw $0478, $04d0, $0058, $04a4, $1a1a, $0000, $0000, $0009
dw $0510, $0538, $0028, $0524, $1a1a, $0000, $0000, $000a
dw $0a48, $0af0, $00a8, $0a9c, $1d1d, $0000, $0000, $000b
dw $0b28, $0b38, $0010, $0b30, $1d1d, $0000, $0001, $000c
dw $0b70, $0ba0, $0030, $0b88, $1d1d, $0000, $0000, $000d
dw $0a40, $0b10, $00d0, $0aa8, $2525, $0000, $0000, $000e
dw $0350, $0390, $0040, $0370, $2929, $0000, $0000, $000f
dw $0670, $06a8, $0038, $068c, $2b2b, $0000, $0000, $0010
dw $0898, $09b0, $0118, $0924, $2c2c, $0000, $0000, $0011 ;Links House
dw $0a40, $0ba0, $0160, $0af0, $2d2d, $0000, $0000, $0012
dw $0c70, $0c90, $0020, $0c80, $2e2e, $0000, $0000, $0013
dw $0f70, $0f80, $0010, $0f78, $2f2f, $0000, $0000, $0014
dw $0430, $0468, $0038, $044c, $3232, $0000, $0000, $0015
dw $04d8, $04f8, $0020, $04e8, $3232, $0000, $0000, $0016
dw $0688, $06b0, $0028, $069c, $3333, $0000, $0000, $0017
dw $08d0, $08f0, $0020, $08e0, $3434, $0000, $0000, $0018
dw $0a80, $0b40, $00c0, $0ae0, $3535, $0000, $0000, $0019
dw $0d38, $0d58, $0020, $0d48, $3536, $0000, $0001, $001a
dw $0d90, $0da0, $0010, $0d98, $3536, $0000, $0000, $001b
dw $06a0, $07b0, $0110, $0728, $3b3b, $0000, $0000, $001c
dw $0830, $09b0, $0180, $08f0, $3c3c, $0000, $0000, $001d
dw $0e78, $0e88, $0010, $0e80, $3f3f, $0000, $0001, $001e
dw $0ee0, $0fc0, $00e0, $0f50, $3f3f, $0000, $0000, $001f
dw $0458, $0540, $00e8, $04cc, $4a4a, $0000, $0000, $0020
dw $0058, $0058, $0000, $0058, $5050, $0000, $0000, $0021
dw $0178, $0178, $0000, $0178, $5050, $0000, $0000, $0022
dw $0388, $0388, $0000, $0388, $5151, $0000, $0000, $0023
dw $0480, $05b0, $0130, $0518, $5252, $0000, $0000, $0024
dw $0f70, $0f90, $0020, $0f80, $5757, $0000, $0000, $0025
dw $0078, $0098, $0020, $0088, $5858, $0000, $0000, $0026 ;Village of Outcasts
dw $0138, $0158, $0020, $0148, $5858, $0000, $0000, $0027
dw $02e8, $0348, $0060, $0318, $5859, $0000, $0000, $0028
dw $0478, $04d0, $0058, $04a4, $5a5a, $0000, $0000, $0029
dw $0510, $0538, $0028, $0524, $5a5a, $0000, $0000, $002a
dw $0a48, $0af0, $00a8, $0a9c, $5d5d, $0000, $0000, $002b
dw $0b28, $0b38, $0010, $0b30, $5d5d, $0000, $0001, $002c
dw $0b70, $0ba0, $0030, $0b88, $5d5d, $0000, $0000, $002d
dw $0a40, $0b10, $00d0, $0aa8, $6565, $0000, $0000, $002e
dw $0350, $0390, $0040, $0370, $6969, $0000, $0000, $002f
dw $0670, $06a8, $0038, $068c, $6b6b, $0000, $0000, $0030
dw $0898, $09b0, $0118, $0924, $6c6c, $0000, $0000, $0031
dw $0a40, $0ba0, $0160, $0af0, $6d6d, $0000, $0000, $0032
dw $0c70, $0c90, $0020, $0c80, $6e6e, $0000, $0000, $0033
dw $0f70, $0f80, $0010, $0f78, $6f6f, $0000, $0000, $0034
dw $0430, $0468, $0038, $044c, $7272, $0000, $0000, $0035
dw $04d8, $04f8, $0020, $04e8, $7272, $0000, $0000, $0036
dw $0688, $06b0, $0028, $069c, $7373, $0000, $0000, $0037
dw $08d0, $08f0, $0020, $08e0, $7474, $0000, $0000, $0038
dw $0a80, $0b40, $00c0, $0ae0, $7575, $0000, $0000, $0039
dw $0d38, $0d58, $0020, $0d48, $7576, $0000, $0001, $003a
dw $0d90, $0da0, $0010, $0d98, $7576, $0000, $0000, $003b
dw $06a0, $07b0, $0110, $0728, $7b7b, $0000, $0000, $003c
dw $0830, $09b0, $0180, $08f0, $7c7c, $0000, $0000, $003d
dw $0e78, $0e88, $0010, $0e80, $7f7f, $0000, $0001, $003e
dw $0ee0, $0fc0, $00e0, $0f50, $7f7f, $0000, $0000, $003f
dw $00a0, $00a0, $0000, $00a0, $0000, $0284, $0000, $B040 ;Lost Woods (exit only)
dw $0458, $0540, $00e8, $04cc, $0a0a, $180a, $0000, $0000
dw $0f38, $0f60, $0028, $0f4c, $0f0f, $009a, $0000, $2041 ;Waterfall (exit only)
dw $0058, $0058, $0000, $0058, $1010, $1800, $0000, $0001
dw $0178, $0178, $0000, $0178, $1010, $181e, $0000, $0002
dw $0388, $0388, $0000, $0388, $1111, $1820, $0000, $0003
dw $0480, $05b0, $0130, $0518, $1212, $1812, $0000, $0004
dw $0f70, $0f90, $0020, $0f80, $1717, $1820, $0000, $0005
dw $0078, $0098, $0020, $0088, $1818, $1802, $0000, $0006 ;Kakariko
dw $0138, $0158, $0020, $0148, $1818, $181a, $0000, $0007
dw $02e8, $0348, $0060, $0318, $1819, $1854, $0000, $0008
dw $0478, $04d0, $0058, $04a4, $1a1a, $1806, $0000, $0009
dw $0510, $0538, $0028, $0524, $1a1a, $1816, $0000, $000a
dw $0a48, $0af0, $00a8, $0a9c, $1d1d, $1804, $0000, $000b
dw $0b28, $0b38, $0010, $0b30, $1d1d, $1818, $0001, $000c
dw $0b70, $0ba0, $0030, $0b88, $1d1d, $1820, $0000, $000d
dw $0a40, $0b10, $00d0, $0aa8, $2525, $1806, $0000, $000e
dw $0350, $0390, $0040, $0370, $2929, $1820, $0000, $000f
dw $0670, $06a8, $0038, $068c, $2b2b, $1802, $0000, $0010
dw $0898, $09b0, $0118, $0924, $2c2c, $1814, $0000, $0011 ;Links House
dw $0a40, $0ba0, $0160, $0af0, $2d2d, $180e, $0000, $0012
dw $0c70, $0c90, $0020, $0c80, $2e2e, $1802, $0000, $0013
dw $0f70, $0f80, $0010, $0f78, $2f2f, $1820, $0000, $0014
dw $0430, $0468, $0038, $044c, $3232, $1800, $0000, $0015
dw $04d8, $04f8, $0020, $04e8, $3232, $180c, $0000, $0016
dw $0688, $06b0, $0028, $069c, $3333, $1804, $0000, $0017
dw $08d0, $08f0, $0020, $08e0, $3434, $180e, $0000, $0018
dw $0a80, $0b40, $00c0, $0ae0, $3535, $180c, $0000, $0019
dw $0d38, $0d58, $0020, $0d48, $3536, $185a, $0001, $001a
dw $0d90, $0da0, $0010, $0d98, $3536, $1860, $0000, $001b
dw $06a0, $07b0, $0110, $0728, $3b3b, $1816, $0000, $001c
dw $0830, $09b0, $0180, $08f0, $3c3c, $1810, $0000, $001d
dw $0e78, $0e88, $0010, $0e80, $3f3f, $1802, $0001, $001e
dw $0ee0, $0fc0, $00e0, $0f50, $3f3f, $181c, $0000, $001f
dw $0458, $0540, $00e8, $04cc, $4a4a, $180a, $0000, $0020
dw $0058, $0058, $0000, $0058, $5050, $181e, $0000, $0021
dw $0178, $0178, $0000, $0178, $5050, $1800, $0000, $0022
dw $0388, $0388, $0000, $0388, $5151, $1820, $0000, $0023
dw $0480, $05b0, $0130, $0518, $5252, $1812, $0000, $0024
dw $0f70, $0f90, $0020, $0f80, $5757, $1820, $0000, $0025
dw $0078, $0098, $0020, $0088, $5858, $1802, $0000, $0026 ;Village of Outcasts
dw $0138, $0158, $0020, $0148, $5858, $181a, $0000, $0027
dw $02e8, $0348, $0060, $0318, $5859, $1854, $0000, $0028
dw $0478, $04d0, $0058, $04a4, $5a5a, $1806, $0000, $0029
dw $0510, $0538, $0028, $0524, $5a5a, $1816, $0000, $002a
dw $0a48, $0af0, $00a8, $0a9c, $5d5d, $1804, $0000, $002b
dw $0b28, $0b38, $0010, $0b30, $5d5d, $1818, $0001, $002c
dw $0b70, $0ba0, $0030, $0b88, $5d5d, $1820, $0000, $002d
dw $0a40, $0b10, $00d0, $0aa8, $6565, $1806, $0000, $002e
dw $0350, $0390, $0040, $0370, $6969, $1820, $0000, $002f
dw $0670, $06a8, $0038, $068c, $6b6b, $1802, $0000, $0030
dw $0898, $09b0, $0118, $0924, $6c6c, $1814, $0000, $0031
dw $0a40, $0ba0, $0160, $0af0, $6d6d, $180e, $0000, $0032
dw $0c70, $0c90, $0020, $0c80, $6e6e, $1802, $0000, $0033
dw $0f70, $0f80, $0010, $0f78, $6f6f, $1820, $0000, $0034
dw $0430, $0468, $0038, $044c, $7272, $1800, $0000, $0035
dw $04d8, $04f8, $0020, $04e8, $7272, $180c, $0000, $0036
dw $0688, $06b0, $0028, $069c, $7373, $1804, $0000, $0037
dw $08d0, $08f0, $0020, $08e0, $7474, $180e, $0000, $0038
dw $0a80, $0b40, $00c0, $0ae0, $7575, $180c, $0000, $0039
dw $0d38, $0d58, $0020, $0d48, $7576, $185a, $0001, $003a
dw $0d90, $0da0, $0010, $0d98, $7576, $1860, $0000, $003b
dw $06a0, $07b0, $0110, $0728, $7b7b, $1816, $0000, $003c
dw $0830, $09b0, $0180, $08f0, $7c7c, $1810, $0000, $003d
dw $0e78, $0e88, $0010, $0e80, $7f7f, $1802, $0001, $003e
dw $0ee0, $0fc0, $00e0, $0f50, $7f7f, $181c, $0000, $003f
OWSouthEdges:
dw $0458, $0540, $00e8, $04cc, $0202, $0000, $0000, $0001
dw $0058, $0058, $0000, $0058, $0008, $0000, $0000, $0003
dw $0178, $0178, $0000, $0178, $0008, $0000, $0000, $0004
dw $0388, $0388, $0000, $0388, $0009, $0000, $0000, $0005
dw $0480, $05b0, $0130, $0518, $0a0a, $0000, $0000, $0006
dw $0f70, $0f90, $0020, $0f80, $0f0f, $0000, $0000, $0007
dw $0078, $0098, $0020, $0088, $1010, $0000, $0000, $0008
dw $0138, $0158, $0020, $0148, $1010, $0000, $0000, $0009
dw $02e8, $0348, $0060, $0318, $1111, $0000, $0000, $000a
dw $0478, $04d0, $0058, $04a4, $1212, $0000, $0000, $000b
dw $0510, $0538, $0028, $0524, $1212, $0000, $0000, $000c
dw $0a48, $0af0, $00a8, $0a9c, $1515, $0000, $0000, $000d
dw $0b28, $0b38, $0010, $0b30, $1515, $0000, $0001, $000e
dw $0b70, $0ba0, $0030, $0b88, $1515, $0000, $0000, $000f
dw $0a40, $0b10, $00d0, $0aa8, $1d1d, $0000, $0000, $0010
dw $0350, $0390, $0040, $0370, $1821, $0000, $0000, $0011
dw $0670, $06a8, $0038, $068c, $1b23, $0000, $0000, $0012
dw $0898, $09b0, $0118, $0924, $1b24, $0000, $0000, $0013
dw $0a40, $0ba0, $0160, $0af0, $2525, $0000, $0000, $0014
dw $0c70, $0c90, $0020, $0c80, $1e26, $0000, $0000, $0015
dw $0f70, $0f80, $0010, $0f78, $1e27, $0000, $0000, $0016
dw $0430, $0468, $0038, $044c, $2a2a, $0000, $0000, $0017
dw $04d8, $04f8, $0020, $04e8, $2a2a, $0000, $0000, $0018
dw $0688, $06b0, $0028, $069c, $2b2b, $0000, $0000, $0019
dw $08d0, $08f0, $0020, $08e0, $2c2c, $0000, $0000, $001a
dw $0a80, $0b40, $00c0, $0ae0, $2d2d, $0000, $0000, $001b
dw $0d38, $0d58, $0020, $0d48, $2e2e, $0000, $0001, $001c
dw $0d90, $0da0, $0010, $0d98, $2e2e, $0000, $0000, $001d
dw $06a0, $07b0, $0110, $0728, $3333, $0000, $0000, $001e
dw $0830, $09b0, $0180, $08f0, $3434, $0000, $0000, $001f
dw $0e78, $0e88, $0010, $0e80, $3737, $0000, $0001, $0020
dw $0ee0, $0fc0, $00e0, $0f50, $3737, $0000, $0000, $0021
dw $0458, $0540, $00e8, $04cc, $4242, $0000, $0000, $0022
dw $0058, $0058, $0000, $0058, $4048, $0000, $0000, $0023
dw $0178, $0178, $0000, $0178, $4048, $0000, $0000, $0024
dw $0388, $0388, $0000, $0388, $4049, $0000, $0000, $0025
dw $0480, $05b0, $0130, $0518, $4a4a, $0000, $0000, $0026
dw $0f70, $0f90, $0020, $0f80, $4f4f, $0000, $0000, $0027
dw $0078, $0098, $0020, $0088, $5050, $0000, $0000, $0028
dw $0138, $0158, $0020, $0148, $5050, $0000, $0000, $0029
dw $02e8, $0348, $0060, $0318, $5151, $0000, $0000, $002a
dw $0478, $04d0, $0058, $04a4, $5252, $0000, $0000, $002b
dw $0510, $0538, $0028, $0524, $5252, $0000, $0000, $002c
dw $0a48, $0af0, $00a8, $0a9c, $5555, $0000, $0000, $002d
dw $0b28, $0b38, $0010, $0b30, $5555, $0000, $0001, $002e
dw $0b70, $0ba0, $0030, $0b88, $5555, $0000, $0000, $002f
dw $0a40, $0b10, $00d0, $0aa8, $5d5d, $0000, $0000, $0030
dw $0350, $0390, $0040, $0370, $5861, $0000, $0000, $0031
dw $0670, $06a8, $0038, $068c, $5b63, $0000, $0000, $0032
dw $0898, $09b0, $0118, $0924, $5b64, $0000, $0000, $0033
dw $0a40, $0ba0, $0160, $0af0, $6565, $0000, $0000, $0034
dw $0c70, $0c90, $0020, $0c80, $5e66, $0000, $0000, $0035
dw $0f70, $0f80, $0010, $0f78, $5e67, $0000, $0000, $0036
dw $0430, $0468, $0038, $044c, $6a6a, $0000, $0000, $0037
dw $04d8, $04f8, $0020, $04e8, $6a6a, $0000, $0000, $0038
dw $0688, $06b0, $0028, $069c, $6b6b, $0000, $0000, $0039
dw $08d0, $08f0, $0020, $08e0, $6c6c, $0000, $0000, $003a
dw $0a80, $0b40, $00c0, $0ae0, $6d6d, $0000, $0000, $003b
dw $0d38, $0d58, $0020, $0d48, $6e6e, $0000, $0001, $003c
dw $0d90, $0da0, $0010, $0d98, $6e6e, $0000, $0000, $003d
dw $06a0, $07b0, $0110, $0728, $7373, $0000, $0000, $003e
dw $0830, $09b0, $0180, $08f0, $7474, $0000, $0000, $003f
dw $0e78, $0e88, $0010, $0e80, $7777, $0000, $0001, $0040
dw $0ee0, $0fc0, $00e0, $0f50, $7777, $0000, $0000, $0041
dw $0458, $0540, $00e8, $04cc, $0202, $100a, $0000, $0001
dw $0058, $0058, $0000, $0058, $0008, $2000, $0000, $0003
dw $0178, $0178, $0000, $0178, $0008, $2020, $0000, $0004
dw $0388, $0388, $0000, $0388, $0009, $2060, $0000, $0005
dw $0480, $05b0, $0130, $0518, $0a0a, $1012, $0000, $0006
dw $0f70, $0f90, $0020, $0f80, $0f0f, $1020, $0000, $0007
dw $0078, $0098, $0020, $0088, $1010, $1002, $0000, $0008
dw $0138, $0158, $0020, $0148, $1010, $101a, $0000, $0009
dw $02e8, $0348, $0060, $0318, $1111, $1014, $0000, $000a
dw $0478, $04d0, $0058, $04a4, $1212, $1006, $0000, $000b
dw $0510, $0538, $0028, $0524, $1212, $1016, $0000, $000c
dw $0a48, $0af0, $00a8, $0a9c, $1515, $1004, $0000, $000d
dw $0b28, $0b38, $0010, $0b30, $1515, $1018, $0001, $000e
dw $0b70, $0ba0, $0030, $0b88, $1515, $1020, $0000, $000f
dw $0a40, $0b10, $00d0, $0aa8, $1d1d, $1006, $0000, $0010
dw $0350, $0390, $0040, $0370, $1821, $2060, $0000, $0011
dw $0670, $06a8, $0038, $068c, $1b23, $2002, $0000, $0012
dw $0898, $09b0, $0118, $0924, $1b24, $2054, $0000, $0013
dw $0a40, $0ba0, $0160, $0af0, $2525, $100e, $0000, $0014
dw $0c70, $0c90, $0020, $0c80, $1e26, $2002, $0000, $0015
dw $0f70, $0f80, $0010, $0f78, $1e27, $2060, $0000, $0016
dw $0430, $0468, $0038, $044c, $2a2a, $1000, $0000, $0017
dw $04d8, $04f8, $0020, $04e8, $2a2a, $100c, $0000, $0018
dw $0688, $06b0, $0028, $069c, $2b2b, $1004, $0000, $0019
dw $08d0, $08f0, $0020, $08e0, $2c2c, $100e, $0000, $001a
dw $0a80, $0b40, $00c0, $0ae0, $2d2d, $100c, $0000, $001b
dw $0d38, $0d58, $0020, $0d48, $2e2e, $101a, $0001, $001c
dw $0d90, $0da0, $0010, $0d98, $2e2e, $1020, $0000, $001d
dw $06a0, $07b0, $0110, $0728, $3333, $1016, $0000, $001e
dw $0830, $09b0, $0180, $08f0, $3434, $1010, $0000, $001f
dw $0e78, $0e88, $0010, $0e80, $3737, $1002, $0001, $0020
dw $0ee0, $0fc0, $00e0, $0f50, $3737, $101c, $0000, $0021
dw $0458, $0540, $00e8, $04cc, $4242, $100a, $0000, $0022
dw $0058, $0058, $0000, $0058, $4048, $2000, $0000, $0023
dw $0178, $0178, $0000, $0178, $4048, $2020, $0000, $0024
dw $0388, $0388, $0000, $0388, $4049, $2060, $0000, $0025
dw $0480, $05b0, $0130, $0518, $4a4a, $1012, $0000, $0026
dw $0f70, $0f90, $0020, $0f80, $4f4f, $1020, $0000, $0027
dw $0078, $0098, $0020, $0088, $5050, $1002, $0000, $0028
dw $0138, $0158, $0020, $0148, $5050, $101a, $0000, $0029
dw $02e8, $0348, $0060, $0318, $5151, $1014, $0000, $002a
dw $0478, $04d0, $0058, $04a4, $5252, $1006, $0000, $002b
dw $0510, $0538, $0028, $0524, $5252, $1016, $0000, $002c
dw $0a48, $0af0, $00a8, $0a9c, $5555, $1004, $0000, $002d
dw $0b28, $0b38, $0010, $0b30, $5555, $1018, $0001, $002e
dw $0b70, $0ba0, $0030, $0b88, $5555, $1020, $0000, $002f
dw $0a40, $0b10, $00d0, $0aa8, $5d5d, $1006, $0000, $0030
dw $0350, $0390, $0040, $0370, $5861, $2060, $0000, $0031
dw $0670, $06a8, $0038, $068c, $5b63, $2002, $0000, $0032
dw $0898, $09b0, $0118, $0924, $5b64, $2054, $0000, $0033
dw $0a40, $0ba0, $0160, $0af0, $6565, $100e, $0000, $0034
dw $0c70, $0c90, $0020, $0c80, $5e66, $2002, $0000, $0035
dw $0f70, $0f80, $0010, $0f78, $5e67, $2060, $0000, $0036
dw $0430, $0468, $0038, $044c, $6a6a, $1000, $0000, $0037
dw $04d8, $04f8, $0020, $04e8, $6a6a, $100c, $0000, $0038
dw $0688, $06b0, $0028, $069c, $6b6b, $1004, $0000, $0039
dw $08d0, $08f0, $0020, $08e0, $6c6c, $100e, $0000, $003a
dw $0a80, $0b40, $00c0, $0ae0, $6d6d, $100c, $0000, $003b
dw $0d38, $0d58, $0020, $0d48, $6e6e, $101a, $0001, $003c
dw $0d90, $0da0, $0010, $0d98, $6e6e, $1020, $0000, $003d
dw $06a0, $07b0, $0110, $0728, $7373, $1016, $0000, $003e
dw $0830, $09b0, $0180, $08f0, $7474, $1010, $0000, $003f
dw $0e78, $0e88, $0010, $0e80, $7777, $1002, $0001, $0040
dw $0ee0, $0fc0, $00e0, $0f50, $7777, $101c, $0000, $0041
dw $0080, $0080, $0000, $0080, $8080, $0000, $0000, $0000 ;Pedestal (unused)
dw $0288, $02c0, $0038, $02a4, $8189, $0000, $0000, $0002 ;Zora (unused)
dw $0288, $02c0, $0038, $02a4, $8189, $1782, $0000, $0002 ;Zora (unused)
OWWestEdges:
dw $0070, $00a0, $0030, $0088, $0202, $0000, $0000, $0000
dw $0068, $0078, $0010, $0070, $0505, $0000, $0000, $0001
dw $0068, $0088, $0020, $0078, $0707, $0000, $0000, $0002
dw $0318, $0368, $0050, $0340, $050d, $0000, $0000, $0003
dw $0450, $0488, $0038, $046c, $1212, $0000, $0000, $0004
dw $0560, $05a0, $0040, $0580, $1212, $0000, $0000, $0005
dw $0488, $0500, $0078, $04c4, $1313, $0000, $0000, $0006
dw $0538, $05a8, $0070, $0570, $1313, $0000, $0000, $0007
dw $0470, $05a8, $0138, $050c, $1414, $0000, $0000, $0008
dw $0470, $0598, $0128, $0504, $1515, $0000, $0000, $0009
dw $0480, $0488, $0008, $0484, $1616, $0000, $0001, $000a
dw $04b0, $0510, $0060, $04e0, $1616, $0000, $0000, $000b
dw $0560, $0588, $0028, $0574, $1616, $0000, $0000, $000c
dw $0450, $0458, $0008, $0454, $1717, $0000, $0001, $000d
dw $0480, $04a8, $0028, $0494, $1717, $0000, $0000, $000e
dw $0718, $0738, $0020, $0728, $1b1b, $0000, $0000, $000f
dw $0908, $0948, $0040, $0928, $2222, $0000, $0000, $0010
dw $0878, $08a8, $0030, $0890, $2525, $0000, $0000, $0011
dw $0bb8, $0bc8, $0010, $0bc0, $2929, $0000, $0000, $0012
dw $0b60, $0ba0, $0040, $0b80, $2a2a, $0000, $0000, $0013
dw $0ab0, $0ad0, $0020, $0ac0, $2c2c, $0000, $0000, $0014
dw $0af0, $0b40, $0050, $0b18, $2c2c, $0000, $0000, $0015
dw $0b78, $0ba0, $0028, $0b8c, $2c2c, $0000, $0000, $0016
dw $0b10, $0b28, $0018, $0b1c, $2d2d, $0000, $0001, $604a ;Stone Bridge (exit only)
dw $0b68, $0b98, $0030, $0b80, $2d2d, $0000, $0000, $0017
dw $0a68, $0ab8, $0050, $0a90, $2e2e, $0000, $0000, $0018
dw $0b00, $0b78, $0078, $0b3c, $2e2e, $0000, $0001, $0019
dw $0c50, $0db8, $0168, $0d04, $3333, $0000, $0000, $001a
dw $0c78, $0ce3, $006b, $0cad, $3434, $0000, $0000, $001b
dw $0ce4, $0d33, $004f, $0d0b, $3434, $0000, $0001, $001c
dw $0d34, $0db8, $0084, $0d76, $3434, $0000, $0000, $001d
dw $0ea8, $0f20, $0078, $0ee4, $3a3a, $0000, $0000, $001e
dw $0f78, $0fa8, $0030, $0f90, $3a3a, $0000, $0000, $001f
dw $0f18, $0f18, $0000, $0f18, $3b3b, $0000, $0000, $0020
dw $0fc8, $0fc8, $0000, $0fc8, $3b3b, $0000, $0000, $0021
dw $0e28, $0fb8, $0190, $0ef0, $3c3c, $0000, $0000, $0022
dw $0f78, $0fb8, $0040, $0f98, $353d, $0000, $0000, $0023
dw $0f20, $0f40, $0020, $0f30, $3f3f, $0000, $0001, $0024
dw $0f70, $0fb8, $0048, $0f94, $3f3f, $0000, $0000, $0025
dw $0070, $00a0, $0030, $0088, $4242, $0000, $0000, $0026
dw $0068, $0078, $0010, $0070, $4545, $0000, $0000, $0027
dw $0068, $0088, $0020, $0078, $4747, $0000, $0000, $0028
dw $0318, $0368, $0050, $0340, $454d, $0000, $0000, $0029
dw $0450, $0488, $0038, $046c, $5252, $0000, $0000, $002a
dw $0560, $05a0, $0040, $0580, $5252, $0000, $0000, $002b
dw $0488, $0500, $0078, $04c4, $5353, $0000, $0000, $002c
dw $0538, $05a8, $0070, $0570, $5353, $0000, $0000, $002d
dw $0470, $05a8, $0138, $050c, $5454, $0000, $0000, $002e
dw $0470, $0598, $0128, $0504, $5555, $0000, $0000, $002f
dw $0480, $0488, $0008, $0484, $5656, $0000, $0001, $0030
dw $04b0, $0510, $0060, $04e0, $5656, $0000, $0000, $0031
dw $0560, $0588, $0028, $0574, $5656, $0000, $0000, $0032
dw $0450, $0458, $0008, $0454, $5757, $0000, $0001, $0033
dw $0480, $04a8, $0028, $0494, $5757, $0000, $0000, $0034
dw $0908, $0948, $0040, $0928, $6262, $0000, $0000, $0035
dw $0878, $08a8, $0030, $0890, $6565, $0000, $0000, $0036
dw $0b60, $0b68, $0008, $0b64, $6969, $0000, $0000, $0037
dw $0bb8, $0bc8, $0010, $0bc0, $6969, $0000, $0000, $0038
dw $0b60, $0ba0, $0040, $0b80, $6a6a, $0000, $0000, $0039
dw $0ab0, $0ad0, $0020, $0ac0, $6c6c, $0000, $0000, $003a
dw $0af0, $0b40, $0050, $0b18, $6c6c, $0000, $0000, $003b
dw $0b78, $0ba0, $0028, $0b8c, $6c6c, $0000, $0000, $003c
dw $0b68, $0b98, $0030, $0b80, $6d6d, $0000, $0000, $003d
dw $0a68, $0ab8, $0050, $0a90, $6e6e, $0000, $0000, $003e
dw $0b00, $0b78, $0078, $0b3c, $6e6e, $0000, $0001, $003f
dw $0c50, $0db8, $0168, $0d04, $7373, $0000, $0000, $0040
dw $0c78, $0ce3, $006b, $0cad, $7474, $0000, $0000, $0041
dw $0ce4, $0d33, $004f, $0d0b, $7474, $0000, $0001, $0042
dw $0d34, $0db8, $0084, $0d76, $7474, $0000, $0000, $0043
dw $0f18, $0f18, $0000, $0f18, $7b7b, $0000, $0000, $0044
dw $0fc8, $0fc8, $0000, $0fc8, $7b7b, $0000, $0000, $0045
dw $0e28, $0fb8, $0190, $0ef0, $7c7c, $0000, $0000, $0046
dw $0f78, $0fb8, $0040, $0f98, $757d, $0000, $0000, $0047
dw $0f20, $0f40, $0020, $0f30, $7f7f, $0000, $0001, $0048
dw $0f70, $0fb8, $0048, $0f94, $7f7f, $0000, $0000, $0049
dw $0070, $00a0, $0030, $0088, $0202, $00e0, $0000, $0000
dw $0068, $0078, $0010, $0070, $0505, $0060, $0000, $0001
dw $0068, $0088, $0020, $0078, $0707, $00e0, $0000, $0002
dw $0318, $0368, $0050, $0340, $050d, $1660, $0000, $0003
dw $0450, $0488, $0038, $046c, $1212, $00e0, $0000, $0004
dw $0560, $05a0, $0040, $0580, $1212, $08e0, $0000, $0005
dw $0488, $0500, $0078, $04c4, $1313, $0360, $0000, $0006
dw $0538, $05a8, $0070, $0570, $1313, $08e0, $0000, $0007
dw $0470, $05a8, $0138, $050c, $1414, $04e0, $0000, $0008
dw $0470, $0598, $0128, $0504, $1515, $04e0, $0000, $0009
dw $0480, $0488, $0008, $0484, $1616, $01e0, $0001, $000a
dw $04b0, $0510, $0060, $04e0, $1616, $04e0, $0000, $000b
dw $0560, $0588, $0028, $0574, $1616, $08e0, $0000, $000c
dw $0450, $0458, $0008, $0454, $1717, $00e0, $0001, $000d
dw $0480, $04a8, $0028, $0494, $1717, $01e0, $0000, $000e
dw $0718, $0738, $0020, $0728, $1b1b, $06e0, $0000, $000f
dw $0908, $0948, $0040, $0928, $2222, $05e0, $0000, $0010
dw $0878, $08a8, $0030, $0890, $2525, $01e0, $0000, $0011
dw $0bb8, $0bc8, $0010, $0bc0, $2929, $0960, $0000, $0012
dw $0b60, $0ba0, $0040, $0b80, $2a2a, $0960, $0000, $0013
dw $0ab0, $0ad0, $0020, $0ac0, $2c2c, $0360, $0000, $0014
dw $0af0, $0b40, $0050, $0b18, $2c2c, $05e0, $0000, $0015
dw $0b78, $0ba0, $0028, $0b8c, $2c2c, $08a0, $0000, $0016
dw $0b10, $0b28, $0018, $0b1c, $2d2d, $061c, $0001, $604a ;Stone Bridge (exit only)
dw $0b68, $0b98, $0030, $0b80, $2d2d, $08e0, $0000, $0017
dw $0a68, $0ab8, $0050, $0a90, $2e2e, $01e0, $0000, $0018
dw $0b00, $0b78, $0078, $0b3c, $2e2e, $0660, $0001, $0019
dw $0c50, $0db8, $0168, $0d04, $3333, $05e0, $0000, $001a
dw $0c78, $0ce3, $006b, $0cad, $3434, $02e0, $0000, $001b
dw $0ce4, $0d33, $004f, $0d0b, $3434, $05e0, $0001, $001c
dw $0d34, $0db8, $0084, $0d76, $3434, $08e0, $0000, $001d
dw $0ea8, $0f20, $0078, $0ee4, $3a3a, $03e0, $0000, $001e
dw $0f78, $0fa8, $0030, $0f90, $3a3a, $0860, $0000, $001f
dw $0f18, $0f18, $0000, $0f18, $3b3b, $0660, $0000, $0020
dw $0fc8, $0fc8, $0000, $0fc8, $3b3b, $08e0, $0000, $0021
dw $0e28, $0fb8, $0190, $0ef0, $3c3c, $04e0, $0000, $0022
dw $0f78, $0fb8, $0040, $0f98, $353d, $1860, $0000, $0023
dw $0f20, $0f40, $0020, $0f30, $3f3f, $05e0, $0001, $0024
dw $0f70, $0fb8, $0048, $0f94, $3f3f, $0860, $0000, $0025
dw $0070, $00a0, $0030, $0088, $4242, $00e0, $0000, $0026
dw $0068, $0078, $0010, $0070, $4545, $0060, $0000, $0027
dw $0068, $0088, $0020, $0078, $4747, $00e0, $0000, $0028
dw $0318, $0368, $0050, $0340, $454d, $1660, $0000, $0029
dw $0450, $0488, $0038, $046c, $5252, $00e0, $0000, $002a
dw $0560, $05a0, $0040, $0580, $5252, $08e0, $0000, $002b
dw $0488, $0500, $0078, $04c4, $5353, $0360, $0000, $002c
dw $0538, $05a8, $0070, $0570, $5353, $08e0, $0000, $002d
dw $0470, $05a8, $0138, $050c, $5454, $04e0, $0000, $002e
dw $0470, $0598, $0128, $0504, $5555, $04e0, $0000, $002f
dw $0480, $0488, $0008, $0484, $5656, $01e0, $0001, $0030
dw $04b0, $0510, $0060, $04e0, $5656, $04e0, $0000, $0031
dw $0560, $0588, $0028, $0574, $5656, $08e0, $0000, $0032
dw $0450, $0458, $0008, $0454, $5757, $00e0, $0001, $0033
dw $0480, $04a8, $0028, $0494, $5757, $01e0, $0000, $0034
dw $0908, $0948, $0040, $0928, $6262, $05e0, $0000, $0035
dw $0878, $08a8, $0030, $0890, $6565, $01e0, $0000, $0036
dw $0b60, $0b68, $0008, $0b64, $6969, $08e0, $0000, $0037
dw $0bb8, $0bc8, $0010, $0bc0, $6969, $0960, $0000, $0038
dw $0b60, $0ba0, $0040, $0b80, $6a6a, $0960, $0000, $0039
dw $0ab0, $0ad0, $0020, $0ac0, $6c6c, $0360, $0000, $003a
dw $0af0, $0b40, $0050, $0b18, $6c6c, $05e0, $0000, $003b
dw $0b78, $0ba0, $0028, $0b8c, $6c6c, $08a0, $0000, $003c
dw $0b68, $0b98, $0030, $0b80, $6d6d, $08e0, $0000, $003d
dw $0a68, $0ab8, $0050, $0a90, $6e6e, $01e0, $0000, $003e
dw $0b00, $0b78, $0078, $0b3c, $6e6e, $0660, $0001, $003f
dw $0c50, $0db8, $0168, $0d04, $7373, $05e0, $0000, $0040
dw $0c78, $0ce3, $006b, $0cad, $7474, $02e0, $0000, $0041
dw $0ce4, $0d33, $004f, $0d0b, $7474, $05e0, $0001, $0042
dw $0d34, $0db8, $0084, $0d76, $7474, $08e0, $0000, $0043
dw $0f18, $0f18, $0000, $0f18, $7b7b, $0660, $0000, $0044
dw $0fc8, $0fc8, $0000, $0fc8, $7b7b, $08e0, $0000, $0045
dw $0e28, $0fb8, $0190, $0ef0, $7c7c, $04e0, $0000, $0046
dw $0f78, $0fb8, $0040, $0f98, $757d, $1860, $0000, $0047
dw $0f20, $0f40, $0020, $0f30, $7f7f, $05e0, $0001, $0048
dw $0f70, $0fb8, $0048, $0f94, $7f7f, $0860, $0000, $0049
OWEastEdges:
dw $0070, $00a0, $0030, $0088, $0001, $0000, $0000, $0000
dw $0068, $0078, $0010, $0070, $0304, $0000, $0000, $0001
dw $0068, $0088, $0020, $0078, $0506, $0000, $0000, $0002
dw $0318, $0368, $0050, $0340, $030c, $0000, $0000, $0003
dw $0450, $0488, $0038, $046c, $1111, $0000, $0000, $0004
dw $0560, $05a0, $0040, $0580, $1111, $0000, $0000, $0005
dw $0488, $0500, $0078, $04c4, $1212, $0000, $0000, $0006
dw $0538, $05a8, $0070, $0570, $1212, $0000, $0000, $0007
dw $0470, $05a8, $0138, $050c, $1313, $0000, $0000, $0008
dw $0470, $0598, $0128, $0504, $1414, $0000, $0000, $0009
dw $0480, $0488, $0008, $0484, $1515, $0000, $0001, $000a
dw $04b0, $0510, $0060, $04e0, $1515, $0000, $0000, $000b
dw $0560, $0588, $0028, $0574, $1515, $0000, $0000, $000c
dw $0450, $0458, $0008, $0454, $1616, $0000, $0001, $000d
dw $0480, $04a8, $0028, $0494, $1616, $0000, $0000, $000e
dw $0718, $0738, $0020, $0728, $1a1a, $0000, $0000, $000f
dw $0908, $0948, $0040, $0928, $1821, $0000, $0000, $0010
dw $0878, $08a8, $0030, $0890, $1b24, $0000, $0000, $0011
dw $0bb8, $0bc8, $0010, $0bc0, $2828, $0000, $0000, $0012 ;Race Game
dw $0b60, $0ba0, $0040, $0b80, $2929, $0000, $0000, $0013
dw $0ab0, $0ad0, $0020, $0ac0, $2b2b, $0000, $0000, $0014
dw $0af0, $0b40, $0050, $0b18, $2b2b, $0000, $0000, $0015
dw $0b78, $0ba0, $0028, $0b8c, $2b2b, $0000, $0000, $0016
dw $0b68, $0b98, $0030, $0b80, $2c2c, $0000, $0000, $0018
dw $0a68, $0ab8, $0050, $0a90, $2d2d, $0000, $0000, $0019
dw $0b00, $0b78, $0078, $0b3c, $2d2d, $0000, $0001, $001a
dw $0c50, $0db8, $0168, $0d04, $3232, $0000, $0000, $001b
dw $0c78, $0ce3, $006b, $0cad, $3333, $0000, $0000, $001c
dw $0ce4, $0d33, $004f, $0d0b, $3333, $0000, $0001, $001d
dw $0d34, $0db8, $0084, $0d76, $3333, $0000, $0000, $001e
dw $0ea8, $0f20, $0078, $0ee4, $3039, $0000, $0000, $001f
dw $0f78, $0fa8, $0030, $0f90, $3039, $0000, $0000, $0020
dw $0f18, $0f18, $0000, $0f18, $3a3a, $0000, $0000, $0021
dw $0fc8, $0fc8, $0000, $0fc8, $3a3a, $0000, $0000, $0022
dw $0e28, $0fb8, $0190, $0ef0, $3b3b, $0000, $0000, $0023
dw $0f78, $0fb8, $0040, $0f98, $3c3c, $0000, $0000, $0024
dw $0f20, $0f40, $0020, $0f30, $353e, $0000, $0001, $0025
dw $0f70, $0fb8, $0048, $0f94, $353e, $0000, $0000, $0026
dw $0070, $00a0, $0030, $0088, $4041, $0000, $0000, $0027 ;Skull Woods
dw $0068, $0078, $0010, $0070, $4344, $0000, $0000, $0028
dw $0068, $0088, $0020, $0078, $4546, $0000, $0000, $0029
dw $0318, $0368, $0050, $0340, $434c, $0000, $0000, $002a
dw $0450, $0488, $0038, $046c, $5151, $0000, $0000, $002b
dw $0560, $05a0, $0040, $0580, $5151, $0000, $0000, $002c
dw $0488, $0500, $0078, $04c4, $5252, $0000, $0000, $002d
dw $0538, $05a8, $0070, $0570, $5252, $0000, $0000, $002e
dw $0470, $05a8, $0138, $050c, $5353, $0000, $0000, $002f
dw $0470, $0598, $0128, $0504, $5454, $0000, $0000, $0030
dw $0480, $0488, $0008, $0484, $5555, $0000, $0001, $0031
dw $04b0, $0510, $0060, $04e0, $5555, $0000, $0000, $0032
dw $0560, $0588, $0028, $0574, $5555, $0000, $0000, $0033
dw $0450, $0458, $0008, $0454, $5656, $0000, $0001, $0034
dw $0480, $04a8, $0028, $0494, $5656, $0000, $0000, $0035
dw $0908, $0948, $0040, $0928, $5861, $0000, $0000, $0036
dw $0878, $08a8, $0030, $0890, $5b64, $0000, $0000, $0037
dw $0b60, $0b68, $0008, $0b64, $6868, $0000, $0000, $0038 ;Dig Game
dw $0bb8, $0bc8, $0010, $0bc0, $6868, $0000, $0000, $0039
dw $0b60, $0ba0, $0040, $0b80, $6969, $0000, $0000, $003a
dw $0ab0, $0ad0, $0020, $0ac0, $6b6b, $0000, $0000, $003b
dw $0af0, $0b40, $0050, $0b18, $6b6b, $0000, $0000, $003c
dw $0b78, $0ba0, $0028, $0b8c, $6b6b, $0000, $0000, $003d
dw $0b68, $0b98, $0030, $0b80, $6c6c, $0000, $0000, $003e
dw $0a68, $0ab8, $0050, $0a90, $6d6d, $0000, $0000, $003f
dw $0b00, $0b78, $0078, $0b3c, $6d6d, $0000, $0001, $0040
dw $0c50, $0db8, $0168, $0d04, $7272, $0000, $0000, $0041
dw $0c78, $0ce3, $006b, $0cad, $7373, $0000, $0000, $0042
dw $0ce4, $0d33, $004f, $0d0b, $7373, $0000, $0001, $0043
dw $0d34, $0db8, $0084, $0d76, $7373, $0000, $0000, $0044
dw $0f18, $0f18, $0000, $0f18, $7a7a, $0000, $0000, $0045
dw $0fc8, $0fc8, $0000, $0fc8, $7a7a, $0000, $0000, $0046
dw $0e28, $0fb8, $0190, $0ef0, $7b7b, $0000, $0000, $0047
dw $0f78, $0fb8, $0040, $0f98, $7c7c, $0000, $0000, $0048
dw $0f20, $0f40, $0020, $0f30, $757e, $0000, $0001, $0049
dw $0f70, $0fb8, $0048, $0f94, $757e, $0000, $0000, $004a
dw $0058, $00c0, $0068, $008c, $8080, $0000, $0001, $0017 ;Hobo (unused)
dw $0070, $00a0, $0030, $0088, $0001, $0180, $0000, $0000
dw $0068, $0078, $0010, $0070, $0304, $0180, $0000, $0001
dw $0068, $0088, $0020, $0078, $0506, $0180, $0000, $0002
dw $0318, $0368, $0050, $0340, $030c, $1780, $0000, $0003
dw $0450, $0488, $0038, $046c, $1111, $00c0, $0000, $0004
dw $0560, $05a0, $0040, $0580, $1111, $08c0, $0000, $0005
dw $0488, $0500, $0078, $04c4, $1212, $0340, $0000, $0006
dw $0538, $05a8, $0070, $0570, $1212, $08c0, $0000, $0007
dw $0470, $05a8, $0138, $050c, $1313, $04c0, $0000, $0008
dw $0470, $0598, $0128, $0504, $1414, $04c0, $0000, $0009
dw $0480, $0488, $0008, $0484, $1515, $01c0, $0001, $000a
dw $04b0, $0510, $0060, $04e0, $1515, $04c0, $0000, $000b
dw $0560, $0588, $0028, $0574, $1515, $08c0, $0000, $000c
dw $0450, $0458, $0008, $0454, $1616, $00c0, $0001, $000d
dw $0480, $04a8, $0028, $0494, $1616, $01c0, $0000, $000e
dw $0718, $0738, $0020, $0728, $1a1a, $06c0, $0000, $000f
dw $0908, $0948, $0040, $0928, $1821, $1680, $0000, $0010
dw $0878, $08a8, $0030, $0890, $1b24, $1280, $0000, $0011
dw $0bb8, $0bc8, $0010, $0bc0, $2828, $0940, $0000, $0012 ;Race Game
dw $0b60, $0ba0, $0040, $0b80, $2929, $0940, $0000, $0013
dw $0ab0, $0ad0, $0020, $0ac0, $2b2b, $0340, $0000, $0014
dw $0af0, $0b40, $0050, $0b18, $2b2b, $05c0, $0000, $0015
dw $0b78, $0ba0, $0028, $0b8c, $2b2b, $08c0, $0000, $0016
dw $0b68, $0b98, $0030, $0b80, $2c2c, $08c0, $0000, $0018
dw $0a68, $0ab8, $0050, $0a90, $2d2d, $01c0, $0000, $0019
dw $0b00, $0b78, $0078, $0b3c, $2d2d, $0640, $0001, $001a
dw $0c50, $0db8, $0168, $0d04, $3232, $05c0, $0000, $001b
dw $0c78, $0ce3, $006b, $0cad, $3333, $02c0, $0000, $001c
dw $0ce4, $0d33, $004f, $0d0b, $3333, $05c0, $0001, $001d
dw $0d34, $0db8, $0084, $0d76, $3333, $08c0, $0000, $001e
dw $0ea8, $0f20, $0078, $0ee4, $3039, $1480, $0000, $001f
dw $0f78, $0fa8, $0030, $0f90, $3039, $1980, $0000, $0020
dw $0f18, $0f18, $0000, $0f18, $3a3a, $0640, $0000, $0021
dw $0fc8, $0fc8, $0000, $0fc8, $3a3a, $08c0, $0000, $0022
dw $0e28, $0fb8, $0190, $0ef0, $3b3b, $04c0, $0000, $0023
dw $0f78, $0fb8, $0040, $0f98, $3c3c, $08c0, $0000, $0024
dw $0f20, $0f40, $0020, $0f30, $353e, $1680, $0001, $0025
dw $0f70, $0fb8, $0048, $0f94, $353e, $1880, $0000, $0026
dw $0070, $00a0, $0030, $0088, $4041, $0180, $0000, $0027 ;Skull Woods
dw $0068, $0078, $0010, $0070, $4344, $0180, $0000, $0028
dw $0068, $0088, $0020, $0078, $4546, $0180, $0000, $0029
dw $0318, $0368, $0050, $0340, $434c, $1780, $0000, $002a
dw $0450, $0488, $0038, $046c, $5151, $00c0, $0000, $002b
dw $0560, $05a0, $0040, $0580, $5151, $08c0, $0000, $002c
dw $0488, $0500, $0078, $04c4, $5252, $0340, $0000, $002d
dw $0538, $05a8, $0070, $0570, $5252, $08c0, $0000, $002e
dw $0470, $05a8, $0138, $050c, $5353, $04c0, $0000, $002f
dw $0470, $0598, $0128, $0504, $5454, $04c0, $0000, $0030
dw $0480, $0488, $0008, $0484, $5555, $01c0, $0001, $0031
dw $04b0, $0510, $0060, $04e0, $5555, $04c0, $0000, $0032
dw $0560, $0588, $0028, $0574, $5555, $08c0, $0000, $0033
dw $0450, $0458, $0008, $0454, $5656, $00c0, $0001, $0034
dw $0480, $04a8, $0028, $0494, $5656, $01c0, $0000, $0035
dw $0908, $0948, $0040, $0928, $5861, $1680, $0000, $0036
dw $0878, $08a8, $0030, $0890, $5b64, $1280, $0000, $0037
dw $0b60, $0b68, $0008, $0b64, $6868, $08c0, $0000, $0038 ;Dig Game
dw $0bb8, $0bc8, $0010, $0bc0, $6868, $0940, $0000, $0039
dw $0b60, $0ba0, $0040, $0b80, $6969, $0940, $0000, $003a
dw $0ab0, $0ad0, $0020, $0ac0, $6b6b, $0340, $0000, $003b
dw $0af0, $0b40, $0050, $0b18, $6b6b, $05c0, $0000, $003c
dw $0b78, $0ba0, $0028, $0b8c, $6b6b, $08c0, $0000, $003d
dw $0b68, $0b98, $0030, $0b80, $6c6c, $08c0, $0000, $003e
dw $0a68, $0ab8, $0050, $0a90, $6d6d, $01c0, $0000, $003f
dw $0b00, $0b78, $0078, $0b3c, $6d6d, $0640, $0001, $0040
dw $0c50, $0db8, $0168, $0d04, $7272, $05c0, $0000, $0041
dw $0c78, $0ce3, $006b, $0cad, $7373, $02c0, $0000, $0042
dw $0ce4, $0d33, $004f, $0d0b, $7373, $05c0, $0001, $0043
dw $0d34, $0db8, $0084, $0d76, $7373, $08c0, $0000, $0044
dw $0f18, $0f18, $0000, $0f18, $7a7a, $0640, $0000, $0045
dw $0fc8, $0fc8, $0000, $0fc8, $7a7a, $08c0, $0000, $0046
dw $0e28, $0fb8, $0190, $0ef0, $7b7b, $04c0, $0000, $0047
dw $0f78, $0fb8, $0040, $0f98, $7c7c, $08c0, $0000, $0048
dw $0f20, $0f40, $0020, $0f30, $757e, $1680, $0001, $0049
dw $0f70, $0fb8, $0048, $0f94, $757e, $1880, $0000, $004a
dw $0058, $00c0, $0068, $008c, $8080, $0020, $0001, $0017 ;Hobo (unused)
org $aab9a0 ;PC 1539a0
OWSpecialDestIndex:
@@ -1818,4 +1839,4 @@ db $18, $0A, $D8 ; yx:{ 0x180, 0x0A0 }
db $18, $0F, $45 ; yx:{ 0x180, 0x0F0 }
db $FF ; END
org $89CA55
dw Overworld_Sprites_Screen1A_2&$FFFF
dw Overworld_Sprites_Screen1A_2&$FFFF

Some files were not shown because too many files have changed in this diff Show More