Compare commits
97 Commits
boss_souls
...
1.1.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 37ee113f9d | |||
| 5831117e36 | |||
| 420f2477fc | |||
| 727c265811 | |||
| 8de358d99f | |||
| 1ba813f068 | |||
| 13372307c2 | |||
| 63e8d5687b | |||
| a6ad4c082b | |||
| 74d9c72cc8 | |||
| 18a73e3b88 | |||
| 4f0703ea62 | |||
|
|
a97f8fbb48 | ||
|
|
ac7f50fc62 | ||
|
|
dd9ea4d38e | ||
|
|
5b7a4c11ed | ||
|
|
4437194cfe | ||
|
|
0d827eadd2 | ||
|
|
fca7f214bc | ||
|
|
a277fb12ac | ||
|
|
1242198bea | ||
|
|
96333b22a2 | ||
|
|
4f4f483647 | ||
|
|
dfe49a11c4 | ||
|
|
581e45a63c | ||
|
|
b583cc58ff | ||
|
|
761365927f | ||
|
|
68c511d6be | ||
|
|
94efc26bf3 | ||
|
|
029f687470 | ||
|
|
4dd7bac4d6 | ||
|
|
1368e15872 | ||
|
|
2fa0bfc4ef | ||
|
|
2418c1b322 | ||
|
|
00fb9e6c5d | ||
|
|
5936b08497 | ||
|
|
70a23191ba | ||
|
|
d21daccf4c | ||
|
|
7b93b4b4eb | ||
|
|
fee689e583 | ||
|
|
08ecc9b673 | ||
|
|
d451b531e7 | ||
|
|
7f7ffeb5fb | ||
|
|
b27d7c996b | ||
|
|
57b8b04f0b | ||
|
|
7334dd02db | ||
|
|
0fdec905d6 | ||
|
|
f91e2eb1a2 | ||
|
|
5a802eda70 | ||
|
|
4d3c2bd7dc | ||
|
|
fa72adb53d | ||
|
|
b24e440597 | ||
|
|
44b014fc65 | ||
|
|
78fa8b7dd9 | ||
|
|
db62d4c660 | ||
|
|
2ffcb1c3bd | ||
|
|
a9ef09e2d0 | ||
|
|
dfc182a2d5 | ||
|
|
a8b1fc989e | ||
|
|
c3616f2d65 | ||
|
|
912df0be14 | ||
|
|
2ed9de827b | ||
| 9b7e5646b3 | |||
| e4f9c4cffc | |||
| cef41b1674 | |||
|
|
060554a5fb | ||
|
|
e236543180 | ||
|
|
ea4f39e116 | ||
|
|
8ac480947d | ||
|
|
11ff5825ae | ||
|
|
34fa1cd98e | ||
|
|
4c5adfbee2 | ||
| 02b07528bb | |||
|
|
6566aa6d48 | ||
|
|
7164c3159d | ||
|
|
d75d912c7d | ||
|
|
953c115719 | ||
| 9256f48f5e | |||
|
|
1995d8747c | ||
|
|
d8341c650d | ||
|
|
021ba9d8a6 | ||
|
|
4088698af9 | ||
|
|
d19e22cc7d | ||
|
|
e266d351cd | ||
|
|
baec6954a3 | ||
|
|
faadd1d7f1 | ||
| 2344f9490e | |||
| 642aec9112 | |||
| bc0f396275 | |||
|
|
936ff5a882 | ||
| a3f892975f | |||
|
|
86efa74185 | ||
|
|
7b4470ddae | ||
|
|
2d84f7431e | ||
|
|
ed7fb312d5 | ||
|
|
aabb649578 | ||
|
|
e86cccad52 |
@@ -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,13 +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
|
||||
incsrc souls.asm
|
||||
warnpc $A58000
|
||||
|
||||
org $A28000
|
||||
@@ -193,7 +192,6 @@ fillbyte $00 : fill 32
|
||||
incbin "data/customitems.4bpp"
|
||||
PreloadedGraphicsROM:
|
||||
incbin "data/preloadedgfx.4bpp"
|
||||
incbin "data/bossicons.souls.4bpp"
|
||||
warnpc $A2B000
|
||||
org $A2B000
|
||||
incsrc itemdatatables.asm ; Statically mapped
|
||||
@@ -204,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
|
||||
@@ -246,7 +262,7 @@ warnpc $B1A000
|
||||
|
||||
org $B1A000
|
||||
GFX_HUD_Items:
|
||||
incbin "menu/drsheetdc.2bppc"
|
||||
incbin "menu/dr_sheet_dc.2bppc"
|
||||
warnpc $B1A800
|
||||
|
||||
org $B1A800
|
||||
@@ -299,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
|
||||
@@ -356,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
BIN
bin/linux/compress
Normal file
Binary file not shown.
BIN
bin/linux/decompress
Normal file
BIN
bin/linux/decompress
Normal file
Binary file not shown.
249
bin/src/compress.c
Normal file
249
bin/src/compress.c
Normal 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, ¤t)) {
|
||||
if (current.length > best.length) {
|
||||
best = current;
|
||||
}
|
||||
}
|
||||
if (!find_repeat_word(loc, size, buf, ¤t)) {
|
||||
if (current.length > best.length) {
|
||||
best = current;
|
||||
}
|
||||
}
|
||||
if (!find_incrementing_byte(loc, size, buf, ¤t)) {
|
||||
if (current.length > best.length) {
|
||||
best = current;
|
||||
}
|
||||
}
|
||||
if (!find_duplicate(loc, size, buf, ¤t)) {
|
||||
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, §ion)) {
|
||||
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
155
bin/src/decompress.c
Normal 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, §ion)) >= 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
BIN
bin/windows/compress.exe
Normal file
Binary file not shown.
BIN
bin/windows/decompress.exe
Normal file
BIN
bin/windows/decompress.exe
Normal file
Binary file not shown.
@@ -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
|
||||
|
||||
@@ -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
|
||||
91
bugfixes.asm
91
bugfixes.asm
@@ -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
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -15,27 +15,3 @@ dw $0000, $7E4E, $6F44, $1CF5, $7399, $1CE7, $02F9, $0233
|
||||
dw $7FFF, $7FFF, $0000, $5907, $6E0E, $0000, $7FBB, $7672
|
||||
.off_black
|
||||
dw $0000, $14A5, $14A5, $14A5, $14A5, $14A5, $14A5, $14A5
|
||||
.armos
|
||||
dw hexto555($000000), hexto555($F8F8F8), hexto555($D86060), hexto555($5070C8), hexto555($B090F8), hexto555($282828), hexto555($F0A068), hexto555($B06028)
|
||||
.lanmolas
|
||||
dw hexto555($787040), hexto555($585030), hexto555($484018), hexto555($50C090), hexto555($408858), hexto555($305830), hexto555($D8A800), hexto555($E06018)
|
||||
.moldorm
|
||||
dw hexto555($F8D018), hexto555($C8B818), hexto555($A89818), hexto555($806818), hexto555($503818), hexto555($903818), hexto555($D85800), hexto555($F8A828)
|
||||
.agahnim
|
||||
dw hexto555($000000), hexto555($F8F8F8), hexto555($C04080), hexto555($B08828), hexto555($E8C070), hexto555($282828), hexto555($90D038), hexto555($688020)
|
||||
.helmasaur
|
||||
dw hexto555($A00028), hexto555($D03828), hexto555($E88820), hexto555($4848B0), hexto555($7870E8), hexto555($A8A8F8), hexto555($F8F8F8), hexto555($181818)
|
||||
.arrghus
|
||||
dw hexto555($000000), hexto555($F8F8F8), hexto555($903018), hexto555($D85800), hexto555($F8A828), hexto555($282828), hexto555($E88068), hexto555($B04038)
|
||||
.mothula
|
||||
dw hexto555($000000), hexto555($F8F8F8), hexto555($4848B0), hexto555($7870E8), hexto555($A8A8F8), hexto555($282828), hexto555($F8A840), hexto555($D85820)
|
||||
.blind
|
||||
dw hexto555($88D0F8), hexto555($7890F8), hexto555($903018), hexto555($D85800), hexto555($F8A828), hexto555($282828), hexto555($E88068), hexto555($B04038)
|
||||
.kholdstare
|
||||
dw hexto555($7098C0), hexto555($58B0E8), hexto555($D0F8F8), hexto555($4828C8), hexto555($4828F0), hexto555($8070F8), hexto555($F8C8F8), hexto555($E088B0)
|
||||
.vitreous
|
||||
dw hexto555($000000), hexto555($F8F8F8), hexto555($50C090), hexto555($408858), hexto555($305830), hexto555($282828), hexto555($D8A800), hexto555($E06018)
|
||||
.trinexx
|
||||
dw hexto555($A00028), hexto555($A8A8F8), hexto555($7870E8), hexto555($4848B0), hexto555($505060), hexto555($788890), hexto555($78C0A8), hexto555($707068)
|
||||
.ganon
|
||||
dw hexto555($385088), hexto555($5088A8), hexto555($88C8A0), hexto555($B090F8), hexto555($C0A028), hexto555($886008), hexto555($B83010), hexto555($E86040)
|
||||
|
||||
@@ -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.
BIN
data/c2e3e.bin
BIN
data/c2e3e.bin
Binary file not shown.
BIN
data/c2e3e.gfx
BIN
data/c2e3e.gfx
Binary file not shown.
BIN
data/skull.bin
Normal file
BIN
data/skull.bin
Normal file
Binary file not shown.
@@ -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
|
||||
|
||||
|
||||
86
dialog.asm
86
dialog.asm
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
52
elder.asm
52
elder.asm
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
@@ -15,3 +15,12 @@ incsrc hooks/damage_hooks.asm
|
||||
incsrc hooks/overworld_sprite_hooks.asm
|
||||
|
||||
incsrc hooks/underworld_sprite_hooks.asm
|
||||
|
||||
org $85B8BA
|
||||
JSL GeldmanDrawOverride
|
||||
|
||||
org $9EAAAC
|
||||
JSL StalfosKnightDrawOverride
|
||||
|
||||
org $9EB209
|
||||
JSL BlobDrawOverride
|
||||
@@ -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
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
@@ -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
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -61,7 +61,3 @@ LDA.b [Scrap00],Y
|
||||
|
||||
org $89C416
|
||||
LDA.b [Scrap00],Y
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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:
|
||||
@@ -26,7 +26,7 @@ SpritePrep_Eyegore_become_mimic:
|
||||
;JSL resetSprite_Mimic : NOP
|
||||
|
||||
org $86ED9E ; Sprite_ApplyCalculatedDamage, skip high sprite id early exit
|
||||
; JSL IsItReallyAMimic : NOP ; now hooked into from souls.asm
|
||||
JSL IsItReallyAMimic : NOP
|
||||
|
||||
org $86EDA6 ; Sprite_ApplyCalculatedDamage .not_absorbable
|
||||
JSL notItemSprite_Mimic
|
||||
@@ -108,4 +108,4 @@ notItemSprite_Mimic:
|
||||
.continue
|
||||
; restore code
|
||||
REP #$20 : ASL #2
|
||||
RTL
|
||||
RTL
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
44
events.asm
44
events.asm
@@ -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
|
||||
|
||||
@@ -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
942
follower.asm
Normal 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
|
||||
@@ -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
108
gk/blink_loot.asm
Normal 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
645
gk/check_loot.asm
Normal 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
|
||||
43
gk/data/doors_connections.asm
Normal file
43
gk/data/doors_connections.asm
Normal 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
309
gk/data/doors_display.asm
Normal 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
|
||||
26
gk/data/entrance_tiles.asm
Normal file
26
gk/data/entrance_tiles.asm
Normal 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
38
gk/data/fall_warps.asm
Normal 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
276
gk/data/item_mapping.asm
Normal 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
261
gk/data/junk_items.asm
Normal 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
87
gk/data/spiral_stairs.asm
Normal 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
571
gk/data/split_room.asm
Normal 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
|
||||
258
gk/data/supertile_shapes.asm
Normal file
258
gk/data/supertile_shapes.asm
Normal 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
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
163
gk/draw_loot.asm
Normal 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
275
gk/draw_rooms.asm
Normal 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
214
gk/dungeon_map_hooks.asm
Normal 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
40
gk/dungeon_maps.asm
Normal 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
381
gk/dungeon_switch.asm
Normal 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
67
gk/fast_junk.asm
Normal 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
29
gk/gloom.asm
Normal 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
213
gk/map_bg3.asm
Normal 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
152
gk/pseudoflute.asm
Normal 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
208
gk/settings.asm
Normal 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
126
gk/special_weapons.asm
Normal 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
|
||||
;--------------------------------------------------------------------------------
|
||||
130
gk/variable_ganon_vulnerability.asm
Normal file
130
gk/variable_ganon_vulnerability.asm
Normal 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
24
gk_meta.asm
Normal 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
|
||||
;--------------------------------------------------------------------------------
|
||||
486
goalitem.asm
486
goalitem.asm
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
175
hooks.asm
175
hooks.asm
@@ -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,40 +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
|
||||
|
||||
;===================================================================================================
|
||||
;================================================================================
|
||||
;--------------------------------------------------------------------------------
|
||||
; Boss souls changes
|
||||
; Gloom VRAM overwrite
|
||||
;--------------------------------------------------------------------------------
|
||||
org $8DB866
|
||||
JSL CheckBossSoul : BRA + : NOP #2 : +
|
||||
org $828068
|
||||
JSL AdjustDefaultGraphics
|
||||
|
||||
org $86ED9E
|
||||
JSL CheckInvincibleFlag : NOP
|
||||
;================================================================================
|
||||
; 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
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
org $85DFFE
|
||||
JSL SoulPaletteSet : BRA + : NOP #5 : +
|
||||
;================================================================================
|
||||
;--------------------------------------------------------------------------------
|
||||
; Variable Ganon Vulnerability
|
||||
;--------------------------------------------------------------------------------
|
||||
org $88BBD4 ; ancilla_magic_powder.asm@253 (LDA #$0A : JSL Ancilla_CheckSpriteDamage.preset_class)
|
||||
JSL Ganon_CheckPowderVulnerability
|
||||
NOP #2
|
||||
|
||||
org $85DFB7
|
||||
JSL SoulPaletteApply : NOP #2
|
||||
org $1D8F4E ; sprite_ganon.asm@325 (LDA $04C5 : CMP #$02)
|
||||
JSL Ganon_CheckInvincible
|
||||
NOP
|
||||
|
||||
org $9E8086
|
||||
JSL HelmasaurPaletteFix : BRA + : NOP #2 : +
|
||||
org $0DD628 ; Bank0D.asm@1266 (LDA $0B6B, Y : AND #$02)
|
||||
JSL CheckBeeBoss
|
||||
NOP
|
||||
|
||||
org $9E838C
|
||||
JSL HelmasaurHammerFix : NOP
|
||||
org $0DD677 ; Bank0D.asm@1303 (JSL Ancilla_CheckSpriteDamage.preset_class)
|
||||
JSL Ganon_CheckBeeVulnerability
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
org $9DD884
|
||||
JSL MoldormPaletteFix_b : NOP
|
||||
|
||||
org $9DDB2E
|
||||
JSL MoldormPaletteFix_d : NOP
|
||||
;================================================================================
|
||||
; 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
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
@@ -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
|
||||
@@ -377,16 +377,16 @@ endmacro
|
||||
%ReceiptProps($ED, -4, 0, $49, $F36A, $FF, skip, skip) ; ED -
|
||||
%ReceiptProps($EE, -4, 0, $49, $F36A, $FF, skip, skip) ; EE -
|
||||
%ReceiptProps($EF, -4, 0, $49, $F36A, $FF, skip, skip) ; EF -
|
||||
%ReceiptProps($F0, -4, 0, $51, $F36A, $FF, skip, skip) ; F0 - Armos Soul
|
||||
%ReceiptProps($F1, -4, 0, $52, $F36A, $FF, skip, skip) ; F1 - Lanmolas Soul
|
||||
%ReceiptProps($F2, -4, 0, $53, $F36A, $FF, skip, skip) ; F2 - Moldorm Soul
|
||||
%ReceiptProps($F3, -4, 0, $54, $F36A, $FF, skip, skip) ; F3 - Helmasaur Soul
|
||||
%ReceiptProps($F4, -4, 0, $55, $F36A, $FF, skip, skip) ; F4 - Arrghus Soul
|
||||
%ReceiptProps($F5, -4, 0, $56, $F36A, $FF, skip, skip) ; F5 - Mothula Soul
|
||||
%ReceiptProps($F6, -4, 0, $57, $F36A, $FF, skip, skip) ; F6 - Blind Soul
|
||||
%ReceiptProps($F7, -4, 0, $58, $F36A, $FF, skip, skip) ; F7 - Kholdstare Soul
|
||||
%ReceiptProps($F8, -4, 0, $59, $F36A, $FF, skip, skip) ; F8 - Vitreous Soul
|
||||
%ReceiptProps($F9, -4, 0, $5A, $F36A, $FF, skip, skip) ; F9 - Trinexx Soul
|
||||
%ReceiptProps($F0, -4, 0, $49, $F36A, $FF, skip, skip) ; F0 -
|
||||
%ReceiptProps($F1, -4, 0, $49, $F36A, $FF, skip, skip) ; F1 -
|
||||
%ReceiptProps($F2, -4, 0, $49, $F36A, $FF, skip, skip) ; F2 -
|
||||
%ReceiptProps($F3, -4, 0, $49, $F36A, $FF, skip, skip) ; F3 -
|
||||
%ReceiptProps($F4, -4, 0, $49, $F36A, $FF, skip, skip) ; F4 -
|
||||
%ReceiptProps($F5, -4, 0, $49, $F36A, $FF, skip, skip) ; F5 -
|
||||
%ReceiptProps($F6, -4, 0, $49, $F36A, $FF, skip, skip) ; F6 -
|
||||
%ReceiptProps($F7, -4, 0, $49, $F36A, $FF, skip, skip) ; F7 -
|
||||
%ReceiptProps($F8, -4, 0, $49, $F36A, $FF, skip, skip) ; F8 -
|
||||
%ReceiptProps($F9, -4, 0, $49, $F36A, $FF, skip, skip) ; F9 -
|
||||
%ReceiptProps($FA, -4, 0, $49, $F36A, $FF, skip, skip) ; FA -
|
||||
%ReceiptProps($FB, -4, 0, $49, $F36A, $FF, skip, skip) ; FB -
|
||||
%ReceiptProps($FC, -4, 0, $49, $F36A, $FF, skip, skip) ; FC -
|
||||
@@ -656,16 +656,16 @@ endmacro
|
||||
%SpriteProps($ED, 2, 2, $04, $04, $0000) ; ED -
|
||||
%SpriteProps($EE, 2, 2, $04, $04, $0000) ; EE -
|
||||
%SpriteProps($EF, 2, 2, $04, $04, $0000) ; EF -
|
||||
%SpriteProps($F0, 2, 2, $83, $83, PalettesCustom_armos) ; F0 - Armos Soul
|
||||
%SpriteProps($F1, 2, 2, $83, $83, PalettesCustom_lanmolas) ; F1 - Lanmolas Soul
|
||||
%SpriteProps($F2, 2, 2, $83, $83, PalettesCustom_moldorm) ; F2 - Moldorm Soul
|
||||
%SpriteProps($F3, 2, 2, $83, $83, PalettesCustom_helmasaur) ; F3 - Helmasuar Soul
|
||||
%SpriteProps($F4, 2, 2, $83, $83, PalettesCustom_arrghus) ; F4 - Arrghus Soul
|
||||
%SpriteProps($F5, 2, 2, $83, $83, PalettesCustom_mothula) ; F5 - Mothula Soul
|
||||
%SpriteProps($F6, 2, 2, $83, $83, PalettesCustom_blind) ; F6 - Blind Soul
|
||||
%SpriteProps($F7, 2, 2, $83, $83, PalettesCustom_kholdstare) ; F7 - Kholdstare Soul
|
||||
%SpriteProps($F8, 2, 2, $83, $83, PalettesCustom_vitreous) ; F8 - Vitreous Soul
|
||||
%SpriteProps($F9, 2, 2, $83, $83, PalettesCustom_trinexx) ; F9 - Trinexx Soul
|
||||
%SpriteProps($F0, 2, 2, $04, $04, $0000) ; F0 -
|
||||
%SpriteProps($F1, 2, 2, $04, $04, $0000) ; F1 -
|
||||
%SpriteProps($F2, 2, 2, $04, $04, $0000) ; F2 -
|
||||
%SpriteProps($F3, 2, 2, $04, $04, $0000) ; F3 -
|
||||
%SpriteProps($F4, 2, 2, $04, $04, $0000) ; F4 -
|
||||
%SpriteProps($F5, 2, 2, $04, $04, $0000) ; F5 -
|
||||
%SpriteProps($F6, 2, 2, $04, $04, $0000) ; F6 -
|
||||
%SpriteProps($F7, 2, 2, $04, $04, $0000) ; F7 -
|
||||
%SpriteProps($F8, 2, 2, $04, $04, $0000) ; F8 -
|
||||
%SpriteProps($F9, 2, 2, $04, $04, $0000) ; F9 -
|
||||
%SpriteProps($FA, 2, 2, $04, $04, $0000) ; FA -
|
||||
%SpriteProps($FB, 2, 2, $04, $04, $0000) ; FB -
|
||||
%SpriteProps($FC, 2, 2, $04, $04, $0000) ; FC -
|
||||
@@ -932,16 +932,16 @@ endmacro
|
||||
%InventoryItem($ED, $0001, $0000, $0000) ; ED -
|
||||
%InventoryItem($EE, $0001, $0000, $0000) ; EE -
|
||||
%InventoryItem($EF, $0001, $0000, $0000) ; EF -
|
||||
%InventoryItem($F0, $0081, $0000, $0000) ; F0 - Armos Soul
|
||||
%InventoryItem($F1, $0081, $0000, $0000) ; F1 - Lanmolas Soul
|
||||
%InventoryItem($F2, $0081, $0000, $0000) ; F2 - Moldorm Soul
|
||||
%InventoryItem($F3, $0081, $0000, $0000) ; F3 - Helmasuar Soul
|
||||
%InventoryItem($F4, $0081, $0000, $0000) ; F4 - Arrghus Soul
|
||||
%InventoryItem($F5, $0081, $0000, $0000) ; F5 - Mothula Soul
|
||||
%InventoryItem($F6, $0081, $0000, $0000) ; F6 - Blind Soul
|
||||
%InventoryItem($F7, $0081, $0000, $0000) ; F7 - Kholdstare Soul
|
||||
%InventoryItem($F8, $0081, $0000, $0000) ; F8 - Vitreous Soul
|
||||
%InventoryItem($F9, $0081, $0000, $0000) ; F9 - Trinexx Soul
|
||||
%InventoryItem($F0, $0001, $0000, $0000) ; F0 -
|
||||
%InventoryItem($F1, $0001, $0000, $0000) ; F1 -
|
||||
%InventoryItem($F2, $0001, $0000, $0000) ; F2 -
|
||||
%InventoryItem($F3, $0001, $0000, $0000) ; F3 -
|
||||
%InventoryItem($F4, $0001, $0000, $0000) ; F4 -
|
||||
%InventoryItem($F5, $0001, $0000, $0000) ; F5 -
|
||||
%InventoryItem($F6, $0001, $0000, $0000) ; F6 -
|
||||
%InventoryItem($F7, $0001, $0000, $0000) ; F7 -
|
||||
%InventoryItem($F8, $0001, $0000, $0000) ; F8 -
|
||||
%InventoryItem($F9, $0001, $0000, $0000) ; F9 -
|
||||
%InventoryItem($FA, $0001, $0000, $0000) ; FA -
|
||||
%InventoryItem($FB, $0001, $0000, $0000) ; FB -
|
||||
%InventoryItem($FC, $0001, $0000, $0000) ; FC -
|
||||
@@ -1196,16 +1196,16 @@ ItemReceiptGraphicsOffsets:
|
||||
dw $0 ; ED -
|
||||
dw $0 ; EE -
|
||||
dw $0 ; EF -
|
||||
dw $1C20 ; F0 - Armos Soul
|
||||
dw $1C60 ; F1 - Lanmolas Soul
|
||||
dw $1CA0 ; F2 - Moldorm Soul
|
||||
dw $1D20 ; F3 - Helmasuar Soul
|
||||
dw $1D60 ; F4 - Arrghus Soul
|
||||
dw $1DA0 ; F5 - Mothula Soul
|
||||
dw $1DE0 ; F6 - Blind Soul
|
||||
dw $2020 ; F7 - Kholdstare Soul
|
||||
dw $2060 ; F8 - Vitreous Soul
|
||||
dw $20A0 ; F9 - Trinexx Soul
|
||||
dw $0 ; F0 -
|
||||
dw $0 ; F1 -
|
||||
dw $0 ; F2 -
|
||||
dw $0 ; F3 -
|
||||
dw $0 ; F4 -
|
||||
dw $0 ; F5 -
|
||||
dw $0 ; F6 -
|
||||
dw $0 ; F7 -
|
||||
dw $0 ; F8 -
|
||||
dw $0 ; F9 -
|
||||
dw $0 ; FA -
|
||||
dw $0 ; FB -
|
||||
dw $0 ; FC -
|
||||
@@ -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
|
||||
@@ -1466,16 +1466,16 @@ StandingItemGraphicsOffsets:
|
||||
dw $0 ; ED -
|
||||
dw $0 ; EE -
|
||||
dw $0 ; EF -
|
||||
dw $1C20 ; F0 - Armos Soul
|
||||
dw $1C60 ; F1 - Lanmolas Soul
|
||||
dw $1CA0 ; F2 - Moldorm Soul
|
||||
dw $1D20 ; F3 - Helmasuar Soul
|
||||
dw $1D60 ; F4 - Arrghus Soul
|
||||
dw $1DA0 ; F5 - Mothula Soul
|
||||
dw $1DE0 ; F6 - Blind Soul
|
||||
dw $2020 ; F7 - Kholdstare Soul
|
||||
dw $2060 ; F8 - Vitreous Soul
|
||||
dw $20A0 ; F9 - Trinexx Soul
|
||||
dw $0 ; F0 -
|
||||
dw $0 ; F1 -
|
||||
dw $0 ; F2 -
|
||||
dw $0 ; F3 -
|
||||
dw $0 ; F4 -
|
||||
dw $0 ; F5 -
|
||||
dw $0 ; F6 -
|
||||
dw $0 ; F7 -
|
||||
dw $0 ; F8 -
|
||||
dw $0 ; F9 -
|
||||
dw $0 ; FA -
|
||||
dw $0 ; FB -
|
||||
dw $0 ; FC -
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
135
menu/compress.py
Normal 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
112
menu/decompress.py
Normal 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
BIN
menu/door_connectors.3bpp
Normal file
Binary file not shown.
BIN
menu/door_connectors.3bppc
Normal file
BIN
menu/door_connectors.3bppc
Normal file
Binary file not shown.
BIN
menu/dr_sheet_dc.2bpp
Normal file
BIN
menu/dr_sheet_dc.2bpp
Normal file
Binary file not shown.
BIN
menu/dr_sheet_dc.2bppc
Normal file
BIN
menu/dr_sheet_dc.2bppc
Normal file
Binary file not shown.
BIN
menu/drfont.2bpp
BIN
menu/drfont.2bpp
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 |
@@ -9,7 +9,7 @@ UploadMenuOnlyIcons:
|
||||
REP #$20
|
||||
LDA.w #MenuOnlyIcons : STA.w $4342
|
||||
LDA.w #$1801 : STA.w $4340
|
||||
LDA.w #$03A0 : STA.w $4345
|
||||
LDA.w #$0240 : STA.w $4345
|
||||
LDA.w #$0F800>>1 : STA.w $2116
|
||||
|
||||
SEP #$20
|
||||
@@ -20,4 +20,4 @@ UploadMenuOnlyIcons:
|
||||
RTL
|
||||
|
||||
MenuOnlyIcons:
|
||||
incbin "drfont.2bpp"
|
||||
incbin "drfont.2bpp"
|
||||
BIN
menu/map_icons.3bpp
Normal file
BIN
menu/map_icons.3bpp
Normal file
Binary file not shown.
BIN
menu/map_icons.dat
Normal file
BIN
menu/map_icons.dat
Normal file
Binary file not shown.
BIN
menu/map_icons.pal
Normal file
BIN
menu/map_icons.pal
Normal file
Binary file not shown.
BIN
menu/map_icons_1.3bppc
Normal file
BIN
menu/map_icons_1.3bppc
Normal file
Binary file not shown.
BIN
menu/map_icons_2.3bppc
Normal file
BIN
menu/map_icons_2.3bppc
Normal file
Binary file not shown.
BIN
menu/map_icons_3.3bppc
Normal file
BIN
menu/map_icons_3.3bppc
Normal file
Binary file not shown.
BIN
menu/map_icons_4.3bppc
Normal file
BIN
menu/map_icons_4.3bppc
Normal file
Binary file not shown.
BIN
menu/map_icons_5.3bppc
Normal file
BIN
menu/map_icons_5.3bppc
Normal file
Binary file not shown.
BIN
menu/map_icons_6.3bppc
Normal file
BIN
menu/map_icons_6.3bppc
Normal file
Binary file not shown.
BIN
menu/map_icons_b.3bpp
Normal file
BIN
menu/map_icons_b.3bpp
Normal file
Binary file not shown.
BIN
menu/map_sheet_d4.3bpp
Normal file
BIN
menu/map_sheet_d4.3bpp
Normal file
Binary file not shown.
BIN
menu/map_sheet_d4.3bppc
Normal file
BIN
menu/map_sheet_d4.3bppc
Normal file
Binary file not shown.
3
msu.asm
3
msu.asm
@@ -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
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user