346 Commits

Author SHA1 Message Date
aerinon
a1044baf41 fix: sanc & quit fix 2024-10-10 08:27:18 -06:00
aerinon
cbfd77d812 change: warn when certain address change for the credits (they break the generator) 2024-07-02 08:47:49 -06:00
aerinon
86c970dc3a fix: some bytes designations on moved variables 2024-06-21 11:37:56 -06:00
aerinon
8e306f1379 fix: updatehudflag refs 2024-06-18 11:53:18 -06:00
aerinon
024746d78f Merge remote-tracking branch 'upstream/master' into DRUnstable 2024-06-18 11:50:26 -06:00
aerinon
aa3c8a232b fix: hera basement cage counting multiple times, again 2024-06-17 17:17:07 -06:00
aerinon
6e327c951f feat: couple nice to haves for mirror scroll & fake boots 2024-06-14 17:04:30 -06:00
aerinon
bc7cd584e3 feat: pseudoboots indicator 2024-06-14 15:09:22 -06:00
Lexi Rose
86f641b710 Merge pull request #217 from hiimcody1/pseudoboots-visibility
Add indicator for pseudoboots to File Select screen
2024-06-13 13:36:07 -07:00
Lexi Rose
cc309ecb48 Merge pull request #215 from ardnaxelarak/use_text_table
Replace long sequences of dbs with strings using a text table
2024-06-10 08:07:46 -07:00
hiimcody1
474cfba250 Add indicator for pseudoboots to File Select screen 2024-06-08 21:29:20 -04:00
aerinon
0157c5d05b fix: hera basement can now use AddInventory's chest key counter 2024-05-09 14:34:48 -06:00
aerinon
e12af76559 Fix ChestTurnCounter not incrementing if item belongs to another world 2024-04-12 16:15:33 -06:00
codemann8
d75c72f85d Some byte designation corrections + formatting 2024-04-12 15:58:09 -06:00
codemann8
0339e09b5d Formatting 2024-04-09 09:26:27 -06:00
codemann8
a70251d2b2 Applied labels and byte designators 2024-04-09 09:26:27 -06:00
codemann8
2e2b493240 Removing FastROM duplicates 2024-04-09 09:26:27 -06:00
aerinon
f25c9dd4c4 fix: dungeon indicator changes 2024-03-28 13:14:15 -06:00
aerinon
364fd81a93 fix: minor drops shouldn't drop if outside of proper dungeon 2024-03-14 13:28:54 -06:00
aerinon
0d18000070 feat: new tiles for dungeon indicators 2024-03-11 16:57:19 -06:00
29d241bcbe Replace long strings of dbs with using a text table 2024-02-20 23:04:25 -06:00
Lexi Rose
dcb0a2b42d Merge pull request #214 from crossedstaves/master
Bomb count fix
2024-02-18 08:41:39 -08:00
crossedstaves
de8703e13f Update retro.asm
Fix to erroneous infinite bomb count
2024-02-17 16:27:42 -06:00
sporchia
2daa8daaae some register issues 2024-02-17 14:24:25 -06:00
aerinon
16d249859f fix: issues around item substitution for harder difficulties 2024-02-07 15:15:22 -07:00
aerinon
ed8cefe0c6 fix: bad branch, bad org, dead code, bad args flags 2024-02-07 12:36:54 -07:00
aerinon
23f839cced fix: swamola issue with cached sprites
refactor: move some hooks
2024-01-26 11:33:32 -07:00
aerinon
50dec603e2 fix: duplicate code 2024-01-25 11:04:16 -07:00
aerinon
fc08fa33c8 Merge branch 'DRVolatile' into DRUnstable 2024-01-22 11:00:36 -07:00
aerinon
8d87e70e18 fix: shifted enemizer flag table defaults correctly 2024-01-17 13:11:01 -07:00
Randall Rupper
8654719572 feat: text speed up
refactor: code clean up

typo
2024-01-16 16:20:33 -07:00
Lexi Rose
ce8497e3d2 Merge pull request #213 from spannerisms/fixes
MSU, etc fix
2024-01-15 21:29:34 -06:00
spannerisms
014b3a719a fix things 2024-01-04 06:45:57 -05:00
Randall Rupper
8c080c81a6 refactor: clarify StandardAgaDmg code paths 2024-01-03 11:06:00 -07:00
KrisDavie
660674c051 Add toggle to override aga1 invulnerability in standard 2024-01-03 10:53:22 -07:00
Randall Rupper
553fb272a0 fix: remove terrorpin ai code 2024-01-03 10:32:47 -07:00
Randall Rupper
97f3c527b0 fix: shopsanity repeatable item fix 2024-01-02 17:57:33 -07:00
Lexi Rose
85581b6813 Merge pull request #212 from cassidoxa/bonkkey
Update HUD when picking up bonk key
2024-01-02 11:33:56 -06:00
cassidoxa
cec4e0430b Fix narrow heart piece sprite shadow flickering 2024-01-02 00:26:12 -05:00
cassidoxa
d81a19c367 Update HUD when picking up bonk key 2024-01-01 22:29:14 -05:00
Lexi Rose
88ef1f385d Merge pull request #211 from cassidoxa/prize_ancilla
Fix dungeon prize ancilla spawn regression
2023-12-28 03:36:58 -06:00
cassidoxa
7001767c9b Fix dungeon prize ancilla spawn regression 2023-12-27 11:39:00 -05:00
Randall Rupper
55f18eb108 fix: potential fix for Trinexx 2023-12-14 10:13:07 -07:00
Lexi Rose
7116cb6557 Merge pull request #210 from cassidoxa/bonkkey
Fix bonk key double count
2023-11-30 02:29:03 -06:00
cassidoxa
85e338ad67 Fix bonk key double count 2023-11-30 00:42:55 -05:00
Randall Rupper
9ac2156945 fix: MW item substitution 2023-11-22 13:13:44 -07:00
Randall Rupper
687f6b25bd Build script update 2023-11-15 15:10:25 -07:00
Randall Rupper
81cbc5d2ed Ignore 2023-11-15 15:10:25 -07:00
Randall Rupper
52325979a7 fix: YA Hera Boss music fix 2023-11-15 15:10:19 -07:00
Randall Rupper
79bdace3b3 fix: disable flute in rain state (except glitched modes)
fix(msu): GTBK music in DR
2023-11-15 14:49:29 -07:00
Randall Rupper
62356f0159 fix: disable flute in rain state (except glitched modes)
fix(msu): GTBK music in DR
2023-11-15 14:30:44 -07:00
aerinon
f7f558cd59 Don't double count torch item. (AddInventory/Link_ReceiveItem now count properly.) Update the hud when a key is absorbed off the torch. Link_ReceiveItem already does this. 2023-10-11 12:21:06 -06:00
aerinon
8c384ff123 Be more proactive about which sprites to move 2023-10-06 10:40:05 -06:00
aerinon
f3768ea0ad Fix problems with mystery hidden item total
Upgrade blue enemy drop indicator to work with caves
2023-09-26 13:31:34 -06:00
Lexi Rose
032d15fba6 Merge pull request #209 from tcprescott/patreon
Names for Patreon Supporters
2023-09-22 23:43:22 -05:00
Thomas Prescott
f133ce7159 add some extra space 2023-09-22 23:09:35 -05:00
Thomas Prescott
c5d8c69396 fix PC addresses for patrons 2023-09-22 22:49:57 -05:00
Thomas Prescott
f71759754e patreon fields 2023-09-22 21:49:50 -05:00
aerinon
3f0082a771 Fix merge error on hera boss music 2023-09-20 13:39:19 -06:00
aerinon
4eaa214626 Merge branch 'DRUnstable' into DRVolatile
# Conflicts:
#	hooks.asm
#	music.asm
#	newhud.asm
2023-09-20 13:34:52 -06:00
aerinon
1290751307 Merge branch 'Catobat-TavernFix' into DRUnstable 2023-09-20 13:31:03 -06:00
aerinon
a8a1eaa1b9 Fix for counter rolling over
Fix for Lamp for another player being substituted with standing items
Fix for received keys not being counted correctly
Fix for pendants counting as items
2023-09-20 12:54:44 -06:00
Lexi Rose
507ba379cf Merge pull request #208 from cassidoxa/v31.2.0-fixes
Don't increment highest mail on final stats prep
2023-09-17 13:30:02 -05:00
cassidoxa
334f721a29 Don't increment highest mail on final stats prep 2023-09-17 12:02:54 -04:00
aerinon
c0dff8e7c9 Bugfixes for duping/disappearing item and mutliworld crash 2023-09-13 14:28:18 -06:00
aerinon
b831dd29a5 Turn off enemy drop indicator based on flag 2023-09-12 10:10:42 -06:00
aerinon
5ad0e7781e Pikit override fix
Minor drops from enemies persist
2023-09-12 08:38:18 -06:00
Lexi Rose
0fdb6ed133 Merge pull request #207 from cassidoxa/v31.2.0-fixes
Add time stamp for tossed fighter sword item
2023-09-10 01:31:32 -05:00
cassidoxa
cc36ccc0b1 Add time stamp for tossed fighter sword item 2023-09-10 00:55:03 -04:00
aerinon
23ef62522b Fix potion refills counting in shops
Bee traps - graphics upgrade
2023-09-09 16:41:44 -06:00
aerinon
b67e5c8433 Merge remote-tracking branch 'baserom/master' into MergeDecompression
# Conflicts:
#	npcitems.asm
2023-09-09 13:13:18 -06:00
aerinon
a723fe2865 VRAM standing items 2023-09-09 13:12:05 -06:00
aerinon
f916346747 Stumpy bugfix 2023-09-08 14:55:25 -06:00
aerinon
2561737236 Merge remote-tracking branch 'baserom/master' into MergeDecompression
# Conflicts:
#	inventory.asm
#	newhud.asm
2023-09-08 13:49:16 -06:00
aerinon
e772b4a931 Progressive Shields fix
Fix for collection rate overflow
Fix for progressive shield standing item (narrow version)
Fix for double key counts
Multiworld item substitution
Made map key coutner not depend on new flag for now
2023-09-08 13:42:22 -06:00
aerinon
134651e4fb Merge remote-tracking branch 'baserom/master' into MergeDecompression
# Conflicts:
#	LTTP_RND_GeneralBugfixes.asm
#	inventory.asm
#	itemdatatables.asm
#	newitems.asm
2023-09-07 12:21:22 -06:00
aerinon
9fc85218ae Fixed ExtendedSRAM not saving
Fix enemy drops and pots with Fairies/Chickens/Big Magic
Fixed Big Magic refill when in chests/standing items
Changed shop code to respect ShopEnableCount flag
2023-09-01 14:13:01 -06:00
aerinon
aecc65595e Merge remote-tracking branch 'baserom/master' into MergeDecompression
# Conflicts:
#	bookofmudora.asm
2023-09-01 11:37:46 -06:00
aerinon
5ccdebe09d Fixing crashes 2023-08-31 14:22:46 -06:00
aerinon
b635126e81 Copmass count fix for 2 bytes 2023-08-30 16:16:05 -06:00
aerinon
150adec969 Sewers count fix 2023-08-30 15:25:29 -06:00
aerinon
e21067f0a2 Initial work on new items 2023-08-30 14:35:30 -06:00
aerinon
d09aea3ff9 2 byte compass counts 2023-08-30 12:33:27 -06:00
aerinon
cd67d27798 Hud update flag added for standing items
Ram addresses updated
Minor multiworld fix
2023-08-30 10:25:20 -06:00
aerinon
51011dcada Merge remote-tracking branch 'baserom/master' into MergeDecompression
# Conflicts:
#	events.asm
#	newitems.asm
#	shopkeeper.asm
#	tables.asm

Plus attempt to update standing items
2023-08-28 12:01:57 -06:00
aerinon
b688149dfa Fix for shops and powder
Fix for dungeon indicator
2023-08-28 11:32:46 -06:00
Catobat
6980d36d27 Fix issue with rooms $0124-$0127 at Tavern Back 2023-08-26 00:52:13 +02:00
aerinon
09702e659d Merge remote-tracking branch 'baserom/master' into MergeDecompression
# Conflicts:
#	goalitem.asm
#	inventory.asm
#	invertedmaps.asm
#	newhud.asm
#	pendantcrystalhud.asm

Also some bugfixes here and there
2023-08-24 16:16:31 -06:00
aerinon
f1dda4a8c0 Attempt to re-write standing items using the new decompressed gfx.
Fix a few bus left over from merge
2023-08-23 16:06:31 -06:00
aerinon
2a789b04e4 Merge remote-tracking branch 'baserom/master' into MergeDecompression
# Conflicts:
#	LTTP_RND_GeneralBugfixes.asm
#	bookofmudora.asm
#	build.bat
#	catfish.asm
#	compasses.asm
#	contrib.asm
#	darkworldspawn.asm
#	entrances.asm
#	events.asm
#	floodgatesoftlock.asm
#	flute.asm
#	framehook.asm
#	goalitem.asm
#	halfmagicbat.asm
#	heartpieces.asm
#	hooks.asm
#	inventory.asm
#	invertedmaps.asm
#	itemtext_lower.asm
#	lampmantlecone.asm
#	mantle.asm
#	msu.asm
#	music.asm
#	newhud.asm
#	newitems.asm
#	pendantcrystalhud.asm
#	ram.asm
#	rngfixes.asm
#	roomloading.asm
#	shopkeeper.asm
#	stats.asm
#	stats/credits.asm
#	stats/creditsnew.asm
#	stats/statConfig.asm
#	tables.asm
#	tablets.asm
#	utilities.asm
#	zoraking.asm
2023-08-23 13:02:39 -06:00
aerinon
78b5695e30 Prevent cross dungeon drops
Enemy drop indicator prototype
2023-08-17 13:39:18 -06:00
aerinon
459dacd582 Sewer fix
Multiworld absorbable fix
Thoughts on design for cross dungeon issues
2023-08-09 15:16:13 -06:00
codemann8
8d0585ec33 Fixed Hera boss music playing after boss defeated
# Conflicts:
#	music.asm
2023-08-07 12:11:12 -06:00
aerinon
1c0b7b5320 Merge branch 'DRMain' into DRUnstable 2023-08-07 10:41:12 -06:00
aerinon
bdf8c7bd6e Ignore more of the bitfield nibble of the CompassMode 2023-08-07 10:26:47 -06:00
aerinon
2c9161927e Fix incorrect address 2023-08-04 16:41:13 -06:00
aerinon
6a22218727 Merge branch 'DRUnstable' into DRVolatile
# Conflicts:
#	doorrando/bugfix/kholdstare_shell_collision.asm
2023-08-04 11:32:19 -06:00
aerinon
75545cf568 Mimic rework 2023-08-04 11:30:29 -06:00
codemann8
653f66e57a Fix for Hera music silence 2023-07-10 10:28:17 -06:00
codemann8
c424cf4311 Symmetrical GTCutscene Crystals 2023-07-10 10:25:50 -06:00
aerinon
05409f1875 Multiworld support for enemy drops. More logic for hera basement counting. 2023-07-10 10:25:37 -06:00
aerinon
15236c9aee Fix 2023-05-19 08:51:53 -06:00
aerinon
08c178a974 Fix Kholdstare shell collision at Lanmo 2 or other tiles where the shell could limit movement. 2023-04-14 14:13:27 -06:00
aerinon
5cac501cc7 Falling death flag 2023-04-14 14:03:40 -06:00
aerinon
ef057638c5 Comment edits 2023-04-10 12:20:15 -06:00
aerinon
568708afd3 Fix Kholdstare shell collision at Lanmo 2 or other tiles where the shell could limit movement. 2023-04-10 12:18:52 -06:00
aerinon
4f09d30fe5 Merge branch 'DRUnstable' into Enemizer
# Conflicts:
#	keydrop/standing_items.asm
2023-04-05 16:03:17 -06:00
codemann8
bd2432d2ce Moving some hijacked DR code to new location 2023-03-30 16:42:05 -06:00
aerinon
67f22ab602 Fix kodongo ai slightly better.
Introduce a flag for the FixPrizeOnTheEyes bug
2023-03-30 15:00:39 -06:00
aerinon
b10dff8a30 Minor clean up 2023-03-14 16:33:02 -06:00
aerinon
69a6e7f918 Version area reservation 2023-03-14 16:06:32 -06:00
aerinon
04aabc8bd8 Clear standing item data on transition to overworld
Standard+retro no arrow filler unless you have the bow
2023-03-13 15:54:19 -06:00
aerinon
0f541ad069 Assemble fix 2023-03-10 14:13:03 -07:00
aerinon
7e96db4ba6 Merge branch 'DRUnstable' into Enemizer
# Conflicts:
#	enemizer/hooks/blindboss_hooks.asm
2023-03-10 14:10:07 -07:00
aerinon
380f917e60 Fix for mirror portal in inverted
Yet another fix for blocked doors in Standard ER, minor alteration for the swamp entrance fix to work when blocked as well.
2023-03-08 08:26:34 -07:00
aerinon
5c213477bc Cave state fixes 2023-03-06 16:10:41 -07:00
aerinon
72e8d73277 Fix for lower layer blocked doors in standard 2023-03-02 16:21:02 -07:00
aerinon
13879317fe Mirror Portal + Entrance Fix 2023-03-01 15:41:54 -07:00
aerinon
b9c8984d6d Fix for door overruns
Minor graphical fix for sanc door
2023-03-01 15:41:36 -07:00
aerinon
096157e981 Changes graphical status of standard exits when blocking exits in rain
Fixes graphical issues with sanctuary and swamp hub lobbies
Major fix for decoupled doors landing area
Fix for multiworld absorbables
2023-02-24 14:22:42 -07:00
aerinon
2411d0344e Minor optimization on handling special door landing 2023-02-17 23:48:08 -07:00
aerinon
ff6b8b996b Merge branch 'DRFixes' of github.com:codemann8/z3randomizer into codemann8-DRFixes 2023-02-17 23:43:07 -07:00
aerinon
4a8b8b7691 Standard save and quit change for DR 2023-02-17 16:58:50 -07:00
codemann8
aaff8a1975 Improved door landing
Improved door landing
2023-02-02 18:37:13 -06:00
aerinon
296c311b0a Fix for lamp check in escape if entering from dark world. Also fixes the torch going out bug. 2023-01-27 15:12:30 -07:00
aerinon
8957b8db7b Fast ROM updates 2023-01-06 15:02:22 -07:00
aerinon
83465e39af Fix for blocked entrance doors 2022-12-16 15:14:33 -07:00
aerinon
955766dc2a Door state fix attempt2 2022-12-05 08:19:59 -07:00
aerinon
46272e7fad New goal "completionist" 2022-12-01 14:04:09 -07:00
aerinon
9e50d5f02c Aga fix for door state (no trap door) 2022-12-01 14:03:39 -07:00
aerinon
612597be12 Merge branch 'Synthesis' into DRUnstable 2022-12-01 10:01:57 -07:00
aerinon
3af9e75dbd Possible fix for standing items after Aga transition 2022-12-01 10:01:37 -07:00
aerinon
44a648e3be Killable thieves flag 2022-10-25 09:15:15 -06:00
aerinon
8e20d6280c Enemizer Cleanup 2022-10-06 14:16:47 -06:00
aerinon
686bb0c064 Big key door fix 2022-09-30 15:29:00 -06:00
aerinon
d6f50525a1 Big key door fix 2022-09-30 15:28:45 -06:00
aerinon
895074a4cb Support for new items
Support for static enemy drops
Bug fix for wrong sprites dead
2022-09-30 15:28:38 -06:00
aerinon
3fdf95a364 UW Sprites new home
Enemizer asm refinement
2022-09-27 14:38:28 -06:00
aerinon
5e93e59727 Enemizer migration 2022-09-20 16:38:20 -06:00
aerinon
9cdca6edb3 Fix for rain prevented doors and key door numbering 2022-09-07 16:51:57 -06:00
aerinon
6b853222f2 Fix for rain prevented doors and key door numbering 2022-09-07 16:51:29 -06:00
aerinon
2acee4abb9 Flute activated pickup sfx 2022-09-07 15:09:04 -06:00
aerinon
8a18566da1 Merge branch 'DRUnstable' into Synthesis
# Conflicts:
#	doorrando/overrides.asm
2022-08-24 14:27:34 -06:00
aerinon
0e15eb3560 Merge branch 'BlindZeldaDespawn' into DRUnstable 2022-08-24 14:26:48 -06:00
aerinon
0941cd321e Merge branch 'DRUnstable' into Synthesis 2022-08-24 14:24:37 -06:00
aerinon
2457c67d0e Bank map update 2022-08-24 13:13:24 -06:00
aerinon
e1fa3aa7b7 Merge branch 'DRUnstable' into Synthesis 2022-08-11 15:28:38 -06:00
aerinon
ca70d8c2a3 Merge branch 'DRVolatile' into Synthesis 2022-08-11 15:28:32 -06:00
aerinon
ad6a2ed2fe Merge remote-tracking branch 'origin/DRVolatile' into DRVolatile 2022-08-11 15:28:00 -06:00
aerinon
2309b88545 Standing items fix for reloading pot items 2022-08-11 15:27:38 -06:00
aerinon
22b5524a4c Merge pull request #22 from Catobat/Tavern
Shuffle Back of Tavern
2022-08-11 15:27:00 -06:00
aerinon
e321299603 Fix for crash 2022-08-08 10:33:01 -06:00
aerinon
a6577b4e4b Output for collection rate config 2022-08-05 13:31:18 -06:00
aerinon
196905a83f Merge branch 'DRUnstable' into Synthesis 2022-08-05 13:29:54 -06:00
aerinon
53f89790a7 Fix for floodgates in vanilla mode 2022-07-29 12:08:36 -06:00
aerinon
17d1b12890 Merge branch 'master' into DRVolatile
# Conflicts:
#	compasses.asm
2022-07-06 10:03:01 -06:00
aerinon
4e6acaf7b9 Big key door double-sided check 2022-07-06 09:48:42 -06:00
aerinon
7f8e560b76 Merge branch 'DRVolatile' into StandardThrone 2022-07-01 15:15:22 -06:00
aerinon
3b5ccc7dfa Enemizer fix for pot substitution. 2022-06-30 11:52:02 -06:00
aerinon
3e6da34c71 Pot substitution for certain ammo and rupee items. 2022-06-29 11:32:51 -06:00
aerinon
92c155f5c0 Re-implemented mirror scroll during escape behavior to not affect entrance and include the throne spawn point 2022-06-16 12:32:31 -06:00
aerinon
ae1fde65f4 Fix for followers despawning near maiden cell 2022-06-16 06:45:11 -06:00
aerinon
a36068fb04 Fix for Zelda despawning near maiden cell 2022-06-15 23:49:20 -06:00
aerinon
6f1eda9296 Fix for pottery/shopsanity conflict 2022-06-15 16:53:49 -06:00
aerinon
2579038832 Mirror scroll spawns in Zelda's cell instead of last entrance (mirror remains unchanged)
Tapestry is open when spawning in the throne room.
2022-06-14 12:36:04 -06:00
Catobat
87cac1a113 Shuffle Back of Tavern 2022-06-13 20:37:59 +02:00
aerinon
9779f91ce9 Fix dungeon completion bitfield (16-bit) 2022-05-19 10:36:20 -06:00
aerinon
003278f7e0 Fix dungeon completion bitfield 2022-05-18 14:52:47 -06:00
aerinon
15cc72c1e0 Correct the width on the AND for MaybeFlagCompassTotalPickup 2022-05-18 14:52:34 -06:00
aerinon
db2fe4cf39 Fix compass compare 2022-05-17 13:05:34 -06:00
aerinon
ed3ce6af6f Merge pull request #20 from cassidoxa/compasses_dr
Fix checking compass mode for compass count display bitfield
2022-05-17 13:03:06 -06:00
cassidoxa
336931fb02 Fix checking compass mode for compass count display bitfield 2022-05-15 18:54:52 -04:00
aerinon
4cdd41dbf5 Fix for standing item, all enemy drops and pot item converted to new system 2022-05-03 13:51:11 -06:00
aerinon
5863f9783f Minor fix up on CrystalPendantFlags_3 2022-04-30 15:20:53 -06:00
aerinon
445a91c2aa Merge pull request #19 from cassidoxa/keyfix
Fix key door indexing
2022-04-30 15:17:59 -06:00
cassidoxa
e804455743 Fix key door indexing 2022-04-30 13:35:20 -04:00
aerinon
675d68175c Delete test file 2022-04-28 16:39:06 -06:00
aerinon
3685d8194e SRAM fix for MultiClient. Only set SRAM flag on locations that count toward collection rate.
Shifted uppercase font.
2022-04-28 16:06:31 -06:00
aerinon
71d26eb109 Lowercase font 2022-04-27 14:14:54 -06:00
aerinon
0960dcaac9 Merge branch 'master' into DRVolatile 2022-04-27 13:50:42 -06:00
aerinon
eb0bc2b7f6 Moved doorrando code. Fixed a multiclient issue with pot switches. 2022-04-27 13:47:12 -06:00
aerinon
f0b767885c Fix bug with .checkAga2 in overworld map with new SRAM constants 2022-04-26 12:16:07 -06:00
aerinon
e088a040f8 Merge branch 'dr_sram' of https://github.com/cassidoxa/z3randomizer into cassidoxa-dr_sram
# Conflicts:
#	hooks.asm
#	menu/overworldmap.asm
#	music.asm
2022-04-26 11:57:51 -06:00
aerinon
53f723a196 Letters/Crystal numbers 2022-04-21 15:42:32 -06:00
cassidoxa
352d1e8a22 Re-add accidentally deleted HUD stuff
Fix some processor flags
2022-04-20 20:33:40 -04:00
aerinon
4b68406be0 Merge branch 'DRUnstable' into DRVolatile 2022-04-20 13:56:31 -06:00
aerinon
a017c98c4e Map bug with prizes 2022-04-20 09:07:59 -06:00
aerinon
e8f06f2da6 Pottery fix for vanilla hera key 2022-04-20 08:52:01 -06:00
cassidoxa
9c41ffb55b Merge branch 'sram_rework' into dr_sram 2022-04-20 00:30:35 -04:00
aerinon
3114223a04 Can force the drawing algorithm to skip 2022-04-19 14:35:16 -06:00
aerinon
f6015a8569 New colorized pot and bitfields 2022-04-19 14:04:12 -06:00
aerinon
d116249412 Merge branch 'DRUnstable' into DRVolatile 2022-04-13 13:32:31 -06:00
aerinon
4239e7204e Check Aga2's boss defeat flag instead of pyramid hole
New flag on compass mode to indicate maps should be used instead for showing the location
2022-04-13 13:30:15 -06:00
aerinon
281beeeb58 Switch standing item gfx to a different slot
Rain state fix
2022-03-29 14:29:04 -06:00
aerinon
93fe175cab Don't delete hammer when hammer dashing through pots and the sprite limit is reached
Hook for frozen enemies killed with hammer (if there's an item they won't automatically drop the freeze prize now)
2022-03-23 14:24:36 -06:00
aerinon
c687157882 Fix the Y index for ShouldCountNormalPot 2022-03-08 08:53:23 -07:00
aerinon
60026bea50 Pottery refinements 2022-03-07 10:44:53 -07:00
aerinon
66657eb956 Missed a line 2022-03-04 17:56:07 -07:00
aerinon
a0ebf72d59 Lifting normal pots increases location count
Pot despawn protection
Hud updates
2022-03-04 15:24:22 -07:00
aerinon
c83185c1b2 Minor bug fix 2022-02-24 14:04:33 -07:00
aerinon
2c8299bac3 Standing item key for hera basement cage 2022-02-15 12:13:29 -07:00
aerinon
fe66c67d07 Fixing up the hud to indicate Pendant/Crystal etc 2022-02-15 12:12:42 -07:00
aerinon
a80171ba9b Revert SRAM changes (not yet ready) 2022-02-10 08:37:05 -07:00
aerinon
57dec5651f Merge branch 'DRMain' into DRUnstable 2022-02-09 14:34:58 -07:00
aerinon
5bd4d36cd9 Fix for standing item palette 2022-02-09 14:17:42 -07:00
aerinon
e8b85e4815 Lowercase item text 2022-02-09 10:06:16 -07:00
aerinon
93fe72466d Merge branch 'master' into DRMain
# Conflicts:
#	LTTP_RND_GeneralBugfixes.asm
#	hooks.asm
#	music.asm
2022-02-09 09:59:56 -07:00
aerinon
7db582d894 Moved SRAM to reserved locations 2022-02-09 09:02:17 -07:00
aerinon
725f6c110a Couple of fixes for Standing Items counts and generic keys in caves 2022-01-24 16:06:04 -07:00
aerinon
3c9b04f30a Fixed up the anti-soft lock in swamp
Combined flags and fixed a couple of bugs
2022-01-21 16:07:03 -07:00
aerinon
50dd0c7be4 Fixing bugs with pottery lottery 2022-01-13 15:03:20 -07:00
aerinon
149f19df83 Merge branch 'DRVolatile' into Potsanity 2022-01-06 16:08:02 -07:00
aerinon
8698c3e109 Merge branch 'DRMain' into DRVolatile 2022-01-06 16:04:08 -07:00
aerinon
7bf2a259a4 Merge remote-tracking branch 'origin/DRMain' into DRMain 2022-01-05 14:32:48 -07:00
aerinon
83ce4bf566 Merge pull request #17 from codemann8/MSUMuteFix
Preserve original Sanc/HC music track change if Zelda isn't delivered yet
2022-01-05 14:32:37 -07:00
aerinon
fc5e6191eb Merge remote-tracking branch 'origin/DRMain' into DRMain 2022-01-05 14:29:03 -07:00
aerinon
52c40ba0ca Merge pull request #16 from Catobat/DRFix
General fixes
2022-01-05 14:28:36 -07:00
aerinon
c88a301708 Merge branch 'master' into DRMain
# Conflicts:
#	tables.asm
2022-01-05 14:26:48 -07:00
aerinon
e5d3ebf3cd Minor potsanity refinements 2022-01-04 15:49:00 -07:00
aerinon
7cf57a7a37 Merge branch 'DRVolatile' into Potsanity 2021-12-16 16:03:23 -07:00
aerinon
6821648443 potsanity advancement 2021-12-16 16:03:10 -07:00
codemann8
2c6db075a9 Fixed boss music 2021-11-06 16:19:48 -05:00
codemann8
ad5b78b3d1 Preserve Sanc music change in Standard 2021-11-06 16:18:09 -05:00
codemann8
e8d5a9635d Play Sanc music on arrival in Sanc in Standard 2021-11-06 16:17:37 -05:00
aerinon
f19b65b86c Merge branch 'DRMain' into DRVolatile 2021-11-02 15:29:20 -06:00
aerinon
6757e35dca Straight Stair fixes 2021-11-02 15:24:21 -06:00
Catobat
1e6d79badc Fix bug with straight stairs and vanilla doors 2021-10-31 23:16:47 +01:00
Catobat
3f34e50a62 Improve transition animation from straight stairs 2021-10-31 21:17:18 +01:00
Catobat
a1fafb72cd Keep dungeon tileset after opening the map 2021-10-31 21:16:09 +01:00
aerinon
85d799ba67 Merge branch 'DRMain' into DRVolatile 2021-10-21 16:35:09 -06:00
aerinon
620c672fe1 Turn off Terrorpin AI fix by default - can be a post-gen option 2021-10-21 16:18:51 -06:00
aerinon
f95bce282b Removed some comment cruft 2021-10-21 16:15:34 -06:00
aerinon
415e2cae41 Merge pull request #15 from spannerisms/master
Quadrant glitch fix
2021-10-21 16:09:45 -06:00
aerinon
9bf662642b Merge branch 'DRMain' into OverworldMapRefactor 2021-10-21 14:53:55 -06:00
aerinon
27654b9ac9 Merge remote-tracking branch 'baserom/master' into DRMain
# Conflicts:
#	hooks.asm
#	newhud.asm
#	utilities.asm
2021-10-21 14:15:54 -06:00
aerinon
aee5fe506a Standing items start 2021-10-21 14:11:57 -06:00
aerinon
c503e3eb61 Overworld Map Refactor 2021-10-21 14:05:59 -06:00
aerinon
319aba5e4d EG disarmament on mirror 2021-10-05 14:15:38 -06:00
aerinon
cc502c7524 Removed stonewall pre-opens 2021-09-16 16:01:51 -06:00
aerinon
f9e3bec5cb Removed rails using a dynamic flag 2021-09-07 16:24:18 -06:00
aerinon
07a3a9ad03 Catobat map fix
Cutoff table updated
Mutliworld mem location added for item ids
2021-08-31 15:35:19 -06:00
aerinon
fa516b58d4 Merge pull request #14 from codemann8/MSUMuteFix
Fix for boss music not playing in non-DR modes
2021-07-27 08:53:08 -06:00
codemann8
9cecd30e89 Fix for boss music not playing in non-DR modes 2021-07-27 02:42:36 -05:00
aerinon
15337a1382 Collection Rate moved to arbline marco 2021-07-23 09:14:43 -07:00
aerinon
9861c76d23 Minor refactor to keep dr hooks in DR 2021-07-23 09:13:35 -07:00
aerinon
5b8c90e069 Merge pull request #12 from codemann8/MSUMuteFix
Some music fixes
2021-07-23 07:44:01 -07:00
aerinon
e038b0bb18 Merge pull request #13 from ardnaxelarak/DR_statCountersFix
Fix counters for damage taken and magic used
2021-07-23 07:42:18 -07:00
8e12033105 Fix counters for damage taken and magic used 2021-07-23 00:07:51 -07:00
aerinon
bfbe3fbcc0 Addition to Cutoff room table 2021-07-15 10:33:47 -07:00
aerinon
641ec0ffa0 Minor fix to credits
Default to AgaDoor to Std/Open state
2021-07-13 10:51:01 -07:00
aerinon
e35c437fe3 Merge pull request #10 from ardnaxelarak/DRMain
Fix junk graphics appearing during GAME OVER screen
2021-07-13 10:44:51 -07:00
codemann8
c01c6f337a Fixed boss music when boss room entered thru Straight Stairs in DR 2021-07-12 20:59:57 -05:00
codemann8
30d8bdd813 Suppressed awkward/abrupt music changes in dungeons when DR is enabled 2021-07-12 19:23:13 -05:00
codemann8
0bce51af4e Supressed awkward/abrupt music changes in dungeons when DR is enabled 2021-07-12 15:41:59 -05:00
2be05eed33 Fix junk graphics appearing during GAME OVER screen 2021-07-10 11:30:48 -07:00
aerinon
1c9936d231 Merge pull request #9 from ardnaxelarak/DRMain
Fix drawing C/P indicator and Stat Tracking
2021-07-09 10:38:20 -07:00
0054be1e4b Fix some stat tracking
- move chest turn counter to not overlap locations before mirror
- correctly print from correct memory in credits for damage/magic counter
2021-07-08 19:47:37 -07:00
02e66ba9e3 Fix drawing C/P indicator
- no longer show icon for sewer, HC, AT, or GT
- no longer show junk in map shuffle for dungeons without the map
2021-07-08 18:34:39 -07:00
aerinon
aee82fa319 Merge branch 'master' into DRMain
# Conflicts:
#	LTTP_RND_GeneralBugfixes.asm
#	events.asm
#	hooks.asm
#	stats.asm
#	stats/creditsnew.asm
#	stats/statConfig.asm
#	swordswap.asm
#	utilities.asm
2021-07-07 11:15:11 -07:00
aerinon
e9aec2ba86 Merge branch 'master' into DRMain
# Conflicts:
#	LTTP_RND_GeneralBugfixes.asm
#	hooks.asm
2021-06-22 13:12:07 -06:00
aerinon
717434bd88 Bank notes added 2021-06-22 13:05:40 -06:00
aerinon
050ce5e20e Changes from DR 0.4.0.6 2021-06-04 17:02:23 -06:00
aerinon
429649bde8 Merge pull request #8 from codemann8/MSUMuteFix
Msu mute fix
2021-05-29 21:51:08 -06:00
aerinon
c7a4d817c0 Changes from DR 2021-05-24 15:12:09 -06:00
aerinon
5672e2f090 Merge branch 'master' into DRMain 2021-05-24 14:52:26 -06:00
codemann8
9d64b5edd1 Whoops, lines got swapped 2021-05-19 04:31:55 -05:00
codemann8
6e86c5c9b8 Fixed GT/ToH MSU muting when playing Door Shuffle 2021-05-18 00:21:32 -05:00
aerinon
e9a376d92a Bugfixes 2021-05-14 16:49:49 -06:00
aerinon
842bb043e6 Merge branch 'master' into DRMain
# Conflicts:
#	LTTP_RND_GeneralBugfixes.asm
#	catfish.asm
#	compasses.asm
#	darkworldspawn.asm
#	hooks.asm
#	inventory.asm
#	newitems.asm
#	shopkeeper.asm
#	stats.asm
#	tables.asm

Adn some updates from DR
2021-05-13 12:11:40 -06:00
aerinon
d015310e4d Blind boss checks for maiden sequence 2021-02-27 15:30:28 -07:00
aerinon
f6cc3607df Refactored Potion shop hooks to allow old behaviors 2021-02-22 14:48:10 -07:00
aerinon
8b622dd841 Multiclient flags
Multi Sprite Player set to skip progressive limits
2021-02-18 13:37:33 -07:00
aerinon
ddf56a9ed1 Merge branch 'DRMain2' into DRMain 2021-02-18 13:13:44 -07:00
aerinon
4ae59ad1e6 Double count hera basement cage in keydropshuffle 2021-02-17 11:50:51 -07:00
aerinon
9d607b7caa Inverted fix - no longer a bunny in DW sanc
Standard fix - can't kill Aga1 before rescuing Zelda
Total locations to check set on file load, and displayed in HUD
2021-02-16 13:36:44 -07:00
aerinon
d15dc91db4 Fix for BallnChain guard when keydropshuffle is off 2021-02-13 20:48:51 -07:00
aerinon
9b33530dba Merge branch 'DRStairFix' into DRMain2 2021-02-13 20:45:24 -07:00
aerinon
c9d42587a4 Merge branch '16_bit_collection_rate' of https://github.com/CaitSith2/z3randomizer into InvCountMerge 2021-02-13 20:44:25 -07:00
aerinon
7fee6ce440 Merge branch '16_bit_collection_rate' of https://github.com/CaitSith2/z3randomizer into InventoryCountMerge 2021-02-12 20:45:59 -07:00
Catobat
f68a635e2b Minor fixes for in-room stairs 2021-02-12 23:00:24 +01:00
CaitSith2
a83608366c document full usage of 7EF420-7EF4FF in stats.asm 2021-02-12 07:48:09 -08:00
CaitSith2
d3af10649c Dungeon completion flags, that indicate for which dungeons the prize was collected from. 2021-02-12 07:45:32 -08:00
CaitSith2
244b622074 Move stats that were not compass related out of the former compass counters. 2021-02-12 07:27:21 -08:00
aerinon
2f5b555e0e Merge branch 'DRMain' into ShopBranch 2021-02-02 14:42:03 -07:00
aerinon
96d7a6a9ae Merge branch 'InventoryCount' into DRMain 2021-02-02 10:12:44 -07:00
aerinon
6fe4132564 Merge pull request #4 from Catobat/DRStairs
Shuffle in-room stairs
2021-02-01 16:29:51 -07:00
aerinon
a63aa6f5fe Shop fixes 2021-02-01 16:29:09 -07:00
aerinon
2a08959229 Shop counting items 2021-02-01 10:11:38 -07:00
Catobat
dab4d58f12 Shuffle in-room stairs 2021-01-30 00:07:50 +01:00
aerinon
b1d4ef3252 Merge branch 'InventoryCount' into ShopBranch 2021-01-29 15:13:14 -07:00
aerinon
05e7f8eb96 Ported over pepper's shop code 2021-01-29 13:55:13 -07:00
CaitSith2
356bfb3a05 Need more bits for end game stats 2021-01-18 12:23:18 -08:00
CaitSith2
7266706315 Make inventory count stats 16 bit. 2021-01-18 12:02:44 -08:00
aerinon
a9bddea1b4 Change how hera basement key is counted to not count Byrna 2020-12-09 14:28:12 -07:00
aerinon
b3fcd2192e Some DR changes (outdoor check for hub and keydrop correct KeyTable address)
Shop VRAM issue investigated but not solved
2020-12-08 10:57:37 -07:00
aerinon
443070fe2c Merge branch 'ChestKeyCounter' into DRMain
# Conflicts:
#	LTTP_RND_GeneralBugfixes.asm
#	build.sh
#	darkworldspawn.asm
#	events.asm
#	itemdowngrade.asm
#	shopkeeper.asm
#	stats.asm
2020-11-30 09:34:18 -07:00
aerinon
264e9f337d Keysanity menu bug fix 2020-11-20 13:57:49 -07:00
aerinon
6c7f5e46a3 Support for GT Big Key Credit
Support for Rain state prevention without rails
2020-11-19 16:27:47 -07:00
aerinon
94561e01c2 Bugfixes for lobby stuff 2020-11-12 12:18:23 -07:00
aerinon
8d9775c3de Change Compass addresses 2020-11-09 16:07:34 -07:00
aerinon
4c4fa74f1a Invisible Bunny fix
Double count Hera Basement Cage fix
2020-11-09 13:59:00 -07:00
aerinon
5310569aa3 Minor fixes 2020-11-03 10:15:41 -07:00
aerinon
5c2df8b6a6 Scroll fix 2020-11-03 10:12:48 -07:00
aerinon
b5bcc13806 Merge remote-tracking branch 'origin/DRMain' into DRMain 2020-11-03 10:12:21 -07:00
aerinon
717913b8fb Compass Refactor 2020-11-03 10:12:08 -07:00
CaitSith2
fcebea97af Don't count chest keys if they are for another player. 2020-10-30 16:53:44 -07:00
CaitSith2
44485fc02a Use defined labels instead of hard-coding the addresses. 2020-10-30 16:42:50 -07:00
aerinon
0dba58c194 Support for Mirror Scroll
DR Hud Additions
2020-10-30 16:26:28 -06:00
aerinon
6fe8496fde Create README.md 2020-10-29 16:07:44 -06:00
aerinon
49dc0f4037 DR Code Init Commit
Rails for Mixed Travel
2020-10-29 15:58:05 -06:00
randall.rupper
233afa1e38 Chest Key counters 2020-09-18 11:06:02 -06:00
CaitSith2
94722d452e Fix glitch where you can bomb yourself at high stakes chest game to get on top of pyramid/castle.
Since this is not a vanilla glitch, it has to be fixed, as it wasn't intended.
2020-09-18 11:04:48 -06:00
CaitSith2
820b5d5357 Low stakes and high stakes chest game no longer increments item counter. 2020-09-18 11:04:22 -06:00
CaitSith2
a892ff39b2 Backport terrorpin ai fix from enemizer. (and fix a bug with it.) 2020-08-05 08:48:25 -07:00
Zarby89
dad73fc883 ganon room fix for multiworld 2020-07-29 21:46:01 -07:00
caitsith2
65bd0df346 Labels added for Door rando hook points. 2020-07-15 01:27:33 -07:00
caitsith2
ff3bdc1326 Check for door rando before doing safety checks to and possibly draining room 55 (the hammer locked room) 2020-07-14 21:07:21 -07:00
caitsith2
715ba87517 Reserve the space for berserkermulti.world seed guid. 2020-07-14 11:12:25 -07:00
compiling
5a10017747 Triforce Hunt + Kill Ganon goal. 2020-06-25 07:40:53 -07:00
caitsith2
6b6bce9b78 Print hook address helpers for doors 2020-06-24 07:07:38 -07:00
caitsith2
c78559ec0f Merge branch 'master' into multiworld 2020-06-23 17:24:24 -07:00
caitsith2
c4e21be268 Merge branch 'patch-1' into multiworld 2020-06-23 01:31:50 -07:00
caitsith2
594e4e56c0 Output addresses for doors compass_r_addr and compass_w_addr hooks. 2020-06-22 06:47:33 -07:00
caitsith2
9c8e531d20 Fix asar relative path warning. 2020-06-22 06:46:34 -07:00
caitsith2
7b3e200d22 Output warnings and prints on build. 2020-06-22 06:45:58 -07:00
compiling
3cae3a66a5 Fix fake world when fluting to pyramid twice 2020-06-20 19:43:45 -07:00
caitsith2
59f851395c Merge branch 'master' into multiworld 2020-06-20 18:35:48 -07:00
caitsith2
ffc190e3cf reinstate build.bat 2020-06-13 22:04:59 -07:00
caitsith2
ea477878fc Add __pycache__ to .gitignore, rename utils.py to build.py 2020-06-09 09:14:46 -07:00
caitsith2
47091dfd68 Patch and build base2current.json in one go.
Just need to provide a linux asar library when the time comes to build on linux.
2020-06-09 09:11:02 -07:00
randall.rupper
8cf3ccb13e Add PHX/PLX in a better spot to prevent CountBottles from overwritting X 2020-06-08 09:58:46 -07:00
caitsith2
b5c7846c40 Make it a tiny bit easier to build the baserom for inclusion in multiworld and get the updated hash while at it. 2020-06-08 09:30:49 -07:00
caitsith2
4530021fea Revert exetend msu flag as it is no longer needed. 2020-06-08 09:30:49 -07:00
caitsith2
1b3a586a57 Update multiworld to be compatible with save & quit delay fix. 2020-06-08 09:30:49 -07:00
caitsith2
65db6eefb7 update windows build process to asar 2020-06-08 09:29:31 -07:00
caitsith2
e8a384200f Only launch cmd /k if the batch file was doubleclicked. 2020-06-08 09:27:32 -07:00
caitsith2
0bdc88d13a Flag for adjuster to know if extended MSU is present in rom or not. 2020-06-08 09:26:58 -07:00
caitsith2
80bc9c2028 Move player names and max them out at 255. 2020-06-08 09:26:25 -07:00
Bonta-kun
2a5e305fc6 implement remote item checks 2020-06-08 09:25:25 -07:00
Bonta-kun
c3c5ba9d53 move clock.asm from bank A0 to A4 2020-06-08 09:24:56 -07:00
Bonta-kun
af4c84c1aa fix unusable infinite bombs with empty inventory 2020-06-08 09:24:36 -07:00
Bonta-kun
f843ef9eb8 bee trap 2020-06-08 09:24:07 -07:00
Bonta-kun
49ba8e064d Make sword upgrade appear as fighter sword for swordless players 2020-06-08 09:20:42 -07:00
Bonta-kun
94218b048b Dont replace multiworld items 2020-06-08 09:20:17 -07:00
Bonta-kun
6818c3e119 free some space in bank A0 2020-06-08 09:20:00 -07:00
Bonta-kun
ddd456c04e multiworld 2020-06-08 09:19:18 -07:00
158 changed files with 12163 additions and 6494 deletions

2
.gitignore vendored
View File

@@ -1,3 +1,5 @@
tournament.asm
/build
/.idea
/__pycache__
build.sh

View File

@@ -34,7 +34,7 @@ db $20, $19, $08, $31 ; year/month/day
;================================================================================
!ROM_VERSION_LOW ?= 1 ; ROM version (two 16-bit integers)
!ROM_VERSION_HIGH ?= 4 ;
!ROM_VERSION_HIGH ?= 5 ;
org $80FFE0 ; Unused hardware vector
RomVersion:
@@ -53,6 +53,23 @@ function hexto555(h) = ((((h&$FF)/8)<<10)|(((h>>8&$FF)/8)<<5)|(((h>>16&$FF)/8)<<
;================================================================================
!MULTIWORLD_ITEM = "$7EF4D2"
!MULTIWORLD_ITEM_FROM = "$7EF4D3"
!MULTIWORLD_ROOMID = "$7EF4D4"
!MULTIWORLD_ROOMDATA = "$7EF4D6"
!MULTIWORLD_SCOUT_LOCATION = "$7EF4D7"
!MULTIWORLD_SCOUTREPLY_LOCATION = "$7EF4D8"
!MULTIWORLD_SCOUTREPLY_ITEM = "$7EF4D9"
!MULTIWORLD_SCOUTREPLY_PLAYER = "$7EF4DA"
!MULTIWORLD_RECEIVING_ITEM = "$7EC057" ; 0 = default | 1 = receiving
!MULTIWORLD_HUD_CHARACTER_DATA = "$7EC058" ; 0x40 bytes
!MULTIWORLD_ITEM_PLAYER_ID = "$7EC098" ; 0 = disabled
!MULTIWORLD_SPRITEITEM_PLAYER_ID = "$7EC099"
!MULTIWORLD_HUD_TIMER = "$7EC09A"
!MULTIWORLD_HUD_DELAY = "#120"
!MULTIWORLD_ITEM_ID = "$7EC09B" ; for lua scripts?
!Dungeon_ChestData = "$01E96C"
incsrc hooks.asm
incsrc spriteswap.asm
incsrc hashalphabethooks.asm
@@ -61,7 +78,7 @@ incsrc ram.asm
incsrc sram.asm
incsrc registers.asm
incsrc vanillalabels.asm
incsrc overworldmap.asm ; Overwrites some code in bank $8A
incsrc menu/overworldmap.asm ; Overwrites some code in bank $8A
org $A08000 ; bank $20
incsrc itemdowngrade.asm
@@ -148,17 +165,15 @@ incsrc newhud.asm
incsrc save.asm
incsrc password.asm
incsrc enemy_adjustments.asm
incsrc hudtext.asm
;incsrc hudtext.asm
incsrc servicerequest.asm
incsrc elder.asm
incsrc toast.asm
incsrc fastcredits.asm
incsrc msu.asm
incsrc dungeonmap.asm
incsrc special_weapons.asm
incsrc variable_ganon_vulnerability.asm
incsrc item_on_b.asm
incsrc hextodec.asm
incsrc multiworld.asm
incsrc textrenderer.asm
warnpc $A58000
@@ -174,6 +189,8 @@ incsrc decompresseditemgraphics.asm
incsrc newitems.asm
incsrc utilities.asm
incsrc inventory.asm
incsrc menu/hudalpha.asm
warnpc $A38000
org $A38000
incsrc stats/credits.asm ; Statically mapped
@@ -182,8 +199,14 @@ incsrc stats/statConfig.asm
FontTable:
incsrc stats/fonttable.asm
org $B08000 ; bank $30
incsrc doorrando/doorrando.asm ; bank 27/A7
;bank 28/A8 for keydropshuffle / standing items
incsrc keydrop/standing_items.asm ; bank 28/A8
incsrc enemizer/main.asm ; bank 36/B6
org $B08000 ; bank #$30
incsrc tables.asm
warnpc $B18000
org $B48000
incsrc spc.asm
@@ -210,7 +233,7 @@ warnpc $B1A000
org $B1A000
GFX_HUD_Items:
incbin "data/c2807_v4.gfx"
incbin "menu/drsheetdc.2bppc"
warnpc $B1A800
org $B1A800
@@ -242,16 +265,6 @@ InvertedCastleHole: ;address used by front end. DO NOT MOVE!
incbin "data/sheet73.gfx"
warnpc $B1E501
org $B1E800
Damage_Table_Bombs:
incbin "data/damage_table_sword_bombs.bin"
warnpc $B1F000
org $B1F000
Damage_Table_Pseudo:
incbin "data/damage_table_pseudo_sword.bin"
warnpc $B1F800
org $B38000
GFX_HUD_Palette:
incbin "data/hudpalette.pal"
@@ -284,6 +297,11 @@ incsrc data/kanjireplacements.asm ; Overwrites text gfx data and masks in bank $
org $B28000
Extra_Text_Table:
incsrc itemtext.asm
warnpc $B2E000
org $B2DFD0 ; PC 0x195FD0
incsrc multiworldplayernames.asm
warnpc $B30000
incsrc externalhooks.asm
;================================================================================
@@ -311,7 +329,12 @@ warnpc $B08000
;$22 Unused
;$23 Stats & Credits
;$24 Code Bank
;$26 Multiworld data
;$27 DR Code Bank
;$28 Keydrop / Standing Items Code bank
;$29 External hooks (rest of bank not used)
;$2A Reserved for OWR
;$2B Reserved for "outlet data" ~5.8k
;$2E Reserved for Tournament Use
;$2F Static RNG (rest is reserved for tournament use)
;$30 Main Configuration Table
@@ -319,6 +342,7 @@ warnpc $B08000
;$32 Text Bank
;$33 Graphics Bank
;$36 reserved for Enemizer
;$37 Room data if needed for DR/Pottery/Enemizer
;$3A reserved for downstream use
;$3B reserved for downstream use
;$3F reserved for internal debugging

15
README.md Normal file
View File

@@ -0,0 +1,15 @@
# z3randomizer
Zelda 3 Randomizer Template ASM
How to create the bps patch:
* Assemble the ROM with asar (recommend to use a copy of original rom)
`asar LTTP_RND_GeneralBugfixes.asm copy_original_rom.sfc`
(copy_orignal_rom.sfc is now assembled_rom.sfc)
* Use flips to create a bps file
`flips original_rom.sfc assembled_rom.sfc base2current.bps`
* Update RANDOMIZERBASEHASH in DR with the md5 sum of assembled_rom.sfc. And put base2current.bps in the data directory.

View File

@@ -153,7 +153,7 @@ RestoreBgEther:
INX #2 : CPX.b #$10 : BNE -
BRA ++
++
JML $82FF51 ; Bank0E.asm : 3936 vanilla restore routine after loop which RTLs
JML Palette_RestoreFixedColor-7 ; Bank0E.asm : 3936 vanilla restore routine after loop which RTLs
;================================================================================
DDMConditionalLightning:
LDA.l DisableFlashing
@@ -161,7 +161,7 @@ DDMConditionalLightning:
BNE +
LDA.w Scrap
LDX.b #$02
JML $87FA7F ; Bank0E.asm : 4738 vanilla loop equivalent to below beginning at LDY #$00
JML FlashGanonTowerPalette_next_thunder-2 ; Bank0E.asm : 4738 vanilla loop equivalent to below beginning at LDY #$00
+
LDA.b Scrap00 : LDX.b #$02 : LDY.b #$00
-
@@ -172,7 +172,7 @@ DDMConditionalLightning:
LDA.w $F523, Y : LDA.l PaletteBuffer+$F0, X
INY #2
INX #2 : CPX.b #$10 : BNE -
JML $87FAAC ; Bank0E.asm : 4754 both branches converge here
JML FlashGanonTowerPalette_bright_white ; Bank0E.asm : 4754 both branches converge here
;================================================================================
ConditionalGTFlash:
LDA.l DisableFlashing : REP #$20 : BNE +
@@ -222,17 +222,17 @@ LoadElectroPalette:
LDA.w #$0404 : STA.b Scrap0E
LDA.w #$001B : STA.b Scrap02
SEP #$10
LDX.b Scrap0C : LDA.l $9BEBB4, X : AND.w #$00FF : ADC.w #$D630
LDX.b Scrap0C : LDA.l SwordPaletteOffsets, X : AND.w #$00FF : ADC.w #$D630
REP #$10 : LDX.w #$01B2 : LDY.w #$0002
JSR ConditionalLoadGearPalette
SEP #$10
LDX.b Scrap0D
LDA.l $9BEBC1, X : AND.w #$00FF : ADC.w #$D648
LDA.l ShieldPaletteOffsets, X : AND.w #$00FF : ADC.w #$D648
REP #$10 : LDX.w #$01B8 : LDY.w #$0003
JSR ConditionalLoadGearPalette
SEP #$10
LDX.b Scrap0E
LDA.l $9BEC06, X : AND.w #$00FF : ASL A : ADC.w #$D308
LDA.l LinkMailPalettesOffsets, X : AND.w #$00FF : ASL A : ADC.w #$D308
REP #$10 : LDX.w #$01E2 : LDY.w #$000E
JSR ConditionalLoadGearPalette
SEP #$30

BIN
asar-x64.dll Normal file

Binary file not shown.

BIN
asar.dll Normal file

Binary file not shown.

421
asar.py Normal file
View File

@@ -0,0 +1,421 @@
#!/usr/bin/env python3
"""
python interface for asar.dll
by randomdude999
Usage: import asar, call asar.init, call asar.patch, then use the various
functions to get info about the patch
"""
import ctypes
import enum
import sys
from ctypes import c_int, c_char_p, POINTER
c_int_ptr = POINTER(c_int)
__all__ = ["errordata", "writtenblockdata", "mappertype", "version",
"apiversion", "init", "reset", "patch", "maxromsize", "close",
"geterrors", "getwarnings", "getprints", "getalllabels",
"getlabelval", "getdefine", "getalldefines", "resolvedefines",
"math", "getwrittenblocks", "getmapper", "getsymbolsfile"]
_target_api_ver = 303
_asar = None
class AsarArithmeticError(ArithmeticError):
pass
class errordata(ctypes.Structure):
_fields_ = [("fullerrdata", c_char_p),
("rawerrdata", c_char_p),
("block", c_char_p),
("filename", c_char_p),
("line", c_int),
("callerfilename", c_char_p),
("callerline", c_int),
("errid", c_int)]
def __repr__(self):
return "<asar error: {!r}>".format(self.fullerrdata.decode())
# for internal use only. getalllabels() returns a dict.
class _labeldata(ctypes.Structure):
_fields_ = [("name", c_char_p),
("location", c_int)]
# for internal use only. getalldefines() returns a dict.
class _definedata(ctypes.Structure):
_fields_ = [("name", c_char_p),
("contents", c_char_p)]
class writtenblockdata(ctypes.Structure):
_fields_ = [("pcoffset", c_int),
("snesoffset", c_int),
("numbytes", c_int)]
def __repr__(self):
return "<written block ${:06x} 0x{:x} size:{}>".format(
self.snesoffset, self.pcoffset, self.numbytes)
# internal use only. patch() accepts a dict.
class _memoryfile(ctypes.Structure):
_fields_ = [("path", c_char_p),
("buffer", c_char_p),
("length", ctypes.c_size_t)]
# internal use only. patch() accepts a dict.
class _warnsetting(ctypes.Structure):
_fields_ = [("warnid", c_char_p),
("enabled", ctypes.c_bool)]
# For internal use only.
class _patchparams(ctypes.Structure):
_fields_ = [("structsize", c_int),
("patchloc", c_char_p),
("romdata", c_char_p),
("buflen", c_int),
("romlen", c_int_ptr),
("includepaths", POINTER(c_char_p)),
("numincludepaths", c_int),
("should_reset", ctypes.c_bool),
("additional_defines", POINTER(_definedata)),
("additional_define_count", c_int),
("stdincludesfile", c_char_p),
("stddefinesfile", c_char_p),
("warning_settings", POINTER(_warnsetting)),
("warning_setting_count", c_int),
("memory_files", POINTER(_memoryfile)),
("memory_file_count", c_int),
("override_checksum_gen", ctypes.c_bool),
("generate_checksum", ctypes.c_bool)]
class mappertype(enum.Enum):
invalid_mapper = 0
lorom = 1
hirom = 2
sa1rom = 3
bigsa1rom = 4
sfxrom = 5
exlorom = 6
exhirom = 7
norom = 8
def _getall(func):
"""Helper that does the work common to all the getall* functions."""
count = c_int()
raw_errs = func(ctypes.byref(count))
errs = []
for i in range(count.value):
errs.append(raw_errs[i])
return errs
class _AsarDLL:
def __init__(self, dllname):
dll = ctypes.CDLL(dllname)
self.dll = dll
self.funcs = {}
try:
# argument/return type setup
# (also verifies that those functions are exported from the DLL)
# this is directly from asardll.h
# setup_func(name, argtypes, returntype)
self.setup_func("version", (), c_int)
self.setup_func("apiversion", (), c_int)
self.setup_func("init", (), ctypes.c_bool)
self.setup_func("reset", (), ctypes.c_bool)
self.setup_func("patch", (c_char_p, c_char_p, c_int, c_int_ptr),
ctypes.c_bool)
self.setup_func("patch_ex", (POINTER(_patchparams),), ctypes.c_bool)
self.setup_func("maxromsize", (), c_int)
self.setup_func("close", (), None)
self.setup_func("geterrors", (c_int_ptr,), POINTER(errordata))
self.setup_func("getwarnings", (c_int_ptr,), POINTER(errordata))
self.setup_func("getprints", (c_int_ptr,), POINTER(c_char_p))
self.setup_func("getalllabels", (c_int_ptr,), POINTER(_labeldata))
self.setup_func("getlabelval", (c_char_p,), c_int)
self.setup_func("getdefine", (c_char_p,), c_char_p)
self.setup_func("getalldefines", (c_int_ptr,), POINTER(_definedata))
self.setup_func("resolvedefines", (c_char_p, ctypes.c_bool),
c_char_p)
self.setup_func("math", (c_char_p, POINTER(c_char_p)),
ctypes.c_double)
self.setup_func("getwrittenblocks", (c_int_ptr,),
POINTER(writtenblockdata))
self.setup_func("getmapper", (), c_int)
self.setup_func("getsymbolsfile", (c_char_p,), c_char_p)
except AttributeError:
raise OSError("Asar DLL is missing some functions")
api_ver = dll.asar_apiversion()
if api_ver < _target_api_ver or \
(api_ver // 100) > (_target_api_ver // 100):
raise OSError("Asar DLL version "+str(api_ver)+" unsupported")
def setup_func(self, name, argtypes, restype):
"""Setup argument and return types for a function.
name: name of the function in the DLL. "asar_" is added automatically
argtypes and restype: see ctypes documentation
"""
func = getattr(self.dll, "asar_" + name)
func.argtypes = argtypes
func.restype = restype
def init(dll_path=None):
"""Load the Asar DLL.
You must call this before calling any other Asar functions. Raises OSError
if there was something wrong with the DLL (not found, wrong version,
doesn't have all necessary functions).
You can pass a custom DLL path if you want. If you don't, some common names
for the asar dll are tried.
"""
global _asar
if _asar is not None:
return
if dll_path is not None:
_asar = _AsarDLL(dll_path)
else:
if sys.platform == "win32":
libnames = ["./asar.dll", "asar", "./asar-x64.dll", "asar-x64"]
elif sys.platform == "darwin":
libnames = ["./libasar.dylib", "libasar"]
else:
libnames = ["./libasar.so", "libasar"]
for x in libnames:
try:
_asar = _AsarDLL(x)
except OSError:
continue
if _asar is None:
# Nothing in the search path is valid
raise OSError("Could not find asar DLL")
if not _asar.dll.asar_init():
_asar = None
return False
else:
return True
def close():
"""Free all of Asar's structures and unload the module.
Only asar.init() may be called after calling this.
"""
global _asar
if _asar is None:
return
_asar.dll.asar_close()
_asar = None
def version():
"""Return the version, in the format major*10000+minor*100+bugfix*1.
This means that 1.2.34 would be returned as 10234.
"""
return _asar.dll.asar_version()
def apiversion():
"""Return the API version, in the format major*100+minor.
Minor is incremented on backwards compatible changes; major is incremented
on incompatible changes. Does not have any correlation with the Asar
version. It's not very useful directly, since asar.init() verifies this
automatically.
"""
return _asar.dll.asar_apiversion()
def reset():
"""Clear out errors, warnings, printed statements and the file cache.
Not really useful, since asar.patch() already does this.
"""
return _asar.dll.asar_reset()
def patch(patch_name, rom_data, includepaths=[], should_reset=True,
additional_defines={}, std_include_file=None, std_define_file=None,
warning_overrides={}, memory_files={}, override_checksum=None):
"""Applies a patch.
Returns (success, new_rom_data). If success is False you should call
geterrors() to see what went wrong. rom_data is assumed to be headerless.
If includepaths is specified, it lists additional include paths for asar
to search.
should_reset specifies whether asar should clear out all defines, labels,
etc from the last inserted file. Setting it to False will make Asar act
like the currently patched file was directly appended to the previous one.
additional_defines specifies extra defines to give to the patch
(similar to the -D option).
std_include_file and std_define_file specify files where to look for extra
include paths and defines, respectively.
warning_overrides is a dict of str (warning ID) -> bool. It overrides
enabling/disabling specific warnings.
memory_files is a dict of str (file name) -> bytes (file contents). It
specifies memory files to use.
override_checksum specifies whether to override checksum generation. True
forces Asar to update the ROM's checksum, False forces Asar to not update
it.
"""
romlen = c_int(len(rom_data))
rom_ptr = ctypes.create_string_buffer(bytes(rom_data), maxromsize())
pp = _patchparams()
pp.structsize = ctypes.sizeof(_patchparams)
pp.patchloc = patch_name.encode()
pp.romdata = ctypes.cast(rom_ptr, c_char_p)
pp.buflen = maxromsize()
pp.romlen = ctypes.pointer(romlen)
# construct an array type of len(includepaths) elements and initialize
# it with elements from includepaths
pp.includepaths = (c_char_p*len(includepaths))(*includepaths)
pp.numincludepaths = len(includepaths)
defines = (_definedata * len(additional_defines))()
for i, (k, v) in enumerate(additional_defines.items()):
defines[i].name = k.encode()
defines[i].contents = v.encode()
pp.additional_defines = defines
pp.additional_define_count = len(additional_defines)
pp.should_reset = should_reset
pp.stdincludesfile = std_include_file.encode() if std_include_file else None
pp.stddefinesfile = std_define_file.encode() if std_define_file else None
warnsettings = (_warnsetting * len(warning_overrides))()
for i, (k, v) in enumerate(warning_overrides.items()):
warnsettings[i].warnid = k.encode()
warnsettings[i].enabled = v
pp.warning_settings = warnsettings
pp.warning_setting_count = len(warnsettings)
memoryfiles = (_memoryfile * len(memory_files))()
for i, (k, v) in enumerate(memory_files.items()):
memoryfiles[i].path = k.encode()
memoryfiles[i].buffer = v
memoryfiles[i].length = len(v)
pp.memory_files = memoryfiles
pp.memory_file_count = len(memory_files)
if override_checksum is not None:
pp.override_checksum_gen = True
pp.generate_checksum = override_checksum
else:
pp.override_checksum_gen = False
pp.generate_checksum = False
result = _asar.dll.asar_patch_ex(ctypes.byref(pp))
return result, rom_ptr.raw[:romlen.value]
def maxromsize():
"""Return the maximum possible size of the output ROM."""
return _asar.dll.asar_maxromsize()
def geterrors():
"""Get a list of all errors."""
return _getall(_asar.dll.asar_geterrors)
def getwarnings():
"""Get a list of all warnings."""
return _getall(_asar.dll.asar_getwarnings)
def getprints():
"""Get a list of all printed data."""
return [x.decode() for x in _getall(_asar.dll.asar_getprints)]
def getalllabels():
"""Get a dictionary of label name -> SNES address."""
labeldatas = _getall(_asar.dll.asar_getalllabels)
return {x.name.decode(): x.location for x in labeldatas}
def getlabelval(name):
"""Get the ROM location of one label. None means "not found"."""
val = _asar.dll.asar_getlabelval(name.encode())
return None if (val == -1) else val
def getdefine(name):
"""Get the value of a define."""
return _asar.dll.asar_getdefine(name.encode()).decode()
def getalldefines():
"""Get the names and values of all defines."""
definedatas = _getall(_asar.dll.asar_getalldefines)
return {x.name.decode(): x.contents.decode() for x in definedatas}
def resolvedefines(data, learnnew):
"""Parse all defines in the given data.
Returns the data with all defines evaluated.
learnnew controls whether it'll learn new defines in this string if it
finds any. Note that it may emit errors.
"""
return _asar.dll.asar_resolvedefines(data, learnnew)
def math(to_calculate):
"""Parse a string containing math.
It automatically assumes global scope (no namespaces), and has access to
all functions and labels from the last call to asar.patch(). If there was
an error, ArithmeticError is raised with the message returned by Asar.
"""
error = ctypes.c_char_p()
result = _asar.dll.asar_math(to_calculate.encode(), ctypes.byref(error))
if not bool(error):
# Null pointer, means no error
return result
else:
raise AsarArithmeticError(error.value.decode())
def getwrittenblocks():
"""Get a list of all the blocks written to the ROM."""
return _getall(_asar.dll.asar_getwrittenblocks)
def getmapper():
"""Get the ROM mapper currently used by Asar."""
return mappertype(_asar.dll.asar_getmapper())
def getsymbolsfile(fmt="wla"):
"""Generates the contents of a symbols file for in a specific format.
Returns the textual contents of the symbols file.
format specified the format of the symbols file that gets generated.
"""
return _asar.dll.asar_getsymbolsfile(fmt.encode()).decode()

View File

@@ -2,23 +2,24 @@
; Randomize Book of Mudora
;--------------------------------------------------------------------------------
LoadLibraryItemGFX:
%GetPossiblyEncryptedItem(LibraryItem, SpriteItemValues)
JSL.l AttemptItemSubstitution
JSL.l ResolveLootIDLong
STA.w SpriteID, X
JSL.l PrepDynamicTile_loot_resolved
LDA.l LibraryItem_Player : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID
%GetPossiblyEncryptedItem(LibraryItem, SpriteItemValues)
JSL AttemptItemSubstitution
JSL ResolveLootIDLong
STA.w SpriteID, X
JSL PrepDynamicTile_loot_resolved
RTL
;--------------------------------------------------------------------------------
DrawLibraryItemGFX:
PHA
LDA.w SpriteID, X
JSL.l DrawDynamicTile
PLA
PHA
LDA.w SpriteID, X
JSL DrawDynamicTile
PLA
RTL
;--------------------------------------------------------------------------------
SetLibraryItem:
LDY.w SpriteID, X
JSL.l ItemSet_Library ; contains thing we wrote over
LDY.w SpriteID, X
JSL ItemSet_Library ; contains thing we wrote over
RTL
;--------------------------------------------------------------------------------
@@ -27,76 +28,89 @@ RTL
; Randomize Bonk Keys
;--------------------------------------------------------------------------------
LoadBonkItemGFX:
LDA.b #$08 : STA.w SpriteOAMProp, X ; thing we wrote over
LDA.b #$08 : STA.w SpriteOAMProp, X ; thing we wrote over
LoadBonkItemGFX_inner:
LDA.b #$00 : STA.l RedrawFlag
JSR LoadBonkItem
JSL.l AttemptItemSubstitution
JSL.l ResolveLootIDLong
STA.w SpriteItemType, X
STA.w SpriteID, X
JSL.l PrepDynamicTile
PHA : PHX
LDA.w SpriteID,X : TAX
LDA.l SpriteProperties_standing_width,X : BNE +
LDA.b #$00 : STA.l SpriteOAM : STA.l SpriteOAM+8
+
PLX : PLA
LDA.b #$00 : STA.l RedrawFlag
JSR LoadBonkItem_Player : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID
JSR LoadBonkItem
JSL AttemptItemSubstitution
JSL ResolveLootIDLong
STA.w $0E80, X
STA.w SpriteID, X
JSL PrepDynamicTile
PHA : PHX
LDA.w SpriteID,X : TAX
LDA.l SpriteProperties_standing_width,X : BNE +
LDA.b #$00 : STA.l SpriteOAM : STA.l SpriteOAM+8
+
PLX : PLA
RTL
;--------------------------------------------------------------------------------
DrawBonkItemGFX:
PHA
LDA.l RedrawFlag : BEQ .skipInit
JSL.l LoadBonkItemGFX_inner
BRA .done ; don't draw on the init frame
.skipInit
LDA.w SpriteID,X
JSL.l DrawDynamicTileNoShadow
PHA
LDA.l RedrawFlag : BEQ .skipInit
JSL LoadBonkItemGFX_inner
BRA .done ; don't draw on the init frame
.done
PLA
.skipInit
LDA.w SpriteID,X
JSL DrawDynamicTileNoShadow
.done
PLA
RTL
;--------------------------------------------------------------------------------
GiveBonkItem:
JSR LoadBonkItem
JSR.w AbsorbKeyCheck : BCC .notKey
.key
PHY : LDY.b #$24 : JSL.l AddInventory : PLY ; do inventory processing for a small key
LDA.l CurrentSmallKeys : INC A : STA.l CurrentSmallKeys
LDA.b #$2F : JSL.l Sound_SetSfx3PanLong
JSL CountBonkItem
RTL
JSR LoadBonkItem_Player : STA.l !MULTIWORLD_ITEM_PLAYER_ID
JSR LoadBonkItem
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
LDA.b #$2F : JSL Sound_SetSfx3PanLong
LDA.b #$01 : STA.l UpdateHUDFlag
RTL
.notKey
PHY : TAY : JSL.l Link_ReceiveItem : PLY
JSL CountBonkItem
PHY : TAY : JSL Link_ReceiveItem : PLY
RTL
;--------------------------------------------------------------------------------
LoadBonkItem:
LDA.b RoomIndex ; check room ID - only bonk keys in 2 rooms so we're just checking the lower byte
CMP.b #115 : BNE + ; Desert Bonk Key
LDA.l BonkKey_Desert
BRA ++
+ : CMP.b #140 : BNE + ; GTower Bonk Key
LDA.l BonkKey_GTower
BRA ++
+
LDA.b #$24 ; default to small key
++
LDA.b RoomIndex ; check room ID - only bonk keys in 2 rooms so we're just checking the lower byte
CMP.b #$73 : BNE + ; Desert Bonk Key
LDA.l BonkKey_Desert
BRA ++
+ : CMP.b #$8C : BNE + ; GTower Bonk Key
LDA.l BonkKey_GTower
BRA ++
+
LDA.b #$24 ; default to small key
++
RTS
;--------------------------------------------------------------------------------
LoadBonkItem_Player:
LDA.b RoomIndex ; check room ID - only bonk keys in 2 rooms so we're just checking the lower byte
CMP.b #$73 : BNE + ; Desert Bonk Key
LDA.l BonkKey_Desert_Player
BRA ++
+ : CMP.b #$8C : BNE + ; GTower Bonk Key
LDA.l BonkKey_GTower_Player
BRA ++
+
LDA.b #$00
++
RTS
;--------------------------------------------------------------------------------
AbsorbKeyCheck:
PHA
CMP.b #$24 : BEQ .key
CMP.b #$A0 : BCC .not_key
CMP.b #$B0 : BCS .not_key
AND.b #$0F : ASL
CMP.w DungeonID : BNE .not_key
.key
PLA
SEC
RTS
.not_key
PLA
CLC
PHA
CMP.b #$24 : BEQ .key
CMP.b #$A0 : BCC .not_key
CMP.b #$B0 : BCS .not_key
AND.b #$0F : ASL
CMP.w DungeonID : BNE .not_key
.key
PLA
SEC
RTS
.not_key
PLA
CLC
RTS

View File

@@ -8,7 +8,7 @@ ModifyBoots:
+ : CMP.b #$02 : BNE +
PLA : AND.l AbilityFlags : AND.b #$FB : RTL ; no boots
+ : LDA.l FakeBoots : CMP.b #$01 : BNE +
LDA.b LinkSlipping : BEQ ++ : LDA.b $59 : BNE + ; hover check
LDA.b LinkSlipping : BEQ ++ : LDA.b PitTileActField : BNE + ; hover check
++ : PLA : AND.l AbilityFlags : ORA.b #$04 : RTL ; yes boots, not hovering
+
PLA
@@ -17,15 +17,15 @@ RTL
;--------------------------------------------------------------------------------
AddBonkTremors:
PHA
LDA.b $46 : BNE + ; Check for incapacitated Link
JSL.l IncrementBonkCounter
LDA.b LinkIncapacitatedTimer : BNE + ; Check for incapacitated Link
JSL IncrementBonkCounter
+
LDA.l BootsModifier : CMP.b #$01 : BEQ +
LDA.l BootsEquipment : BNE + ; Check for Boots
PLA : RTL
+
PLA
JSL.l AddDashTremor : JSL.l Player_ApplyRumbleToSprites ; things we wrote over
JSL AddDashTremor : JSL Player_ApplyRumbleToSprites ; things we wrote over
RTL
;--------------------------------------------------------------------------------
BonkBreakableWall:
@@ -36,7 +36,7 @@ BonkBreakableWall:
PLP : PLX : LDA.w #$0000 : RTL
+
PLP : PLX
LDA.w $0372 : AND.w #$00FF ; things we wrote over
LDA.w LinkDashing : AND.w #$00FF ; things we wrote over
RTL
;--------------------------------------------------------------------------------
BonkRockPile:
@@ -51,10 +51,10 @@ GravestoneHook:
LDA.l BootsModifier : CMP.b #$01 : BEQ +
LDA.l BootsEquipment : BEQ .done ; Check for Boots
+
LDA.w $0372 : BEQ .done ; things we wrote over
JML.l moveGravestone
LDA.w LinkDashing : BEQ .done ; things we wrote over
JML moveGravestone
.done
JML.l GravestoneHook_continue
JML GravestoneHook_continue
;--------------------------------------------------------------------------------
JumpDownLedge:
LDA.l BootsModifier : CMP.b #$01 : BEQ +

View File

@@ -51,7 +51,7 @@ DecideIfBunnyByScreenIndex:
LDA.b OverworldIndex : AND.b #$40 : PHA
LDA.l InvertedMode : BNE .inverted
.normal
PLA : EOR #$40
PLA : EOR.b #$40
BRA .done
.inverted
PLA
@@ -60,7 +60,7 @@ RTL
;--------------------------------------------------------------------------------
FixBunnyOnExitToLightWorld:
LDA.w BunnyFlag : BEQ +
JSL.l DecideIfBunny : BEQ +
JSL DecideIfBunny : BEQ +
STZ.b LinkState ; set player mode to Normal
STZ.w BunnyFlag : STZ.b BunnyFlagDP ; return player graphics to normal
+
@@ -113,7 +113,7 @@ FixFrogSmith:
STA.l FollowerIndicator
JSL Tagalong_LoadGfx
.done
RTS
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
@@ -183,7 +183,7 @@ RTL
;--------------------------------------------------------------------------------
; Fix pedestal pull overlay
PedestalPullOverlayFix:
LDA.b #$09 : STA.w AncillaGeneral, X ; the thing we wrote over
LDA.b #$09 : STA.w AncillaGeneralF, X ; the thing we wrote over
LDA.b IndoorsFlag : BNE +
LDA.b OverworldIndex : CMP.b #$80 : BNE +
LDA.b OverlayID : CMP.b #$97
@@ -235,7 +235,7 @@ ParadoxCaveGfxFix:
CPX.w #$1E00 : BEQ .uploadLine
.uploadLine
LDA.b #$01 : STA.w MDMAEN
LDA.b #$01 : STA.w DMAENABLE
.skipLine
RTL
@@ -246,7 +246,7 @@ ParadoxCaveGfxFix:
BRA .uploadLine
;--------------------------------------------------------------------------------
SetItemRiseTimer:
LDA.w ItemReceiptMethod : CMP #$01 : BNE .not_from_chest
LDA.w ItemReceiptMethod : CMP.b #$01 : BNE .not_from_chest
LDA.b #$38 : STA.w AncillaTimer, X
RTL
.not_from_chest

115
build.py Normal file
View File

@@ -0,0 +1,115 @@
import os
import sys
import hashlib
from asar import init as asar_init, close as asar_close, patch as asar_patch, geterrors as asar_errors, getprints as asar_prints, getwarnings as asar_warnings
JAP10HASH = '03a63945398191337e896e5771f77173'
try:
from yaml import CLoader as Loader
except ImportError:
from yaml import Loader
def int16_as_bytes(value):
value = value & 0xFFFF
return [value & 0xFF, (value >> 8) & 0xFF]
def int32_as_bytes(value):
value = value & 0xFFFFFFFF
return [value & 0xFF, (value >> 8) & 0xFF, (value >> 16) & 0xFF, (value >> 24) & 0xFF]
def is_bundled():
return getattr(sys, 'frozen', False)
def local_path(path):
if local_path.cached_path:
return os.path.join(local_path.cached_path, path)
elif is_bundled():
if hasattr(sys, "_MEIPASS"):
# we are running in a PyInstaller bundle
local_path.cached_path = sys._MEIPASS # pylint: disable=protected-access,no-member
else:
# cx_Freeze
local_path.cached_path = os.path.dirname(os.path.abspath(sys.argv[0]))
else:
# we are running in a normal Python environment
import __main__
local_path.cached_path = os.path.dirname(os.path.abspath(__main__.__file__))
return os.path.join(local_path.cached_path, path)
local_path.cached_path = None
def make_new_base2current(old_rom_data, new_rom_data):
from collections import OrderedDict
import json
# extend to 2 mb
old_rom_data.extend(bytearray([0x00]) * (2097152 - len(old_rom_data)))
out_data = OrderedDict()
for idx, old in enumerate(old_rom_data):
new = new_rom_data[idx]
if old != new:
out_data[idx] = [int(new)]
for offset in reversed(list(out_data.keys())):
if offset - 1 in out_data:
out_data[offset-1].extend(out_data.pop(offset))
with open('../base2current.json', 'wt') as outfile:
json.dump([{key: value} for key, value in out_data.items()], outfile, separators=(",", ":"))
basemd5 = hashlib.md5()
basemd5.update(new_rom_data)
return "New Rom Hash: " + basemd5.hexdigest()
if __name__ == '__main__':
try:
asar_init()
print("Asar DLL initialized")
print("Opening Base rom")
with open('../alttp.sfc', 'rb') as stream:
old_rom_data = bytearray(stream.read())
if len(old_rom_data) % 0x400 == 0x200:
old_rom_data = old_rom_data[0x200:]
basemd5 = hashlib.md5()
basemd5.update(old_rom_data)
if JAP10HASH != basemd5.hexdigest():
raise Exception("Base rom is not 'Zelda no Densetsu - Kamigami no Triforce (J) (V1.0)'")
print("Patching Base Rom")
result, new_rom_data = asar_patch(os.path.abspath('LTTP_RND_GeneralBugfixes.asm'), old_rom_data)
if result:
with open('../working.sfc', 'wb') as stream:
stream.write(new_rom_data)
print("Success\n")
print(make_new_base2current(old_rom_data, new_rom_data))
prints = asar_prints()
for p in prints:
print(p)
else:
errors = asar_errors()
print("\nErrors: " + str(len(errors)))
for error in errors:
print (error)
warnings = asar_warnings()
print("\nWarnings: " + str(len(warnings)))
for w in warnings:
print(w)
asar_close()
except:
import traceback
traceback.print_exc()

View File

@@ -1,5 +1,8 @@
#!/bin/bash
rm ../working.sfc
cp ../alttp.sfc ../working.sfc
./bin/macos/asar LTTP_RND_GeneralBugfixes.asm ../working.sfc
rm ../alttp.sfc
cp ~/dev/kwyn/orig/z3.sfc ../alttp.sfc
asar --symbols=wla LTTP_RND_GeneralBugfixes.asm ../alttp.sfc
flips ~/dev/kwyn/orig/z3.sfc ../alttp.sfc ../base2current.bps
md5sum ../alttp.sfc | tee /dev/tty | cut -d ' ' -f 1 | xargs -I '{}' sed -i "s/RANDOMIZERBASEHASH = '.\+'/RANDOMIZERBASEHASH = '{}'/g" ~/dev/kwyn/doors/Rom.py
cp ../base2current.bps ~/dev/kwyn/doors/data

View File

@@ -2,4 +2,4 @@
rm ../working.sfc
cp ../alttp.sfc ../working.sfc
./bin/linux/asar LTTP_RND_GeneralBugfixes.asm ../working.sfc
./bin/linux/asar -DFEATURE_PATREON_SUPPORTERS=1 LTTP_RND_GeneralBugfixes.asm ../working.sfc

View File

@@ -19,14 +19,14 @@ InvertDPad:
LDA.b #$80 : STA.w WRIO ; reset this so latch can read it, otherwise RNG breaks
JML.l InvertDPadReturn
JML InvertDPadReturn
.crowd_control
LDA.l ControllerInverter : BNE +
LDA.w JOY1L : STA.b Scrap00
LDA.w JOY1H : STA.b Scrap01
JML.l InvertDPadReturn
JML InvertDPadReturn
+ DEC : BEQ .dpadOnly
DEC : BEQ .buttonsOnly
@@ -40,7 +40,7 @@ InvertDPad:
BIT.w #$8400 : BEQ + : EOR.w #$8400 : + ; swap B/down
STA.b Scrap00
SEP #$20 ; set 8-bit accumulator
JML.l InvertDPadReturn
JML InvertDPadReturn
.invertBoth
REP #$20 ; set 16-bit accumulator
LDA.w JOY1L
@@ -50,7 +50,7 @@ JML.l InvertDPadReturn
BIT.w #$0300 : BEQ + : EOR.w #$0300 : + ; swap left/right
STA.b Scrap00
SEP #$20 ; set 8-bit accumulator
JML.l InvertDPadReturn
JML InvertDPadReturn
.buttonsOnly
REP #$20 ; set 16-bit accumulator
LDA.w JOY1L
@@ -58,14 +58,14 @@ JML.l InvertDPadReturn
BIT.w #$4080 : BEQ + : EOR.w #$4080 : + ; swap Y/A
STA.b Scrap00
SEP #$20 ; set 8-bit accumulator
JML.l InvertDPadReturn
JML InvertDPadReturn
.dpadOnly
LDA.w JOY1L : STA.b Scrap00
LDA.w JOY1H
BIT.b #$0C : BEQ + : EOR.b #$0C : + ; swap up/down
BIT.b #$03 : BEQ + : EOR.b #$03 : + ; swap left/right
STA.b Scrap01
JML.l InvertDPadReturn
JML InvertDPadReturn
.onemind_controller_offset
db 0 ; player 0 - JOY1L - joy1d1
@@ -75,8 +75,6 @@ JML.l InvertDPadReturn
db 2 ; player 4 - JOY2L - joy2d1
db 6 ; player 5 - JOY4L - joy2d2
;--------------------------------------------------------------------------------
HandleOneMindController:
@@ -119,5 +117,5 @@ HandleOneMindController:
.no_onemind
STZ.b NMIDoneFlag
JML $808034 ; reset frame loop
JML MainGameLoop ; reset frame loop

View File

@@ -32,9 +32,9 @@ CuccoStorm:
LDA.w SpriteAuxTable, X : CMP.b #!CUCCO_ENRAGED : !BLT ++
PLA : BRA + ; we found an angry cucco, done
++ : INX : BRA -- : .ldone
;==== Create a Cucco
CPY.b #$FF : BNE ++
; we didn't find a cucco, so try to create one
PLY

View File

@@ -5,8 +5,6 @@ dw $0000, $7E4E, $6FF4, $1CF5, $7FFF, $1CE7, $7A10, $64A5
dw $7FFF, $093B, $169F, $7E8D, $7FFF, $1CE7, $7A10, $64A5
.golden_sword
dw $0000, $033F, $7FFF, $2640, $7FFF, $1CE7, $7A10, $64A5
.golden_bombs
dw $0000, $7FFF, $27FF, $02BC, $4F5F, $1CE7, $2E9C, $14B6
.fighter_shield
dw $0000, $7FFF, $27FF, $5E2D, $7FFF, $1CE7, $7A10, $64A5
.red_shield

View File

@@ -3,19 +3,19 @@
;--------------------------------------------------------------------------------
DarkWorldSaveFix:
LDA.b #$70 : PHA : PLB ; thing we wrote over - data bank change
JSL.l MasterSwordFollowerClear
JML.l StatSaveCounter
JSL MasterSwordFollowerClear
JML StatSaveCounter
;--------------------------------------------------------------------------------
DoWorldFix:
LDA.l InvertedMode : BEQ +
JMP DoWorldFix_Inverted
+
LDA.l Bugfix_MirrorlessSQToLW : BEQ .skip_mirror_check
LDA.l FollowerIndicator : CMP.b #$04 : BEQ .setLightWorld ; check if old man is following
LDA.l MirrorEquipment : BEQ .noMirror ; check if we have the mirror
LDA.l FollowerIndicator : CMP.b #$04 : BEQ .setLightWorld ; check if old man is following
LDA.l MirrorEquipment : AND.b #$02 : BEQ .noMirror ; check if we have the mirror
.skip_mirror_check ; alt entrance point
LDA.l ProgressIndicator : CMP.b #$03 : BCS .done ; check if agahnim 1 is alive
.setLightWorld
.setLightWorld
LDA.b #$00
.noMirror
STA.l CurrentWorld ; set flag to light world
@@ -31,13 +31,15 @@ SetDeathWorldChecked:
LDA.w DungeonID : CMP.b #$FF : BNE .dungeon
LDA.b RoomIndex : ORA.b RoomIndex+1 : BNE ++
LDA.l GanonPyramidRespawn : BNE .pyramid ; if flag is set, force respawn at pyramid on death to ganon
++
++
.outdoors
JMP DoWorldFix
.dungeon
LDA.l MosaicLevel : BNE .dontfix ; this is a sanc & quit
LDA.l Bugfix_PreAgaDWDungeonDeathToFakeDW : BNE .done ; if the bugfix is enabled, we do nothing on death in dungeon
JMP DoWorldFix_skip_mirror_check
.dontfix
JMP DoWorldFix_skip_mirror_check
.pyramid
LDA.b #$40 : STA.l CurrentWorld ; set flag to dark world
@@ -47,11 +49,11 @@ RTL
;================================================================================
DoWorldFix_Inverted:
LDA.l Bugfix_MirrorlessSQToLW : BEQ .skip_mirror_check
LDA.l FollowerIndicator : CMP.b #$04 : BEQ .setDarkWorld ; check if old man is following
LDA.l MirrorEquipment : BEQ .setDarkWorld ; check if we have the mirror
LDA.l FollowerIndicator : CMP.b #$04 : BEQ .setDarkWorld ; check if old man is following
LDA.l MirrorEquipment : AND.b #$02 : BEQ .setDarkWorld ; check if we have the mirror
.skip_mirror_check ; alt entrance point
LDA.l ProgressIndicator : CMP.b #$03 : BCS .done ; check if agahnim 1 is alive
.setDarkWorld
.setDarkWorld
LDA.b #$40 : STA.l CurrentWorld ; set flag to dark world
LDA.l FollowerIndicator
CMP.b #$07 : BEQ .clear ; clear frog
@@ -72,8 +74,10 @@ SetDeathWorldChecked_Inverted:
JMP DoWorldFix
.dungeon
LDA.l MosaicLevel : BNE .dontfix ; this is a sanc & quit
LDA.l Bugfix_PreAgaDWDungeonDeathToFakeDW : BNE .done ; if the bugfix is enabled, we do nothing on death in dungeon
JMP DoWorldFix_Inverted_skip_mirror_check
.dontfix
JMP DoWorldFix_Inverted_skip_mirror_check
.castle
LDA.b #$00 : STA.l CurrentWorld ; set flag to dark world
@@ -115,17 +119,23 @@ RefreshRainAmmo:
+ CMP.b #$03 : BNE + ; Uncle
%SetMinimum(CurrentMagic,MagicFiller,RainDeathRefillMagic_Uncle)
%SetMinimum(BombsEquipment,BombsFiller,RainDeathRefillBombs_Uncle)
%SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Uncle)
BRA .done
LDA.l ArrowMode : BEQ ++
LDA.l BowEquipment : BEQ +++
++ %SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Uncle)
+++ BRA .done
+ CMP.b #$02 : BNE + ; Cell
%SetMinimum(CurrentMagic,MagicFiller,RainDeathRefillMagic_Cell)
%SetMinimum(BombsEquipment,BombsFiller,RainDeathRefillBombs_Cell)
%SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Cell)
LDA.l ArrowMode : BEQ ++
LDA.l BowEquipment : BEQ .done
++ %SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Cell)
BRA .done
+ CMP.b #$04 : BNE + ; Mantle
%SetMinimum(CurrentMagic,MagicFiller,RainDeathRefillMagic_Mantle)
%SetMinimum(BombsEquipment,BombsFiller,RainDeathRefillBombs_Mantle)
%SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Mantle)
LDA.l ArrowMode : BEQ ++
LDA.l BowEquipment : BEQ .done
++ %SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Mantle)
+
.done
RTL
@@ -143,11 +153,6 @@ SetEscapeAssist:
LDA.l EscapeAssist : BIT.b #$02 : BEQ + : LDA.b #$00 : STA.l InfiniteBombs : +
LDA.l EscapeAssist : BIT.b #$01 : BEQ + : LDA.b #$00 : STA.l InfiniteArrows : +
++
LDA.l SpecialWeapons : AND.b #$7F : CMP #$01 : BNE +
LDA.l SpecialWeaponLevel : BEQ +
LDA #$01 : STA InfiniteBombs
+
RTL
;--------------------------------------------------------------------------------
SetSilverBowMode:

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Binary file not shown.

61
data/textbytecharmap.txt Normal file
View File

@@ -0,0 +1,61 @@
'=9D
A=AA
B=AB
C=AC
D=AD
E=AE
F=AF
G=B0
H=B1
I=B2
J=B3
K=B4
L=B5
M=B6
N=B7
O=B8
P=B9
Q=BA
R=BB
S=BC
T=BD
U=BE
V=BF
W=C0
X=C1
Y=C2
Z=C3
?=C6
!=C7
,=C8
-=C9
.=CD
~=CE
a=D0
b=D1
c=D2
d=D3
e=D4
f=D5
g=D6
h=D7
i=D8
j=D9
k=DA
l=DB
m=DC
n=DD
o=DE
p=DF
q=E0
r=E1
s=E2
t=E3
u=E4
v=E5
w=E6
x=E7
y=E8
z=E9
:=EA
=FF

61
data/textwordcharmap.txt Normal file
View File

@@ -0,0 +1,61 @@
'=9D00
A=AA00
B=AB00
C=AC00
D=AD00
E=AE00
F=AF00
G=B000
H=B100
I=B200
J=B300
K=B400
L=B500
M=B600
N=B700
O=B800
P=B900
Q=BA00
R=BB00
S=BC00
T=BD00
U=BE00
V=BF00
W=C000
X=C100
Y=C200
Z=C300
?=C600
!=C700
,=C800
-=C900
.=CD00
~=CE00
a=D000
b=D100
c=D200
d=D300
e=D400
f=D500
g=D600
h=D700
i=D800
j=D900
k=DA00
l=DB00
m=DC00
n=DD00
o=DE00
p=DF00
q=E000
r=E100
s=E200
t=E300
u=E400
v=E500
w=E600
x=E700
y=E800
z=E900
:=EA00
=FF00

View File

@@ -142,13 +142,13 @@ TransferItemToVRAM:
STA.w $2116
LDX.b #$01
STX.w $420B
STX.w DMAENABLE
ADC.w #$0100
STA.w $2116
INX
STX.w $420B
STX.w DMAENABLE
STZ.w ItemGFXPtr
STZ.w ItemGFXTarget
@@ -248,9 +248,9 @@ endmacro
FastSpriteDecomp:
SEP #$30
LDA.l $80CFC0,X : PHA : PLB ; bank
LDA.l $80D09F,X : XBA ; high
LDA.l $80D17E,X ; low
LDA.l GFXSheetPointers_background_bank,X : PHA : PLB
LDA.l GFXSheetPointers_background_high,X : XBA
LDA.l GFXSheetPointers_background_low,X
REP #$10

View File

@@ -4,7 +4,7 @@ LoadStaticDecryptionKey:
PHB : PHA : PHX : PHY : PHP
REP #$30 ; set 16-bit accumulator & index registers
LDX.w #StaticDecryptionKey ; Source
LDY.w #KeyBase ; Target
LDY.w #KeyBase ; Target
LDA.w #$000F ; Length
MVN $307F
@@ -24,14 +24,14 @@ RetrieveValueFromEncryptedTable:
LDY.b Scrap0A : PHY : LDY.b Scrap0C : PHY : LDY.b Scrap0E : PHY
AND.w #$FFF8 : TAY
LDA.b [$00], Y : STA.l CryptoBuffer : INY #2
LDA.b [$00], Y : STA.l CryptoBuffer+2 : INY #2
LDA.b [$00], Y : STA.l CryptoBuffer+4 : INY #2
LDA.b [$00], Y : STA.l CryptoBuffer+6
LDA.b [Scrap00], Y : STA.l CryptoBuffer : INY #2
LDA.b [Scrap00], Y : STA.l CryptoBuffer+2 : INY #2
LDA.b [Scrap00], Y : STA.l CryptoBuffer+4 : INY #2
LDA.b [Scrap00], Y : STA.l CryptoBuffer+6
LDA.w #$0002 : STA.b Scrap04 ;set block size
JSL.l XXTEA_Decode
JSL XXTEA_Decode
PLA : STA.b Scrap0E : PLA : STA.b Scrap0C : PLA : STA.b Scrap0A
PLA : STA.b Scrap08 : PLA : STA.b Scrap06 : PLA : STA.b Scrap04
@@ -53,7 +53,7 @@ ChestDataPayload = $01EABC ; ChestData+$0150
GetChestData:
LDA.l IsEncrypted : BNE .encrypted
INC.b Scrap0E : LDX.w #$FFFD ; what we wrote over
JML.l Dungeon_OpenKeyedObject_nextChest
JML Dungeon_OpenKeyedObject_nextChest
.encrypted
INC.b Scrap0E : LDX.w #$FFFE
@@ -78,10 +78,10 @@ JML.l Dungeon_OpenKeyedObject_nextChest
LDA.l ChestData, X : ASL A : BCC .smallChest
JML.l Dungeon_OpenKeyedObject_bigChest ;(bank01.asm line #13783)
JML Dungeon_OpenKeyedObject_bigChest ;(bank01.asm line #13783)
.smallChest
JML.l Dungeon_OpenKeyedObject_smallChest
JML Dungeon_OpenKeyedObject_smallChest
.couldntFindChest
JML.l Dungeon_OpenKeyedObject_couldntFindChest
JML Dungeon_OpenKeyedObject_couldntFindChest
;--------------------------------------------------------------------------------

View File

@@ -21,7 +21,7 @@ macro LoadDialogAddress(address)
PHB : PHK : PLB
SEP #$20 ; set 8-bit accumulator
REP #$10 ; set 16-bit index registers
PEI.b ($00)
PEI.b (Scrap00)
LDA.b Scrap02 : PHA
STZ.w TextID : STZ.w TextID+1 ; reset decompression buffer
LDA.b #$01 : STA.l AltTextFlag ; set flag
@@ -44,7 +44,7 @@ endmacro
macro CopyDialogIndirect()
REP #$20 : LDA.l DialogOffsetPointer : TAX : LDY.w #$0000 : SEP #$20 ; copy 2-byte offset pointer to X and set Y to 0
?loop:
LDA.b [$00], Y ; load the next character from the pointer
LDA.b [Scrap00], Y ; load the next character from the pointer
STA.l DialogBuffer, X ; write to the buffer
INX : INY
CMP.b #$7F : BNE ?loop
@@ -61,7 +61,7 @@ LoadDialogAddressIndirect:
RTL
;--------------------------------------------------------------------------------
FreeDungeonItemNotice:
STA.w ScratchBufferV
STA.l ScratchBufferV
PHA : PHX : PHY
PHP
@@ -70,59 +70,59 @@ FreeDungeonItemNotice:
REP #$10 ; set 16-bit index registers
PEI.b (Scrap00)
LDA.b Scrap02 : PHA
LDA.w ScratchBufferNV : PHA
LDA.w ScratchBufferNV+1 : PHA
LDA.l ScratchBufferNV : PHA
LDA.l ScratchBufferNV+1 : PHA
;--------------------------------
LDA.l FreeItemText : BNE + : JMP .skip : +
LDA.b #$00 : STA.w ScratchBufferNV ; initialize scratch
LDA.b #$00 : STA.l ScratchBufferNV ; initialize scratch
LDA.l FreeItemText : AND.b #$01 : BEQ + ; show message for general small key
LDA.w ScratchBufferV : CMP.b #$24 : BNE + ; general small key
LDA.l ScratchBufferV : CMP.b #$24 : BNE + ; general small key
%CopyDialog(Notice_SmallKeyOf)
LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer
%CopyDialog(Notice_Self)
JMP .done
+ : LDA.l FreeItemText : AND.b #$02 : BEQ + ; show message for general compass
LDA.w ScratchBufferV : CMP.b #$25 : BNE + ; general compass
LDA.l ScratchBufferV : CMP.b #$25 : BNE + ; general compass
%CopyDialog(Notice_CompassOf)
LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer
%CopyDialog(Notice_Self)
JMP .done
+ : LDA.l FreeItemText : AND.b #$04 : BEQ + ; show message for general map
LDA.w ScratchBufferV : CMP.b #$33 : BNE + ; general map
LDA.l ScratchBufferV : CMP.b #$33 : BNE + ; general map
%CopyDialog(Notice_MapOf)
LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer
%CopyDialog(Notice_Self)
JMP .done
+ : LDA.l FreeItemText : AND.b #$08 : BEQ + ; show message for general big key
LDA.w ScratchBufferV : CMP.b #$32 : BNE + ; general big key
LDA.l ScratchBufferV : CMP.b #$32 : BNE + ; general big key
%CopyDialog(Notice_BigKeyOf)
LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer
%CopyDialog(Notice_Self)
JMP .done
+
LDA.l FreeItemText : AND.b #$04 : BEQ + ; show message for dungeon map
LDA.w ScratchBufferV : AND.b #$F0 ; looking at high bits only
LDA.l ScratchBufferV : AND.b #$F0 ; looking at high bits only
CMP.b #$70 : BNE + ; map of...
%CopyDialog(Notice_MapOf)
JMP .dungeon
+ : LDA.l FreeItemText : AND.b #$02 : BEQ + ; show message for dungeon compass
LDA.w ScratchBufferV : AND.b #$F0 : CMP.b #$80 : BNE + ; compass of...
LDA.l ScratchBufferV : AND.b #$F0 : CMP.b #$80 : BNE + ; compass of...
%CopyDialog(Notice_CompassOf)
JMP .dungeon
+ : LDA.l FreeItemText : AND.b #$08 : BEQ + ; show message for dungeon big key
LDA.w ScratchBufferV : AND.b #$F0 : CMP.b #$90 : BNE + ; big key of...
LDA.l ScratchBufferV : AND.b #$F0 : CMP.b #$90 : BNE + ; big key of...
%CopyDialog(Notice_BigKeyOf)
JMP .dungeon
+ : LDA.l FreeItemText : AND.b #$01 : BEQ + ; show message for dungeon small key
LDA.w ScratchBufferV : AND.b #$F0 : CMP.b #$A0 : BNE + ; small key of...
LDA.w ScratchBufferV : CMP.b #$AF : BNE ++ : JMP .skip : ++
LDA.l ScratchBufferV : AND.b #$F0 : CMP.b #$A0 : BNE + ; small key of...
LDA.l ScratchBufferV : CMP.b #$AF : BNE ++ : JMP .skip : ++
%CopyDialog(Notice_SmallKeyOf)
LDA.b #$01 : STA.w ScratchBufferNV ; set up a flip for small keys
LDA.b #$01 : STA.l ScratchBufferNV ; set up a flip for small keys
BRA .dungeon
+ : LDA.l FreeItemText : AND.b #$20 : BEQ + ; show message for crystal
LDA.w ScratchBufferV : CMP.b #$B0 : !BLT + ; crystal #
LDA.l ScratchBufferV : CMP.b #$B0 : !BLT + ; crystal #
CMP.b #$B7 : !BGE +
%CopyDialog(Notice_Crystal)
JMP .crystal
@@ -131,14 +131,14 @@ FreeDungeonItemNotice:
.dungeon
LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer
LDA.w ScratchBufferV
LDA.l ScratchBufferV
AND.b #$0F
STA.w ScratchBufferNV+1
LDA.w ScratchBufferNV : BEQ +
LDA.w ScratchBufferNV
LDA.b #$0F : !SUB.w ScratchBufferNV+1 : STA.w ScratchBufferNV+1 ; flip the values for small keys
STA.l ScratchBufferNV+1
LDA.l ScratchBufferNV : BEQ +
LDA.l ScratchBufferNV
LDA.b #$0F : !SUB.l ScratchBufferNV+1 : STA.l ScratchBufferNV+1 ; flip the values for small keys
+
LDA.w ScratchBufferNV+1
LDA.l ScratchBufferNV+1
ASL : TAX
REP #$20
LDA.l DungeonItemIDMap,X : CMP.w #$0003 : BCC .hc_sewers
@@ -149,10 +149,10 @@ FreeDungeonItemNotice:
.self_notice
SEP #$20
%CopyDialog(Notice_Self)
JMP.w .done
JMP .done
+
SEP #$20
LDA.w ScratchBufferNV+1
LDA.l ScratchBufferNV+1
CMP.b #$00 : BNE + ; ...light world
%CopyDialog(Notice_LightWorld) : JMP .done
+ : CMP.b #$01 : BNE + ; ...dark world
@@ -190,7 +190,7 @@ FreeDungeonItemNotice:
.crystal
LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer
LDA.w ScratchBufferV
LDA.l ScratchBufferV
AND.b #$0F ; looking at low bits only
CMP.b #$00 : BNE +
%CopyDialog(Notice_Six) : JMP .done
@@ -216,8 +216,8 @@ FreeDungeonItemNotice:
;--------------------------------
.skip
PLA : STA.w ScratchBufferNV+1
PLA : STA.w ScratchBufferNV
PLA : STA.l ScratchBufferNV+1
PLA : STA.l ScratchBufferNV
PLA : STA.b Scrap02
REP #$20
PLA : STA.b Scrap00
@@ -228,7 +228,7 @@ RTL
;--------------------------------------------------------------------------------
DialogResetSelectionIndex:
JSL.l Attract_DecompressStoryGfx ; what we wrote over
JSL Attract_DecompressStoryGfx ; what we wrote over
STZ.w MessageCursor
RTL
;--------------------------------------------------------------------------------
@@ -248,13 +248,10 @@ RTL
DialogFairyThrow:
LDA.l Restrict_Ponds : BEQ .normal
LDA.l BottleContentsOne
ORA.l BottleContentsTwo
ORA.l BottleContentsThree
ORA.l BottleContentsFour
BNE .normal
ORA.l BottleContentsTwo : ORA.l BottleContentsThree : ORA.l BottleContentsFour : BNE .normal
.noInventory
LDA.w SpriteActivity, X : !ADD #$08 : STA.w SpriteActivity, X
LDA.w SpriteActivity, X : !ADD.b #$08 : STA.w SpriteActivity, X
LDA.b #$51
LDY.b #$01
RTL
@@ -264,14 +261,14 @@ RTL
RTL
;--------------------------------------------------------------------------------
DialogGanon1:
JSL.l CheckGanonVulnerability
JSL CheckGanonVulnerability
REP #$20
LDA.w #$018C
BCC +
LDA.w #$016D
+ STA.w TextID
SEP #$20
JSL.l Sprite_ShowMessageMinimal_Alt
JSL Sprite_ShowMessageMinimal_Alt
RTL
;--------------------------------------------------------------------------------
; #$0192 - no bow
@@ -283,64 +280,31 @@ RTL
; s = silver arrow bow
; p = 2nd progressive bow
DialogGanon2:
JSL.l CheckGanonVulnerability
JSL CheckGanonVulnerability
REP #$20
BCS +
LDA.w #$018D : JMP .done
+
LDA.l GanonVulnerabilityItem : AND #$00FF : BNE .special_item
LDA.l SpecialWeapons : AND.w #$007F
CMP.w #$0001 : BEQ .bombs ; bombs if special bomb mode
.silver_arrows
LDA.l BowTracking
REP #$20
BCS +
LDA.w #$018D : BRA ++
+
LDA.l BowTracking
BIT.w #$0080 : BNE + ; branch if bow
LDA.w #$0192 : JMP .done
+
BIT.w #$0040 : BEQ + ; branch if no silvers
LDA.w #$0195 : JMP .done
+
BIT.w #$0020 : BNE + ; branch if p bow
LDA.w #$0194 : JMP .done
+
BIT.w #$0080 : BEQ + ; branch if no bow
LDA.w #$0193 : JMP .done
+
LDA.w #$016E : JMP .done
.special_item
CMP.w #$0001 : BEQ .silver_arrows
CMP.w #$0004 : BEQ .bombs
CMP.w #$0005 : BEQ .powder
CMP.w #$0010 : BEQ .bee
PHX : TAX
LDA.l EquipmentWRAM-1, X : PLX : AND #$00FF : BNE +
LDA.w #$0192 : JMP .done
+
LDA.w #$0195 : BRA .done
.bombs
LDA.l BombsEquipment : AND #$00FF : BNE +
LDA.l InfiniteBombs : AND #$00FF : BNE + ; check for infinite bombs
LDA.w #$0192 : BRA .done
+
LDA.w #$0195 : BRA .done
.powder
LDA.l InventoryTracking : AND #$0010 : BNE + ; check for powder
LDA.w #$0192 : BRA .done
+
LDA.w #$0195 : BRA .done
.bee
LDA.l BottleContentsOne : AND #$00FF : CMP.w #$0007 : BEQ + : CMP.w #$0008 : BEQ +
LDA.l BottleContentsTwo : AND #$00FF : CMP.w #$0007 : BEQ + : CMP.w #$0008 : BEQ +
LDA.l BottleContentsThree : AND #$00FF : CMP.w #$0007 : BEQ + : CMP.w #$0008 : BEQ +
LDA.l BottleContentsFour : AND #$00FF : CMP.w #$0007 : BEQ + : CMP.w #$0008 : BEQ +
LDA.w #$0192 : BRA .done
+
LDA.w #$0195 : BRA .done
.done
STA.w TextID
SEP #$20
JSL.l Sprite_ShowMessageMinimal_Alt
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 ++
+
BIT.w #$0080 : BEQ + ; branch if no bow
LDA.w #$0193 : BRA ++
+
LDA.w #$016E
++
STA.w TextID
SEP #$20
JSL Sprite_ShowMessageMinimal_Alt
RTL
;--------------------------------------------------------------------------------
DialogEtherTablet:
@@ -350,8 +314,11 @@ DialogEtherTablet:
PLA : JML Sprite_ShowMessageUnconditional ; Wacky Hylian Text
+
BIT.b Joy1A_New : BVC - ; Show normal text if Y is not pressed
JSL CheckTabletSword : BMI .yesText
CMP.b #$02 : !BGE .noText
LDA.l AllowHammerTablets : BEQ ++
LDA.l HammerEquipment : BEQ .yesText : BRA .noText
++
LDA.l SwordEquipment : CMP.b #$FF : BEQ .yesText : CMP.b #$02 : BCS .noText
;++
.yesText
PLA
LDA.b #$0C
@@ -369,10 +336,13 @@ DialogBombosTablet:
PLA : JML Sprite_ShowMessageUnconditional ; Wacky Hylian Text
+
BIT.b Joy1A_New : BVC - ; Show normal text if Y is not pressed
JSL CheckTabletSword : BMI .yesText
CMP.b #$02 : !BGE .noText
LDA.l AllowHammerTablets : BEQ ++
LDA.l HammerEquipment : BEQ .yesText : BRA .noText
++
LDA.l SwordEquipment : CMP.b #$FF : BEQ .yesText : CMP.b #$02 : !BGE .noText
;++
.yesText
PLA
PLA
LDA.b #$0D
LDY.b #$01
JML Sprite_ShowMessageUnconditional ; Text From MSPedestalText (tables.asm)
@@ -384,7 +354,7 @@ RTL
DialogSahasrahla:
LDA.l PendantsField : AND.b #$04 : BEQ + ;Check if player has green pendant
LDA.b #$2F
LDY.b #$00
LDY.b #$00
JML Sprite_ShowMessageUnconditional
+
RTL
@@ -396,7 +366,7 @@ DialogBombShopGuy:
+
TYA
LDY.b #$01
JSL.l Sprite_ShowMessageUnconditional
JSL Sprite_ShowMessageUnconditional
RTL
;---------------------------------------------------------------------------------------------------
@@ -412,7 +382,7 @@ AgahnimAsksAboutPed:
STA.w TextID
.vanilla
JML $85FA8E ; Sprite_ShowMessageMinimal
JML Sprite_ShowMessageMinimal
;--------------------------------------------------------------------------------
Main_ShowTextMessage_Alt:
; Are we in text mode? If so then end the routine.
@@ -463,24 +433,24 @@ Main_ShowTextMessage_Alt_already_in_text_mode:
RTL
CalculateSignIndex:
; for the big 1024x1024 screens we are calculating link's effective
; screen area, as though the screen was 4 different 512x512 screens.
; And we do this in a way that will likely give the right value even
; with major glitches.
; for the big 1024x1024 screens we are calculating link's effective
; screen area, as though the screen was 4 different 512x512 screens.
; And we do this in a way that will likely give the right value even
; with major glitches.
LDA.b OverworldIndex : ASL A : TAY ;what we wrote over
LDA.b OverworldIndex : ASL A : TAY ;what we wrote over
LDA.w OWScreenSize : BEQ .done ; If a small map, we can skip these calculations.
LDA.w OWScreenSize : BEQ .done ; If a small map, we can skip these calculations.
LDA.b LinkPosY+1 : AND.w #$0002 : ASL #2 : EOR.b OverworldIndex : AND.w #$0008 : BEQ +
TYA : !ADD.w #$0010 : TAY ;add 16 if we are in lower half of big screen.
+
LDA.b LinkPosY+1 : AND.w #$0002 : ASL #2 : EOR.b OverworldIndex : AND.w #$0008 : BEQ +
TYA : !ADD.w #$0010 : TAY ;add 16 if we are in lower half of big screen.
+
LDA.b LinkPosX+1 : AND.w #$0002 : LSR : EOR.b OverworldIndex : AND.w #$0001 : BEQ +
TYA : INC #2 : TAY ;add 16 if we are in lower half of big screen.
+
; ensure even if things go horribly wrong, we don't read the sign out of bounds and crash:
TYA : AND.w #$00FF : TAY
LDA.b LinkPosX+1 : AND.w #$0002 : LSR : EOR.b OverworldIndex : AND.w #$0001 : BEQ +
TYA : INC #2 : TAY ;add 16 if we are in lower half of big screen.
+
; ensure even if things go horribly wrong, we don't read the sign out of bounds and crash:
TYA : AND.w #$00FF : TAY
.done
RTL
@@ -504,7 +474,7 @@ Sprite_ShowSolicitedMessageIfPlayerFacing_Alt:
; Make sure that the sprite is facing towards the player, otherwise
; talking can't happen. (What sprites actually use this???)
LDA.l $85E1A3, X : PLX : CMP.b LinkDirection : BNE .not_facing_each_other
LDA.l Sprite_ShowSolicitedMessage_Direction, X : PLX : CMP.b LinkDirection : BNE .not_facing_each_other
PHY
@@ -512,10 +482,10 @@ Sprite_ShowSolicitedMessageIfPlayerFacing_Alt:
LDY.w TextID+1
; Check what room we're in so we know which npc we're talking to
LDA.b RoomIndex
CMP.b #$05 : BEQ .SahasrahlaDialogs
CMP.b #$1C : BEQ .BombShopGuyDialog
BRA .SayNothing
LDA.b RoomIndex
CMP.b #$05 : BEQ .SahasrahlaDialogs
CMP.b #$1C : BEQ .BombShopGuyDialog
BRA .SayNothing
.SahasrahlaDialogs
REP #$20 : LDA.l MapReveal_Sahasrahla : ORA.l MapOverlay : STA.l MapOverlay : SEP #$20
@@ -561,7 +531,7 @@ Sprite_ShowSolicitedMessageIfPlayerFacing_PreserveMessage:
; Make sure that the sprite is facing towards the player, otherwise
; talking can't happen. (What sprites actually use this???)
LDA.l $85E1A3, X : PLX : CMP.b LinkDirection : BNE .not_facing_each_other
LDA.l Sprite_ShowSolicitedMessage_Direction, X : PLX : CMP.b LinkDirection : BNE .not_facing_each_other
PLA : XBA : PLA

View File

@@ -8,7 +8,7 @@
StoreLastOverworldDoorID:
TXA : INC
STA.l PreviousOverworldDoor
LDA.l $9BBB73, X : STA.w EntranceIndex
LDA.l Overworld_Entrance_ID, X : STA.w EntranceIndex
RTL
;--------------------------------------------------------------------------------
@@ -37,3 +37,54 @@ WalkDownIntoTavern:
CMP.b #$43
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; TurnAroundOnUnderworld
;--------------------------------------------------------------------------------
TurnAroundOnUnderworld:
LDA.b LinkPushDirection : BEQ .done
; turn around if ($010E == #$43) != ($7F5099 == #$43)
LDX.b #$00
LDA.b #$43 : CMP.w EntranceIndex : BEQ +
INX
+
CMP.l PreviousOverworldDoor : BEQ +
DEX
+
CPX.b #$00 : BEQ .done
LDA.b LinkPushDirection : EOR.b #$0C : STA.b LinkPushDirection
.done
JML Underworld_LoadCustomTileAttributes ; what we overwrote
;--------------------------------------------------------------------------------
; TurnUpOnOverworld
;--------------------------------------------------------------------------------
TurnUpOnOverworld:
LDA.l EntranceTavernBack : CMP.b #$43 : BEQ .done
LDA.b #$08 : STA.b LinkPushDirection ; only fix this glitch if exit not vanilla
.done
JML Link_HandleMovingAnimation_FullLongEntry ; what we overwrote
;--------------------------------------------------------------------------------
; WalkUpOnOverworld
;--------------------------------------------------------------------------------
WalkUpOnOverworld:
LDA.b LinkPosY : CMP.w #$091B : BNE .normal ; hardcoded Y coordinate
STZ.b LinkDirection
RTL
.normal
LDA.w #$0002 : STA.b LinkDirection ; what we overwrote
RTL
;--------------------------------------------------------------------------------
; CheckStairsAdjustment
;--------------------------------------------------------------------------------
CheckStairsAdjustment:
LDA.b RoomIndex
CMP.w #$0124 ; vanilla check, rooms $0124 to $0127 have a lower exit position (currently ER ignores the entrance location)
BCC .done
LDA.w #$FFFF-1
CMP.w TileMapEntranceDoors ; tavern back ($0696 == #$FFFF) should always have carry cleared
.done
RTL
; if carry cleared, shift position up

View File

@@ -0,0 +1,51 @@
pushpc
org $9E9463
JSL CheckKholdShellCoordinates
BCC Sprite_A3_KholdstareShell_link_not_close
BRA Sprite_A3_KholdstareShell_link_close
NOP #13
Sprite_A3_KholdstareShell_link_close = $9E9478
Sprite_A3_KholdstareShell_link_not_close = $9E9480
pullpc
CheckKholdShellCoordinates:
LDA.w SpritePosXHigh, X
XBA
LDA.w SpritePosXLow, X ; full 16 bit X coordinate of sprite
REP #$21 ; carry is guaranteed clear
SBC.w #$0020
CMP.b LinkPosX
BCS .not_colliding
ADC.w #$0040 ; carry is guaranteed clear
CMP.b LinkPosX
BCC .not_colliding
SEP #$20
LDA.w SpritePosYHigh, X
XBA
LDA.w SpritePosYLow, X ; full 16 bit Y coordinate of sprite
REP #$21 ; carry is guaranteed clear
SBC.w #$001F ; could go to 27 and still let link squeeze in
CMP.b LinkPosY
BCS .not_colliding
ADC.w #$0037 ; carry is guaranteed clear
CMP.b LinkPosY
BCC .not_colliding
SEP #$20 ; collision detected
SEC
RTL
.not_colliding
SEP #$30
CLC
RTL

59
doorrando/doorrando.asm Normal file
View File

@@ -0,0 +1,59 @@
; Free RAM notes
; Normal doors use $AB-AC for scrolling indicator
; Normal doors use $FE to store the trap door indicator
; Normal doors use $045e to store Y coordinate when transitioning to in-room stairs
; Normal doors use $045f to determine the order in which supertile quadrants are drawn
; Straight stairs use $046d to store X coordinate on animation start
; Spiral doors use $045e to store stair type
; Gfx uses $b1 to for sub-sub-sub-module thing
; Hooks into various routines
incsrc drhooks.asm
;Main Code
org $A78000 ;138000
db $44, $52 ;DR
DRMode:
dw 0
; xxpg rmse
; xxxx xBDM
; x - unused
; p - use the original palette for the dungeon rooms instead of the DR table
; g - fix the EG glitch in more places (should be off for no logic)
; r - The collection rate flag
; m - Whether to display keys Map Info
; s - Start with Mirror Scroll
; e - GT minibosses marked as defeated instead of spawning heart container in all dungeons
; B - Big Key doors can displayed and be opened on the "south" side in addition
; D - Enabled spawning as a bunny in the Dark World underworld
; M - hides the total number in the collection rate
DRFlags:
dw 0
DRScroll:
db 0
OffsetTable:
dw -8, 8
org $A78010
DRVersionInfo:
dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000
org $A78020
incsrc normal.asm
incsrc scroll.asm
incsrc spiral.asm
incsrc gfx.asm
incsrc keydoors.asm
incsrc overrides.asm
incsrc edges.asm
incsrc math.asm
incsrc hudadditions.asm
incsrc dr_lobby.asm
incsrc entrance_fixes.asm
incsrc bugfix/kholdstare_shell_collision.asm
warnpc $A79C00
incsrc doortables.asm
warnpc $A88000

697
doorrando/doortables.asm Normal file
View File

@@ -0,0 +1,697 @@
org $A79C00
KeyDoorOffset:
; 0 1 2 3 4 5 6 7 8 9 a b c d e f --Offset Ruler
dw $0000,$0001,$0003,$0000,$0006,$0000,$000b,$0000,$0000,$0000,$000c,$000d,$0010,$0011,$0012,$0000
dw $0000,$0015,$0018,$001c,$001e,$0025,$0027,$0000,$0000,$002b,$002d,$0033,$0035,$0038,$0039,$003d
dw $003f,$0040,$0043,$0045,$0047,$0000,$004f,$0000,$0053,$0000,$0055,$005b,$0000,$0000,$005f,$0000
dw $0060,$0062,$0064,$0065,$0066,$0068,$006e,$0074,$007a,$007c,$007e,$0081,$0000,$0082,$0086,$0088
dw $0089,$008a,$0000,$008b,$008e,$0092,$0096,$0000,$0000,$0099,$009d,$00a2,$00a5,$00a6,$00a8,$00aa
dw $00ab,$00ad,$00af,$00b2,$0000,$0000,$00b5,$00b9,$00bf,$00c5,$00c9,$00ca,$00cc,$00ce,$00d1,$00d5
dw $00d6,$00dc,$00e3,$00e9,$00ec,$00ed,$00ee,$00f2,$00f5,$0000,$00f7,$00f8,$00fc,$00ff,$0102,$0000
dw $0000,$0103,$0106,$0107,$010a,$010c,$010e,$0112,$0000,$0000,$0000,$0114,$0117,$011b,$011e,$0121
dw $0000,$0123,$0000,$0124,$0127,$0128,$0000,$012c,$0000,$0000,$0000,$012e,$0133,$0139,$013e,$0000
dw $013f,$0140,$0141,$0146,$0000,$0149,$014b,$014d,$014f,$0150,$0000,$0153,$0156,$015a,$015d,$0161
dw $0163,$0164,$0166,$016a,$016c,$016d,$0000,$0000,$0170,$0176,$017c,$0182,$0184,$0000,$0185,$0186
dw $0188,$018b,$018f,$0197,$019c,$019d,$019e,$01a3,$01a4,$01a6,$01aa,$01ad,$01b3,$0000,$01bb,$01be
dw $01bf,$01c2,$01ca,$01d2,$01d9,$01da,$01dd,$01e3,$01e6,$01e7,$0000,$01ec,$01ed,$0000,$01f0,$0000
dw $01f1,$01f3,$01f7,$0000,$0000,$01f8,$01fa,$0000,$01fd,$0200,$0203,$0204,$0206,$0000,$0000,$0000
dw $0207
org $A79E00
SpiralOffset:
; 0 1 2 3 4 5 6 7 8 9 a b c d e f --Offset Ruler
db $00,$01,$02,$00,$03,$00,$00,$04,$00,$05,$07,$00,$08,$00,$0b,$00
db $00,$0c,$00,$00,$00,$0d,$0e,$0f,$00,$00,$11,$00,$13,$14,$15,$00
db $00,$00,$00,$00,$00,$00,$16,$19,$1b,$00,$00,$00,$00,$00,$00,$00
db $00,$1c,$00,$00,$1f,$00,$00,$00,$20,$00,$21,$00,$00,$00,$00,$22
db $23,$24,$25,$00,$00,$26,$00,$00,$00,$00,$27,$00,$29,$2a,$2b,$00
db $00,$00,$00,$2c,$2d,$00,$00,$00,$00,$00,$00,$00,$2e,$2f,$00,$30
db $00,$00,$00,$35,$36,$00,$37,$00,$00,$00,$38,$3a,$3b,$00,$3c,$00
db $3d,$40,$41,$00,$00,$00,$42,$45,$00,$00,$00,$00,$00,$00,$00,$49
db $4a,$00,$00,$00,$00,$00,$00,$4b,$00,$00,$00,$00,$4f,$00,$53,$00
db $00,$54,$00,$55,$00,$00,$00,$56,$57,$58,$00,$00,$00,$00,$59,$00
db $5a,$00,$5b,$00,$00,$5c,$5d,$00,$00,$00,$00,$5e,$00,$00,$5f,$00
db $60,$00,$00,$00,$00,$63,$64,$00,$00,$00,$00,$00,$65,$00,$66,$00
db $67,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
db $6a,$6d,$6e,$00,$00,$00,$00,$00,$00,$00,$6f,$00,$00,$00,$00,$00
db $70
org $A79F00
DoorOffset:
db $00,$01,$02,$00,$03,$00,$04,$00,$00,$00,$00,$00,$9A,$05,$99,$00
db $00,$06,$07,$08,$09,$0A,$0B,$00,$00,$0C,$0D,$0E,$00,$0F,$10,$11
db $12,$13,$14,$15,$16,$00,$17,$00,$98,$00,$18,$19,$00,$00,$1A,$00
db $1B,$00,$1C,$1D,$1E,$1F,$20,$21,$22,$23,$24,$25,$00,$26,$27,$00
db $96,$28,$97,$29,$2A,$2B,$2C,$00,$00,$2D,$2E,$2F,$30,$31,$32,$00
db $33,$34,$35,$36,$00,$00,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F,$40
db $41,$42,$43,$A0,$00,$00,$44,$45,$46,$00,$47,$48,$49,$4A,$4B,$00
; 0 1 2 3 4 5 6 7 8 9 a b c d e f --Offset Ruler
db $00,$4C,$00,$00,$00,$4D,$4E,$9E,$00,$00,$00,$4F,$50,$51,$52,$53
db $00,$54,$00,$9C,$9D,$55,$00,$00,$00,$00,$00,$56,$57,$58,$59,$00
db $5A,$5B,$5C,$5D,$00,$5E,$5F,$00,$9B,$60,$00,$61,$62,$63,$64,$65
db $66,$67,$68,$69,$6A,$6B,$00,$00,$6C,$6D,$6E,$6F,$70,$00,$71,$72
db $00,$73,$74,$75,$76,$77,$78,$79,$7A,$7B,$7C,$7D,$7E,$00,$7F,$80
db $00,$81,$82,$83,$84,$85,$86,$87,$88,$89,$00,$8A,$8B,$00,$8C,$00
db $00,$8D,$8E,$00,$00,$8F,$90,$00,$91,$92,$93,$94,$95,$00,$00,$00
db $9f
org $A7A000
DoorTable:
;; NW 00 N 01 NE 02 WN 00 W 01 WS 02 SW 00 S 01 SE 02 EN 00 E 01 ES 02 - Door ruler
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Default/Garbage row
dw $0003, $0003, $0003, $0450, $0003, $0003, $0003, $0003, $0003, $0452, $0003, $0003 ; HC Back Hall (x01)
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sewer Switches (x02)
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Crystaroller
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Arghus
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Aga 2
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sewer Secret Room
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sanc
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Pokey
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Lava Pipe
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Pipes n Ledge
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swap Canal
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod dark Maze
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod Bridge
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod Eye Statue
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Pre Aga
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Cross
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice BK
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x20 Aga1
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sewer Key Rat
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sewer Waters
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Eye Entrance
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Chest Entrance
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp Statue
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; PoD Arena (x2a)
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; PoD Statue (x2b)
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Compass
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x30 Aga's Altar
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Dark Cross
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Lanmolas
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp West Wing
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Flooded Key
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp Main Hub (x36)
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp Hammer Time
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp First Basement
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Drop to the Moth
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod 3 Catwalks
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod Conveyor
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Minihelma
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Conveyor
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sewers
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert Torches
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT Big Chest
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT Cellblock
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp Compass Loop
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Skull3 Torches
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod Entrance
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod Mimics 1
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Conveyor Ice
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Moldorm
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; IPBJ
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0401, $0003, $0003 ; HC West Hall (x50)
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC Throne Room (x51)
dw $0003, $0003, $0003, $0401, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC East Hall (x52)
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert Tiles 1
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Skull 2 Left Entrance
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Skull 2 Right Entrance
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Skull 1 Entrance
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Skull 3 Entrance
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Helmasaur
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Spike Switch
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Cannonball
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Gauntlet 1
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Choice Cross
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Iced U
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC West Lobby (x60)
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC Main Lobby (x61)
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC East Lobby (x62)
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x66 Swamp Waterfall
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x67 Skull 1 Left Drop
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x68 Skull 1 Pinball
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x6a Pod Rupees
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x6b GT Mimics
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x6c GT Lanmolas
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x6d Gauntlet 2
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x6e Ice Gators
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC Armory
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert BK Chest
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp Flooded Chests
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT DM's Tile
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Randoroom
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Warp Maze
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Freezors
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Hookpit
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC Catawalk
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert Right Entrance
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Left
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Hopeful Torch
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Right
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Lonely Freezor
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Vitreous (x90)
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Rain
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Dark Crystals
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Blockswitch
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Fallbridge
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Torch Cross
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Darkness
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Warp Maze 2
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Invis Bridge
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Compass Room
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Big Chests
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Icy Pots
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Pre-Vitreous (xa0)
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Fishbone
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Bridges
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Corner
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Trinexx (xa4)
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Wizzrobes
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Compass (xa8)
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Courtyard (xa9)
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Map (xaa)
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT Switch
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Blind
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Iced T
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Slipway
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Warpzone
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire ????
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Spikes
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Refill
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Dark Maze
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Chainchomp
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Rollers
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Big Key
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Easter Cannonball
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Dark Circle
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT Hellway
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT Bossway
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Blockswitch
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Backtracker
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Tiles
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Main Hub
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Big Chest
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Switch Maze
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Narrow
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Early Hub
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Floating Torches
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Armos
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Entrance
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT NW Quad
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT NE Quad
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Boss Drop
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire BK
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire 2
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Laser Bridge
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Main Entrance
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Eyegores
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Attic Switches
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Attic Start
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT Entrance Quad
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT SE Quad
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Aga 6F
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sewers Rope
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp Lobby
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Lobby
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Lobby
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Lobby
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert West Lobby
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert Main Lobby
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Hera Lobby
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Tower Lobby
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert Back Lobby
; this should end at 27AF18 about (160 * 24 bytes = 3840 or F18)
; some values you can hardcode for spirals
;dw $0070, $36a0 ; ->HC Stairwell
;dw $0072, $4ff8 ; ->HC Map Room
;dw $0080, $1f50 ; ->zelda's cellblock
org $A7B000
SpiralTable: ;113 4 byte entries - should end at 27B1C4
dw $0203, $8080 ;null row
dw $0203, $8080 ;HC Backhallway
dw $0203, $8080 ;Sewer Pull
dw $0203, $8080 ;Crystaroller
dw $0203, $8080 ;Moldorm
dw $0203, $8080, $0203, $8080 ;Pod Basement
dw $0203, $8080 ;Pod Stalfos
dw $0203, $8080, $0203, $8080, $0203, $8080 ;GT Entrance
dw $0203, $8080 ;Ice Entrance
dw $0203, $8080 ;Escape
dw $0203, $8080 ;TR Pipe Ledge
dw $0203, $8080 ;Swamp Way
dw $0203, $8080, $0203, $8080 ;Hera Fallplace
dw $0203, $8080, $0203, $8080 ;PoD Bridge
dw $0203, $8080 ;GT Ice
dw $0203, $8080 ;GT F8
dw $0203, $8080 ;Ice Cross
dw $0203, $8080, $0203, $8080, $0203, $8080 ;Swamp Statue
dw $0203, $8080, $0203, $8080 ;Hera Big
dw $0203, $8080 ;Swamp Ent
dw $0203, $8080, $0203, $8080, $0203, $8080 ;Hera Startiles (middle value unused)
dw $0203, $8080 ;West Swamp
dw $0203, $8080 ;Swamp Basement
dw $0203, $8080 ;Pod Drops
dw $0203, $8080 ;Ice Hammer
dw $0203, $8080 ;Aga Guards
dw $0203, $8080 ;Sewer Begin
dw $0203, $8080 ;Sewer Rope
dw $0203, $8080 ;TT Cellblock
dw $0203, $8080, $0203, $8080 ;Pod Entrance
dw $0203, $8080 ;GT Icespike
dw $0203, $8080 ;GT Moldorm
dw $0203, $8080 ;IPBJ
dw $0203, $8080 ;Desert Prep
dw $0203, $8080 ;Swamp Attic
dw $0203, $8080 ;GT Cannonball
dw $0203, $8080 ;GT Gauntlet1
dw $0203, $8080, $0203, $8080, $0203, $8080, $0203, $8080, $0203, $8080 ;Ice U (1st three values unused)
dw $0203, $8080 ;Desert Back
dw $0203, $8080 ;TT Attic L
dw $0203, $8080 ;Swamp Waterf
dw $0203, $8080 ;Pod Rupees
dw $0203, $8080 ;Pod Rupees
dw $0203, $8080 ;GT Mimics
dw $0203, $8080 ;GT Lanmo
dw $0203, $8080 ;Ice Gators
dw $0203, $8080, $0203, $8080, $0203, $8080 ;HC Tiny (first value placeholder)
dw $0203, $8080 ;HC Boomer
dw $0203, $8080 ;HC Pits1
dw $0203, $8080, $0203, $8080, $0203, $8080 ;Swamp Sunken
dw $0203, $8080, $0203, $8080, $0203, $8080, $0203, $8080 ;Hera Entrance (first value unused)
dw $0203, $8080 ;Ice Hookshot
dw $0203, $8080 ;HC Cellblock
dw $0203, $8080, $0203, $8080, $0203, $8080, $0203, $8080 ;Hera Basement (first and third values unused)
dw $0203, $8080, $0203, $8080, $0203, $8080, $0203, $8080 ;GT Circle (third value unused)
dw $0203, $8080 ;Ice Last Freeze
dw $0203, $8080 ;Mire Drops
dw $0203, $8080 ;Mire Block
dw $0203, $8080 ;Mire Attic
dw $0203, $8080 ;Mire Entrance
dw $0203, $8080 ;East Dark
dw $0203, $8080 ;Ice Big
dw $0203, $8080 ;Mire Previtreous
dw $0203, $8080 ;Mire Bridges
dw $0203, $8080 ;GT Wizzrobes
dw $0203, $8080 ;GT Spikepit
dw $0203, $8080 ;TT Switch
dw $0203, $8080 ;Ice T
dw $0203, $8080, $0203, $8080, $0203, $8080 ;Tower Usains (2nd value unused)
dw $0203, $8080 ;TR PlatMaze
dw $0203, $8080 ;TR Chainchomp
dw $0203, $8080 ;TT Bossway
dw $0203, $8080 ;Ice FallZone
dw $0203, $8080, $0203, $8080, $0203, $8080 ;Tower Dark2 (2nd value unused)
dw $0203, $8080, $0203, $8080, $0203, $8080 ;Tower Dark1 (2nd value unused)
dw $0203, $8080 ;Mire BK Thang
dw $0203, $8080 ;Mire2
dw $0203, $8080 ;East Attic Start
dw $0203, $8080 ;Tower Entrance
org $A7C000 ;ends around 27C418
PairedDoorTable:
dw $0000 ; the bad template
dw $0000,$0000
dw $0000,$0000,$0000
dw $0000,$0000,$0000,$0000,$0000
dw $0000
dw $0000
dw $0000,$0000,$0000
dw $0000
dw $0000
dw $0000,$0000,$0000
dw $0000,$0000,$8021
dw $0000,$0000,$0000,$0000
dw $4014,$0000
dw $8024,$8013,$0000,$0000,$0000,$0000,$0000
dw $0000,$0000
dw $0000,$0000,$0000,$0000
dw $201a,$401a
dw $0000,$4019,$8019,$402a,$0000,$0000
dw $0000,$0000
dw $0000,$0000,$0000
dw $0000
dw $0000,$0000,$0000,$0000
dw $0000,$0000
dw $0000
dw $2011,$0000,$0000
dw $8032,$0000
dw $0000,$0000
dw $8014,$0000,$0000,$0000,$0000,$0000,$0000,$0000
dw $4036,$0000,$0000,$0000
dw $0000,$0000
dw $0000,$101a,$402b,$0000,$0000,$0000
dw $0000,$202a,$0000,$0000
dw $0000
dw $0000,$0000
dw $0000,$0000
dw $8022
dw $0000
dw $0000,$0000
dw $2036,$0000,$0000,$0000,$0000,$0000
dw $8037,$8026,$8035,$0000,$0000,$0000
dw $8036,$8038,$0000,$4038,$0000,$0000
dw $4037,$1037
dw $0000,$0000
dw $204a,$0000,$0000
dw $0000
dw $0000,$0000,$804d,$0000
dw $0000,$404e
dw $0000
dw $0000
dw $0000
dw $0000,$0000,$2053
dw $0000,$0000,$0000,$0000
dw $0000,$0000,$0000,$0000
dw $0000,$0000,$0000
dw $0000,$0000,$8059,$0000
dw $0000,$0000,$803a,$0000,$0000
dw $0000,$0000,$0000
dw $0000
dw $203d,$0000
dw $0000,$403e
dw $0000 ; this is the odd extra room - shouldn't be used
dw $0000,$0000
dw $0000,$0000
dw $0000,$0000,$0000
dw $0000,$0000,$2043
dw $0000,$0000,$0000,$0000
dw $0000,$0000,$4058,$0000,$0000,$0000
dw $0000,$2057,$4068,$0000,$0000,$0000
dw $2049,$0000,$0000,$0000
dw $0000
dw $806b,$0000
dw $0000,$0000
dw $0000,$0000,$0000
dw $805f,$0000,$0000,$0000
dw $805e
dw $0000,$0000,$0000,$0000,$0000,$0000
dw $0000,$0000,$0000,$0000,$0000,$0000,$0000
dw $0000,$0000,$0000,$0000,$0000,$0000
dw $0000,$0000,$0000
dw $0000
dw $0000
dw $0000,$0000,$0000,$0000
dw $0000,$0000,$0000
dw $0000,$2058
dw $0000
dw $805b,$0000,$0000,$0000
dw $0000,$0000,$0000
dw $0000,$0000,$0000
dw $0000
dw $0000,$0000,$0000
dw $0000
dw $0000,$0000,$0000
dw $0000,$0000
dw $0000,$0000
dw $0000,$0000,$0000,$0000
dw $0000,$0000
dw $0000,$207c,$0000
dw $0000,$407d,$407b,$0000
dw $0000,$407c,$0000
dw $808e,$0000,$0000
dw $0000,$0000
dw $0000
dw $0000,$0000,$0000
dw $0000
dw $0000,$0000,$0000,$0000
dw $0000,$0000
dw $0000,$0000,$0000,$0000,$0000
dw $0000,$0000,$0000,$0000,$0000,$0000
dw $0000,$0000,$0000,$0000,$0000
dw $807e
dw $0000
dw $0000
dw $0000,$0000,$0000,$0000,$0000
dw $0000,$0000,$0000
dw $0000,$0000
dw $0000,$0000
dw $0000,$0000
dw $0000
dw $0000,$20a9,$0000
dw $0000,$0000,$0000
dw $0000,$0000,$0000,$0000
dw $0000,$0000,$0000
dw $0000,$0000,$0000,$0000
dw $0000,$0000
dw $0000
dw $40b1,$0000
dw $80b2,$0000,$0000,$0000
dw $0000,$0000
dw $0000
dw $0000,$0000,$0000
dw $0000,$0000,$80b8,$0000,$0000,$0000
dw $0000,$0000,$4099,$0000,$0000,$0000
dw $0000,$0000,$0000,$0000,$0000,$0000
dw $0000,$0000
dw $0000
dw $0000
dw $0000,$0000
dw $0000,$0000,$0000
dw $0000,$80a1,$0000,$0000
dw $80a2,$0000,$0000,$0000,$0000,$0000,$0000,$0000
dw $0000,$0000,$0000,$0000,$0000
dw $0000
dw $0000
dw $0000,$0000,$80c6,$0000,$0000
dw $0000
dw $20a8,$0000
dw $80ba,$0000,$0000,$0000
dw $80b9,$0000,$0000
dw $0000,$0000,$0000,$0000,$0000,$0000
dw $0000,$80cc,$0000,$40cc,$0000,$0000,$0000,$0000
dw $0000,$80bf,$0000
dw $40be
dw $0000,$0000,$0000
dw $0000,$40c2,$0000,$0000,$0000,$0000,$0000,$0000
dw $80c3,$40c1,$0000,$0000,$0000,$0000,$0000,$0000
dw $80c2,$0000,$0000,$0000,$0000,$0000,$0000
dw $80c5
dw $80c4,$0000,$0000
dw $20b6,$0000,$0000,$0000,$0000,$0000
dw $0000,$0000,$0000
dw $0000
dw $0000,$0000,$0000,$0000,$0000
dw $20cc
dw $40bc,$10bc,$80cb
dw $0000
dw $0000,$0000
dw $0000,$0000,$0000,$0000
dw $0000
dw $0000,$0000
dw $0000,$0000,$0000
dw $0000,$0000,$0000
dw $0000,$0000,$0000
dw $0000
dw $0000,$0000
dw $0000
dw $0000,$0000,$0000,$0000
dw $ffff ; indicates the end - we can drop this
; Edge Transition Table (Target Room, Flags, MultiDiv ratio for edges)
org $A7C500 ;ends around 27C5F(9) 4 bytes would be 27C649
;I kind of want to split the 3rd byte into two
NorthOpenEdge:
db $00,$80,$11, $00,$80,$11, $00,$80,$11, $00,$80,$11
db $00,$80,$11, $00,$80,$11, $00,$80,$11, $00,$80,$11
db $00,$80,$11, $00,$80,$11, $00,$80,$11
SouthOpenEdge:
db $00,$80,$11, $00,$80,$11, $00,$80,$11, $00,$80,$11
db $00,$80,$11, $00,$80,$11, $00,$80,$11, $00,$80,$11
db $00,$80,$11, $00,$80,$11, $00,$80,$11
WestOpenEdge:
db $00,$80,$11, $00,$80,$11, $00,$80,$11
db $00,$80,$11, $00,$80,$11, $00,$80,$11
db $00,$80,$11, $00,$80,$11, $00,$80,$11
EastOpenEdge:
db $00,$80,$11, $00,$80,$11, $00,$80,$11
db $00,$80,$11, $00,$80,$11, $00,$80,$11
db $00,$80,$11, $00,$80,$11, $00,$80,$11
; Edge Info Table (Midpoint, Width, Min Coord)
; I kind of want to add a fourth byte to help indicate quadrant info on min coord
NorthEdgeInfo:
db $a8,$10,$a0, $2c,$08,$28 ;HC
db $b8,$20,$a8 ; DP West Wing
db $38,$20,$28, $f8,$a0,$a8, $b8,$20,$a8 ; DP Main
db $78,$20,$68 ; DP East Wing
db $f8,$10,$f0, $7c,$18,$70 ; TT Lobby
db $74,$18,$68, $f8,$10,$f0 ; TT Compass
SouthEdgeInfo:
db $a8,$10,$a0, $2c,$08,$28 ; HC
db $b8,$20,$a8 ; DP Sandworm
db $38,$20,$28, $f8,$a0,$a8, $b8,$20,$a8 ; DP North Hall & Dead End
db $78,$20,$68 ; DP Arrow Pot
db $f8,$10,$f0, $7c,$18,$70 ; TT Ambush
db $74,$18,$68, $f8,$10,$f0 ; TT BK Corner
WestEdgeInfo:
db $78,$30,$60 ; TT Attic
db $40,$20,$30 ; DP North Hall
db $40,$20,$30 ; DP Arrow Pot
db $84,$18,$78, $68,$10,$60 ; HC South
db $a0,$a0,$50 ; DP East Wing
db $58,$50,$30, $98,$50,$70 ; TT BK Corner
db $58,$50,$30 ; TT Compass
EastEdgeInfo:
db $78,$30,$60 ; TT Attic
db $40,$20,$30 ; DP Sandworm
db $40,$20,$30 ; DP North Hall
db $68,$10,$60, $84,$18,$78 ; HC Guards
db $a0,$a0,$50 ; DP Main Lobby
db $58,$50,$30, $98,$50,$70 ; TT Ambush
db $58,$50,$30 ; TT Nook
MultDivInfo: ; (1, 2, 3, 4, 5, 6, 10, 20)
db $01, $02, $03, $04, $05, $06, $0a, $14
; indices: 0-7
; In-room stairs in North/South pairs. From left to right:
; PoD, IP right side, IP Freezor chest and GT
org $A7C700
InroomStairsTable:
dw $0003,$0003, $0003,$0003, $0003,$0003, $0003,$0003
org $A7C720
InroomStairsRoom:
db $0B,$1B, $3F,$1F, $7E,$5E, $96,$3D
InroomStairsX:
dw $0190, $0160, $0040, $0178
InroomStairsY:
dw $0058, $0148, $0198, $0190
org $A7E000
CutoffRooms:
; TT Alcove, Mire Bridge Left & Right, Mire Bent Bridge, Mire Hub
; Pod Falling & Harmless, SW Star Pits, TR Lava Escape & TR Dual Pipes, Bob's Room & GT Big Chest
dw $00bc, $00a2, $00a3, $00c2, $001a, $0049, $0014, $008c
; Ice Many Pots, Swamp Waterfall, GT Gauntlet 3, Eastern Push Block, Eastern Courtyard, Eastern Map Valley
; Eastern Cannonball, HC East Hall
dw $009f, $0066, $005d, $00a8, $00a9, $00aa, $00b9, $0052
; HC West Hall, TR Dash Bridge, TR Hub, Pod Arena, GT Petting Zoo, Ice Spike Cross
dw $0050, $00c5, $00c6, $0009, $0003, $002a, $007d, $005e
; Sewer Drop, Mire Cross, GT Crystal Circles
dw $0011, $00b2, $003d
dw $ffff
; dungeon tables
; HC HC EP DP AT SP PD MM SW IP TH TT TR GT
org $A7f000
CompassBossIndicator:
dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000
TotalKeys: ;27f020
db $04, $04, $02, $04, $04, $06, $06, $06, $05, $06, $01, $03, $06, $08, $00, $00
skip $10
;ChestKeys: ;27f030 - moved to B0F010
;db $01, $01, $00, $01, $02, $01, $06, $03, $03, $02, $01, $01, $04, $04, $00, $00
BigKeyStatus: ;27f040 (status 2 indicate BnC guard)
dw $0002, $0002, $0001, $0001, $0000, $0001, $0001, $0001, $0001, $0001, $0001, $0001, $0001, $0001, $0000, $0000
DungeonReminderTable: ;27f060
dw $2D50, $2D50, $2D51, $2D52, $2D54, $2D56, $2D55, $2D5A, $2D57, $2D59, $2D53, $2D58, $2D5B, $2D5C, $0000, $0000
TotalLocationsLow: ;27f080
db $08, $08, $06, $06, $02, $00, $04, $08, $08, $08, $06, $08, $02, $07, $00, $00
TotalLocationsHigh: ;27f090
db $00, $00, $00, $00, $00, $01, $01, $00, $00, $00, $00, $00, $01, $02, $00, $00
org $A7f0a0
TotalLocations:
db $08, $08, $06, $06, $02, $0a, $0e, $08, $08, $08, $06, $08, $0c, $1b, $00, $00
; no more room here
; Vert 0,6,0 Horz 2,0,8
org $A7f0b0
CoordIndex: ; Horizontal 1st
db 2, 0 ; Coordinate Index $20-$23
OppCoordIndex:
db 0, 2 ; Swapped coordinate Index $20-$23 (minor optimization)
CameraIndex: ; Horizontal 1st
db 0, 6 ; Camera Index $e2-$ea
CamQuadIndex: ; Horizontal 1st
db 8, 0 ; Camera quadrants $600-$60f
ShiftQuadIndex:
db 2, 1 ; see ShiftQuad func (relates to $a9,$aa)
CamBoundIndex: ; Horizontal 1st
db 0, 4 ; Camera Bounds $0618-$61f
OppCamBoundIndex: ; Horizontal 1st
db 4, 0 ; Camera Bounds $0618-$61f
CamBoundBaseLine: ; X camera stuff is 1st column todo Y camera needs more testing
dw $007f, $0077 ; Left/Top camera bounds when at edge or layout frozen
dw $0007, $000b ; Left/Top camera bounds when not frozen + appropriate low byte $22/$20 (preadj. by #$78/#$6c)
dw $00ff, $010b ; Right/Bot camera bounds when not frozen + appropriate low byte $20/$22
dw $017f, $0187 ; Right/Bot camera bound when at edge or layout frozen
;27f0ce next free byte
org $A7f0f0
RemoveRainDoorsRoom:
dw $0060, $0062, $ffff ; ffff indicates end of list
RainDoorMatch: ; org $A7f0f6 and f8 for now
dw $0081, $0061 ; not xba'd
BlockSanctuaryDoorInRain: ;27f0fa
dw $0000
org $A7f100
TilesetTable:
; 0 1 2 3 4 5 6 7 8 9 a b c d e f --Offset Ruler
db $13,$04,$04,$06,$0d,$ff,$08,$05,$06,$07,$07,$07,$0e,$0e,$0b,$ff
db $13,$04,$04,$0d,$0d,$0d,$08,$05,$06,$07,$07,$07,$0e,$0e,$0b,$0b
db $04,$04,$04,$0d,$0d,$ff,$08,$05,$08,$09,$07,$07,$06,$ff,$0b,$06
db $04,$05,$04,$12,$08,$08,$08,$08,$08,$09,$07,$07,$06,$0e,$0b,$0b
db $04,$04,$04,$12,$0a,$0a,$08,$ff,$ff,$09,$07,$07,$0e,$0e,$0b,$0b
db $04,$04,$04,$12,$08,$01,$09,$09,$09,$09,$07,$0e,$0e,$0e,$0b,$0b
db $04,$04,$04,$12,$0a,$0a,$08,$09,$09,$ff,$07,$0e,$0e,$0e,$0b,$ff
db $04,$04,$04,$12,$12,$12,$08,$05,$ff,$ff,$ff,$0e,$0e,$0e,$0b,$0b
db $04,$04,$04,$12,$12,$12,$ff,$05,$ff,$05,$ff,$0e,$0e,$0e,$0b,$ff
db $0c,$0c,$0c,$0c,$ff,$0e,$0e,$0c,$0c,$05,$ff,$0e,$0e,$0e,$0b,$0b
db $0c,$0c,$0c,$0c,$0d,$0e,$0e,$05,$05,$05,$05,$0a,$0a,$ff,$0b,$0b
db $04,$0c,$0c,$0c,$0d,$0d,$0d,$0d,$05,$05,$05,$0a,$0a,$ff,$0b,$0b
db $04,$0c,$0c,$0c,$0d,$0d,$0d,$0d,$05,$05,$ff,$0a,$0a,$ff,$0b,$ff
db $04,$0c,$0c,$ff,$ff,$0d,$0d,$ff,$05,$05,$05,$0a,$0a,$ff,$0b,$06
db $04,$06,$06,$06,$06,$06,$06,$06,$06,$ff,$06,$06,$ff,$06,$06,$06
db $06,$06,$03,$03,$03,$03,$ff,$ff,$06,$06,$06,$06,$ff,$06,$06,$06
;27f200
PaletteTable:
db $21,$00,$00,$07,$00,$08,$00,$00,$07,$00,$00,$00,$00,$00,$00,$21
db $21,$00,$00,$00,$00,$00,$00,$00,$07,$00,$00,$00,$00,$00,$00,$00
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$0e,$00,$00,$07,$00,$00,$07
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$00,$00,$00
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$13
db $00,$00,$00,$00,$00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
; 0 1 2 3 4 5 6 7 8 9 a b c d e f --Offset Ruler
db $00,$00,$00,$00,$00,$00,$00,$06,$00,$00,$00,$00,$00,$00,$00,$00
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$14,$20
db $00,$07,$20,$20,$07,$07,$07,$07,$07,$20,$20,$07,$20,$20,$20,$20
db $07,$07,$02,$02,$02,$02,$07,$07,$07,$20,$20,$07,$20,$20,$20,$07
;A7f300
DungeonTilesets:
db $04,$04,$05,$12,$04,$08,$07,$0C,$09,$0B,$05,$0A,$0D,$0E,$06,$06
;
;org $A7ff00
org $A7fff0
LinksHouseDarkWorld:
dw $ffff
SanctuaryDarkWorld:
dw $ffff
OldManDarkWorld:
dw $ffff

10
doorrando/dr_lobby.asm Normal file
View File

@@ -0,0 +1,10 @@
CheckDarkWorldSpawn:
STA.b RoomIndex : STA.w RoomIndexMirror ; what we wrote over
LDA.l DRFlags : AND.w #$0200 : BEQ + ; skip if the flag isn't set
LDA.l MoonPearlEquipment : AND.w #$00FF : BNE + ; moon pearl?
LDA.l LinksHouseDarkWorld : CMP.b RoomIndex : BEQ ++
LDA.l SanctuaryDarkWorld : CMP.b RoomIndex : BEQ ++
LDA.l OldManDarkWorld : CMP.b RoomIndex : BNE +
++ SEP #$30 : LDA.b #$17 : STA.b LinkState
INC.w BunnyFlag : LDA.b #$40 : STA.l CurrentWorld : REP #$30
+ RTL

224
doorrando/drhooks.asm Normal file
View File

@@ -0,0 +1,224 @@
org $82b5c4 ; -- moving right routine 135c4
jsl WarpRight
org $82b665 ; -- moving left routine
jsl WarpLeft
org $82b713 ; -- moving down routine
jsl WarpDown
org $82b7b4 ; -- moving up routine
jsl WarpUp
org $82bd80
jsl AdjustTransition
nop
;turn off linking doors -- see .notRoomLinkDoor label in Bank02.asm
org $82b5a8 ; <- 135a8 - Bank02.asm : 8368 (LDA $7EC004 : STA $A0)
jsl CheckLinkDoorR
bcc NotLinkDoor1
org $82b5b6
NotLinkDoor1:
org $82b649 ; <- 135a8 - Bank02.asm : 8482 (LDA $7EC004 : STA $A0)
jsl CheckLinkDoorL
bcc NotLinkDoor2
org $82b657
NotLinkDoor2:
; Staircase routine
org $81c3d4 ; <- c3d4 - Bank01.asm : 9762-4 (Dungeon_DetectStaircase-> STA $A0 : LDA $063D, X)
jsl RecordStairType : nop
org $82a1e7 ;(PC: 121e7)
jsl SpiralWarp
org $8291b3 ; <- Bank02.asm : 3303 (LDA $0462 : AND.b #$04)
jsl SpiralPriorityHack : nop
org $8290f9 ; <- Bank02.asm : 3188 (LDA $0462 : AND.b #$04)
jsl SpiralPriorityHack : nop
org $829369 ; <- 11369 - Bank02.asm : 3610 (STX $0464 : STY $012E)
jsl StraightStairsAdj : nop #2
org $829383 ; <- 11384 - Bank02.asm : 3629 (.walkingDownStaircase-> ADD $20 : STA $20)
jsl StraightStairsFix : nop
org $8293aa ; <- 113aa - Bank02.asm : 3653 (ADD $20 : STA $20)
jsl StraightStairsFix : nop
org $8293d1 ; <- 113d1 - Bank02.asm : 3683 (ADD $20 : STA $20 BRANCH_IOTA)
jsl StraightStairsFix : nop
org $829396 ; <- 11396 - Bank02.asm : 3641 (LDA $01C322, X)
jsl StraightStairLayerFix
org $82c06d ; <- Bank02.asm : 9874 (LDX $0418, CMP.b #$02)
jsl DoorToStraight : nop
org $82c092 ; STA $0020, Y : LDX #$00
jsl DoorToInroom : nop
org $82c0f8 ; CMP $02C034, X
jsl DoorToInroomEnd
org $82941a ; <- Bank02.asm : 3748 module 7.12.11 (LDA $0464 : BNE BRANCH_$11513 : INC $B0 : RTS)
jsl StraightStairsTrapDoor : rts
org $828b54 ; <- Bank02.asm : 2200 (JSL UseImplicitRegIndexedLocalJumpTable)
jsl InroomStairsTrapDoor
org $82c146
jsl HandleSpecialDoorLanding
org $8289a0 ; JSL $0091C4
jsl QuadrantLoadOrderBeforeScroll
org $82bd9c ; JSL $0091C4
jsl QuadrantLoadOrderAfterScroll
; Graphics fix
org $82895d ; Bank 02 line 1812 (JSL Dungeon_LoadRoom : JSL Dungeon_InitStarTileChr : JSL $00D6F9 : INC $B0)
Splicer:
jsl GfxFixer
lda.b $b1 : beq .done
rts
nop #5
.done
org $81b618 ; Bank01.asm : 7963 Dungeon_LoadHeader (REP #$20 : INY : LDA [$0D], Y)
nop : jsl OverridePaletteHeader
org $82817e ; Bank02.asm : 414 (LDA $02811E, X)
jsl FixAnimatedTiles
org $8aef43 ; UnderworldMap_RecoverGFX
jsl FixCloseDungeonMap
org $828a06 ; Bank02.asm : 1941 Dungeon_ResetTorchBackgroundAndPlayer
JSL FixWallmasterLamp
org $80d377 ;Bank 00 line 3185
DecompDungAnimatedTiles:
org $80fda4 ;Bank 00 line 8882
Dungeon_InitStarTileCh:
org $80d6ae ;(PC: 56ae)
LoadTransAuxGfx:
org $80d739 ;
LoadTransAuxGfx_Alt:
org $80df5a ;(PC: 5f5a)
PrepTransAuxGfx:
org $8ffd65 ;(PC: 07fd65)
Dungeon_LoadCustomTileAttr:
org $81feb0
Dungeon_ApproachFixedColor:
;org $81fec1
;Dungeon_ApproachFixedColor_variable:
;org $a0f972 ; Rando version
;LoadRoomHook:
org $9bee74 ;(PC: 0dee74)
Palette_DungBgMain:
org $9bec77
Palette_SpriteAux3:
org $9becc5
Palette_SpriteAux2:
org $9bece4
Palette_SpriteAux1:
org $828046 ; <- 10046 - Bank02.asm : 217 (JSL EnableForceBlank) (Start of Module_LoadFile)
jsl OnFileLoadOverride
org $87A93F ; < 3A93F - Bank07.asm 6548 (LDA $8A : AND.b #$40 - Mirror checks)
jsl MirrorCheckOverride
org $85ef47
Sprite_HeartContainer_Override: ;sprite_heart_upgrades.asm : 96-100 (LDA $040C : CMP.b #$1A : BNE .not_in_ganons_tower)
jsl GtBossHeartCheckOverride : bcs .not_in_ganons_tower
nop : stz.w SpriteAITable, X : rts
.not_in_ganons_tower
org $87a955 ; <- Bank07.asm : around 6564 (JP is a bit different) (STZ $05FC : STZ $05FD)
jsl BlockEraseFix
nop #2
org $82A0A8
Mirror_SaveRoomData:
org $87A95B ; < bank_07.asm ; #_07A95B: JSL Mirror_SaveRoomData
jsl EGFixOnMirror
org $82b82a
jsl FixShopCode
org $9ddeea ; <- Bank1D.asm : 286 (JSL SpritePrep_LoadProperties)
jsl VitreousKeyReset
org $9ed024 ; f5024 sprite_guruguru_bar.asm : 27 (LDA $040C : CMP.b #$12 : INY #2
jsl GuruguruFix : bra .next
nop #3
.next
org $828fc9
nop #2 : jsl BlindAtticFix
org $828409
jsl SuctionOverworldFix
org $8ded04 ; <- rando's hooks.asm line 2192 - 6ED04 - equipment.asm : 1963 (REP #$30)
jsl DrHudDungeonItemsAdditions
;org $098638 ; rando's hooks.asm line 2192
;jsl CountChestKeys
org $86D192 ; rando's hooks.asm line 457
jsl CountAbsorbedKeys
; rando's hooks.asm line 1020
;org $05FC7E ; <- 2FC7E - sprite_dash_item.asm : 118 (LDA $7EF36F : INC A : STA $7EF36F)
;jsl CountBonkItem
org $819dbd ; <- Bank01.asm : 4465 of Object_Draw8xN (LDA $9B52, Y : STA $7E2000, X)
jsl CutoffEntranceRug : bra .nextTile : nop
.nextTile
;maybe set 02e2 to 0
org $8799de ; <- Bank07.asm : 4088 (LDA.b #$15 : STA $5D)
JSL StoreTempBunnyState
;
org $88C450 ; <- ancilla_receive_item.asm : 146-148 (STY $5D : STZ $02D8)
JSL RetrieveBunnyState : JMP.w + : NOP : +
org $82d9ce ; <- Bank02.asm : Dungeon_LoadEntrance 10829 (STA $A0 : STA $048E)
JSL CheckDarkWorldSpawn : NOP
org $9edabf ; <- sprite_energy_ball.asm : 86-7 Sprite_EnergyBall (LDA.b #$10 : LDX.b #$00)
JSL StandardAgaDmg
org $89F7B2 ; 09F7B2 Module17_01 S&Q
JSL StandardSaveAndQuit
org $89a681 ; < - similar to talalong.asm : 1157 (JSL Main_ShowTextMessage)
JSL BlindsAtticHint : NOP #2
org $9cfd69
Main_ShowTextMessage:
; Conditionally disable UW music changes in Door Rando
org $828ADB ; <- Bank02.asm:2088-2095 (LDX.b #$14 : LDA $A0 ...)
JSL Underworld_DoorDown_Entry : CPX.b #$FF
BEQ + : db $80, $1C ; BRA $028B04
NOP #6 : +
org $82FD00 ; unreachable code
Underworld_SetBossOrSancMusicUponEntry_long:
JSR Underworld_SetBossOrSancMusicUponEntry : RTL
org $81AA90
JSL BigKeyDoorCheck : NOP
org $81AAA2
RoomDraw_OneSidedShutters_South_onesided_shutter_or_big_key_door:
;Enable south facing bk graphic
org $80CE24
dw $2ac8
org $81b714 ; PC: b714
OpenableDoors:
jsl CheckIfDoorsOpen
bcs .normal
rts
.normal
org $82C157
JSL AlwaysPushThroughFDoors
; Modified from OWR - will need to remove once merged
org $85AF75
Sprite_6C_MirrorPortal:
JSL FixOvalFadeOutMirror : NOP #2 ; LDA $7EF3CA : BNE $05AFDF
org $85AFDF
Sprite_6C_MirrorPortal_missing_mirror:

305
doorrando/edges.asm Normal file
View File

@@ -0,0 +1,305 @@
; defines
; Ram usage
HorzEdge:
cpy.b #$ff : beq +
jsr DetectWestEdge : ldy.b #$02 : bra ++
+ jsr DetectEastEdge
++ cmp.b #$ff : beq +
sta.b Scrap00 : asl : !ADD.b Scrap00 : tax
cpy.b #$ff : beq ++
jsr LoadWestData : bra .main
++ jsr LoadEastData
.main
jsr LoadEdgeRoomHorz
sec : rts
+ clc : rts
VertEdge:
cpy.b #$ff : beq +
jsr DetectNorthEdge : bra ++
+ jsr DetectSouthEdge
++ cmp.b #$ff : beq +
sta.b Scrap00 : asl : !ADD.b Scrap00 : tax
cpy.b #$ff : beq ++
jsr LoadNorthData : bra .main
++ jsr LoadSouthData
.main
jsr LoadEdgeRoomVert
sec : rts
+ clc : rts
LoadEdgeRoomHorz:
lda.b Scrap03 : sta.b RoomIndex
sty.b Scrap06
and.b #$0f : asl a : !SUB.b LinkPosX+1 : !ADD.b Scrap06 : sta.b Scrap02
ldy.b #$00 : jsr ShiftVariablesMainDir
lda.b Scrap04 : and.b #$80 : bne .edge
lda.b Scrap04 : sta.b Scrap01 ; load up flags in $01
jsr PrepScrollToNormal
bra .scroll
.edge
lda.b Scrap04 : and.b #$10 : beq +
lda.b #$01
+ sta.b LinkLayer ; layer stuff
jsr MathHorz
.scroll
jsr ScrollY
rts
LoadEdgeRoomVert:
lda.b Scrap03 : sta.b RoomIndex
sty.b Scrap06
and.b #$f0 : lsr #3 : !SUB.b LinkPosY+1 : !ADD.b Scrap06 : sta.b Scrap02
lda.b Scrap04 : and.b #$80 : bne .edge
lda.b Scrap04 : sta.b Scrap01 ; load up flags in $01
and.b #$03 : cmp.b #$03 : beq .inroom
ldy.b #$01 : jsr ShiftVariablesMainDir
jsr PrepScrollToNormal
bra .scroll
.inroom
jsr ScrollToInroomStairs
rts
.edge
ldy.b #$01 : jsr ShiftVariablesMainDir
lda.b Scrap04 : and.b #$10 : beq +
lda.b #$01
+ sta.b LinkLayer ; layer stuff
jsr MathVert
lda.b Scrap03
.scroll
jsr ScrollX
rts
MathHorz:
jsr MathStart : lda.b LinkPosY
jsr MathMid : and.w #$0040
jsr MathEnd
rts
MathVert:
jsr MathStart : lda.b LinkPosX
jsr MathMid : and.w #$0020
jsr MathEnd
rts
MathStart:
rep #$30
lda.b Scrap08 : and.w #$00ff : sta.b Scrap00
rts
MathMid:
and.w #$01ff : !SUB.b Scrap00 : and.w #$00ff : sta.b Scrap00
; nothing should be bigger than $a0 at this point
lda.b Scrap05 : and.w #$00f0 : lsr #4 : tax
lda.w MultDivInfo, x : and.w #$00ff : tay
lda.b Scrap00 : jsr MultiplyByY : sta.b Scrap02
lda.b Scrap07 : and.w #$00ff : jsr MultiplyByY : tax
lda.b Scrap05 : and.w #$000f : tay
lda.w MultDivInfo, y : and.w #$00ff : tay
lda.b Scrap02 : jsr DivideByY : sta.b Scrap00
lda.b Scrap0C : and.w #$00ff : sta.b Scrap02
lda.b Scrap04
rts
MathEnd:
beq +
lda.w #$0100
+ !ADD.b Scrap02 : !ADD.b Scrap00
sta.b Scrap04
sep #$30
rts
; don't need midpoint of edge Link is leaving (formerly in $06 - used by dir indicator)
; don't need width of edge Link is going to (currently in $0b)
LoadNorthData:
lda.w NorthOpenEdge, x : sta.b Scrap03 : inx ; target room
lda.w NorthEdgeInfo, x : sta.b Scrap07 ; needed for maths - (divide by 2 anyway)
lda.w NorthOpenEdge, x : sta.b Scrap04 : inx ; bit field
lda.w NorthEdgeInfo, x : sta.b Scrap08 ; needed for maths
lda.w NorthOpenEdge, x : sta.b Scrap05 ; ratio
lda.b Scrap04 : jsr LoadSouthMidpoint : inx ; needed now, and for nrml transition
lda.w SouthEdgeInfo, x : sta.b Scrap0B : inx ; probably not needed todo: remove
lda.w SouthEdgeInfo, x : sta.b Scrap0C ; needed for maths
rts
LoadSouthMidpoint:
and.b #$0f : sta.b Scrap00 : asl : !ADD.b Scrap00 : tax
lda.w SouthEdgeInfo, x : sta.b Scrap0A ; needed now, and for nrml transition
rts
LoadSouthData:
lda.w SouthOpenEdge, x : sta.b Scrap03 : inx
lda.w SouthEdgeInfo, x : sta.b Scrap07
lda.w SouthOpenEdge, x : sta.b Scrap04 : inx
lda.w SouthEdgeInfo, x : sta.b Scrap08
lda.w SouthOpenEdge, x : sta.b Scrap05
lda.b Scrap04 : jsr LoadNorthMidpoint : inx
lda.w NorthEdgeInfo, x : sta.b Scrap0B : inx
lda.w NorthEdgeInfo, x : sta.b Scrap0C
rts
LoadNorthMidpoint:
and.b #$0f : sta.b Scrap00 : asl : !ADD.b Scrap00 : tax
lda.w NorthEdgeInfo, x : sta.b Scrap0A ; needed now, and for nrml transition
rts
LoadWestData:
lda.w WestOpenEdge, x : sta.b Scrap03 : inx
lda.w WestEdgeInfo, x : sta.b Scrap07
lda.w WestOpenEdge, x : sta.b Scrap04 : inx
lda.w WestEdgeInfo, x : sta.b Scrap08
lda.w WestOpenEdge, x : sta.b Scrap05
lda.b Scrap04 : jsr LoadEastMidpoint : inx
lda.w EastEdgeInfo, x : sta.b Scrap0B : inx
lda.w EastEdgeInfo, x : sta.b Scrap0C
rts
LoadEastMidpoint:
and.b #$0f : sta.b Scrap00 : asl : !ADD.b Scrap00 : tax
lda.w EastEdgeInfo, x : sta.b Scrap0A ; needed now, and for nrml transition
rts
LoadEastData:
lda.w EastOpenEdge, x : sta.b Scrap03 : inx
lda.w EastEdgeInfo, x : sta.b Scrap07
lda.w EastOpenEdge, x : sta.b Scrap04 : inx
lda.w EastEdgeInfo, x : sta.b Scrap08
lda.w EastOpenEdge, x : sta.b Scrap05
lda.b Scrap04 : jsr LoadWestMidpoint : inx
lda.w WestEdgeInfo, x : sta.b Scrap0B : inx
lda.w WestEdgeInfo, x : sta.b Scrap0C
LoadWestMidpoint:
and.b #$0f : sta.b Scrap00 : asl : !ADD.b Scrap00 : tax
lda.w WestEdgeInfo, x : sta.b Scrap0A ; needed now, and for nrml transition
rts
DetectNorthEdge:
ldx.b #$ff
lda.b PreviousRoom
cmp.b #$82 : bne +
lda.b LinkPosX : cmp.b #$50 : bcs ++
ldx.b #$01 : bra .end
++ ldx.b #$00 : bra .end
+ cmp.b #$83 : bne +
ldx.b #$02 : bra .end
+ cmp.b #$84 : bne +
lda.b $a9 : beq ++
lda.b LinkPosX : cmp.b #$78 : bcs +++
ldx.b #$04 : bra .end
+++ ldx.b #$05 : bra .end
++ lda.b LinkPosX : cmp.b #$78 : bcs ++
ldx.b #$03 : bra .end
++ ldx.b #$04 : bra .end
+ cmp.b #$85 : bne +
ldx.b #$06 : bra .end
+ cmp.b #$db : bne +
lda.b $a9 : beq ++
lda.b LinkPosX : beq ++
ldx.b #$08 : bra .end
++ ldx.b #$07 : bra .end
+ cmp.b #$dc : bne .end
lda.b $a9 : bne ++
lda.b LinkPosX : cmp.b #$b0 : bcs ++
ldx.b #$09 : bra .end
++ ldx.b #$0a
.end txa : rts
DetectSouthEdge:
ldx.b #$ff
lda.b PreviousRoom
cmp.b #$72 : bne +
lda.b LinkPosX : cmp.b #$50 : bcs ++
ldx.b #$01 : bra .end
++ ldx.b #$00 : bra .end
+ cmp.b #$73 : bne +
ldx.b #$02 : bra .end
+ cmp.b #$74 : bne +
lda.b $a9 : beq ++
lda.b LinkPosX : cmp.b #$78 : bcs +++
ldx.b #$04 : bra .end
+++ ldx.b #$05 : bra .end
++ lda.b LinkPosX : cmp.b #$78 : bcs ++
ldx.b #$03 : bra .end
++ ldx.b #$04 : bra .end
+ cmp.b #$75 : bne +
ldx.b #$06 : bra .end
+ cmp.b #$cb : bne +
lda.b $a9 : beq ++
lda.b LinkPosX : beq ++
ldx.b #$08 : bra .end
++ ldx.b #$07 : bra .end
+ cmp.b #$cc : bne .end
lda.b $a9 : bne ++
lda.b LinkPosX : cmp.b #$b0 : bcs ++
ldx.b #$09 : bra .end
++ ldx.b #$0a
.end txa : rts
DetectWestEdge:
ldx.b #$ff
lda.b PreviousRoom
cmp.b #$65 : bne +
ldx.b #$00 : bra .end
+ cmp.b #$74 : bne +
ldx.b #$01 : bra .end
+ cmp.b #$75 : bne +
ldx.b #$02 : bra .end
+ cmp.b #$82 : bne +
lda.b LinkQuadrantV : beq ++
ldx.b #$03 : bra .end
++ ldx.b #$04 : bra .end
+ cmp.b #$85 : bne +
ldx.b #$05 : bra .end
+ cmp.b #$cc : bne +
lda.b LinkQuadrantV : beq ++
ldx.b #$06 : bra .end
++ ldx.b #$07 : bra .end
+ cmp.b #$dc : bne .end
ldx.b #$08
.end txa : rts
DetectEastEdge:
ldx.b #$ff
lda.b PreviousRoom
cmp.b #$64 : bne +
ldx.b #$00 : bra .end
+ cmp.b #$73 : bne +
ldx.b #$01 : bra .end
+ cmp.b #$74 : bne +
ldx.b #$02 : bra .end
+ cmp.b #$81 : bne +
lda.b LinkQuadrantV : beq ++
ldx.b #$04 : bra .end
++ ldx.b #$03 : bra .end
+ cmp.b #$84 : bne +
ldx.b #$05 : bra .end
+ cmp.b #$cb : bne +
lda.b LinkQuadrantV : beq ++
ldx.b #$06 : bra .end
++ ldx.b #$07 : bra .end
+ cmp.b #$db : bne .end
ldx.b #$08
.end txa : rts
AlwaysPushThroughFDoors:
PHA : AND.b #$F0 : CMP.b #$F0 : BNE +
PLA : RTL
+ PLA : AND.b #$8E : CMP.b #$80
RTL

View File

@@ -0,0 +1,300 @@
;===================================================================================================
; The only specific concern to keep in mind with this code is that your databank will be $00
; Actually, it should be $80, if you're using my fastrom changes.
;
; Leave all your door data vanilla
; Do not try to adjust doors as I previously suggested (not worth the effort)
; We need a few hooks and some light hardcoding either way
; Might as well just do it in a brute, but reliable, way
;
; In brief, this is the hack we're making:
; 1) Let vanilla routines draw the door normally
; 2) Draw over what vanilla just drew
; 3) Hijack the door tile type routine
; and replace the vanilla value with that of solid collision
; For door dection free RAM at $19EE-$19FF has been co-opted to door each drawn doors position and type bytes
; 19EE is for the "current" door for the IdentifyBlockedEntrance routine
; The array at 19F0 is for the collision routine to retrieve that information as it is no longer
; available by that point
;===================================================================================================
pushpc
org $81B0E6
JSL StoreDoorInfo
org $81892F
DoorDrawJankMove:
JML PrepDoorDraw
.return
JSL AdjustEscapeDoorGraphics
RTS
; we don't want to overwrite the JMP ($000E) that's already there
; Well, we could, but we don't need to
warnpc $818939
org $81BF43
JSL AdjustEscapeDoorCollision
org $81C132 ; ADC.w #$0040 : TAX : LDA.b $00
JSL AdjustEscapeDoorCollision_LowEntrance : NOP #2
pullpc
;===================================================================================================
StoreDoorInfo:
STA.w $1980,X
LDA.b Scrap00 : STA.w $19F0,X
TXA
RTL
PrepDoorDraw:
; first off, we need this routine to return to our jank hook
; otherwise, finding a reliable place to put the graphics change check will be a pin
; so push the address to return to the routine
; It's a lot to explain why this is necessary
; Much easier to just tell you to look at $01890D in the disassembly
; and you should understand the vanilla program flow we need to reject
PEA.w DoorDrawJankMove_return-1
LDA.b Scrap00
STA.w $19EE ; for current routine
; copy vanilla code (but fast rom)
LDA.l $8186F0,X
STA.b Scrap0E
LDX.b Scrap02
LDA.b Scrap04
; and to execute the jump, we'll use the JMP ($000E) we carefully avoided overwriting
JML $818939
;===================================================================================================
; Adjustment stage 1: graphics
AdjustEscapeDoorGraphics:
JSR IdentifyBlockedEntrance
BCS .replace_graphics
JSR IdentifySancEntrance
BCS .fix_sanctuary_entrance
JSR IdentifySwampEntrance
BCS .fix_swamp_entrance
; Do nothing
RTL
;---------------------------------------------------------------------------------------------------
.replace_graphics ; for blocked doors
; using the value in $19A0 should be fine for finding the graphics
; the only caveat is that this appears to locate the tile just above the north-west corner
; so below, I've indicated that offset with a +$xxx after the base tilemap buffer
; The only odd thing I notice with this position is that some bad hardcoded adjust for
; exploding walls that shouldn't affect how we use this value at all!
LDY.w $0460 ; get door index
LDX.w $19A0-2,Y ; get tilemap index
; hardcoded shutter door graphics tile replacement
; the horizontal flips could easily be explicit LDAs
; but it's probably best the door is symmetrical
; using ORA makes your intent more clear
; and gives you fewer values to change if you experiment with other graphics
; row 1
LDA.w #$8838
STA.l TileMapA+$080,X
ORA.w #$4000 ; horizontally flip
STA.l TileMapA+$086,X
; row 2
LDA.w #$8828
STA.l TileMapA+$100,X
ORA.w #$4000 ; horizontally flip
STA.l TileMapA+$106,X
LDA.w #$8829
STA.l TileMapA+$102,X
ORA.w #$4000 ; horizontally flip
STA.l TileMapA+$104,X
JSR IdentifySwampEntrance
BCS .fix_swamp_entrance_alternate
; the state of the A, X, and Y registers is irrelevant when we exit
; they're all subsequently loaded with new values
RTL
.fix_sanctuary_entrance
LDY.w $0460 ; get door index
LDX.w $19A0-2,Y ; get tilemap index
; row 0
LDA.w #$14C4
STA.l TileMapA+$000,X ; sanity check = should calculate to 7e3bbc
ORA.w #$4000 ; horizontally flip
STA.l TileMapA+$006,X
LDA.w #$14C5
STA.l TileMapA+$002,X
ORA.w #$4000 ; horizontally flip
STA.l TileMapA+$004,X
; row 1
LDA.w #$14E8
STA.l TileMapA+$082,X
ORA.w #$4000 ; horizontally flip
STA.l TileMapA+$084,X
; row 2
LDA.w #$14F8
STA.l TileMapA+$102,X
ORA.w #$4000 ; horizontally flip
STA.l TileMapA+$104,X
RTL
.fix_swamp_entrance
LDY.w $0460 ; get door index
LDX.w $19A0-2,Y ; get tilemap index
; row 1 - outer section
LDA.w #$0908
STA.l TileMapA+$080,X
ORA.w #$4000 ; horizontally flip
STA.l TileMapA+$086,X
; row 2
LDA.w #$0918
STA.l TileMapA+$100,X
ORA.w #$4000 ; horizontally flip
STA.l TileMapA+$106,X
LDA.w #$14F8
STA.l TileMapA+$102,X
ORA.w #$4000 ; horizontally flip
STA.l TileMapA+$104,X
.fix_swamp_entrance_alternate
; row 0
LDA.w #$9DFC
STA.l TileMapA+$000,X
STA.l TileMapA+$002,X
STA.l TileMapA+$004,X
STA.l TileMapA+$006,X
; row 1 - mid section
LDA.w #$14E8
STA.l TileMapA+$082,X
ORA.w #$4000 ; horizontally flip
STA.l TileMapA+$084,X
; row 3
LDA.w #$A82C
STA.l TileMapA+$180,X
ORA.w #$4000 ; horizontally flip
STA.l TileMapA+$186,X
LDA.w #$A82D
STA.l TileMapA+$182,X
ORA.w #$4000 ; horizontally flip
STA.l TileMapA+$184,X
RTL
IdentifySancEntrance:
LDA.b RoomIndex : CMP.w #$0012 : BNE +
LDA.b Scrap0A : CMP.w #$0010 : BNE +
SEC : RTS
+ CLC : RTS
IdentifySwampEntrance:
LDA.b RoomIndex : CMP.w #$0036 : BNE +
LDA.b Scrap0A : CMP.w #$0010 : BNE +
SEC : RTS
+ CLC : RTS
;===================================================================================================
; Leaving this here in case you desire a fully custom door later
; For now, we'll just hardcode the tiles, as I did above
; I put these in column order because that's how they're expected for the vanilla draw routines
; but I changed my mind on redefining things
; and am too lazy to change it to a row-wise listing
BlockedEntrance:
dw $8838, $8828, $A888 ; column 0
dw $14E8, $8829, $C888 ; column 1
dw $14E8, $8829, $A888 ; column 2
dw $C838, $C828, $C888 ; column 3
;===================================================================================================
; Adjustment stage 2: collision
AdjustEscapeDoorCollision:
LSR ; vanilla shift
AdjustEscapeDoorCollisionShared:
; save our parameters
; but one or both of these may not be necessary depending on how you detect these doors
; all that matters is that after identifying blockage, we have:
; Y is the same as what we entered with
; X has A>>1, for whatever A entered with
PHA
LDA.w $19F0, Y ; grab door info (type, position)
STA.w $19EE ; store in temporary variable
JSR IdentifyBlockedEntrance
PLX ; this is a TAX in vanilla, just have X pull A instead
BCS .block_entrance
; vanilla value
LDA.b Scrap00
RTL
.block_entrance
LDA.w #$0101 ; load tile type for solid collision
RTL
AdjustEscapeDoorCollision_LowEntrance:
ADC.w #$0040 ; vanilla add
JMP AdjustEscapeDoorCollisionShared
;===================================================================================================
; Enter with:
; $19EE containing the door information: position and type bytes
; Exit with:
; carry clear - leave door alone
; carry set - block door
IdentifyBlockedEntrance:
LDA.l ProgressIndicator : AND.w #$00FF : CMP.w #$0002 : BCS .leave_alone ; only in rain states (0 or 1)
LDA.l ProgressFlags : AND.w #$0004 : BNE .leave_alone ; zelda's been rescued
LDA.l BlockSanctuaryDoorInRain : BEQ + ;flagged
LDA.b RoomIndex : CMP.w #$0012 : BNE +
; we're in the sanctuary
; this code could be removed because you can't reach sanc without zelda currently
; but that's enforced in the logic, so this is to catch that case in case some mode allows it
LDA.l FollowerIndicator : AND.w #$00FF : CMP.w #$0001 : BEQ .leave_alone ; zelda is following
LDA.b Scrap0A
CMP.w #$000A : BCC .leave_alone
CMP.w #$0014 : BCS .leave_alone
.block_door
SEC : RTS
+ LDA.l BlockCastleDoorsInRain : AND.w #$00FF : BEQ .leave_alone
LDX.w #$FFFE
- INX #2
LDA.l RemoveRainDoorsRoom, X : CMP.w #$FFFF : BEQ .leave_alone
CMP.b RoomIndex : BNE -
LDA.l RainDoorMatch, X
CMP.w $19EE : BNE .leave_alone
BRA .block_door
.continue
BRA -
.leave_alone
CLC : RTS
;===================================================================================================

95
doorrando/gfx.asm Normal file
View File

@@ -0,0 +1,95 @@
GfxFixer:
{
lda.l DRMode : bne +
jsl LoadRoomHook ;this is the code we overwrote
jsl Dungeon_InitStarTileCh
jsl LoadTransAuxGfx_Alt
inc.b SubSubModule
rtl
+ lda.b $b1 : bne .stage2
jsl LoadRoomHook ; this is the rando version - let's only call this guy once - may fix star tiles and slower loads
jsl Dungeon_InitStarTileCh
jsl LoadTransAuxGfx
jsl Dungeon_LoadCustomTileAttr
jsl PrepTransAuxGfx
lda.l DRMode : cmp.b #$02 : bne + ; only do this in crossed mode
ldx.b RoomIndex : lda.l TilesetTable, x
cmp.w $0aa1 : beq + ; already eq no need to decomp
sta.w $0aa1
tax : lda.l AnimatedTileSheets, x : tay
jsl DecompDungAnimatedTiles
+
lda.b #$09 : sta.b NMIINCR : sta.w SkipOAM
jsl Palette_SpriteAux3
jsl Palette_SpriteAux2
jsl Palette_SpriteAux1
jsl Palette_DungBgMain
jsr CgramAuxToMain
inc.b $b1
rtl
.stage2
lda.b #$0a : sta.b NMIINCR : sta.w SkipOAM
stz.b $b1 : inc.b SubSubModule
rtl
}
FixAnimatedTiles:
LDA.l DRMode : CMP.b #$02 : BNE +
LDA.w DungeonID : CMP.b #$FF : BEQ +
PHX
LDX.b RoomIndex : LDA.l TilesetTable, x
CMP.w $0AA1 : beq ++
TAX : PLA : BRA +
++
PLX
+ LDA.l AnimatedTileSheets, X ; what we wrote over
RTL
FixCloseDungeonMap:
LDA.l DRMode : CMP.b #$02 : BNE .vanilla
LDA.w DungeonID : BMI .vanilla
LSR : TAX
LDA.l DungeonTilesets,x
RTL
.vanilla
LDA.l $7EC20E
RTL
FixWallmasterLamp:
ORA.w $0458
STY.b MAINDESQ : STA.b SUBDESQ : RTL ; what we wrote over
CgramAuxToMain: ; ripped this from bank02 because it ended with rts
{
rep #$20
ldx.b #$00
.loop
lda.l $7EC300, X : sta.l $7EC500, x
lda.l $7EC340, x : sta.l $7EC540, x
lda.l $7EC380, x : sta.l $7EC580, x
lda.l $7EC3C0, x : sta.l $7EC5C0, x
lda.l $7EC400, x : sta.l $7EC600, x
lda.l $7EC440, x : sta.l $7EC640, x
lda.l $7EC480, x : sta.l $7EC680, x
lda.l $7EC4C0, x : sta.l $7EC6C0, x
inx #2 : cpx.b #$40 : bne .loop
sep #$20
; tell NMI to upload new CGRAM data
inc.b NMICGRAM
rts
}
OverridePaletteHeader:
lda.l DRMode : cmp.b #$02 : bne +
lda.l DRFlags : and.b #$20 : bne +
cpx.w #$01c2 : !BGE +
rep #$20
txa : lsr : tax
lda.l PaletteTable, x
iny : rtl
+ rep #$20 : iny : lda.b [Scrap0D], Y ; what we wrote over
rtl

268
doorrando/hudadditions.asm Normal file
View File

@@ -0,0 +1,268 @@
!BlankTile = $207F
!SlashTile = $2830
!HyphenTile = $2405
!PTile = $296C
!CTile = $295F
!RedSquare = $345E
!BlueSquare = $2C5E
DrHudOverride:
PHB
SEP #$30
LDA.b #$7E
PHA
PLB
DRHUD_DrawItemCounter:
; hides total for mystery seeds
LDA.l ItemCounterHUD : BEQ DRHUD_DrawIndicators
LDA.l DRFlags+1 : LSR : BCC DRHUD_DrawIndicators
REP #$30
LDY.w #!HyphenTile : STY.w HUDGoalIndicator+$0A : STY.w HUDGoalIndicator+$0C
STY.w HUDGoalIndicator+$0E : STY.w HUDGoalIndicator+$10
SEP #$30
DRHUD_DrawIndicators:
LDA.b IndoorsFlag : BNE .continue
JMP DRHUD_Finished
.continue
LDA.b FrameCounter : AND.b #$10 : BEQ DRHUD_EnemyDropIndicator
DRHUD_BossIndicator:
LDA.l DRMode : BNE .continue
.early_exit
REP #$10
LDY.w #!BlankTile : STY.w HUDMultiIndicator
JMP DRHUD_Finished
.continue
LDA.w DungeonID : CMP.b #$1B : BCS .early_exit
SEP #$10 ; clears the high byte of X and prevents it from getting B register
TAX
REP #$30
LDY.w #!BlankTile
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
.draw_indicator
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
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
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.w DungeonCollectedKeys, X : JSR ConvertToDisplay : STA.w HUDKeysObtained
LDA.w #!SlashTile : STA.w HUDKeysSlash
.total_only
LDA.l ChestKeys, x : JSR ConvertToDisplay : STA.w HUDKeysTotal
DRHUD_Finished:
PLB : RTL
;===================================================================================================
;column distance for BK/Smalls
HudOffsets:
; none hc east desert aga swamp pod mire skull ice hera tt tr gt
dw $fffe, $0000, $0006, $0008, $0002, $0010, $000e, $0018, $0012, $0016, $000a, $0014, $001a, $001e
; offset from 1644
RowOffsets:
dw $0000, $0000, $0040, $0080, $0000, $0080, $0040, $0080, $00c0, $0040, $00c0, $0000, $00c0, $0000
ColumnOffsets:
dw $0000, $0000, $0000, $0000, $000a, $000a, $000a, $0014, $000a, $0014, $0000, $0014, $0014, $001e
DrHudDungeonItemsAdditions:
{
jsl DrawHUDDungeonItems
lda.l HUDDungeonItems : and.b #$ff : bne + : rtl : +
lda.l DRMode : cmp.b #$02 : beq + : rtl : +
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.l HudFlag : and.w #$0020 : beq + : JMP ++ : +
lda.l HUDDungeonItems : and.w #$0007 : 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
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
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 ++ : +
lda.l HUDDungeonItems : and.w #$000c : 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
+ iny #2
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.w #$24f5 : sta.w $1644, y : iny #2 : sta.w $1644, y
.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
}
MapIndicatorLong:
PHX
LDA.l OldHudToNewHudTable, X : TAX
JSR MapIndicator
PLX
RTL
MapIndicatorShort:
PHX
TXA : LSR : TAX
JSR MapIndicator
PLX
RTS
OldHudToNewHudTable:
dw 1, 2, 3, 10, 4, 6, 5, 8, 11, 9, 7, 12, 13
IndicatorCharacters:
; check 1 2 3 4 5 6 7 G B R
dw $2426, $2817, $2818, $2819, $281A, $281B, $281C, $281D, $2590, $258B, $259B
MapIndicator:
LDA.l CrystalPendantFlags_3, X : AND.w #$00FF
PHX
ASL : TAX : LDA.l IndicatorCharacters, X
PLX
RTS
BkStatus:
lda.l BigKeyField : and.l DungeonMask, x : bne +++ ; has the bk already
lda.l BigKeyStatus, x : bne ++
lda.w #$2827 : rts ; 0/O for no BK
++ cmp.w #$0002 : bne +
lda.w #$2420 : rts ; symbol for BnC
+ lda.w #$24f5 : rts ; black otherwise
+++ lda.w #$2826 : rts ; check mark
ConvertToDisplay:
and.w #$00ff : cmp.w #$000a : !BLT +
!ADD.w #$2553 : 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 #$2816 : rts
++ lda.w #$2827 : rts ; 0/O for 0 or placeholder digit ;2483
CountAbsorbedKeys:
JML IncrementSmallKeysNoPrimary
;================================================================================
; 8-bit registers
; in: A(b) - Byte to Convert
; out: $06 - $07 (high - low)
;================================================================================
HudHexToDec2DigitCopy: ; modified
PHY
LDY.b #$00
-
CMP.b #10 : !BLT +
INY
SBC.b #10 : BRA -
+
STY.b Scrap06 : LDY.b #$00 ; Store 10s digit and reset Y
CMP.b #1 : !BLT +
-
INY
DEC : BNE -
+
STY.b Scrap07 ; Store 1s digit
PLY
RTS

42
doorrando/keydoors.asm Normal file
View File

@@ -0,0 +1,42 @@
; code to un-pair or re-pair doors
; doorlist is loaded into 19A0 but no terminator
; new room is in A0
; for "each" door do the following: (each could mean the first four doors?)
; in lookup table, grab room and corresponding position
; find the info at 7ef000, x where x is twice the paired room
; check the corresponding bit (there are only 4)
; set the bit in 068C
; Note the carry bit is used to indicate if we should aborted (set) or not
CheckIfDoorsOpen: {
jsr TrapDoorFixer ; see normal.asm
; note we are 16bit mode right now
lda.l DRMode : beq +
lda.w DungeonID : cmp.w #$00ff : bne .gtg
+ lda.b RoomIndex : dec : tax : and.w #$000f ; hijacked code
sec : rtl ; set carry to indicate normal behavior
.gtg
phb : phk : plb
stx.b Scrap00 : ldy.w #$0000
.nextDoor
lda.b RoomIndex : asl : tax
lda.w KeyDoorOffset, x : beq .skipDoor
asl : sty.b Scrap05 : !ADD.b Scrap05 : tax
lda.w PairedDoorTable, x : beq .skipDoor
sta.b Scrap02 : and.w #$00ff : asl a : tax
lda.b Scrap02 : and.w #$ff00 : sta.b Scrap03
lda.l RoomDataWRAM.l, X : and.w #$f000 : and.b Scrap03 : beq .skipDoor
tyx : lda.w $068c : ora.l DungeonMask,x : sta.w $068c
.skipDoor
iny #2 : cpy.b Scrap00 : bne .nextDoor
plb : clc : rtl
}
; outstanding issues
; how to indicate opening for other (non-first four doors?)
; Bank01 Door Register stores the 4 bits in 068c to 400 (depending on type)
; Key collision and others depend on F0-F3 attribute not sure if extendable to other numbers
; Dungeon_ProcessTorchAndDoorInteractives.isOpenableDoor is the likely culprit for collision problems
; Saving open status to other unused rooms is tricky -- Bank 2 13947 (line 8888)

66
doorrando/math.asm Normal file
View File

@@ -0,0 +1,66 @@
;divide by 2 example
; 0 1 2 3 4 5 6 7 8 9 a b c d e f 10--Offset Ruler
;v 00 01 01 02 02 03 03 04 04 04 05 05 06 06 07 07 08
;divide by 3 example
; 0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13 14 15 16 17 18
;00 00 01 01 01 02 02 02 03 03 03 04 04 04 05 05 05 06 06 06 07 07 07 08 08
MultiplyByY:
.loop cpy.w #$0001 : beq .done
cpy.w #$0003 : bne ++
jsr MultiBy3 : bra .done
++ cpy.w #$0005 : bne ++
jsr MultiBy5 : bra .done
++ asl : sta.b Scrap00 : tya : lsr : tay : lda.b Scrap00 : bra .loop
.done rts
;Divisor in Y. Width of division is in X for rounding toward middle
DivideByY:
.loop
cpy.w #$0000 : beq .done
cpy.w #$0001 : beq .done
cpy.w #$0003 : bne ++
jsr DivideBy3 : bra .done
++ cpy.w #$0005 : bne ++
jsr DivideBy5 : bra .done
++ jsr DivideBy2 : sta.b Scrap00
tya : lsr : tay
txa : lsr : tax
lda.b Scrap00 : bra .loop
.done rts
MultiBy3:
sta.b Scrap00 : asl : !ADD.b Scrap00
rts
MultiBy5:
sta.b Scrap00 : asl #2 : !ADD.b Scrap00
rts
;width of divison in x: rounds toward X/2
DivideBy2:
sta.b Scrap00
lsr : bcc .done
sta.b Scrap02 : txa : lsr : cmp.b Scrap00 : !BLT +
lda.b Scrap02 : inc : bra .done
+ lda.b Scrap02
.done rts
DivideBy3:
sta.b Scrap00
ldx.w #$0000
lda.w #$0002
.loop cmp.b Scrap00 : !BGE .store
inx : !ADD.w #$0003 : bra .loop
.store txa
rts
DivideBy5:
sta.b Scrap00
ldx.w #$0000
lda.w #$0003
.loop cmp.b Scrap00 : !BGE .store
inx : !ADD.w #$0005 : bra .loop
.store txa
rts

448
doorrando/normal.asm Normal file
View File

@@ -0,0 +1,448 @@
WarpLeft:
lda.l DRMode : beq .end
JSR CheckIfCave : BCS .end
lda.b LinkPosY : ldx.b LinkQuadrantV
jsr CalcIndex
!ADD.b #$06 : ldy.b #$01 ; offsets in A, Y
jsr LoadRoomHorz
.end
jsr Cleanup
rtl
WarpRight:
lda.l DRMode : beq .end
JSR CheckIfCave : BCS .end
lda.b LinkPosY : ldx.b LinkQuadrantV
jsr CalcIndex
!ADD.b #$12 : ldy.b #$ff ; offsets in A, Y
jsr LoadRoomHorz
.end
jsr Cleanup
rtl
WarpUp:
lda.l DRMode : beq .end
JSR CheckIfCave : BCS .end
lda.b LinkPosX : ldx.b LinkQuadrantH
jsr CalcIndex
ldy.b #$02 ; offsets in A, Y
jsr LoadRoomVert
.end
jsr Cleanup
rtl
; Checks if $a0 is equal to <Room>. If it is, opens its stonewall if it's there
macro StonewallCheck(Room)
lda.b RoomIndex : cmp.b #<Room> : bne ?end
lda.l <Room>*2+$7ef000 : ora.b #$80 : sta.l <Room>*2+$7ef000
?end
endmacro
WarpDown:
lda.l DRMode : beq .end
JSR CheckIfCave : BCS .end
lda.b LinkPosX : ldx.b LinkQuadrantH
jsr CalcIndex
!ADD.b #$0c : ldy.b #$ff ; offsets in A, Y
jsr LoadRoomVert
%StonewallCheck($43)
.end
jsr Cleanup
rtl
; carry set = use link door like normal
; carry clear = we are in dr mode, never use linking doors
CheckLinkDoorR:
lda.l DRMode : bne +
lda.l $7ec004 : sta.b RoomIndex ; what we wrote over
sec : rtl
+ clc : rtl
CheckLinkDoorL:
lda.l DRMode : bne +
lda.l $7ec003 : sta.b RoomIndex ; what we wrote over
sec : rtl
+ clc : rtl
TrapDoorFixer:
lda.b $fe : and.w #$0038 : beq .end
xba : asl #2 : sta.b Scrap00
stz.w TrapDoorFlag : lda.w $068c : ora.b Scrap00 : sta.w $068c
.end
stz.b $fe ; clear our fe here because we don't need it anymore
rts
Cleanup:
lda.l DRFlags : and.b #$10 : beq +
stz.w LayerAdjustment
+ inc.b GameSubMode
lda.b $ef
rts
; carry set if cave, clear otherwise
CheckIfCave:
REP #$30
LDA.b PreviousRoom : CMP.w #$00E1 : BCS .invalid
SEP #$30 : CLC : RTS
.invalid
SEP #$30 : SEC : RTS
;A needs be to the low coordinate, x needs to be either 0 for left,upper or non-zero for right,down
; This sets A (00,02,04) and stores half that at $04 for later use, (src door)
CalcIndex: ; A->low byte of Link's Coord, X-> Link's quadrant, DoorOffset x 2 -> A, DoorOffset -> $04 (vert/horz agnostic)
cpx.b #00 : bne .largeDoor
cmp.b #$d0 : bcc .smallDoor
lda.b #$01 : bra .done ; Middle Door
.smallDoor lda.b #$00 : bra .done
.largeDoor lda.b #$02
.done
sta.b Scrap04
asl
rts
; Y is an adjustment for main direction of travel
; A is a door table row offset
LoadRoomHorz:
{
phb : phk : plb
sty.b Scrap06 : sta.b Scrap07 : lda.b RoomIndex : pha ; Store normal room on stack
lda.b Scrap07 : jsr LookupNewRoom ; New room is in A, Room Data is in $00-$01
lda.b Scrap00 : cmp.b #$03 : bne .gtg
jsr HorzEdge : pla : bcs .end
sta.b RoomIndex : bra .end ; Restore normal room, abort (straight staircases and open edges can get in this routine)
.gtg ;Good to Go!
pla ; Throw away normal room (don't fill up the stack)
lda.b RoomIndex : and.b #$0F : asl a : !SUB.b LinkPosX+1 : !ADD.b Scrap06 : sta.b Scrap02
ldy.b #$00 : jsr ShiftVariablesMainDir
lda.b Scrap01 : and.b #$80 : beq .normal
ldy.b Scrap06 : cpy.b #$ff : beq +
lda.b Scrap01 : jsr LoadEastMidpoint : bra ++
+ lda.b Scrap01 : jsr LoadWestMidpoint
++ jsr PrepScrollToEdge : bra .scroll
.normal
jsr PrepScrollToNormal
.scroll
lda.b Scrap01 : and.b #$40 : pha
jsr ScrollY
pla : beq .end
ldy.b #$06 : jsr ApplyScroll
.end
plb ; restore db register
rts
}
; Y is an adjustment for main direction of travel (stored at $06)
; A is a door table row offset (stored a $07)
LoadRoomVert:
{
phb : phk : plb
sty.b Scrap06 : sta.b Scrap07 : lda.b RoomIndex : pha ; Store normal room on stack
lda.b Scrap07 : jsr LookupNewRoom ; New room is in A, Room Data is in $00-$01
lda.b Scrap00 : cmp.b #$03 : bne .gtg
jsr VertEdge : pla : bcs .end
sta.b RoomIndex : bra .end ; Restore normal room, abort (straight staircases and open edges can get in this routine)
.gtg ;Good to Go!
pla ; Throw away normal room (don't fill up the stack)
lda.b RoomIndex : and.b #$F0 : lsr #3 : !SUB.b LinkPosY+1 : !ADD.b Scrap06 : sta.b Scrap02
lda.b Scrap01 : and.b #$80 : beq .notEdge
ldy.b #$01 : jsr ShiftVariablesMainDir
ldy.b Scrap06 : cpy.b #$ff : beq +
lda.b Scrap01 : jsr LoadSouthMidpoint : bra ++
+ lda.b Scrap01 : jsr LoadNorthMidpoint
++ jsr PrepScrollToEdge : bra .scroll
.notEdge
lda.b Scrap01 : and.b #$03 : cmp.b #$03 : bne .normal
jsr ScrollToInroomStairs
stz.w $046d
bra .end
.normal
ldy.b #$01 : jsr ShiftVariablesMainDir
jsr PrepScrollToNormal
.scroll
lda.b Scrap01 : and.b #$40 : sta.w $046d
jsr ScrollX
.end
plb ; restore db register
rts
}
LookupNewRoom: ; expects data offset to be in A
{
rep #$30 : and.w #$00FF ;sanitize A reg (who knows what is in the high byte)
sta.b Scrap00 ; offset in 00
lda.b PreviousRoom : tax ; probably okay loading $a3 in the high byte
lda.w DoorOffset,x : and.w #$00FF ;we only want the low byte
asl #3 : sta.b Scrap02 : !ADD.b Scrap02 : !ADD.b Scrap02 ;multiply by 24 (data size)
!ADD.b Scrap00 ; should now have the offset of the address I want to load
tax : lda.w DoorTable,x : sta.b Scrap00
and.w #$00FF : sta.b RoomIndex ; assign new room
sep #$30
rts
}
; INPUTS-- Y: Direction Index , $02: Shift Value
; Sets high bytes of various registers
ShiftVariablesMainDir:
{
lda.w CoordIndex,y : tax
lda.b LinkPosY+1,x : !ADD.b Scrap02 : sta.b LinkPosY+1,x ; coordinate update
lda.w CameraIndex,y : tax
lda.b $e3,x : !ADD.b Scrap02 : sta.b $e3,x ; scroll register high byte
lda.w CamQuadIndex,y : tax
lda.w $0605,x : !ADD.b Scrap02 : sta.w $0605,x ; high bytes of these guys
lda.w $0607,x : !ADD.b Scrap02 : sta.w $0607,x
lda.w $0601,x : !ADD.b Scrap02 : sta.w $0601,x
lda.w $0603,x : !ADD.b Scrap02 : sta.w $0603,x
rts
}
; Normal Flags should be in $01
ScrollToInroomStairs:
{
jsr PrepScrollToInroomStairs
ldy.b #$01 : jsr ShiftVariablesMainDir
jsr ScrollX
ldy.b #$00 : jsr ApplyScroll
lda.b RoomIndex : and.b #$0f : cmp.b #$0f : bne +
stz.b BG1H : stz.b BG2H ; special case camera fix
lda.b #$1f : sta.b BG1H+1 : sta.b BG2H+1
+
rts
}
; Direction should be in $06, Shift Value (see above) in $02 and other info in $01
; Sets $02, $04, $05, $ee, $045e, $045f and things related to Y coordinate
PrepScrollToInroomStairs:
{
lda.b Scrap01 : and.b #$30 : lsr #3 : tay
lda.w InroomStairsX,y : sta.b Scrap04
lda.w InroomStairsX+1,y : sta.b Scrap05
lda.b Scrap06 : cmp.b #$ff : beq .south
lda.w InroomStairsY+1,y : bne +
inc.w $045f ; flag indicating special screen transition
dec.b Scrap02 ; shift variables further
stz.b LinkQuadrantV
lda.b $a8 : and.b #%11111101 : sta.b $a8
stz.w CameraTargetS+1 ; North scroll target
inc.w $0603 : inc.w $0607
dec.w CameraScrollN+1 : dec.w CameraScrollS+1
+
lda.w InroomStairsY,y : !ADD.b #$20 : sta.b LinkPosY
!SUB.b #$38 : sta.w $045e
lda.b Scrap01 : and.b #$40 : beq +
lda.b LinkPosY : !ADD.b #$20 : sta.b LinkPosY
stz.w $045f
+
dec.b LinkPosY+1
%StonewallCheck($1b)
bra ++
.south
lda.w InroomStairsY+1,y : beq +
inc.w $045f ; flag indicating special screen transition
inc.b Scrap02 ; shift variables further
lda.b #$02 : sta.b LinkQuadrantV
lda.b $a8 : ora.b #%00000010 : sta.b $a8
inc.w CameraTargetN+1 ; South scroll target
dec.w $0603 : dec.w $0607
inc.w CameraScrollN+1 : inc.w CameraScrollS+1
+
lda.w InroomStairsY,y : !SUB.b #$20 : sta.b LinkPosY
!ADD.b #$38 : sta.w $045e
lda.b Scrap01 : and.b #$40 : beq +
lda.b LinkPosY : !SUB.b #$20 : sta.b LinkPosY
stz.w $045f
+
inc.b LinkPosY+1
++
lda.b Scrap01 : and.b #$04 : lsr #2 : sta.b LinkLayer : bne +
stz.w $0476
+ rts
}
; Target pixel should be in A, other info in $01
; Sets $04 $05 and $ee
PrepScrollToEdge:
{
sta.b Scrap04 : lda.b Scrap01 : and.b #$20 : beq +
lda.b #01
+ sta.b Scrap05
lda.b Scrap01 : and.b #$10 : beq +
lda.b #01
+ sta.b LinkLayer : bne +
stz.w $0476
+ rts
}
; Normal Flags should be in $01
; Sets $04 $05 and $ee, and $fe
PrepScrollToNormal:
{
lda.b Scrap01 : sta.b $fe : and.b #$04 : lsr #2 : sta.b LinkLayer ; trap door and layer
bne +
stz.w $0476
+ stz.b Scrap05 : lda.b #$78 : sta.b Scrap04
lda.b Scrap01 : and.b #$03 : beq .end
cmp.b #$02 : !BGE +
lda.b #$f8 : sta.b Scrap04 : bra .end
+ inc.b Scrap05
.end rts
}
StraightStairsAdj:
{
stx.w $0464 : sty.w SFX2 ; what we wrote over
lda.l DRMode : beq +
lda.w $045e : bne .toInroom
lda.w $046d : beq .noScroll
sta.b LinkPosX
ldy.b #$00 : jsr ApplyScroll
stz.w $046d
.noScroll
jsr GetTileAttribute : tax
lda.b GameSubMode : cmp.b #$12 : beq .goingNorth
lda.b PreviousRoom : cmp.b #$51 : bne ++
rep #$20 : lda.w #$0018 : !ADD.b LinkPosY : sta.b LinkPosY : sep #$20 ; special fix for throne room
jsr GetTileAttribute : tax
++ lda.l StepAdjustmentDown, X : bra .end
; lda.b LinkLayer : beq .end
; rep #$20 : lda.w #$ffe0 : !ADD.b LinkPosY : sta.b LinkPosY : sep #$20
.goingNorth
cpx.b #$00 : bne ++
lda.b RoomIndex : cmp.b #$51 : bne ++
lda.b #$36 : bra .end ; special fix for throne room
++ ldy.b LinkLayer : cpy.b #$00 : beq ++
inx
++ lda.l StepAdjustmentUp, X
.end
pha : lda.w $0462 : and.b #$04 : bne ++
pla : !ADD.b #$f6 : pha
++ pla : !ADD.w $0464 : sta.w $0464
+ rtl
.toInroom
lda.b #$32 : sta.w $0464 : stz.w $045e
rtl
}
GetTileAttribute:
{
phk : pea.w .jslrtsreturn-1
pea.w $82802c
jml CalculateTransitionLanding ; mucks with x/y sets a to Tile Attribute, I think
.jslrtsreturn
rts
}
; 0 open edge
; 1 nrm door high
; 2 straight str
; 3 nrm door low
; 4 trap door high
; 5 trap door low (none of these exist on North direction)
StepAdjustmentUp: ; really North Stairs
db $00, $f6, $1a, $18, $16, $38
StepAdjustmentDown: ; really South Stairs
db $d0, $f6, $10, $1a, $f0, $00
StraightStairsFix:
{
pha
lda.l DRMode : bne +
pla : !ADD.b LinkPosY : sta.b LinkPosY : rtl ;what we wrote over
+ pla : rtl
}
StraightStairLayerFix:
{
lda.l DRMode : beq +
lda.b LinkLayer : rtl
+ lda.l LayerOfDestination+3, x : rtl ; what we wrote over
}
DoorToStraight:
{
pha
lda.l DRMode : beq .skip
pla : bne .end
pha
lda.b RoomIndex : cmp.b #$51 : bne .skip
lda.b #$04 : sta.b $4e
.skip pla
.end LDX.w TransitionDirection : CMP.b #$02 ; what we wrote over
rtl
}
DoorToInroom:
{
ldx.w $045e : bne .end
sta.w $0020, y ; what we wrote over
.end
ldx.b #$00 ; what we wrote over
rtl
}
DoorToInroomEnd:
{
ldy.w $045e : beq .vanilla
cmp.w $045e : bne .return
stz.w $045e ; clear
.return
rtl
.vanilla
cmp.l UnderworldTransitionLandingCoordinate, x ; what we wrote over
rtl
}
StraightStairsTrapDoor:
{
lda.w $0464 : bne +
; reset function
.reset phk : pea.w .jslrtsreturn-1
pea.w $82802c
jml ResetThenCacheRoomEntryProperties ; $10D71 .reset label of Bank02
.jslrtsreturn
lda.w TrapDoorFlag : bne ++
lda.b RoomIndex : cmp.b #$ac : bne .animateTraps
lda.w $0403 : and.b #$20 : bne .animateTraps
lda.w $0403 : and.b #$10 : beq ++
.animateTraps
lda.b #$05 : sta.b GameSubMode
inc.w TrapDoorFlag : stz.w TileMapDoorPos : stz.w DoorTimer
++ JML Underworld_SetBossOrSancMusicUponEntry_long
+ JML Dungeon_ApproachFixedColor ; what we wrote over
}
InroomStairsTrapDoor:
{
lda.w SubModuleInterface : cmp.b #$05 : beq .reset
lda.b SubSubModule : jml JumpTableLocal ; what we wrote over (essentially)
.reset
pla : pla : pla
jsl StraightStairsTrapDoor_reset
jml $828b15 ; just some RTS in bank 02
}
HandleSpecialDoorLanding: {
LDA.l $7F2000,X ; what we wrote over
SEP #$30
; A = tiletype
HandleIncomingDoorState:
PHA
LDA.l DRMode : BEQ .noDoor
LDA.b 1,S : AND.b #$FA : CMP.b #$80 : bne .noDoor
.setDoorState
LDA.w TransitionDirection : AND.b #$02 : BNE + : INC
+ STA.b $6C
.noDoor
PLA
CMP.b #$34 : BNE + ; inroom stairs
PHA : LDA.b #$26 : STA.w $045E : PLA
+
RTL
}

142
doorrando/overrides.asm Normal file
View File

@@ -0,0 +1,142 @@
GtBossHeartCheckOverride:
lda.b RoomIndex : cmp.b #$1c : beq ++
cmp.b #$6c : beq ++
cmp.b #$4d : bne +
++ lda.l DRFlags : and.b #$01 : bne ++ ;skip if flag on
lda.w RoomItemsTaken : ora.b #$80 : sta.w RoomItemsTaken
++ clc
rtl
+ sec
rtl
OnFileLoadOverride:
jsl OnFileLoad ; what I wrote over
+ lda.l DRFlags : and.b #$02 : beq + ; Mirror Scroll
lda.l MirrorEquipment : bne +
lda.b #$01 : sta.l MirrorEquipment
+ rtl
MirrorCheckOverride:
lda.l DRFlags : and.b #$02 : beq ++
lda.l MirrorEquipment : cmp.b #$01 : beq +
++ lda.b OverworldIndex : and.b #$40 ; what I wrote over
rtl
+ lda.l DRScroll : rtl
EGFixOnMirror:
lda.l DRFlags : and.b #$10 : beq +
stz.w LayerAdjustment
+ jsl Mirror_SaveRoomData
rtl
BlockEraseFix:
lda.l MirrorEquipment : and.b #$02 : beq +
stz.w $05fc : stz.w $05fd
+ rtl
FixShopCode:
cpx.w #$0300 : !BGE +
sta.l RoomDataWRAM[$00].l, x
+ rtl
VitreousKeyReset:
LDA.l FixPrizeOnTheEyes : BEQ +
STZ.w SpriteForceDrop, X
+ JML SpritePrep_LoadProperties ; what we wrote over
GuruguruFix:
lda.b RoomIndex : cmp.b #$df : !BGE +
and.b #$0f : cmp.b #$0e : !BLT +
iny #2
+ rtl
BlindAtticFix:
lda.l DRMode : beq +
lda.b #$01 : rtl
+ lda.l FollowerIndicator : cmp.b #$06
rtl
SuctionOverworldFix:
stz.b LinkStrafe : stz.b LinkSpeed
lda.l DRMode : beq +
stz.b ForceMove
+ rtl
CutoffEntranceRug:
PHA : PHX
LDA.l DRMode : BEQ .norm
LDA.b Scrap04 : CMP.w #$000A : BEQ + ; only affect A & C objects
CMP.w #$000C : BNE .norm
+ LDX.w #$0000 : LDA.l CutoffRooms, x
- CMP.b RoomIndex : BEQ .check
INX #2 : LDA.l CutoffRooms, x : CMP.w #$FFFF : BNE -
.norm
PLX : PLA : LDA.w $9B52, Y : STA.l TileMapA, X ; what we wrote over
RTL
.check
LDA.b Scrap0C : CMP.w #$0004 : !BGE .skip
LDA.b Scrap0E : CMP.w #$0008 : !BGE .skip
CMP.w #$0004 : !BLT .skip
BRA .norm
.skip
PLX : PLA : RTL
StoreTempBunnyState:
LDA.b LinkState : CMP.b #$1C : BNE +
STA.b ManipTileField
+ LDA.b #$15 : STA.b LinkState ; what we wrote over
RTL
RetrieveBunnyState:
STY.b LinkState : STZ.w ItemReceiptID ; what we wrote over
LDA.b ManipTileField : BEQ +
STA.b LinkState
+ JML MaybeKeepLootID
; A should be how much dmg to do to Aga when leaving this function, 0 if prevented
StandardAgaDmg:
LDX.b #$00 ; part of what we wrote over
LDA.l ProgressFlags : AND.b #$04 : BNE .enableDamage ; zelda's been rescued, no further checks needed
; zelda's not been rescued
LDA.l AllowAgaDamageBeforeZeldaRescued : BEQ + ; zelda needs to be rescued if not allowed
.enableDamage
LDA.b #$10 ; hurt him!
+ RTL
StandardSaveAndQuit:
LDA.b #$0F : STA.b MOSAICQ ; what we wrote over
LDA.l ProgressFlags : AND.b #$04 : BNE +
LDA.l DRMode : BEQ +
LDA.l StartingEntrance : CMP.b #$02 : BCC +
LDA.b #$03 : STA.l StartingEntrance ; set spawn to uncle if >=
+ RTL
; note: this skips both maiden dialog triggers if the hole is open
BlindsAtticHint:
REP #$20
CMP.w #$0122 : BNE +
LDA.l RoomDataWRAM[$65].low : AND.w #$0100 : BEQ +
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
PLA : PEA.w RoomDraw_OneSidedShutters_South_onesided_shutter_or_big_key_door-1
+ LDA.w #$0000 : RTL
FixOvalFadeOutMirror:
LDA.b $10 : CMP.b #$0F : BEQ .skip_activation
LDA.l InvertedMode : BNE +
LDA.l CurrentWorld : BNE .skip_activation
RTL
+ LDA.l CurrentWorld : BEQ .skip_activation
RTL
.skip_activation
PLA : PLA : PLA : JML Sprite_6C_MirrorPortal_missing_mirror

222
doorrando/scroll.asm Normal file
View File

@@ -0,0 +1,222 @@
AdjustTransition:
{
lda.b $ab : and.w #$01ff : beq .reset
phy : ldy.b #$06 ; operating on vertical registers during horizontal trans
cpx.b #$02 : bcs .horizontalScrolling
ldy.b #$00 ; operate on horizontal regs during vert trans
.horizontalScrolling
cmp.w #$0008 : bcs +
pha : lda.b $ab : and.w #$0200 : beq ++
pla : bra .add
++ pla : eor.w #$ffff : inc ; convert to negative
.add jsr AdjustCamAdd : ply : bra .reset
+ lda.b $ab : and.w #$0200 : xba : tax
lda.l OffsetTable,x : jsr AdjustCamAdd
lda.b $ab : !SUB.w #$0008 : sta.b $ab
ply : bra .done
.reset ; clear the $ab variable so to not disturb intra-tile doors
stz.b $ab
.done
lda.b Scrap00 : and.w #$01fc
rtl
}
AdjustCamAdd:
!ADD.w $00E2,y : pha
and.w #$01ff : cmp.w #$0111 : !BLT +
cmp.w #$01f8 : !BGE ++
pla : and.w #$ff10 : pha : bra +
++ pla : and.w #$ff00 : !ADD.w #$0100 : pha
+ pla : sta.w $00E2,y : sta.w $00E0,y : rts
; expects target quad in $05 (either 0 or 1) and target pixel in $04, target room should be in $a0
; $06 is either $ff or $01/02
; uses $00-$03 and $0e for calculation
; also set up $ac
ScrollY: ;change the Y offset variables
lda.b RoomIndex : and.b #$f0 : lsr #3 : sta.w $0603 : inc : sta.w $0607
lda.b Scrap05 : bne +
lda.w $0603 : sta.b Scrap00 : stz.b Scrap01 : bra ++
+ lda.w $0607 : sta.b Scrap00 : lda.b #$02 : sta.b Scrap01
++ ; $01 now contains 0 or 2 and $00 contains the correct lat
stz.b Scrap0E
rep #$30
lda.b Scrap00 : pha
lda.b BG2V : and.w #$01ff : sta.b Scrap02
lda.b Scrap04 : jsr LimitYCamera : sta.b Scrap00
jsr CheckRoomLayoutY : bcc +
lda.b Scrap00 : cmp.w #$0080 : !BGE ++
cmp.w #$0010 : !BLT .cmpSrll
lda.w #$0010 : bra .cmpSrll
++ cmp.w #$0100 : !BGE .cmpSrll
lda.w #$0100
.cmpSrll sta.b Scrap00
; figures out scroll amt
+ lda.b Scrap00 : cmp.b Scrap02 : bne +
lda.w #$0000 : bra .next
+ !BLT +
!SUB.b Scrap02 : inc.b Scrap0E : bra .next
+ lda.b Scrap02 : !SUB.b Scrap00
.next
sta.b $ab
jsr AdjustCameraBoundsY
pla : sta.b Scrap00
sep #$30
lda.b Scrap04 : sta.b $20
lda.b Scrap00 : sta.b $21 : sta.w $0601 : sta.w $0605
lda.b Scrap01 : sta.b $aa
lda.b Scrap0E : asl : ora.b $ac : sta.b $ac
lda.b BG2V+1 : and.b #$01 : asl #2 : tax : lda.w $0603, x : sta.b BG2V+1
rts
LimitYCamera:
cmp.w #$006c : !BGE +
lda.w #$0000 : bra .end
+ cmp.w #$017d : !BLT +
lda.w #$0110 : bra .end
+ !SUB.w #$006c
.end rts
CheckRoomLayoutY:
jsr LoadRoomLayout ;switches to 8-bit
cmp.b #$00 : beq .lock
cmp.b #$07 : beq .free
cmp.b #$01 : beq .free
cmp.b #$04 : !BGE .lock
cmp.b #$02 : bne +
lda.b Scrap06 : cmp.b #$ff : beq .lock
+ cmp.b #$03 : bne .free
lda.b Scrap06 : cmp.b #$ff : bne .lock
.free rep #$30 : clc : rts
.lock rep #$30 : sec : rts
AdjustCameraBoundsY:
jsr CheckRoomLayoutY : bcc .free
; layouts that are camera locked (quads only)
lda.b Scrap04 : and.w #$00ff : cmp.w #$007d : !BLT +
lda.w #$0088 : bra ++
+ cmp.w #$006d : !BGE +
lda.w #$0078 : bra ++
+ !ADD.w #$000b
; I think we no longer need the $02 variable
++ sta.b Scrap02 : lda.b Scrap04 : and.w #$0100 : !ADD.b Scrap02 : bra .setBounds
; layouts where the camera is free
.free lda.b Scrap04 : cmp.w #$006c : !BGE +
lda.w #$0077 : bra .setBounds
+ cmp.w #$017c : !BLT +
lda.w #$0187 : bra .setBounds
+ !ADD.w #$000b
.setBounds sta.w $0618 : inc #2 : sta.w $061a
rts
LoadRoomLayout:
lda.b RoomIndex : asl : !ADD.b RoomIndex : tax
lda.l RoomData_ObjectDataPointers+1, x : sta.b $b8
lda.l RoomData_ObjectDataPointers, x : sta.b $b7
sep #$30
ldy.b #$01 : lda.b [$b7], y : and.b #$1c : lsr #2
rts
; expects target quad in $05 (either 0 or 1) and target pixel in $04, target room should be in $a0
; uses $00-$03 and $0e for calculation
; also set up $ac
ScrollX: ;change the X offset variables
lda.b RoomIndex : and.b #$0f : asl : sta.w $060b : inc : sta.w $060f
lda.b Scrap05 : bne +
lda.w $060b : sta.b Scrap00 : stz.b Scrap01 : bra ++
+ lda.w $060f : sta.b Scrap00 : lda.b #$01 : sta.b Scrap01
++ ; $01 now contains 0 or 1 and $00 contains the correct long
stz.b Scrap0E ; pos/neg indicator
rep #$30
lda.b Scrap00 : pha
lda.b BG2H : and.w #$01ff : sta.b Scrap02
lda.b Scrap04 : jsr LimitXCamera : sta.b Scrap00
jsr CheckRoomLayoutX : bcc +
lda.b Scrap00 : cmp.w #$0080 : !BGE ++
lda.w #$0000 : bra .cmpSrll
++ lda.w #$0100
.cmpSrll sta.b Scrap00
;figures out scroll amt
+ lda.b Scrap00 : cmp.b Scrap02 : bne +
lda.w #$0000 : bra .next
+ !BLT +
!SUB.b Scrap02 : inc.b Scrap0E : bra .next
+ lda.b Scrap02 : !SUB.b Scrap00
.next
sta.b $ab : lda.b Scrap04
cmp.w #$0078 : !BGE +
lda.w #$007f : bra ++
+ cmp.w #$0178 : !BLT +
lda.w #$017f : bra ++
+ !ADD.w #$0007
++ sta.w $061c : inc #2 : sta.w $061e
pla : sta.b Scrap00
sep #$30
lda.b Scrap04 : ldx.w $046d : bne .straight
sta.b LinkPosX : bra +
.straight
sta.w $046d ; set X position later
+
lda.b Scrap00 : sta.b LinkPosX+1 : sta.w $0609 : sta.w $060d
lda.b Scrap01 : sta.b LinkQuadrantH
lda.b Scrap0E : asl : ora.b $ac : sta.b $ac
lda.b BG2H+1 : and.b #$01 : asl #2 : tax : lda.w $060b, x : sta.b BG2H+1
rts
LimitXCamera:
cmp.w #$0079 : !BGE +
lda.w #$0000 : bra .end
+ cmp.w #$0178 : !BLT +
lda.w #$0178
+ !SUB.w #$0078
.end rts
CheckRoomLayoutX:
jsr LoadRoomLayout ;switches to 8-bit
cmp.b #$04 : !BLT .lock
cmp.b #$05 : bne +
lda.b Scrap06 : cmp.b #$ff : beq .lock
+ cmp.b #$06 : bne .free
lda.b Scrap06 : cmp.b #$ff : bne .lock
.free rep #$30 : clc : rts
.lock rep #$30 : sec : rts
ApplyScroll:
rep #$30
lda.b $ab : and.w #$01ff : sta.b Scrap00
lda.b $ab : and.w #$0200 : beq +
lda.w $00e2, y : !ADD.b Scrap00 : bra .end
+ lda.w $00e2, y : !SUB.b Scrap00
.end
sta.w $00e2, y
sta.w $00e0, y
stz.b $ab : sep #$30 : rts
QuadrantLoadOrderBeforeScroll:
lda.w $045f : beq .end
lda.b #$08 : sta.w $045c ; start with opposite quadrant row
.end
JML WaterFlood_BuildOneQuadrantForVRAM ; what we overwrote
QuadrantLoadOrderAfterScroll:
lda.w $045f : beq .end
stz.w $045c : stz.w $045f ; draw other row and clear flag
.end
JML WaterFlood_BuildOneQuadrantForVRAM ; what we overwrote

338
doorrando/spiral.asm Normal file
View File

@@ -0,0 +1,338 @@
RecordStairType: {
pha
lda.l DRMode : beq .norm
REP #$30 : LDA.b PreviousRoom : CMP.w #$00E1 : BCS .norm
CMP.w #$00DF : BEQ .norm
SEP #$30
lda.b Scrap0E
cmp.b #$25 : bcc ++ ; don't record straight staircases
sta.w $045e
++ pla : bra +
.norm SEP #$30 : pla : sta.b RoomIndex
+ lda.w $063d, x
rtl
}
SpiralWarp: {
lda.l DRMode : beq .abort ; abort if not DR
REP #$30 : LDA.b PreviousRoom : CMP.w #$00E1 : BCS .abort
CMP.w #$00DF : BEQ .abort
SEP #$30
lda.w $045e : cmp.b #$5e : beq .gtg ; abort if not spiral - intended room is in A!
cmp.b #$5f : beq .gtg
cmp.b #$26 : beq .inroom
.abort
SEP #$30 : stz.w $045e : lda.b PreviousRoom : and.b #$0f : rtl ; clear,run hijacked code and get out
.inroom
jsr InroomStairsWarp
lda.b PreviousRoom : and.b #$0f ; this is the code we are hijacking
rtl
.gtg
phb : phk : plb : phx : phy ; push stuff
jsr LookupSpiralOffset
rep #$30 : and.w #$00FF : asl #2 : tax
lda.w SpiralTable, x : sta.b Scrap00
lda.w SpiralTable+2, x : sta.b Scrap02
sep #$30
lda.b Scrap00 : sta.b RoomIndex
; shift quadrant if necessary
stz.b Scrap07 ; this is a x quad adjuster for those blasted staircase on the edges
lda.b Scrap01 : and.b #$01 : !SUB.b LinkQuadrantH
bne .xQuad
lda.w $0462 : and.b #$04 : bne .xqCont
inc.b Scrap07
.xqCont lda.b LinkPosX : bne .skipXQuad ; this is an edge case
dec.b LinkPosX+1 : bra .skipXQuad ; need to -1 if $22 is 0
.xQuad sta.b Scrap06 : !ADD.b LinkQuadrantH : sta.b LinkQuadrantH
lda.w $0462 : and.b #$04 : bne .xCont
inc.b Scrap07 ; up stairs are going to -1 the quad anyway during transition, need to add this back
.xCont ldy.b #$00 : jsr ShiftQuadSimple
.skipXQuad
lda.b LinkQuadrantV : lsr : sta.b Scrap06 : lda.b Scrap01 : and.b #$02 : lsr : !SUB.b Scrap06
beq .skipYQuad
sta.b Scrap06 : asl : !ADD.b LinkQuadrantV : sta.b LinkQuadrantV
ldy.b #$01 : jsr ShiftQuadSimple
.skipYQuad
lda.b Scrap01 : and.b #$04 : lsr : sta.w $048a ;fix layer calc 0->0 2->1
lda.b Scrap01 : and.b #$08 : lsr #2 : sta.w $0492 ;fix from layer calc 0->0 2->1
; shift lower coordinates
lda.b Scrap02 : sta.b LinkPosX : bne .adjY : lda.b LinkPosX+1 : !ADD.b Scrap07 : sta.b LinkPosX+1
.adjY lda.b Scrap03 : sta.b LinkPosY : bne .upDownAdj : inc.b LinkPosY+1
.upDownAdj ldx.b #$08
lda.w $0462 : and.b #$04 : beq .upStairs
ldx.b #$fd
lda.b Scrap01 : and.b #$80 : bne .set53
; if target is also down adjust by (6,-15)
lda.b #$06 : !ADD.b LinkPosY : sta.b LinkPosY : lda.b #$eb : !ADD.b LinkPosX : sta.b LinkPosX : bra .set53
.upStairs
lda.b Scrap01 : and.b #$80 : beq .set53
; if target is also up adjust by (-6, 14)
lda.b #$fa : !ADD.b LinkPosY : sta.b LinkPosY : lda.b #$14 : !ADD.b LinkPosX : sta.b LinkPosX
bne .set53 : inc.b LinkPosX+1
.set53
txa : !ADD.b LinkPosX : sta.b $53
lda.b Scrap01 : and.b #$10 : sta.b Scrap07 ; zeroHzCam check
ldy.b #$00 : jsr SetCamera
lda.b Scrap01 : and.b #$20 : sta.b Scrap07 ; zeroVtCam check
ldy.b #$01 : jsr SetCamera
jsr StairCleanup
ply : plx : plb ; pull the stuff we pushed
lda.b PreviousRoom : and.b #$0f ; this is the code we are hijacking
rtl
}
StairCleanup: {
stz.w $045e ; clear the staircase flag
; animated tiles fix
lda.l DRMode : cmp.b #$02 : bne + ; only do this in crossed mode
ldx.b RoomIndex : lda.l TilesetTable, x
cmp.w $0aa1 : beq + ; already eq no need to decomp
sta.w $0aa1
tax : lda.l AnimatedTileSheets, x : tay
jsl DecompDungAnimatedTiles
+
stz.w LayerAdjustment
rts
}
LookupSpiralOffset_long:
PHB : PHK : PLB
JSR LookupSpiralOffset
PLB : RTL
;Sets the offset in A
LookupSpiralOffset: {
;where link currently is in $a2: quad in a8 & #$03
;count doors
stz.b Scrap00 : ldx.b #$00 : stz.b Scrap01
.loop
lda.w $047e, x : cmp.b Scrap00 : bcc .continue
sta.b Scrap00
.continue inx #2
cpx.b #$08 : bcc .loop
lda.b Scrap00 : lsr
cmp.b #$01 : beq .done
; look up the quad
lda.b LinkQuadrantH : ora.b LinkQuadrantV : and.b #$03 : beq .quad0
cmp.b #$01 : beq .quad1
cmp.b #$02 : beq .quad2
bra .quad3
.quad0
inc.b Scrap01 : lda.b PreviousRoom
cmp.b #$0c : beq .q0diff ;gt ent
cmp.b #$70 : bne .done ;hc stairwell
.q0diff lda.b LinkPosX : cmp.b #$00 : beq .secondDoor
cmp.b #$98 : bcc .done ;gt ent and hc stairwell
.secondDoor inc.b Scrap01 : bra .done
.quad1
lda.b PreviousRoom
cmp.b #$1a : beq .q1diff ;pod compass
cmp.b #$26 : beq .q1diff ;swamp elbows
cmp.b #$6a : beq .q1diff ;pod dark basement
cmp.b #$76 : bne .done ;swamp drain
.q1diff lda.b LinkPosX : cmp.b #$98 : bcc .done
inc.b Scrap01 : bra .done
.quad2
lda.b #$03 : sta.b Scrap01 : lda.b PreviousRoom
cmp.b #$5f : beq .iceu ;ice u room
cmp.b #$3f : bne .done ;hammer ice exception
stz.b Scrap01 : bra .done
.iceu lda.b LinkPosX : cmp.b #$78 : bcc .done
inc.b Scrap01 : bra .done
.quad3
lda.b PreviousRoom : cmp.b #$40 : beq .done ; top of aga exception
lda.b #$02 : sta.b Scrap01 ; always 2
.done
lda.b PreviousRoom : tax : lda.w SpiralOffset,x
!ADD.b Scrap01 ;add a thing (0 in easy case)
rts
}
InroomStairsWarp: {
phb : phk : plb : phx : phy ; push stuff
; find stairs by room and store index in X
lda.b RoomIndex : ldx.b #$07
.loop
cmp.w InroomStairsRoom,x
beq .found
dex
bne .loop
.found
rep #$30
txa : and.w #$00ff : asl : tay
lda.w InroomStairsTable,y : sta.b Scrap00
sep #$30
sta.b RoomIndex
; set position and everything else based on target door type
txa : and.b #$01 : eor.b #$01 : sta.b Scrap07
; should be the same as lda $0462 : and #$04 : lsr #2 : eor #$01 : sta $07
lda.b Scrap01 : and.b #$80 : beq .notEdge
lda.b Scrap07 : sta.b Scrap03 : beq +
lda.b Scrap01 : jsr LoadSouthMidpoint : sta.b LinkPosX : lda.b #$f4
bra ++
+
lda.b Scrap01 : jsr LoadNorthMidpoint : sta.b LinkPosX : dec.b LinkPosY+1 : lda.b #$f7
++
sta.b LinkPosY
lda.b Scrap01 : and.b #$20 : beq +
lda.b #$01
+
sta.b Scrap02
stz.b Scrap07
lda.b Scrap01 : and.b #$10 : lsr #4
JMP .layer
.notEdge
lda.b Scrap01 : and.b #$03 : cmp.b #$03 : bne .normal
txa : and.b #$06 : sta.b Scrap07
lda.b Scrap01 : and.b #$30 : lsr #3 : tay
lda.w InroomStairsX+1,y : sta.b Scrap02
lda.w InroomStairsY+1,y : sta.b Scrap03
cpy.b Scrap07 : beq .vanillaTransition
lda.w InroomStairsX,y : sta.b LinkPosX
lda.w InroomStairsY,y
ldy.b Scrap07 : beq +
!ADD.b #$07
+
sta.b LinkPosY
inc.b Scrap07
bra ++
.vanillaTransition
lda.b #$c0 : sta.b Scrap07 ; leave camera
++
%StonewallCheck($1b)
lda.b Scrap01 : and.b #$04 : lsr #2
bra .layer
.normal
lda.b Scrap01 : sta.b $fe ; trap door
lda.b Scrap07 : sta.b Scrap03 : beq +
lda.b Scrap01 : and.b #$04 : bne .specialFix
lda.b #$e0 : bra ++
.specialFix
lda.b #$c8 : bra ++
+
%StonewallCheck($43)
lda.b Scrap01 : and.b #$04 : bne +
lda.b #$1b : bra ++
+ lda.b #$33
++ sta.b LinkPosY
inc.b Scrap07 : stz.b Scrap02 : lda.b #$78 : sta.b LinkPosX
lda.b Scrap01 : and.b #$03 : beq ++
cmp.b #$02 : !BGE +
lda.b #$f8 : sta.b LinkPosX : stz.b Scrap07 : bra ++
+ inc.b Scrap02
++
lda.b Scrap01 : and.b #$04 : lsr #2
.layer
sta.b LinkLayer
bne +
stz.w $0476
+
lda.b Scrap02 : !SUB.b LinkQuadrantH
beq .skipXQuad
sta.b Scrap06 : !ADD.b LinkQuadrantH : sta.b LinkQuadrantH
ldy.b #$00 : jsr ShiftQuadSimple
.skipXQuad
lda.b LinkQuadrantV : lsr : sta.b Scrap06 : lda.b Scrap03 : !SUB.b Scrap06
beq .skipYQuad
sta.b Scrap06 : asl : !ADD.b LinkQuadrantV : sta.b LinkQuadrantV
ldy.b #$01 : jsr ShiftQuadSimple
.skipYQuad
lda.b Scrap07 : bmi .skipCamera
ldy.b #$00 : jsr SetCamera ; horizontal camera
ldy.b #$01 : sty.b Scrap07 : jsr SetCamera ; vertical camera
lda.b LinkPosY : cmp.b #$e0 : bcc +
lda.b BG2V : bne +
lda.b #$10 : sta.b BG2V ; adjust vertical camera at bottom
+
.skipCamera
jsr StairCleanup
ply : plx : plb ; pull the stuff we pushed
rts
}
ShiftQuadSimple: {
lda.w CoordIndex,y : tax
lda.b LinkPosY,x : beq .skip
lda.b LinkPosY+1,x : !ADD.b Scrap06 : sta.b LinkPosY+1,x ; coordinate update
.skip
lda.w CamQuadIndex,y : tax
lda.w $0601,x : !ADD.b Scrap06 : sta.w $0601,x
lda.w $0605,x : !ADD.b Scrap06 : sta.w $0605,x ; high bytes of these guys
rts
}
SetCamera: {
stz.b Scrap04
tyx : lda.b LinkQuadrantH,x : bne .nonZeroHalf
lda.w CamQuadIndex,y : tax : lda.w $0607,x : pha
lda.w CameraIndex,y : tax : pla : cmp.b BG2H+1, x : bne .noQuadAdj
dec.b BG2H+1,x
.noQuadAdj
lda.b Scrap07 : bne .adj0
lda.w CoordIndex,y : tax
lda.b LinkPosY,x : beq .oddQuad
cmp.b #$79 : bcc .adj0
!SUB.b #$78 : sta.b Scrap04
tya : asl : !ADD.b #$04 : tax : jsr AdjCamBounds : bra .done
.oddQuad
lda.b #$80 : sta.b Scrap04 : bra .adj1 ; this is such a weird case - quad cross boundary
.adj0
tya : asl : tax : jsr AdjCamBounds : bra .done
.nonZeroHalf ;meaning either right half or bottom half
lda.b Scrap07 : bne .setQuad
lda.w CoordIndex,y : tax
lda.b LinkPosY,x : cmp.b #$78 : bcs .setQuad
!ADD.b #$78 : sta.b Scrap04
lda.w CamQuadIndex,y : tax : lda.w $0603, x : pha
lda.w CameraIndex,y : tax : pla : sta.b BG2H+1, x
.adj1
tya : asl : !ADD.b #$08 : tax : jsr AdjCamBounds : bra .done
.setQuad
lda.w CamQuadIndex,y : tax : lda.w $0607, x : pha
lda.w CameraIndex,y : tax : pla : sta.b BG2H+1, x
tya : asl : !ADD.b #$0c : tax : jsr AdjCamBounds : bra .done
.done
lda.w CameraIndex,y : tax
lda.b Scrap04 : sta.b BG2H, x
rts
}
; input, expects X to be an appropriate offset into the CamBoundBaseLine table
; when $04 is 0 no coordinate are added
AdjCamBounds: {
rep #$20 : lda.w CamBoundBaseLine, x : sta.b Scrap05
lda.b Scrap04 : and.w #$00ff : beq .common
lda.w CoordIndex,y : tax
lda.b LinkPosY, x : and.w #$00ff : !ADD.b Scrap05 : sta.b Scrap05
.common
lda.w OppCamBoundIndex,y : tax
lda.b Scrap05 : sta.w CameraScrollN, x
inc #2 : sta.w CameraScrollS, x : sep #$20
rts
}
SpiralPriorityHack: {
lda.l DRMode : beq +
lda.b #$01 : rtl ; always skip the priority code - until I figure out how to fix it
+ lda.w $0462 : and.b #$04 ; what we wrote over
rtl
}

View File

@@ -3,17 +3,23 @@
;--------------------------------------------------------------------------------
SpawnDungeonPrize:
PHX : PHB
TAX
LDA.b $06,S : STA.b ScrapBuffer72 ; Store current RoomTag index
TXA
JSL.l AttemptItemSubstitution
JSL.l ResolveLootIDLong
JSL AttemptItemSubstitution
JSL ResolveLootIDLong
STA.w ItemReceiptID
TAX
LDA.b #$29 : LDY.b #$06
JSL.l AddAncillaLong
JSL AddAncillaLong
BCS .failed_spawn
LDA.w ItemReceiptID
STA.w AncillaGet,X : STA.w SpriteID,X
JSR.w AddDungeonPrizeAncilla
JSR AddDungeonPrizeAncilla
LDX.b ScrapBuffer72 : STZ.b RoomTag,X
.failed_spawn
PLB : PLX
RTL
@@ -22,21 +28,21 @@ AddDungeonPrizeAncilla:
LDY.w ItemReceiptID
STZ.w AncillaVelocityY,X
STZ.w AncillaVelocityX,X
STZ.w AncillaGeneral,X
STZ.w $0385,X
STZ.w $0C54,X
STZ.w AncillaGeneralF,X
STZ.w AncillaGeneralA,X
STZ.w AncillaGeneralN,X
LDA.b #$D0 : STA.w AncillaVelocityZ,X
LDA.b #$80 : STA.w AncillaZCoord,X
LDA.b #$09 : STA.w AncillaTimer,X
LDA.b #$00 : STA.w $0394,X
LDA.b #$00 : STA.w AncillaGeneralD,X
LDA.w AncillaGet,X : STA.w ItemReceiptID
LDA.w DungeonID : CMP.b #$14 : BNE .not_hera
LDA.b LinkAbsoluteY+1 : AND.b #$FE
LDA.b LinkPosY+1 : AND.b #$FE
INC A
STA.b Scrap01
STZ.b Scrap00
LDA.b LinkAbsoluteX+1 : AND.b #$FE
LDA.b LinkPosX+1 : AND.b #$FE
INC A
STA.b Scrap03
STZ.b Scrap02
@@ -62,10 +68,10 @@ RTS
PrepPrizeTile:
PHA : PHX : PHY
LDA.w AncillaGet, X
JSL.l AttemptItemSubstitution
JSL.l ResolveLootIDLong
JSL AttemptItemSubstitution
JSL ResolveLootIDLong
STA.w SpriteID,X
JSL.l TransferItemReceiptToBuffer_using_ReceiptID
JSL TransferItemReceiptToBuffer_using_ReceiptID
PLY : PLX : PLA
RTL
@@ -75,12 +81,12 @@ SetItemPose:
LDA.w RoomItemsTaken : BIT.b #$80 : BNE +
.one_handed
PLA
JML $8799F2
JML Link_ReceiveItem_not_cool_pose
+
JSR.w CrystalOrPendantBehavior : BCC .one_handed
JSR CrystalOrPendantBehavior : BCC .one_handed
.two_handed
PLA
JML $8799EE ; cool pose
JML Link_ReceiveItem_cool_pose
SetPrizeCoords:
PHX : PHY
@@ -91,7 +97,7 @@ SetPrizeCoords:
LDY.w AncillaGet,X
RTL
+
JSR.w CrystalOrPendantBehavior : BCC .regular_coords
JSR CrystalOrPendantBehavior : BCC .regular_coords
PLY : PLX
LDY.b #$20 ; Treat as crystal
RTL
@@ -101,7 +107,7 @@ SetCutsceneFlag:
PHX
LDY.b #$01 ; wrote over
LDA.w DungeonID : BMI .no_cutscene
LDA.w RoomItemsTaken : BIT #$80 : BNE .dungeon_prize
LDA.w RoomItemsTaken : BIT.b #$80 : BNE .dungeon_prize
.no_cutscene
SEP #$30
PLX
@@ -109,7 +115,7 @@ SetCutsceneFlag:
RTL
.dungeon_prize
LDA.w ItemReceiptMethod : CMP.b #$03 : BCC .no_cutscene
JSR.w SetDungeonCompleted
JSR SetDungeonCompleted
LDA.w ItemReceiptID
REP #$30
AND.w #$00FF : ASL : TAX
@@ -120,9 +126,9 @@ RTL
AnimatePrizeCutscene:
LDA.w ItemReceiptMethod : CMP.b #$03 : BNE +
JSR.w CrystalOrPendantBehavior : BCC +
JSR CrystalOrPendantBehavior : BCC +
LDA.w DungeonID : BMI +
LDA.w RoomItemsTaken : BIT #$80 : BEQ +
LDA.w RoomItemsTaken : BIT.b #$80 : BEQ +
SEC
RTL
+
@@ -131,7 +137,7 @@ RTL
PrizeDropSparkle:
LDA.w AncillaID,X : CMP.b #$29 : BNE .no_sparkle
JSR.w CrystalOrPendantBehavior : BCC .no_sparkle
JSR CrystalOrPendantBehavior : BCC .no_sparkle
SEC
RTL
.no_sparkle
@@ -139,8 +145,8 @@ PrizeDropSparkle:
RTL
HandleDropSFX:
LDA.w RoomItemsTaken : BIT #$80 : BEQ .no_sound
JSR.w CrystalOrPendantBehavior : BCC .no_sound
LDA.w RoomItemsTaken : BIT.b #$80 : BEQ .no_sound
JSR CrystalOrPendantBehavior : BCC .no_sound
SEC
RTL
.no_sound
@@ -159,7 +165,7 @@ RTL
MaybeKeepLootID:
PHA
LDA.w DungeonID : BMI .no_prize
LDA.w RoomItemsTaken : BIT #$80 : BNE .prize
LDA.w RoomItemsTaken : BIT.b #$80 : BNE .prize
.no_prize
STZ.w ItemReceiptID
STZ.w ItemReceiptPose
@@ -231,15 +237,15 @@ PrepPrizeOAMCoordinates:
STA.b Scrap04
REP #$20
LDA.w $029E,X
LDA.w AncillaZCoord,X
AND.w #$00FF
STA.b $72
STA.b ScrapBuffer72
LDA.b $00
STA.b $06
LDA.b Scrap00
STA.b Scrap06
SEC
SBC.b $72
STA.b $00
SBC.b ScrapBuffer72
STA.b Scrap00
SEP #$20
TXY

View File

@@ -13,18 +13,19 @@ DoDungeonMapBossIcon:
; get dungeon boss room
++ REP #$30
LDA.l $8AE817,X
LDA.l DungeonMapBossRooms, X
ASL
TAX
; get sprite pointer for room
LDA.l $89D62E,X
INC ; to skip the "sort"
TAX
LDA.l UWSpritesPointers,X
STA.b Scrap00 ; pointer in $00
LDA.w #$0028 : STA.b Scrap02 ; set the bank to 28 for now
LDY.w #$0001 ; to skip the "sort"
; get first byte to make sure it isn't an empty room
SEP #$20
LDA.l $890000,X
LDA.b [Scrap00], Y
CMP.b #$FF
BNE ++
@@ -32,7 +33,8 @@ DoDungeonMapBossIcon:
BRA .cave
; check first sprite
++ LDA.l $890002,X
++ INY #2
LDA.b [Scrap00], Y
SEP #$10
; match boss id
@@ -97,13 +99,13 @@ DoDungeonMapBossIcon:
STA.w DAS1L
LDX.b #$02
STX.w MDMAEN
STX.w DMAENABLE
STA.w DAS1L
LDA.w #$A260>>1
STA.w VMADDL
STX.w MDMAEN
STX.w DMAENABLE
; done
SEP #$30

View File

@@ -2,7 +2,7 @@ NewElderCode:
{
LDA.b OverworldIndex : CMP.b #$1B : BEQ .newCodeContinue
;Restore Jump we can keep the RTL so JML
JML $85F0CD
JML Sprite_16_Elder
.newCodeContinue
PHB : PHK : PLB
LDA.b #$07 : STA.w SpriteOAMProp, X ; Palette
@@ -12,11 +12,10 @@ JSR Elder_Code
PLB
RTL
}
Elder_Draw:
{
LDA.b #$02 : STA.b Scrap06 : STZ.b Scrap07 ;Number of Tiles
LDA.w SpriteGFXControl, X : ASL #04
@@ -60,7 +59,7 @@ RTL
LDA.l GoalCounter
CMP.l GoalItemRequirement : !BLT +
SEP #$20
JSL.l ActivateGoal
JSL ActivateGoal
+
.dont_show

72
enemizer/DMA.asm Normal file
View File

@@ -0,0 +1,72 @@
!DISP_REG = $2100 ; Screen Display Register
!VMAIN_REG = $2115 ; Video Port Control Register
!VRAM_LOW_REG = $2116 ; VRAM Address Registers (Low)
!VRAM_HIGH_REG = $2117 ; VRAM Address Registers (High)
!VRAM_WRITE_REG = #$18 ; VRAM Data Write Registers (Low) (you always store it to the dest register so no need for the actual address)
!DMA0_REG = $4300 ; DMA Control Register - channel 0
!DMA0_DEST_REG = $4301 ; DMA Destination Register
!DMA0_SRC_LOW_REG = $4302 ; DMA Source Address Register (Low)
!DMA0_SRC_HIGH_REG = $4303 ; DMA Source Address Register (High)
!DMA0_SRC_BANK_REG = $4304 ; DMA Source Address Register (Bank)
!DMA0_SIZE_LOW_REG = $4305 ; DMA Size Registers (Low)
!DMA0_SIZE_HIGH_REG = $4306 ; DMA Size Registers (Low)
!DMA_ENABLE_REG = $420B ; DMA Enable Register
macro DMA_VRAM(VRAM_HIGH,VRAM_LOW,SRC_BANK,SRC_HIGH,SRC_LOW,LENGTH_HIGH,LENGTH_LOW)
PHA
; --- preserve DMA registers ----------------------------------------------------
LDA.w !DMA0_REG : PHA
LDA.w !DMA0_DEST_REG : PHA
LDA.w !DMA0_SRC_LOW_REG : PHA
LDA.w !DMA0_SRC_HIGH_REG : PHA
LDA.w !DMA0_SRC_BANK_REG : PHA
LDA.w !DMA0_SIZE_LOW_REG : PHA
LDA.w !DMA0_SIZE_HIGH_REG : PHA
; -------------------------------------------------------------------------------
;LDA.b #$80 : STA.w !DISP_REG ; force vblank
LDA.b #$80 : STA.w !VMAIN_REG
; write to vram at $<VRAM_HIGH><VRAM_LOW>
LDA.b <VRAM_LOW> : STA.w !VRAM_LOW_REG ; Set VRAM destination address low byte
LDA.b <VRAM_HIGH> : STA.w !VRAM_HIGH_REG ; Set VRAM destination address high byte
; Set DMA0 to write a word at a time.
LDA.b #$01
STA.w !DMA0_REG
; Write to $2118 & $2119 - VRAM Data Write Registers (Low) & VRAM Data Write Registers (High)
; setting word write mode on DMA0_REG causes a write to $2118 and then $2119
; $21xx is assumed
LDA.b !VRAM_WRITE_REG
STA.w !DMA0_DEST_REG
; Read from $<SRC_BANK>:<SRC_HIGH><SRC_LOW>.
LDA.b <SRC_LOW>
STA.w !DMA0_SRC_LOW_REG ; set src address low byte
LDA.b <SRC_HIGH>
STA.w !DMA0_SRC_HIGH_REG ; set src address high byte
LDA.b <SRC_BANK>
STA.w !DMA0_SRC_BANK_REG ; set src address bank byte
; total bytes to copy: #$1000 bytes.
LDA.b <LENGTH_LOW> : STA.w !DMA0_SIZE_LOW_REG ; length low byte
LDA.b <LENGTH_HIGH> : STA.w !DMA0_SIZE_HIGH_REG ; length high byte
; start DMA on channel 0
LDA.b #$01 ; channel select bitmask
STA.w !DMA_ENABLE_REG
; --- restore DMA registers -----------------------------------------------------
PLA : STA.w !DMA0_SIZE_HIGH_REG
PLA : STA.w !DMA0_SIZE_LOW_REG
PLA : STA.w !DMA0_SRC_BANK_REG
PLA : STA.w !DMA0_SRC_HIGH_REG
PLA : STA.w !DMA0_SRC_LOW_REG
PLA : STA.w !DMA0_DEST_REG
PLA : STA.w !DMA0_REG
; -------------------------------------------------------------------------------
PLA
endmacro

53
enemizer/NMI.asm Normal file
View File

@@ -0,0 +1,53 @@
;-------------
NMIHookActionEnemizer:
{
;-----------------------------------------
; do our shell stuff
PHA
PHP
SEP #$20 ; get into 8-bit mode
LDA.l !SHELL_DMA_FLAG : BEQ .return ; check our draw flag
AND.b #$01 : BNE .loadKholdstare
LDA.l !SHELL_DMA_FLAG : AND.b #$02 : BNE .loadTrinexx
BRA .return ; just in case
;BIT.b #$01 : BEQ .loadKholdstare
;BIT.b #$02 : BEQ .loadTrinexx
.loadKholdstare
JSL DMAKholdstare
LDA.b #$00 : STA.l !SHELL_DMA_FLAG ; clear our draw flag
BRA .return
.loadTrinexx
JSL DMATrinexx
LDA.b #$00 : STA.l !SHELL_DMA_FLAG ; clear our draw flag
.return
PLP
PLA
;-----------------------------------------
; restore code Bank00.asm (164-167)
PHB
; Sets DP to $0000
LDA.w #$0000 : TCD
JML NMIHookReturnEnemizer
}
DMAKholdstare:
{
;#GFX_Kholdstare_Shell>>16
%DMA_VRAM(#$34,#$00,#GFX_Kholdstare_Shell>>16&$FF,#GFX_Kholdstare_Shell>>8&$FF,#GFX_Kholdstare_Shell&$FF,#$10,#$00)
RTL
}
DMATrinexx:
{
; TODO: change this to trinexx gfx
%DMA_VRAM(#$34,#$00,#GFX_Trinexx_Shell>>16,#GFX_Trinexx_Shell>>8&$FF,#GFX_Trinexx_Shell&$FF,#$08,#$00)
%DMA_VRAM(#$3A,#$A0,#GFX_Trinexx_Shell2>>16,#GFX_Trinexx_Shell2>>8&$FF,#GFX_Trinexx_Shell2&$FF,#$00,#$C0)
RTL
}

23
enemizer/blindboss.asm Normal file
View File

@@ -0,0 +1,23 @@
;================================================================================
; Blind Boss fight
;--------------------------------------------------------------------------------
pushpc
org $9DA081 ; Original Code
JML check_blind_boss_room
Check_for_Blind_Fight:
org $9DA090
Initialize_Blind_Fight:
pullpc
check_blind_boss_room:
LDA.b RoomIndex ; load room index (low byte)
CMP.b #$AC : BNE + ; Is is Thieves Town Boss Room
LDA.l !BLIND_DOOR_FLAG : BNE + ; Blind maiden does not need rescuing
LDA.l FollowerIndicator : JML Check_for_Blind_Fight
+
JML Initialize_Blind_Fight

23
enemizer/bossdrop.asm Normal file
View File

@@ -0,0 +1,23 @@
;================================================================================
; Fix boss item drop position to 'center' of screen
;================================================================================
change_heartcontainer_position:
{
PHA
LDA.l !CENTER_BOSS_DROP_FLAG : BEQ .not_moldorm_room
LDA.b #$78 : STA.w SpritePosXLow, X
STA.w SpritePosYLow, X
LDA.b LinkPosX+1 : STA.w SpritePosXHigh, X
LDA.b LinkPosY+1 : STA.w SpritePosYHigh, X
LDA.b RoomIndex : CMP.b #$07 : BNE .not_moldorm_room ; not moldorm room
LDA.b LinkPosX : STA.w SpritePosXLow, X
LDA.b LinkPosY : STA.w SpritePosYLow, X
.not_moldorm_room
PLA
JSL Sprite_Get16BitCoords_long
RTL
}

289
enemizer/bosses_moved.asm Normal file
View File

@@ -0,0 +1,289 @@
;================================================================================
; Move the bosses to the right screen location depending on the room
;--------------------------------------------------------------------------------
boss_move:
{
; TODO: should probably double check that we don't need to preserve registers (A,X)...
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
LDA.b RoomIndex ; load room index (low byte)
LDX.b RoomIndex+1 ; (high byte)
CMP.b #7 : BNE + ; Is it Hera Tower Boss Room
CPX.b #$00 : BNE +
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
BRL .move_to_middle
+
CMP.b #200 : BNE + ; Is it Eastern Palace Boss Room
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
BRL .move_to_bottom_right
+
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
BRL .move_to_bottom_right
+
CMP.b #51 : BNE + ; Is it Desert Palace Boss Room
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
BRL .move_to_bottom_left
+
CMP.b #90 : BNE + ; Is it Palace of darkness Boss Room
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
BRL .move_to_bottom_right
+
CMP.b #144 : BNE + ; Is it Misery Mire Boss Room
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
BRL .move_to_bottom_left
+
CMP.b #172 : BNE + ; Is it Thieve Town Boss Room
; IF MAIDEN IS NOT RESCUED -> DO NOTHING
; IF MAIDEN IS ALREADY RESCUED -> spawn sprites normally
JSL Sprite_ResetAll ; removes sprites in thieve town boss room
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
;Close the door if !BLIND_DOOR_FLAG == 1
LDA.l !BLIND_DOOR_FLAG : BEQ .no_blind_door
INC.w TrapDoorFlag
STZ.w TileMapDoorPos
STZ.w DoorTimer
INC.w BossSpecialAction
; ;That must be called after the room load!
.no_blind_door
BRL .move_to_bottom_right
+
CMP.b #6 : BNE + ; Is it Swamp Palace Boss Room
CPX.b #$00 : BNE +
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
BRL .move_to_bottom_left
+
CMP.b #222 : BNE + ; Is it Ice Palace Boss Room
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
BRL .move_to_top_right
+
CMP.b #164 : BNE + ; Is it Turtle Rock Boss Room
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
BRL .move_to_bottom_left
+
CMP.b #28 : BNE + ; Is it Gtower (Armos2) Boss Room
CPX.b #$00 : BNE +
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
BRL .move_to_bottom_right
+
CMP.b #108 : BNE + ; Is it Gtower (Lanmo2) Boss Room
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
BRL .move_to_bottom_left
+
CMP.b #77 : BNE + ; Is it Gtower (Moldorm2) Boss Room
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
BRL .move_to_middle
+
BRL .return
; $0D00[0x10] - The lower byte of a sprite's Y - coordinate.
; $0D10[0x10] - The lower byte of a sprite's X - coordinate.
; $0D20[0x10] - The high byte of a sprite's Y - coordinate.
; $0D30[0x10] - The high byte of a sprite's X - coordinate.
; $0B08[0x08] - (Overlord) X coordinate low byte.
; $0B18[0x08] - (Overlord) Y coordinate low byte.
; $0B10[0x08] - (Overlord) X coordinate high byte.
; $0B20[0x08] - (Overlord) Y coordinate high byte.
.move_to_middle
;load all sprite of that room and overlord
LDX.b #$00
.loop_middle ; move sprites
LDA.w SpriteTypeTable, X
JSR ShouldMoveSprite : BCC .no_change
LDA.w SpritePosXLow, X : !ADD.b #$68 : STA.w SpritePosXLow, X
LDA.w SpritePosYLow, X : !ADD.b #$68 : STA.w SpritePosYLow, X
.no_change
INX : CPX.b #$10 : BNE .loop_middle
LDX.b #$00
.loop_middle2 ; move overlords
LDA.w $0B00, X
CMP.b #$E3 : BNE + ;is it moving floor?
BRA .no_change_ov
+
LDA.w OverlordXLow, X : !ADD.b #$68 : STA.w OverlordXLow, X
LDA.w OverlordYLow, X : !ADD.b #$68 : STA.w OverlordYLow, X
.no_change_ov
INX : CPX.b #$08 : BNE .loop_middle2
BRL .return
.move_to_top_right
LDX.b #$00
.loop_top_right ; move sprites
LDA.w SpriteTypeTable, X
JSR ShouldMoveSprite : BCC .no_change2
LDA.w SpritePosYHigh, X : !ADD.b #$00 : STA.w SpritePosYHigh, X
LDA.w SpritePosXHigh, X : !ADD.b #$01 : STA.w SpritePosXHigh, X
.no_change2
INX : CPX.b #$10 : BNE .loop_top_right
LDX.b #$00
.loop_top_right2 ; move overlords
LDA.w $0B00, X
CMP.b #$E3 : BNE + ;is it moving floor?
BRA .no_change_ov2
+
LDA.w OverlordXHigh, X : !ADD.b #$01 : STA.w OverlordXHigh, X
LDA.w OverlordYHigh, X : !ADD.b #$00 : STA.w OverlordYHigh, X
.no_change_ov2
INX : CPX.b #$08 : BNE .loop_top_right2
BRL .return
.move_to_bottom_right
LDX.b #$00
.loop_bottom_right ; move sprites
LDA.w SpriteTypeTable, X
JSR ShouldMoveSprite : BCC .no_change3
LDA.w SpritePosYHigh, X : !ADD.b #$01 : STA.w SpritePosYHigh, X
LDA.w SpritePosXHigh, X : !ADD.b #$01 : STA.w SpritePosXHigh, X
.no_change3
INX : CPX.b #$10 : BNE .loop_bottom_right
LDX.b #$00
.loop_bottom_right2 ; move overlords
LDA.w $0B00, X
CMP.b #$E3 : BNE + ;is it moving floor?
BRA .no_change_ov3
+
LDA.w OverlordXHigh, X : !ADD.b #$01 : STA.w OverlordXHigh, X
LDA.w OverlordYHigh, X : !ADD.b #$01 : STA.w OverlordYHigh, X
.no_change_ov3
INX : CPX.b #$08 : BNE .loop_bottom_right2
BRL .return
.move_to_bottom_left
LDX.b #$00
.loop_bottom_left ; move sprites
LDA.w SpriteTypeTable, X
JSR ShouldMoveSprite : BCC .no_change4
LDA.w SpritePosYHigh, X : !ADD.b #$01 : STA.w SpritePosYHigh, X
LDA.w SpritePosXHigh, X : !ADD.b #$00 : STA.w SpritePosXHigh, X
.no_change4
INX : CPX.b #$10 : BNE .loop_bottom_left
LDX.b #$00
.loop_bottom_left2 ; move overlords
LDA.w $0B00, X
CMP.b #$E3 : BNE + ;is it moving floor?
BRA .no_change_ov4
+
LDA.w OverlordXHigh, X : !ADD.b #$00 : STA.w OverlordXHigh, X
LDA.w OverlordYHigh, X : !ADD.b #$01 : STA.w OverlordYHigh, X
.no_change_ov4
INX : CPX.b #$08 : BNE .loop_bottom_left2
BRL .return
.return
RTL
}
; A - sprite id from E20, X
; X - sprite index - should be preserved
; sets or clears carry flag, set if sprite should be moved
ShouldMoveSprite:
PHX
LDX.b #$FF
- INX : CPX.b #$0F : BCS .done
CMP.l BossIds, X : BNE -
; match found, move it
PLX : SEC : RTS
.done ; don't move it
PLX : CLC : RTS
BossIds:
db $53, $54, $09, $92, $8c, $8d, $88, $ce
db $a2, $a3, $a4, $bd, $cb, $cc, $cd, $ff
;================================================================================
; Fix the gibdo key drop in skull woods before the boss room - USELESS CODE
;--------------------------------------------------------------------------------
;gibdo_drop_key:
; LDA.b RoomIndex : CMP.b #$39 : BNE .no_key_drop ; Check if the room id is skullwoods before boss
; LDA.w SpriteAITable, X : CMP.b #$09 : BNE .no_key_drop ; Check if the sprite is alive
; LDA.b #$01 : STA.w SpriteForceDrop, X;set key
;
;.no_key_drop
; JSL $86DC5C ;Restore draw shadow
; RTL
;--------------------------------------------------------------------------------
;================================================================================
; Set a flag to draw kholdstare shell on next NMI
;--------------------------------------------------------------------------------
new_kholdstare_code:
LDA.w SpriteForceDrop : BNE .already_iced
LDA.b #$01 : STA.w SpriteForceDrop
LDA.b #$01 : STA.l !SHELL_DMA_FLAG ; tell our NMI to draw the shell
.already_iced
; restore code
JSL Kholdstare_Draw ; sprite_kholdstare.asm (154) : JSL Kholdstare_Draw
RTL
;--------------------------------------------------------------------------------
;================================================================================
; Set a flag to draw trinexx shell on next NMI
;--------------------------------------------------------------------------------
new_trinexx_code:
LDA.w SpriteForceDrop : BNE .already_rocked
LDA.b #$01 : STA.w SpriteForceDrop
LDA.b #$02 : STA.l !SHELL_DMA_FLAG ; tell our NMI to draw the shell
.already_rocked
; restore code
LDA.b #$03 : STA.w SpriteGFXControl, X ; sprite_trinexx.asm (62) : LDA.b #$03 : STA $0DC0, X
RTL
;--------------------------------------------------------------------------------

45
enemizer/bushes.asm Normal file
View File

@@ -0,0 +1,45 @@
sprite_bush_spawn:
{
STY.b Scrap0D ; restored code
LDA.l !BUSHES_FLAG ; That byte is the flag to activate random enemies under bush
BNE .continue
CPY.b #$04 : BNE .not_random_old
JSL GetRandomInt : AND.b #$03 : !ADD.b #$13 : TAY
.not_random_old
LDA.w $81F3, Y;restored code
RTL
.continue
PHX : PHY ; save x,y just to be safe
PHB : PHK : PLB ; setbank to 40
CPY.b #$04 : BNE .not_random
JSL GetRandomInt : AND.b #$03 : TAY
LDA.w sprite_bush_spawn_table_random_sprites, Y
BRL .return
.not_random
CPY.b #$0F : BEQ .newSpriteSpawn
CPY.b #$11 : BEQ .newSpriteSpawn
CPY.b #$10 : BEQ .newSpriteSpawn
;CPY.b #$0E : BEQ .newSpriteSpawn
LDA.w item_drop_table_override, Y
BRA .return
.newSpriteSpawn
LDA.l OverworldIndexMirror : TAY ; load the area ID
LDA.l ProgressIndicator : CMP.b #$03 : !BLT .dontGoPhase2 ; check if agahnim 1 is alive
; aga1 is dead
LDA.l OverworldIndexMirror : CMP.b #$40 : !BGE .dontGoPhase2 ; check if we are in DW, if so we can skip shifting table index
!ADD.b #$90 : TAY ; agahnim 1 is dead, so we need to go to the 2nd phase table for LW
.dontGoPhase2
LDA.w sprite_bush_spawn_table_overworld, Y ;LDA 408000 + area id
.return
PLB ; restore bank to where it was
PLY : PLX ; restore x,y
RTL
}

21
enemizer/bushes_table.asm Normal file
View File

@@ -0,0 +1,21 @@
sprite_bush_spawn_table:
{
; SPRITE DATA TABLE GENERATED BY ENEMIZER
.overworld
; Skip 0x128(overworld [way overkill]) + 0x128 (dungeons)
skip $128
.dungeons
skip $128
;Old sprite table - Could be changed as well (for the item id 04)
.random_sprites ; if item == 04
db #$00, #$D8, #$E3, #$D8
}
warnpc $B68374
; the drop table has $E1 at B6837D which needs to be #$DA with retro bow
item_drop_table_override:
db #$00, #$D9, #$3E, #$79, #$D9, #$DC, #$D8, #$DA, #$E4, #$E1, #$DC
db #$D8, #$DF, #$E0, #$0B, #$42, #$D3, #$41, #$D4, #$D9, #$E3, #$D8

11
enemizer/damage.asm Normal file
View File

@@ -0,0 +1,11 @@
CheckIfLinkShouldDie:
; before this we should have:
; LDA $7EF36D - this gets hooked, but we should have LDA at the end of it
CMP.b Scrap00 : BCC .dead
SEC : SBC.b Scrap00
BRA .done
.dead
LDA.b #$00
.done
RTL

View File

@@ -0,0 +1,3 @@
enemizer_info_table:
skip $100
; contains information about settings and enemizer version used to generate rom

View File

@@ -0,0 +1,45 @@
; ;Enemizer Flags
EnemizerFlags:
.randomize_bushes
db #$00 ;368100 ; Enable random enemy under bushes
.close_blind_door
db #$00 ;408101 : 200101 ; Enable blind's door closing for other bosses
.moldorm_eye_count
db #$01 ;408102 : 200102 ; Moldorm eye count, default to 2 eyes (1)
EnemizerFlag_Randomize_Sprites:
db #$00 ;408103 : 200103 ; Randomize Sprites.
.agahnim_fun_balls
db #$00 ;408104 : 200104 ; make Agahnim balls deflect back
.enable_mimic_override
db #$00 ;408105 : 200105 ; toggle mimic code between new and old
; free byte ;408106 : 200106
db #$00
.center_boss_drops
db #$00 ;368107
.killable_theives_id ; must be set to C4 to make thieves killable...
db #$B8 ;368108
.enemies_live_upon_falling
db #$00 ; 368109 ; when set to 1 enemies don't die when falling into a hole
db #$00 ;40810A : 20010A
db #$00 ;40810B : 20010B
db #$00 ;40810C : 20010C
db #$00 ;40810D : 20010D
db #$00 ;40810E : 20010E
db #$00 ;40810F : 20010F
db #$00 ;408110 : 200110
db #$00 ;408111 : 200111
db #$00 ;408112 : 200112
db #$00 ;408113 : 200113
db #$00 ;408114 : 200114
db #$00 ;408115 : 200115
db #$00 ;408116 : 200116
db #$00 ;408117 : 200117
db #$00 ;408118 : 200118
db #$00 ;408119 : 200119
db #$00 ;40811A : 20011A
db #$00 ;40811B : 20011B
db #$00 ;40811C : 20011C
db #$00 ;40811D : 20011D
db #$00 ;40811E : 20011E
db #$00 ;40811F : 20011F

View File

@@ -0,0 +1,16 @@
pushpc
org $868536
JSL CheckFallingDeathFlag
org $86FBF8
JSL CheckFallingDeathFlag
pullpc
CheckFallingDeathFlag:
LDA.l !ENEMY_FALLING_STAY_ALIVE
BEQ +
RTL
+ JML Sprite_ManuallySetDeathFlagUW ; original code

BIN
enemizer/gfx/rocks.gfx Normal file

Binary file not shown.

BIN
enemizer/gfx/rocks2.gfx Normal file

Binary file not shown.

BIN
enemizer/gfx/shell.gfx Normal file

Binary file not shown.

17
enemizer/hooks.asm Normal file
View File

@@ -0,0 +1,17 @@
incsrc hooks/NMI_hook.asm
incsrc hooks/bushes_hooks.asm
incsrc hooks/bossdrop_hooks.asm
incsrc hooks/blinddoor_hooks.asm
incsrc hooks/bosses_hooks.asm
incsrc hooks/moldorm_hooks.asm
incsrc hooks/damage_hooks.asm
incsrc hooks/overworld_sprite_hooks.asm
incsrc hooks/underworld_sprite_hooks.asm

View File

@@ -0,0 +1,9 @@
;================================================================================
; NMI Hook
;--------------------------------------------------------------------------------
; rando already hooks the Bank00.asm : 164 (PHA : PHX : PHY : PHD : PHB) so we have to hook after that
org $8080D0 ; <- D0 - Bank00.asm : 164-167 (PHB, LDA.w #$0000)
JML NMIHookActionEnemizer
org $8080D5 ; <- D5 - Bank00.asm : 164-167 (PHB, LDA.w #$0000)
NMIHookReturnEnemizer:
;--------------------------------------------------------------------------------

View File

@@ -0,0 +1,11 @@
;================================================================================
; Blind door close
;--------------------------------------------------------------------------------
;
org $828849 ; Bank02.asm(1588) - original code : JSL $078000 //Hook on player main when transition are over execute player code
JSL check_special_action ;using the variable 7E0CF3 if it not 00 then trap the player in that room
;could be changed easily to support more than only 1 function
;--------------------------------------------------------------------------------
org $878000
Player_Main:

View File

@@ -0,0 +1,6 @@
;================================================================================
; Change heart container drop location
;--------------------------------------------------------------------------------
org $85EF62
JSL change_heartcontainer_position
;--------------------------------------------------------------------------------

View File

@@ -0,0 +1,41 @@
; *$4C114-$4C174 LONG
org $89C114
Dungeon_ResetSprites: ; Bank09.asm(822)
; *$4C44E-$4C498 LONG
org $89C44E
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
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
;================================================================================
; Draw kholdstare shell
;--------------------------------------------------------------------------------
org $8DD97F ; jump point
Kholdstare_Draw:
org $9E9518 ; sprite_kholdstare.asm (154) : JSL Kholdstare_Draw
JSL new_kholdstare_code ; Write new gfx in the vram
;--------------------------------------------------------------------------------
;================================================================================
; Draw trinexx shell
;--------------------------------------------------------------------------------
org $1DAD67 ; sprite_trinexx.asm (62) : LDA.b #$03 : STA $0DC0, X
JSL new_trinexx_code : NOP
;--------------------------------------------------------------------------------

View File

@@ -0,0 +1,8 @@
;================================================================================
; New bush mob randomization
;--------------------------------------------------------------------------------
org $868279
NOP #$0A
JSL sprite_bush_spawn
NOP ; we keep the branch
;--------------------------------------------------------------------------------

View File

@@ -0,0 +1,12 @@
org $8780CA ; Bank07.asm(179)
JSL CheckIfLinkShouldDie : NOP : NOP : NOP
;SEC : SBC.b Scrap00 : CMP.b #$00 : BEQ .linkIsDead ; Bank07.asm(179) -
org $8780D1
BNE linkNotDead : NOP : NOP ; Bank07.asm(183) - CMP.b #$A8 : BCC .linkNotDead
org $8780D5
linkIsDead:
org $8780F7
linkNotDead:

View File

@@ -0,0 +1,20 @@
; adjust oam position after drawing eyes
;ED88E
org $9DD88E
{
; original: GiantMoldorm_Draw+5lines (sprite_giant_moldorm.asm)
; lda.b OAMPtr : add.w #$0008 : sta.b OAMPtr
; INC.b OAMPtr+2 : INC.b OAMPtr+2
JSL Moldorm_UpdateOamPosition
NOP #08
}
; set number of eyes
;org $9DDBB2 ;$0EDBB2
;{
; LDX.b #$01
; number of eyes (-1)
;0EDBB2 0EDBB3
; LDX.b #$01
;}

View File

@@ -0,0 +1,54 @@
org $89C50B ; 0x4C50B
{
; .loadData
; ; $4C50B-
; STA.b Scrap01 ; 85 01
; ; $4C50D-
; LDY.w #$0000 ; A0 00 00
JSL LoadOverworldSprites
NOP
}
org $89C510 ; 0x4C510
LDA.b [Scrap00], Y ; replace LDA ($00), Y
; CMP.b #$FF : BEQ .stopLoading
; INY #2
org $89C518 ; 0x4C518
LDA.b [Scrap00], Y ; replace LDA ($00), Y
; DEY #2 : CMP.b #$F4 : BNE .notFallingRocks
; INC.w $0FFD
; INY #3
; BRA .nextSprite
; .notFallingRocks ; Anything other than falling rocks.
org $89C528 ; 0x4C528
LDA.b [Scrap00], Y ; replace LDA ($00), Y
; PHA : LSR #4 : ASL #2 :
org $89C531 ; 0x4C531
STA.b Scrap0A ; STA.b $02
; INY
org $89C534 ; 0x4C534
LDA.b [Scrap00], Y ; replace LDA ($00), Y
; LSR #4 : CLC
org $89C53B ; 0x4C53B
ADC.b Scrap0A ; ADC.b $02
; STA.b $06
; PLA : ASL #4 : STA.b $07
org $89C546 ; 0x4C546
LDA.b [Scrap00], Y ; replace LDA ($00), Y
; AND.b #$0F : ORA.b $07 : STA.b $05
; INY
org $89C54F ; 0x4C54F
LDA.b [Scrap00], Y ; replace LDA ($00), Y
; LDX.b Scrap05 : INC A : STA.l $7FDF80, X
; ; $4C558-
; ; Move on to the next sprite / overlord.
; INY ; C8
; ; $4C559-
; BRA .nextSprite ; 80 B5
; .stopLoading
; ; $4C55B-
; SEP #$10 ; E2 10
; ; $4C55D-
; RTS ; 60

View File

@@ -0,0 +1,67 @@
org $89C29A
JSL LoadUnderworldSprites : NOP
; these hooks change the LDA.b ($00) commands to use LDA.b [$00] commands
; so we can store the sprites in a different bank
; also needs to change the use of $02 to $03 for slot index to make that possible
org $89C2B2
LDA.b [Scrap00]
org $89C2C1
LDA.b [Scrap00],Y
org $89C2CA
INC.b Scrap03 ; change slot variable to $03
;org $09C329 standing items overwrote this one
;LDA.b [Scrap00],Y
org $89C332
LDA.b [Scrap00],Y
org $89C345
DEC.b Scrap03 : LDX.b Scrap03
org $89C350
LDA.b [Scrap00],Y
org $89C35A
DEC.b Scrap03
org $89C36E
JSL GetSpriteSlot16Bit ; depended on high bit being zero, which it isn't anymore
org $89C383
LDX.b Scrap03
org $89C38C
LDA.b [Scrap00],Y
org $89C398
LDA.b [Scrap00],Y
org $89C3AA
LDA.b [Scrap00],Y
org $89C3BF
LDA.b [Scrap00],Y
org $89C3DF
LDA.b Scrap03
org $89C3F3
LDA.b [Scrap00],Y
org $89C3FB
LDA.b [Scrap00],Y
org $89C404
LDA.b [Scrap00],Y
org $89C416
LDA.b [Scrap00],Y

View File

@@ -0,0 +1,19 @@
pushpc
org $9EC147
JSL NewKodongoCollision
JMP .continue : NOP #2
.continue
org $9EC152
Kodongo_SetDirection:
pullpc
NewKodongoCollision:
LDA.w SpriteMoveDirection, X : INC A : AND.b #$03 : STA.w SpriteMoveDirection, X
;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

59
enemizer/main.asm Normal file
View File

@@ -0,0 +1,59 @@
; Intended to be a migration of code generated by enemizer
lorom
;=Constants======================================================================
!BUSHES_FLAG = "$368100"
!BLIND_DOOR_FLAG = "$368101"
!MOLDORM_EYES_FLAG = "$368102"
!RANDOM_SPRITE_FLAG = "$368103"
!AGAHNIM_FUN_BALLS = "$368104"
!ENABLE_MIMIC_OVERRIDE = "$368105"
; free byte
!CENTER_BOSS_DROP_FLAG = "$368107"
!KILLABLE_THIEVES_ID = "$368108"
!ENEMY_FALLING_STAY_ALIVE = "$368109"
; Enemizer reserved memory
; $7F50B0 - $7F50BF - Downstream Reserved (Enemizer)
!SHELL_DMA_FLAG = "$7F50B0"
!SOUNDFX_LOADED = "$7F50B1"
;================================================================================
incsrc hooks.asm
incsrc DMA.asm
org $B68000 ; the original org is 368000 and B6 is the same bank but fastrom
EnemizerTablesStart:
incsrc enemizer_info_table.asm ; B68000-B680FF
incsrc enemizerflags.asm ; B68100-B6811F
incsrc bushes_table.asm ; B68120-B6373
EnemizerCodeStart:
incsrc bushes.asm
incsrc NMI.asm
incsrc special_action.asm
incsrc bosses_moved.asm
incsrc damage.asm
incsrc bossdrop.asm
incsrc moldorm.asm
incsrc kodongo_fixes.asm
incsrc mimic_fixes.asm
incsrc swamola_fix.asm
; vitreous key fix for boss shuffle - uses FixPrizeOnTheEyes flag
incsrc overworld_sprites.asm
incsrc underworld_sprites.asm
incsrc blindboss.asm
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:

111
enemizer/mimic_fixes.asm Normal file
View File

@@ -0,0 +1,111 @@
pushpc
org $8691B6
SpritePrep_Eyegore_bounce:
JSL SpritePrep_EyegoreNew
org $868839 ; 0xEF
dw SpritePrep_Eyegore_bounce
dw SpritePrep_Eyegore_bounce
;org $869468 ; These need to go else where
;dw #$BFF7 ; SpriteModule_Active_Bank1E_bounce
;dw #$BFF7 ; SpriteModule_Active_Bank1E_bounce
;org $9E8B21
;JSL FixVectorForMimics
;org $9E8BBB ; New vectors for mimics
;dw #$C795
;dw #$C795
org $9EC70D
SpritePrep_Eyegore_become_mimic:
;org $86EC08 ; Sprite_AttemptZapDamage
;JSL resetSprite_Mimic : NOP
org $86ED9E ; Sprite_ApplyCalculatedDamage, skip high sprite id early exit
JSL IsItReallyAMimic : NOP
org $86EDA6 ; Sprite_ApplyCalculatedDamage .not_absorbable
JSL notItemSprite_Mimic
pullpc
;FixVectorForMimics:
; CMP.w $#00EF : BCC .end
; SBC.w #$0032 ; this puts the vector at the unused bytes at UNREACHABLE_1E8BBB
; .end
; AND.w #$00FF ; what we wrote over
; ASL A
;RTL
; replace SpritePrep_Eyegore if flag is on
SpritePrep_EyegoreNew:
{
LDA.l !ENABLE_MIMIC_OVERRIDE : BNE .new
; old
JSL SpritePrep_Eyegore
RTL
.new
LDA.w SpriteTypeTable, X : CMP.b #$EF : BCS .mimic ;If sprite id >= EF (unused somaria platform)
; seems unnecessary it's just an rtl?
; JSL $9EC71A ; 0xF471A set eyegore to be only eyegore (.not_goriya?)
RTL
.mimic
SBC.b #$6C : STA.w SpriteTypeTable, X : JSL SpritePrep_LoadProperties ; pretending to be $83 or $84
JSL SpritePrep_Eyegore_become_mimic
; LDA.w SpriteTypeTable, X : ADC.b #$6C : STA.w SpriteTypeTable, X ; set the sprite back to special mimic
; todo? unsure about this code - seems unnecessary
; LDA.w $0CAA, X : AND.b #$FB : ORA.b #$80 : STA.w $0CAA, X ; STZ.w $0CAA, X
RTL
}
;resetSprite_Mimic:
; LDA.l !ENABLE_MIMIC_OVERRIDE : BEQ .notMimic ; skip to what it would have done normally
;
; LDA.w SpriteTypeTable, X
; CMP.b #$EF : BCC .notMimic
; LDA.w SpriteTypeTable, X : SBC.b #$6C : STA.w SpriteTypeTable, X ; overwrite the sprite id with eyegore id
;
;.notMimic
; restore code
; LDA.w SpriteTypeTable, X : CMP.b #$7A
;RTL
IsItReallyAMimic:
LDA.l !ENABLE_MIMIC_OVERRIDE : BEQ .continue
LDA.w SpriteTypeTable,X : CMP.b #$EF : BEQ .is_mimic
CMP.b #$F0 : BNE .continue
.is_mimic
CLC : RTL
.continue ; code we hijacked
LDA.w SpriteTypeTable,X
CMP.b #$D8
RTL
; this is just for killable thieves now
notItemSprite_Mimic:
; if we set killable thief we want to update the sprite id so it can be killed
LDA.w SpriteTypeTable, X
CMP.l !KILLABLE_THIEVES_ID : BNE .continue ; thief #$C4 (default is B8/dialog tester)
; if we don't have mimic code turned on we want to skip, but we also need to reload the sprite id because we just smoked it with this LDA
; LDA.l !ENABLE_MIMIC_OVERRIDE : BEQ .reloadSpriteIdAndSkipMimic ; skip to what it would have done normally
; LDA.w SpriteTypeTable, X ; I hate assembly
; CMP.b #$EF : BCC .continue
; SBC.b #$6C : BRA .continue
.changeSpriteId
LDA.b #$83 ; load green eyegore sprite id so we can kill the thing
.continue
; restore code
REP #$20 : ASL #2
RTL

14
enemizer/moldorm.asm Normal file
View File

@@ -0,0 +1,14 @@
Moldorm_UpdateOamPosition:
{
PHX
LDA.l !MOLDORM_EYES_FLAG : TAX
.more_eyes
LDA.b OAMPtr : CLC : ADC.w #$0004 : STA.b OAMPtr
LDA.b OAMPtr+2 : CLC : ADC.w #$0001 : STA.b OAMPtr+2
DEX : BPL .more_eyes ; X >= 0
PLX
RTL
}

View File

@@ -0,0 +1,8 @@
LoadOverworldSprites:
; restore code
STA.b Scrap01 ; 85 01
LDY.w #$0000 ; A0 00 00
; set bank
LDA.b #$09 : STA.b Scrap02 ; default is bank 9
RTL

12
enemizer/shell_gfx.asm Normal file
View File

@@ -0,0 +1,12 @@
;================================================================================
; insert kholdstare & trinexx shell gfx file
;--------------------------------------------------------------------------------
GFX_Kholdstare_Shell:
incbin gfx/shell.gfx
GFX_Trinexx_Shell:
incbin gfx/rocks.gfx
GFX_Trinexx_Shell2:
incbin gfx/rocks2.gfx
;--------------------------------------------------------------------------------

View File

@@ -0,0 +1,12 @@
;================================================================================
; Special action
;================================================================================
check_special_action:
{
LDA.w BossSpecialAction : BEQ .no_special_action
LDA.b #$05 : STA.b GameSubMode
STZ.w BossSpecialAction
.no_special_action
JSL Player_Main
RTL
}

18
enemizer/swamola_fix.asm Normal file
View File

@@ -0,0 +1,18 @@
pushpc
org $8683B5
JSL MaybeDoCachedSprites ; JSL ExecuteCachedSprites
org $9DE9DA
ExecuteCachedSprites:
pullpc
MaybeDoCachedSprites:
LDA.l EnemizerFlag_Randomize_Sprites
BNE .enemizer
JML ExecuteCachedSprites ; what we copied over
.enemizer
RTL

View File

@@ -0,0 +1,11 @@
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
RTL
GetSpriteSlot16Bit:
LDA.b Scrap03 : AND.w #$00FF
ASL A
TAY
RTL

View File

@@ -9,12 +9,12 @@ LockAgahnimDoors:
LDA.w #$0000 : RTL
+ : CMP.w #$0001 : BNE +
LDA.l ProgressIndicator : AND.w #$000F : CMP.w #$0002 : !BGE .unlock ; if we rescued zelda, skip
JSR.w LockAgahnimDoorsCore : RTL
JSR LockAgahnimDoorsCore : RTL
+ : CMP.w #$0002 : BNE +
JSR.w LockAgahnimDoorsCore : BEQ .unlock
JSR LockAgahnimDoorsCore : BEQ .unlock
PHX : PHY
SEP #$30
JSL.l CheckTowerOpen
JSL CheckTowerOpen
REP #$30
PLY : PLX
!BGE .crystalOrUnlock
@@ -29,7 +29,7 @@ LockAgahnimDoors:
LDA.w #$0001 : RTL ;Keep the door locked
++
SEP #$30
JSL $899B6F ;Add tower break seal
JSL AncillaAdd_GTCutscene ;Add tower break seal
REP #$30
LDA.w #$0001 ;Prevent door from opening that frame otherwise it glitchy
RTL
@@ -65,14 +65,14 @@ RTS
SmithDoorCheck:
LDA.l SmithTravelsFreely : AND.w #$00FF : BEQ .orig
;If SmithTravelsFreely is set Frog/Smith can enter multi-entrance overworld doors
JML.l Overworld_Entrance_BRANCH_RHO
JML Overworld_Entrance_BRANCH_RHO
.orig ; The rest is equivlent to what we overwrote
CPX.w #$0076 : !BGE +
JML.l Overworld_Entrance_BRANCH_LAMBDA
JML Overworld_Entrance_BRANCH_LAMBDA
+
JML.l Overworld_Entrance_BRANCH_RHO
JML Overworld_Entrance_BRANCH_RHO
;--------------------------------------------------------------------------------
AllowStartFromSingleEntranceCave:
; 16 Bit A, 16 bit XY
@@ -80,15 +80,14 @@ AllowStartFromSingleEntranceCave:
LDA.l StartingEntrance : AND.w #$00FF ; What we wrote over
PHA
TAX
LDA.l StartingAreaExitOffset, X
AND.w #$00FF
LDA.l StartingAreaExitOffset, X : AND.w #$00FF
BNE +
JMP .done
+
DEC
STA.b Scrap00
ASL #2 : !ADD Scrap00 : ASL #2 ; mult by 20
ASL #2 : !ADD.l Scrap00 : ASL #2 ; mult by 20
TAX
LDA.w #$0016 : STA.l EN_MAINDESQ ; Cache the main screen designation
@@ -126,7 +125,7 @@ AllowStartFromSingleEntranceCave:
LDA.l StartingEntrance : TAX
LDA.l StartingAreaOverworldDoor, X : STA.l PreviousOverworldDoor ;Load overworld door
REP #$20 ; reset 16-bit accumulator
JSL.l CacheDoorFrameData
JSL CacheDoorFrameData
.done
PLA
@@ -138,15 +137,15 @@ AllowStartFromExit:
LDA.l ShouldStartatExit, X : BNE .doStart
LDA.l StartingEntrance ; what we wrote over
JML.l AllowStartFromExitReturn
JML AllowStartFromExitReturn
.doStart
LDA.l $828481, X ;Module_LocationMenu_starting_points
LDA.l Module1B_SpawnSelect_spawns, X
ASL : TAX
LDA.l $82D8D2, X : STA.b RoomIndex
LDA.l $82D8D3, X : STA.b RoomIndex+1
LDA.l SpawnPointData_room_id, X : STA.b RoomIndex
LDA.l SpawnPointData_room_id+1, X : STA.b RoomIndex+1
; Go to pre-overworld mode
LDA.b #$08 : STA.b GameMode
@@ -155,10 +154,10 @@ JML.l AllowStartFromExitReturn
STZ.b SubSubModule
STZ.w DeathReloadFlag
STZ.w RespawnFlag
INC.w UpdateHUDFlag
LDA.b #$01 : STA.l UpdateHUDFlag
JSL Equipment_SearchForEquippedItemLong
JSL HUD_RebuildLong2
JSL HUD_RebuildIndoor_Palace
JSL Equipment_UpdateEquippedItemLong
RTL
@@ -166,9 +165,9 @@ RTL
CheckHole:
LDX.w #$0024
.nextHoleClassic
LDA.b Scrap00 : CMP.l $9BB800, X
LDA.b Scrap00 : CMP.l Overworld_GetPitDestination_map16, X
BNE .wrongMap16Classic
LDA.b OverworldIndex : CMP.l $9BB826, X
LDA.b OverworldIndex : CMP.l Overworld_GetPitDestination_screen, X
BEQ .matchedHoleClassic
.wrongMap16Classic
DEX #2 : BPL .nextHoleClassic
@@ -198,11 +197,11 @@ PreventEnterOnBonk:
LDA.b OverworldIndex : AND.w #$0040 : CMP.b WorldCache : BEQ .done ; Are we bonking, or doing the superbunny glitch?
; If in inverted, are in mirror mode, and are bonking then do not enter
JML.l PreventEnterOnBonk_BRANCH_IX
JML PreventEnterOnBonk_BRANCH_IX
.done
LDX.w #$0102 ; rest of what we wrote over
JML.l PreventEnterOnBonk_return
JML PreventEnterOnBonk_return
;--------------------------------------------------------------------------------
TurtleRockEntranceFix:
LDA.l TurtleRockAutoOpenFix : BEQ .done

View File

@@ -5,56 +5,57 @@ OnPrepFileSelect:
+
PHA : PHX
REP #$10
JSL.l LoadAlphabetTilemap
JSL.l LoadFullItemTiles
JSL LoadAlphabetTilemap
JSL LoadFullItemTiles
SEP #$10
PLX : PLA
RTL
;--------------------------------------------------------------------------------
OnDrawHud:
JSL.l DrawChallengeTimer ; this has to come before NewDrawHud because the timer overwrites the compass counter
JSL.l NewDrawHud
JSL.l SwapSpriteIfNecessary
JSL.l CuccoStorm
JSL.l PollService
JML.l ReturnFromOnDrawHud
JSL DrawChallengeTimer ; this has to come before NewDrawHud because the timer overwrites the compass counter
JSL NewDrawHud
JSL DrHudOverride
JSL SwapSpriteIfNecessary
JSL CuccoStorm
JSL PollService
JML ReturnFromOnDrawHud
;--------------------------------------------------------------------------------
OnDungeonEntrance:
STA.l PegColor ; thing we wrote over
JSL MaybeFlagDungeonTotalsEntrance
INC.w UpdateHUDFlag
LDA.w #$0001 : STA.l UpdateHUDFlag
RTL
;--------------------------------------------------------------------------------
OnDungeonBossExit:
JSL.l StatTransitionCounter
JSL StatTransitionCounter
RTL
;--------------------------------------------------------------------------------
OnPlayerDead:
PHA
JSL.l SetDeathWorldChecked
JSL.l SetSilverBowMode
JSL.l RefreshRainAmmo
JSL SetDeathWorldChecked
JSL SetSilverBowMode
JSL RefreshRainAmmo
PLA
RTL
;--------------------------------------------------------------------------------
OnDungeonExit:
PHA : PHP
SEP #$20 ; set 8-bit accumulator
JSL.l SQEGFix
JSL SQEGFix
PLP : PLA
STA.w DungeonID : STZ.w Map16ChangeIndex ; thing we wrote over
PHA : PHP
INC.w UpdateHUDFlag
JSL.l HUD_RebuildLong
JSL.l FloodGateResetInner
JSL.l SetSilverBowMode
LDA.w #$0001 : STA.l UpdateHUDFlag
JSL HUD_RebuildLong
JSL FloodGateResetInner
JSL SetSilverBowMode
PLP : PLA
RTL
;--------------------------------------------------------------------------------
OnQuit:
JSL.l SQEGFix
JSL SQEGFix
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
@@ -67,8 +68,9 @@ OnUncleItemGet:
BIT.b #$02 : BEQ + : STA.l InfiniteBombs : +
BIT.b #$01 : BEQ + : STA.l InfiniteArrows : +
LDA.l UncleItem_Player : STA.l !MULTIWORLD_ITEM_PLAYER_ID
PLA
JSL.l Link_ReceiveItem
JSL Link_ReceiveItem
LDA.l UncleRefill : BIT.b #$04 : BEQ + : LDA.b #$80 : STA.l MagicFiller : + ; refill magic
LDA.l UncleRefill : BIT.b #$02 : BEQ + : LDA.b #50 : STA.l BombsFiller : + ; refill bombs
@@ -102,13 +104,13 @@ OnAga1Defeated:
RTL
;--------------------------------------------------------------------------------
OnAga2Defeated:
JSL.l Dungeon_SaveRoomData_justKeys ; thing we wrote over, make sure this is first
JSL Dungeon_SaveRoomData_justKeys ; thing we wrote over, make sure this is first
LDA.b #$01 : STA.l Aga2Duck
LDA.w DungeonID : CMP.b #$1A : BNE +
LDA.l DungeonsCompleted : ORA.b #$04 : STA.l DungeonsCompleted
+
LDA.b #$FF : STA.w DungeonID
JML.l IncrementAgahnim2Sword
JML IncrementAgahnim2Sword
;--------------------------------------------------------------------------------
OnFileCreation:
PHB
@@ -120,7 +122,7 @@ OnFileCreation:
LDA.w #$010C
LDX.w #$B3E3
LDY.w #$03E3
MVN CartridgeSRAM>>16, InitSRAMTable>>16
MVN CartridgeSRAM>>16, InitSRAMTable>>16
PLB
; Resolve instant post-aga if standard
@@ -133,35 +135,37 @@ OnFileCreation:
; Set validity value and do some cleanup. Jump to checksum done.
LDA.w #$55AA : STA.l FileValiditySRAM
JSL.l WriteSaveChecksumAndBackup
JSL WriteSaveChecksumAndBackup
STZ.b Scrap00
STZ.b Scrap01
JML.l InitializeSaveFile_checksum_done
JML InitializeSaveFile_checksum_done
;--------------------------------------------------------------------------------
OnFileLoad:
REP #$10 ; set 16 bit index registers
JSL.l EnableForceBlank ; what we wrote over
JSL EnableForceBlank ; what we wrote over
REP #$20 : LDA.l TotalItemCount : STA.l MultiClientFlagsWRAM+1 : SEP #$20
LDA.l MultiClientFlagsROM : STA.l MultiClientFlagsWRAM
LDA.b #$07 : STA.w BG34NBA ; Restore screen 3 to normal tile area
LDA.l FileMarker : BNE +
JSL.l OnNewFile
JSL OnNewFile
LDA.b #$FF : STA.l FileMarker
+
LDA.w DeathReloadFlag : BNE + ; don't adjust the worlds for "continue" or "save-continue"
LDA.l MosaicLevel : BNE + ; don't adjust worlds if mosiac is enabled (Read: mirroring in dungeon)
JSL.l DoWorldFix
JSL DoWorldFix
+
JSL.l MasterSwordFollowerClear
JSL MasterSwordFollowerClear
LDA.b #$FF : STA.l RNGLockIn ; reset rng item lock-in
LDA.l GenericKeys : BEQ +
LDA.l CurrentGenericKeys : STA.l CurrentSmallKeys ; copy generic keys to key counter
+
JSL.l SetSilverBowMode
JSL.l RefreshRainAmmo
JSL.l SetEscapeAssist
JSL SetSilverBowMode
JSL RefreshRainAmmo
JSL SetEscapeAssist
LDA.l IsEncrypted : CMP.b #01 : BNE +
JSL LoadStaticDecryptionKey
@@ -192,19 +196,19 @@ RTL
;--------------------------------------------------------------------------------
OnInitFileSelect:
LDA.b #$51 : STA.w $0AA2 ;<-- Line missing from JP1.0, needed to ensure "extra" copy of naming screen graphics are loaded.
JSL.l EnableForceBlank
JSL EnableForceBlank
RTL
;--------------------------------------------------------------------------------
OnLinkDamaged:
JSL.l IncrementDamageTakenCounter_Arb
JML.l OHKOTimer
JSL IncrementDamageTakenCounter_Arb
JML OHKOTimer
;--------------------------------------------------------------------------------
;OnEnterWater:
; JSL.l UnequipCapeQuiet ; what we wrote over
; JSL UnequipCapeQuiet ; what we wrote over
;RTL
;--------------------------------------------------------------------------------
OnLinkDamagedFromPit:
JSL.l OHKOTimer
JSL OHKOTimer
LDA.l AllowAccidentalMajorGlitch
BEQ ++
@@ -218,15 +222,15 @@ OnLinkDamagedFromPit:
RTL
;--------------------------------------------------------------------------------
OnLinkDamagedFromPitOutdoors:
JML.l OHKOTimer ; make sure this is last
JML OHKOTimer ; make sure this is last
;--------------------------------------------------------------------------------
OnOWTransition:
JSL.l FloodGateReset
JSL.l StatTransitionCounter
JSL FloodGateReset
JSL StatTransitionCounter
PHP
SEP #$20 ; set 8-bit accumulator
LDA.b #$FF : STA.l RNGLockIn ; clear lock-in
INC.w UpdateHUDFlag
LDA.b #$01 : STA.l UpdateHUDFlag
PLP
RTL
;--------------------------------------------------------------------------------
@@ -245,7 +249,7 @@ PreItemGet:
RTL
;--------------------------------------------------------------------------------
PostItemGet:
STZ.w ShopPurchaseFlag
STZ.w ProgressiveFlag
LDA.w ItemReceiptMethod : CMP.b #$01 : BEQ +
LDX.w CurrentSpriteSlot
STZ.w SpriteMetaData,X
@@ -257,13 +261,31 @@ PostItemAnimation:
LDA.b #$00 : STA.l BusyItem ; mark item as finished
LDA.l TextBoxDefer : BEQ +
STZ.w TextID : STZ.w TextID+1 ; reset decompression buffer
JSL.l Main_ShowTextMessage_Alt
JSL Main_ShowTextMessage_Alt
LDA.b #$00 : STA.l TextBoxDefer
+
LDA.w ItemReceiptMethod : CMP.b #$01 : BNE +
LDA.b LinkDirection : BEQ +
JSL.l IncrementChestTurnCounter
LDA.b LinkDirection : BEQ +
JSL IncrementChestTurnCounter
+
LDA.b IndoorsFlag : BEQ +
REP #$20 : LDA.b RoomIndex : STA.l !MULTIWORLD_ROOMID : SEP #$20
LDA.w RoomItemsTaken : STA.l !MULTIWORLD_ROOMDATA
LDA $1B : BEQ +
REP #$20 : LDA $A0 : STA !MULTIWORLD_ROOMID : SEP #$20
LDA $0403 : STA !MULTIWORLD_ROOMDATA
+
LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BEQ +
STZ.w ItemReceiptMethod
LDA.b #$00 : STA.l !MULTIWORLD_ITEM_PLAYER_ID
PLB
JML Ancilla_ReceiveItem_objectFinished
+
REP #$20
PEA.w $7E00
PLB : PLB
@@ -292,5 +314,5 @@ PostItemAnimation:
STZ.w ItemReceiptMethod : LDA.w AncillaGet, X ; thing we wrote over to get here
PLB
RTL
JML Ancilla_ReceiveItem_optimus+6
;--------------------------------------------------------------------------------

View File

@@ -27,7 +27,7 @@ DontUseZSNES:
LDA.b #$00
STA.l NMITIMEN ; disable NMI and IRQ
STA.l HDMAEN ; disable HDMA
STA.l HDMAENABLE ; disable HDMA
ROR ; A = 0x80 from carry
STA.l INIDISP
@@ -48,7 +48,7 @@ DontUseZSNES:
STA.l DAS0L
LDA.w #$0001
STA.l MDMAEN
STA.l DMAENABLE
JSR ConfigurePPUForFailureReport
JSR ConfigureBSODVWF
@@ -93,7 +93,7 @@ Crashed:
LDA.b #$00
STA.l NMITIMEN ; disable NMI and IRQ
STA.l HDMAEN ; disable HDMA
STA.l HDMAENABLE ; disable HDMA
ROR ; A = 0x80 from carry
STA.l INIDISP
@@ -114,7 +114,7 @@ Crashed:
STA.l DAS0L
LDA.w #$0001
STA.l MDMAEN
STA.l DMAENABLE
;===================================================================================================
@@ -312,7 +312,7 @@ DrawVWFMessage:
STZ.w A1B0
LDA.b #$01
STA.w MDMAEN
STA.w DMAENABLE
REP #$20
@@ -376,7 +376,7 @@ DrawFailureVWFChar:
LDY.w #$0000
.next_row
LDA.b ($08),Y
LDA.b (Scrap08),Y
AND.w #$00FF
XBA
LDX.w VWFS
@@ -427,7 +427,7 @@ LoadBSODHexFont:
STA.w A1B0
LDA.b #$01
STA.w MDMAEN
STA.w DMAENABLE
REP #$30
@@ -467,7 +467,7 @@ ConfigureBSODVWF:
PEA.w $0001
LDA.w #15
STA.w $28
STA.w LinkRecoilX
LDA.w #$0042>>1
BRA .start
@@ -475,13 +475,13 @@ ConfigureBSODVWF:
.next_row
PHA
LDA.w $20
LDA.w LinkPosY
CLC
LDA.w $20
LDA.w LinkPosY
ADC.w #32
.start
STA.w $20
STA.w LinkPosY
STA.b VMADDL
PLA
@@ -494,7 +494,7 @@ ConfigureBSODVWF:
DEY
BNE .next_char
DEC.w $28
DEC.w LinkRecoilX
BNE .next_row
LDA.w #$0000

View File

@@ -27,9 +27,9 @@ RTL
FairyPond_Init:
LDA.l Restrict_Ponds : BNE +
LDA.b #$48
JML.l Sprite_ShowMessageFromPlayerContact
JML Sprite_ShowMessageFromPlayerContact
+
PHY : JSL.l Sprite_CheckDamageToPlayerSameLayerLong : BCC +
PHY : JSL Sprite_CheckDamageToPlayerSameLayerLong : BCC +
LDA.l BottleContentsOne : CMP.b #$02 : BNE ++ : LDA.b #$1C : PHA : BRA .emptyBottle : ++
LDA.l BottleContentsTwo : CMP.b #$02 : BNE ++ : LDA.b #$1D : PHA : BRA .emptyBottle : ++
LDA.l BottleContentsThree : CMP.b #$02 : BNE ++ : LDA.b #$1E : PHA : BRA .emptyBottle : ++
@@ -38,7 +38,7 @@ FairyPond_Init:
LDA.b #$0A : STA.w SpriteActivity, X
LDA.b #$51
LDY.b #$01
JSL.l Sprite_ShowMessageFromPlayerContact
JSL Sprite_ShowMessageFromPlayerContact
JMP .cleanup
.emptyBottle

View File

@@ -23,7 +23,7 @@ FlagFastCredits:
TSB.b FastCreditsActive
.slow
LDA.b $11
LDA.b GameSubMode
ASL
TAX
@@ -79,10 +79,10 @@ FastCreditsCutsceneScrollY:
FastCreditsCutsceneScroll:
LDA.w $00E2,Y
CMP.l $8EC308,X ; compare to target
CMP.l Credits_ScrollScene_target_y,X ; compare to target
ROL.b Scrap00 ; put carry in here
LDA.l $8EC348,X ; get movement
LDA.l Credits_ScrollScene_movement_y,X ; get movement
BPL ++ ; if positive, leave saved carry alone
INC.b Scrap00 ; otherwise, flip it
++ ROR.b Scrap00 ; recover carry

File diff suppressed because it is too large Load Diff

View File

@@ -23,12 +23,12 @@ macro fs_draw16x8(screenrow,screencol)
endmacro
macro fs_draw8x16(screenrow,screencol)
%fs_draw8x8(<screenrow>,<screencol>)
!ADD #$0010
!ADD.w #$0010
%fs_draw8x8(<screenrow>+1,<screencol>)
endmacro
macro fs_draw16x16(screenrow,screencol)
%fs_draw16x8(<screenrow>,<screencol>)
!ADD #$000F
!ADD.w #$000F
%fs_draw16x8(<screenrow>+1,<screencol>)
endmacro
@@ -299,7 +299,13 @@ DrawPlayerFileShared:
%fs_drawItemBasic(EquipmentSRAM+$12,9,18,FileSelectItems_cape)
; Mirror
%fs_drawItemBasic(EquipmentSRAM+$13,9,20,FileSelectItems_mirror)
LDA.l EquipmentSRAM+$13 : AND.w #$00FF : BEQ +
CMP.w #$0001 : BNE +
%fs_drawItem(9,20,FileSelectItems_mirrorScroll)
BRA ++
+
%fs_drawItemBasic(EquipmentSRAM+$13,9,20,FileSelectItems_mirror)
++
; Bottles
%fs_drawBottle(EquipmentSRAM+$1C,3,23)
@@ -308,16 +314,15 @@ DrawPlayerFileShared:
%fs_drawBottle(EquipmentSRAM+$1F,9,23)
; Sword
LDA.l SpecialWeapons : AND.w #$007F : CMP #$0001 : BEQ .bombSword
LDA.l EquipmentSRAM+$19 : AND.w #$00FF : BNE +
%fs_drawItemGray(3,26,FileSelectItems_fighters_sword)
JMP ++
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_fighters_sword)
JMP ++
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_master_sword)
JMP ++
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_tempered_sword)
BRA ++
@@ -327,29 +332,6 @@ DrawPlayerFileShared:
+
; a sword value above 4 is either corrupted or 0xFF (a.k.a. swordless)
%fs_drawItemGray(3,26,FileSelectItems_fighters_sword)
BRA ++
.bombSword
LDA.l SpecialWeaponLevelSRAM : AND.w #$00FF : BNE +
%fs_drawItemGray(3,26,FileSelectItems_fighters_bombs)
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_fighters_bombs)
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_master_bombs)
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_tempered_bombs)
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_gold_bombs)
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_extra_gold_bombs)
BRA ++
+
; a bomb value above 5 is... who knows, let's just pretend it's 5
%fs_drawItem(3,26,FileSelectItems_extra_gold_bombs)
++
; Shield
@@ -409,12 +391,18 @@ DrawPlayerFileShared:
++
LDA.l EquipmentSRAM+$0130 : AND.w #$00FF
JSL.l HexToDec
JSL HexToDec
LDA.l HexToDecDigit4 : AND.w #$00FF : ORA.w #!FS_COLOR_BW|$02E0 : %fs_draw8x8(11,26)
LDA.l HexToDecDigit5 : AND.w #$00FF : ORA.w #!FS_COLOR_BW|$02E0 : %fs_draw8x8(11,27)
; Boots
%fs_drawItemBasic(EquipmentSRAM+$15,3,28,FileSelectItems_boots)
LDA.l EquipmentSRAM+$15 : AND.w #$00FF : BNE +
LDA.l FakeBoots : AND.w #$00FF : BEQ +
%fs_drawItem(3,28,FileSelectItems_fakeBoots)
BRA ++
+
%fs_drawItemBasic(EquipmentSRAM+$15,3,28,FileSelectItems_boots)
++
; Gloves
LDA.l EquipmentSRAM+$14 : AND.w #$00FF : BNE +
@@ -561,12 +549,16 @@ FileSelectItems:
dw #$0288|!FS_COLOR_RED, #$0289|!FS_COLOR_RED, #$0298|!FS_COLOR_RED, #$0299|!FS_COLOR_RED
.mirror
dw #$028A|!FS_COLOR_BLUE, #$028B|!FS_COLOR_BLUE, #$029A|!FS_COLOR_BLUE, #$029B|!FS_COLOR_BLUE
.mirrorScroll
dw #$02C2|!FS_COLOR_YELLOW, #$02C3|!FS_COLOR_YELLOW, #$02D2|!FS_COLOR_YELLOW, #$02d3|!FS_COLOR_YELLOW
.flippers
dw #$024E|!FS_COLOR_BLUE, #$024F|!FS_COLOR_BLUE, #$025F|!FS_COLOR_BLUE|!FS_HFLIP, #$025F|!FS_COLOR_BLUE
.boots
dw #$028C|!FS_COLOR_BOOTS, #$028D|!FS_COLOR_BOOTS, #$029C|!FS_COLOR_BOOTS, #$029D|!FS_COLOR_BOOTS
.fakeBoots
dw #$028C|!FS_COLOR_BLUE, #$028D|!FS_COLOR_BLUE, #$029C|!FS_COLOR_BLUE, #$029D|!FS_COLOR_BLUE
.pearl
dw #$02A4|!FS_COLOR_RED, #$02A5|!FS_COLOR_RED, #$02B4|!FS_COLOR_RED, #$02B5|!FS_COLOR_RED
@@ -628,136 +620,105 @@ FileSelectItems:
.good_bee_bottle
dw #$0280|!FS_COLOR_BW, #$0281|!FS_COLOR_BW, #$0294|!FS_COLOR_YELLOW, #$0286|!FS_COLOR_YELLOW
.fighters_bombs
dw #$024C|!FS_COLOR_GREEN, #$024D|!FS_COLOR_GREEN, #$025C|!FS_COLOR_GREEN, #$02E1|!FS_COLOR_GREEN
.master_bombs
dw #$024C|!FS_COLOR_BLUE, #$024D|!FS_COLOR_BLUE, #$025C|!FS_COLOR_BLUE, #$02E2|!FS_COLOR_BLUE
.tempered_bombs
dw #$024C|!FS_COLOR_RED, #$024D|!FS_COLOR_RED, #$025C|!FS_COLOR_RED, #$02E3|!FS_COLOR_RED
.gold_bombs
dw #$024C|!FS_COLOR_YELLOW, #$024D|!FS_COLOR_YELLOW, #$025C|!FS_COLOR_YELLOW, #$02E4|!FS_COLOR_YELLOW
.extra_gold_bombs
dw #$024C|!FS_COLOR_YELLOW, #$024D|!FS_COLOR_YELLOW, #$025C|!FS_COLOR_YELLOW, #$02E5|!FS_COLOR_YELLOW
;--------------------------------------------------------------------------------
FileSelectDrawHudBar:
LDA.w #$02DB|!FS_COLOR_GREEN : %fs_draw16x8(0,10)
LDA.l DisplayRupeesSRAM
JSL.l HUDHex4Digit_Long
LDA.b Scrap04 : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,9)
LDA.b Scrap05 : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,10)
LDA.b Scrap06 : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,11)
LDA.b Scrap07 : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,12)
LDA.w #$02DB|!FS_COLOR_GREEN : %fs_draw16x8(0,10)
LDA.l DisplayRupeesSRAM
JSL HUDHex4Digit_Long
LDA.b Scrap04 : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,9)
LDA.b Scrap05 : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,10)
LDA.b Scrap06 : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,11)
LDA.b Scrap07 : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,12)
LDA.l SpecialWeapons : AND.w #$007F : CMP.w #$0001 : BEQ .colorBombs
LDA.w #$02CB|!FS_COLOR_BLUE : %fs_draw16x8(0,14)
LDA.l BombsEquipmentSRAM : AND.w #$00FF
JSL.l HUDHex2Digit_Long
TYA : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,14)
TXA : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,15)
BRA ++
LDA.w #$02CB|!FS_COLOR_BLUE : %fs_draw16x8(0,14)
LDA.l BombsEquipmentSRAM : AND.w #$00FF
JSL HUDHex2Digit_Long
TYA : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,14)
TXA : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,15)
.colorBombs
LDA.l SpecialWeaponLevelSRAM : AND.w #$00FF : BNE +
; no bombs, draw no icon
BRA ++
+ : DEC : BNE +
LDA.w #$02CB|!FS_COLOR_GREEN : %fs_draw16x8(0,14)
BRA ++
+ : DEC : BNE +
LDA.w #$02CB|!FS_COLOR_BLUE : %fs_draw16x8(0,14)
BRA ++
+ : DEC : BNE +
LDA.w #$02CB|!FS_COLOR_RED : %fs_draw16x8(0,14)
BRA ++
+
LDA.w #$02CB|!FS_COLOR_YELLOW : %fs_draw16x8(0,14)
++
LDA.l BowTrackingSRAM : AND.w #$0040 : BEQ +
LDA.w #$02D9|!FS_COLOR_RED : %fs_draw16x8(0,17)
BRA ++
+
LDA.w #$02C9|!FS_COLOR_BROWN : %fs_draw16x8(0,17)
++
LDA.l CurrentArrowsSRAM : AND.w #$00FF
JSL.l HUDHex2Digit_Long
TYA : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,17)
TXA : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,18)
LDA.l BowTrackingSRAM : AND.w #$0040 : BEQ +
LDA.w #$02D9|!FS_COLOR_RED : %fs_draw16x8(0,17)
BRA ++
+
LDA.w #$02C9|!FS_COLOR_BROWN : %fs_draw16x8(0,17)
++
LDA.l CurrentArrowsSRAM : AND.w #$00FF
JSL HUDHex2Digit_Long
TYA : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,17)
TXA : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,18)
RTS
;--------------------------------------------------------------------------------
AltBufferTable:
LDA.b #$02 : STA.w BG34NBA ; Have Screen 3 use same tile area as screens 1
.noScreen3Change
REP #$20
LDX.w #$0400 ; 14 rows with 64 bytes (30 tiles * 2 + 4 byte header)
;fill with the blank character
LDA.w #$0188
-
STA.w GFXStripes, X
DEX : DEX : BNE -
LDA.b #$02 : STA.w BG34NBA ; Have Screen 3 use same tile area as screens 1
.noScreen3Change
REP #$20
LDX.w #$0400 ; 14 rows with 64 bytes (30 tiles * 2 + 4 byte header)
;fill with the blank character
LDA.w #$0188
-
STA.w GFXStripes, X
DEX : DEX : BNE -
; set vram offsets
LDA.w #$0161 : STA.w GFXStripes+$02 ;file 1 top row
LDA.w #$2161 : STA.w GFXStripes+$42 ;file 1 bottom row
; set vram offsets
LDA.w #$0161 : STA.w GFXStripes+$02 ;file 1 top row
LDA.w #$2161 : STA.w GFXStripes+$42 ;file 1 bottom row
LDA.w #$4161 : STA.w GFXStripes+$82 ;gap row top
LDA.w #$6161 : STA.w GFXStripes+$C2 ;gap row bottom
LDA.w #$4161 : STA.w GFXStripes+$82 ;gap row top
LDA.w #$6161 : STA.w GFXStripes+$C2 ;gap row bottom
LDA.w #$8161 : STA.w GFXStripes+$0102 ;file 2 top row
LDA.w #$A161 : STA.w GFXStripes+$0142 ;file 2 bottom row
LDA.w #$8161 : STA.w GFXStripes+$0102 ;file 2 top row
LDA.w #$A161 : STA.w GFXStripes+$0142 ;file 2 bottom row
LDA.w #$C161 : STA.w GFXStripes+$0182 ;gap row top
LDA.w #$E161 : STA.w GFXStripes+$01C2 ;gap row bottom
LDA.w #$C161 : STA.w GFXStripes+$0182 ;gap row top
LDA.w #$E161 : STA.w GFXStripes+$01C2 ;gap row bottom
LDA.w #$0162 : STA.w GFXStripes+$0202 ;file 3 top row
LDA.w #$2162 : STA.w GFXStripes+$0242 ;file 3 bottom row
LDA.w #$0162 : STA.w GFXStripes+$0202 ;file 3 top row
LDA.w #$2162 : STA.w GFXStripes+$0242 ;file 3 bottom row
LDA.w #$4162 : STA.w GFXStripes+$0282 ;extra gap row top
LDA.w #$6162 : STA.w GFXStripes+$02C2 ;extra gap row bottom
LDA.w #$4162 : STA.w GFXStripes+$0282 ;extra gap row top
LDA.w #$6162 : STA.w GFXStripes+$02C2 ;extra gap row bottom
LDA.w #$8162 : STA.w GFXStripes+$0302 ;extra gap row top
LDA.w #$A162 : STA.w GFXStripes+$0342 ;extra gap row bottom
LDA.w #$8162 : STA.w GFXStripes+$0302 ;extra gap row top
LDA.w #$A162 : STA.w GFXStripes+$0342 ;extra gap row bottom
LDA.w #$C162 : STA.w GFXStripes+$0382 ;extra gap row top
LDA.w #$E162 : STA.w GFXStripes+$03C2 ;extra gap row bottom
LDA.w #$C162 : STA.w GFXStripes+$0382 ;extra gap row top
LDA.w #$E162 : STA.w GFXStripes+$03C2 ;extra gap row bottom
; set lengths
LDA.w #$3B00
STA.w GFXStripes+$04 ;file 1 top row
STA.w GFXStripes+$44 ;file 1 bottom row
STA.w GFXStripes+$84 ;gap row top
STA.w GFXStripes+$C4 ;gap row bottom
STA.w GFXStripes+$0104 ;file 2 top row
STA.w GFXStripes+$0144 ;file 2 bottom row
STA.w GFXStripes+$0184 ;gap row top
STA.w GFXStripes+$01C4 ;gap row bottom
STA.w GFXStripes+$0204 ;file 3 top row
STA.w GFXStripes+$0244 ;file 3 bottom row
STA.w GFXStripes+$0284 ;extra gap row top
STA.w GFXStripes+$02C4 ;extra gap row bottom
STA.w GFXStripes+$0304 ;extra gap row top
STA.w GFXStripes+$0344 ;extra gap row bottom
STA.w GFXStripes+$0384 ;extra gap row top
STA.w GFXStripes+$03C4 ;extra gap row bottom
; set lengths
LDA.w #$3B00
STA.w GFXStripes+$04 ;file 1 top row
STA.w GFXStripes+$44 ;file 1 bottom row
STA.w GFXStripes+$84 ;gap row top
STA.w GFXStripes+$C4 ;gap row bottom
STA.w GFXStripes+$0104 ;file 2 top row
STA.w GFXStripes+$0144 ;file 2 bottom row
STA.w GFXStripes+$0184 ;gap row top
STA.w GFXStripes+$01C4 ;gap row bottom
STA.w GFXStripes+$0204 ;file 3 top row
STA.w GFXStripes+$0244 ;file 3 bottom row
STA.w GFXStripes+$0284 ;extra gap row top
STA.w GFXStripes+$02C4 ;extra gap row bottom
STA.w GFXStripes+$0304 ;extra gap row top
STA.w GFXStripes+$0344 ;extra gap row bottom
STA.w GFXStripes+$0384 ;extra gap row top
STA.w GFXStripes+$03C4 ;extra gap row bottom
; Set last packet marker
LDA.w #$00FF : STA.w GFXStripes+$0402
; Set last packet marker
LDA.w #$00FF : STA.w GFXStripes+$0402
; Draw Unlock option if applicable
LDA.b GameMode : AND.w #$00FF : CMP.w #$0001 : BNE +
LDA.l IsEncrypted : AND.w #$00FF : CMP.w #$0002 : BNE +
PHP : SEP #$30 : PHX : PHY : JSL ValidatePassword : PLY : PLX : PLP
AND.w #$00FF : BNE +
LDA.w #!FSTILE_U_TOP : %fs_draw8x16(14,5)
LDA.w #!FSTILE_N_TOP : %fs_draw8x16(14,6)
LDA.w #!FSTILE_L_TOP : %fs_draw8x16(14,7)
LDA.w #!FSTILE_O_TOP : %fs_draw8x16(14,8)
LDA.w #!FSTILE_C_TOP : %fs_draw8x16(14,9)
LDA.w #!FSTILE_K_TOP : %fs_draw8x16(14,10)
+
SEP #$20
; Draw Unlock option if applicable
LDA.b GameMode : AND.w #$00FF : CMP.w #$0001 : BNE +
LDA.l IsEncrypted : AND.w #$00FF : CMP.w #$0002 : BNE +
PHP : SEP #$30 : PHX : PHY : JSL ValidatePassword : PLY : PLX : PLP
AND.w #$00FF : BNE +
LDA.w #!FSTILE_U_TOP : %fs_draw8x16(14,5)
LDA.w #!FSTILE_N_TOP : %fs_draw8x16(14,6)
LDA.w #!FSTILE_L_TOP : %fs_draw8x16(14,7)
LDA.w #!FSTILE_O_TOP : %fs_draw8x16(14,8)
LDA.w #!FSTILE_C_TOP : %fs_draw8x16(14,9)
LDA.w #!FSTILE_K_TOP : %fs_draw8x16(14,10)
+
SEP #$20
RTL
;--------------------------------------------------------------------------------
@@ -765,31 +726,31 @@ AltBufferTable_credits:
JSL AltBufferTable_noScreen3Change
REP #$20
LDA.w #$6168 : STA.w GFXStripes+$02 ;file 1 top row
LDA.w #$8168 : STA.w GFXStripes+$42 ;file 1 bottom row
LDA.w #$6168 : STA.w GFXStripes+$02 ;file 1 top row
LDA.w #$8168 : STA.w GFXStripes+$42 ;file 1 bottom row
LDA.w #$A168 : STA.w GFXStripes+$82 ;gap row top
LDA.w #$C168 : STA.w GFXStripes+$C2 ;gap row bottom
LDA.w #$A168 : STA.w GFXStripes+$82 ;gap row top
LDA.w #$C168 : STA.w GFXStripes+$C2 ;gap row bottom
LDA.w #$E168 : STA.w GFXStripes+$0102 ;file 2 top row
LDA.w #$0169 : STA.w GFXStripes+$0142 ;file 2 bottom row
LDA.w #$E168 : STA.w GFXStripes+$0102 ;file 2 top row
LDA.w #$0169 : STA.w GFXStripes+$0142 ;file 2 bottom row
LDA.w #$2169 : STA.w GFXStripes+$0182 ;gap row top
LDA.w #$4169 : STA.w GFXStripes+$01c2 ;gap row bottom
LDA.w #$2169 : STA.w GFXStripes+$0182 ;gap row top
LDA.w #$4169 : STA.w GFXStripes+$01c2 ;gap row bottom
LDA.w #$6169 : STA.w GFXStripes+$0202 ;file 3 top row
LDA.w #$8169 : STA.w GFXStripes+$0242 ;file 3 bottom row
LDA.w #$6169 : STA.w GFXStripes+$0202 ;file 3 top row
LDA.w #$8169 : STA.w GFXStripes+$0242 ;file 3 bottom row
LDA.w #$A169 : STA.w GFXStripes+$0282 ;extra gap row top
LDA.w #$C169 : STA.w GFXStripes+$02C2 ;extra gap row bottom
LDA.w #$A169 : STA.w GFXStripes+$0282 ;extra gap row top
LDA.w #$C169 : STA.w GFXStripes+$02C2 ;extra gap row bottom
LDA.w #$E169 : STA.w GFXStripes+$0302 ;extra gap row top
LDA.w #$016A : STA.w GFXStripes+$0342 ;extra gap row bottom
LDA.w #$E169 : STA.w GFXStripes+$0302 ;extra gap row top
LDA.w #$016A : STA.w GFXStripes+$0342 ;extra gap row bottom
LDA.w #$216A : STA.w GFXStripes+$0382 ;extra gap row top
LDA.w #$416A : STA.w GFXStripes+$03C2 ;extra gap row bottom
LDA.w #$216A : STA.w GFXStripes+$0382 ;extra gap row top
LDA.w #$416A : STA.w GFXStripes+$03C2 ;extra gap row bottom
SEP #$20
SEP #$20
RTL
;--------------------------------------------------------------------------------
macro LayoutPriority(address)
@@ -819,14 +780,14 @@ RTL
;--------------------------------------------------------------------------------
LoadFullItemTiles:
LDA.b #$80 : STA.w VMAIN
LDA.b #$01 : STA.w DMAP0
LDA.b #$18 : STA.w BBAD0
LDX.w #$3200 : STX.w VMADDL
LDA.b #FileSelectNewGraphics>>16 : STA.w A1B0
LDX.w #FileSelectNewGraphics : STX.w A1T0L
LDX.w #$0C00 : STX.w DAS0L
LDA.b #$01 : STA.w MDMAEN
LDA.b #$80 : STA.w VMAIN
LDA.b #$01 : STA.w DMAP0
LDA.b #$18 : STA.w BBAD0
LDX.w #$3200 : STX.w VMADDL
LDA.b #FileSelectNewGraphics>>16 : STA.w A1B0
LDX.w #FileSelectNewGraphics : STX.w A1T0L
LDX.w #$0C00 : STX.w DAS0L
LDA.b #$01 : STA.w DMAENABLE
RTL
;--------------------------------------------------------------------------------
; z colon @
@@ -834,54 +795,54 @@ RTL
; target vram $6C00
; NewFont+$400
LoadLowerCaseLettersSymbols:
LDA.b #$80 : STA.w VMAIN
LDA.b #$01 : STA.w DMAP0
LDA.b #$18 : STA.w BBAD0
LDA.b #$80 : STA.w VMAIN
LDA.b #$01 : STA.w DMAP0
LDA.b #$18 : STA.w BBAD0
; Lower case letters
LDA.b #NewFont>>16 : STA.w A1B0
LDX.w #NewFont+$400 : STX.w A1T0L
LDX.w #$0400 : STX.w DAS0L
LDX.w #$2D00 : STX.w VMADDL
LDA.b #$01 : STA.w MDMAEN
; Lower case letters
LDA.b #NewFont>>16 : STA.w A1B0
LDX.w #NewFont+$400 : STX.w A1T0L
LDX.w #$0400 : STX.w DAS0L
LDX.w #$2D00 : STX.w VMADDL
LDA.b #$01 : STA.w DMAENABLE
; : @ #
LDA.b #NewFont>>16 : STA.w A1B0
LDX.w #NewFont+$A80 : STX.w A1T0L
LDA.b #NewFont>>16 : STA.w A1B1
LDX.w #NewFont+$B80 : STX.w A1T1L
LDX.w #$0030 : STX.w DAS0L : STX.w DAS1L
; : @ #
LDA.b #NewFont>>16 : STA.w A1B0
LDX.w #NewFont+$A80 : STX.w A1T0L
LDA.b #NewFont>>16 : STA.w A1B1
LDX.w #NewFont+$B80 : STX.w A1T1L
LDX.w #$0030 : STX.w DAS0L : STX.w DAS1L
LDX.w #$2E50 : STX.w VMADDL
LDA.b #$01 : STA.w MDMAEN
LDX.w #$2ED0 : STX.w VMADDL
LDA.b #$02 : STA.w MDMAEN
LDX.w #$2E50 : STX.w VMADDL
LDA.b #$01 : STA.w DMAENABLE
LDX.w #$2ED0 : STX.w VMADDL
LDA.b #$02 : STA.w DMAENABLE
RTL
;--------------------------------------------------------------------------------
LoadFileSelectVanillaItems:
REP #$10
LDA.b #$80 : STA.w VMAIN
LDA.b #$01 : STA.w DMAP0
LDA.b #$18 : STA.w BBAD0
REP #$10
LDA.b #$80 : STA.w VMAIN
LDA.b #$01 : STA.w DMAP0
LDA.b #$18 : STA.w BBAD0
; Lower case letters
LDA.b #DecompBuffer2>>16 : STA.w A1B0
LDX.w #DecompBuffer2 : STX.w A1T0L
LDX.w #$0600 : STX.w DAS0L
LDX.w #$2F00 : STX.w VMADDL
LDA.b #$01 : STA.w MDMAEN
; Lower case letters
LDA.b #DecompBuffer2>>16 : STA.w A1B0
LDX.w #DecompBuffer2 : STX.w A1T0L
LDX.w #$0600 : STX.w DAS0L
LDX.w #$2F00 : STX.w VMADDL
LDA.b #$01 : STA.w DMAENABLE
SEP #$10
SEP #$10
RTL
;--------------------------------------------------------------------------------
SetFileSelectPalette:
LDA.b GameMode : CMP.b #$04 : BNE +
; load the vanilla file select screen BG3 palette for naming screen
LDA.b #$01 : STA.w $0AB2
JSL.l Palette_Hud
JSL Palette_Hud
BRA .done
+
JSL.l LoadCustomHudPalette
JSL LoadCustomHudPalette
.done
JML Palette_SelectScreen ; Jump to the subroutine whose call we wrote over
@@ -914,7 +875,7 @@ DrawPlayerFile_credits:
%fs_draw8x16(3,7)
LDA.l EquipmentSRAM+$9F : ORA.w #!FS_COLOR_BW
%fs_draw8x16(3,8)
LDA.l EquipmentSRAM+$2C : AND.w #$00FF : LSR #3 : STA.b Scrap02
%fs_LDY_screenpos(0,20)
LDA.l HUDHeartColors_index : ASL : TAX
@@ -987,20 +948,20 @@ JML FSSelectFile_continue
JML FSSelectFile_return
;--------------------------------------------------------------------------------
MaybeForceFileName:
LDA.l ForceFileName : BEQ +
REP #$20
LDX.b #$FE
-
INX : INX
LDA.l StaticFileName, X : STA.l ExtendedFileNameSRAM, X
CPX.b #$16 : BEQ .done
CPX.b #$08 : BCS -
STA.l FileNameVanillaSRAM, X
BRA -
.done
SEP #$20
JML.l InitializeSaveFile
LDA.l ForceFileName : BEQ +
REP #$20
LDX.b #$FE
-
INX : INX
LDA.l StaticFileName, X : STA.l ExtendedFileNameSRAM, X
CPX.b #$16 : BEQ .done
CPX.b #$08 : BCS -
STA.l FileNameVanillaSRAM, X
BRA -
.done
SEP #$20
JML InitializeSaveFile
+
JML.l NameFile_MakeScreenVisible
+
JML NameFile_MakeScreenVisible
;--------------------------------------------------------------------------------

View File

@@ -43,7 +43,7 @@ protectff:
BMI .special_overworld
AND.b #$3F
CMP.l $82A4E3,X
CMP.l Overworld_ActualScreenID,X
BEQ ++
.protect

View File

@@ -2,7 +2,7 @@
; Floodgate Softlock Fix
;--------------------------------------------------------------------------------
FloodGateAndMasterSwordFollowerReset:
JSL.l MasterSwordFollowerClear
JSL MasterSwordFollowerClear
FloodGateReset:
LDA.l PersistentFloodgate : BNE +
LDA.l OverworldEventDataWRAM+$3B : AND.b #$DF : STA.l OverworldEventDataWRAM+$3B ; reset water outside floodgate
@@ -10,16 +10,23 @@ FloodGateReset:
LDA.l RoomDataWRAM[$010B].low : AND.b #$7F : STA.l RoomDataWRAM[$010B].low ; clear water inside floodgate
LDA.l RoomDataWRAM[$28].high : AND.b #$FE : STA.l RoomDataWRAM[$28].high ; clear water front room (room 40)
+
; note - official sram for getting keys under pots has changed for DR, see RoomPotData
FloodGateResetInner:
LDA.l Bugfix_SwampWaterLevel : BEQ +++
LDA.l RoomDataWRAM[$37].low : AND.b #$04 : BEQ + ; Check if key in room 55 has been collected.
LDA.l FlippersEquipment : AND.b #$01 : BNE ++ ; Check for flippers. This can otherwise softlock doors if flooded without flippers and no way to reset.
+
LDA.l RoomDataWRAM[$37].low : AND.b #$7F : STA.l RoomDataWRAM[$37].low ; clear water room 55 - outer room you shouldn't be able to softlock except in major glitches
++
LDA.l RoomDataWRAM[$35].high : AND.b #$04 : BNE +++ ; Check if key in room 53 has been collected.
; no need to check for flippers on the inner room, as you can't get to the west door no matter what, without flippers.
LDA.l RoomDataWRAM[$35].low : AND.b #$7F : STA.l RoomDataWRAM[$35].low ; clear water room 53 - inner room with the easy key flood softlock
+++
LDA.l Bugfix_SwampWaterLevel : BEQ .done
LDA.l DRMode : BEQ .check_room_35; Only do the check for room 37 if on door rando
LDA.l SwampDrain1HasItem : BEQ .flipper_check
LDA.l $7F666F : AND.b #$80 : BEQ .drain_room_37 ; Check if key in room 37 has been collected.
.flipper_check
LDA.l FlippersEquipment : AND.b #$01 : BNE .check_room_35 ; Check for flippers. This can otherwise softlock doors if flooded without flippers and no way to reset.
.drain_room_37
LDA.l RoomDataWRAM[$37].low : AND.b #$7F : STA.l RoomDataWRAM[$37].low ; clear water room 37 - outer room you shouldn't be able to softlock except in major glitches
.check_room_35
LDA.l SwampDrain2HasItem : BEQ .done
LDA.l $7F666B : AND.b #$80 : BNE .done ; Check if key in room 35 has been collected.
; no need to check for flippers on the inner room, as you can't get to the west door no matter what, without flippers.
LDA.l RoomDataWRAM[$35].low : AND.b #$7F : STA.l RoomDataWRAM[$35].low ; clear water room 35 - inner room with the easy key flood softlock
.done
RTL
;================================================================================

View File

@@ -5,6 +5,9 @@ SpawnHauntedGroveItem:
LDA.b OverworldIndex : CMP.b #$2A : BEQ + : RTL : + ; Skip if not the haunted grove
LDA.b IndoorsFlag : BEQ + : RTL : + ; Skip if indoors
; todo - how does this work now?
LDA.l HauntedGroveItem_Player : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID
LDA.b #$EB
STA.l MiniGameTime
JSL Sprite_SpawnDynamically
@@ -51,10 +54,10 @@ RTL
FluteBoy:
LDA.b GameMode : CMP.b #$1A : BEQ +
LDA.b #$01 : STA.w $0FDD
JML.l FluteBoy_Abort
JML FluteBoy_Abort
+
LDA.w SpriteActivity, X : CMP.b #$03 ; thing we wrote over
JML.l FluteBoy_Continue
JML FluteBoy_Continue
;--------------------------------------------------------------------------------
FreeDuckCheck:
LDA.l InvertedMode : BEQ .done

View File

@@ -2,10 +2,10 @@
; Frame Hook
;--------------------------------------------------------------------------------
FrameHookAction:
JSL $8080B5 ; Module_MainRouting
JSL Module_MainRouting
JSL CheckMusicLoadRequest
PHP : REP #$30 : PHA
SEP #$20
SEP #$20
LDA.l StatsLocked : BNE ++
REP #$20 ; set 16-bit accumulator
LDA.l LoopFrames : INC : STA.l LoopFrames : BNE +
@@ -18,15 +18,33 @@ FrameHookAction:
REP #$30 : PLA : PLP
RTL
!NMI_MW = "$7F5047"
;--------------------------------------------------------------------------------
NMIHookAction:
PHA : PHX : PHY : PHD ; thing we wrote over, push stuff
LDA.l StatsLocked : AND.w #$00FF : BNE +
LDA.l NMIFrames : INC : STA.l NMIFrames : BNE +
LDA.l NMIFrames+2 : INC : STA.l NMIFrames+2
+
PHA : PHX : PHY : PHD ; thing we wrote over, push stuff
LDA.l !NMI_MW : BEQ ++
PHP
SEP #$30
LDA.b #$00 : STA.l !NMI_MW
; Multiworld text
LDA.l !NMI_MW+1 : BEQ +
LDA.b #$00 : STA.l !NMI_MW+1
JSL WriteText
+
PLP
++
LDA.l StatsLocked : AND.w #$00FF : BNE +
LDA.l NMIFrames : INC : STA.l NMIFrames : BNE +
LDA.l NMIFrames+2 : INC : STA.l NMIFrames+2
+
JML NMIHookReturn
JML.l NMIHookReturn
;--------------------------------------------------------------------------------
PostNMIHookAction:
LDA.w NMIAux : BEQ +
@@ -35,23 +53,23 @@ PostNMIHookAction:
.return
STZ.w NMIAux ; zero bank byte of NMI hook pointer
+
JSR.w TransferItemGFX
JSR TransferItemGFX
LDA.b INIDISPQ : STA.w INIDISP ; thing we wrote over, turn screen back on
JML.l PostNMIHookReturn
JML PostNMIHookReturn
;--------------------------------------------------------------------------------
TransferItemGFX:
; Only used for shops now but could be used for anything. We should look at how door rando does this
; and try to unify one approach.
REP #$30
LDX.w ItemStackPtr : BEQ .done
TXA : BIT #$0040 : BNE .fail ; Crash if we have more than 16 queued (should never happen.)
TXA : BIT.w #$0040 : BNE .fail ; Crash if we have more than 16 queued (should never happen.)
DEX #2
-
LDA.l ItemGFXStack,X : STA.w ItemGFXPtr
LDA.l ItemTargetStack,X : STA.w ItemGFXTarget
PHX
JSL.l TransferItemToVRAM
JSL TransferItemToVRAM
REP #$10
PLX
DEX #2

View File

@@ -1,74 +0,0 @@
def process_values(sprite, values)
ret = values.clone
if [1, 2].include?(ret[0]) # boomerang
if sprite == 0x53 # armos knight
ret[0] = 0 # do nothing
else
ret[0] = 5 # stun very briefly instead of damage
end
end
if ret[6] > 0 && sprite != 0x84 # bow and not red eyegore/mimic
ret[6] = 0
end
if ret[7] == 2 # hookshot
ret[7] = 1 # still want to stun
end
if [1, 2, 7].include?(ret[8]) && sprite != 0x92 # bomb and not helmasaur king
ret[8] = 0
end
if ret[9] > 0 && sprite != 0x84 # silver bow and not red eyegore/mimic
ret[9] = 0
end
if ret[10] == 4 # powder
ret[10] = 0
end
if ret[11] > 0 && ![0x23, 0xA1, 0xA3, 0xCD].include?(sprite) # fire rod
ret[11] = 0
end
if ret[12] != 3 && sprite != 0xCC # ice rod
ret[12] = 0
end
if ret[13] > 0 && ![0x23, 0xA1, 0xA3, 0xD1].include?(sprite) # bombos
ret[13] = 0
end
if ret[14] != 1 && ![0xD1].include?(sprite) # ether
ret[14] = 0
end
if [1, 2].include?(ret[15]) && ![0xD1].include?(sprite) # quake
ret[15] = 0
end
if sprite == 0x53 and ret[2] == 3
ret[2] = 1 # armos knight? let's make class 2 not suck
end
return ret
end
def split_value(byte)
return [byte >> 4, byte & 0x0F]
end
def join_values(value1, value2)
return (value1 & 0x0F) << 4 | (value2 & 0x0F)
end
File.open("data/damage_table.bin") do |input|
File.open("data/damage_table_sword_bombs.bin", "w") do |output|
i_enum = input.each_byte
(0...0xD7).each do |sprite|
values = []
(0...8).each do
values += split_value(i_enum.next)
end
v_enum = process_values(sprite, values).to_enum
(0...8).each do
output.putc(join_values(v_enum.next, v_enum.next))
end
end
begin
while true
output.putc(i_enum.next)
end
rescue StopIteration
end
end
end

View File

@@ -1,38 +0,0 @@
def process_values(sprite, values)
ret = values.clone
if (ret[1] == 0 && sprite != 0x40) || sprite == 0xCE
# fighter sword does no damage and it's not the evil barrier, or it's Blind
ret[5] = 0
end
return ret
end
def split_value(byte)
return [byte >> 4, byte & 0x0F]
end
def join_values(value1, value2)
return (value1 & 0x0F) << 4 | (value2 & 0x0F)
end
File.open("data/damage_table.bin") do |input|
File.open("data/damage_table_pseudo_sword.bin", "w") do |output|
i_enum = input.each_byte
(0...0xD7).each do |sprite|
values = []
(0...8).each do
values += split_value(i_enum.next)
end
v_enum = process_values(sprite, values).to_enum
(0...8).each do
output.putc(join_values(v_enum.next, v_enum.next))
end
end
begin
while true
output.putc(i_enum.next)
end
rescue StopIteration
end
end
end

View File

@@ -11,7 +11,7 @@ GetAgahnimPalette:
RTL
;--------------------------------------------------------------------------------
GetAgahnimDeath:
STA.w $0BA0, X ; thing we wrote over
STA.w SpriteAncillaInteract, X ; thing we wrote over
LDA.b RoomIndex ; get room id
CMP.b #13 : BNE + ; Agahnim 2 room
LDA.l Bugfix_SetWorldOnAgahnimDeath : BEQ ++
@@ -51,10 +51,10 @@ GetAgahnimSlot:
LDA.b RoomIndex ; get room id
CMP.b #13 : BNE + ; Agahnim 2 room
LDA.b #$01 ; Use Agahnim 2
JML.l GetAgahnimSlotReturn
JML GetAgahnimSlotReturn
+ ; Elsewhere
LDA.b #$00 ; Use Agahnim 1
JML.l GetAgahnimSlotReturn
JML GetAgahnimSlotReturn
;--------------------------------------------------------------------------------
GetAgahnimLightning:
INC.w SpriteAux, X ; thing we wrote over

View File

@@ -1,6 +1,6 @@
GoalItemGanonCheck:
LDA.w SpriteTypeTable, X : CMP.b #$D6 : BNE .success ; skip if not ganon
JSL.l CheckGanonVulnerability
JSL CheckGanonVulnerability
BCS .success
.fail
@@ -110,30 +110,76 @@ CheckGanonVulnerability:
BRA .all_dungeons
;--------------------------------------------------------------------------------
GetRequiredCrystalsForTower:
BEQ + : JSL.l BreakTowerSeal_ExecuteSparkles : + ; thing we wrote over
LDA.l GanonsTowerOpenTarget : CMP.b #$00 : BNE + : JML.l Ancilla_BreakTowerSeal_stop_spawning_sparkles : +
LDA.l GanonsTowerOpenTarget : CMP.b #$01 : BNE + : JML.l Ancilla_BreakTowerSeal_draw_single_crystal : +
LDA.l GanonsTowerOpenTarget : DEC #2 : TAX
JML.l GetRequiredCrystalsForTower_continue
GTCutscene_CrystalMasks:
db %00000000 ; 0 crystals
db %10000000 ; BIT INDEX DIAGRAM
db %00010010 ; 0
db %00010101 ; 5 1
db %10010101 ; 7
db %10110110 ; 4 2
db %00111111 ; 3
db %10111111 ; 7 crystals
;--------------------------------------------------------------------------------
GetRequiredCrystalsInX:
LDA.l GanonsTowerOpenTarget : CMP.b #$00 : BNE +
TAX
RTL
+
GTCutscene_ConditionalAnimateCrystals:
PHX : PHX
JSR GTCutscene_NumberOfCrystals : TAX : LDA.l GTCutscene_CrystalMasks,X
PLX
- LSR : DEX : BPL -
PLX : BCC .skip_crystal
.draw_crystal
LDA.b GameSubMode : BEQ + : JML GTCutscene_AnimateCrystals_NoRotate ; what we wrote over
+ JML GTCutscene_AnimateCrystals_NextCrystal+4
.skip_crystal
JML GTCutscene_DrawSingleCrystal-3
;--------------------------------------------------------------------------------
GTCutscene_ConditionalDrawSingleCrystal:
LDA.w RandoOverworldTargetEdge : BEQ .draw_crystal : STZ.w RandoOverworldTargetEdge
JSR GTCutscene_NumberOfCrystals : TAX
LDA.l GTCutscene_CrystalMasks,X : AND.b #$80 : BEQ .skip_crystal
.draw_crystal
LDX.w CurrentSpriteSlot : PHY ; what we wrote over
JML GTCutscene_DrawSingleCrystal+4
.skip_crystal
JML GTCutscene_DrawSingleCrystal_SkipCrystal
;--------------------------------------------------------------------------------
GTCutscene_AnimateCrystals_Prep:
BEQ + : JSL GTCutscene_SparkleALot : + ; thing we wrote over
JSR GTCutscene_NumberOfCrystals : BNE +
JML GTCutscene_DrawSingleCrystal_SkipSparkle
+ CMP.b #$01 : BNE +
JML GTCutscene_DrawSingleCrystal
+ INC.w RandoOverworldTargetEdge ; some free ram OWR also uses
JML GTCutscene_AnimateCrystals_NextCrystal-2
;--------------------------------------------------------------------------------
GTCutscene_ActivateSparkle_SelectCrystal:
JSR GTCutscene_NumberOfCrystals : BNE +
TAX : RTL
+ STA.b Scrap00
TXA
- CMP.l GanonsTowerOpenTarget : BCC +
SBC.l GanonsTowerOpenTarget ; carry guaranteed set
BRA -
- CMP.l Scrap00 : BCC +
SBC.l Scrap00 : BRA - ; carry guaranteed set
+ INC : CMP.l GanonsTowerOpenTarget : BNE +
LDA.b #$08
+ : DEC : TAX
+ PHY : TAY
LDA.b Scrap00 : TAX : LDA.l GTCutscene_CrystalMasks,X
LDX.b #$FF
- LSR : INX : BCC +
DEY
+ BPL -
PLY
RTL
;--------------------------------------------------------------------------------
GTCutscene_NumberOfCrystals:
REP #$20
LDA.l GanonsTowerOpenAddress : CMP.w #CrystalCounter : BEQ +
LDA.w #$0001 : BRA .done
+ LDA.l GanonsTowerOpenTarget
.done
SEP #$20
RTS
;--------------------------------------------------------------------------------
CheckEnoughCrystalsForGanon:
REP #$20
LDA.l CrystalCounter
@@ -143,7 +189,7 @@ RTL
;--------------------------------------------------------------------------------
CheckTowerOpen:
LDA.l GanonsTowerOpenMode : ASL : TAX
JSR.w (.tower_open_modes,X)
JSR (.tower_open_modes,X)
RTL
.tower_open_modes
dw .vanilla
@@ -233,7 +279,7 @@ CheckPedestalPull:
; Out: c - Successful ped pull if set, do nothing if unset.
PHX
LDA.l PedCheckMode : ASL : TAX
JSR.w (.pedestal_modes,X)
JSR (.pedestal_modes,X)
PLX
RTL

View File

@@ -2,12 +2,13 @@
; Randomize Half Magic Bat
;--------------------------------------------------------------------------------
GetMagicBatItem:
JSL.l ItemSet_MagicBat
JSL ItemSet_MagicBat
%GetPossiblyEncryptedItem(MagicBatItem, SpriteItemValues)
CMP.b #$FF : BEQ .normalLogic
TAY
PHA : LDA.l MagicBatItem_Player : STA.l !MULTIWORLD_ITEM_PLAYER_ID : PLA
STZ.b ItemReceiptMethod ; 0 = Receiving item from an NPC or message
JML.l Link_ReceiveItem
JML Link_ReceiveItem
.normalLogic
LDA.l HalfMagic
STA.l MagicConsumption

View File

@@ -76,18 +76,12 @@ GetItemDamageValue:
CPX.b #$04 : BEQ .boomerang
CPX.b #$05 : BEQ .boomerang
CPX.b #$39 : BEQ .hookshot
CPX.b #$3B : BEQ .hookshot
CPX.b #$3C : BEQ .hookshot
CPX.b #$3D : BEQ .hookshot
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$02 : BNE .normal
TXA : AND.b #$78 : CMP.b #$28 : BNE .normal
LDA.l $8DB8F1, X : BEQ .noDamage
LDA.b #$01
RTL
CPX.b #$3b : BEQ .hookshot
CPX.b #$3c : BEQ .hookshot
CPX.b #$3d : BEQ .hookshot
.normal
LDA.l $8DB8F1, X ; what we wrote over
LDA.l DamageSubclassValue,x ;what we wrote over
RTL
.boomerang
LDA.l StunItemAction : AND.b #$01 : BNE .normal
@@ -106,7 +100,7 @@ SearchAncilla:
LDX.b #$00
.loop
LDA.w AncillaID, X
INX : CPX #$0A : BEQ .notFound
INX : CPX.b #$0A : BEQ .notFound
CMP.b Scrap05 : BNE .loop
LDA.b #$01
BRA .return

View File

@@ -78,7 +78,7 @@ DMAAlphabetTilemap:
LDA.b #BigRAM>>16 : STA.w A1B0
LDX.w #BigRAM : STX.w A1T0L
LDX.w #$0080 : STX.w DAS0L
LDA.b #$01 : STA.w MDMAEN
LDA.b #$01 : STA.w DMAENABLE
SEP #$10
PLX : PLA
RTS

View File

@@ -2,72 +2,76 @@
; Randomize Heart Pieces
;--------------------------------------------------------------------------------
HeartPieceGet:
PHX : PHY
JSL.l LoadHeartPieceRoomValue
JSL.l AttemptItemSubstitution
JSL.l ResolveLootIDLong
TAY
JSL.l MaybeMarkDigSpotCollected
.skipLoad
CPY.b #$26 : BNE .not_heart ; don't add a 1/4 heart if it's not a heart piece
LDA.l HeartPieceQuarter : INC A : AND.b #$03 : STA.l HeartPieceQuarter
.not_heart
JSL.l $8791B3 ; Player_HaltDashAttackLong
STZ.w ItemReceiptMethod ; 0 = Receiving item from an NPC or message
JSL.l Link_ReceiveItem
JSL MaybeUnlockTabletAnimation
PHX : PHY
JSL LoadHeartPieceRoomValue
JSL AttemptItemSubstitution
JSL ResolveLootIDLong
TAY
JSL MaybeMarkDigSpotCollected
.skipLoad
JSL HeartPieceGetPlayer : 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
LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE .not_heart
LDA.l HeartPieceQuarter : INC A : AND.b #$03 : STA.l HeartPieceQuarter
.not_heart
JSL Player_HaltDashAttackLong
STZ.w ItemReceiptMethod ; 0 = Receiving item from an NPC or message
JSL Link_ReceiveItem
JSL MaybeUnlockTabletAnimation
PLY : PLX
PLY : PLX
RTL
;--------------------------------------------------------------------------------
HeartContainerGet:
PHX : PHY
JSL.l IncrementBossSword
LDY.w SpriteID, X : BNE +
JSL.l LoadHeartContainerRoomValue : TAY
+
BRA HeartPieceGet_skipLoad
PHX : PHY
JSL IncrementBossSword
LDY.w SpriteID, X : BNE +
JSL LoadHeartContainerRoomValue : TAY
+
BRA HeartPieceGet_skipLoad
;--------------------------------------------------------------------------------
DrawHeartPieceGFX:
PHP
JSL.l Sprite_IsOnscreen : BCC .offscreen
PHA : PHY
LDA.l RedrawFlag : BEQ .skipInit ; skip init if already ready
JSL.l HeartPieceSpritePrep
JMP .done ; don't draw on the init frame
.skipInit
LDA.w SpriteID, X ; Retrieve stored item type
.skipLoad
PHA : PHX
TAX
LDA.l SpriteProperties_standing_width,X : BNE +
PLX
LDA.w SpriteControl, X : ORA.b #$20 : STA.w SpriteControl, X
PLA
JSL.l DrawDynamicTile
LDA.b Scrap00
CLC : ADC.b #$04
STA.b Scrap00
JSL.l Sprite_DrawShadowLong
BRA .done
+
PLX
PLA
JSL.l DrawDynamicTile
JSL.l Sprite_DrawShadowLong
.done
PLY : PLA
.offscreen
PLP
PHP
JSL Sprite_IsOnscreen : BCC .offscreen
PHA : PHY
LDA.l RedrawFlag : BEQ .skipInit ; skip init if already ready
JSL HeartPieceSpritePrep
JMP .done ; don't draw on the init frame
.skipInit
LDA.w SpriteID, X ; Retrieve stored item type
.skipLoad
PHA : PHX
TAX
LDA.l SpriteProperties_standing_width,X : BNE +
PLX
LDA.w SpriteControl, X : ORA.b #$20 : STA.w SpriteControl, X
PLA
JSL DrawDynamicTile
REP #$21
LDA.b Scrap00
ADC.w #$0004
STA.b Scrap00
SEP #$20
JSL Sprite_DrawShadowLong
BRA .done
+
PLX
PLA
JSL DrawDynamicTile
JSL Sprite_DrawShadowLong
.done
PLY : PLA
.offscreen
PLP
RTL
;--------------------------------------------------------------------------------
DrawHeartContainerGFX:
PHP
JSL.l Sprite_IsOnscreen : BCC DrawHeartPieceGFX_offscreen
JSL Sprite_IsOnscreen : BCC DrawHeartPieceGFX_offscreen
PHA : PHY
LDA.l RedrawFlag : BEQ .skipInit ; skip init if already ready
JSL.l HeartContainerSpritePrep
JSL HeartContainerSpritePrep
BRA DrawHeartPieceGFX_done ; don't draw on the init frame
.skipInit
@@ -76,108 +80,118 @@ DrawHeartContainerGFX:
BRA DrawHeartPieceGFX_skipLoad
;--------------------------------------------------------------------------------
HeartContainerSound:
LDA.w ItemReceiptMethod : CMP.b #$03 : BEQ +
JSL.l CheckIfBossRoom : BCC + ; Skip if not in a boss room
LDA.b #$2E
SEC
RTL
+
CLC
LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE +
LDA.w ItemReceiptMethod : CMP.b #$03 : BEQ +
JSL CheckIfBossRoom : BCC + ; Skip if not in a boss room
LDA.b #$2E
SEC
RTL
+
CLC
RTL
;--------------------------------------------------------------------------------
NormalItemSkipSound:
; Out: C - skip sounds if set
JSL.l CheckIfBossRoom : BCS .boss_room
TDC
CPY #$17 : BEQ .skip
CLC
RTL
.boss_room
LDA.w ItemReceiptMethod : CMP.b #$03 : BEQ +
.skip
SEC
RTL
+
LDA.b #$20
.dont_skip
; Out: c - skip sounds if set
LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE .skip
JSL CheckIfBossRoom : BCS .boss_room
TDC
CPY.b #$17 : BEQ .skip
CLC
RTL
.boss_room
LDA.w ItemReceiptMethod : CMP.b #$03 : BEQ +
.skip
SEC
RTL
+
LDA.b #$20
.dont_skip
CLC
RTL
;--------------------------------------------------------------------------------
HeartPieceSpritePrep:
PHA
PHA
LDA.l ServerRequestMode : BEQ + : : +
LDA.l ServerRequestMode : BEQ + : : +
LDA.b #$01 : STA.l RedrawFlag
LDA.b LinkState : CMP.b #$14 : BEQ .skip ; skip if we're mid-mirror
LDA.b #$01 : STA.l RedrawFlag
LDA.b LinkState : CMP.b #$14 : BEQ .skip ; skip if we're mid-mirror
LDA.b #$00 : STA.l RedrawFlag
JSL.l LoadHeartPieceRoomValue
JSL.l AttemptItemSubstitution
JSL.l ResolveLootIDLong
STA.w SpriteID, X
JSL.l PrepDynamicTile_loot_resolved
LDA.b #$00 : STA.l RedrawFlag
JSL HeartPieceGetPlayer : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID
JSL LoadHeartPieceRoomValue
JSL AttemptItemSubstitution
JSL ResolveLootIDLong
STA.w SpriteID, X
JSL PrepDynamicTile_loot_resolved
.skip
PLA
.skip
PLA
RTL
;--------------------------------------------------------------------------------
HeartContainerSpritePrep:
PHA
PHA
LDA.b #$00 : STA.l RedrawFlag
JSL.l LoadHeartContainerRoomValue ; load item type
JSL.l AttemptItemSubstitution
JSL.l ResolveLootIDLong
STA.w SpriteID, X
JSL.l PrepDynamicTile_loot_resolved
LDA.b #$00 : STA.l RedrawFlag
JSL HeartPieceGetPlayer : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID
JSL LoadHeartContainerRoomValue ; load item type
JSL AttemptItemSubstitution
JSL ResolveLootIDLong
STA.w SpriteID, X
JSL PrepDynamicTile_loot_resolved
PLA
PLA
RTL
;--------------------------------------------------------------------------------
LoadHeartPieceRoomValue:
LDA.b IndoorsFlag : BEQ .outdoors ; check if we're indoors or outdoors
.indoors
JSL.l LoadIndoorValue
JMP .done
.outdoors
JSL.l LoadOutdoorValue
.done
LDA.b IndoorsFlag : BEQ .outdoors ; check if we're indoors or outdoors
.indoors
JSL LoadIndoorValue
JMP .done
.outdoors
JSL LoadOutdoorValue
.done
RTL
;--------------------------------------------------------------------------------
HPItemReset:
JSL $89AD58 ; GiveRupeeGift - thing we wrote over
PHA : LDA.b #$01 : STA.l RedrawFlag : PLA
PHA
LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE .skip
PLA
JSL GiveRupeeGift ; thing we wrote over
BRA .done
.skip
PLA
.done
PHA : LDA.b #$01 : STA.l RedrawFlag : PLA
RTL
;--------------------------------------------------------------------------------
MaybeMarkDigSpotCollected:
PHA : PHP
LDA.b IndoorsFlag : BNE +
REP #$20 ; set 16-bit accumulator
LDA.b OverworldIndex
CMP.w #$2A : BNE +
LDA.l HasGroveItem : ORA.w #$0001 : STA.l HasGroveItem
+
PLP : PLA
PHA : PHP
LDA.b IndoorsFlag : BNE +
REP #$20 ; set 16-bit accumulator
LDA.b OverworldIndex : CMP.w #$002A : BNE +
LDA.l HasGroveItem : ORA.w #$0001 : STA.l HasGroveItem
+
PLP : PLA
RTL
;--------------------------------------------------------------------------------
macro GetPossiblyEncryptedItem(ItemLabel,TableLabel)
LDA.l IsEncrypted : BNE ?encrypted
LDA.l <ItemLabel>
BRA ?done
?encrypted:
PHX : PHP
REP #$30 ; set 16-bit accumulator & index registers
LDA.b Scrap00 : PHA : LDA.b Scrap02 : PHA
LDA.l IsEncrypted : BNE ?encrypted
LDA.l <ItemLabel>
BRA ?done
?encrypted:
PHX : PHP
REP #$30 ; set 16-bit accumulator & index registers
LDA.b Scrap00 : PHA : LDA.b Scrap02 : PHA
LDA.w #<TableLabel> : STA.b Scrap00
LDA.w #<TableLabel>>>16 : STA.b Scrap02
LDA.w #<ItemLabel>-<TableLabel>
JSL RetrieveValueFromEncryptedTable
LDA.w #<TableLabel> : STA.b Scrap00
LDA.w #<TableLabel>>>16 : STA.b Scrap02
LDA.w #<ItemLabel>-<TableLabel>
JSL RetrieveValueFromEncryptedTable
PLX : STX.b Scrap02 : PLX : STX.b Scrap01
PLP : PLX
?done:
PLX : STX.b Scrap02 : PLX : STX.b Scrap01
PLP : PLX
?done:
endmacro
LoadIndoorValue:
@@ -211,10 +225,10 @@ LoadIndoorValue:
LDA.l StandingKey_Hera
JMP .done
+
PHX
LDX.w CurrentSpriteSlot ; If we're on a different screen ID via glitches load the sprite
LDA.w SpriteID,X ; we can see and are interacting with
PLX
PHX
LDX.w CurrentSpriteSlot ; If we're on a different screen ID via glitches load the sprite
LDA.w SpriteID,X ; we can see and are interacting with
PLX
.done
AND.w #$00FF ; the loads are words but the values are 1-byte so we need to clear the top half of the accumulator - no guarantee it was 8-bit before
PLP
@@ -277,10 +291,10 @@ LoadOutdoorValue:
%GetPossiblyEncryptedItem(HeartPiece_Zora, HeartPieceOutdoorValues)
JMP .done
+
PHX
LDX.w CurrentSpriteSlot ; If we're on a different screen ID via glitches load the sprite
LDA.w SpriteID,X ; we can see and are interacting with.
PLX
PHX
LDX.w CurrentSpriteSlot ; If we're on a different screen ID via glitches load the sprite
LDA.w SpriteID,X ; we can see and are interacting with.
PLX
.done
AND.w #$00FF ; the loads are words but the values are 1-byte so we need to clear the top half of the accumulator - no guarantee it was 8-bit before
PLP
@@ -381,3 +395,129 @@ RTL
;JSL $80D51B ; GetAnimatedSpriteTile
;JSL $80D52D ; GetAnimatedSpriteTile.variable
;================================================================================
HeartPieceGetPlayer:
{
PHY
LDA.b IndoorsFlag : BNE +
BRL .outdoors
+
PHP
REP #$20 ; set 16-bit accumulator
LDA.b RoomIndex ; these are all decimal because i got them that way
CMP.w #135 : BNE +
LDA.l StandingKey_Hera_Player
BRL .done
+ CMP.w #200 : BNE +
LDA.l HeartContainer_ArmosKnights_Player
BRL .done
+ CMP.w #51 : BNE +
LDA.l HeartContainer_Lanmolas_Player
BRL .done
+ CMP.w #7 : BNE +
LDA.l HeartContainer_Moldorm_Player
BRL .done
+ CMP.w #90 : BNE +
LDA.l HeartContainer_HelmasaurKing_Player
BRL .done
+ CMP.w #6 : BNE +
LDA.l HeartContainer_Arrghus_Player
BRL .done
+ CMP.w #41 : BNE +
LDA.l HeartContainer_Mothula_Player
BRL .done
+ CMP.w #172 : BNE +
LDA.l HeartContainer_Blind_Player
BRL .done
+ CMP.w #222 : BNE +
LDA.l HeartContainer_Kholdstare_Player
BRL .done
+ CMP.w #144 : BNE +
LDA.l HeartContainer_Vitreous_Player
BRL .done
+ CMP.w #164 : BNE +
LDA.l HeartContainer_Trinexx_Player
BRL .done
+ CMP.w #225 : BNE +
LDA.l HeartPiece_Forest_Thieves_Player
BRL .done
+ CMP.w #226 : BNE +
LDA.l HeartPiece_Lumberjack_Tree_Player
BRL .done
+ CMP.w #234 : BNE +
LDA.l HeartPiece_Spectacle_Cave_Player
BRL .done
+ CMP.w #283 : BNE +
LDA.b LinkPosX : XBA : AND.w #$0001 ; figure out where link is
BNE ++
LDA.l HeartPiece_Circle_Bushes_Player
BRL .done
++
LDA.l HeartPiece_Graveyard_Warp_Player
BRL .done
+ CMP.w #294 : BNE +
LDA.l HeartPiece_Mire_Warp_Player
BRL .done
+ CMP.w #295 : BNE +
LDA.l HeartPiece_Smith_Pegs_Player
BRL .done
LDA.w #$0000
BRL .done
.outdoors
PHP
REP #$20 ; set 16-bit accumulator
LDA.b OverworldIndex
CMP.w #$03 : BNE +
LDA.b LinkPosX : CMP.w #1890 : !BLT ++
LDA.l HeartPiece_Spectacle_Player
BRL .done
++
LDA.l EtherItem_Player
BRL .done
+ CMP.w #$05 : BNE +
LDA.l HeartPiece_Mountain_Warp_Player
BRL .done
+ CMP.w #$28 : BNE +
LDA.l HeartPiece_Maze_Player
BRL .done
+ CMP.w #$2A : BNE +
LDA.l HauntedGroveItem_Player
BRL .done
+ CMP.w #$30 : BNE +
LDA.b LinkPosX : CMP.w #512 : !BGE ++
LDA.l HeartPiece_Desert_Player
BRL .done
++
LDA.l BombosItem_Player
BRL .done
+ CMP.w #$35 : BNE +
LDA.l HeartPiece_Lake_Player
BRL .done
+ CMP.w #$3B : BNE +
LDA.l HeartPiece_Swamp_Player
BRL .done
+ CMP.w #$42 : BNE +
LDA.l HeartPiece_Cliffside_Player
BRL .done
+ CMP.w #$4A : BNE +
LDA.l HeartPiece_Cliffside_Player
BRL .done
+ CMP.w #$5B : BNE +
LDA.l HeartPiece_Pyramid_Player
BRL .done
+ CMP.w #$68 : BNE +
LDA.l HeartPiece_Digging_Player
BRL .done
+ CMP.w #$81 : BNE +
LDA.l HeartPiece_Zora_Player
BRL .done
+
LDA.w #$0000
.done
AND.w #$00FF ; the loads are words but the values are 1-byte so we need to clear the top half of the accumulator - no guarantee it was 8-bit before
PLP
PLY
RTL
}

460
hooks.asm
View File

@@ -1,3 +1,10 @@
org $878102 ; no idea where that is, ask zarby
JSL GetMultiworldItem
org $81EC07 ; Dungeon_OpenKeyedObject .nextChest : LDA Dungeon_ChestData+2, X
JSL Multiworld_OpenKeyedObject
;================================================================================
; Init Hook
; this needs to be a JML, otherwise we're not using fast ROM when we return
@@ -59,8 +66,8 @@ org $00FFEA : dw NMIBounce
org $00FFEE : dw IRQBounce
org $8098AB
NMIBounce: JML.l $8080C9
IRQBounce: JML.l $8082D8
NMIBounce: JML Interrupt_NMI
IRQBounce: JML Interrupt_IRQ
warnpc $8098C0
;================================================================================
@@ -195,6 +202,9 @@ db Password_Tilemap>>16
org $8CD527 ; <- 65527 : Bank0C.asm : 2913 (LDA.w #$0004 : STA $02) [LDA.w #$0006 : STA $02]
JSL DrawPlayerFile : NOP ; hijack hearts draw routine to draw a full inventory
; Random incredible patch that I should add right now - File Select Fairy
org $1BF029+1 : db $10
org $8CCDD5 ; Bank0C.asm:1881 (LDX.w #$00FD)
JSL AltBufferTable : NOP #8 ; Selection screen
org $8CD393 ; Bank0c.asm:2674 (LDX.w #$00FD)
@@ -211,7 +221,7 @@ LDA.w #$2000 ; Load file select screen graphics to VRAM word addres 0x2000 inste
;--------------------------------------------------------------------------------
org $80E568 : LDX.w #$0EFF ; Load full decompressed character set into VRAM
;--------------------------------------------------------------------------------
org $80E581 : JSL.l LoadFileSelectVanillaItems : BRA + : NOP #13 : +
org $80E581 : JSL LoadFileSelectVanillaItems : BRA + : NOP #13 : +
;--------------------------------------------------------------------------------
org $80833A ; <- 0033A - Bank00.asm : 481 (LDA.w #$007F)
LDA.w #$0180 ; change which character is used as the blank character for the select screen
@@ -235,7 +245,7 @@ db $3D
org $8CD6BD ; <- Y position table for Death Counts
db $51
;--------------------------------------------------------------------------------
org $8CD55F : JSL.l CheckHeartPaletteFileSelect : NOP #2
org $8CD55F : JSL CheckHeartPaletteFileSelect : NOP #2
;================================================================================
; Name Entry Screen
@@ -437,7 +447,7 @@ AllowStartFromExitReturn:
org $9BC2A7 ; <- DC2A7 - Bank1B.asm : 1143 (Overworld_CreatePyramidHole:)
JSL Overworld_CreatePyramidHoleModified : RTL
C9DE_LONG:
JSR.w $1BC9DE : RTL ; surprisingly same address as US
JSR Overworld_AlterTileHardcore : RTL ; surprisingly same address as US
;--------------------------------------------------------------------------------
org $87FF5F ; <- 3ff5f - Bank0E.asm : 5252 (LDA.w #$0E3F : STA $23BC)
JSL Draw_PyramidOverlay : RTS
@@ -459,7 +469,7 @@ org $84E7AE ; <- bank0E.asm : 4230 (LDA $7EF287 : AND.w #$0020)
JSL TurtleRockPegSolved
org $84E7B9 ; <- bank0E.asm : 4237 (LDX $04C8)
JMP.w TurtleRockTrollPegs
JMP TurtleRockTrollPegs
TurtleRockPegCheck:
org $84E7C9
@@ -478,11 +488,11 @@ JSL GetRandomInt
LDA.l PegProbability : BEQ .vanilla : CMP.l $7E0FA1
REP #$20 : !BGE .succeed
.fail
JMP.w TurtleRockPegFail
JMP TurtleRockPegFail
.succeed
JMP.w TurtleRockPegSuccess
JMP TurtleRockPegSuccess
.vanilla
REP #$20 : JMP.w TurtleRockPegCheck
REP #$20 : JMP TurtleRockPegCheck
;--------------------------------------------------------------------------------
org $9BBD05 ; <- bank1B.asm : 261 (TYA : STA $00) ; hook starts at the STA
JML PreventEnterOnBonk : NOP
@@ -495,14 +505,20 @@ PreventEnterOnBonk_BRANCH_IX:
; Crystals Mode
;--------------------------------------------------------------------------------
org $899B7F ; <- ancilla_init.asm : 4136 (LDA $7EF37A : AND.b #$7F : CMP.b #$7F)
JSL CheckTowerOpen : BCC $899B6D
JSL CheckTowerOpen : BCC AncillaAdd_GTCutscene-2
;--------------------------------------------------------------------------------
org $88CE0C ; <- 44E0C - ancilla_break_tower_seal.asm : 168 (BEQ #$03 : JSR BreakTowerSeal_ExecuteSparkles : LDX.b #$06)
JML GetRequiredCrystalsForTower : NOP #3
GetRequiredCrystalsForTower_continue:
org $88CE0C ; <- 44E0C - ancilla_break_tower_seal.asm : 168 (BEQ #$03 : JSR GTCutscene_SparkleALot : LDX.b #$06)
JML GTCutscene_AnimateCrystals_Prep : NOP
LDX.b #$05
GTCutscene_AnimateCrystals_NextCrystal:
JML GTCutscene_ConditionalAnimateCrystals
;--------------------------------------------------------------------------------
org $88CE93
GTCutscene_DrawSingleCrystal:
JML GTCutscene_ConditionalDrawSingleCrystal
;--------------------------------------------------------------------------------
org $88CF19 ; <- 44F19 - ancilla_break_tower_seal.asm : 336 (TXA : AND.b #$07 : TAX)
JSL GetRequiredCrystalsInX
JSL GTCutscene_ActivateSparkle_SelectCrystal
;--------------------------------------------------------------------------------
org $88CFC9 ; <- 44FC9 - ancilla_break_tower_seal.asm : 414 (RTS)
RTL
@@ -543,7 +559,7 @@ org $86F2EA ; <- 372EA - Bank06.asm : 5791 (LDA $0E20, X : CMP.b #$D6 : BCS .no_
JSL CheckGanonHammerDamage : NOP
;--------------------------------------------------------------------------------
org $858922
JSL.l CheckPedestalPull : BCC MasterSword_InPedestal_exit
JSL CheckPedestalPull : BCC MasterSword_InPedestal_exit
;================================================================================
; Stat Hooks
@@ -734,11 +750,17 @@ org $8DE7B9 ; <- 6E7B9 - equipment.asm : 1548 (LDA.w #$16D0 : STA $00)
JSL DrawGlovesInMenuLocation : NOP
org $8DE7CF ; <- 6E7CF - equipment.asm : 1554 (LDA.w #$16C8 : STA $00)
JSL DrawBootsInMenuLocation : NOP
org $8DE7DD
JSL ChangeBootsColorForFakeBoots : NOP
org $8DE7E5 ; <- 6E7E5 - equipment.asm : 1560 (LDA.w #$16D8 : STA $00)
JSL DrawFlippersInMenuLocation : NOP
org $8DECEB ; <- 6ECEB - equipment.asm : 1946 (LDA.w #$16E0 : STA $00)
JSL DrawMoonPearlInMenuLocation : NOP
; Fake boots icon
org $8DF851
dw $2C29, $2C2A, $2C2B, $2C2C
;================================================================================
; Zelda S&Q Mirror Fix
;--------------------------------------------------------------------------------
@@ -771,10 +793,10 @@ JSL ConditionalWhitenBg
org $82FEE6 ; <- 17EE6 - Bank0E.asm : 3907 (RTS)
RTL ; the whiten color routine is only JSL-ed to
;--------------------------------------------------------------------------------
org $87FA7B ; <- 3FA7B - Bank0E.asm : 4735 (REP #$20 : LDX.b #$02)
org $87FA7B ; <- 3FA7B - Bank0E.asm : 4735 (REP #$20 : LDX.b #$02)
JML DDMConditionalLightning
;--------------------------------------------------------------------------------
org $87FACB ; <- 3FACB - Bank0E.asm : 4773 (REP #$20 : LDA #$F531, Y)
org $87FACB ; <- 3FACB - Bank0E.asm : 4773 (REP #$20 : LDA #$F531, Y)
JSL ConditionalGTFlash : BRA + : NOP #11 : +
;--------------------------------------------------------------------------------
org $8AFF48 ; <- 57F48 - Bank0A.asm : 4935 (REP #$20 : LDA $7EC3DA)
@@ -786,7 +808,7 @@ JSL ConditionalPedAncilla : BRA + : NOP #4 : +
org $879976 ; <- 039976 - Bank07.asm : 4009 (JSL Palette_ElectroThemedGear)
JSL LoadElectroPalette
;--------------------------------------------------------------------------------
org $87997C ; <- 03997C - Bank07.asm : 4015 (JSL LoadActualGearPalettes)
org $87997C ; <- 03997C - Bank07.asm : 4015 (JSL LoadActualGearPalettes)
JSL RestoreElectroPalette
;================================================================================
@@ -808,11 +830,6 @@ db $B1, $C6, $F9, $C9, $C6, $F9 ; data insert - 2 chests, fat fairy room
org $81E97E
dw $0116 : db $08
dw $0116 : db $25
;--------------------------------------------------------------------------------
PyramidFairy_BRANCH_IOTA = $86C936
PyramidFairy_BRANCH_GAMMA = $86C948
;--------------------------------------------------------------------------------
org $9EE16E ; <- F616E - sprite_bomb_shop_entity.asm : 73
NOP #8 ; fix bomb shop dialog for dwarfless big bomb
@@ -891,6 +908,10 @@ JSL GetAnimatedSpriteBufferPointer : NOP
org $8799F7 ; 399F7 - Bank07.asm:4107 (JSL AddReceivedItem)
JSL AddReceivedItemExpanded
org $898605 ; 48605 - ancilla_init.asm:709 (TYA : STA $02E4 : PHX)
JML Multiworld_AddReceivedItem_notCrystal
NOP
org $898611 ; 48611 - ancilla_init.asm:720 (LDA .item_target_addr+0, X)
LDA.w ItemReceipts_target+0, X
org $898616 ; 48616 - ancilla_init.asm:721 (LDA .item_target_addr+1, X)
@@ -912,7 +933,7 @@ org $898769 ; 48769 - ancilla_init.asm:1005 (LDA .item_graphics_indices, Y)
LDA.w ItemReceipts_graphics, Y
org $898811
JSL.l SetItemRiseTimer
JSL SetItemRiseTimer
org $89884D ; 4884D - ancilla_init.asm:1137 (LDA $836C, Y)
LDA.w ItemReceipts_offset_y, Y
@@ -931,7 +952,7 @@ org $88C6C8 ; 446C8 - ancilla_receive_item.asm:538 (LDA AddReceiveItem.propertie
JSL CheckReceivedItemPropertiesBeforeLoad
org $88C6DE ; 446DE - ancilla_receive_item.asm:550 (LDA .wide_item_flag, X)
JSL.l ItemReceiptWidthCheck
JSL ItemReceiptWidthCheck
org $88C6F9 ; 446F9 - ancilla_receive_item.asm:570 (LDA AddReceiveItem.properties, X)
JSL CheckReceivedItemPropertiesBeforeLoad
@@ -941,6 +962,11 @@ JSL AddReceivedItemExpandedGetItem : NOP
org $87B57D ; 3B57D - Bank07.asm:8527 (LDA Link_ReceiveItemAlternates, Y : STA $03)
BRA Link_PerformOpenChest_no_replacement
org $88C563
JML ItemGetAlternateSFX : NOP
org $8988A5
JSL ItemGetOverworldAlternateSFX : NOP #5
;--------------------------------------------------------------------------------
org $89892E ; 4892E - ancilla_init.asm:1307 (LDA BottleList, X)
LDA.w BottleListExpanded, X
@@ -995,29 +1021,29 @@ Overworld_Entrance_BRANCH_EPSILON: ; go here to lock doors
;--------------------------------------------------------------------------------
; Dungeon Drops
;--------------------------------------------------------------------------------
org $81C50D : JSL.l CheckDungeonWorld
org $81C517 : JSL.l CheckDungeonCompletion
org $81C523 : JSL.l CheckDungeonCompletion
org $81C710 : JSL.l CheckSpawnPrize
org $81C50D : JSL CheckDungeonWorld
org $81C517 : JSL CheckDungeonCompletion
org $81C523 : JSL CheckDungeonCompletion
org $81C710 : JSL CheckSpawnPrize
BCS RoomTag_GetHeartForPrize_spawn_prize : BRA RoomTag_GetHeartForPrize_delete_tag
org $81C742 : JSL.l SpawnDungeonPrize
org $8799EA : JML.l SetItemPose
org $88C415 : JSL.l PendantMusicCheck
org $81C742 : JSL SpawnDungeonPrize : PLA : RTS
org $8799EA : JML SetItemPose
org $88C415 : JSL PendantMusicCheck
BCS Ancilla22_ItemReceipt_is_pendant : BRA Ancilla22_ItemReceipt_wait_for_music
org $88C452 : JSL.l MaybeKeepLootID : NOP #2
org $88C61D : JSL.l AnimatePrizeCutscene : NOP
;org $88C452 : JSL MaybeKeepLootID : NOP #2 DR overwrote hook see RetrieveBunnyState
org $88C61D : JSL AnimatePrizeCutscene : NOP
org $88C622 : BCC ItemReceipt_Animate_continue
org $88C6BA : JSL.l CheckPoseItemCoordinates
org $88CAD6 : JSL.l HandleDropSFX : NOP #2
org $88C6BA : JSL CheckPoseItemCoordinates
org $88CAD6 : JSL HandleDropSFX : NOP #2
org $88CADC : BCC Ancilla29_MilestoneItemReceipt_skip_crystal_sfx
org $88CAE9 : JSL.l PrepPrizeTile
org $88CB23 : JSL.l PrizeDropSparkle : BCC Ancilla29_MilestoneItemReceipt_no_sparkle : NOP #2
org $88CB97 : JSL.l PrepPrizeOAMCoordinates : BRA + : NOP #$12 : +
org $88CBFF : JSL.l PrepPrizeShadow
org $88CC6C : JSL.l HandleCrystalsField
org $88CCA6 : JSL.l PrepPrizeOAMCoordinates : NOP
org $8985FA : JSL.l SetCutsceneFlag : NOP #3 : BCC AncillaAdd_ItemReceipt_not_crystal
org $8988B2 : JSL.l SetPrizeCoords : NOP
org $88CAE9 : JSL PrepPrizeTile
org $88CB23 : JSL PrizeDropSparkle : BCC Ancilla29_MilestoneItemReceipt_no_sparkle : NOP #2
org $88CB97 : JSL PrepPrizeOAMCoordinates : BRA + : NOP #$12 : +
org $88CBFF : JSL PrepPrizeShadow
org $88CC6C : JSL HandleCrystalsField
org $88CCA6 : JSL PrepPrizeOAMCoordinates : NOP
org $8985FA : JSL SetCutsceneFlag : NOP #3 : BCC AddReceivedItem_notCrystal
org $8988B2 : JSL SetPrizeCoords : NOP
;================================================================================
@@ -1087,9 +1113,9 @@ JSL ItemCheck_Library
org $8DDF38 ; <- 6DF38 - equipment.asm : 480
JSL ProcessMenuButtons
BCC _equipment_497
JMP.w _equipment_544
JMP _equipment_544
ResetEquipment:
JSR.w RestoreNormalMenu ; (short)
JSR RestoreNormalMenu ; (short)
RTL
NOP #3
@@ -1100,9 +1126,9 @@ org $8DDF88 ; <- 6DF88 - equipment.asm : 544
_equipment_544:
;--------------------------------------------------------------------------------
org $8DEB98 ; <- 6EB98 - equipment.asm : 1803
LDA.w #$3C60 : STA $FFBE, Y
ORA.w #$8000 : STA $007E, Y
ORA.w #$4000 : STA $0084, Y
LDA.w #$3C60 : STA.w $FFBE, Y
ORA.w #$8000 : STA.w $007E, Y
ORA.w #$4000 : STA.w $0084, Y
JSL AddYMarker : NOP #2
;--------------------------------------------------------------------------------
org $8DF789+6 ; <- 6F789+6 (not in disassembly) - red bottle hud tile, lower right
@@ -1144,15 +1170,18 @@ JSL CheckCloseItemMenu
org $8DEE70 ; <- 6EE70 - equipment.asm : 2137
JSL PrepItemScreenBigKey : NOP
;--------------------------------------------------------------------------------
org $0DDEA5 ; LDA.b Joy1A_New : BEQ .wait_for_button
JSL.l HandleEmptyMenu : RTS
org $0DEB3C ; LDA.w ItemCursor : AND.w #$00FF
JML.l MaybeDrawEquippedItem : NOP #2
org $0DE363 ; LDA.b #$04 : STA.w SubModuleInterface
JSL.l RestoreMenu_SetSubModule : NOP
org $8DDEA5 ; LDA.b Joy1A_New : BEQ .wait_for_button
JSL HandleEmptyMenu : RTS
org $8DEB3C ; LDA.w ItemCursor : AND.w #$00FF
JML MaybeDrawEquippedItem : NOP #2
org $8DE363 ; LDA.b #$04 : STA.w SubModuleInterface
JSL RestoreMenu_SetSubModule : NOP
;--------------------------------------------------------------------------------
org $88D395 ; <- 45395 - ancilla_bird_travel_intro.asm : 253
JSL.l UpgradeFlute : NOP #2
JSL UpgradeFlute : NOP #2
;--------------------------------------------------------------------------------
org $87A408 ; LDA.l $7EF34C
JSL FluteCallForDuck
;--------------------------------------------------------------------------------
org $85E4D7 ; <- 2E4D7 - sprite_witch.asm : 213
JSL RemoveMushroom : NOP #2
@@ -1160,9 +1189,9 @@ JSL RemoveMushroom : NOP #2
org $85F55F ; <- 2F55F - sprite_potion_shop.asm : 59
JSL LoadPowder
;--------------------------------------------------------------------------------
org $85F681 ; <- 2F681 - sprite_potion_shop.asm : 234
JSL DrawPowder : RTS
NOP #8
org $85F67B ; <- 2F67B - sprite_potion_shop.asm : 234
JSL DrawPowder
RTS
;--------------------------------------------------------------------------------
org $85F65D ; <- 2F65D - sprite_potion_shop.asm : 198
JSL CollectPowder : NOP #5
@@ -1176,6 +1205,21 @@ JSL DrawMushroom
org $85EE97 ; <- 2EE97 - sprite_mushroom.asm : 81
NOP #14
;--------------------------------------------------------------------------------
org $86C09C ; <- - bank06.asm : 1885 (JSL SpritePrep_MagicShopAssistant)
JSL SpritePrep_ShopKeeper_PotionShop
;--------------------------------------------------------------------------------
org $85F568 ; <- 2F568 - sprite_potion_shop.asm
LDA.b #$B0 : STA.w SpritePosYLow, Y : LDA.b #$90 : STA.w SpritePosXLow, Y ; manually set position of powder item
LDA.b #$21 : STA.w SpritePosYHigh, Y : LDA.b #$12 : STA.w SpritePosXHigh, Y
JMP MagicShopAssistant_SpawnObject
;--------------------------------------------------------------------------------
org $85F633 ; <- 2F633 - sprite_potion_shop.asm
JSL Sprite_ShopKeeperPotion : RTS : NOP ;; TODO: i don't remember prices being set on top of the player
PotionShopkeeperJumpTable:
;--------------------------------------------------------------------------------
org $85EB1D ; <- 2EB1D - sprite_bottle_vendor.asm : 158
JSL Multiworld_BottleVendor_GiveBottle
;--------------------------------------------------------------------------------
org $87A36F ; <- 3A36F - Bank07.asm : 5679
NOP #5
org $87A379 ; <- 3A379 - Bank07.asm : 5687
@@ -1377,7 +1421,7 @@ JSL RNG_Enemy_Drops
org $8DFDCB
JSL UpdateHearts
RTS
org $8DF191 : JSL.l ColorAnimatedHearts : BRA + : NOP #7 : +
org $8DF191 : JSL ColorAnimatedHearts : BRA + : NOP #7 : +
org $8DFC4C ; <- 6FC4C - headsup_display.asm : 836 (LDA $7EF36E : AND.w #$00FF : ADD.w #$0007 : AND.w #$FFF8 : TAX)
JML OnDrawHud : NOP #197 ; why? it's not hurting anyone lol
@@ -1396,39 +1440,38 @@ org $8DED04 ; <- 6ED04 - equipment.asm : 1963 (REP #$30)
JSL DrawHUDDungeonItems
;--------------------------------------------------------------------------------
; Insert our version of the hud tilemap
; Commented out because incorporated in hook in special_weapons.asm
; org $8DFA96 ; <- 6FA96 - headsup_display.asm : 626 (LDX.w #.hud_tilemap)
; LDX.w #HUD_TileMap
; org $8DFA9C ; <- 6FA9C - headsup_display.asm : 629 (MVN $0D, $7E ; $Transfer 0x014A bytes from $6FE77 -> $7EC700)
; MVN $A17E
org $8DFA96 ; <- 6FA96 - headsup_display.asm : 626 (LDX.w #.hud_tilemap)
LDX.w #HUD_TileMap
org $8DFA9C ; <- 6FA9C - headsup_display.asm : 629 (MVN $0D, $7E ; $Transfer 0x014A bytes from $6FE77 -> $7EC700)
MVN $A17E
;--------------------------------------------------------------------------------
org $8DFB1F : JSL CheckHUDSilverArrows
org $8DFB29 : BRA UpdateHUDBuffer_update_item_check_arrows
;--------------------------------------------------------------------------------
org $8DF1AB : JSR.w RebuildHUD_update
org $8DDFC8 : JSR.w RebuildHUD_update
org $8DDB85 : JSR.w RefreshIcon_UpdateHUD : BRA + : NOP : +
org $8DF1AB : JSR RebuildHUD_update
org $8DDFC8 : JSR RebuildHUD_update
org $8DDB85 : JSR RefreshIcon_UpdateHUD : BRA + : NOP : +
;--------------------------------------------------------------------------------
org $87A205 : JSL.l RebuildHUD_update_long
org $87A1A4 : JSL.l RebuildHUD_update_long
org $87A1CF : JSL.l RebuildHUD_update_long
org $87A21D : JSL.l RebuildHUD_update_long
org $87A235 : JSL.l RebuildHUD_update_long
org $8AEF62 : JSL.l RebuildHUD_update_long
org $87A205 : JSL RebuildHUD_update_long
org $87A1A4 : JSL RebuildHUD_update_long
org $87A1CF : JSL RebuildHUD_update_long
org $87A21D : JSL RebuildHUD_update_long
org $87A235 : JSL RebuildHUD_update_long
org $8AEF62 : JSL RebuildHUD_update_long
;--------------------------------------------------------------------------------
org $8DFFE1
RebuildHUD_update_long:
JSR.w RebuildHUD_update : RTL
JSR RebuildHUD_update : RTL
RefreshIcon_UpdateHUD:
INC.w UpdateHUDFlag
JSR.w RebuildHUD
JSR.w UpdateEquippedItem
LDA.b #$01 : STA.l UpdateHUDFlag
JSR RebuildHUD
JSR UpdateEquippedItem
RTS
warnpc $8E8000
;--------------------------------------------------------------------------------
org $8DEDE8
JSL.l DrawHeartPiecesMenu : BRA DrawEquipment_in_a_dungeon
JSL DrawHeartPiecesMenu : BRA DrawEquipment_in_a_dungeon
;--------------------------------------------------------------------------------
;================================================================================
@@ -1595,6 +1638,14 @@ JSL HUDRebuildIndoor : NOP #4
org $829A35 ; <- 11A35 : Bank02.asm:4789 - (JSL HUD.RebuildIndoor.palace)
JSL HUDRebuildIndoorHole
;================================================================================
; Skull Woods back entrance fire fix
;--------------------------------------------------------------------------------
org $899C42 ; ancilla_init.asm:4264 - (LDA $8A : AND.b #$40 : BEQ AddDoorDebris.spawn_failed)
JML Multiworld_ConsumingFire_TransmuteToSkullWoodsFire
NOP #2
ConsumingFire_TransmuteToSkullWoodsFire_continue:
;================================================================================
; Pendant / Crystal Fixes
;--------------------------------------------------------------------------------
@@ -1657,6 +1708,9 @@ JSL CheckHeraBossDefeated : BNE + : NOP
LDX.b #$F1 : STX.w MusicControlRequest
+
;================================================================================
org $828D6E
JSL FallingMusicFadeOut : BRA + : NOP #2 : +
;================================================================================
org $829090 ; <- 11090 - Bank02.asm:3099 (LDA $7EF374 : LSR A : BCS BRANCH_GAMMA)
JSL CheckHeraBossDefeated : BNE + : NOP
STX.w MusicControlRequest ; DON'T MOVE THIS FORWARD OR MADNESS AWAITS
@@ -1818,8 +1872,16 @@ JSL FixAgahnimFollowers
org $828823 ; <- 10823 - Bank02.asm:1560 (LDA $7EF3C5 : BEQ .ignoreInput)
JSL AllowSQ
;--------------------------------------------------------------------------------
org $88C45F ; <- 4445F - ancilla_recieve_item.asm:157 (STZ $02E9)
JSL PostItemAnimation : NOP #2
org $88C45F ; <- 4445F - ancilla_recieve_item.asm:157 (STZ $02E9 : LDA $0C5E, X)
Ancilla_ReceiveItem_optimus:
JML PostItemAnimation : NOP #2
org $88C548 ; <- 44548 - ancilla_recieve_item.asm:297 (CMP.b #$28 : BNE .dontGiveRupees)
JML Multiworld_Ancilla_ReceiveItem_stillInMotion
Ancilla_ReceiveItem_stillInMotion_moveon:
org $88C560 ; <- 44548 - ancilla_recieve_item.asm:307
Ancilla_ReceiveItem_dontGiveRupees:
;--------------------------------------------------------------------------------
org $9EE90A ; <- F690A
JSL ItemCheck_OldMan : NOP #2
@@ -1834,7 +1896,7 @@ org $868F16 ; <- 30F16
JSL ItemCheck_ZoraKing
;--------------------------------------------------------------------------------
org $859ACA ; <- 29ACA
JSL $9DE1AA ; Sprite_SpawnFlippersItem
JSL Zora_RegurgitateFlippers
;--------------------------------------------------------------------------------
org $9DE1E4 ; <- EE1E4 - sprite_great_catfish.asm : 489
JSL LoadZoraKingItemGFX : NOP #2
@@ -1858,7 +1920,7 @@ org $8690BD ; <- 310BD - SpritePrep_FluteBoy : 2202
JSL ItemCheck_TreeKid2
org $86AF9B ; <- 32F9B - FluteBoy_Chillin : 73 : LDA $7EF34C : CMP.b #$02 : BCS .player_has_flute
LDA HasGroveItem : AND.b #$01
LDA.l HasGroveItem : AND.b #$01
db $D0 ; BNE
org $86B062 ; <- 33062 - FluteAardvark_InitialStateFromFluteState : 225 : LDA $7EF34C : AND.b #$03 : !BGE #$05
@@ -1919,7 +1981,12 @@ JSL MarkThrownItem
org $85FAFF ; <- 2FAFF - sprite_mad_batter.asm:57 (LDA $7EF37B : CMP.b #$01 : BCS .magic_already_doubled)
JSL ItemCheck_MagicBat : BEQ + : RTS : NOP : +
;================================================================================
org $86BD6C ; <- 33D6C - sprite_middle_aged_man.asm:143 (JSL Link_ReceiveItem)
JSL Multiworld_MiddleAgedMan_ReactToSecretKeepingResponse
org $86BE81 ; <- 33E81 - sprite_hobo.asm:150 (JSL Link_ReceiveItem)
JSL Multiworld_Hobo_GrantBottle
org $8589B4 ; <- 289B4 ; sprite_master_sword.asm:183 (JSL Link_ReceiveItem)
JSL Multiworld_MasterSword_GrantToPlayer
;================================================================================
; Boss Hearts
;--------------------------------------------------------------------------------
@@ -1986,7 +2053,7 @@ dw FakeFlipperProtection
org $82FFC7
FakeFlipperProtection:
JSR.w $029485
JSR RecoverPositionAfterDrowning
JSL protectff
RTS
;--------------------------------------------------------------------------------
@@ -2046,7 +2113,7 @@ JSL BeepLogic : NOP #6
; Item Downgrade Fix
;--------------------------------------------------------------------------------
org $89865E ; <- 4865E
JSL $9BEE1B ; fix something i wrote over i shouldn't have
JSL Palettes_Load_LinkGloves ; fix something i wrote over i shouldn't have
;--------------------------------------------------------------------------------
org $898638 ; <- 48638 - ancilla_init.asm:737 - LDA .item_values, Y : BMI .dontWrite (BMI)
JSL ItemDowngradeFix
@@ -2064,6 +2131,9 @@ NOP #6 ; remove check
org $868841 ; <- 30841 - sprite_prep.asm:269 (LDA $0D00, X : ADD.b #$03 : STA $0D00, X)
JSL Mantle_CorrectPosition : NOP #2
;--------------------------------------------------------------------------------
org $8297FD ; <- bank02 : Module07_19_MirrorFade (STZ.b $11 : STZ.b $14)
JSL MirrorScrollSpawnZelda
;--------------------------------------------------------------------------------
org $8DFA53 ; <- 6FA53 - hud check for lantern
JSL LampCheck
;--------------------------------------------------------------------------------
@@ -2200,7 +2270,14 @@ JSL QuickSwap
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:
CMP.b #$06 : db $F0 ; BEQ
; 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)
@@ -2218,7 +2295,7 @@ Overworld_Entrance_BRANCH_RHO: ; branch here to continue into door
;================================================================================
; Paradox Cave Shopkeeper Fixes
;--------------------------------------------------------------------------------
org $808C19 ; Bank00.asm 1633 (LDA.b #$01 : STA MDMAEN)
org $808C19 ; Bank00.asm 1633 (LDA.b #$01 : STA DMAENABLE)
JSL ParadoxCaveGfxFix : NOP
;================================================================================
@@ -2253,7 +2330,7 @@ JSL LoadActualGearPalettesWithGloves : RTL
;--------------------------------------------------------------------------------
; Bunny Palette/Overworld Map Bugfix
;--------------------------------------------------------------------------------
org $82FDF0 ; <- 017df0 - bank0E (LDA [$00] : STA $7EC300, X : STA $7EC500, X)
org $82FDF0 ; <- 017df0 - bank0E (LDA [Scrap00] : STA $7EC300, X : STA $7EC500, X)
JSL LoadGearPalette_safe_for_bunny : RTS
;================================================================================
@@ -2299,6 +2376,8 @@ org $80D17E+178 : db ExpandedTrinexx>>0
; Use above sheet in Hyrule castle courtyard after rain state.
org $80DB9E ; Hyrule Castle GFX Sprite Sheet 4 on [LW1]
db $3F
org $80DBA2 ; Hyrule Castle GFX Sprite Sheet 4 on [RainState]
db $3F
org $80DC0A ; Hyrule Castle GFX Sprite Sheet 4 on [LW2]
db $3F
;--------------------------------------------------------------------------------
@@ -2362,18 +2441,18 @@ dw 37, 11 : db $FB, $40, $00, $00
;--------------------------------------------------------------------------------
org $87839E ; bunny BAGE check
BunnyRead:
JSR.w $07B5A9 ; check A button
JSR Link_CheckNewAPress
BCC .noA
JSR.w CheckIfReading
JSR CheckIfReading
BNE .noread
JSR.w $07B4DB
JSR Link_PerformRead
NOP
.noread
.noA
org $87FFF4
CheckIfReading:
JSR.w $07D36C ; check action
JSR Link_HandleLiftables
LDA.b #$80 : TRB.b $3B
CPX.b #$04
RTS
@@ -2406,13 +2485,13 @@ org $8EE828 : JSL PreparePointer : LDA.b [CreditsPtr],Y : NOP
org $8EE83F : LDA.b [CreditsPtr],Y : NOP
org $8EE853
LDA.b [CreditsPtr],Y : NOP : AND.w #$00FF : ASL A : JSL CheckFontTable
org $8EE86D : JSL RenderCreditsStatCounter : JMP.w AfterDeathCounterOutput
org $8EE86D : JSL RenderCreditsStatCounter : JMP AfterDeathCounterOutput
org $82857D : JSL LoadOverworldCreditsTiles
;================================================================================
; Fast credits
org $8EC2B1 : JSL FlagFastCredits
org $82A096 : JSL DumbFlagForMSU
org $8EC3AF : JSL FastCreditsScrollOW : JMP.w $0EC3C7
org $8EC3AF : JSL FastCreditsScrollOW : JMP Credits_ScrollScene_Overworld_no_scroll
org $8EC41F : JSL FastCreditsCutsceneUnderworldY
org $8EC42C : JSL FastCreditsCutsceneUnderworldX
org $8EC488 : JSL FastCreditsCutsceneTimer
@@ -2451,153 +2530,14 @@ org $81C65F
JSL FixJingleGlitch
;================================================================================
; Bomb-Only Mode
; Hooks for when submenu opens
;--------------------------------------------------------------------------------
org $86ECC3 ; Bank06.asm@4704 (PHX : TAX : LDA.l .damage_classes, X : PLX)
JSL DamageClassCalc
BRA + : NOP #29 : +
;--------------------------------------------------------------------------------
org $8882D4 ; Bank08.asm@445 (PHX : TYX : ... )
JSL Utility_CheckAncillaOverlapWithSprite
BRA + : NOP #5 : +
;--------------------------------------------------------------------------------
org $888DB1 ; Bank08.asm@1207 (PHY : PHX : TYX : ... )
JSL Utility_CheckAncillaOverlapWithSprite
BRA + : NOP #7 : +
;--------------------------------------------------------------------------------
org $88E252 ; Bank08.asm@1770 (PHY : PHX : TYX : ... )
JSL Utility_CheckAncillaOverlapWithSprite
BRA + : NOP #7 : +
;--------------------------------------------------------------------------------
org $8882E8 ; Bank08.asm@456 (LDA $0DB0, Y : CMP.b #$03)
JSL Utility_CheckHelmasaurKingCollision
NOP
;--------------------------------------------------------------------------------
org $86ED94 ; Bank06.asm@4866 (LDA $0E60, X : AND.b #$40)
JSL Utility_CheckImpervious
NOP
;--------------------------------------------------------------------------------
org $868F94 ; sprite_prep.asm@1984 (INC $0BA0, X : JSL Sprite_InitializedSegmented)
JSL AllowBombingMoldorm
BRA + : NOP : +
;--------------------------------------------------------------------------------
org $86892F ; sprite_prep.asm@548 (LDA $0D00, X : SUB #$0C : STA $0D00, X : ...)
JSL AllowBombingBarrier
RTS : NOP #7
;--------------------------------------------------------------------------------
org $8DE4BF ; equipment.asm@1247 (LDA $7EF343 : AND.w #$00FF : BEQ .gotNoBombs : ...)
JSL DrawBombInMenu
BRA + : NOP #13 : +
;--------------------------------------------------------------------------------
org $8DFB6A ; headsup_display@727 (CPX #$0004 : BNE .bombsNotEquipped : LDA #$0001)
JSL DrawBombInYBox
BRA + : NOP #2 : +
;--------------------------------------------------------------------------------
org $8DEE05 ; equipment.asm@2065 (LDA $7EF359 : AND.w #$00FF : CMP.w #$00FF : ...)
JSL DrawSwordInMenu
BRA + : NOP #16 : +
;--------------------------------------------------------------------------------
org $8DFA92 ; headsup_display.asm@622 (PDB : LDA.w #$0149 : ...)
JSL DrawBombOnHud
BRA + : NOP #8 : +
;--------------------------------------------------------------------------------
org $889EF8 ; ancilla_bomb@1438 (LDA.w #$04 : STA $0B)
JSL SetBombSpriteColor
;--------------------------------------------------------------------------------
; bomb icons with numbers
org $8DFC51 ; we freed this up earlier in hooks; probably shouldn't use it but *shrug*
db $F5, $20, $F5, $20, $F5, $20, $F5, $20
db $B2, $3C, $B3, $3C, $C2, $3C, $17, $3C
db $B2, $2C, $B3, $2C, $C2, $2C, $18, $2C
db $B2, $24, $B3, $24, $C2, $24, $19, $24
db $B2, $28, $B3, $28, $C2, $28, $1A, $28
db $B2, $28, $B3, $28, $C2, $28, $1B, $28
org $828818
JSL OnMenuLoad
org $82A463
JSL OnMenuLoad
; bomb icons without numbers
; $8DFC81
db $F5, $20, $F5, $20, $F5, $20, $F5, $20
db $B2, $3C, $B3, $3C, $C2, $3C, $C2, $7C
db $B2, $2C, $B3, $2C, $C2, $2C, $C2, $6C
db $B2, $24, $B3, $24, $C2, $24, $C2, $64
db $B2, $28, $B3, $28, $C2, $28, $C2, $68
db $B2, $28, $B3, $28, $C2, $28, $C2, $68
warnpc $8DFC51+197 ; we only filled in 197 NOPs so don't overwrite past that
;--------------------------------------------------------------------------------
org $1EDCF8 ; bank_1E.asm@16086 (LDX $0202 : ...)
JSL SetBeeType
BRA + : NOP #15 : +
;--------------------------------------------------------------------------------
org $1EB5E8 ; bank_1E.asm@9387 (LDA #$03 : STA $0D80, X)
JSL ArrghusBoing
;--------------------------------------------------------------------------------
org $1EDFAF ; bank_1E.asm@16607 (.next_sprite)
JSL BeeCheckTarget
BCS .bee_valid_target
BRA .bee_unsuitable_target
NOP #48
.bee_unsuitable_target
skip 11
.bee_valid_target
;--------------------------------------------------------------------------------
org $87F889 ; free rom from F877 - F88F; the starting part of this is used in quadrant glitch fix in overworld fork, however.
Link_UseItemLong:
PER .done-1
JMP.w ($0000)
.done
RTL
warnpc $87F890
;--------------------------------------------------------------------------------
org $86F2DC ; bank_06.asm@22763 (LDA.w $037A : AND.b #$10)
JSL CheckBugNet : NOP
org $86EB91 ; bank_06.asm@21178 (LDA.w $037A : AND.b #$10)
JSL CheckBugNet : NOP
;--------------------------------------------------------------------------------
org $86ED77 ; bank_06.asm@21597 (LDA.w $0301 : AND.b #$0A : ...)
JSL SetHammerClass
BRA + : NOP #7 : +
;================================================================================
; Variable Ganon Vulnerability
;--------------------------------------------------------------------------------
org $88BBD4 ; ancilla_magic_powder.asm@253 (LDA #$0A : JSL Ancilla_CheckSpriteDamage.preset_class)
JSL Ganon_CheckPowderVulnerability
NOP #2
;--------------------------------------------------------------------------------
org $9D8F4E ; sprite_ganon.asm@325 (LDA $04C5 : CMP #$02)
JSL Ganon_CheckInvincible
NOP
;--------------------------------------------------------------------------------
org $8DD628 ; Bank0D.asm@1266 (LDA $0B6B, Y : AND #$02)
JSL CheckBeeBoss
NOP
;--------------------------------------------------------------------------------
org $8DD676 ; Bank0D.asm@1303 (TYX : JSL Ancilla_CheckSpriteDamage.preset_class)
JSL Ganon_CheckBeeVulnerability
NOP
;--------------------------------------------------------------------------------
;================================================================================
; Pseudo-Sword Mode
;--------------------------------------------------------------------------------
org $86ED70 ; Bank06.asm@4842 (LDA $06ED39, X : STA $0CF2)
JSL StoreSwordDamage
;================================================================================
; Item-On-B
;--------------------------------------------------------------------------------
org $8DEB3C
JSL DrawBIndicator : BRA + : NOP #3 : +
;--------------------------------------------------------------------------------
org $879CE6 ; Bank07.asm@4632 (LDA #$80 : TSB $3A : ...)
JSL UseItem
BCC + : RTS : +
JSR $9C56
NOP #1
;--------------------------------------------------------------------------------
;================================================================================
; Text Renderer
;--------------------------------------------------------------------------------
org $8EF51B : JML RenderCharExtended
@@ -2616,8 +2556,8 @@ org $8EF285 : JSL RenderCharSetColorExtended_close : NOP
;================================================================================
; VRAM
;--------------------------------------------------------------------------------
org $008BE5 ; hijack stripes
JSL.l TransferVRAMStripes
org $808BE5 ; hijack stripes
JSL TransferVRAMStripes
;===================================================================================================
; Fix fairy palette on file select
@@ -2660,14 +2600,14 @@ org $899BBE : JSL TransferItemReceiptToBuffer_using_GraphicsID
;===================================================================================================
org $1D8E75 : RTS
org $1DB5D8 : JML.l $9DB5DF
org $1DB605 : JML.l $9DB60C
org $1DBBF1 : JML.l $9DBBF8
org $1DBC19 : JML.l $9DBC20
org $1DB5D8 : JML $9DB5DF
org $1DB605 : JML $9DB60C
org $1DBBF1 : JML $9DBBF8
org $1DBC19 : JML $9DBC20
org $1DC072 : JMP.w $9DC079
org $1DC0A5 : JMP.w $9DC0AC
org $1DED3B : JML.l $9DED42
org $1DED7A : JML.l $9DED81
org $1DED3B : JML $9DED42
org $1DED7A : JML $9DED81
org $05B55E : JMP ++ : ++
org $05B580 : JMP ++ : ++
@@ -2691,3 +2631,29 @@ org $1ED122 : JMP ++ : ++
org $1ED141 : JMP ++ : ++
;===================================================================================================
;--------------------------------------------------------------------------------
; Back of tavern fixes
;--------------------------------------------------------------------------------
org $828177 ; JSL Underworld_LoadCustomTileAttributes
JSL TurnAroundOnUnderworld
org $82ABC1 ; JSL Link_HandleMovingAnimation_FullLongEntry
JSL TurnUpOnOverworld
org $82E297 ; LDA.w #$0002 : STA.b $2F
JSL WalkUpOnOverworld
NOP
org $82E36F
JSL CheckStairsAdjustment
NOP
org $82D7D2 ; BEQ .face_up
NOP #2 ; this fixes Link's direction after mirroring and falling after entering through back of tavern
;--------------------------------------------------------------------------------
; Enable new room header table
;--------------------------------------------------------------------------------
org $81B5E6
LDA.b #$30

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