├── .gitignore ├── LTTP_RND_GeneralBugfixes.asm ├── accessibility.asm ├── bin ├── linux │ └── asar ├── macos │ └── asar └── windows │ └── asar.exe ├── bookofmudora.asm ├── boots.asm ├── bugfixes.asm ├── build.bat ├── build.sh ├── build_linux.sh ├── capacityupgrades.asm ├── controllerjank.asm ├── crypto.asm ├── cuccostorm.asm ├── custompalettes.asm ├── darkworldspawn.asm ├── data ├── 99ff1_bombos.gfx ├── 99ff1_quake.gfx ├── a6fc4_bombos.gfx ├── a6fc4_ether.gfx ├── bossicons.4bpp ├── bsodencode.txt ├── bsodfont.1bpp ├── bsodhex.2bpp ├── c2807_v3.bin ├── c2807_v3.gfx ├── c2807_v4.bin ├── c2807_v4.gfx ├── c2e3e.bin ├── c2e3e.gfx ├── credits.txt ├── creditscharmapbighi.txt ├── creditscharmapbiglo.txt ├── creditscharmapsmall_green.txt ├── creditscharmapsmall_red.txt ├── creditscharmapsmall_yellow.txt ├── customitems.4bpp ├── customitems.png ├── damage_table.bin ├── eventitems.bin ├── eventitems.gfx ├── fileselectgfx.2bpp ├── fileselectgfx.png ├── hudpalette.pal ├── i18n_en.bin ├── ice_bombos.bin ├── ice_palace_floor.bin ├── kanjireplacements.asm ├── map_icons.gfx ├── newfont.bin ├── newfont_inverted.bin ├── newitems.bin ├── newitems.gfx ├── newitems.pal ├── newitems2.bin ├── newitems2.gfx ├── playernamecharmap.asm ├── playernamecharmap.bin ├── playernamestripes_1.bin ├── playernamestripes_2.asm ├── playernamestripes_2.bin ├── playernamestripes_3.asm ├── playernamestripes_4.asm ├── sheet178.gfx ├── sheet73.bin ├── sheet73.gfx ├── smallchars.2bpp ├── textbytecharmap.txt ├── textwordcharmap.txt ├── zsnes_pal.bin ├── zsnes_tilemap.bin └── zsnes_tiles.bin ├── decompresseditemgraphics.asm ├── decryption.asm ├── dialog.asm ├── doorframefixes.asm ├── dungeondrops.asm ├── dungeonmap.asm ├── elder.asm ├── enemy_adjustments.asm ├── entrances.asm ├── eventdata.asm ├── events.asm ├── externalhooks.asm ├── failure.asm ├── fairyfixes.asm ├── fastcredits.asm ├── fastrom.asm ├── fileselect.asm ├── flipperkill.asm ├── floodgatesoftlock.asm ├── flute.asm ├── framehook.asm ├── glitched.asm ├── goalitem.asm ├── halfmagicbat.asm ├── hardmode.asm ├── hashalphabet.asm ├── hashalphabethooks.asm ├── heartbeep.asm ├── heartpieces.asm ├── hextodec.asm ├── hooks.asm ├── hud.asm ├── hudtext.asm ├── icepalacegraphics.asm ├── init.asm ├── initsramtable.asm ├── inventory.asm ├── inverted.asm ├── invertedmaps.asm ├── invertedstatic.asm ├── itemdatatables.asm ├── itemdowngrade.asm ├── itemtext.asm ├── lampmantlecone.asm ├── license.txt ├── maidencrystals.asm ├── medallions.asm ├── msu.asm ├── music.asm ├── musicvolumes.asm ├── newhud.asm ├── newitems.asm ├── npcitems.asm ├── overworldmap.asm ├── password.asm ├── pendantcrystalhud.asm ├── playername.asm ├── potions.asm ├── quickswap.asm ├── ram.asm ├── registers.asm ├── retro.asm ├── rngfixes.asm ├── roomloading.asm ├── save.asm ├── servicerequest.asm ├── sharedplayerpalettefix.asm ├── shopkeeper.asm ├── spc.asm ├── spriteswap.asm ├── sram.asm ├── staticrng.asm ├── stats.asm ├── stats ├── credits.asm ├── font.2bpp ├── fonttable.asm ├── main.asm └── statConfig.asm ├── swordswap.asm ├── tables.asm ├── tablets.asm ├── textrenderer.asm ├── timer.asm ├── toast.asm ├── tournament.asm ├── utilities.asm ├── vanillalabels.asm └── zelda.asm /.gitignore: -------------------------------------------------------------------------------- 1 | tournament.asm 2 | /build 3 | /.idea -------------------------------------------------------------------------------- /bin/linux/asar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/bin/linux/asar -------------------------------------------------------------------------------- /bin/macos/asar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/bin/macos/asar -------------------------------------------------------------------------------- /bin/windows/asar.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/bin/windows/asar.exe -------------------------------------------------------------------------------- /bookofmudora.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Randomize Book of Mudora 3 | ;-------------------------------------------------------------------------------- 4 | LoadLibraryItemGFX: 5 | %GetPossiblyEncryptedItem(LibraryItem, SpriteItemValues) 6 | JSL.l AttemptItemSubstitution 7 | JSL.l ResolveLootIDLong 8 | STA.w SpriteID, X 9 | JSL.l PrepDynamicTile_loot_resolved 10 | RTL 11 | ;-------------------------------------------------------------------------------- 12 | DrawLibraryItemGFX: 13 | PHA 14 | LDA.w SpriteID, X 15 | JSL.l DrawDynamicTile 16 | PLA 17 | RTL 18 | ;-------------------------------------------------------------------------------- 19 | SetLibraryItem: 20 | LDY.w SpriteID, X 21 | JSL.l ItemSet_Library ; contains thing we wrote over 22 | RTL 23 | ;-------------------------------------------------------------------------------- 24 | 25 | ;0x0087 - Hera Room w/key 26 | ;================================================================================ 27 | ; Randomize Bonk Keys 28 | ;-------------------------------------------------------------------------------- 29 | LoadBonkItemGFX: 30 | LDA.b #$08 : STA.w SpriteOAMProp, X ; thing we wrote over 31 | LoadBonkItemGFX_inner: 32 | LDA.b #$00 : STA.l RedrawFlag 33 | JSR LoadBonkItem 34 | JSL.l AttemptItemSubstitution 35 | JSL.l ResolveLootIDLong 36 | STA.w SpriteItemType, X 37 | STA.w SpriteID, X 38 | JSL.l PrepDynamicTile 39 | PHA : PHX 40 | LDA.w SpriteID,X : TAX 41 | LDA.l SpriteProperties_standing_width,X : BNE + 42 | LDA.b #$00 : STA.l SpriteOAM : STA.l SpriteOAM+8 43 | + 44 | PLX : PLA 45 | RTL 46 | ;-------------------------------------------------------------------------------- 47 | DrawBonkItemGFX: 48 | PHA 49 | LDA.l RedrawFlag : BEQ .skipInit 50 | JSL.l LoadBonkItemGFX_inner 51 | BRA .done ; don't draw on the init frame 52 | 53 | .skipInit 54 | LDA.w SpriteID,X 55 | JSL.l DrawDynamicTileNoShadow 56 | 57 | .done 58 | PLA 59 | RTL 60 | ;-------------------------------------------------------------------------------- 61 | GiveBonkItem: 62 | JSR LoadBonkItem 63 | JSR.w AbsorbKeyCheck : BCC .notKey 64 | .key 65 | PHY : LDY.b #$24 : JSL.l AddInventory : PLY ; do inventory processing for a small key 66 | LDA.l CurrentSmallKeys : INC A : STA.l CurrentSmallKeys 67 | LDA.b #$2F : JSL.l Sound_SetSfx3PanLong 68 | LDA.b #$01 : STA.l UpdateHUDFlag 69 | RTL 70 | .notKey 71 | PHY : TAY : JSL.l Link_ReceiveItem : PLY 72 | RTL 73 | ;-------------------------------------------------------------------------------- 74 | LoadBonkItem: 75 | LDA.b RoomIndex ; check room ID - only bonk keys in 2 rooms so we're just checking the lower byte 76 | CMP.b #115 : BNE + ; Desert Bonk Key 77 | LDA.l BonkKey_Desert 78 | BRA ++ 79 | + : CMP.b #140 : BNE + ; GTower Bonk Key 80 | LDA.l BonkKey_GTower 81 | BRA ++ 82 | + 83 | LDA.b #$24 ; default to small key 84 | ++ 85 | RTS 86 | ;-------------------------------------------------------------------------------- 87 | AbsorbKeyCheck: 88 | PHA 89 | CMP.b #$24 : BEQ .key 90 | CMP.b #$A0 : BCC .not_key 91 | CMP.b #$B0 : BCS .not_key 92 | AND.b #$0F : ASL 93 | CMP.w DungeonID : BNE .not_key 94 | .key 95 | PLA 96 | SEC 97 | RTS 98 | .not_key 99 | PLA 100 | CLC 101 | RTS 102 | -------------------------------------------------------------------------------- /boots.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Boots State Modifier 3 | ;-------------------------------------------------------------------------------- 4 | ModifyBoots: 5 | PHA 6 | LDA.l BootsModifier : CMP.b #$01 : BNE + 7 | PLA : AND.l AbilityFlags : ORA.b #$04 : RTL ; yes boots 8 | + : CMP.b #$02 : BNE + 9 | PLA : AND.l AbilityFlags : AND.b #$FB : RTL ; no boots 10 | + : LDA.l FakeBoots : CMP.b #$01 : BNE + 11 | LDA.b LinkSlipping : BEQ ++ : LDA.b $59 : BNE + ; hover check 12 | ++ : PLA : AND.l AbilityFlags : ORA.b #$04 : RTL ; yes boots, not hovering 13 | + 14 | PLA 15 | AND.l AbilityFlags ; regular boots 16 | RTL 17 | ;-------------------------------------------------------------------------------- 18 | AddBonkTremors: 19 | PHA 20 | LDA.b $46 : BNE + ; Check for incapacitated Link 21 | JSL.l IncrementBonkCounter 22 | + 23 | LDA.l BootsModifier : CMP.b #$01 : BEQ + 24 | LDA.l BootsEquipment : BNE + ; Check for Boots 25 | PLA : RTL 26 | + 27 | PLA 28 | JSL.l AddDashTremor : JSL.l Player_ApplyRumbleToSprites ; things we wrote over 29 | RTL 30 | ;-------------------------------------------------------------------------------- 31 | BonkBreakableWall: 32 | PHX : PHP 33 | SEP #$30 ; set 8-bit accumulator and index registers 34 | LDA.l BootsModifier : CMP.b #$01 : BEQ + 35 | LDA.l BootsEquipment : BNE + ; Check for Boots 36 | PLP : PLX : LDA.w #$0000 : RTL 37 | + 38 | PLP : PLX 39 | LDA.w $0372 : AND.w #$00FF ; things we wrote over 40 | RTL 41 | ;-------------------------------------------------------------------------------- 42 | BonkRockPile: 43 | LDA.l BootsModifier : CMP.b #$01 : BEQ + 44 | LDA.l BootsEquipment : BNE + ; Check for Boots 45 | LDA.b #$00 : RTL 46 | + 47 | LDA.w TileActBE : AND.b #$70 ; things we wrote over 48 | RTL 49 | ;-------------------------------------------------------------------------------- 50 | GravestoneHook: 51 | LDA.l BootsModifier : CMP.b #$01 : BEQ + 52 | LDA.l BootsEquipment : BEQ .done ; Check for Boots 53 | + 54 | LDA.w $0372 : BEQ .done ; things we wrote over 55 | JML.l moveGravestone 56 | .done 57 | JML.l GravestoneHook_continue 58 | ;-------------------------------------------------------------------------------- 59 | JumpDownLedge: 60 | LDA.l BootsModifier : CMP.b #$01 : BEQ + 61 | LDA.l BootsEquipment : BNE + ; Check for Boots 62 | ; Disarm Waterwalk 63 | LDA.b LinkSlipping : CMP.b #$01 : BNE + 64 | STZ.b LinkSlipping 65 | + 66 | LDA.b IndoorsFlag : BNE .done : LDA.b #$02 : STA.b LinkLayer ; things we wrote over 67 | .done 68 | RTL 69 | ;-------------------------------------------------------------------------------- 70 | BonkRecoil: 71 | LDA.l BootsModifier : CMP.b #$01 : BEQ + 72 | LDA.l BootsEquipment : BNE + ; Check for Boots 73 | LDA.b #$16 : STA.b LinkRecoilZ : RTL 74 | + 75 | LDA.b #$24 : STA.b LinkRecoilZ ; things we wrote over 76 | RTL 77 | -------------------------------------------------------------------------------- /build.bat: -------------------------------------------------------------------------------- 1 | del ..\working.sfc 2 | copy ..\alttp.sfc ..\working.sfc 3 | %~dp0bin\windows\asar.exe LTTP_RND_GeneralBugfixes.asm ..\working.sfc 4 | cmd /k 5 | -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | rm ../working.sfc 4 | cp ../alttp.sfc ../working.sfc 5 | ./bin/macos/asar LTTP_RND_GeneralBugfixes.asm ../working.sfc 6 | -------------------------------------------------------------------------------- /build_linux.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | rm ../working.sfc 4 | cp ../alttp.sfc ../working.sfc 5 | ./bin/linux/asar -DFEATURE_PATREON_SUPPORTERS=1 LTTP_RND_GeneralBugfixes.asm ../working.sfc 6 | -------------------------------------------------------------------------------- /capacityupgrades.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Capacity Logic 3 | ;================================================================================ 4 | IncrementBombs: 5 | LDA.l BombCapacity : BEQ + ; Skip if we can't have bombs 6 | DEC 7 | CMP.l BombsEquipment : !BLT + 8 | LDA.l BombsEquipment 9 | CMP.b #99 : !BGE + 10 | INC : STA.l BombsEquipment 11 | + 12 | RTL 13 | ;-------------------------------------------------------------------------------- 14 | IncrementArrows: 15 | LDA.l ArrowCapacity : DEC 16 | CMP.l CurrentArrows : !BLT + 17 | LDA.l CurrentArrows 18 | CMP.b #99 : !BGE + 19 | INC : STA.l CurrentArrows 20 | + 21 | RTL 22 | ;-------------------------------------------------------------------------------- 23 | CompareBombsToMax: 24 | LDA.l BombCapacity 25 | CMP.l BombsEquipment 26 | RTL 27 | ;-------------------------------------------------------------------------------- 28 | -------------------------------------------------------------------------------- /controllerjank.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; D-Pad Invert 3 | ; runs in NMI, must use minimum possible # of cycles 4 | ;-------------------------------------------------------------------------------- 5 | ; Filtered Joypad 1 Register: [AXLR | ????] 6 | ; Filtered Joypad 1 Register: [BYST | udlr] [AXLR | ????] 7 | 8 | InvertDPad: 9 | LDA.l OneMindPlayerCount : BEQ .crowd_control 10 | 11 | LDA.l OneMindId 12 | AND.b #$03 13 | TAX 14 | LDA.l .onemind_controller_offset, X 15 | TAX 16 | 17 | LDA.w JOY1L,X : STA.w Scrap00 18 | LDA.w JOY1H,X : STA.w Scrap01 19 | 20 | LDA.b #$80 : STA.w WRIO ; reset this so latch can read it, otherwise RNG breaks 21 | 22 | JML.l InvertDPadReturn 23 | 24 | .crowd_control 25 | LDA.l ControllerInverter : BNE + 26 | 27 | LDA.w JOY1L : STA.b Scrap00 28 | LDA.w JOY1H : STA.b Scrap01 29 | JML.l InvertDPadReturn 30 | 31 | + DEC : BEQ .dpadOnly 32 | DEC : BEQ .buttonsOnly 33 | DEC : BEQ .invertBoth 34 | .swapSides 35 | REP #$20 ; set 16-bit accumulator 36 | LDA.w JOY1L 37 | BIT.w #$0840 : BEQ + : EOR.w #$0840 : + ; swap X/up 38 | BIT.w #$0180 : BEQ + : EOR.w #$0180 : + ; swap A/right 39 | BIT.w #$4200 : BEQ + : EOR.w #$4200 : + ; swap Y/left 40 | BIT.w #$8400 : BEQ + : EOR.w #$8400 : + ; swap B/down 41 | STA.b Scrap00 42 | SEP #$20 ; set 8-bit accumulator 43 | JML.l InvertDPadReturn 44 | .invertBoth 45 | REP #$20 ; set 16-bit accumulator 46 | LDA.w JOY1L 47 | BIT.w #$8040 : BEQ + : EOR.w #$8040 : + ; swap X/B 48 | BIT.w #$4080 : BEQ + : EOR.w #$4080 : + ; swap Y/A 49 | BIT.w #$0C00 : BEQ + : EOR.w #$0C00 : + ; swap up/down 50 | BIT.w #$0300 : BEQ + : EOR.w #$0300 : + ; swap left/right 51 | STA.b Scrap00 52 | SEP #$20 ; set 8-bit accumulator 53 | JML.l InvertDPadReturn 54 | .buttonsOnly 55 | REP #$20 ; set 16-bit accumulator 56 | LDA.w JOY1L 57 | BIT.w #$8040 : BEQ + : EOR.w #$8040 : + ; swap X/B 58 | BIT.w #$4080 : BEQ + : EOR.w #$4080 : + ; swap Y/A 59 | STA.b Scrap00 60 | SEP #$20 ; set 8-bit accumulator 61 | JML.l InvertDPadReturn 62 | .dpadOnly 63 | LDA.w JOY1L : STA.b Scrap00 64 | LDA.w JOY1H 65 | BIT.b #$0C : BEQ + : EOR.b #$0C : + ; swap up/down 66 | BIT.b #$03 : BEQ + : EOR.b #$03 : + ; swap left/right 67 | STA.b Scrap01 68 | JML.l InvertDPadReturn 69 | 70 | .onemind_controller_offset 71 | db 0 ; player 0 - JOY1L - joy1d1 72 | db 0 ; player 1 - JOY1L - joy1d1 73 | db 2 ; player 2 - JOY2L - joy2d1 74 | db 6 ; player 3 - JOY4L - joy2d2 75 | db 2 ; player 4 - JOY2L - joy2d1 76 | db 6 ; player 5 - JOY4L - joy2d2 77 | 78 | 79 | 80 | ;-------------------------------------------------------------------------------- 81 | 82 | HandleOneMindController: 83 | LDA.l OneMindPlayerCount 84 | BEQ .no_onemind 85 | 86 | REP #$20 87 | 88 | LDA.l OneMindTimerRAM 89 | DEC 90 | BPL .no_switch 91 | 92 | SEP #$20 93 | LDA.l OneMindId 94 | INC 95 | CMP.l OneMindPlayerCount 96 | BCC .no_wrap 97 | 98 | LDA.b #$01 ; reset to player 1 99 | 100 | .no_wrap 101 | STA.l OneMindId 102 | 103 | REP #$20 104 | LDA.l OneMindTimerInit 105 | 106 | .no_switch 107 | STA.l OneMindTimerRAM 108 | 109 | SEP #$20 110 | LDA.l OneMindId 111 | 112 | CMP.b #$04 ; is it player 4 or 5? 113 | BCC .no_multitap_switch 114 | 115 | STZ.w WRIO 116 | 117 | .no_multitap_switch 118 | 119 | .no_onemind 120 | STZ.b NMIDoneFlag 121 | 122 | JML $808034 ; reset frame loop 123 | 124 | -------------------------------------------------------------------------------- /crypto.asm: -------------------------------------------------------------------------------- 1 | ; Scrap04 used for n 2 | ; Scrap06 used for rounds 3 | ; Scrap08 use for dpScratch/MXResult (lower 32 of dpScratch) 4 | 5 | CryptoDelta: 6 | dd #$9e3779b9 7 | 8 | ; For use in an unrolled loop 9 | macro LSR32Single(value) 10 | CLC; 11 | LDA.b +2 : ROR : STA.b +2 ; do top part 12 | LDA.b : ROR : STA.b ; do bottom part 13 | ; ROR handles the carry from the upper byte for us 14 | endmacro 15 | 16 | macro ASL32Single(value) 17 | CLC 18 | LDA.b : ROL : STA.b ; do bottom part 19 | LDA.b +2 : ROL : STA.b +2 ; do top part 20 | ; ROL handles the carry from the lower byte for us 21 | endmacro 22 | 23 | CryptoMX: 24 | PHX 25 | 26 | ; upperScratch = (z>>5 ^ y <<2) 27 | LDA.w z : STA.b Scrap08 28 | LDA.w z+2 : STA.b Scrap08+2 29 | %LSR32Single(Scrap08) 30 | %LSR32Single(Scrap08) 31 | %LSR32Single(Scrap08) 32 | %LSR32Single(Scrap08) 33 | %LSR32Single(Scrap08) 34 | ;%LSR32(Scrap08,#$05) 35 | 36 | LDA.w y : STA.b Scrap08+4 37 | LDA.w y+2 : STA.b Scrap08+6 38 | %ASL32Single(Scrap08+4) 39 | %ASL32Single(Scrap08+4) 40 | ;%ASL32(Scrap08+4,#$02) 41 | 42 | LDA.b Scrap08 : EOR.b Scrap08+4 : STA.w CryptoScratch 43 | LDA.b Scrap08+2 : EOR.b Scrap08+6 : STA.w CryptoScratch+2 44 | 45 | ;================================ 46 | ; upperscratch2 = (y>>3^z<<4) 47 | 48 | LDA.w z : STA.b Scrap08 49 | LDA.w z+2 : STA.b Scrap08+2 50 | %ASL32Single(Scrap08) 51 | %ASL32Single(Scrap08) 52 | %ASL32Single(Scrap08) 53 | %ASL32Single(Scrap08) 54 | ;%ASL32(Scrap08,#$04) 55 | 56 | LDA.w y : STA.b Scrap08+4 57 | LDA.w y+2 : STA.b Scrap08+6 58 | %LSR32Single(Scrap08+4) 59 | %LSR32Single(Scrap08+4) 60 | %LSR32Single(Scrap08+4) 61 | ;%LSR32(Scrap08+4,#$03) 62 | 63 | LDA.b Scrap08 : EOR.b Scrap08+4 : STA.w CryptoScratch+4 64 | LDA.b Scrap08+2 : EOR.b Scrap08+6 : STA.w CryptoScratch+6 65 | 66 | ;================================ 67 | ; upperscratch = upperscratch + upperscratch2 ( == (z>>5^y<<2) + (y>>3^z<<4) ) 68 | 69 | LDA.w CryptoScratch : !ADD.w CryptoScratch+4 : STA.w CryptoScratch 70 | LDA.w CryptoScratch+2 : ADC.w CryptoScratch+6 : STA.w CryptoScratch+2 71 | 72 | ;================================ 73 | ; dpscratch = sum^y 74 | 75 | LDA.w Sum : EOR.w y : STA.b Scrap08 76 | LDA.w Sum+2 : EOR.w y+2 : STA.b Scrap08+2 77 | 78 | ;================================ 79 | ; dpscratch2 = (k[p&3^e]^z) 80 | 81 | LDA.w p : AND.w #$0003 : EOR.w e : ASL #2 : TAX ; put (p&3)^e into X 82 | LDA.w KeyBase, X : EOR.w z : STA.b Scrap08+4 83 | LDA.w KeyBase+2, X : EOR.w z+2 : STA.b Scrap08+6 84 | 85 | ;================================ 86 | ; upperscratch2 = dpscratch + dpscratch2 (== (sum^y) + (k[p&3^e]^z)) 87 | LDA.b Scrap08 : !ADD.b Scrap08+4 : STA.w CryptoScratch+4 88 | LDA.b Scrap08+2 : ADC.b Scrap08+6 : STA.w CryptoScratch+6 89 | 90 | ;================================ 91 | ; MXResult = uppserscratch ^ upperscratch2 92 | 93 | LDA.w CryptoScratch : EOR.w CryptoScratch+4 : STA.b Scrap08 94 | LDA.w CryptoScratch+2 : EOR.w CryptoScratch+6 : STA.b Scrap08+2 95 | PLX 96 | RTS 97 | 98 | XXTEA_Decode: 99 | PHP : PHB 100 | SEP #$30 ; set 8-bit accumulator and index 101 | 102 | LDA.b #$7F : PHA : PLB 103 | 104 | STZ.b Scrap04+1 ; set upper byte of n to be zero, so it can safely be accessed in 16-bit mode 105 | 106 | ; search for lookup table index to avoid division and multiplication 107 | LDX.b #0 108 | - 109 | LDA.l .n_lookup, X 110 | CMP.b Scrap04 : !BLT + 111 | INX 112 | BRA - 113 | + 114 | ; rounds = 6 + 52/n; 115 | LDA.l .round_counts, X : STA.b Scrap06 : STZ.b Scrap06+1 116 | 117 | REP #$20 ; set 16-bit accumulator 118 | 119 | ; sum = rounds*DELTA; 120 | TXA : ASL #2 : TAX 121 | LDA.l .initial_sums, X : STA.w Sum 122 | LDA.l .initial_sums+2, X : STA.w Sum+2 123 | 124 | ; y = v[0]; 125 | LDA.w v : STA.w y 126 | LDA.w v+2 : STA.w y+2 127 | --- 128 | LDA.w Sum : LSR #2 : AND.w #$0003 : STA.w e ; e = (sum >> 2) & 3; 129 | 130 | LDA.b Scrap04 : DEC : STA.w p 131 | -- BEQ + ; for (p=n-1; p>0; p--) { 132 | ; z = v[p-1]; 133 | ASL #2 : TAX 134 | LDA.w v-4, X : STA.w z 135 | LDA.w v-4+2, X : STA.w z+2 136 | 137 | ; y = v[p] -= MX; 138 | JSR CryptoMX 139 | LDA.w p : ASL #2 : TAX 140 | LDA.w v, X : !SUB.b Scrap08 : STA.w v, X : STA.w y 141 | LDA.w v+2, X : SBC.b Scrap08+2 : STA.w v+2, X : STA.w y+2 142 | 143 | LDA.w p : DEC : STA.w p : BRA -- ; } 144 | + 145 | 146 | ; z = v[n-1]; 147 | LDA.b Scrap04 : DEC : ASL #2 : TAX 148 | LDA.w v, X : STA.w z 149 | LDA.w v+2, X : STA.w z+2 150 | 151 | ; y = v[0] -= MX; 152 | JSR CryptoMX 153 | LDA.w v : !SUB.b Scrap08 : STA.w v : STA.w y 154 | LDA.w v+2 : SBC.b Scrap08+2 : STA.w v+2 : STA.w y+2 155 | 156 | ; sum -= DELTA; 157 | LDA.w Sum : !SUB.l CryptoDelta : STA.w Sum 158 | LDA.w Sum+2 : SBC.l CryptoDelta+2 : STA.w Sum+2 159 | 160 | DEC.b Scrap06 : BEQ + : JMP --- : + ; } while (--rounds); 161 | PLB : PLP 162 | RTL 163 | 164 | ; Note: uncomment any values from these tables that correspond to values of n actually in use 165 | ; (unused values are commented out to improve performance/ avoid wasting space) 166 | .n_lookup 167 | ;db 52 ; n > 52 168 | ;db 26 ; n is 27 to 52 169 | ;db 17 ; n is 18 to 26 170 | ;db 13 ; n is 14 to 17 171 | ;db 10 ; n is 11 to 13 172 | ;db 8 ; n is 9 to 10 173 | ;db 7 ; n is 8 174 | ;db 6 ; n is 7 175 | ;db 5 ; n is 6 176 | ;db 4 ; n is 5 177 | ;db 3 ; n is 4 178 | ;db 2 ; n is 3 179 | db 1 ; n is 2 180 | 181 | .round_counts 182 | ;db 6 ; n > 52 183 | ;db 7 ; n is 27 to 52 184 | ;db 8 ; n is 18 to 26 185 | ;db 9 ; n is 14 to 17 186 | ;db 10 ; n is 11 to 13 187 | ;db 11 ; n is 9 to 10 188 | ;db 12 ; n is 8 189 | ;db 13 ; n is 7 190 | ;db 14 ; n is 6 191 | ;db 16 ; n is 5 192 | ;db 19 ; n is 4 193 | ;db 23 ; n is 3 194 | db 32 ; n is 2 195 | 196 | .initial_sums 197 | ;dd (6*$9e3779b9)&$ffffffff ; n > 52 198 | ;dd (7*$9e3779b9)&$ffffffff ; n is 27 to 52 199 | ;dd (8*$9e3779b9)&$ffffffff ; n is 18 to 26 200 | ;dd (9*$9e3779b9)&$ffffffff ; n is 14 to 17 201 | ;dd (10*$9e3779b9)&$ffffffff ; n is 11 to 13 202 | ;dd (11*$9e3779b9)&$ffffffff ; n is 9 to 10 203 | ;dd (12*$9e3779b9)&$ffffffff ; n is 8 204 | ;dd (13*$9e3779b9)&$ffffffff ; n is 7 205 | ;dd (14*$9e3779b9)&$ffffffff ; n is 6 206 | ;dd (16*$9e3779b9)&$ffffffff ; n is 5 207 | ;dd (19*$9e3779b9)&$ffffffff ; n is 4 208 | ;dd (23*$9e3779b9)&$ffffffff ; n is 3 209 | dd (32*$9e3779b9)&$ffffffff ; n is 2 210 | 211 | -------------------------------------------------------------------------------- /cuccostorm.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | !CUCCO = $0B 3 | !INERT = $00 4 | !INIT = $08 5 | !ALIVE = $09 6 | !CUCCO_ENRAGED = $23 7 | 8 | CuccoStorm: 9 | 10 | SEP #$30 ; set 8-bit accumulator index registers 11 | LDA.l CuccoStormer : BEQ + ; only if storm is on 12 | LDA.b GameMode : CMP.b #$09 : BNE + ; only if outdoors 13 | LDA.l LoopFrames : AND.b #$7F : BNE + ; check every 128 frames 14 | 15 | - 16 | ;==== Find a Cucco 17 | 18 | LDY.b #$FF : PHY ; push "cucco not found" 19 | 20 | LDX.b #$00 : -- : CPX.b #$10 : !BGE .ldone 21 | LDA.w SpriteAITable, X : CMP.b #!ALIVE : BEQ +++ 22 | ; enemy not found 23 | CMP.b #!INERT : BNE ++ 24 | ; log inert enemy slot 25 | PLA : PHX 26 | BRA ++ 27 | +++ 28 | ; found an enemy 29 | LDA.l SpriteTypeTable, X : CMP.b #!CUCCO : BNE ++ 30 | ; it's a cucco 31 | TXY ; record where we found the living cucco in case we don't find any angry ones 32 | LDA.w SpriteAuxTable, X : CMP.b #!CUCCO_ENRAGED : !BLT ++ 33 | PLA : BRA + ; we found an angry cucco, done 34 | ++ : INX : BRA -- : .ldone 35 | 36 | ;==== Create a Cucco 37 | 38 | CPY.b #$FF : BNE ++ 39 | ; we didn't find a cucco, so try to create one 40 | PLY 41 | CPY.b #$FF : BEQ + ; fail if no slots found 42 | LDA.b #!CUCCO : STA.w SpriteTypeTable, Y 43 | LDA.b #!INIT : STA.w SpriteAITable, Y 44 | LDA.b LinkPosY : STA.w SpritePosYLow, Y 45 | LDA.b LinkPosY+1 : STA.w SpritePosYHigh, Y 46 | LDA.b LinkPosX : STA.w SpritePosXLow, Y 47 | LDA.b LinkPosX+1 : STA.w SpritePosXHigh, Y 48 | BRA +++ 49 | ++ 50 | PLA 51 | +++ 52 | 53 | ;==== Enrage a Cucco 54 | 55 | LDA.b #!CUCCO_ENRAGED : STA.w SpriteAuxTable, Y ; enrage the cucco 56 | LDA.b #$00 : STA.w SpriteAuxTable+$10, Y : STA.w SpriteDirectionTable, Y 57 | 58 | ;==== 59 | + 60 | RTL 61 | ;================================================================================ 62 | -------------------------------------------------------------------------------- /custompalettes.asm: -------------------------------------------------------------------------------- 1 | PalettesCustom: 2 | .master_sword 3 | dw $0000, $7E4E, $6FF4, $1CF5, $7FFF, $1CE7, $7A10, $64A5 4 | .tempered_sword 5 | dw $7FFF, $093B, $169F, $7E8D, $7FFF, $1CE7, $7A10, $64A5 6 | .golden_sword 7 | dw $0000, $033F, $7FFF, $2640, $7FFF, $1CE7, $7A10, $64A5 8 | .fighter_shield 9 | dw $0000, $7FFF, $27FF, $5E2D, $7FFF, $1CE7, $7A10, $64A5 10 | .red_shield 11 | dw $0000, $7FFF, $27FF, $5E2D, $4F5F, $1CE7, $2E9C, $14B6 12 | .mirror_shield 13 | dw $0000, $7E4E, $6F44, $1CF5, $7399, $1CE7, $02F9, $0233 14 | .crystal 15 | dw $7FFF, $7FFF, $0000, $5907, $6E0E, $0000, $7FBB, $7672 16 | .off_black 17 | dw $0000, $14A5, $14A5, $14A5, $14A5, $14A5, $14A5, $14A5 18 | -------------------------------------------------------------------------------- /darkworldspawn.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Dark World Spawn Location Fix & Master Sword Grove Fix 3 | ;-------------------------------------------------------------------------------- 4 | DarkWorldSaveFix: 5 | LDA.b #$70 : PHA : PLB ; thing we wrote over - data bank change 6 | JSL.l MasterSwordFollowerClear 7 | JML.l StatSaveCounter 8 | ;-------------------------------------------------------------------------------- 9 | DoWorldFix: 10 | LDA.l InvertedMode : BEQ + 11 | JMP DoWorldFix_Inverted 12 | + 13 | LDA.l Bugfix_MirrorlessSQToLW : BEQ .skip_mirror_check 14 | LDA.l FollowerIndicator : CMP.b #$04 : BEQ .setLightWorld ; check if old man is following 15 | LDA.l MirrorEquipment : BEQ .noMirror ; check if we have the mirror 16 | .skip_mirror_check ; alt entrance point 17 | LDA.l ProgressIndicator : CMP.b #$03 : BCS .done ; check if agahnim 1 is alive 18 | .setLightWorld 19 | LDA.b #$00 20 | .noMirror 21 | STA.l CurrentWorld ; set flag to light world 22 | LDA.l FollowerIndicator : CMP.b #$07 : BNE .done : INC : STA.l FollowerIndicator ; convert frog to dwarf 23 | .done 24 | RTL 25 | ;-------------------------------------------------------------------------------- 26 | SetDeathWorldChecked: 27 | LDA.l InvertedMode : BEQ + 28 | JMP SetDeathWorldChecked_Inverted 29 | + 30 | LDA.b IndoorsFlag : BEQ .outdoors 31 | LDA.w DungeonID : CMP.b #$FF : BNE .dungeon 32 | LDA.b RoomIndex : ORA.b RoomIndex+1 : BNE ++ 33 | LDA.l GanonPyramidRespawn : BNE .pyramid ; if flag is set, force respawn at pyramid on death to ganon 34 | ++ 35 | .outdoors 36 | JMP DoWorldFix 37 | 38 | .dungeon 39 | LDA.l MosaicLevel : BNE .dontfix ; this is a sanc & quit 40 | LDA.l Bugfix_PreAgaDWDungeonDeathToFakeDW : BNE .done ; if the bugfix is enabled, we do nothing on death in dungeon 41 | .dontfix 42 | JMP DoWorldFix_skip_mirror_check 43 | 44 | .pyramid 45 | LDA.b #$40 : STA.l CurrentWorld ; set flag to dark world 46 | LDA.l FollowerIndicator : CMP.b #$08 : BNE .done : DEC : STA.l FollowerIndicator : + ; convert dwarf to frog 47 | .done 48 | RTL 49 | ;================================================================================ 50 | DoWorldFix_Inverted: 51 | LDA.l Bugfix_MirrorlessSQToLW : BEQ .skip_mirror_check 52 | LDA.l FollowerIndicator : CMP.b #$04 : BEQ .setDarkWorld ; check if old man is following 53 | LDA.l MirrorEquipment : BEQ .setDarkWorld ; check if we have the mirror 54 | .skip_mirror_check ; alt entrance point 55 | LDA.l ProgressIndicator : CMP.b #$03 : BCS .done ; check if agahnim 1 is alive 56 | .setDarkWorld 57 | LDA.b #$40 : STA.l CurrentWorld ; set flag to dark world 58 | LDA.l FollowerIndicator 59 | CMP.b #$07 : BEQ .clear ; clear frog 60 | CMP.b #$08 : BEQ .clear ; clear dwarf - consider flute implications 61 | BRA .done 62 | .clear 63 | LDA.b #$00 : STA.l FollowerIndicator ; clear follower 64 | .done 65 | RTL 66 | ;-------------------------------------------------------------------------------- 67 | SetDeathWorldChecked_Inverted: 68 | LDA.b IndoorsFlag : BEQ .outdoors 69 | LDA.w DungeonID : CMP.b #$FF : BNE .dungeon 70 | LDA.b RoomIndex : ORA.b RoomIndex+1 : BNE ++ 71 | LDA.l GanonPyramidRespawn : BNE .castle ; if flag is set, force respawn at pyramid on death to ganon 72 | ++ 73 | .outdoors 74 | JMP DoWorldFix 75 | 76 | .dungeon 77 | LDA.l MosaicLevel : BNE .dontfix ; this is a sanc & quit 78 | LDA.l Bugfix_PreAgaDWDungeonDeathToFakeDW : BNE .done ; if the bugfix is enabled, we do nothing on death in dungeon 79 | .dontfix 80 | JMP DoWorldFix_Inverted_skip_mirror_check 81 | 82 | .castle 83 | LDA.b #$00 : STA.l CurrentWorld ; set flag to dark world 84 | LDA.l FollowerIndicator : CMP.b #$07 : BNE + : LDA.b #$08 : STA.l FollowerIndicator : + ; convert frog to dwarf 85 | .done 86 | RTL 87 | ;================================================================================ 88 | 89 | 90 | ;-------------------------------------------------------------------------------- 91 | FakeWorldFix: 92 | LDA.l FixFakeWorld : BEQ + 93 | LDA.b OverworldIndex : AND.b #$40 : STA.l CurrentWorld 94 | + 95 | RTL 96 | ;-------------------------------------------------------------------------------- 97 | MasterSwordFollowerClear: 98 | LDA.l FollowerIndicator 99 | CMP.b #$0E : BNE .exit ; clear master sword follower 100 | LDA.b #$00 : STA.l FollowerIndicator ; clear follower 101 | .exit 102 | RTL 103 | ;-------------------------------------------------------------------------------- 104 | FixAgahnimFollowers: 105 | LDA.b #$00 : STA.l FollowerIndicator ; clear follower 106 | JML PrepDungeonExit ; thing we wrote over 107 | 108 | ;-------------------------------------------------------------------------------- 109 | macro SetMinimum(base,filler,compare) 110 | LDA.l : !SUB.l : !BLT ?done 111 | STA.l 112 | ?done: 113 | endmacro 114 | RefreshRainAmmo: 115 | LDA.l ProgressIndicator : CMP.b #$01 : BEQ .rain ; check if we're in rain state 116 | RTL 117 | .rain 118 | LDA.l StartingEntrance 119 | + CMP.b #$03 : BNE + ; Uncle 120 | %SetMinimum(CurrentMagic,MagicFiller,RainDeathRefillMagic_Uncle) 121 | %SetMinimum(BombsEquipment,BombsFiller,RainDeathRefillBombs_Uncle) 122 | %SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Uncle) 123 | BRA .done 124 | + CMP.b #$02 : BNE + ; Cell 125 | %SetMinimum(CurrentMagic,MagicFiller,RainDeathRefillMagic_Cell) 126 | %SetMinimum(BombsEquipment,BombsFiller,RainDeathRefillBombs_Cell) 127 | %SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Cell) 128 | BRA .done 129 | + CMP.b #$04 : BNE + ; Mantle 130 | %SetMinimum(CurrentMagic,MagicFiller,RainDeathRefillMagic_Mantle) 131 | %SetMinimum(BombsEquipment,BombsFiller,RainDeathRefillBombs_Mantle) 132 | %SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Mantle) 133 | + 134 | .done 135 | RTL 136 | ;-------------------------------------------------------------------------------- 137 | SetEscapeAssist: 138 | LDA.l ProgressIndicator : CMP.b #$01 : BNE .no_train ; check if we're in rain state 139 | .rain 140 | LDA.l EscapeAssist 141 | BIT.b #$04 : BEQ + : STA.l InfiniteArrows : + 142 | BIT.b #$02 : BEQ + : STA.l InfiniteBombs : + 143 | BIT.b #$01 : BEQ + : STA.l InfiniteArrows : + 144 | BRA ++ 145 | .no_train ; choo choo 146 | LDA.l EscapeAssist : BIT.b #$04 : BEQ + : LDA.b #$00 : STA.l InfiniteMagic : + 147 | LDA.l EscapeAssist : BIT.b #$02 : BEQ + : LDA.b #$00 : STA.l InfiniteBombs : + 148 | LDA.l EscapeAssist : BIT.b #$01 : BEQ + : LDA.b #$00 : STA.l InfiniteArrows : + 149 | ++ 150 | RTL 151 | ;-------------------------------------------------------------------------------- 152 | SetSilverBowMode: 153 | LDA.l SilverArrowsUseRestriction : BEQ + ; fix bow type for restricted arrow mode 154 | LDA.l BowEquipment : CMP.b #$3 : BCC + 155 | SBC.b #$02 : STA.l BowEquipment 156 | + 157 | RTL 158 | ;================================================================================ 159 | -------------------------------------------------------------------------------- /data/99ff1_bombos.gfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/99ff1_bombos.gfx -------------------------------------------------------------------------------- /data/99ff1_quake.gfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/99ff1_quake.gfx -------------------------------------------------------------------------------- /data/a6fc4_bombos.gfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/a6fc4_bombos.gfx -------------------------------------------------------------------------------- /data/a6fc4_ether.gfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/a6fc4_ether.gfx -------------------------------------------------------------------------------- /data/bossicons.4bpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/bossicons.4bpp -------------------------------------------------------------------------------- /data/bsodencode.txt: -------------------------------------------------------------------------------- 1 | =00 2 | A=01 3 | a=01 4 | B=02 5 | b=02 6 | C=03 7 | c=03 8 | D=04 9 | d=04 10 | E=05 11 | e=05 12 | F=06 13 | f=06 14 | G=07 15 | g=07 16 | H=08 17 | h=08 18 | I=09 19 | i=09 20 | J=0A 21 | j=0A 22 | K=0B 23 | k=0B 24 | L=0C 25 | l=0C 26 | M=0D 27 | m=0D 28 | N=0E 29 | n=0E 30 | O=0F 31 | o=0F 32 | P=10 33 | p=10 34 | Q=11 35 | q=11 36 | R=12 37 | r=12 38 | S=13 39 | s=13 40 | T=14 41 | t=14 42 | U=15 43 | u=15 44 | V=16 45 | v=16 46 | W=17 47 | w=17 48 | X=18 49 | x=18 50 | Y=19 51 | y=19 52 | Z=1A 53 | z=1A 54 | 0=1B 55 | 1=1C 56 | 2=1D 57 | 3=1E 58 | 4=1F 59 | 5=20 60 | 6=21 61 | 7=22 62 | 8=23 63 | 9=24 64 | .=25 65 | #=26 66 | ?=27 67 | -=28 68 | /=29 69 | ,=2A 70 | '=2B 71 | ;=2C -------------------------------------------------------------------------------- /data/bsodfont.1bpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/bsodfont.1bpp -------------------------------------------------------------------------------- /data/bsodhex.2bpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/bsodhex.2bpp -------------------------------------------------------------------------------- /data/c2807_v3.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/c2807_v3.bin -------------------------------------------------------------------------------- /data/c2807_v3.gfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/c2807_v3.gfx -------------------------------------------------------------------------------- /data/c2807_v4.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/c2807_v4.bin -------------------------------------------------------------------------------- /data/c2807_v4.gfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/c2807_v4.gfx -------------------------------------------------------------------------------- /data/c2e3e.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/c2e3e.bin -------------------------------------------------------------------------------- /data/c2e3e.gfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/c2e3e.gfx -------------------------------------------------------------------------------- /data/credits.txt: -------------------------------------------------------------------------------- 1 | Y ORIGINAL GAME STAFF 2 | ------------------------------- 3 | G EXECUTIVE PRODUCER 4 | HIROSHI YAMAUCHI 5 | Y PRODUCER 6 | SHIGERU MIYAMOTO 7 | R DIRECTOR 8 | TAKASHI TEZUKA 9 | G SCRIPT WRITER 10 | KENSUKE TANABE 11 | Y ASSISTANT DIRECTORS 12 | YASUHISA YAMAMURA 13 | YOICHI YAMADA 14 | 15 | G SCREEN GRAPHICS DESIGNERS 16 | ------------------------------- 17 | Y OBJECT DESIGNERS 18 | SOICHIRO TOMITA 19 | TAKAYA IMAMURA 20 | Y BACK GROUND DESIGNERS 21 | MASANAO ARIMOTO 22 | TSUYOSHI WATANABE 23 | R PROGRAM DIRECTOR 24 | TOSHIHIKO NAKAGO 25 | G MAIN PROGRAMMER 26 | YASUNARI SOEJIMA 27 | G OBJECT PROGRAMMER 28 | KAZUAKI MORITA 29 | Y PROGRAMMERS 30 | TATSUO NISHIYAMA 31 | YUICHI YAMAMOTO 32 | YOSHIHIRO NOMOTO 33 | EIJI NOTO 34 | SATORU TAKAHATA 35 | TOSHIO IWAWAKI 36 | SHIGEHIRO KASAMATSU 37 | YASUNARI NISHIDA 38 | R SOUND COMPOSER 39 | KOJI KONDO 40 | G COORDINATORS 41 | KEIZO KATO 42 | TAKAO SHIMIZU 43 | Y PRINTED ART WORK 44 | YOICHI KOTABE 45 | HIDEKI FUJII 46 | YOSHIAKI KOIZUMI 47 | YASUHIRO SAKAI 48 | TOMOAKI KUROUME 49 | R SPECIAL THANKS TO 50 | NOBUO OKAJIMA 51 | YASUNORI TAKETANI 52 | KIYOSHI KODA 53 | TAKAMITSU KUZUHARA 54 | HIRONOBU KAKUI 55 | SHIGEKI YAMASHIRO 56 | 57 | - 58 | - 59 | - 60 | - 61 | - 62 | - 63 | - 64 | - 65 | - 66 | - 67 | - 68 | - 69 | - 70 | - 71 | - 72 | - 73 | - 74 | - 75 | - 76 | - 77 | 78 | 79 | R RANDOMIZER CONTRIBUTORS 80 | ------------------------------- 81 | Y ITEM RANDOMIZER 82 | KATDEVSGAMES VEETORP 83 | CHRISTOSOWEN DESSYREQT 84 | SMALLHACKER 85 | 86 | G ENTRANCE RANDOMIZER 87 | AMAZINGAMPHAROS LLCOOLDAVE 88 | KEVINCATHCART 89 | 90 | Y ENEMY RANDOMIZER 91 | ZARBY89 SOSUKE3 92 | ENDEROFGAMES 93 | 94 | G SPRITE DEVELOPMENT 95 | MIKETRETHEWEY IBAZLY 96 | FISH_WAFFLE64 FATMANSPANDA 97 | KRELBEL TWROXAS 98 | GLAN 99 | 100 | R SPECIAL THANKS 101 | SUPERSKUJ EVILASH25 102 | MYRAMONG JOSHRTA 103 | WALKINGEYE MATHONNAPKINS 104 | SAKURATSUBASA 105 | AND... 106 | 107 | THE ALTTP RANDOMIZER COMMUNITY 108 | 109 | 110 | G COMMUNITY DISCORD 111 | 112 | HTTPS://DISCORD.GG/TCC6Y42 113 | 114 | 115 | - 116 | - 117 | - 118 | - 119 | - 120 | - 121 | - 122 | - 123 | - 124 | - 125 | - 126 | - 127 | - 128 | - 129 | - 130 | - 131 | - 132 | - 133 | - 134 | - 135 | 136 | Y THE IMPORTANT STUFF 137 | ------------------------------- 138 | G TIME FOUND 139 | 140 | FIRST SWORD $$$$$$$$$$$ 141 | PEGASUS BOOTS $$$$$$$$$$$ 142 | FLUTE $$$$$$$$$$$ 143 | MIRROR $$$$$$$$$$$ 144 | 145 | Y BOSS KILLS 146 | SWORDLESS $$$$/13 147 | FIGHTER'S SWORD $$$$/13 148 | MASTER SWORD $$$$/13 149 | TEMPERED SWORD $$$$/13 150 | GOLD SWORD $$$$/13 151 | 152 | R GAME STATS 153 | 154 | GT BIG KEY $$$$/22 155 | BONKS $$$$ 156 | SAVE AND QUITS $$$$ 157 | DEATHS $$$$ 158 | FAERIE REVIVALS $$$$ 159 | 160 | TOTAL MENU TIME $$$$$$$$$$$ 161 | TOTAL LAG TIME $$$$$$$$$$$ 162 | 163 | ;Y FINAL SUMMARY 164 | -^ 165 | - 166 | - 167 | - 168 | - 169 | COLLECTION RATE $$$$/216 170 | TOTAL TIME $$$$$$$$$$$ 171 | - 172 | - 173 | - 174 | - 175 | - 176 | - 177 | 178 | -------------------------------------------------------------------------------- /data/creditscharmapbighi.txt: -------------------------------------------------------------------------------- 1 | =9F 2 | 0=53 3 | 1=54 4 | 2=55 5 | 3=56 6 | 4=57 7 | 5=58 8 | 6=59 9 | 7=5A 10 | 8=5B 11 | 9=5C 12 | A=5D 13 | B=5E 14 | C=5F 15 | D=60 16 | E=61 17 | F=62 18 | G=63 19 | H=64 20 | I=65 21 | J=66 22 | K=67 23 | L=68 24 | M=69 25 | N=6A 26 | O=6B 27 | P=6C 28 | Q=6D 29 | R=6E 30 | S=6F 31 | T=70 32 | U=71 33 | V=72 34 | W=73 35 | X=74 36 | Y=75 37 | Z=76 38 | a=A0 39 | b=A1 40 | c=A2 41 | d=A3 42 | e=A4 43 | f=A5 44 | g=A6 45 | h=A7 46 | i=A8 47 | j=A9 48 | k=AA 49 | l=AB 50 | m=AC 51 | n=AD 52 | o=AE 53 | p=AF 54 | q=B0 55 | r=B1 56 | s=B2 57 | t=B3 58 | u=B4 59 | v=B5 60 | w=B6 61 | x=B7 62 | y=B8 63 | z=B9 64 | '=D9 65 | "=DA 66 | /=DB 67 | .=DC 68 | :=DD 69 | _=DE 70 | ^=DF 71 | &=E0 72 | #=E1 73 | @=E2 74 | >=E3 75 | ?=E4 76 | !=E5 77 | ~=E6 78 | ,=E7 79 | -=E8 80 | -------------------------------------------------------------------------------- /data/creditscharmapbiglo.txt: -------------------------------------------------------------------------------- 1 | =9F 2 | 0=79 3 | 1=7A 4 | 2=7B 5 | 3=7C 6 | 4=7D 7 | 5=7E 8 | 6=7F 9 | 7=80 10 | 8=81 11 | 9=82 12 | A=83 13 | B=84 14 | C=85 15 | D=86 16 | E=87 17 | F=88 18 | G=89 19 | H=8A 20 | I=8B 21 | J=8C 22 | K=8D 23 | L=8E 24 | M=8F 25 | N=90 26 | O=91 27 | P=92 28 | Q=93 29 | R=94 30 | S=95 31 | T=96 32 | U=97 33 | V=98 34 | W=99 35 | X=9A 36 | Y=9B 37 | Z=9C 38 | a=BB 39 | b=BC 40 | c=BD 41 | d=BE 42 | e=BF 43 | f=C0 44 | g=C1 45 | h=C2 46 | i=C3 47 | j=C4 48 | k=C5 49 | l=C6 50 | m=C7 51 | n=C8 52 | o=C9 53 | p=CA 54 | q=CB 55 | r=CC 56 | s=CD 57 | t=CE 58 | u=CF 59 | v=D0 60 | w=D1 61 | x=D2 62 | y=D3 63 | z=D4 64 | '=EC 65 | "=ED 66 | /=EE 67 | .=EF 68 | :=F0 69 | _=F1 70 | ^=F2 71 | &=F3 72 | #=F4 73 | @=F5 74 | >=F6 75 | ?=F7 76 | !=F8 77 | ~=F9 78 | ,=FA 79 | -=FB 80 | -------------------------------------------------------------------------------- /data/creditscharmapsmall_green.txt: -------------------------------------------------------------------------------- 1 | =9F 2 | A=38 3 | B=39 4 | C=3A 5 | D=3B 6 | E=3C 7 | F=3D 8 | G=3E 9 | H=3F 10 | I=40 11 | J=41 12 | K=42 13 | L=43 14 | M=44 15 | N=45 16 | O=46 17 | P=47 18 | Q=48 19 | R=49 20 | S=4A 21 | T=4B 22 | U=4C 23 | V=4D 24 | W=4E 25 | X=4F 26 | Y=50 27 | Z=51 28 | .=52 29 | -------------------------------------------------------------------------------- /data/creditscharmapsmall_red.txt: -------------------------------------------------------------------------------- 1 | =9F 2 | A=00 3 | B=01 4 | C=02 5 | D=03 6 | E=04 7 | F=05 8 | G=06 9 | H=07 10 | I=08 11 | J=09 12 | K=0A 13 | L=0B 14 | M=0C 15 | N=0D 16 | O=0E 17 | P=0F 18 | Q=10 19 | R=11 20 | S=12 21 | T=13 22 | U=14 23 | V=15 24 | W=16 25 | X=17 26 | Y=18 27 | Z=19 -------------------------------------------------------------------------------- /data/creditscharmapsmall_yellow.txt: -------------------------------------------------------------------------------- 1 | =9F 2 | A=1A 3 | B=1B 4 | C=1C 5 | D=1D 6 | E=1E 7 | F=1F 8 | G=20 9 | H=21 10 | I=22 11 | J=23 12 | K=24 13 | L=25 14 | M=26 15 | N=27 16 | O=28 17 | P=29 18 | Q=2A 19 | R=2B 20 | S=2C 21 | T=2D 22 | U=2E 23 | V=2F 24 | W=30 25 | X=31 26 | Y=32 27 | Z=33 28 | ,=34 29 | '=35 30 | -=36 31 | .=37 32 | -------------------------------------------------------------------------------- /data/customitems.4bpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/customitems.4bpp -------------------------------------------------------------------------------- /data/customitems.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/customitems.png -------------------------------------------------------------------------------- /data/damage_table.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/damage_table.bin -------------------------------------------------------------------------------- /data/eventitems.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/eventitems.bin -------------------------------------------------------------------------------- /data/eventitems.gfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/eventitems.gfx -------------------------------------------------------------------------------- /data/fileselectgfx.2bpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/fileselectgfx.2bpp -------------------------------------------------------------------------------- /data/fileselectgfx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/fileselectgfx.png -------------------------------------------------------------------------------- /data/hudpalette.pal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/hudpalette.pal -------------------------------------------------------------------------------- /data/i18n_en.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/i18n_en.bin -------------------------------------------------------------------------------- /data/ice_bombos.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/ice_bombos.bin -------------------------------------------------------------------------------- /data/ice_palace_floor.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/ice_palace_floor.bin -------------------------------------------------------------------------------- /data/kanjireplacements.asm: -------------------------------------------------------------------------------- 1 | ; Kanji replacement characters 2 | 3 | org $8E9AC9 4 | ;.charDD ; 𓄿 5 | db $FB, $8C, $73, $CB, $30, $4B, $30, $54 6 | db $2B, $5B, $24, $2D, $12, $13, $61, $1E 7 | db $36, $09, $1B, $04, $14, $0B, $15, $0A 8 | db $15, $0A, $21, $1E, $1E, $48, $30, $38 9 | ;.charDE ; ☥ 10 | db $1E, $33, $0C, $2D, $12, $2D, $12, $2D 11 | db $12, $F3, $0C, $01, $01, $BF, $40, $C0 12 | db $3F, $BF, $40, $F2, $0C, $12, $0C, $12 13 | db $0C, $12, $0C, $1E, $50, $A0, $F0 14 | ;.charDF ; ≈ 15 | db $01, $3B, $6E, $11, $C4, $3B, $91, $6E 16 | db $BB, $44, $26, $18, $3C, $E7, $3B, $6E 17 | db $11, $C4, $3B, $91, $6E, $BB, $44, $EE 18 | db $98, $60, $F0 19 | ;.charE0 ; 🡅 20 | db $0C, $12, $0C, $21, $1E, $40, $3F, $80 21 | db $7F, $02, $01, $01, $E1, $1E, $21, $1E 22 | db $21, $1E, $21, $1E, $21, $1E, $21, $1E 23 | db $21, $1E, $3F, $80, $80 24 | ;.charE1 ; 🡇 25 | db $3F, $21, $1E, $21, $1E, $21, $1E, $21 26 | db $1E, $21, $1E, $21, $1E, $E1, $1E, $80 27 | db $7F, $40, $3F, $21, $1E, $12, $0C, $0C 28 | db $28, $10, $30 29 | ;.charE2 ; 🡆 30 | db $18, $14, $08, $12, $0C, $F1, $0E, $80 31 | db $7F, $01, $80, $7F, $80, $7F, $80, $7F 32 | db $F1, $0E, $12, $0C, $14, $08, $18, $20 33 | db $C0, $C0 34 | ;.charE3 ; 🡄 35 | db $06, $0A, $04, $12, $0C, $23, $1C, $40 36 | db $3F, $02, $01, $03, $80, $7F, $80, $7F 37 | db $40, $3F, $23, $1C, $12, $0C, $0A, $04 38 | db $06, $10, $E0, $F0 39 | 40 | 41 | org $8EBD94 42 | ;.charDD ; 𓄿 43 | db $BF, $FE, $3F, $FF, $B8 ; 10111111 11111110 00111111 11111111 10111000 44 | ;.charDE ; ☥ 45 | db $BF, $FA, $3F, $FF, $B8 ; 10111111 11111010 00111111 11111111 10111000 46 | ;.charDF ; ≈ 47 | db $AF, $FE, $2B, $FE, $38 ; 10101111 11111110 00101011 11111110 00111000 48 | ;.charE0 ; 🡅 49 | db $2F, $FE, $3F, $FF, $A8 ; 00101111 11111110 00111111 11111111 10101000 50 | ;.charE1 ; 🡇 51 | db $2F, $F0, $3F, $FF, $B8 ; 00101111 11110000 00111111 11111111 10111000 52 | ;.charE2 ; 🡆 53 | db $2F, $F8, $3F, $FE, $38 ; 00101111 11111000 00111111 11111110 00111000 54 | ;.charE3 ; 🡄 55 | db $2F, $FE, $3F, $FE, $38 ; 00101111 11111110 00111111 11111110 00111000 56 | -------------------------------------------------------------------------------- /data/map_icons.gfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/map_icons.gfx -------------------------------------------------------------------------------- /data/newfont.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/newfont.bin -------------------------------------------------------------------------------- /data/newfont_inverted.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/newfont_inverted.bin -------------------------------------------------------------------------------- /data/newitems.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/newitems.bin -------------------------------------------------------------------------------- /data/newitems.gfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/newitems.gfx -------------------------------------------------------------------------------- /data/newitems.pal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/newitems.pal -------------------------------------------------------------------------------- /data/newitems2.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/newitems2.bin -------------------------------------------------------------------------------- /data/newitems2.gfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/newitems2.gfx -------------------------------------------------------------------------------- /data/playernamecharmap.asm: -------------------------------------------------------------------------------- 1 | db $00, $01, $02, $03, $04, $CC, $CC ; あ い う え お ⎵ ⎵ 2 | db $15, $16, $17, $1D, $1E, $CC ; が ぎ ぐ げ ご ⎵ 3 | db $50, $51, $52, $53, $54, $CC, $CC ; ア イ ウ エ オ ⎵ ⎵ 4 | db $D0, $D1, $D2, $D3, $D4, $CC ; a b c d e ⎵ 5 | db $AA, $AB, $AC, $AD, $CC, $CC ; A B C D ⎵ ⎵ 6 | 7 | db $08, $09, $0A, $0B, $0C, $CC, $CC ; か き く け こ ⎵ ⎵ 8 | db $1F, $25, $26, $27, $2D, $CC ; ざ じ ず ぜ ぞ ⎵ 9 | db $58, $59, $5A, $5B, $5C, $CC, $CC ; カ キ ク ケ コ ⎵ ⎵ 10 | db $D5, $D6, $D7, $D8, $D9, $CC ; ザ ジ ズ ゼ ゾ ⎵ 11 | db $AE, $AF, $B0, $B1, $CC, $CC ; E F G H ⎵ ⎵ 12 | 13 | db $10, $11, $12, $13, $14, $CC, $CC ; さ し す せ そ ⎵ ⎵ 14 | db $2E, $2F, $35, $36, $37, $CC ; だ ぢ づ で ど ⎵ 15 | db $60, $61, $62, $63, $64, $CC, $CC ; サ シ ス セ ソ ⎵ ⎵ 16 | db $DA, $DB, $DC, $DD, $DE, $CC ; ダ ヂ ヅ デ ド ⎵ 17 | db $B2, $B3, $B4, $B5, $CC, $CC ; I J K L ⎵ ⎵ 18 | 19 | db $18, $19, $1A, $1B, $1C, $CC, $CC ; た ち つ て と ⎵ ⎵ 20 | db $3D, $3E, $3F, $40, $41, $CC ; ば び ぶ べ ぼ ⎵ 21 | db $68, $69, $6A, $6B, $6C, $CC, $CC ; タ チ ツ テ ト ⎵ ⎵ 22 | db $DF, $E0, $E1, $E2, $E3, $CC ; バ ビ ブ ベ ボ ⎵ 23 | db $B6, $B7, $B8, $B9, $CC, $CC ; M N O P ⎵ ⎵ 24 | 25 | db $20, $21, $22, $23, $24, $CC, $CC ; な に ぬ ね の ⎵ ⎵ 26 | db $42, $43, $44, $45, $46, $CC ; ぱ ぴ ぷ ぺ ぽ ⎵ 27 | db $70, $71, $72, $73, $74, $CC, $CC ; ナ ニ ヌ ネ ノ ⎵ ⎵ 28 | db $E4, $E5, $E6, $E7, $E8, $CC ; パ ピ プ ペ ポ ⎵ 29 | db $BA, $BB, $BC, $BD, $CC, $CC ; Q R S T ⎵ ⎵ 30 | 31 | db $28, $29, $2A, $2B, $2C, $CC, $CC ; は ひ ふ へ ほ ⎵ ⎵ 32 | db $65, $66, $67, $6D, $6E, $CC 33 | db $78, $79, $7A, $7B, $7C, $CC, $CC ; ハ ヒ フ ヘ ホ ⎵ ⎵ 34 | db $E9, $EA, $EB, $EC, $C6, $CC ; ァ ィ ゥ ェ ォ ⎵ 35 | db $BE, $BF, $C0, $C1, $CC, $CC ; U V W X ⎵ ⎵ 36 | 37 | db $30, $31, $32, $33, $34, $CC, $CC ; ま み む め も ⎵ ⎵ 38 | db $6F, $75, $76, $77, $7D, $CC ; ザ ジ ズ ゼ ゾ ⎵ 39 | db $80, $81, $82, $83, $84, $CC, $CC ; マ ミ ム メ モ ⎵ ⎵ 40 | db $CC, $CC, $CC, $CC, $9A, $CC ; ャ ュ ョ ⎵ ッ ⎵ 41 | db $C2, $C3, $C9, $CE, $CC, $CC ; Y Z - 〜 ⎵ ⎵ 42 | 43 | db $05, $CC, $06, $CC, $07, $CC, $CC ; や ⎵ ゆ ⎵ よ ⎵ ⎵ 44 | db $7E, $7F, $85, $86, $87, $CC ; ダ ヂ ヅ デ ド ⎵ 45 | db $55, $CC, $56, $CC, $57, $CC, $CC ; ヤ ⎵ ユ ⎵ ヨ ⎵ ⎵ 46 | db $A0, $A1, $A2, $A3, $A4, $CC ; ⎵ ⎵ ⎵ ⎵ ⎵ ⎵ 47 | db $CC, $CC, $CC, $CC, $CC, $CC ; ⎵ ⎵ ⎵ ⎵ ⎵ ⎵ 48 | 49 | db $38, $39, $3A, $3B, $3C, $CC, $CC ; ら り る れ ろ ⎵ ⎵ 50 | db $8D, $8E, $8F, $90, $91, $CC ; バ ビ ブ ベ ボ ⎵ 51 | db $88, $89, $8A, $8B, $8C, $CC, $CC ; ラ リ ル レ ロ ⎵ ⎵ 52 | db $A5, $A6, $A7, $A8, $A9, $CC ; ⎵ ⎵ ⎵ ⎵ ⎵ ⎵ 53 | db $CA, $CB, $CD, $CD, $CC, $CC ; 🡄 🡆 END ⎵ ⎵ 54 | 55 | db $0D, $0E, $0F, $CC, $C9, $CC, $CC ; わ を ん ⎵ - ⎵ ⎵ 56 | db $92, $93, $94, $95, $96, $CC ; パ ピ プ ペ ポ ⎵ 57 | db $5D, $5E, $5F, $CC, $C9, $CC, $CC ; ワ ヲ ン ⎵ - ⎵ ⎵ 58 | db $CC, $CC, $CC, $CC, $CC, $CC ; ⎵ ⎵ ⎵ ⎵ ⎵ ⎵ 59 | db $CC, $CC, $CC, $CC, $CC, $CC ; ⎵ ⎵ ⎵ ⎵ ⎵ ⎵ 60 | -------------------------------------------------------------------------------- /data/playernamecharmap.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/playernamecharmap.bin -------------------------------------------------------------------------------- /data/playernamestripes_1.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/playernamestripes_1.bin -------------------------------------------------------------------------------- /data/playernamestripes_2.asm: -------------------------------------------------------------------------------- 1 | dw $E164, $3900 ; VRAM $C9C2 | 58 bytes | Horizontal 2 | dw $1CA2, $0188, $1CA3, $0188, $1CA4, $0188, $0188, $0188 3 | dw $0188, $0188, $1DA0, $0188, $1DA1, $0188, $1DA2, $0188 4 | dw $1DA3, $0188, $1DA4, $0188, $0188, $0188, $1D4A, $0188 5 | dw $1D4B, $0188, $1D4C, $0188, $1D4D 6 | 7 | dw $0165, $3900 ; VRAM $CA02 | 58 bytes | Horizontal 8 | dw $1CB2, $0188, $1CB3, $0188, $1CB4, $0188, $0188, $0188 9 | dw $0188, $0188, $1DB0, $0188, $1DB1, $0188, $1DB2, $0188 10 | dw $1DB3, $0188, $1DB4, $0188, $0188, $0188, $1D5A, $0188 11 | dw $1D5B, $0188, $1D5C, $0188, $1D5D 12 | 13 | dw $2165, $3900 ; VRAM $CA42 | 58 bytes | Horizontal 14 | dw $1CAA, $0188, $1CAB, $0188, $1CAC, $0188, $0188, $0188 15 | dw $0188, $0188, $1DA5, $0188, $1DA6, $0188, $1DA7, $0188 16 | dw $1DA8, $0188, $1DA9, $0188, $0188, $0188, $1D4E, $0188 17 | dw $1D4F, $0188, $1D60, $0188, $1D61 18 | 19 | dw $4165, $3900 ; VRAM $CA82 | 58 bytes | Horizontal 20 | dw $1CBA, $0188, $1CBB, $0188, $1CBC, $0188, $0188, $0188 21 | dw $0188, $0188, $1DB5, $0188, $1DB6, $0188, $1DB7, $0188 22 | dw $1DB8, $0188, $1DB9, $0188, $0188, $0188, $1D5E, $0188 23 | dw $1D5F, $0188, $1D70, $0188, $1D71 24 | 25 | dw $6165, $3900 ; VRAM $CAC2 | 58 bytes | Horizontal 26 | dw $1CC2, $0188, $1CC3, $0188, $1CC4, $0188, $0188, $0188 27 | dw $0188, $0188, $1DAA, $0188, $1DAB, $0188, $1DAC, $0188 28 | dw $1DAD, $0188, $1DAE, $0188, $0188, $0188, $1D62, $0188 29 | dw $1D63, $0188, $1D64, $0188, $1D65 30 | 31 | dw $8165, $3900 ; VRAM $CB02 | 58 bytes | Horizontal 32 | dw $1CD2, $0188, $1CD3, $0188, $1CD4, $0188, $0188, $0188 33 | dw $0188, $0188, $1DBA, $0188, $1DBB, $0188, $1DBC, $0188 34 | dw $1DBD, $0188, $1DBE, $0188, $0188, $0188, $1D72, $0188 35 | dw $1D73, $0188, $1D74, $0188, $1D75 36 | 37 | dw $A165, $3900 ; VRAM $CB42 | 58 bytes | Horizontal 38 | dw $1CCA, $0188, $1CCB, $0188, $1CCC, $0188, $0188, $0188 39 | dw $0188, $0188, $1DAF, $0188, $1DC0, $0188, $1DC1, $0188 40 | dw $1DC2, $0188, $1DC3, $0188, $0188, $0188, $1D66, $0188 41 | dw $1D67, $0188, $1D68, $0188, $1D69 42 | 43 | dw $C165, $3900 ; VRAM $CB82 | 58 bytes | Horizontal 44 | dw $1CDA, $0188, $1CDB, $0188, $1CDC, $0188, $0188, $0188 45 | dw $0188, $0188, $1DBF, $0188, $1DD0, $0188, $1DD1, $0188 46 | dw $1DD2, $0188, $1DD3, $0188, $0188, $0188, $1D76, $0188 47 | dw $1D77, $0188, $1D78, $0188, $1D79 48 | 49 | dw $E165, $3900 ; VRAM $CBC2 | 58 bytes | Horizontal 50 | dw $1CE2, $0188, $1CE3, $0188, $1CE4, $0188, $0188, $0188 51 | dw $0188, $0188, $1DC4, $0188, $1DC5, $0188, $1DC6, $0188 52 | dw $1DC7, $0188, $1DC8, $0188, $0188, $0188, $1D6A, $0188 53 | dw $1D6B, $0188, $1D6C, $0188, $1D6D 54 | 55 | dw $0166, $3900 ; VRAM $CC02 | 58 bytes | Horizontal 56 | dw $1CF2, $0188, $1CF3, $0188, $1CF4, $0188, $0188, $0188 57 | dw $0188, $0188, $1DD4, $0188, $1DD5, $0188, $1DD6, $0188 58 | dw $1DD7, $0188, $1DD8, $0188, $0188, $0188, $1D7A, $0188 59 | dw $1D7B, $0188, $1D7C, $0188, $1D7D 60 | 61 | ; dw $2166, $3900 ; VRAM $CC42 | 58 bytes | Horizontal 62 | ; dw $1CEA, $0188, $1CEB, $0188, $1CEC, $0188, $0188, $0188 63 | ; dw $0188, $0188, $1DC9, $0188, $1DCA, $0188, $1DCB, $0188 64 | ; dw $1DCC, $0188, $1D86, $0188, $0188, $0188, $1D6E, $0188 65 | ; dw $1D6F, $0188, $1D80, $0188, $1D81 66 | ; 67 | ; dw $4166, $3900 ; VRAM $CC82 | 58 bytes | Horizontal 68 | ; dw $1CFA, $0188, $1CFB, $0188, $1CFC, $0188, $0188, $0188 69 | ; dw $0188, $0188, $1DD9, $0188, $1DDA, $0188, $1DDB, $0188 70 | ; dw $1DDC, $0188, $1D96, $0188, $0188, $0188, $1D7E, $0188 71 | ; dw $1D7F, $0188, $1D90, $0188, $1D91 72 | 73 | -------------------------------------------------------------------------------- /data/playernamestripes_2.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/playernamestripes_2.bin -------------------------------------------------------------------------------- /data/playernamestripes_3.asm: -------------------------------------------------------------------------------- 1 | dw $E164, $3900 ; VRAM $C9C2 | 58 bytes | Horizontal 2 | dw $1CA2, $0188, $1CA3, $0188, $1CA4, $0188, $0188, $0188 3 | dw $0188, $0188, $1DA0, $0188, $1DA1, $0188, $1DA2, $0188 4 | dw $1DA3, $0188, $1DA4, $0188, $0188, $0188, $1D4A, $0188 5 | dw $1D4B, $0188, $1D4C, $0188, $1D4D 6 | 7 | dw $0165, $3900 ; VRAM $CA02 | 58 bytes | Horizontal 8 | dw $1CB2, $0188, $1CB3, $0188, $1CB4, $0188, $0188, $0188 9 | dw $0188, $0188, $1DB0, $0188, $1DB1, $0188, $1DB2, $0188 10 | dw $1DB3, $0188, $1DB4, $0188, $0188, $0188, $1D5A, $0188 11 | dw $1D5B, $0188, $1D5C, $0188, $1D5D 12 | 13 | dw $2165, $3900 ; VRAM $CA42 | 58 bytes | Horizontal 14 | dw $1CAA, $0188, $1CAB, $0188, $1CAC, $0188, $0188, $0188 15 | dw $0188, $0188, $1DA5, $0188, $1DA6, $0188, $1DA7, $0188 16 | dw $1DA8, $0188, $1DA9, $0188, $0188, $0188, $1D4E, $0188 17 | dw $1D4F, $0188, $1D60, $0188, $1D61 18 | 19 | dw $4165, $3900 ; VRAM $CA82 | 58 bytes | Horizontal 20 | dw $1CBA, $0188, $1CBB, $0188, $1CBC, $0188, $0188, $0188 21 | dw $0188, $0188, $1DB5, $0188, $1DB6, $0188, $1DB7, $0188 22 | dw $1DB8, $0188, $1DB9, $0188, $0188, $0188, $1D5E, $0188 23 | dw $1D5F, $0188, $1D70, $0188, $1D71 24 | 25 | dw $6165, $3900 ; VRAM $CAC2 | 58 bytes | Horizontal 26 | dw $1CC2, $0188, $1CC3, $0188, $1CC4, $0188, $0188, $0188 27 | dw $0188, $0188, $1DAA, $0188, $1DAB, $0188, $1DAC, $0188 28 | dw $1DAD, $0188, $1DAE, $0188, $0188, $0188, $1D62, $0188 29 | dw $1D63, $0188, $1D64, $0188, $1D65 30 | 31 | dw $8165, $3900 ; VRAM $CB02 | 58 bytes | Horizontal 32 | dw $1CD2, $0188, $1CD3, $0188, $1CD4, $0188, $0188, $0188 33 | dw $0188, $0188, $1DBA, $0188, $1DBB, $0188, $1DBC, $0188 34 | dw $1DBD, $0188, $1DBE, $0188, $0188, $0188, $1D72, $0188 35 | dw $1D73, $0188, $1D74, $0188, $1D75 36 | 37 | dw $A165, $3900 ; VRAM $CB42 | 58 bytes | Horizontal 38 | dw $1CCA, $0188, $1CCB, $0188, $1CCC, $0188, $0188, $0188 39 | dw $0188, $0188, $1DAF, $0188, $1DC0, $0188, $1DC1, $0188 40 | dw $1DC2, $0188, $1DC3, $0188, $0188, $0188, $1D66, $0188 41 | dw $1D67, $0188, $1D68, $0188, $1D69 42 | 43 | dw $C165, $3900 ; VRAM $CB82 | 58 bytes | Horizontal 44 | dw $1CDA, $0188, $1CDB, $0188, $1CDC, $0188, $0188, $0188 45 | dw $0188, $0188, $1DBF, $0188, $1DD0, $0188, $1DD1, $0188 46 | dw $1DD2, $0188, $1DD3, $0188, $0188, $0188, $1D76, $0188 47 | dw $1D77, $0188, $1D78, $0188, $1D79 48 | 49 | dw $E165, $3900 ; VRAM $CBC2 | 58 bytes | Horizontal 50 | dw $1CE2, $0188, $1CE3, $0188, $1CE4, $0188, $0188, $0188 51 | dw $0188, $0188, $1DC4, $0188, $1DC5, $0188, $1DC6, $0188 52 | dw $1DC7, $0188, $1DC8, $0188, $0188, $0188, $1D6A, $0188 53 | dw $1D6B, $0188, $1D6C, $0188, $1D6D 54 | 55 | dw $0166, $3900 ; VRAM $CC02 | 58 bytes | Horizontal 56 | dw $1CF2, $0188, $1CF3, $0188, $1CF4, $0188, $0188, $0188 57 | dw $0188, $0188, $1DD4, $0188, $1DD5, $0188, $1DD6, $0188 58 | dw $1DD7, $0188, $1DD8, $0188, $0188, $0188, $1D7A, $0188 59 | dw $1D7B, $0188, $1D7C, $0188, $1D7D 60 | 61 | dw $2166, $3900 ; VRAM $CC42 | 58 bytes | Horizontal 62 | dw $1CEA, $0188, $1CEB, $0188, $1CEC, $0188, $0188, $0188 63 | dw $0188, $0188, $1DC9, $0188, $1DCA, $0188, $1DCB, $0188 64 | dw $1DCC, $0188, $1D86, $0188, $0188, $0188, $1D6E, $0188 65 | dw $1D6F, $0188, $1D80, $0188, $1D81 66 | 67 | dw $4166, $3900 ; VRAM $CC82 | 58 bytes | Horizontal 68 | dw $1CFA, $0188, $1CFB, $0188, $1CFC, $0188, $0188, $0188 69 | dw $0188, $0188, $1DD9, $0188, $1DDA, $0188, $1DDB, $0188 70 | dw $1DDC, $0188, $1D96, $0188, $0188, $0188, $1D7E, $0188 71 | dw $1D7F, $0188, $1D90, $0188, $1D91 72 | 73 | -------------------------------------------------------------------------------- /data/playernamestripes_4.asm: -------------------------------------------------------------------------------- 1 | dw $2362, $3900 ; VRAM $C446 | 58 bytes | Horizontal 2 | dw $1C48, $0188, $1C49, $0188, $1C4A, $0188, $1C4B, $0188 3 | dw $1C4C, $0188, $0188, $0188, $0188, $0188, $1CC5, $0188 4 | dw $1CC6, $0188, $1CC7, $0188, $1CCD, $0188, $1CCE, $0188 5 | dw $0188, $0188, $1CE8, $0188, $1CE9 6 | 7 | dw $4362, $3900 ; VRAM $C486 | 58 bytes | Horizontal 8 | dw $1C58, $0188, $1C59, $0188, $1C5A, $0188, $1C5B, $0188 9 | dw $1C5C, $0188, $0188, $0188, $0188, $0188, $1CD5, $0188 10 | dw $1CD6, $0188, $1CD7, $0188, $1CDD, $0188, $1CDE, $0188 11 | dw $0188, $0188, $1CF8, $0188, $1CF9 12 | 13 | dw $6362, $3900 ; VRAM $C4C6 | 58 bytes | Horizontal 14 | dw $1C60, $0188, $1C61, $0188, $1C62, $0188, $1C63, $0188 15 | dw $1C64, $0188, $0188, $0188, $0188, $0188, $1CCF, $0188 16 | dw $1CE5, $0188, $1CE6, $0188, $1CE7, $0188, $1CED, $0188 17 | dw $0188, $0188, $1D00, $0188, $1D01 18 | 19 | 20 | dw $8362, $3900 ; VRAM $C506 | 58 bytes | Horizontal 21 | dw $1C70, $0188, $1C71, $0188, $1C72, $0188, $1C73, $0188 22 | dw $1C74, $0188, $0188, $0188, $0188, $0188, $1CDF, $0188 23 | dw $1CF5, $0188, $1CF6, $0188, $1CF7, $0188, $1CFD, $0188 24 | dw $0188, $0188, $1D10, $0188, $1D11 25 | 26 | -------------------------------------------------------------------------------- /data/sheet178.gfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/sheet178.gfx -------------------------------------------------------------------------------- /data/sheet73.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/sheet73.bin -------------------------------------------------------------------------------- /data/sheet73.gfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/sheet73.gfx -------------------------------------------------------------------------------- /data/smallchars.2bpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/smallchars.2bpp -------------------------------------------------------------------------------- /data/textbytecharmap.txt: -------------------------------------------------------------------------------- 1 | '=9D 2 | A=AA 3 | B=AB 4 | C=AC 5 | D=AD 6 | E=AE 7 | F=AF 8 | G=B0 9 | H=B1 10 | I=B2 11 | J=B3 12 | K=B4 13 | L=B5 14 | M=B6 15 | N=B7 16 | O=B8 17 | P=B9 18 | Q=BA 19 | R=BB 20 | S=BC 21 | T=BD 22 | U=BE 23 | V=BF 24 | W=C0 25 | X=C1 26 | Y=C2 27 | Z=C3 28 | ?=C6 29 | !=C7 30 | ,=C8 31 | -=C9 32 | .=CD 33 | ~=CE 34 | a=D0 35 | b=D1 36 | c=D2 37 | d=D3 38 | e=D4 39 | f=D5 40 | g=D6 41 | h=D7 42 | i=D8 43 | j=D9 44 | k=DA 45 | l=DB 46 | m=DC 47 | n=DD 48 | o=DE 49 | p=DF 50 | q=E0 51 | r=E1 52 | s=E2 53 | t=E3 54 | u=E4 55 | v=E5 56 | w=E6 57 | x=E7 58 | y=E8 59 | z=E9 60 | :=EA 61 | =FF 62 | -------------------------------------------------------------------------------- /data/textwordcharmap.txt: -------------------------------------------------------------------------------- 1 | '=9D00 2 | A=AA00 3 | B=AB00 4 | C=AC00 5 | D=AD00 6 | E=AE00 7 | F=AF00 8 | G=B000 9 | H=B100 10 | I=B200 11 | J=B300 12 | K=B400 13 | L=B500 14 | M=B600 15 | N=B700 16 | O=B800 17 | P=B900 18 | Q=BA00 19 | R=BB00 20 | S=BC00 21 | T=BD00 22 | U=BE00 23 | V=BF00 24 | W=C000 25 | X=C100 26 | Y=C200 27 | Z=C300 28 | ?=C600 29 | !=C700 30 | ,=C800 31 | -=C900 32 | .=CD00 33 | ~=CE00 34 | a=D000 35 | b=D100 36 | c=D200 37 | d=D300 38 | e=D400 39 | f=D500 40 | g=D600 41 | h=D700 42 | i=D800 43 | j=D900 44 | k=DA00 45 | l=DB00 46 | m=DC00 47 | n=DD00 48 | o=DE00 49 | p=DF00 50 | q=E000 51 | r=E100 52 | s=E200 53 | t=E300 54 | u=E400 55 | v=E500 56 | w=E600 57 | x=E700 58 | y=E800 59 | z=E900 60 | :=EA00 61 | =FF00 62 | -------------------------------------------------------------------------------- /data/zsnes_pal.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/zsnes_pal.bin -------------------------------------------------------------------------------- /data/zsnes_tilemap.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/zsnes_tilemap.bin -------------------------------------------------------------------------------- /data/zsnes_tiles.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/data/zsnes_tiles.bin -------------------------------------------------------------------------------- /decryption.asm: -------------------------------------------------------------------------------- 1 | 2 | ;-------------------------------------------------------------------------------- 3 | LoadStaticDecryptionKey: 4 | PHB : PHA : PHX : PHY : PHP 5 | REP #$30 ; set 16-bit accumulator & index registers 6 | LDX.w #StaticDecryptionKey ; Source 7 | LDY.w #KeyBase ; Target 8 | LDA.w #$000F ; Length 9 | MVN $307F 10 | 11 | PLP : PLY : PLX : PLA : PLB 12 | RTL 13 | ;-------------------------------------------------------------------------------- 14 | 15 | ;-------------------------------------------------------------------------------- 16 | RetrieveValueFromEncryptedTable: 17 | ;Requires 16-bit A and X/Y 18 | ;$00-$02 are long address of start of table 19 | ;A is desired byte offset into table 20 | ;Returns result in A 21 | PHX : PHY 22 | PHA 23 | LDY.b Scrap04 : PHY : LDY.b Scrap06 : PHY : LDY.b Scrap08 : PHY 24 | LDY.b Scrap0A : PHY : LDY.b Scrap0C : PHY : LDY.b Scrap0E : PHY 25 | 26 | AND.w #$FFF8 : TAY 27 | LDA.b [$00], Y : STA.l CryptoBuffer : INY #2 28 | LDA.b [$00], Y : STA.l CryptoBuffer+2 : INY #2 29 | LDA.b [$00], Y : STA.l CryptoBuffer+4 : INY #2 30 | LDA.b [$00], Y : STA.l CryptoBuffer+6 31 | 32 | LDA.w #$0002 : STA.b Scrap04 ;set block size 33 | 34 | JSL.l XXTEA_Decode 35 | 36 | PLA : STA.b Scrap0E : PLA : STA.b Scrap0C : PLA : STA.b Scrap0A 37 | PLA : STA.b Scrap08 : PLA : STA.b Scrap06 : PLA : STA.b Scrap04 38 | PLA : AND.w #$0007 : TAX 39 | LDA.l CryptoBuffer, X 40 | PHA 41 | LDA.w #$0000 42 | STA.l CryptoBuffer 43 | STA.l CryptoBuffer+2 44 | STA.l CryptoBuffer+4 45 | STA.l CryptoBuffer+6 46 | PLA 47 | PLY : PLX 48 | RTL 49 | ;-------------------------------------------------------------------------------- 50 | ChestData = $01E96C 51 | ChestDataPayload = $01EABC ; ChestData+$0150 52 | ;-------------------------------------------------------------------------------- 53 | GetChestData: 54 | LDA.l IsEncrypted : BNE .encrypted 55 | INC.b Scrap0E : LDX.w #$FFFD ; what we wrote over 56 | JML.l Dungeon_OpenKeyedObject_nextChest 57 | 58 | .encrypted 59 | INC.b Scrap0E : LDX.w #$FFFE 60 | 61 | .nextChest 62 | 63 | INX #2 : CPX.w #$0150 : BEQ .couldntFindChest 64 | LDA.l ChestData, X : AND.w #$7FFF : CMP.b RoomIndex : BNE .nextChest 65 | 66 | DEC.b Scrap0E : BNE .nextChest 67 | 68 | LDA.b Scrap00 : PHA : LDA.b Scrap02 : PHA 69 | 70 | LDA.w #ChestDataPayload : STA.b Scrap00 71 | LDA.w #ChestDataPayload>>16 : STA.b Scrap02 72 | 73 | TXA : LSR 74 | JSL RetrieveValueFromEncryptedTable 75 | STA.b Scrap0C 76 | 77 | PLA : STA.b Scrap02 : PLA : STA.b Scrap00 78 | 79 | LDA.l ChestData, X : ASL A : BCC .smallChest 80 | 81 | JML.l Dungeon_OpenKeyedObject_bigChest ;(bank01.asm line #13783) 82 | 83 | .smallChest 84 | JML.l Dungeon_OpenKeyedObject_smallChest 85 | .couldntFindChest 86 | JML.l Dungeon_OpenKeyedObject_couldntFindChest 87 | ;-------------------------------------------------------------------------------- 88 | -------------------------------------------------------------------------------- /doorframefixes.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Door Frame Fixes 3 | ;================================================================================ 4 | 5 | ;-------------------------------------------------------------------------------- 6 | ; StoreLastOverworldDoorID 7 | ;-------------------------------------------------------------------------------- 8 | StoreLastOverworldDoorID: 9 | TXA : INC 10 | STA.l PreviousOverworldDoor 11 | LDA.l $9BBB73, X : STA.w EntranceIndex 12 | RTL 13 | ;-------------------------------------------------------------------------------- 14 | 15 | ;-------------------------------------------------------------------------------- 16 | ; CacheDoorFrameData 17 | ;-------------------------------------------------------------------------------- 18 | CacheDoorFrameData: 19 | LDA.l PreviousOverworldDoor : BEQ .originalBehaviour 20 | DEC : ASL : TAX 21 | LDA.l EntranceDoorFrameTable, X : STA.w TileMapEntranceDoors 22 | LDA.l EntranceAltDoorFrameTable, X : STA.w TileMapTile32 23 | BRA .done 24 | .originalBehaviour 25 | LDA.w $D724, X : STA.w TileMapEntranceDoors 26 | STZ.w TileMapTile32 27 | .done 28 | RTL 29 | ;-------------------------------------------------------------------------------- 30 | 31 | ;-------------------------------------------------------------------------------- 32 | ; WalkDownIntoTavern 33 | ;-------------------------------------------------------------------------------- 34 | WalkDownIntoTavern: 35 | LDA.l PreviousOverworldDoor 36 | ; tavern door has index 0x42 (saved off value is incremented by one) 37 | CMP.b #$43 38 | RTL 39 | ;-------------------------------------------------------------------------------- 40 | -------------------------------------------------------------------------------- /dungeonmap.asm: -------------------------------------------------------------------------------- 1 | DoDungeonMapBossIcon: 2 | LDA.b NMISTRIPES 3 | CMP.b #$09 4 | BEQ .dungeonmap 5 | 6 | .cave 7 | RTL 8 | 9 | .dungeonmap 10 | 11 | LDX.w DungeonID 12 | BMI .cave 13 | 14 | ; get dungeon boss room 15 | ++ REP #$30 16 | LDA.l $8AE817,X 17 | ASL 18 | TAX 19 | 20 | ; get sprite pointer for room 21 | LDA.l $89D62E,X 22 | INC ; to skip the "sort" 23 | TAX 24 | 25 | ; get first byte to make sure it isn't an empty room 26 | SEP #$20 27 | LDA.l $890000,X 28 | CMP.b #$FF 29 | BNE ++ 30 | 31 | SEP #$30 32 | BRA .cave 33 | 34 | ; check first sprite 35 | ++ LDA.l $890002,X 36 | SEP #$10 37 | 38 | ; match boss id 39 | LDX.b #$0B 40 | 41 | -- CMP.l .boss_id,X 42 | BEQ .match 43 | 44 | DEX 45 | BPL -- 46 | 47 | TXA 48 | BRA .cave 49 | 50 | .match 51 | LDA.b #$80 52 | STA.w CGADD 53 | 54 | REP #$30 55 | 56 | TXA 57 | ASL ; x32 for palette data 58 | ASL 59 | ASL 60 | ASL 61 | ASL 62 | 63 | TAX 64 | 65 | ; prep dma 66 | ASL ; x128 for graphics 67 | ASL 68 | ADC.w #BossMapIconGFX 69 | STA.w A1T1L 70 | 71 | PHY 72 | LDY.w #32 73 | 74 | SEP #$20 75 | -- LDA.l .boss_palettes,X 76 | STA.w CGDATA 77 | INX 78 | DEY 79 | BNE -- 80 | 81 | PLY 82 | 83 | 84 | ; GFX DMA 85 | REP #$20 86 | SEP #$10 87 | 88 | LDA.w #$1801 89 | STA.w DMAP1 90 | 91 | LDX.b #BossMapIconGFX>>16 92 | STX.w A1B1 93 | 94 | LDA.w #$A060>>1 95 | STA.w VMADDL 96 | LDA.w #$0040 97 | STA.w DAS1L 98 | 99 | LDX.b #$02 100 | STX.w MDMAEN 101 | 102 | STA.w DAS1L 103 | LDA.w #$A260>>1 104 | STA.w VMADDL 105 | 106 | STX.w MDMAEN 107 | 108 | ; done 109 | SEP #$30 110 | RTL 111 | 112 | .boss_id 113 | db $53 ; armos 114 | db $54 ; lanmolas 115 | db $09 ; moldorm 116 | 117 | db $7A ; agahnim 118 | 119 | db $92 ; helma king 120 | db $8C ; arrghus 121 | db $88 ; mothula 122 | db $CE ; blind 123 | db $A3 ; khold shell 124 | db $BD ; vitreous 125 | db $CB ; trinexx 126 | 127 | db $D6 ; ganon 128 | 129 | .boss_palettes 130 | dw hexto555($000000), hexto555($F8F8F8), hexto555($D86060), hexto555($5070C8), hexto555($B090F8), hexto555($282828), hexto555($F0A068), hexto555($B06028), hexto555($B88820), hexto555($E8A800), hexto555($F8F8F8), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000) 131 | dw hexto555($000000), hexto555($F8F8F8), hexto555($50C090), hexto555($408858), hexto555($305830), hexto555($282828), hexto555($D8A800), hexto555($E06018), hexto555($787040), hexto555($585030), hexto555($484018), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000) 132 | dw hexto555($000000), hexto555($F8F8F8), hexto555($903018), hexto555($D85800), hexto555($F8A828), hexto555($282828), hexto555($E88068), hexto555($B04038), hexto555($F8D018), hexto555($C8B818), hexto555($A89818), hexto555($806818), hexto555($503818), hexto555($000000), hexto555($000000), hexto555($000000) 133 | dw hexto555($000000), hexto555($F8F8F8), hexto555($C04080), hexto555($B08828), hexto555($E8C070), hexto555($282828), hexto555($90D038), hexto555($688020), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000) 134 | dw hexto555($000000), hexto555($F8F8F8), hexto555($4848B0), hexto555($7870E8), hexto555($A8A8F8), hexto555($282828), hexto555($F8F8F8), hexto555($181818), hexto555($A00028), hexto555($D03828), hexto555($E88820), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000) 135 | dw hexto555($000000), hexto555($F8F8F8), hexto555($903018), hexto555($D85800), hexto555($F8A828), hexto555($282828), hexto555($E88068), hexto555($B04038), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000) 136 | dw hexto555($000000), hexto555($F8F8F8), hexto555($4848B0), hexto555($7870E8), hexto555($A8A8F8), hexto555($282828), hexto555($F8A840), hexto555($D85820), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000) 137 | dw hexto555($000000), hexto555($F8F8F8), hexto555($903018), hexto555($D85800), hexto555($F8A828), hexto555($282828), hexto555($E88068), hexto555($B04038), hexto555($88D0F8), hexto555($7890F8), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000) 138 | dw hexto555($000000), hexto555($F8F8F8), hexto555($4828C8), hexto555($4828F0), hexto555($8070F8), hexto555($282828), hexto555($F8C8F8), hexto555($E088B0), hexto555($7098C0), hexto555($58B0E8), hexto555($D0F8F8), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000) 139 | dw hexto555($000000), hexto555($F8F8F8), hexto555($50C090), hexto555($408858), hexto555($305830), hexto555($282828), hexto555($D8A800), hexto555($E06018), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000) 140 | dw hexto555($000000), hexto555($F8F8F8), hexto555($4848B0), hexto555($7870E8), hexto555($A8A8F8), hexto555($282828), hexto555($989868), hexto555($78C0A8), hexto555($A00028), hexto555($D03828), hexto555($E88820), hexto555($503860), hexto555($505060), hexto555($788890), hexto555($484868), hexto555($707068) 141 | dw hexto555($000000), hexto555($F8F8F8), hexto555($B090F8), hexto555($C0A028), hexto555($886008), hexto555($282828), hexto555($B83010), hexto555($E86040), hexto555($385088), hexto555($5088A8), hexto555($88C8A0), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000), hexto555($000000) 142 | -------------------------------------------------------------------------------- /elder.asm: -------------------------------------------------------------------------------- 1 | NewElderCode: 2 | { 3 | LDA.b OverworldIndex : CMP.b #$1B : BEQ .newCodeContinue 4 | ;Restore Jump we can keep the RTL so JML 5 | JML $85F0CD 6 | .newCodeContinue 7 | PHB : PHK : PLB 8 | LDA.b #$07 : STA.w SpriteOAMProp, X ; Palette 9 | JSR Elder_Draw 10 | JSL Sprite_PlayerCantPassThrough 11 | JSR Elder_Code 12 | 13 | PLB 14 | RTL 15 | 16 | 17 | Elder_Draw: 18 | { 19 | 20 | LDA.b #$02 : STA.b Scrap06 : STZ.b Scrap07 ;Number of Tiles 21 | 22 | LDA.w SpriteGFXControl, X : ASL #04 23 | 24 | ADC.b #.animation_states : STA.b Scrap08 25 | LDA.b #.animation_states>>8 : ADC.b #$00 : STA.b Scrap09 26 | 27 | JSL Sprite_DrawMultiple_player_deferred 28 | JSL Sprite_DrawShadowLong 29 | 30 | RTS 31 | 32 | .animation_states 33 | ;Frame0 34 | dw 0, -9 : db $C6, $00, $00, $02 35 | dw 0, 0 : db $C8, $00, $00, $02 36 | ;Frame1 37 | dw 0, -8 : db $C6, $00, $00, $02 38 | dw 0, 0 : db $CA, $40, $00, $02 39 | } 40 | 41 | Elder_Code: 42 | { 43 | REP #$20 44 | LDA.l GoalItemRequirement : BEQ .despawn 45 | LDA.l GanonVulnerableMode : AND.w #$00FF : CMP.w #$0005 : BEQ .despawn 46 | LDA.l TurnInGoalItems : AND.w #$00FF : BNE + 47 | .despawn 48 | SEP #$20 49 | STZ.w SpriteAITable, X ; despawn self 50 | RTS 51 | + 52 | SEP #$20 53 | LDA.b GameSubMode 54 | BNE .done 55 | LDA.b #$96 56 | LDY.b #$01 57 | 58 | JSL Sprite_ShowSolicitedMessageIfPlayerFacing_PreserveMessage : BCC .dont_show 59 | REP #$20 60 | LDA.l GoalCounter 61 | CMP.l GoalItemRequirement : !BLT + 62 | SEP #$20 63 | JSL.l ActivateGoal 64 | + 65 | .dont_show 66 | 67 | .done 68 | SEP #$20 69 | LDA.b FrameCounter : LSR #5 : AND.b #$01 : STA.w SpriteGFXControl, X 70 | RTS 71 | } 72 | -------------------------------------------------------------------------------- /enemy_adjustments.asm: -------------------------------------------------------------------------------- 1 | ;-------------------------------------------------------------------------------- 2 | ; NewBatInit: 3 | ; make sure bats always load LW stats 4 | ;-------------------------------------------------------------------------------- 5 | NewBatInit: 6 | CPY.b #$00 : BEQ .light_world 7 | ;check if map id == 240 or 241 8 | LDA.b RoomIndex : CMP.b #$F0 : BEQ .light_world ;oldman cave1 9 | CMP.b #$F1 : BEQ .light_world ;oldman cave2 10 | CMP.b #$B0 : BEQ .light_world ;agahnim statue keese 11 | CMP.b #$D0 : BEQ .light_world ;agahnim darkmaze 12 | 13 | 14 | LDA.b #$85 : STA.w SpriteBump, X 15 | LDA.b #$04 : STA.w SpriteHitPoints, X 16 | RTL 17 | .light_world 18 | LDA.b #$80 : STA.w SpriteBump, X 19 | LDA.b #$01 : STA.w SpriteHitPoints, X 20 | RTL 21 | ;-------------------------------------------------------------------------------- 22 | NewFireBarDamage: 23 | LDA.b LinkLayer : CMP.w SpriteLayer, X : BNE .NotSameLayer 24 | JSL Sprite_AttemptDamageToPlayerPlusRecoilLong 25 | RTL 26 | .NotSameLayer 27 | RTL 28 | -------------------------------------------------------------------------------- /externalhooks.asm: -------------------------------------------------------------------------------- 1 | org $A98000 ; 0x148000 2 | Ext_OnFileCreate: ;x 3 | RTL : RTL : RTL : RTL : RTL 4 | Ext_OnFileLoad: ;x immediately after load 5 | RTL : RTL : RTL : RTL : RTL 6 | Ext_OnFileSave: ;x immediately before save 7 | RTL : RTL : RTL : RTL : RTL 8 | Ext_OnPlayerDeath: ;x 9 | RTL : RTL : RTL : RTL : RTL 10 | Ext_OnMapUse: ;x 11 | RTL : RTL : RTL : RTL : RTL 12 | Ext_OnFairyRevive: ;x 13 | RTL : RTL : RTL : RTL : RTL 14 | Ext_OnYItemUse: ;x 15 | RTL : RTL : RTL : RTL : RTL 16 | Ext_OnIemMenuOpen: ;x 17 | RTL : RTL : RTL : RTL : RTL 18 | Ext_OnItemMenuClose: ;x 19 | RTL : RTL : RTL : RTL : RTL 20 | Ext_OnItemChange: ;x 21 | RTL : RTL : RTL : RTL : RTL 22 | Ext_OnPlayerDamaged: ;x 23 | RTL : RTL : RTL : RTL : RTL 24 | Ext_OnPlayerAttack: ;x 25 | RTL : RTL : RTL : RTL : RTL 26 | Ext_OnBossDeath: ;x 27 | RTL : RTL : RTL : RTL : RTL 28 | Ext_OnDungeonEnter: ;x 29 | RTL : RTL : RTL : RTL : RTL 30 | Ext_OnDungeonExit: ;x 31 | RTL : RTL : RTL : RTL : RTL 32 | Ext_OnDungeonCompleted: ;x 33 | RTL : RTL : RTL : RTL : RTL 34 | Ext_OnZeldaRescued: ;x 35 | RTL : RTL : RTL : RTL : RTL 36 | -------------------------------------------------------------------------------- /fairyfixes.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Fairy Changes & Fixes 3 | ;-------------------------------------------------------------------------------- 4 | RefillHealthPlusMagic: 5 | LDA.l BigFairyHealth : STA.l HeartsFiller 6 | RTL 7 | ;-------------------------------------------------------------------------------- 8 | RefillHealthPlusMagic8bit: 9 | LDA.l BigFairyHealth : STA.l HeartsFiller 10 | LDA.l BigFairyMagic : STA.l MagicFiller 11 | RTL 12 | ;-------------------------------------------------------------------------------- 13 | CheckFullHealth: 14 | LDA.l BigFairyHealth : BEQ + 15 | LDA.l CurrentHealth : CMP.l MaximumHealth : BNE .player_hp_not_full_yet 16 | + 17 | LDA.l BigFairyMagic : BEQ + 18 | LDA.l CurrentMagic : CMP.b #$80 : BNE .player_mp_not_full_yet 19 | + 20 | LDA.b #$00 21 | RTL 22 | .player_hp_not_full_yet 23 | .player_mp_not_full_yet 24 | LDA.b #$01 25 | RTL 26 | ;-------------------------------------------------------------------------------- 27 | FairyPond_Init: 28 | LDA.l Restrict_Ponds : BNE + 29 | LDA.b #$48 30 | JML.l Sprite_ShowMessageFromPlayerContact 31 | + 32 | PHY : JSL.l Sprite_CheckDamageToPlayerSameLayerLong : BCC + 33 | LDA.l BottleContentsOne : CMP.b #$02 : BNE ++ : LDA.b #$1C : PHA : BRA .emptyBottle : ++ 34 | LDA.l BottleContentsTwo : CMP.b #$02 : BNE ++ : LDA.b #$1D : PHA : BRA .emptyBottle : ++ 35 | LDA.l BottleContentsThree : CMP.b #$02 : BNE ++ : LDA.b #$1E : PHA : BRA .emptyBottle : ++ 36 | LDA.l BottleContentsFour : CMP.b #$02 : BNE ++ : LDA.b #$1F : PHA : BRA .emptyBottle : ++ 37 | .noInventory 38 | LDA.b #$0A : STA.w SpriteActivity, X 39 | LDA.b #$51 40 | LDY.b #$01 41 | JSL.l Sprite_ShowMessageFromPlayerContact 42 | JMP .cleanup 43 | 44 | .emptyBottle 45 | LDA.b #$02 : STA.w SpriteActivity, X 46 | STZ.b LinkDirection 47 | LDA.b #$01 : STA.w CutsceneFlag 48 | PLA : STA.w MessageCursor 49 | .cleanup 50 | STZ.w SpriteDirectionTable, X ; Clear the sprite's item-given variable 51 | CLC ; skip rest of original function 52 | + : PLY 53 | RTL 54 | ;-------------------------------------------------------------------------------- 55 | HappinessPond_Check: 56 | LDA.b RoomIndex : CMP.b #$15 ;what we wrote over 57 | BNE .done 58 | PHP 59 | 60 | LDA.b #$72 61 | JSL Sprite_SpawnDynamically 62 | 63 | LDA.w SpriteCoordCacheX : STA.w SpritePosXLow, Y 64 | LDA.w SpriteCoordCacheX+1 : STA.w SpritePosXHigh, Y 65 | 66 | LDA.w SpriteCoordCacheY : !SUB.b #$40 : STA.w SpritePosYLow, Y 67 | LDA.w SpriteCoordCacheY+1 : SBC.b #$00 : STA.w SpritePosYHigh, Y 68 | 69 | LDA.b #$01 : STA.w SpriteAuxTable, Y 70 | 71 | LDA.b #$BB 72 | JSL Sprite_SpawnDynamically 73 | 74 | LDA.b #$08 : STA.w SpriteAITable, Y ; ensure we run prep for the shopkeeper 75 | 76 | LDA.w SpriteCoordCacheX : STA.w SpritePosXLow, Y 77 | LDA.w SpriteCoordCacheX+1 : STA.w SpritePosXHigh, Y 78 | 79 | LDA.w SpriteCoordCacheY : !SUB.b #$20 : STA.w SpritePosYLow, Y 80 | LDA.w SpriteCoordCacheY+1 : SBC.b #$00 : STA.w SpritePosYHigh, Y 81 | 82 | STZ.w SpriteAITable, X ; self terminate 83 | 84 | PLP 85 | .done 86 | RTL 87 | -------------------------------------------------------------------------------- /fastcredits.asm: -------------------------------------------------------------------------------- 1 | FastCreditsActive = $50 2 | 3 | ;=================================================================================================== 4 | 5 | 6 | FlagFastCredits: 7 | LDA.b #$40 8 | TRB.b FastCreditsActive 9 | 10 | AND.b Joy1B_All 11 | TSB.b FastCreditsActive 12 | 13 | LDA.b #$20 14 | AND.b Joy1A_New 15 | EOR.b FastCreditsActive 16 | STA.b FastCreditsActive 17 | 18 | LDA.b FastCreditsActive 19 | AND.b #$60 20 | BEQ .slow 21 | 22 | LDA.b #$01 23 | TSB.b FastCreditsActive 24 | 25 | .slow 26 | LDA.b $11 27 | ASL 28 | TAX 29 | 30 | RTL 31 | 32 | ;=================================================================================================== 33 | 34 | FastCreditsCutsceneTimer: 35 | LDA.b ScrapBufferBD+$0B 36 | INC 37 | 38 | JSR IsFastCredits 39 | BCC .slow 40 | 41 | INC 42 | INC 43 | INC 44 | 45 | AND.w #$FFFE 46 | 47 | .slow 48 | STA.b ScrapBufferBD+$0B 49 | 50 | SEP #$20 51 | RTL 52 | 53 | FastCreditsScrollOW: 54 | JSR FastCreditsCutsceneScrollY 55 | TAY 56 | STY.b $30 57 | 58 | JSR FastCreditsCutsceneScrollX 59 | TAY 60 | STY.b $31 61 | 62 | RTL 63 | 64 | FastCreditsCutsceneScrollX: 65 | PHX 66 | TXA 67 | CLC 68 | ADC.w #$0020 69 | TAX 70 | 71 | LDY.b #$00 72 | JSR FastCreditsCutsceneScroll 73 | 74 | PLX 75 | RTS 76 | 77 | FastCreditsCutsceneScrollY: 78 | LDY.b #$06 79 | 80 | FastCreditsCutsceneScroll: 81 | LDA.w $00E2,Y 82 | CMP.l $8EC308,X ; compare to target 83 | 84 | ROL.b Scrap00 ; put carry in here 85 | LDA.l $8EC348,X ; get movement 86 | BPL ++ ; if positive, leave saved carry alone 87 | INC.b Scrap00 ; otherwise, flip it 88 | ++ ROR.b Scrap00 ; recover carry 89 | 90 | BCC ++ ; scroll if carry not set 91 | 92 | LDA.w #$0000 93 | 94 | ++ JSR IsFastCredits 95 | BCC .slow 96 | 97 | AND.w #$FFFF ; get sign of A 98 | BPL .positive 99 | 100 | EOR.w #$FFFF 101 | INC 102 | ASL 103 | ASL 104 | EOR.w #$FFFF 105 | INC 106 | RTS 107 | 108 | .positive 109 | ASL 110 | ASL 111 | 112 | .slow 113 | RTS 114 | 115 | FastCreditsCutsceneUnderworldX: 116 | JSR FastCreditsCutsceneScrollX 117 | CLC 118 | ADC.b BG2H 119 | STA.b BG2H 120 | 121 | RTL 122 | 123 | 124 | FastCreditsCutsceneUnderworldY: 125 | JSR FastCreditsCutsceneScrollY 126 | CLC 127 | ADC.b BG2V 128 | STA.b BG2V 129 | 130 | RTL 131 | 132 | 133 | FastTextScroll: 134 | LDA.b FrameCounter 135 | SEP #$10 136 | JSR IsFastCredits 137 | BCC .slow 138 | 139 | AND.w #$0000 140 | REP #$10 141 | RTL 142 | 143 | .slow 144 | AND.w #$0003 145 | REP #$10 146 | RTL 147 | 148 | DumbFlagForMSU: 149 | STA.l CurrentWorld 150 | STZ.b FastCreditsActive 151 | RTL 152 | 153 | IsFastCredits: 154 | LDY.b FastCreditsActive 155 | CPY.b #$20 156 | RTS 157 | 158 | -------------------------------------------------------------------------------- /flipperkill.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Fake Flippers Softlock Fix 3 | ;-------------------------------------------------------------------------------- 4 | 5 | ; Written over and used by OnEnterWater hook. 6 | UnequipCapeQuiet: 7 | LDA.b #$20 : STA.w PoofTimer 8 | STZ.w NoDamage 9 | STZ.b CapeOn 10 | STZ.w LinkZap 11 | RTL 12 | 13 | protectff: 14 | LDA.l AllowAccidentalMajorGlitch 15 | BEQ .yes_protect 16 | 17 | RTL 18 | 19 | .yes_protect 20 | REP #$30 21 | 22 | LDA.b LinkPosY 23 | AND.w #$1E00 24 | ASL 25 | ASL 26 | ASL 27 | STA.b Scrap06 28 | 29 | LDA.b LinkPosX 30 | AND.w #$1E00 31 | ORA.b Scrap06 32 | 33 | XBA 34 | LSR 35 | TAX 36 | 37 | SEP #$30 38 | 39 | ; Remove dark world bit 40 | ; in game table that converts coordinates to actual screen ID 41 | ; special case for other areas 42 | LDA.b OverworldIndex 43 | BMI .special_overworld 44 | 45 | AND.b #$3F 46 | CMP.l $82A4E3,X 47 | BEQ ++ 48 | 49 | .protect 50 | LDA.b #$15 51 | STA.b LinkState 52 | 53 | STZ.b LinkAnimationStep 54 | STZ.b LinkWalkDirection 55 | 56 | LDA.b #$02 57 | STA.b LinkDirection 58 | 59 | STZ.w MedallionFlag 60 | STZ.w CutsceneFlag 61 | STZ.w NoMenu 62 | 63 | ++ RTL 64 | 65 | .special_overworld 66 | CMP.l .spow,X 67 | BNE .protect 68 | 69 | RTL 70 | 71 | .spow 72 | db $80, $81, $81, $FF, $FF, $FF, $FF, $FF 73 | db $FF, $81, $81, $FF, $FF, $FF, $FF, $FF 74 | -------------------------------------------------------------------------------- /floodgatesoftlock.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Floodgate Softlock Fix 3 | ;-------------------------------------------------------------------------------- 4 | FloodGateAndMasterSwordFollowerReset: 5 | JSL.l MasterSwordFollowerClear 6 | FloodGateReset: 7 | LDA.l PersistentFloodgate : BNE + 8 | LDA.l OverworldEventDataWRAM+$3B : AND.b #$DF : STA.l OverworldEventDataWRAM+$3B ; reset water outside floodgate 9 | LDA.l OverworldEventDataWRAM+$7B : AND.b #$DF : STA.l OverworldEventDataWRAM+$7B ; reset water outside swamp palace 10 | LDA.l RoomDataWRAM[$010B].low : AND.b #$7F : STA.l RoomDataWRAM[$010B].low ; clear water inside floodgate 11 | LDA.l RoomDataWRAM[$28].high : AND.b #$FE : STA.l RoomDataWRAM[$28].high ; clear water front room (room 40) 12 | + 13 | FloodGateResetInner: 14 | LDA.l Bugfix_SwampWaterLevel : BEQ +++ 15 | LDA.l RoomDataWRAM[$37].low : AND.b #$04 : BEQ + ; Check if key in room 55 has been collected. 16 | LDA.l FlippersEquipment : AND.b #$01 : BNE ++ ; Check for flippers. This can otherwise softlock doors if flooded without flippers and no way to reset. 17 | + 18 | 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 19 | ++ 20 | LDA.l RoomDataWRAM[$35].high : AND.b #$04 : BNE +++ ; Check if key in room 53 has been collected. 21 | ; no need to check for flippers on the inner room, as you can't get to the west door no matter what, without flippers. 22 | 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 23 | +++ 24 | RTL 25 | ;================================================================================ 26 | -------------------------------------------------------------------------------- /flute.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Randomize Flute Dig Item 3 | ;-------------------------------------------------------------------------------- 4 | SpawnHauntedGroveItem: 5 | LDA.b OverworldIndex : CMP.b #$2A : BEQ + : RTL : + ; Skip if not the haunted grove 6 | LDA.b IndoorsFlag : BEQ + : RTL : + ; Skip if indoors 7 | 8 | LDA.b #$EB 9 | STA.l MiniGameTime 10 | JSL Sprite_SpawnDynamically 11 | 12 | LDX.b #$00 13 | LDA.b LinkDirection : CMP.b #$04 : BEQ + : INX : + 14 | 15 | LDA.l .x_speeds, X : STA.w SpriteVelocityX, Y 16 | 17 | LDA.b #$00 : STA.w SpriteVelocityY, Y 18 | LDA.b #$18 : STA.w SpriteVelocityZ, Y 19 | LDA.b #$FF : STA.w EnemyStunTimer, Y 20 | LDA.b #$30 : STA.w SpriteTimerE, Y 21 | 22 | LDA.b LinkPosX : !ADD.l .x_offsets, X 23 | AND.b #$F0 : STA.w SpritePosXLow, Y 24 | LDA.b LinkPosX+1 : ADC.b #$00 : STA.w SpritePosXHigh, Y 25 | 26 | LDA.b LinkPosY : !ADD.b #$16 : AND.b #$F0 : STA.w SpritePosYLow, Y 27 | LDA.b LinkPosY+1 : ADC.b #$00 : STA.w SpritePosYHigh, Y 28 | 29 | LDA.b #$00 : STA.w SpriteLayer, Y 30 | TYX 31 | 32 | LDX.b OverworldIndex ; haunted grove (208D0A) 33 | LDA.l OverworldEventDataWRAM, X : AND.b #$40 : BNE + 34 | LDA.b #$1B : JSL Sound_SetSfx3PanLong 35 | + 36 | RTL 37 | 38 | ;DATA - Flute Spawn Information 39 | { 40 | 41 | .x_speeds 42 | db $F0 43 | db $10 44 | 45 | .x_offsets 46 | db $00 47 | db $13 48 | 49 | } 50 | ;-------------------------------------------------------------------------------- 51 | FluteBoy: 52 | LDA.b GameMode : CMP.b #$1A : BEQ + 53 | LDA.b #$01 : STA.w $0FDD 54 | JML.l FluteBoy_Abort 55 | + 56 | LDA.w SpriteActivity, X : CMP.b #$03 ; thing we wrote over 57 | JML.l FluteBoy_Continue 58 | ;-------------------------------------------------------------------------------- 59 | FreeDuckCheck: 60 | LDA.l InvertedMode : BEQ .done 61 | LDA.l FluteEquipment : CMP.b #$03 : BEQ .done ; flute is already active 62 | 63 | ; check the area, is it #$18 = 30? 64 | LDA.b OverworldIndex : CMP.b #$18 : BNE .done 65 | 66 | REP #$20 67 | 68 | ; Y coordinate boundaries for setting it off. 69 | LDA.b LinkPosY 70 | 71 | CMP.w #$0760 : BCC .done 72 | CMP.w #$07E0 : BCS .done 73 | 74 | ; do if( (Ycoord >= 0x0760) && (Ycoord < 0x07e0 75 | LDA.b LinkPosX 76 | 77 | CMP.w #$01CF : BCC .done 78 | CMP.w #$0230 : BCS .done 79 | 80 | ; do if( (Xcoord >= 0x1cf) && (Xcoord < 0x0230) 81 | SEP #$20 82 | 83 | ; Apparently a special Overworld mode for doing this? 84 | LDA.b #$2D : STA.b GameSubMode 85 | 86 | ; Trigger the sequence to start the weathervane explosion. 87 | LDY.b #$00 88 | LDA.b #$37 89 | 90 | JSL AddWeathervaneExplosion 91 | BRA .skipSong 92 | .done 93 | SEP #$20 94 | LDA.b #$80 : STA.w FluteTimer ; thing we wrote over 95 | LDA.b #$13 96 | RTL 97 | .skipSong 98 | SEP #$20 99 | LDA.b #$80 : STA.w FluteTimer ; thing we wrote over 100 | LDA.b #$00 101 | RTL 102 | ;-------------------------------------------------------------------------------- 103 | -------------------------------------------------------------------------------- /framehook.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Frame Hook 3 | ;-------------------------------------------------------------------------------- 4 | FrameHookAction: 5 | JSL $8080B5 ; Module_MainRouting 6 | JSL CheckMusicLoadRequest 7 | PHP : REP #$30 : PHA 8 | SEP #$20 9 | LDA.l StatsLocked : BNE ++ 10 | REP #$20 ; set 16-bit accumulator 11 | LDA.l LoopFrames : INC : STA.l LoopFrames : BNE + 12 | LDA.l LoopFrames+2 : INC : STA.l LoopFrames+2 13 | + 14 | LDA.l GameMode : CMP.w #$010E : BNE ++ ; move this to nmi hook? 15 | LDA.l MenuFrames : INC : STA.l MenuFrames : BNE ++ 16 | LDA.l MenuFrames+2 : INC : STA.l MenuFrames+2 17 | ++ 18 | REP #$30 : PLA : PLP 19 | 20 | RTL 21 | ;-------------------------------------------------------------------------------- 22 | NMIHookAction: 23 | PHA : PHX : PHY : PHD ; thing we wrote over, push stuff 24 | LDA.l StatsLocked : AND.w #$00FF : BNE + 25 | LDA.l NMIFrames : INC : STA.l NMIFrames : BNE + 26 | LDA.l NMIFrames+2 : INC : STA.l NMIFrames+2 27 | + 28 | 29 | JML.l NMIHookReturn 30 | ;-------------------------------------------------------------------------------- 31 | PostNMIHookAction: 32 | LDA.w NMIAux : BEQ + 33 | PHK : PEA .return-1 ; push stack for RTL return 34 | JMP.w [NMIAux] 35 | .return 36 | STZ.w NMIAux ; zero bank byte of NMI hook pointer 37 | + 38 | JSR.w TransferItemGFX 39 | LDA.b INIDISPQ : STA.w INIDISP ; thing we wrote over, turn screen back on 40 | 41 | JML.l PostNMIHookReturn 42 | ;-------------------------------------------------------------------------------- 43 | TransferItemGFX: 44 | ; Only used for shops now but could be used for anything. We should look at how door rando does this 45 | ; and try to unify one approach. 46 | REP #$30 47 | LDX.w ItemStackPtr : BEQ .done 48 | TXA : BIT #$0040 : BNE .fail ; Crash if we have more than 16 queued (should never happen.) 49 | DEX #2 50 | - 51 | LDA.l ItemGFXStack,X : STA.w ItemGFXPtr 52 | LDA.l ItemTargetStack,X : STA.w ItemGFXTarget 53 | PHX 54 | JSL.l TransferItemToVRAM 55 | REP #$10 56 | PLX 57 | DEX #2 58 | BPL - 59 | 60 | STZ.w ItemStackPtr 61 | .done 62 | SEP #$30 63 | RTS 64 | .fail 65 | BRK #$00 66 | -------------------------------------------------------------------------------- /glitched.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Glitched Mode Fixes 3 | ;================================================================================ 4 | GetAgahnimPalette: 5 | LDA.b RoomIndex ; get room id 6 | CMP.b #13 : BNE + ; Agahnim 2 room 7 | LDA.b #$07 ; Use Agahnim 2 8 | RTL 9 | + ; Elsewhere 10 | LDA.b #$0b ; Use Agahnim 1 11 | RTL 12 | ;-------------------------------------------------------------------------------- 13 | GetAgahnimDeath: 14 | STA.w $0BA0, X ; thing we wrote over 15 | LDA.b RoomIndex ; get room id 16 | CMP.b #13 : BNE + ; Agahnim 2 room 17 | LDA.l Bugfix_SetWorldOnAgahnimDeath : BEQ ++ 18 | LDA.l InvertedMode : BEQ +++ 19 | LDA.b #$00 : STA.l CurrentWorld ; Switch to light world 20 | BRA ++ 21 | +++ 22 | LDA.b #$40 : STA.l CurrentWorld ; Switch to dark world 23 | ++ 24 | LDA.b #$01 ; Use Agahnim 2 25 | RTL 26 | + ; Elsewhere 27 | LDA.l Bugfix_SetWorldOnAgahnimDeath : BEQ ++ 28 | LDA.l InvertedMode : BEQ +++ 29 | LDA.b #$40 : STA.l CurrentWorld ; Switch to dark world 30 | BRA ++ 31 | +++ 32 | LDA.b #$00 : STA.l CurrentWorld ; Switch to light world 33 | ; (This will later get flipped to DW when Agahnim 1 34 | ; warps us to the pyramid) 35 | ++ 36 | LDA.b #$00 ; Use Agahnim 1 37 | RTL 38 | ;-------------------------------------------------------------------------------- 39 | GetAgahnimType: 40 | LDA.b RoomIndex ; get room id 41 | CMP.b #13 : BNE + ; Agahnim 2 room 42 | LDA.b #$0006 ; Use Agahnim 2 43 | BRA .done 44 | + ; Elsewhere 45 | LDA.b #$0001 ; Use Agahnim 1 46 | .done 47 | RTL 48 | ;-------------------------------------------------------------------------------- 49 | GetAgahnimSlot: 50 | PHX ; thing we wrote over 51 | LDA.b RoomIndex ; get room id 52 | CMP.b #13 : BNE + ; Agahnim 2 room 53 | LDA.b #$01 ; Use Agahnim 2 54 | JML.l GetAgahnimSlotReturn 55 | + ; Elsewhere 56 | LDA.b #$00 ; Use Agahnim 1 57 | JML.l GetAgahnimSlotReturn 58 | ;-------------------------------------------------------------------------------- 59 | GetAgahnimLightning: 60 | INC.w SpriteAux, X ; thing we wrote over 61 | LDA.b RoomIndex ; get room id 62 | CMP.b #13 : BNE + ; Agahnim 2 room 63 | LDA.b #$01 ; Use Agahnim 2 64 | RTL 65 | + ; Elsewhere 66 | LDA.b #$00 ; Use Agahnim 1 67 | RTL 68 | ;-------------------------------------------------------------------------------- 69 | ;0 = Allow 70 | ;1 = Forbid 71 | AllowJoypadInput: 72 | LDA.l PermitSQFromBosses : BEQ .fullCheck 73 | LDA.w RoomItemsTaken : AND.b #$80 : BEQ .fullCheck 74 | LDA.w MedallionFlag : ORA.w CutsceneFlag ; we have heart container, do short check 75 | RTL 76 | .fullCheck 77 | LDA.w MedallionFlag : ORA.w CutsceneFlag : ORA.w NoMenu 78 | RTL 79 | ;-------------------------------------------------------------------------------- 80 | -------------------------------------------------------------------------------- /goalitem.asm: -------------------------------------------------------------------------------- 1 | GoalItemGanonCheck: 2 | LDA.w SpriteTypeTable, X : CMP.b #$D6 : BNE .success ; skip if not ganon 3 | JSL.l CheckGanonVulnerability 4 | BCS .success 5 | 6 | .fail 7 | LDA.w SpriteActivity, X : CMP.b #17 : !BLT .success ; decmial 17 because Acmlm's chart is decimal 8 | LDA.b #$00 9 | RTL 10 | .success 11 | LDA.b OAMOffsetY : CMP.b #$80 ; thing we wrote over 12 | RTL 13 | ;-------------------------------------------------------------------------------- 14 | ;Carry clear = ganon invincible 15 | ;Carry set = ganon vulnerable 16 | CheckGanonVulnerability: 17 | PHX 18 | LDA.l GanonVulnerableMode 19 | ASL 20 | TAX 21 | 22 | ; Carry 23 | ; 0 - invulnerable 24 | ; 1 - vulnerable 25 | JSR (.goals, X) 26 | 27 | PLX 28 | RTL 29 | 30 | 31 | .goals 32 | dw .vulnerable 33 | dw .invulnerable 34 | dw .all_dungeons 35 | dw .crystals_and_aga 36 | dw .crystals 37 | dw .goal_item 38 | dw .light_speed 39 | dw .crystals_and_bosses 40 | dw .bosses_only 41 | dw .all_dungeons_no_agahnim 42 | dw .all_items 43 | dw .completionist 44 | 45 | ; 00 = always vulnerable 46 | .vulnerable 47 | .success 48 | SEC 49 | RTS 50 | 51 | ; 01 = always invulnerable 52 | .invulnerable 53 | .fail 54 | CLC 55 | RTS 56 | 57 | ; 02 = All dungeons 58 | .all_dungeons 59 | LDA.l ProgressIndicator : CMP.b #$03 : BCC .fail ; require post-aga world state 60 | 61 | ; 09 = All dungeons except agahnim 62 | .all_dungeons_no_agahnim 63 | LDA.l PendantsField : AND.b #$07 : CMP.b #$07 : BNE .fail ; require all pendants 64 | LDA.l CrystalsField : AND.b #$7F : CMP.b #$7F : BNE .fail ; require all crystals 65 | LDA.l OverworldEventDataWRAM+$5B : AND.b #$20 : BEQ .fail ; require aga2 defeated (pyramid hole open) 66 | BRA .success 67 | 68 | ; 03 = crystals and aga 2 69 | .crystals_and_aga 70 | LDA.l OverworldEventDataWRAM+$5B : AND.b #$20 : BEQ .fail ; check aga2 first then bleed in 71 | 72 | ; 04 = crystals only 73 | .crystals 74 | JSL CheckEnoughCrystalsForGanon 75 | RTS 76 | 77 | ; 05 = require goal item 78 | .goal_item 79 | REP #$20 80 | LDA.l GoalCounter : CMP.l GoalItemRequirement 81 | SEP #$20 82 | RTS 83 | 84 | ; 06 = light speed 85 | .light_speed 86 | BRA .fail 87 | 88 | ; 07 = Crystals and bosses 89 | .crystals_and_bosses 90 | JSL CheckEnoughCrystalsForGanon ; check crystals first then bleed in to next 91 | BCC .fail 92 | 93 | ; 08 = Crystal bosses but no crystals 94 | .bosses_only 95 | JMP CheckForCrystalBossesDefeated 96 | 97 | ; 09 = 100% item collection rate 98 | .all_items 99 | REP #$20 100 | LDA.l TotalItemCounter : CMP.l TotalItemCount 101 | SEP #$20 102 | RTS 103 | 104 | ; 0A = 100% item collection rate and all dungeons 105 | .completionist 106 | REP #$20 107 | LDA.l TotalItemCounter : CMP.l TotalItemCount 108 | SEP #$20 109 | BCC .fail 110 | BRA .all_dungeons 111 | 112 | ;-------------------------------------------------------------------------------- 113 | GetRequiredCrystalsForTower: 114 | BEQ + : JSL.l BreakTowerSeal_ExecuteSparkles : + ; thing we wrote over 115 | LDA.l GanonsTowerOpenTarget : CMP.b #$00 : BNE + : JML.l Ancilla_BreakTowerSeal_stop_spawning_sparkles : + 116 | LDA.l GanonsTowerOpenTarget : CMP.b #$01 : BNE + : JML.l Ancilla_BreakTowerSeal_draw_single_crystal : + 117 | LDA.l GanonsTowerOpenTarget : DEC #2 : TAX 118 | JML.l GetRequiredCrystalsForTower_continue 119 | ;-------------------------------------------------------------------------------- 120 | GetRequiredCrystalsInX: 121 | LDA.l GanonsTowerOpenTarget : CMP.b #$00 : BNE + 122 | TAX 123 | RTL 124 | + 125 | 126 | TXA 127 | 128 | - CMP.l GanonsTowerOpenTarget : BCC + 129 | SBC.l GanonsTowerOpenTarget ; carry guaranteed set 130 | BRA - 131 | 132 | + INC : CMP.l GanonsTowerOpenTarget : BNE + 133 | LDA.b #$08 134 | + : DEC : TAX 135 | RTL 136 | ;-------------------------------------------------------------------------------- 137 | CheckEnoughCrystalsForGanon: 138 | REP #$20 139 | LDA.l CrystalCounter 140 | CMP.l GanonVulnerableTarget 141 | SEP #$20 142 | RTL 143 | ;-------------------------------------------------------------------------------- 144 | CheckTowerOpen: 145 | LDA.l GanonsTowerOpenMode : ASL : TAX 146 | JSR.w (.tower_open_modes,X) 147 | RTL 148 | .tower_open_modes 149 | dw .vanilla 150 | dw .arbitrary_cmp 151 | 152 | .vanilla 153 | LDA.l CrystalsField 154 | AND.b #$7F : CMP.b #$7F 155 | RTS 156 | 157 | .arbitrary_cmp 158 | REP #$30 159 | LDA.l GanonsTowerOpenAddress : TAX 160 | LDA.l $7E0000,X 161 | CMP.l GanonsTowerOpenTarget 162 | SEP #$30 163 | RTS 164 | 165 | ;--------------------------------------------------------------------------------------------------- 166 | CheckAgaForPed: 167 | REP #$20 168 | LDA.l GanonVulnerableMode 169 | CMP.w #$0006 : BNE .vanilla 170 | 171 | .light_speed 172 | SEP #$20 173 | LDA.l OverworldEventDataWRAM+$80 ; check ped flag 174 | AND.b #$40 175 | BEQ .force_blue_ball 176 | 177 | .vanilla ; run vanilla check for phase 178 | SEP #$20 179 | LDA.w SpriteAux, X 180 | CMP.b #$02 181 | RTL 182 | 183 | .force_blue_ball 184 | LDA.b #$01 : STA.w SpriteAuxTable, Y 185 | LDA.b #$20 : STA.w SpriteTimer, Y 186 | CLC ; skip the RNG check 187 | RTL 188 | 189 | ;--------------------------------------------------------------------------------------------------- 190 | CheckForCrystalBossesDefeated: 191 | PHB : PHX : PHY 192 | 193 | LDA.b #CrystalPendantFlags_2>>16 194 | PHA : PLB 195 | 196 | REP #$30 197 | 198 | ; count of number of bosses killed 199 | STZ.b Scrap00 200 | 201 | LDY.w #10 202 | 203 | .next_check 204 | LDA.w CrystalPendantFlags_2-2,Y 205 | BIT.w #$0040 206 | BEQ ++ 207 | 208 | TYA 209 | ASL 210 | TAX 211 | 212 | LDA.l DrawHUDDungeonItems_boss_room_ids-4,X 213 | TAX 214 | LDA.l RoomDataWRAM.l,X 215 | 216 | AND.w #$0800 217 | BEQ ++ 218 | 219 | INC.b Scrap00 220 | 221 | ++ DEY 222 | BPL .next_check 223 | 224 | SEP #$30 225 | PLY : PLX : PLB 226 | 227 | LDA.b Scrap00 : CMP.l GanonVulnerableTarget 228 | 229 | 230 | RTS 231 | ;--------------------------------------------------------------------------------------------------- 232 | CheckPedestalPull: 233 | ; Out: c - Successful ped pull if set, do nothing if unset. 234 | PHX 235 | LDA.l PedCheckMode : ASL : TAX 236 | JSR.w (.pedestal_modes,X) 237 | PLX 238 | RTL 239 | 240 | .pedestal_modes 241 | dw .vanilla 242 | dw .arbitrary_cmp 243 | 244 | .vanilla 245 | LDA.l PendantsField 246 | AND.b #$07 : CMP.b #$07 : BNE ..nopull 247 | SEC 248 | RTS 249 | ..nopull 250 | CLC 251 | RTS 252 | 253 | .arbitrary_cmp 254 | REP #$30 255 | LDA.l PedPullAddress : TAX 256 | LDA.l $7E0000,X 257 | CMP.l PedPullTarget 258 | SEP #$30 259 | RTS 260 | -------------------------------------------------------------------------------- /halfmagicbat.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Randomize Half Magic Bat 3 | ;-------------------------------------------------------------------------------- 4 | GetMagicBatItem: 5 | JSL.l ItemSet_MagicBat 6 | %GetPossiblyEncryptedItem(MagicBatItem, SpriteItemValues) 7 | CMP.b #$FF : BEQ .normalLogic 8 | TAY 9 | STZ.b ItemReceiptMethod ; 0 = Receiving item from an NPC or message 10 | JML.l Link_ReceiveItem 11 | .normalLogic 12 | LDA.l HalfMagic 13 | STA.l MagicConsumption 14 | RTL 15 | ;-------------------------------------------------------------------------------- 16 | -------------------------------------------------------------------------------- /hardmode.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Hard & Masochist Mode 3 | ;================================================================================ 4 | CalculateSpikeFloorDamage: 5 | REP #$20 ; set 16-bit accumulator 6 | LDA.b RoomIndex ; these are all decimal because i got them that way 7 | CMP.w #279 8 | SEP #$20 ; set 8-bit accumulator 9 | BNE + 10 | LDA.l ByrnaCaveSpikeDamage 11 | STA.w DamageReceived 12 | RTL 13 | + 14 | LDA.w $D055, Y 15 | STA.w DamageReceived 16 | RTL 17 | ;-------------------------------------------------------------------------------- 18 | CalculateByrnaUsage: 19 | LDA.b IndoorsFlag : BEQ ++ 20 | REP #$20 ; set 16-bit accumulator 21 | LDA.b RoomIndex ; these are all decimal because i got them that way 22 | CMP.w #95 : BEQ + ; Ice Palace Spike Room 23 | CMP.w #172 : BEQ + ; Blind Boss Room 24 | CMP.w #179 : BEQ + ; Room in Misery Mire 25 | CMP.w #213 : BEQ + ; Laser Bridge 26 | CMP.w #279 : BEQ + ; Spike Cave 27 | SEP #$20 ; set 8-bit accumulator 28 | BRA ++ 29 | + 30 | SEP #$20 ; set 8-bit accumulator 31 | PHX : TYX 32 | LDA.l HardModeExclusionCaneOfByrnaUsage, X : STA.b Scrap00 33 | PLX 34 | ++ 35 | LDA.l CurrentMagic ; thing we wrote over 36 | JML IncrementMagicUseCounterByrna 37 | ;-------------------------------------------------------------------------------- 38 | CalculateCapeUsage: 39 | LDA.b IndoorsFlag : BEQ ++ 40 | REP #$20 ; set 16-bit accumulator 41 | LDA.b RoomIndex ; these are all decimal because i got them that way 42 | CMP.w #95 : BEQ + ; Ice Palace Spike Room 43 | CMP.w #179 : BEQ + ; Room in Misery Mire 44 | CMP.w #213 : BEQ + ; Laser Bridge 45 | CMP.w #279 : BEQ + ; Spike Cave 46 | SEP #$20 ; set 8-bit accumulator 47 | BRA ++ 48 | + 49 | SEP #$20 ; set 8-bit accumulator 50 | PHX : TYX 51 | LDA.l HardModeExclusionCapeUsage, X : STA.b CapeTimer ; set cape decrement timer 52 | PLX 53 | ++ 54 | JML IncrementMagicUseCounterOne 55 | ;-------------------------------------------------------------------------------- 56 | ActivateInvulnerabilityOrDont: 57 | LDA.b IndoorsFlag : BEQ .nowhere_special 58 | REP #$20 ; set 16-bit accumulator 59 | LDA.b RoomIndex ; these are all decimal because i got them that way 60 | CMP.w #95 : BEQ .somewhere_cool ; Ice Palace Spike Room 61 | CMP.w #179 : BEQ .somewhere_cool ; Room in Misery Mire 62 | CMP.w #213 : BEQ .somewhere_cool ; Laser Bridge 63 | CMP.w #279 : BEQ .somewhere_cool ; Spike Cave 64 | 65 | SEP #$20 ; set 8-bit accumulator 66 | BRA .nowhere_special 67 | .somewhere_cool 68 | SEP #$20 ; set 8-bit accumulator 69 | LDA.b #$01 : STA.w NoDamage : RTL 70 | .nowhere_special 71 | LDA.l ByrnaInvulnerability : STA.w NoDamage 72 | RTL 73 | ;-------------------------------------------------------------------------------- 74 | GetItemDamageValue: 75 | CPX.b #$03 : BEQ .boomerang 76 | CPX.b #$04 : BEQ .boomerang 77 | CPX.b #$05 : BEQ .boomerang 78 | CPX.b #$39 : BEQ .hookshot 79 | CPX.b #$3b : BEQ .hookshot 80 | CPX.b #$3c : BEQ .hookshot 81 | CPX.b #$3d : BEQ .hookshot 82 | 83 | .normal 84 | LDA.l $8DB8F1,x ;what we wrote over 85 | RTL 86 | .boomerang 87 | LDA.l StunItemAction : AND.b #$01 : BNE .normal 88 | BRA .noDamage 89 | .hookshot 90 | LDA.l StunItemAction : AND.b #$02 : BNE .normal 91 | .noDamage 92 | LDA.b #$00 93 | RTL 94 | ;-------------------------------------------------------------------------------- 95 | ;Argument : A = id we want to find return 00 if none found, 01 if found 96 | SearchAncilla: 97 | { 98 | STA.b Scrap05 99 | PHX 100 | LDX.b #$00 101 | .loop 102 | LDA.w AncillaID, X 103 | INX : CPX #$0A : BEQ .notFound 104 | CMP.b Scrap05 : BNE .loop 105 | LDA.b #$01 106 | BRA .return 107 | .notFound 108 | LDA.b #$00 109 | .return 110 | PLX 111 | RTS 112 | } 113 | -------------------------------------------------------------------------------- /hashalphabet.asm: -------------------------------------------------------------------------------- 1 | ;-------------------------------------------------------------------------------- 2 | ; Hash Alphabet 3 | ; ALPHA_BOW = $0000 4 | ; ALPHA_BOOM = $0001 5 | ; ALPHA_HOOK = $0002 6 | ; ALPHA_BOMB = $0003 7 | ; ALPHA_SHROOM = $0004 8 | ; ALPHA_POWDER = $0005 9 | ; ALPHA_ROD = $0006 10 | ; ALPHA_PENDANT = $0007 11 | ; ALPHA_BOMBOS = $0008 12 | ; ALPHA_ETHER = $0009 13 | ; ALPHA_QUAKE = $000A 14 | ; ALPHA_LAMP = $000B 15 | ; ALPHA_HAMMER = $000C 16 | ; ALPHA_SHOVEL = $000D 17 | ; ALPHA_FLUTE = $000E 18 | ; ALPHA_NET = $000F 19 | ; ALPHA_BOOK = $0010 20 | ; ALPHA_BOTTLE = $0011 21 | ; ALPHA_POTION = $0012 22 | ; ALPHA_CANE = $0013 23 | ; ALPHA_CAPE = $0014 24 | ; ALPHA_MIRROR = $0015 25 | ; ALPHA_BOOTS = $0016 26 | ; ALPHA_GLOVES = $0017 27 | ; ALPHA_FLIPPERS = $0018 28 | ; ALPHA_PEARL = $0019 29 | ; ALPHA_SHIELD = $001A 30 | ; ALPHA_TUNIC = $001B 31 | ; ALPHA_HEART = $001C 32 | ; ALPHA_MAP = $001D 33 | ; ALPHA_COMPASS = $001E 34 | ; ALPHA_KEY = $001F 35 | ;-------------------------------------------------------------------------------- 36 | 37 | ;-------------------------------------------------------------------------------- 38 | LoadAlphabetTilemap: 39 | PHB : PHA : PHX : PHY : PHP 40 | PHK : PLB 41 | SEP #$10 ; 8-bit index registers 42 | REP #$20 ; 16-bit accumulator 43 | 44 | LDX.b #$00 : - 45 | LDA.w FileSelect_PlayerSelectText_Top, X 46 | STA.l BigRAM, X 47 | INX #2 48 | CPX.b #128 : !BLT - 49 | 50 | LDY.b #00 51 | LDX.b #$00 : - 52 | PHX : TYX : LDA.l SeedHash, X : PLX 53 | AND.w #$001F ; mask to alphabet of 32 54 | 55 | ASL #3 : PHY : TAY 56 | LDA.w HashAlphabetTiles,Y : STA.l BigRAM+24, X 57 | LDA.w HashAlphabetTiles+2,Y : STA.l BigRAM+24+2, X 58 | LDA.w HashAlphabetTiles+4,Y : STA.l BigRAM+24+64, X 59 | LDA.w HashAlphabetTiles+6,Y : STA.l BigRAM+24+64+2, X 60 | PLY : INX #6 : INY 61 | CPX.b #25 : !BLT - 62 | 63 | SEP #$20 ; 8-bit accumulator 64 | 65 | JSR DMAAlphabetTilemap 66 | PLP : PLY : PLX : PLA : PLB 67 | RTL 68 | ;-------------------------------------------------------------------------------- 69 | ; DMAAlphabetTilemap: 70 | ;-------------------------------------------------------------------------------- 71 | DMAAlphabetTilemap: 72 | PHA : PHX 73 | REP #$10 74 | LDA.b #$01 : STA.w DMAP0 75 | LDA.b #$80 : STA.w VMAIN 76 | LDA.b #$18 : STA.w BBAD0 77 | LDX.w #$6060 : STX.w VMADDL 78 | LDA.b #BigRAM>>16 : STA.w A1B0 79 | LDX.w #BigRAM : STX.w A1T0L 80 | LDX.w #$0080 : STX.w DAS0L 81 | LDA.b #$01 : STA.w MDMAEN 82 | SEP #$10 83 | PLX : PLA 84 | RTS 85 | ;-------------------------------------------------------------------------------- 86 | HashAlphabetTilesWithBlank: 87 | ;BLANK 88 | dw #$0188, #$0188, #$0188, #$0188 89 | HashAlphabetTiles: 90 | ;BOW 91 | dw #$0241|!FS_COLOR_YELLOW, #$0242|!FS_COLOR_YELLOW, #$0251|!FS_COLOR_YELLOW, #$0252|!FS_COLOR_YELLOW 92 | ;BOOM 93 | dw #$0245|!FS_COLOR_BLUE, #$0246|!FS_COLOR_BLUE, #$0240|!FS_COLOR_BW, #$0256|!FS_COLOR_BLUE 94 | ;HOOK 95 | dw #$0240|!FS_COLOR_RED, #$0255|!FS_COLOR_RED, #$0270|!FS_COLOR_RED, #$0240|!FS_COLOR_BW 96 | ;BOMB 97 | dw #$024C|!FS_COLOR_BLUE, #$024D|!FS_COLOR_BLUE, #$025C|!FS_COLOR_BLUE, #$025C|!FS_COLOR_BLUE|!FS_HFLIP 98 | ;SHROOM 99 | dw #$02A2|!FS_COLOR_RED, #$02A3|!FS_COLOR_RED, #$02B2|!FS_COLOR_RED, #$02B3|!FS_COLOR_RED 100 | ;POWDER 101 | dw #$024A|!FS_COLOR_BROWN, #$024B|!FS_COLOR_BROWN, #$025A|!FS_COLOR_BROWN, #$025B|!FS_COLOR_BROWN 102 | ;ROD 103 | dw #$0260|!FS_COLOR_BLUE, #$0261|!FS_COLOR_BLUE, #$0270|!FS_COLOR_BLUE, #$0271|!FS_COLOR_BLUE 104 | ;PENDANT 105 | dw #$02C5|!FS_COLOR_GREEN, #$02C6|!FS_COLOR_GREEN, #$02D5|!FS_COLOR_GREEN, #$02D6|!FS_COLOR_GREEN 106 | ;BOMBOS 107 | dw #$0247|!FS_COLOR_YELLOW, #$0257|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP, #$0257|!FS_COLOR_YELLOW, #$0247|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP 108 | ;ETHER 109 | dw #$0248|!FS_COLOR_YELLOW, #$0258|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP, #$0258|!FS_COLOR_YELLOW, #$0248|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP 110 | ;QUAKE 111 | dw #$0249|!FS_COLOR_YELLOW, #$0259|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP, #$0259|!FS_COLOR_YELLOW, #$0249|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP 112 | ;LAMP 113 | dw #$026C|!FS_COLOR_RED, #$026C|!FS_COLOR_RED|!FS_HFLIP, #$027C|!FS_COLOR_RED, #$027D|!FS_COLOR_RED 114 | ;HAMMER 115 | dw #$0262|!FS_COLOR_BROWN, #$0263|!FS_COLOR_BROWN, #$0272|!FS_COLOR_BROWN, #$0273|!FS_COLOR_BROWN 116 | ;SHOVEL 117 | dw #$0264|!FS_COLOR_BROWN, #$0265|!FS_COLOR_BROWN, #$0274|!FS_COLOR_BROWN, #$0275|!FS_COLOR_BROWN 118 | ;FLUTE 119 | dw #$0266|!FS_COLOR_BLUE, #$0267|!FS_COLOR_BLUE, #$0276|!FS_COLOR_BLUE, #$0277|!FS_COLOR_BLUE 120 | ;NET 121 | dw #$0268|!FS_COLOR_YELLOW, #$0269|!FS_COLOR_YELLOW, #$0278|!FS_COLOR_YELLOW, #$0279|!FS_COLOR_YELLOW 122 | ;BOOK 123 | dw #$026A|!FS_COLOR_GREEN, #$026B|!FS_COLOR_GREEN, #$027A|!FS_COLOR_GREEN, #$027B|!FS_COLOR_GREEN 124 | ;BOTTLE 125 | dw #$0280|!FS_COLOR_BW, #$0281|!FS_COLOR_BW, #$0290|!FS_COLOR_BW, #$0291|!FS_COLOR_BW 126 | ;POTION 127 | dw #$0282|!FS_COLOR_GREEN, #$0282|!FS_COLOR_GREEN|!FS_HFLIP, #$0292|!FS_COLOR_GREEN, #$0293|!FS_COLOR_GREEN 128 | ;CANE 129 | dw #$025D|!FS_COLOR_RED, #$025E|!FS_COLOR_RED, #$026D|!FS_COLOR_RED, #$026E|!FS_COLOR_RED 130 | ;CAPE 131 | dw #$0288|!FS_COLOR_RED, #$0289|!FS_COLOR_RED, #$0298|!FS_COLOR_RED, #$0299|!FS_COLOR_RED 132 | ;MIRROR 133 | dw #$028A|!FS_COLOR_BLUE, #$028B|!FS_COLOR_BLUE, #$029A|!FS_COLOR_BLUE, #$029B|!FS_COLOR_BLUE 134 | ;BOOTS 135 | dw #$028C|!FS_COLOR_BOOTS, #$028D|!FS_COLOR_BOOTS, #$029C|!FS_COLOR_BOOTS, #$029D|!FS_COLOR_BOOTS 136 | ;GLOVES 137 | dw #$028E|!FS_COLOR_BROWN, #$028F|!FS_COLOR_BROWN, #$029E|!FS_COLOR_BROWN, #$029F|!FS_COLOR_BROWN 138 | ;FLIPPERS 139 | dw #$024E|!FS_COLOR_BLUE, #$024F|!FS_COLOR_BLUE, #$025F|!FS_COLOR_BLUE|!FS_HFLIP, #$025F|!FS_COLOR_BLUE 140 | ;PEARL 141 | dw #$02A4|!FS_COLOR_RED, #$02A5|!FS_COLOR_RED, #$02B4|!FS_COLOR_RED, #$02B5|!FS_COLOR_RED 142 | ;SHIELD 143 | dw #$02AD|!FS_COLOR_YELLOW, #$02AE|!FS_COLOR_YELLOW, #$02BD|!FS_COLOR_YELLOW, #$02BE|!FS_COLOR_YELLOW 144 | ;TUNIC 145 | dw #$02AF|!FS_COLOR_GREEN, #$02AF|!FS_COLOR_GREEN|!FS_HFLIP, #$02BF|!FS_COLOR_GREEN, #$02BF|!FS_COLOR_GREEN|!FS_HFLIP 146 | ;HEART 147 | dw #$02C1|!FS_COLOR_RED, #$02C1|!FS_COLOR_RED|!FS_HFLIP, #$02D1|!FS_COLOR_RED, #$02D1|!FS_COLOR_RED|!FS_HFLIP 148 | ;MAP 149 | dw #$02C2|!FS_COLOR_YELLOW, #$02C3|!FS_COLOR_YELLOW, #$02D2|!FS_COLOR_YELLOW, #$02D3|!FS_COLOR_YELLOW 150 | ;COMPASS 151 | dw #$02C4|!FS_COLOR_RED, #$02C4|!FS_COLOR_RED|!FS_HFLIP, #$02D4|!FS_COLOR_RED, #$02D4|!FS_COLOR_RED|!FS_HFLIP 152 | ;KEY 153 | dw #$026F|!FS_COLOR_YELLOW|!FS_HFLIP, #$026F|!FS_COLOR_YELLOW, #$027E|!FS_COLOR_YELLOW, #$027F|!FS_COLOR_YELLOW 154 | ;-------------------------------------------------------------------------------- 155 | FileSelect_PlayerSelectText_Top: 156 | ;db $60, $62, $00, $37 157 | dw !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE 158 | dw !FSTILE_BRACKET_OPEN_TOP 159 | dw !FSTILE_SPACE, !FSTILE_C_TOP 160 | dw !FSTILE_O_TOP 161 | dw !FSTILE_D_TOP 162 | dw !FSTILE_E_TOP 163 | dw !FSTILE_SPACE, !FSTILE_SPACE 164 | dw $05A0, $05A1 165 | dw !FSTILE_SPACE, $05A4, $05A5 166 | dw !FSTILE_SPACE, $05A8, $05A9 167 | dw !FSTILE_SPACE, $05AC, $05AD 168 | dw !FSTILE_SPACE, $05B0, $05B1 169 | dw !FSTILE_SPACE 170 | dw !FSTILE_BRACKET_CLOSE_TOP 171 | dw !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE 172 | ;-------------------------------------------------------------------------------- 173 | FileSelect_PlayerSelectText_Bottom: 174 | ;db $60, $82, $00, $37 175 | dw !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE 176 | dw !FSTILE_BRACKET_OPEN_BOTTOM 177 | dw !FSTILE_SPACE, !FSTILE_C_BOTTOM 178 | dw !FSTILE_O_BOTTOM 179 | dw !FSTILE_D_BOTTOM 180 | dw !FSTILE_E_BOTTOM 181 | dw !FSTILE_SPACE, !FSTILE_SPACE 182 | dw $05A2, $05A3 183 | dw !FSTILE_SPACE, $05A6, $05A7 184 | dw !FSTILE_SPACE, $05AA, $05AB 185 | dw !FSTILE_SPACE, $05AE, $05AF 186 | dw !FSTILE_SPACE, $05B2, $05B3 187 | dw !FSTILE_SPACE 188 | dw !FSTILE_BRACKET_CLOSE_BOTTOM 189 | dw !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE 190 | ;-------------------------------------------------------------------------------- 191 | -------------------------------------------------------------------------------- /hashalphabethooks.asm: -------------------------------------------------------------------------------- 1 | ;-------------------------------------------------------------------------------- 2 | !FSTILE_SPACE = $0188 3 | 4 | !FSTILE_BRACKET_OPEN_TOP = $1D8A 5 | !FSTILE_BRACKET_OPEN_BOTTOM = $1D9A 6 | 7 | !FSTILE_BRACKET_CLOSE_TOP = $1D8B 8 | !FSTILE_BRACKET_CLOSE_BOTTOM = $1D9B 9 | 10 | !FSTILE_A_TOP = $1D4A 11 | !FSTILE_A_BOTTOM = $1D5A 12 | 13 | !FSTILE_C_TOP = $1D4C 14 | !FSTILE_C_BOTTOM = $1D5C 15 | 16 | !FSTILE_D_TOP = $1D4D 17 | !FSTILE_D_BOTTOM = $1D5D 18 | 19 | !FSTILE_E_TOP = $1D4E 20 | !FSTILE_E_BOTTOM = $1D5E 21 | 22 | !FSTILE_F_TOP = $1D4F 23 | !FSTILE_F_BOTTOM = $1D5F 24 | 25 | !FSTILE_H_TOP = $1D61 26 | !FSTILE_H_BOTTOM = $1D71 27 | 28 | !FSTILE_I_TOP = $1D62 29 | !FSTILE_I_BOTTOM = $1D72 30 | 31 | !FSTILE_K_TOP = $1D64 32 | !FSTILE_K_BOTTOM = $1D74 33 | 34 | !FSTILE_L_TOP = $1D65 35 | !FSTILE_L_BOTTOM = $1D75 36 | 37 | !FSTILE_N_TOP = $1D67 38 | !FSTILE_N_BOTTOM = $1D77 39 | 40 | !FSTILE_O_TOP = $1D68 41 | !FSTILE_O_BOTTOM = $1D78 42 | 43 | !FSTILE_P_TOP = $1D69 44 | !FSTILE_P_BOTTOM = $1D79 45 | 46 | !FSTILE_S_TOP = $1D6C 47 | !FSTILE_S_BOTTOM = $1D7C 48 | 49 | !FSTILE_T_TOP = $1D6D 50 | !FSTILE_T_BOTTOM = $1D7D 51 | 52 | !FSTILE_U_TOP = $1D6E 53 | !FSTILE_U_BOTTOM = $1D7E 54 | 55 | !FSTILE_Y_TOP = $1D82 56 | !FSTILE_Y_BOTTOM = $1D92 57 | ;-------------------------------------------------------------------------------- 58 | org $8CDE60 ; <- 65E60 59 | FileSelect_CopyFile_Top: 60 | db $62, $A5, $00, $15 61 | dw !FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE 62 | ;-------------------------------------------------------------------------------- 63 | org $8CDE7A ; <- 65E7A 64 | FileSelect_CopyFile_Bottom: 65 | db $62, $C5, $00, $15 66 | dw !FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE 67 | ;-------------------------------------------------------------------------------- 68 | org $8CDE94 ; <- 65E94 69 | FileSelect_KillFile_Top: 70 | db $63, $25, $00, $19 71 | dw !FSTILE_D_TOP, !FSTILE_E_TOP, !FSTILE_L_TOP, !FSTILE_E_TOP, !FSTILE_T_TOP, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_F_TOP, !FSTILE_I_TOP, !FSTILE_L_TOP, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_SPACE 72 | 73 | org $8CDEB2 ; <- 65EB2 74 | FileSelect_KillFile_Bottom: 75 | db $63, $45, $00, $19 76 | dw !FSTILE_D_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_L_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_T_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_F_BOTTOM, !FSTILE_I_BOTTOM, !FSTILE_L_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE 77 | 78 | ;CopyFile_Header: 79 | org $8CE228 ; <- 66228 80 | dw !FSTILE_BRACKET_OPEN_TOP, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_C_TOP, !FSTILE_O_TOP, !FSTILE_P_TOP, !FSTILE_Y_TOP, !FSTILE_SPACE, !FSTILE_F_TOP, !FSTILE_I_TOP, !FSTILE_L_TOP, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_BRACKET_CLOSE_TOP 81 | org $8CE24A ; <- 6624A 82 | dw !FSTILE_BRACKET_OPEN_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_C_BOTTOM, !FSTILE_O_BOTTOM, !FSTILE_P_BOTTOM, !FSTILE_Y_BOTTOM, !FSTILE_SPACE, !FSTILE_F_BOTTOM, !FSTILE_I_BOTTOM, !FSTILE_L_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_BRACKET_CLOSE_BOTTOM 83 | 84 | ;CopyFile_Which: 85 | org $8CE2DB ; <- 662DB 86 | dw $0D80, $0D61, $0D62, $0D4C, $0D61, $0D86, !FSTILE_SPACE 87 | org $8CE2ED ; <- 662ED 88 | dw $0D90, $0D71, $0D72, $0D5C, $0D71, $0D96, !FSTILE_SPACE 89 | 90 | ;CopyFile_Where: 91 | org $8CE39C ; <- 6639C 92 | dw $0D80, $0D61, $0D4E, $0D6B, $0D4E, $0D86, !FSTILE_SPACE 93 | org $8CE3AE ; <- 663AE 94 | dw $0D90, $0D71, $0D5E, $0D7B, $0D5E, $0D96, !FSTILE_SPACE 95 | 96 | ;CopyFile_Execute: 97 | org $8CD13A ; <- 6513A 98 | dw !FSTILE_C_TOP, !FSTILE_SPACE, !FSTILE_O_TOP, !FSTILE_SPACE, !FSTILE_P_TOP, !FSTILE_SPACE, !FSTILE_Y_TOP, !FSTILE_SPACE, !FSTILE_SPACE 99 | org $8CD150 ; <- 65150 100 | dw !FSTILE_C_BOTTOM, !FSTILE_SPACE, !FSTILE_O_BOTTOM, !FSTILE_SPACE, !FSTILE_P_BOTTOM, !FSTILE_SPACE, !FSTILE_Y_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE 101 | 102 | ;CopyFile_Cancel: 103 | org $8CE29A ; <- 6629A 104 | dw !FSTILE_C_TOP, !FSTILE_SPACE, !FSTILE_A_TOP, !FSTILE_SPACE, !FSTILE_N_TOP, !FSTILE_SPACE, !FSTILE_C_TOP, !FSTILE_SPACE, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_L_TOP, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE 105 | org $8CE2BA ; <- 662BA 106 | dw !FSTILE_C_BOTTOM, !FSTILE_SPACE, !FSTILE_A_BOTTOM, !FSTILE_SPACE, !FSTILE_N_BOTTOM, !FSTILE_SPACE, !FSTILE_C_BOTTOM, !FSTILE_SPACE, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_L_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE 107 | 108 | ;KillFile_Header: 109 | org $8CE002 ; <- 66002 110 | dw !FSTILE_BRACKET_OPEN_TOP, !FSTILE_SPACE, !FSTILE_D_TOP, !FSTILE_E_TOP, !FSTILE_L_TOP, !FSTILE_E_TOP, !FSTILE_T_TOP, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_F_TOP, !FSTILE_I_TOP, !FSTILE_L_TOP, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_BRACKET_CLOSE_TOP, !FSTILE_SPACE, !FSTILE_SPACE 111 | org $8CE028 ; <- 66028 112 | dw !FSTILE_BRACKET_OPEN_BOTTOM, !FSTILE_SPACE, !FSTILE_D_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_L_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_T_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_F_BOTTOM, !FSTILE_I_BOTTOM, !FSTILE_L_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_BRACKET_CLOSE_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE 113 | 114 | ;KillFile_Which: 115 | org $8CE04E ; <- 6604E 116 | dw !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE 117 | org $8CE084 ; <- 66084 118 | dw !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE 119 | 120 | ;KillFile_Execute: 121 | org $8CD328 ; <- 65328 122 | dw !FSTILE_D_TOP, !FSTILE_E_TOP, !FSTILE_L_TOP, !FSTILE_E_TOP, !FSTILE_T_TOP, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE 123 | org $8CD344 ; <- 65344 124 | dw !FSTILE_D_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_L_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_T_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE 125 | 126 | ;KillFile_Cancel: 127 | org $8CE0BA ; <- 660BA 128 | dw !FSTILE_C_TOP, !FSTILE_A_TOP, !FSTILE_N_TOP, !FSTILE_C_TOP, !FSTILE_E_TOP, !FSTILE_L_TOP, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE 129 | org $8CE0DA ; <- 660DA 130 | dw !FSTILE_C_BOTTOM, !FSTILE_A_BOTTOM, !FSTILE_N_BOTTOM, !FSTILE_C_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_L_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE 131 | -------------------------------------------------------------------------------- /heartbeep.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Heart Beep Logic 3 | ;================================================================================ 4 | BeepLogic: 5 | LDA.l HeartBeep : BEQ + 6 | STA.w HeartBeepTimer 7 | LDA.b #$2B : STA.w SFX2 8 | RTL 9 | + 10 | LDA.b #$FF : STA.w HeartBeepTimer 11 | RTL 12 | ;================================================================================ 13 | -------------------------------------------------------------------------------- /hud.asm: -------------------------------------------------------------------------------- 1 | ;org $8DFE97 ; <- 6FE97 - headsup_display.asm:1009 (.hud_tilemap) 2 | ; DO NOT EXCEED 0x150 3 | HUD_TileMap: 4 | dw $207F, $207F, $2850, $A856 5 | dw $2852, $285B, $285B, $285C 6 | ;dw $207F, $3CA8, $207F, $207F, $207F 7 | dw $207F, $3C02, $3C03, $207F, $207F ; normal mode 8 | ;dw $3C02, $3C03, $207F, $207F, $207F ; rupee arrows 9 | dw $2C88, $2C89, $207F, $20A7 10 | dw $20A9, $207F, $2871 ;, $207F 11 | dw $207F, $207F, $288B, $288F 12 | dw $24AB, $24AC, $688F, $688B 13 | dw $207F, $207F, $207F, $207F 14 | dw $207F, $207F, $2854, $2871 15 | dw $2858, $207F, $207F, $285D 16 | dw $207F, $207F, $207F, $207F 17 | dw $207F, $207F, $207F, $207F 18 | dw $207F, $207F, $207F, $207F 19 | dw $207F, $207F, $207F, $207F 20 | dw $207F, $207F, $207F, $207F 21 | dw $207F, $207F, $207F, $207F 22 | dw $207F, $207F, $2854, $304E 23 | dw $2858, $207F, $207F, $285D 24 | dw $207F, $207F, $207F, $207F 25 | dw $207F, $207F, $207F, $207F 26 | dw $207F, $207F, $207F, $207F 27 | dw $207F, $207F, $207F, $207F 28 | dw $207F, $207F, $207F, $207F 29 | dw $207F, $207F, $207F, $207F 30 | dw $207F, $207F, $2854, $305E 31 | dw $2859, $A85B, $A85B, $A85C 32 | dw $207F, $207F, $207F, $207F 33 | dw $207F, $207F, $207F, $207F 34 | dw $207F, $207F, $207F, $207F 35 | dw $207F, $207F, $207F, $207F 36 | dw $207F, $207F, $207F, $207F 37 | dw $207F, $207F, $207F, $207F 38 | dw $207F, $207F, $2854, $305E 39 | dw $6854, $207F, $207F, $207F 40 | dw $207F, $207F, $207F, $207F 41 | dw $207F, $207F, $207F, $207F 42 | dw $207F, $207F, $207F, $207F 43 | dw $207F, $207F, $207F, $207F 44 | dw $207F, $207F, $207F, $207F 45 | dw $207F, $207F, $207F, $207F 46 | dw $207F, $207F, $A850, $2856 47 | dw $E850 48 | -------------------------------------------------------------------------------- /hudtext.asm: -------------------------------------------------------------------------------- 1 | clearTable: 2 | dw $007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F,$007F 3 | 4 | 5 | WriteText: 6 | { 7 | PHP 8 | ; $7EC025 = Timer 9 | ; $7EC026 = When we find an empty item get set on 1 10 | ; $7EC027 = character data 11 | 12 | LDX.b #$80 : STX.w INIDISP 13 | REP #$20 14 | LDA.w #$6000+$0340 : STA.w VMADDL 15 | 16 | LDA.w #$C027 : STA.w A1T4L 17 | LDX.b #$7E : STX.w A1B4 18 | LDA.w #$0040 : STA.w DAS4L 19 | LDA.w #$1801 : STA.w DMAP4 20 | LDX.b #$10 : STX.w MDMAEN 21 | 22 | LDX.b #$0F : STX.w INIDISP 23 | PLP 24 | RTL 25 | } 26 | 27 | 28 | ClearBG: 29 | { 30 | PHP 31 | LDX.b #$80 : STX.w INIDISP 32 | REP #$20 33 | LDA.w #$6000+$0340 : STA.w VMADDL 34 | LDA.w #clearTable : STA.w A1T4L 35 | LDX.b #clearTable>>16 : STX.w A1B4 36 | 37 | LDA.w #$0040 : STA.w DAS4L 38 | LDA.w #$1801 : STA.w DMAP4 39 | LDX.b #$10 : STX.w MDMAEN 40 | 41 | LDX.b #$0F : STX.w INIDISP 42 | PLP 43 | RTL 44 | } 45 | -------------------------------------------------------------------------------- /icepalacegraphics.asm: -------------------------------------------------------------------------------- 1 | ShouldOverrideFileLoad: 2 | ; Y = Graphics file being loaded 3 | CPY #$0A ; 0A = Ice/Mire floor file 4 | BNE .no 5 | 6 | LDA.w DungeonID ; Dungeon number 7 | CMP.b #$12 ; Ice Palace 8 | BEQ .yes 9 | .no 10 | CLC : RTS 11 | .yes 12 | RTS 13 | 14 | BgGraphicsLoading: 15 | ; Instructions overwritten 16 | STZ.b Scrap00 17 | STX.b Scrap01 18 | STA.b Scrap02 19 | 20 | JSR ShouldOverrideFileLoad 21 | BCS .useSpecialIcePalaceFile 22 | JML BgGraphicsLoadingResume 23 | 24 | .useSpecialIcePalaceFile 25 | ; We're loading the floor tiles in Ice Palace. Instead of the normal file, 26 | ; load another one that replaces the bridge tiles with the Bombos medallion 27 | 28 | LDA.b #IcePalaceFloorGfx>>16 29 | STA.b Scrap02 30 | REP #$20 31 | LDA.w #IcePalaceFloorGfx 32 | STA.b Scrap00 33 | LDX.b #64*2 ; Tiles to load * 2 34 | - 35 | ; Unrolled loop to upload half a tile 36 | LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00 37 | LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00 38 | LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00 39 | LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00 40 | LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00 41 | LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00 42 | LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00 43 | LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00 44 | DEX 45 | BNE - 46 | 47 | SEP #$20 48 | JML BgGraphicsLoadingCancel 49 | 50 | ReloadingFloors: 51 | SEP #$30 ; 8 AXY 52 | LDA.l LastBGSet ; Floor file that has been decompressed 53 | TAY 54 | JSR ShouldOverrideFileLoad 55 | REP #$30 ; 16 AXY 56 | BCS .replaceWithSpecialIcePalaceFile 57 | 58 | ; Instructions overwritten by hook 59 | LDX.w #$0000 60 | LDY.w #$0040 61 | 62 | JML ReloadingFloorsResume 63 | 64 | .replaceWithSpecialIcePalaceFile 65 | ; Block move our hardcoded graphics into the output buffer 66 | LDX.w #IcePalaceFloorGfx ; Source 67 | LDY.w #$0000 ; Target 68 | LDA.w #$0800 ; Length 69 | PHB 70 | ;MVN $7F, IcePalaceFloorGfx>>16 71 | MVN $B17F ; CHANGE THIS IF YOU MOVE THE GRAPHICS FILE - kkat 72 | PLB 73 | 74 | ; Pretend that we ran the original routine 75 | LDX.w #$0800 76 | LDA.w #$6600 77 | STA.b Scrap03 78 | 79 | JML ReloadingFloorsCancel 80 | -------------------------------------------------------------------------------- /init.asm: -------------------------------------------------------------------------------- 1 | ;-------------------------------------------------------------------------------- 2 | ; Init_Primary 3 | ;-------------------------------------------------------------------------------- 4 | ; This can be as inefficient as we want. Interrupts are off when this gets 5 | ; called and it only gets called once ever during RESET. 6 | ;-------------------------------------------------------------------------------- 7 | Init_Primary: 8 | LDA.b #$00 9 | LDX.b #$14 10 | - 11 | LDA.l RomNameSRAM, X : CMP.w $FFC0, X : BNE .clear 12 | DEX 13 | BPL - 14 | REP #$30 15 | LDX.w #$00D9 ; initalize our ram 16 | - 17 | STA.l $7EC025, X 18 | DEX #2 19 | BPL - 20 | LDA.w #$0000 21 | LDX.w #$2FFE 22 | - 23 | STA.l $7F5000, X 24 | DEX #2 25 | BPL - 26 | 27 | BRA .done 28 | .clear 29 | REP #$30 30 | LDA.w #$0000 31 | LDX.w #$1FFE 32 | - 33 | STA.l CartridgeSRAM, X 34 | STA.l SaveBackupSRAM, X 35 | DEX #2 36 | BPL - 37 | LDA.w RomVersion+$00 : STA.l RomVersionSRAM+$00 38 | LDA.w RomVersion+$02 : STA.l RomVersionSRAM+$02 39 | SEP #$30 40 | LDX.b #$14 41 | - 42 | LDA.w $FFC0, X : STA.l RomNameSRAM, X 43 | DEX 44 | BPL - 45 | .done 46 | 47 | REP #$20 48 | LDA.l OneMindTimerInit : STA.l OneMindTimerRAM 49 | SEP #$30 50 | 51 | LDA.l RomSpeed : STA.w MEMSEL ; enable fastrom access on upper banks 52 | LDA.b #$01 : STA.l OneMindId 53 | 54 | LDA.b #$10 : STA.b PlayerSpriteBank ; set default player sprite bank 55 | LDA.b #$81 : STA.w NMITIMEN ; thing we wrote over, turn on NMI & gamepad 56 | LDA.b #(ReturnFromInit>>16)|$80 : PHA : PLB 57 | 58 | JML ReturnFromInit 59 | 60 | 61 | ;-------------------------------------------------------------------------------- 62 | ; Init_PostRAMClear 63 | ;-------------------------------------------------------------------------------- 64 | ; This gets called after banks $7E and $7F get cleared, so if we need to 65 | ; initialize RAM in those banks, do it here 66 | ;-------------------------------------------------------------------------------- 67 | Init_PostRAMClear: 68 | 69 | JSL MSUInit 70 | JSL InitRNGPointerTable 71 | JSL DecompressAllItemGraphics 72 | JSR InitDungeonCounts 73 | 74 | JML $80D463 ; The original target of the jump table that we hijacked 75 | 76 | ;=================================================================================================== 77 | InitDungeonCounts: 78 | PHB 79 | LDX.b #$0F 80 | - 81 | LDA.l CompassTotalsROM, X : STA.l CompassTotalsWRAM, X 82 | DEX 83 | BPL - 84 | LDX.b #$0F 85 | - 86 | LDA.l ChestKeys, X : STA.l MapTotalsWRAM, X 87 | DEX 88 | BPL - 89 | 90 | LDA.b #$7E 91 | PHA : PLB 92 | REP #$30 93 | LDA.l TotalItemCount 94 | JSL.l HUDHex4Digit_Long 95 | SEP #$20 96 | LDA.b Scrap04 : TAX : STX.w TotalItemCountTiles+$00 97 | LDA.b Scrap05 : TAX : STX.w TotalItemCountTiles+$02 98 | LDA.b Scrap06 : TAX : STX.w TotalItemCountTiles+$04 99 | LDA.b Scrap07 : TAX : STX.w TotalItemCountTiles+$06 100 | SEP #$10 101 | PLB 102 | RTS 103 | -------------------------------------------------------------------------------- /invertedstatic.asm: -------------------------------------------------------------------------------- 1 | ;Statically mapped at $A1A000 Referenced by the front end. Do not move without coordination. 2 | InvertedTileAttributeLookup: 3 | SEP #$20 4 | LDA.b OverworldIndex : CMP.b #$47 : BEQ .turtleRock 5 | LDA.l Overworld_TileAttr, X 6 | JML.l Overworld_GetTileAttrAtLocation_continue 7 | .turtleRock 8 | LDA.l Inverted_TR_TileAttributes, X 9 | JML.l Overworld_GetTileAttrAtLocation_continue 10 | -------------------------------------------------------------------------------- /itemdowngrade.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Item Downgrade Fix 3 | ;-------------------------------------------------------------------------------- 4 | ItemDowngradeFix: 5 | JSL.l AddInventory 6 | BMI .dontWrite ; thing we wrote over part 1 7 | 8 | CPY.b #$1B : BEQ .isPowerGloves ; Power Gloves 9 | CPY.b #$05 : BEQ .isRedShield ; Red Shield 10 | CPY.b #$04 : BEQ .isBlueShield ; Blue Shield 11 | CPY.b #$0C : BEQ .isBlueBoomerang ; Blue Boomerang 12 | CPY.b #$0B : BEQ .isBow ; Bow 13 | CPY.b #$3A : BEQ .isBowAndArrows ; Bow 14 | 15 | CPY.b #$49 : BEQ .isSword ; Fighter's Sword 16 | CPY.b #$01 : BEQ .isSword ; Master Sword 17 | CPY.b #$50 : BEQ .isSword ; Master Sword (Safe) 18 | CPY.b #$02 : BEQ .isSword ; Tempered Sword 19 | 20 | CPY.b #$3B : BEQ .isSilverArrowBow ; Silver Arrow Bow 21 | CPY.b #$2A : BEQ .isRedBoomerang ; Red Boomerang 22 | CPY.b #$0D : BEQ .isMagicPowder ; Magic Powder 23 | CPY.b #$14 : BEQ .isFlute ; Flute 24 | CPY.b #$13 : BEQ .isShovel ; Shovel 25 | CPY.b #$29 : BEQ .isMushroom ; Mushroom 26 | 27 | CPY.b #$00 : BEQ .isUncleSwordShield ; Fighter's Sword & Shield 28 | 29 | .done 30 | STA.b [Scrap00] ; thing we wrote over part 2 31 | .dontWrite 32 | RTL 33 | .isPowerGloves 34 | .isBlueShield 35 | .isRedShield 36 | .isBlueBoomerang 37 | .isBow 38 | .isBowAndArrows 39 | CMP.b [$00] : !BGE .done ; finished if we're upgrading 40 | LDA.b [$00] ; reload old value 41 | RTL 42 | .isSilverArrowBow 43 | .isRedBoomerang 44 | .isMagicPowder 45 | .isFlute 46 | .isShovel 47 | .isMushroom 48 | PHA 49 | LDA.b [Scrap00] : BNE + ; don't upgrade if we already have the toggle for it 50 | PLA 51 | STA.b [Scrap00] 52 | RTL 53 | + 54 | PLA 55 | RTL 56 | .isSword 57 | PHA 58 | LDA.l HighestSword : STA.b Scrap04 59 | TYA ; load sword item 60 | CMP.b #$49 : BNE + : LDA.b #$00 : + ; convert extra fighter's sword to normal one 61 | CMP.b #$50 : BNE + : LDA.b #$01 : + ; convert extra master sword to normal one 62 | INC : CMP.b Scrap04 : !BGE + ; skip if highest is lower (this is an upgrade) 63 | LDA.b Scrap04 : DEC ; convert to item id 64 | TAY : PLA : LDA.b Scrap04 ; put sword id into the thing to write 65 | JMP .done 66 | + 67 | PLA 68 | JMP .done 69 | .isUncleSwordShield 70 | PHA 71 | LDA.l HighestSword : STA.b [Scrap00] ; already set to 1 if we had no sword, always keep highest 72 | INC.b Scrap00 73 | LDA.l HighestShield : STA.b [Scrap00] 74 | PLA 75 | RTL 76 | ;================================================================================ 77 | -------------------------------------------------------------------------------- /itemtext.asm: -------------------------------------------------------------------------------- 1 | table "data/textwordcharmap.txt" 2 | 3 | org $B28000 4 | ; You have found 5 | ; the map of 6 | Notice_MapOf: 7 | db $74 : dw "You have found" 8 | db $75 : dw "the map of" 9 | dw $7F7F 10 | 11 | ; You have found 12 | ; the compass of 13 | Notice_CompassOf: 14 | db $74 : dw "You have found" 15 | db $75 : dw "the compass of" 16 | dw $7F7F 17 | 18 | ; Oh look! it's 19 | ; the big key of 20 | Notice_BigKeyOf: 21 | db $74 : dw "Oh look! it's" 22 | db $75 : dw "the big key of" 23 | dw $7F7F 24 | 25 | ; This is a 26 | ; small key to 27 | Notice_SmallKeyOf: 28 | db $74 : dw "This is a" 29 | db $75 : dw "small key to" 30 | dw $7F7F 31 | 32 | ; You picked up 33 | Notice_Crystal: 34 | db $74 : dw "You picked up" 35 | dw $7F7F 36 | 37 | ; Light World 38 | Notice_LightWorld: 39 | db $76 : dw "Light World" 40 | dw $7F7F 41 | 42 | ; Dark World 43 | Notice_DarkWorld: 44 | db $76 : dw "Dark World" 45 | dw $7F7F 46 | 47 | ; Ganons Tower 48 | Notice_GTower: 49 | db $76 : dw "Ganons Tower" 50 | dw $7F7F 51 | 52 | ; Turtle Rock 53 | Notice_TRock: 54 | db $76 : dw "Turtle Rock" 55 | dw $7F7F 56 | 57 | ; Thieves Town 58 | Notice_Thieves: 59 | db $76 : dw "Thieves Town" 60 | dw $7F7F 61 | 62 | ; Tower of Hera 63 | Notice_Hera: 64 | db $76 : dw "Tower of Hera" 65 | dw $7F7F 66 | 67 | ; Ice Palace 68 | Notice_Ice: 69 | db $76 : dw "Ice Palace" 70 | dw $7F7F 71 | 72 | ; Skull Woods 73 | Notice_Skull: 74 | db $76 : dw "Skull Woods" 75 | dw $7F7F 76 | 77 | ; Misery Mire 78 | Notice_Mire: 79 | db $76 : dw "Misery Mire" 80 | dw $7F7F 81 | 82 | ; Dark Palace 83 | Notice_PoD: 84 | db $76 : dw "Dark Palace" 85 | dw $7F7F 86 | 87 | ; Swamp Palace 88 | Notice_Swamp: 89 | db $76 : dw "Swamp Palace" 90 | dw $7F7F 91 | 92 | ; Castle Tower 93 | Notice_AgaTower: 94 | db $76 : dw "Castle Tower" 95 | dw $7F7F 96 | 97 | ; Desert Palace 98 | Notice_Desert: 99 | db $76 : dw "Desert Palace" 100 | dw $7F7F 101 | 102 | ; Eastern Palace 103 | Notice_Eastern: 104 | db $76 : dw "Eastern Palace" 105 | dw $7F7F 106 | 107 | ; Hyrule Castle 108 | Notice_Castle: 109 | db $76 : dw "Hyrule Castle" 110 | dw $7F7F 111 | 112 | ; Hyrule Castle 113 | Notice_Sewers: 114 | db $76 : dw "Hyrule Castle" 115 | dw $7F7F 116 | 117 | ; This Dungeon 118 | Notice_Self: 119 | db $76 : dw "this dungeon" 120 | dw $7F7F 121 | 122 | ; Crystal numbers 123 | Notice_One: 124 | db $75 : dw "crystal one" 125 | dw $7F7F 126 | 127 | Notice_Two: 128 | db $75 : dw "crystal two" 129 | dw $7F7F 130 | 131 | Notice_Three: 132 | db $75 : dw "crystal three" 133 | dw $7F7F 134 | 135 | Notice_Four: 136 | db $75 : dw "crystal four" 137 | dw $7F7F 138 | 139 | Notice_Five: 140 | db $75 : dw "crystal five" 141 | dw $7F7F 142 | 143 | Notice_Six: 144 | db $75 : dw "crystal six" 145 | dw $7F7F 146 | 147 | Notice_Seven: 148 | db $75 : dw "crystal seven" 149 | dw $7F7F 150 | -------------------------------------------------------------------------------- /lampmantlecone.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Lamp Mantle & Light Cone Fix 3 | ;-------------------------------------------------------------------------------- 4 | ; Output: 0 for darkness, 1 for lamp cone 5 | ;-------------------------------------------------------------------------------- 6 | LampCheck: 7 | LDA.l LightConeModifier : CMP.b #$01 : BNE + : RTL : + 8 | CMP.b #$FF : BNE + : INC : RTL : + 9 | LDA.l LampEquipment : BNE .lamp ; skip if we already have lantern 10 | LDA.w DungeonID : BNE + ; check if we're in sewers 11 | LDA.l LampConeSewers : RTL 12 | + : TDC 13 | .lamp 14 | RTL 15 | ;================================================================================ 16 | ;-------------------------------------------------------------------------------- 17 | ; Output: 0 locked, 1 open 18 | ;-------------------------------------------------------------------------------- 19 | CheckForZelda: 20 | LDA.l ProgressIndicator : CMP.b #$02 : !BLT + ; Skip if rain is falling 21 | LDA.b #$01 ; pretend we have zelda anyway 22 | RTL 23 | + 24 | LDA.l FollowerIndicator 25 | RTL 26 | ;================================================================================ 27 | SetOverlayIfLamp: 28 | JSL.l LampCheck 29 | STA.b SUBDESQ ; write it directly to the overlay, this isn't a terrible idea at all 30 | RTL 31 | ;================================================================================ 32 | ; Mantle Object Changes 33 | ;-------------------------------------------------------------------------------- 34 | Mantle_CorrectPosition: 35 | LDA.l ProgressFlags : AND.b #$04 : BEQ + 36 | LDA.b #$0A : STA.w SpritePosXLow, X ; just spawn it off to the side where we know it should be 37 | LDA.b #$03 : STA.w SpritePosXHigh, X 38 | LDA.b #$90 : STA.w SpriteSpawnStep, X 39 | + 40 | LDA.w SpritePosYLow, X : !ADD.b #$03 ; thing we did originally 41 | RTL 42 | ;-------------------------------------------------------------------------------- 43 | -------------------------------------------------------------------------------- /license.txt: -------------------------------------------------------------------------------- 1 | Copyright 2016, 2017 Equilateral IT 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /maidencrystals.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Maiden Crystal Fixes 3 | ;================================================================================ 4 | 5 | ;-------------------------------------------------------------------------------- 6 | ; MaidenCrystalScript 7 | ;-------------------------------------------------------------------------------- 8 | MaidenCrystalScript: 9 | LDA.b #$00 : STA.l BusyItem 10 | STZ.w ItemReceiptID 11 | STZ.w ItemReceiptPose 12 | STZ.b LinkAnimationStep 13 | LDA.b #$02 : STA.w LinkDirection 14 | LDA.l CrystalsField : AND.b #$7F : CMP.b #$7F : BNE + ; check if we have all crystals 15 | LDA.b #$08 : STA.l MapIcons ; Update the map icon to just be Ganon's Tower 16 | + 17 | JML.l $9ECF35 ; <- F4F35 - sprite_crystal_maiden.asm : 426 18 | ;-------------------------------------------------------------------------------- 19 | -------------------------------------------------------------------------------- /medallions.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Medallion Changes & Fixes 3 | ;-------------------------------------------------------------------------------- 4 | TryOpenMire: 5 | ; Checks if we're in the Swamp of Evil. 6 | LDA.b OverworldIndex : CMP.b #$70 : BNE .untriggered 7 | 8 | ; Checks whether the Misery Mire dungeon is already revealed. 9 | LDA.l OverworldEventDataWRAM+$70 : AND.b #$20 : BNE .untriggered 10 | 11 | ; You have to be in the trigger window. 12 | LDY.b #$02 : JSL.l Ancilla_CheckIfEntranceTriggered : BCC .untriggered 13 | 14 | ; Do the 3rd animation for opening entrances 15 | LDA.b #$03 : STA.w OWEntranceCutscene 16 | 17 | STZ.b SubSubModule ; reset the sub-submodule index 18 | STZ.b ScrapBufferBD+$0B ; reset this other index. 19 | 20 | .untriggered 21 | RTL 22 | ;-------------------------------------------------------------------------------- 23 | TryOpenTRock: 24 | ; Checks if we're at Turtle Rock. 25 | LDA.b OverworldIndex : CMP.b #$47 : BNE .untriggered 26 | 27 | ; Checks whether the Turtle Rock dungeon is already revealed. 28 | LDA.l OverworldEventDataWRAM+$47 : AND.b #$20 : BNE .untriggered 29 | 30 | ; You have to be in the trigger window. 31 | LDY.b #$03 : JSL.l Ancilla_CheckIfEntranceTriggered : BCC .untriggered 32 | 33 | ; Do the 4rd animation for opening entrances 34 | LDA.b #$04 : STA.w OWEntranceCutscene 35 | 36 | STZ.b SubSubModule ; reset the sub-submodule index 37 | STZ.b ScrapBufferBD+$0B ; reset this other index. 38 | 39 | .untriggered 40 | RTL 41 | ;-------------------------------------------------------------------------------- 42 | MedallionTrigger_Bombos: 43 | STZ.b Strafe ; stuff we wrote over 44 | STZ.w FreezeSprites 45 | 46 | PHA 47 | LDA.l MireRequiredMedallion : BNE + 48 | JSL.l TryOpenMire 49 | + LDA.l TRockRequiredMedallion : BNE + 50 | JSL.l TryOpenTRock 51 | + 52 | PLA 53 | RTL 54 | ;-------------------------------------------------------------------------------- 55 | MedallionTrigger_Ether: 56 | PHA 57 | LDA.l MireRequiredMedallion : CMP.b #$01 : BNE + 58 | JSL.l TryOpenMire 59 | + LDA.l TRockRequiredMedallion : CMP.b #$01 : BNE + 60 | JSL.l TryOpenTRock 61 | + 62 | PLA 63 | RTL 64 | ;-------------------------------------------------------------------------------- 65 | MedallionTrigger_Quake: 66 | PHA 67 | LDA.l MireRequiredMedallion : CMP.b #$02 : BNE + 68 | JSL.l TryOpenMire 69 | + LDA.l TRockRequiredMedallion : CMP.b #$02 : BNE + 70 | JSL.l TryOpenTRock 71 | + 72 | PLA 73 | RTL 74 | ;-------------------------------------------------------------------------------- 75 | -------------------------------------------------------------------------------- /npcitems.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Randomize NPC Items 3 | ;-------------------------------------------------------------------------------- 4 | ; Old Man - Zora King - Sick Kid - Tree Kid - Sahasrala - Catfish - Rupee NPC 5 | ;=SET 1 6 | ;OLD_MAN = "#$01" 7 | ;ZORA_KING = "#$02" 8 | ;SICK_KID = "#$04" 9 | ;TREE_KID = "#$08" 10 | ;SAHASRALA = "#$10" 11 | ;CATFISH = "#$20" 12 | ;UNUSED = "#$40" 13 | ;BOOK_MUDORA = "#$80" 14 | ;=SET 2 15 | ;ETHER_TABLET = "#$01" 16 | ;BOMBOS_TABLET = "#$02" 17 | ;SMITH_SWORD = "#$04" 18 | ;FAIRY_SWORD = "#$08" 19 | ;MUSHROOM = "#$10" 20 | ;POWDER = "#$20" 21 | ;UNUSED = "#$40" 22 | ;MAGIC_BAT = "#$80" 23 | ;-------------------------------------------------------------------------------- 24 | 25 | ItemCheck_FairySword: 26 | LDA.l NpcFlags+1 : AND.b #$08 27 | RTL 28 | 29 | ItemCheck_SmithSword: 30 | LDA.l NpcFlags+1 : AND.b #$04 31 | RTL 32 | 33 | ItemCheck_MagicBat: 34 | LDA.l NpcFlags+1 : AND.b #$80 35 | RTL 36 | 37 | ItemCheck_OldMan: 38 | LDA.l NpcFlags : AND.b #$01 : CMP.b #$01 39 | RTL 40 | 41 | ItemCheck_ZoraKing: 42 | LDA.l NpcFlags : AND.b #$02 43 | RTL 44 | 45 | ItemCheck_SickKid: 46 | LDA.l NpcFlags : AND.b #$04 47 | RTL 48 | 49 | ItemCheck_TreeKid: 50 | LDA.l NpcFlags : AND.b #$08 51 | RTL 52 | 53 | ItemCheck_TreeKid2: 54 | LDA.l NpcFlags : AND.b #$08 55 | LSR #2 56 | RTL 57 | 58 | ItemCheck_TreeKid3: 59 | JSL $8DD030 ; FluteAardvark_Draw - thing we wrote over 60 | LDA.l NpcFlags : AND.b #$08 61 | BNE .done 62 | LDA.b #$05 63 | .normal 64 | LDA.w SpriteActivity, X 65 | .done 66 | RTL 67 | 68 | ItemCheck_Sahasrala: 69 | LDA.l NpcFlags : AND.b #$10 70 | RTL 71 | 72 | ItemCheck_Library: 73 | LDA.l NpcFlags : AND.b #$80 74 | RTL 75 | 76 | ItemCheck_Mushroom: 77 | LDA.l NpcFlags+1 : AND.b #$10 : CMP.b #$10 ; does the same thing as below 78 | RTL 79 | 80 | ItemCheck_Powder: 81 | LDA.l NpcFlags+1 : AND.b #$20 82 | RTL 83 | 84 | ItemCheck_Catfish: 85 | LDA.l NpcFlags : AND.b #$20 86 | RTL 87 | ;-------------------------------------------------------------------------------- 88 | ItemSet_FairySword: 89 | PHA : LDA.l NpcFlags+1 : ORA.b #$08 : STA.l NpcFlags+1 : PLA 90 | RTL 91 | 92 | ItemSet_SmithSword: 93 | PHA : LDA.l NpcFlags+1 : ORA.b #$04 : STA.l NpcFlags+1 : PLA 94 | RTL 95 | 96 | ItemSet_MagicBat: 97 | PHA : LDA.l NpcFlags+1 : ORA.b #$80 : STA.l NpcFlags+1 : PLA 98 | RTL 99 | 100 | ItemSet_OldMan: 101 | JSL.l Link_ReceiveItem ; thing we wrote over 102 | PHA : LDA.l NpcFlags : ORA.b #$01 : STA.l NpcFlags : PLA 103 | RTL 104 | 105 | ItemSet_ZoraKing: 106 | PHA : LDA.l NpcFlags : ORA.b #$02 : STA.l NpcFlags : PLA 107 | RTL 108 | 109 | ItemSet_SickKid: 110 | JSL.l Link_ReceiveItem ; thing we wrote over 111 | PHA : LDA.l NpcFlags : ORA.b #$04 : STA.l NpcFlags : PLA 112 | RTL 113 | 114 | ItemSet_TreeKid: 115 | JSL.l Link_ReceiveItem ; thing we wrote over 116 | PHA : LDA.l NpcFlags : ORA.b #$08 : STA.l NpcFlags : PLA 117 | RTL 118 | 119 | ItemSet_Sahasrala: 120 | JSL.l Link_ReceiveItem ; thing we wrote over 121 | PHA : LDA.l NpcFlags : ORA.b #$10 : STA.l NpcFlags : PLA 122 | RTL 123 | 124 | ItemSet_Catfish: 125 | PHA : LDA.l NpcFlags : ORA.b #$20 : STA.l NpcFlags : PLA 126 | RTL 127 | 128 | ItemSet_Library: 129 | JSL.l Link_ReceiveItem ; thing we wrote over 130 | PHA : LDA.l NpcFlags : ORA.b #$80 : STA.l NpcFlags : PLA 131 | RTL 132 | 133 | ItemSet_Mushroom: 134 | PHA 135 | LDA.l NpcFlags+1 : ORA.b #$10 : STA.l NpcFlags+1 136 | LDY.w SpriteID, X ; Retrieve stored item type 137 | BNE + 138 | ; if for any reason the item value is 0 reload it, just in case 139 | %GetPossiblyEncryptedItem(MushroomItem, SpriteItemValues) : TAY 140 | + 141 | PLA 142 | STZ.w ItemReceiptMethod ; thing we wrote over - the mushroom is an npc for item purposes apparently 143 | RTL 144 | 145 | ItemSet_Powder: 146 | PHA : LDA.l NpcFlags+1 : ORA.b #$20 : STA.l NpcFlags+1 : PLA 147 | RTL 148 | ;================================================================================ 149 | 150 | ;================================================================================ 151 | ; Randomize 300 Rupee NPC 152 | ;-------------------------------------------------------------------------------- 153 | Set300RupeeNPCItem: 154 | INC.w SpriteActivity, X ; thing we wrote over 155 | 156 | PHA : PHP 157 | REP #$20 ; set 16-bit accumulator 158 | LDA.b RoomIndex ; these are all decimal because i got them that way 159 | CMP.w #291 : BNE + 160 | %GetPossiblyEncryptedItem(RupeeNPC_MoldormCave, SpriteItemValues) 161 | TAY ; load moldorm cave value into Y 162 | BRA .done 163 | + CMP.w #286 : BNE + 164 | %GetPossiblyEncryptedItem(RupeeNPC_NortheastDarkSwampCave, SpriteItemValues) 165 | TAY ; load northeast dark swamp cave value into Y 166 | BRA .done 167 | + 168 | LDY.b #$46 ; default to a normal 300 rupees 169 | .done 170 | PLP : PLA 171 | RTL 172 | 173 | ;================================================================================ 174 | ; Randomize Zora King 175 | ;-------------------------------------------------------------------------------- 176 | LoadZoraKingItemGFX: 177 | LDA.l $9DE1C3 ; location randomizer writes zora item to 178 | JSL.l AttemptItemSubstitution 179 | JSL.l ResolveLootIDLong 180 | STA.w SpriteID,Y 181 | TYX 182 | JML.l PrepDynamicTile_loot_resolved 183 | ;-------------------------------------------------------------------------------- 184 | JumpToSplashItemTarget: 185 | LDA.w SpriteMovement, X 186 | CMP.b #$FF : BNE + : JML.l SplashItem_SpawnSplash : + 187 | CMP.b #$00 : JML.l SplashItem_SpawnOther 188 | 189 | ;================================================================================ 190 | ; Randomize Catfish 191 | ;-------------------------------------------------------------------------------- 192 | LoadCatfishItemGFX: 193 | LDA.l $9DE185 ; location randomizer writes catfish item to 194 | JSL.l AttemptItemSubstitution 195 | JSL.l ResolveLootIDLong 196 | STA.w SpriteID, Y 197 | TYX 198 | JML.l PrepDynamicTile_loot_resolved 199 | ;-------------------------------------------------------------------------------- 200 | DrawThrownItem: 201 | LDA.b OverworldIndex : CMP.b #$81 : BNE .catfish 202 | .zora 203 | LDA.b #$01 : STA.l RedrawFlag 204 | BRA .draw 205 | .catfish 206 | .draw 207 | LDA.w SpriteID,X 208 | JML DrawDynamicTile 209 | ;-------------------------------------------------------------------------------- 210 | MarkThrownItem: 211 | JSL Link_ReceiveItem ; thing we wrote over 212 | LDA.b OverworldIndex : CMP.b #$81 : BNE .catfish 213 | .zora 214 | JML ItemSet_ZoraKing 215 | .catfish 216 | JML ItemSet_Catfish 217 | ;-------------------------------------------------------------------------------- 218 | -------------------------------------------------------------------------------- /overworldmap.asm: -------------------------------------------------------------------------------- 1 | pushpc 2 | 3 | org $0AC02B 4 | DrawPrizesOverride: 5 | LDX.b #$FF 6 | 7 | .loopStart 8 | INX : PHX 9 | JSR OverworldMap_CheckForPrize 10 | BCC + : JMP .skip_draw : + 11 | 12 | TXA : ASL A : TAX 13 | LDA.l MapCompassFlag 14 | AND #$01 : BNE + 15 | LDA.l WorldMapIcon_posx_vanilla+1, X : STA.l $7EC10B 16 | LDA.l WorldMapIcon_posx_vanilla, X : STA.l $7EC10A 17 | LDA.l WorldMapIcon_posy_vanilla+1, X : STA.l $7EC109 18 | LDA.l WorldMapIcon_posy_vanilla, X : STA.l $7EC108 19 | BRA .adjustment 20 | + LDA.l WorldMapIcon_posx_located+1, X : STA.l $7EC10B 21 | LDA.l WorldMapIcon_posx_located, X : STA.l $7EC10A 22 | LDA.l WorldMapIcon_posy_located+1, X : STA.l $7EC109 23 | LDA.l WorldMapIcon_posy_located, X : STA.l $7EC108 24 | .adjustment 25 | LDA.l WorldMapIcon_tile, X : CMP #$FF : BEQ .skip_draw 26 | LDA.l WorldMapIcon_tile+1, X : BEQ .dont_adjust 27 | CMP.b #$64 : BEQ .is_crystal 28 | LDA.b $1A : AND.b #$10 : BNE .skip_draw 29 | .is_crystal 30 | JSR.w WorldMapIcon_AdjustCoordinate 31 | .dont_adjust 32 | JSR.w WorldMap_CalculateOAMCoordinates 33 | BCC .skip_draw 34 | PLX : PHX : TXA : ASL A : TAX 35 | LDA.l WorldMapIcon_tile+1, X : BEQ .is_red_x 36 | LDA.l MapCompassFlag : CMP.b #$01 : BEQ .is_red_x 37 | LDA.l WorldMapIcon_tile+1, X : STA.b $0D 38 | LDA.l WorldMapIcon_tile, X : STA.b $0C 39 | LDA.b #$02 : BRA .continue 40 | .is_red_x 41 | LDA.b $1A : LSR #3 : AND.b #$03 : TAX 42 | LDA.l WorldMap_RedXChars,X : STA.b $0D 43 | LDA.b #$32 : STA.b $0C : LDA.b #$00 44 | .continue 45 | STA.b $0B 46 | PLX : PHX 47 | INX : JSR.w WorldMap_HandleSpriteBlink 48 | .skip_draw 49 | ; end of loop 50 | PLX : CPX #12 : BCS + : JMP .loopStart : + 51 | 52 | PLA : STA.l $7EC10B 53 | PLA : STA.l $7EC10A 54 | PLA : STA.l $7EC109 55 | PLA : STA.l $7EC108 56 | RTS 57 | 58 | 59 | ; X - the index of the prize marker 60 | OverworldMap_CheckForPrize: 61 | PHX 62 | LDA #$00 : STA.l MapCompassFlag 63 | JSR OverworldMap_CheckForCompass 64 | BCC + 65 | LDA.l MapCompassFlag : ORA #$01 : STA.l MapCompassFlag 66 | LDA CurrentWorld : AND #$40 : BNE ++ ; is the compass position on LW or DW? 67 | LDA.l WorldCompassMask, X : BEQ + : JMP .fail 68 | ++ LDA.l WorldCompassMask, X : BNE + : JMP .fail 69 | + JSR OverworldMap_CheckForMap 70 | BCC + 71 | LDA.l MapCompassFlag : ORA #$02 : STA.l MapCompassFlag 72 | + 73 | LDA.l MapCompassFlag : BEQ .fail 74 | CMP #$02 : BNE .checkIfObtained 75 | LDA CurrentWorld : AND #$40 : BNE + 76 | CPX #3 : BCS .fail : BRA .checkIfObtained 77 | + CPX #10 : BCS .fail 78 | CPX #3 : BCC .fail 79 | 80 | .checkIfObtained 81 | LDA.l MC_DungeonIdsForPrize, X 82 | BPL +++ : CLC : BRA .done : +++ ; non-prize flags 83 | CMP.b #$02 : BCC .hyrule_castle 84 | ASL : TAX 85 | REP #$20 86 | LDA.l DungeonsCompleted : AND.l DungeonItemMasks,X : BNE .fail 87 | CLC : BRA .done 88 | 89 | ; see if hyrule castle has been completely cleared 90 | .hyrule_castle 91 | LDA.l CompassTotalsWRAM, X : SEC : SBC DungeonLocationsChecked, X : BEQ .fail 92 | CLC : BRA .done 93 | 94 | .fail 95 | SEC 96 | .done 97 | SEP #$20 98 | PLX 99 | RTS 100 | 101 | ; X - which compass in question 102 | ; CLC - should not move indicator 103 | ; SEC - yep indicator can move 104 | OverworldMap_CheckForCompass: 105 | LDA.l CompassMode : AND #$80 : BEQ .unset ; should I check for compass logic 106 | LDA.l CompassMode : AND #$40 : BEQ .set ; compasses/maps aren't shuffled 107 | LDA.l CompassMode : AND #$20 : BNE + 108 | JSR OverworldMap_CheckForMap : BCC .unset : BRA .set 109 | + LDA.l CompassExists, X : BEQ .set ; compass doesn't exist 110 | PHX 111 | LDA.l MC_SRAM_Offsets, X : TAX ; put compass offset into X 112 | LDA CompassField, X : ORA MapOverlay, X 113 | PLX 114 | AND.l MC_Masks, X : BNE .set ; is the compass obtained 115 | .unset 116 | CLC 117 | RTS 118 | .set 119 | SEC 120 | RTS 121 | 122 | ; map - which map in question 123 | ; CLC - should not show exact prize 124 | ; SEC - yep should show exact prize 125 | OverworldMap_CheckForMap: 126 | LDA.l MapMode : BEQ .set ; obtaining map doesn't change anything 127 | LDA CurrentWorld : AND #$40 : BNE + ; not really sure on this check 128 | LDA MapField : ORA MapOverlay : AND.b #$01 : BNE .set : BRA .continue 129 | + LDA MapField : ORA MapOverlay : AND.b #$02 : BNE .set 130 | .continue 131 | PHX 132 | LDA.l MC_SRAM_Offsets, X : TAX ; put map offset into X 133 | LDA MapField, X : ORA MapOverlay, X 134 | PLX 135 | AND.l MC_Masks, X : BNE .set ; is the map obtained? 136 | .unset 137 | CLC 138 | RTS 139 | .set 140 | SEC 141 | RTS 142 | 143 | pullpc 144 | -------------------------------------------------------------------------------- /playername.asm: -------------------------------------------------------------------------------- 1 | ; Note shortly before this we have a blank-the-sram slot code that we might want to hook 2 | WriteBlanksToPlayerName: 3 | STA.l ExtendedFileNameSRAM 4 | STA.l ExtendedFileNameSRAM+2 5 | STA.l ExtendedFileNameSRAM+4 6 | STA.l ExtendedFileNameSRAM+6 7 | 8 | STA.l ExtendedFileNameSRAM+8 9 | STA.l ExtendedFileNameSRAM+10 10 | STA.l ExtendedFileNameSRAM+12 11 | STA.l ExtendedFileNameSRAM+14 12 | 13 | STA.l ExtendedFileNameSRAM+16 14 | STA.l ExtendedFileNameSRAM+18 15 | STA.l ExtendedFileNameSRAM+20 16 | STA.l ExtendedFileNameSRAM+22 17 | 18 | STA.l FileNameVanillaSRAM, X ;What we wrote over (clear first byte of vanilla name slot) 19 | RTL 20 | 21 | WriteCharacterToPlayerName: 22 | STA.l ExtendedFileNameSRAM, X 23 | CPX.w #$0008 : !BGE + 24 | STA.l FileNameVanillaSRAM, X ;what we wrote over 25 | + 26 | RTL 27 | 28 | ReadCharacterFromPlayerName: ;Only for use on Name Screen 29 | LDA.l ExtendedFileNameSRAM, X 30 | CPX.w #$0008 : !BGE + 31 | LDA.l FileNameVanillaSRAM, X ;what we wrote over 32 | + 33 | RTL 34 | 35 | GetCharacterPosition: 36 | PHB : PHK : PLB 37 | ORA.w CharacterPositions, Y 38 | XBA 39 | PLB 40 | RTL 41 | 42 | WrapCharacterPosition: 43 | LDA.w PlayerNameCursor : BPL + 44 | LDA.b #$0B 45 | + 46 | CMP.b #$0C : !BLT + 47 | LDA.b #$00 48 | + 49 | STA.w PlayerNameCursor 50 | RTL 51 | 52 | CharacterPositions: 53 | dw $006E, $006F, $0070, $0071 54 | dw $0073, $0074, $0075, $0076 55 | dw $0078, $0079, $007a, $007b 56 | HeartCursorPositions: 57 | db $70, $78, $80, $88 58 | db $98, $a0, $a8, $b0 59 | db $c0, $c8, $d0, $d8 60 | 61 | 62 | NewNameStripes: 63 | dw $AB66, $1100 ; 0-4 top 64 | dw $1D40, $0188, $1D41, $0188, $1D42, $0188, $1D43, $0188 65 | dw $1D44 66 | dw $CB66, $1100 ; 0-4 bottom 67 | dw $1D50, $0188, $1D51, $0188, $1D52, $0188, $1D53, $0188 68 | dw $1D54 69 | dw $EB66, $1100 ; 5-9 top 70 | dw $1D45, $0188, $1D46, $0188, $1D47, $0188, $1D48, $0188 71 | dw $1D49 72 | dw $0B67, $1100 ; 5-9 bottom 73 | dw $1D55, $0188, $1D56, $0188, $1D57, $0188, $1D58, $0188 74 | dw $1D59 75 | 76 | ; Move JP characters where a-z are to column where second END button was 77 | dw $B162, $1100 78 | dw $1CEE, $0188, $1CEF, $0188, $1D05, $0188, $1D06, $0188 79 | dw $1D07 80 | dw $D162, $1100 81 | dw $1CFE, $0188, $1CFF, $0188, $1D15, $0188, $1D16, $0188 82 | dw $1D17 83 | dw $F162, $1100 84 | dw $1D0D, $0188, $1D0E, $0188, $1D0F, $0188, $1D20, $0188 85 | dw $1D21 86 | dw $1163, $1100 87 | dw $1D1D, $0188, $1D1E, $0188, $1D1F, $0188, $1D30, $0188 88 | dw $1D31 89 | dw $3163, $1100 90 | dw $1D22, $0188, $1D23, $0188, $1D24, $0188, $1D25, $0188 91 | dw $1D26 92 | dw $5163, $1100 93 | dw $1D32, $0188, $1D33, $0188, $1D34, $0188, $1D35, $0188 94 | dw $1D36 95 | 96 | db $80 ; termination 97 | 98 | TransferNewNameStripes: 99 | REP #$30 100 | LDA.w GameMode : CMP.w #$0204 : BNE .exit 101 | SEP #$20 102 | LDA.b #NewNameStripes>>0 : STA.b $00 103 | LDA.b #NewNameStripes>>8 : STA.b $01 104 | LDA.b #NewNameStripes>>16 : STA.b $02 : STA.w DMA1ADDRB 105 | STZ.b $06 : LDY.w #$0000 106 | .check_next 107 | LDA.b [$00],Y : BPL .next_stripe 108 | .exit 109 | SEP #$30 110 | RTL 111 | .next_stripe 112 | STA.b $04 113 | INY 114 | LDA.b [$00],Y : STA.b $03 115 | INY 116 | LDA.b [$00],Y : AND.b #$80 : ASL : ROL : STA.b $07 117 | LDA.b [$00],Y : AND.b #$40 : STA.b $05 118 | LSR #3 : ORA.b #$01 : STA.w DMA1MODE 119 | LDA.b #VMDATAL : STA.w DMA1PORT 120 | REP #$20 121 | LDA.b $03 : STA.w VMADDR 122 | LDA.b [$00],Y : XBA : AND.w #$3FFF 123 | TAX : INX : STX.w DMA1SIZE 124 | INY #2 : TYA 125 | CLC : ADC.b $00 : STA.w DMA1ADDRL 126 | LDA.b $05 127 | STX.b $03 128 | TYA : CLC : ADC.b $03 : TAY 129 | SEP #$20 130 | LDA.b $07 : ORA.b #$80 : STA.w VMAIN 131 | LDA.b #$02 : STA.w DMAENABLE 132 | JMP.w .check_next 133 | -------------------------------------------------------------------------------- /potions.asm: -------------------------------------------------------------------------------- 1 | ;-------------------------------------------------------------------------------- 2 | ; $7F5092 - Potion Animation Busy Flags (Health) 3 | ; $7F5093 - Potion Animation Busy Flags (Magic) 4 | ;-------------------------------------------------------------------------------- 5 | RefillHealth: 6 | REP #$20 ; set 16-bit accumulator 7 | LDA.b RoomIndex ; these are all decimal because i got them that way 8 | CMP.w #279 : BNE + ; Spike Cave bottles work normally 9 | SEP #$20 ; set 8-bit accumulator 10 | LDA.b #$A0 11 | BRA .done 12 | + 13 | SEP #$20 ; set 8-bit accumulator 14 | LDA.l PotionHealthRefill : CMP.b #$A0 : !BGE .done 15 | LDA.l BusyHealth : BNE ++ 16 | LDA.l PotionHealthRefill ; load refill amount 17 | !ADD CurrentHealth ; add to current health 18 | CMP.l MaximumHealth : !BLT +++ : LDA.l MaximumHealth : +++ 19 | STA.l BusyHealth 20 | ++ 21 | 22 | LDA.l CurrentHealth : CMP.l BusyHealth : !BLT ++ 23 | LDA.b #$00 : STA.l HeartsFiller 24 | LDA.w $020A : BNE .notDone 25 | LDA.b #$00 : STA.l BusyHealth 26 | SEC 27 | RTL 28 | ++ 29 | LDA.b #$08 : STA.l HeartsFiller ; refill some health 30 | .notDone 31 | CLC 32 | RTL 33 | .done 34 | 35 | ; Check goal health versus actual health. 36 | ; if(actual < goal) then branch. 37 | LDA.l CurrentHealth : CMP.l MaximumHealth : BCC .refillAllHealth 38 | LDA.l MaximumHealth : STA.l CurrentHealth 39 | LDA.b #$00 : STA.l HeartsFiller 40 | ; ??? not sure what purpose this branch serves. 41 | LDA.w $020A : BNE .beta 42 | SEC 43 | RTL 44 | .refillAllHealth 45 | ; Fill up ze health. 46 | LDA.b #$A0 : STA.l HeartsFiller 47 | .beta 48 | CLC 49 | RTL 50 | ;-------------------------------------------------------------------------------- 51 | RefillMagic: 52 | REP #$20 ; set 16-bit accumulator 53 | LDA.b RoomIndex ; these are all decimal because i got them that way 54 | CMP.w #279 : BNE + ; Spike Cave bottles work normally 55 | SEP #$20 ; set 8-bit accumulator 56 | LDA.b #$80 57 | BRA .done 58 | + 59 | SEP #$20 ; set 8-bit accumulator 60 | LDA.l PotionMagicRefill : CMP.b #$80 : !BGE .done 61 | LDA.l BusyMagic : BNE ++ 62 | LDA.l PotionMagicRefill ; load refill amount 63 | !ADD CurrentMagic ; add to current magic 64 | CMP.b #$80 : !BLT +++ : LDA.b #$80 : +++ 65 | STA.l BusyMagic 66 | ++ 67 | 68 | LDA.l CurrentMagic : CMP.l BusyMagic : !BLT ++ 69 | LDA.b #$00 : STA.l BusyMagic 70 | SEC 71 | RTL 72 | ++ 73 | LDA.b #$01 : STA.l MagicFiller ; refill some magic 74 | CLC 75 | RTL 76 | .done 77 | 78 | SEP #$30 79 | ; Check if Link's magic meter is full 80 | LDA.l CurrentMagic : CMP.b #$80 81 | BCS .itsFull 82 | ; Tell the magic meter to fill up until it's full. 83 | LDA.b #$80 : STA.l MagicFiller 84 | SEP #$30 85 | RTL 86 | .itsFull 87 | ; Set the carry, signifying we're done filling it. 88 | SEP #$31 89 | RTL 90 | ;-------------------------------------------------------------------------------- 91 | -------------------------------------------------------------------------------- /quickswap.asm: -------------------------------------------------------------------------------- 1 | ; Thanks to Kazuto for developing the original QS code that inspired this one 2 | 3 | QuickSwap: 4 | ; We perform all other checks only if we are pushing L or R in order to have minimal 5 | ; perf impact, since this runs every frame 6 | 7 | LDA.b Joy1B_New : AND.b #$30 : BEQ .done 8 | 9 | XBA ; stash away the value for after the checks. 10 | 11 | LDA.l QuickSwapFlag : BEQ .done 12 | LDA.w ItemCursor : BEQ .done ; Skip everything if we don't have any items 13 | LDA.b #$01 : STA.l UpdateHUDFlag 14 | LDY.b #$14 15 | PHX 16 | XBA ; restore the stashed value 17 | CMP.b #$30 : BNE + 18 | ; If prossing both L and R this frame, then go directly to the special swap code 19 | LDX.w ItemCursor : BRA .special_swap 20 | + 21 | BIT.b #$10 : BEQ + ; Only pressed R 22 | JSR.w RCode 23 | LDA.b Joy1B_All : BIT.b #$20 : BNE .special_swap ; Still holding L from a previous frame 24 | BRA .store 25 | + 26 | ; Only pressed L 27 | JSR.w LCode 28 | LDA.b Joy1B_All : BIT #$10 : BNE .special_swap ; Still holding R from a previous frame 29 | BRA .store 30 | 31 | .special_swap 32 | LDA.l InventoryTracking+1 : ORA.b #$01 : STA.l InventoryTracking+1 33 | CPX.b #$02 : BEQ + ; boomerang 34 | CPX.b #$01 : BEQ + ; bow 35 | CPX.b #$05 : BEQ + ; powder 36 | CPX.b #$0D : BEQ + ; flute 37 | CPX.b #$10 : BEQ + ; bottle 38 | BRA .store 39 | + STX.w ItemCursor : JSL ProcessMenuButtons_y_pressed 40 | 41 | .store 42 | LDA.b #$20 : STA.w SFX3 43 | STX.w ItemCursor 44 | 45 | JSL HUD_RefreshIconLong 46 | PLX 47 | 48 | .done 49 | LDA.b Joy1B_New : AND.b #$40 ;what we wrote over 50 | RTL 51 | RCode: 52 | LDX.w ItemCursor 53 | LDA.b Joy1B_All : BIT.b #$20 : BNE ++ ; Still holding L from a previous frame 54 | LDA.l InventoryTracking+1 : AND.b #$FE : STA.l InventoryTracking+1 55 | BRA + 56 | ++ 57 | LDA.l InventoryTracking+1 : BIT.b #$01 : BEQ + 58 | RTS 59 | - 60 | + CPX.b #$14 : BNE + : LDX.b #$00 ;will wrap around to 1 61 | + INX 62 | DEY : BEQ + 63 | .nextItem 64 | JSL.l IsItemAvailable : BEQ - 65 | + 66 | RTS 67 | 68 | LCode: 69 | LDX.w ItemCursor 70 | LDA.b Joy1B_All : BIT #$10 : BNE ++ ; Still holding R from a previous frame 71 | LDA.l InventoryTracking+1 : AND.b #$FE : STA.l InventoryTracking+1 72 | BRA + 73 | ++ 74 | LDA.l InventoryTracking+1 : BIT.b #$01 : BEQ + 75 | RTS 76 | - 77 | + CPX.b #$01 : BNE + : LDX.b #$15 ; will wrap around to $14 78 | + DEX 79 | DEY : BEQ + 80 | .nextItem 81 | JSL.l IsItemAvailable : BEQ - 82 | + 83 | RTS 84 | 85 | IsItemAvailable: 86 | LDA.l InfiniteBombs : BEQ .finite 87 | .infinite 88 | CPX.b #$04 : BNE .finite 89 | LDA.b #$01 : RTL 90 | .finite 91 | LDA.l EquipmentWRAM-1, X 92 | RTL 93 | -------------------------------------------------------------------------------- /retro.asm: -------------------------------------------------------------------------------- 1 | LoadBombCount: 2 | LDA.l InfiniteBombs : BNE .infinite 3 | .finite 4 | LDA.l BombsEquipment 5 | .infinite 6 | RTL 7 | LoadBombCount16: 8 | LDA.l InfiniteBombs : AND.w #$00FF : BNE .infinite 9 | .finite 10 | LDA.l BombsEquipment 11 | .infinite 12 | RTL 13 | StoreBombCount: 14 | PHA 15 | LDA.b #$01 : STA.l UpdateHUDFlag 16 | LDA.l InfiniteBombs : BEQ .finite 17 | .infinite 18 | PLA : LDA.b #$01 : RTL 19 | .finite 20 | PLA : STA.l BombsEquipment 21 | RTL 22 | SearchForEquippedItem: 23 | LDA.l InfiniteBombs : BEQ + 24 | LDA.b #$01 : LDX.b #$00 : RTL 25 | + 26 | LDA.l BowEquipment ; thing we wrote over 27 | RTL 28 | 29 | DecrementArrows: 30 | LDA.l InfiniteArrows : BNE .infinite 31 | LDA.l ArrowMode : BNE .rupees : BRA .normal 32 | .infinite 33 | LDA.b #$01 : RTL 34 | .normal 35 | LDA.l CurrentArrows : BEQ .done 36 | DEC : STA.l CurrentArrows : INC 37 | BRA .done 38 | .rupees 39 | REP #$20 40 | LDA.b RoomIndex : CMP.w #$0111 : SEP #$20 : BNE .not_archery_game 41 | LDA.b IndoorsFlag : BEQ .not_archery_game ; in overworld 42 | LDA.w $0B9A : BEQ .shoot_arrow ; arrow game active 43 | LDA.b #$00 : BRA .done 44 | 45 | .not_archery_game 46 | LDA.l CurrentArrows : BNE .shoot_arrow ; check if we have arrows 47 | BRA .done 48 | 49 | .shoot_arrow 50 | PHX 51 | REP #$20 52 | LDA.l CurrentRupees : BEQ + 53 | PHA : LDA.l BowEquipment : DEC : AND.w #$0002 : TAX : PLA 54 | !SUB.l ArrowModeWoodArrowCost, X ; CMP.w #$0000 55 | BMI .not_enough_money 56 | STA.l CurrentRupees : LDA.w #$0001 : BRA + 57 | .not_enough_money 58 | LDA.w #$0000 59 | + 60 | SEP #$20 ; set 8-bit accumulator 61 | PLX 62 | .done 63 | CMP.b #$00 64 | RTL 65 | 66 | ArrowGame: 67 | LDA.w $0B99 : BEQ + 68 | DEC $0B99 ; reduce minigame arrow count 69 | LDA.l ArrowMode : BNE .rupees 70 | .normal 71 | LDA.l CurrentArrows : INC #2 : STA.l CurrentArrows ; increment arrow count (by 2 for some reason) 72 | RTL 73 | .rupees 74 | PHX 75 | REP #$20 ; set 16-bit accumulator 76 | LDA.l BowEquipment : DEC : AND.w #$0002 : TAX 77 | LDA.l CurrentRupees : !ADD.l ArrowModeWoodArrowCost, X : STA.l CurrentRupees 78 | SEP #$20 ; set 8-bit accumulator 79 | PLX 80 | + 81 | RTL 82 | -------------------------------------------------------------------------------- /rngfixes.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; RNG Fixes 3 | ;-------------------------------------------------------------------------------- 4 | RigDigRNG: 5 | LDA.l MiniGameTime+1 : CMP.l DiggingGameRNG : !BGE .forceHeart 6 | .normalItem 7 | JML GetRandomInt 8 | .forceHeart 9 | LDA.l MiniGameTime : BNE .normalItem 10 | LDA.b #$04 11 | RTL 12 | ;-------------------------------------------------------------------------------- 13 | RigChestRNG: 14 | JSL.l DecrementChestCounter 15 | LDA.w $04C4 : CMP.l ChestGameRNG : BEQ .forceHeart 16 | .normalItem 17 | JSL GetRandomInt 18 | AND.b #$07 ; restrict values to 0-7 19 | CMP.b #$07 : BEQ .notHeart 20 | JSL.l DecrementItemCounter 21 | RTL 22 | .forceHeart 23 | LDA.b #$33 : STA.b ScrapBufferBD+$0B ; assure the correct state if player talked to shopkeeper 24 | LDA.w RoomItemsTaken : AND.b #$40 : BNE .notHeart 25 | LDA.b #$07 ; give prize item 26 | RTL 27 | .notHeart 28 | JSL.l DecrementItemCounter 29 | 30 | JSL GetRandomInt ; spam RNG until we stop getting the prize item 31 | AND.b #$07 ; restrict values to 0-7 32 | CMP.b #$07 : BNE + ; player got prize item AGAIN 33 | LDA.b #$00 ; give them money instead 34 | + 35 | RTL 36 | ;-------------------------------------------------------------------------------- 37 | FixChestCounterForChestGame: 38 | JSL DecrementItemCounter 39 | JML $8DBA71 40 | ;-------------------------------------------------------------------------------- 41 | RNG_Lanmolas1: 42 | LDA.b #$00 : BRA _rng_done 43 | RNG_Moldorm1: 44 | LDA.b #$01 : BRA _rng_done 45 | RNG_Agahnim1: 46 | LDA.b RoomIndex : CMP.b #$20 : BNE RNG_Agahnim2 ; Agah 1 and 2 use the same code, check which agah we're fighting and branch 47 | LDA.b #$02 48 | JSL.l GetStaticRNG : PHA 49 | LDA.l GanonAgahRNG : BEQ + ; check if blue balls are disabled 50 | PLA 51 | ORA.b #$01 ; guarantee no blue ball 52 | RTL 53 | + 54 | PLA 55 | RTL 56 | 57 | RNG_Helmasaur: 58 | LDA.b #$03 : BRA _rng_done 59 | RNG_Arrghus: 60 | LDA.b #$04 : BRA _rng_done 61 | RNG_Mothula: 62 | LDA.b #$05 : BRA _rng_done 63 | RNG_Kholdstare: 64 | LDA.b #$06 : BRA _rng_done 65 | RNG_Vitreous: 66 | LDA.b #$07 : BRA _rng_done 67 | RNG_Trinexx: 68 | LDA.b #$08 : BRA _rng_done 69 | RNG_Lanmolas2:;x 70 | LDA.b #$09 : BRA _rng_done 71 | RNG_Moldorm2:;x 72 | LDA.b #$0A : BRA _rng_done 73 | RNG_Agahnim2: 74 | LDA.b #$0B 75 | JSL.l GetStaticRNG : PHA 76 | LDA.l GanonAgahRNG : BEQ + ; check if blue balls are disabled 77 | PLA 78 | ORA.b #$01 ; guarantee no blue ball 79 | RTL 80 | + 81 | PLA 82 | RTL 83 | RNG_Agahnim2Phantoms:;x 84 | LDA.b #$0C : BRA _rng_done 85 | RNG_Ganon: 86 | LDA.b #$0D : BRA _rng_done 87 | RNG_Ganon_Extra_Warp: 88 | LDA.b #$0E 89 | JSL.l GetStaticRNG : PHA 90 | LDA.l GanonAgahRNG : BEQ + ; check if warps are disabled 91 | PLA 92 | AND.b #$FE ; set least significant bit to 0 to prevent teleport 93 | RTL 94 | + 95 | PLA 96 | RTL 97 | RNG_Enemy_Drops: 98 | LDA.l ProgressIndicator : CMP.b #$01 : BEQ + ; drops are static after uncle pickup & before rescuing zelda 99 | JML GetRandomInt 100 | + 101 | LDA.b #$0F 102 | _rng_done: 103 | JSL.l GetStaticRNG 104 | RTL 105 | ;-------------------------------------------------------------------------------- 106 | ; In: A = RNG Index 107 | ; Out: A = RNG Result 108 | ;-------------------------------------------------------------------------------- 109 | GetStaticRNG: 110 | PHX : PHP 111 | REP #$30 ; set 16-bit accumulator and index registers 112 | AND.w #$000F 113 | ASL : TAX : LDA.l RNGPointers, X : INC : AND.w #$03FF : STA.l RNGPointers, X : TAX ; increment pointer and move value to X 114 | LDA.l Static_RNG, X ; load RNG value 115 | PLP : PLX 116 | RTL 117 | ;-------------------------------------------------------------------------------- 118 | InitRNGPointerTable: 119 | PHX : PHP 120 | REP #$30 ; set 16-bit accumulator & index registers 121 | LDX.w #$0000 122 | - 123 | LDA.l .rngDefaults, X : STA.l RNGPointers, X : INX #2 124 | LDA.l .rngDefaults, X : STA.l RNGPointers, X : INX #2 125 | LDA.l .rngDefaults, X : STA.l RNGPointers, X : INX #2 126 | LDA.l .rngDefaults, X : STA.l RNGPointers, X : INX #2 127 | CPX.w #$001F : !BLT - 128 | PLP : PLX 129 | RTL 130 | .rngDefaults 131 | dw $0000 ; 00 = Lanmolas 1 132 | dw $0040 ; 01 = Moldorm 1 133 | dw $0080 ; 02 = Agahnim 1 134 | dw $00C0 ; 03 = Helmasaur 135 | dw $0100 ; 04 = Arrghus 136 | dw $0140 ; 05 = Mothula 137 | dw $0180 ; 06 = Kholdstare 138 | dw $01C0 ; 07 = Vitreous 139 | dw $0200 ; 08 = Trinexx 140 | dw $0240 ; 09 = Lanmolas 2 141 | dw $0280 ; 10 = Moldorm 2 142 | dw $02C0 ; 11 = Agahnim 2 143 | dw $0300 ; 12 = Agahnim 2 Phantoms 144 | dw $0340 ; 13 = Ganon 145 | dw $0380 ; 14 = Ganon Extra Warp 146 | dw $03C0 ; 15 = Standard Escape Enemy Drops 147 | ;-------------------------------------------------------------------------------- 148 | -------------------------------------------------------------------------------- /roomloading.asm: -------------------------------------------------------------------------------- 1 | LoadRoomHook: 2 | JSL.l IndoorTileTransitionCounter 3 | 4 | .noStats 5 | JSL Dungeon_LoadRoom 6 | REP #$10 ; 16 bit XY 7 | LDX.b RoomIndex ; Room ID 8 | LDA.l RoomCallbackTable, X 9 | SEP #$10 ; 8 bit XY 10 | JSL JumpTableLong 11 | ; Callback routines: 12 | dl NoCallback ; 00 13 | dl IcePalaceBombosSE ; 01 14 | dl IcePalaceBombosSW ; 02 15 | dl IcePalaceBombosNE ; 03 16 | dl CastleEastEntrance ; 04 17 | dl CastleWestEntrance ; 05 18 | 19 | NoCallback: 20 | RTL 21 | 22 | macro setTilePointer(roomX, roomY, quadX, quadY) 23 | ; Left-to-right math. Should be equivalent to 0x7e2000+(roomX*2)+(roomY*128)+(quadX*64)+(quadY*4096) 24 | LDX.w #*32+*2+*32+*2 25 | endmacro 26 | 27 | macro writeTile() 28 | STA.l $7E2000,x 29 | INX #2 30 | endmacro 31 | 32 | macro writeTileAt(roomX, roomY, quadX, quadY) 33 | STA.l *32+*2+*32+*2+$7E2000 34 | endmacro 35 | 36 | !BOMBOS_BORDER = $08D0 37 | !BOMBOS_ICON_1 = $0CCA 38 | !BOMBOS_ICON_2 = $0CCB 39 | !BOMBOS_ICON_3 = $0CDA 40 | !BOMBOS_ICON_4 = $0CDB 41 | macro DrawBombosPlatform(roomX, roomY, quadX, quadY) 42 | REP #$30 ; 16 AXY 43 | %setTilePointer(, , , ) 44 | LDA.w #!BOMBOS_BORDER 45 | %writeTile() 46 | %writeTile() 47 | %writeTile() 48 | %writeTile() 49 | 50 | %setTilePointer(, +1, , ) 51 | %writeTile() 52 | LDA.w #!BOMBOS_ICON_1 : %writeTile() 53 | LDA.w #!BOMBOS_ICON_2 : %writeTile() 54 | LDA.w #!BOMBOS_BORDER : %writeTile() 55 | 56 | %setTilePointer(, +2, , ) 57 | %writeTile() 58 | LDA.w #!BOMBOS_ICON_3 : %writeTile() 59 | LDA.w #!BOMBOS_ICON_4 : %writeTile() 60 | LDA.w #!BOMBOS_BORDER : %writeTile() 61 | 62 | %setTilePointer(, +3, , ) 63 | %writeTile() 64 | %writeTile() 65 | %writeTile() 66 | %writeTile() 67 | SEP #$30 ; 8 AXY 68 | endMacro 69 | 70 | IcePalaceBombosSE: 71 | LDA.l AllowSwordlessMedallionUse : CMP.b #$01 : BEQ + : RTL : + 72 | %DrawBombosPlatform(14, 18, 1, 1) 73 | RTL 74 | IcePalaceBombosSW: 75 | LDA.l AllowSwordlessMedallionUse : CMP.b #$01 : BEQ + : RTL : + 76 | %DrawBombosPlatform(14, 18, 0, 1) 77 | RTL 78 | IcePalaceBombosNE: 79 | LDA.l AllowSwordlessMedallionUse : CMP.b #$01 : BEQ + : RTL : + 80 | %DrawBombosPlatform(14, 18, 1, 0) 81 | RTL 82 | 83 | CastleEastEntrance: 84 | LDA.l ProgressIndicator : CMP.b #$02 : !BLT + : RTL : + ; only apply in rain states (0 or 1) 85 | LDA.l BlockCastleDoorsInRain : BNE + : RTL : + 86 | 87 | REP #$20 ; 16 A 88 | LDA.w #$08e1 ; square peg 89 | %writeTileAt(11,21,0,1) 90 | %writeTileAt(11,26,0,1) 91 | %writeTileAt(20,21,0,1) 92 | %writeTileAt(20,26,0,1) 93 | INC ;horizontal rail 94 | %writeTileAt(12,21,0,1) 95 | %writeTileAt(13,21,0,1) 96 | %writeTileAt(14,21,0,1) 97 | %writeTileAt(15,21,0,1) 98 | %writeTileAt(16,21,0,1) 99 | %writeTileAt(17,21,0,1) 100 | %writeTileAt(18,21,0,1) 101 | %writeTileAt(19,21,0,1) 102 | INC ;vertical rail 103 | %writeTileAt(11,22,0,1) 104 | %writeTileAt(11,23,0,1) 105 | %writeTileAt(11,24,0,1) 106 | %writeTileAt(11,25,0,1) 107 | %writeTileAt(20,22,0,1) 108 | %writeTileAt(20,23,0,1) 109 | %writeTileAt(20,24,0,1) 110 | %writeTileAt(20,25,0,1) 111 | SEP #$20 ; 8 A 112 | RTL 113 | 114 | CastleWestEntrance: 115 | LDA.l ProgressIndicator : CMP.b #$02 : !BLT + : RTL : + ; only apply in rain states (0 or 1) 116 | LDA.l BlockCastleDoorsInRain : BNE + : RTL : + 117 | 118 | REP #$20 ; 16 A 119 | LDA.w #$08e1 ; square peg 120 | %writeTileAt(11,21,1,1) 121 | %writeTileAt(11,26,1,1) 122 | %writeTileAt(20,21,1,1) 123 | %writeTileAt(20,26,1,1) 124 | INC ;horizontal rail 125 | %writeTileAt(12,21,1,1) 126 | %writeTileAt(13,21,1,1) 127 | %writeTileAt(14,21,1,1) 128 | %writeTileAt(15,21,1,1) 129 | %writeTileAt(16,21,1,1) 130 | %writeTileAt(17,21,1,1) 131 | %writeTileAt(18,21,1,1) 132 | %writeTileAt(19,21,1,1) 133 | INC ;vertical rail 134 | %writeTileAt(11,22,1,1) 135 | %writeTileAt(11,23,1,1) 136 | %writeTileAt(11,24,1,1) 137 | %writeTileAt(11,25,1,1) 138 | %writeTileAt(20,22,1,1) 139 | %writeTileAt(20,23,1,1) 140 | %writeTileAt(20,24,1,1) 141 | %writeTileAt(20,25,1,1) 142 | SEP #$20 ; 8 A 143 | RTL 144 | 145 | RoomCallbackTable: 146 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00 ; 00x 147 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; 01x 148 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; 02x 149 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; 03x 150 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; 04x 151 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; 05x 152 | db $05, $00, $04, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; 06x 153 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $02, $00 ; 07x 154 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; 08x 155 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; 09x 156 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; 0Ax 157 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; 0Bx 158 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; 0Cx 159 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $03, $00 ; 0Dx 160 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; 0Ex 161 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; 0Fx 162 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; 0Fx 163 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; 10x 164 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; 11x 165 | db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; 12x 166 | -------------------------------------------------------------------------------- /save.asm: -------------------------------------------------------------------------------- 1 | ;-------------------------------------------------------------------------------- 2 | WriteSaveChecksumAndBackup: 3 | TDC 4 | CLC 5 | LDX.w #$004FC 6 | - 7 | ADC.l CartridgeSRAM, X 8 | DEX #2 9 | BPL - 10 | LDX.w #$0FFE 11 | - 12 | ADC.l ExtendedFileNameSRAM, X 13 | DEX #2 14 | BPL - 15 | STA.b Scrap00 16 | LDA.w #$5A5A 17 | SEC : SBC.b Scrap00 18 | STA.l InverseChecksumSRAM 19 | 20 | .backup_save 21 | PHB 22 | LDA.w #$14FF 23 | LDX.w #CartridgeSRAM 24 | LDY.w #SaveBackupSRAM 25 | MVN CartridgeSRAM>>16, CartridgeSRAM>>16 26 | PLB 27 | TDC 28 | TAX 29 | RTL 30 | ;-------------------------------------------------------------------------------- 31 | ValidateSRAM: 32 | REP #$30 33 | TDC 34 | CLC 35 | LDX.w #$04FC 36 | - 37 | ADC.l CartridgeSRAM, X 38 | DEX #2 39 | BPL - 40 | LDX.w #$0FFE 41 | - 42 | ADC.l ExtendedFileNameSRAM, X 43 | DEX #2 44 | BPL - 45 | STA.b Scrap00 46 | LDA.w #$5A5A 47 | SEC : SBC.b Scrap00 48 | CMP.l InverseChecksumSRAM : BEQ .goodchecksum 49 | TDC 50 | LDX.w #$04FC 51 | - 52 | ADC.l SaveBackupSRAM, X 53 | DEX #2 54 | BPL - 55 | LDX.w #$0FFE 56 | - 57 | ADC.l SaveBackupSRAM+$500, X 58 | DEX #2 59 | BPL - 60 | STA.b Scrap00 61 | LDA.w #$5A5A 62 | SEC : SBC.b Scrap00 63 | CMP.l SaveBackupSRAM+$4FE : BEQ + 64 | TDC : STA.l FileValiditySRAM ; Delete save 65 | BRA .goodchecksum 66 | + 67 | PHB 68 | LDA.w #$14FF 69 | LDX.w #SaveBackupSRAM 70 | LDY.w #CartridgeSRAM 71 | MVN CartridgeSRAM>>16, CartridgeSRAM>>16 72 | PLB 73 | 74 | .goodchecksum 75 | LDX.w #$00FE : - ; includes prize pack reset after save and quit 76 | STZ.w $0D00, X 77 | STZ.w $0E00, X 78 | STZ.w $0F00, X 79 | DEX #2 80 | BPL - 81 | SEP #$30 82 | RTL 83 | ;-------------------------------------------------------------------------------- 84 | WriteNewFileChecksum: 85 | LDX.w #$0000 : TXA : - ; Checksum first $04FE bytes 86 | CLC : ADC.l CartridgeSRAM, X 87 | INX #2 88 | CPX.w #$04FE : BNE - 89 | LDX.w #$0000 : - ; Checksum extended save data 90 | CLC : ADC.l ExtendedFileNameSRAM, X 91 | INX #2 92 | CPX.w #$0FFE : BNE - 93 | STA.b Scrap00 94 | LDA.w #$5A5A 95 | SEC : SBC.b Scrap00 96 | STA.l InverseChecksumSRAM 97 | RTL 98 | ;-------------------------------------------------------------------------------- 99 | ClearExtendedSaveFile: 100 | STA.l $700400, X ; what we wrote over 101 | STA.l $700500, X 102 | STA.l $700600, X 103 | STA.l $700700, X 104 | STA.l $700800, X 105 | STA.l $700900, X 106 | STA.l $700A00, X 107 | STA.l $700B00, X 108 | STA.l $700C00, X 109 | STA.l $700D00, X 110 | STA.l $700E00, X 111 | STA.l $700F00, X 112 | STA.l $701000, X 113 | STA.l $701100, X 114 | STA.l $701200, X 115 | STA.l $701300, X 116 | STA.l $701400, X 117 | ; Clear backup save 118 | STA.l $704000, X 119 | STA.l $704100, X 120 | STA.l $704200, X 121 | STA.l $704300, X 122 | STA.l $704400, X 123 | STA.l $704500, X 124 | STA.l $704600, X 125 | STA.l $704700, X 126 | STA.l $704800, X 127 | STA.l $704900, X 128 | STA.l $704A00, X 129 | STA.l $704B00, X 130 | STA.l $704C00, X 131 | STA.l $704D00, X 132 | STA.l $704E00, X 133 | STA.l $704F00, X 134 | STA.l $705000, X 135 | STA.l $705100, X 136 | STA.l $705200, X 137 | STA.l $705300, X 138 | STA.l $705400, X 139 | RTL 140 | ;-------------------------------------------------------------------------------- 141 | ClearExtendedWRAMSaveFile: 142 | STA.l $7EF400, X ; what we wrote over 143 | STA.l $7F6000, X 144 | STA.l $7F6100, X 145 | STA.l $7F6200, X 146 | STA.l $7F6300, X 147 | STA.l $7F6400, X 148 | STA.l $7F6500, X 149 | STA.l $7F6600, X 150 | STA.l $7F6700, X 151 | STA.l $7F6800, X 152 | STA.l $7F6900, X 153 | STA.l $7F6A00, X 154 | STA.l $7F6B00, X 155 | STA.l $7F6C00, X 156 | STA.l $7F6D00, X 157 | STA.l $7F6E00, X 158 | STA.l $7F6F00, X 159 | RTL 160 | ;-------------------------------------------------------------------------------- 161 | CopyExtendedSaveFileToWRAM: 162 | PHA 163 | PHB 164 | LDA.w #$0FFF 165 | LDX.w #ExtendedSaveDataSRAM 166 | LDY.w #ExtendedSaveDataWRAM 167 | MVN ExtendedSaveDataWRAM>>16, CartridgeSRAM>>16 168 | PLB 169 | PLA 170 | STA.l $7EC00D ; What we wrote over. Keep this write last. 171 | RTL 172 | ;-------------------------------------------------------------------------------- 173 | CopyExtendedWRAMSaveFileToSRAM: 174 | PHB 175 | LDA.w #$0FFF 176 | LDX.w #ExtendedSaveDataWRAM 177 | LDY.w #ExtendedSaveDataSRAM 178 | MVN CartridgeSRAM>>16, ExtendedSaveDataWRAM>>16 179 | PLB 180 | TDC 181 | TAX 182 | RTL 183 | -------------------------------------------------------------------------------- /servicerequest.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Service Request Support Code 3 | ;-------------------------------------------------------------------------------- 4 | ; $7F5300 - $7F53FF - Multiworld Block 5 | ; $00 - $5F - RX Buffer 6 | ; $60 - $7E - Reserved 7 | ; $7F - RX Status 8 | ; $80 - $EF - TX Buffer 9 | ; $F0 - $FE - Reserved 10 | ; $FF - TX Status 11 | ;-------------------------------------------------------------------------------- 12 | ; Status Codes 13 | ; $00 - Idle 14 | ; $01 - Ready to Read 15 | ; $FF - Busy 16 | ;-------------------------------------------------------------------------------- 17 | ; Service Indexes 18 | ; 0x00 - 0x04 - chests 19 | ; 0xF0 - freestanding heart / powder / mushroom / bonkable 20 | ; 0xF1 - freestanding heart 2 / boss heart / npc 21 | ; 0xF2 - tablet/pedestal 22 | ;-------------------------------------------------------------------------------- 23 | ; Block Commands 24 | !SCM_WAIT = $00 25 | 26 | !SCM_SEEN = $01 27 | !SCM_SHOW = $02 28 | !SCM_GET = $03 29 | !SCM_GIVE = $04 30 | !SCM_PROMPT = $05 31 | 32 | !SCM_AREACHG = $10 33 | !SCM_DUNGEON = $11 34 | !SCM_DEATH = $12 35 | !SCM_SAVEQUIT = $13 36 | !SCM_FCREATE = $14 37 | !SCM_FLOAD = $15 38 | !SCM_FCDELETE = $16 39 | !SCM_SPAWN = $17 40 | !SCM_PAUSE = $18 41 | 42 | !SCM_STALL = $70 43 | !SCM_RESUME = $71 44 | 45 | !SCM_VERSION = $80 46 | ;-------------------------------------------------------------------------------- 47 | macro ServiceRequestVersion() 48 | LDA.l TxStatus : BEQ + : CLC : RTL : + ; return fail if we don't have the lock 49 | LDA.b #$01 : STA.l TxBuffer+8 ; version 50 | LDA.b #$00 : STA.l TxBuffer+9 51 | STA.l TxBuffer+10 52 | STA.l TxBuffer+11 53 | LDA.b #!SCM_VERSION : STA.l TxBuffer 54 | LDA.b #$01 : STA.l TxStatus ; mark ready for reading 55 | SEC ; mark request as successful 56 | RTL 57 | endmacro 58 | ;-------------------------------------------------------------------------------- 59 | macro ServiceRequestChest(type) 60 | LDA.l TxStatus : BEQ + : CLC : RTL : + ; return fail if we don't have the lock 61 | LDA.b IndoorsFlag : STA.l TxBuffer+8 ; indoor/outdoor 62 | BEQ + 63 | LDA.b RoomIndex : STA.l TxBuffer+9 ; roomid low 64 | LDA.b RoomIndex+1 : STA.l TxBuffer+10 ; roomid high 65 | BRA ++ 66 | + 67 | LDA.b OverworldIndex : STA.l TxBuffer+9 ; area id 68 | LDA.b #$00 : STA.l TxBuffer+10 ; protocol defines this as a ushort 69 | ++ 70 | LDA.b $76 : !SUB #$58 : STA.l TxBuffer+11 ; object index (type 2 only) 71 | LDA.b # : STA.l TxBuffer ; item get 72 | LDA.b #$01 : STA.l TxStatus ; mark ready for reading 73 | SEC ; mark request as successful 74 | RTL 75 | endmacro 76 | ;-------------------------------------------------------------------------------- 77 | macro ServiceRequest(type,index) 78 | LDA.l TxStatus : BEQ + : CLC : RTL : + ; return fail if we don't have the lock 79 | LDA.b IndoorsFlag : STA.l TxBuffer+8 ; indoor/outdoor 80 | BEQ + 81 | LDA.b RoomIndex : STA.l TxBuffer+9 ; roomid low 82 | LDA.b RoomIndex+1 : STA.l TxBuffer+10 ; roomid high 83 | BRA ++ 84 | + 85 | LDA.b OverworldIndex : STA.l TxBuffer+9 ; area id 86 | LDA.b #$00 : STA.l TxBuffer+10 ; protocol defines this as a ushort 87 | ++ 88 | LDA.b # : STA.l TxBuffer+11 ; object index (type 2 only) 89 | LDA.b # : STA.l TxBuffer ; item get 90 | LDA.b #$01 : STA.l TxStatus ; mark ready for reading 91 | SEC ; mark request as successful 92 | RTL 93 | endmacro 94 | ;-------------------------------------------------------------------------------- 95 | PollService: 96 | PHP 97 | SEP #$20 ; set 8-bit accumulator 98 | LDA.l RxStatus : DEC : BEQ + : PLP : CLC : RTL : + ; return fail if there's nothing to read 99 | LDA.b #$FF : STA.l RxStatus ; stop calls from recursing in 100 | LDA.l RxBuffer : CMP.b #!SCM_GIVE : BNE + ; give item 101 | PHY : LDA.l RxBuffer+8 : TAY 102 | LDA.l RxBuffer+9 : BNE ++ 103 | JSL.l Link_ReceiveItem ; do something else 104 | PLY : BRA .done 105 | ++ 106 | JSL.l Link_ReceiveItem 107 | PLY : BRA .done 108 | + : CMP.b #!SCM_SHOW : BNE + ; show item 109 | ; you could check here if you're on the right screen, etc 110 | LDA.l RxBuffer+12 : JSL.l PrepDynamicTile ; we could properly process the whole message but we're not going to 111 | BRA .done 112 | + : CMP.b #!SCM_PROMPT : BNE + ; item prompt 113 | LDA.l RxBuffer+8 : TAX 114 | LDA.l RxBuffer+9 : STA.w SFX2, X ; set sound effect 115 | REP #$30 ; set 16-bit accumulator and index registers 116 | LDA.l RxBuffer+10 : TAX 117 | LDA.l RxBuffer+12 118 | JSL.l DoToast 119 | SEP #$30 ; set 8-bit accumulator and index registers 120 | + : CMP.b #!SCM_VERSION : BNE + ; version 121 | %ServiceRequestVersion() 122 | + 123 | .done 124 | LDA.l #$00 : STA.l RxStatus ; release lock 125 | PLP 126 | SEC ; mark request as successful 127 | RTL 128 | ;-------------------------------------------------------------------------------- 129 | ItemVisualServiceRequest_F0: 130 | %ServiceRequest(!SCM_SEEN, $F0) 131 | ;-------------------------------------------------------------------------------- 132 | ItemVisualServiceRequest_F1: 133 | %ServiceRequest(!SCM_SEEN, $F1) 134 | ;-------------------------------------------------------------------------------- 135 | ItemVisualServiceRequest_F2: 136 | %ServiceRequest(!SCM_SEEN, $F2) 137 | ;-------------------------------------------------------------------------------- 138 | ChestItemServiceRequest: 139 | %ServiceRequestChest(!SCM_GET) 140 | ;-------------------------------------------------------------------------------- 141 | ItemGetServiceRequest_F0: 142 | %ServiceRequest(!SCM_GET, $F0) 143 | ;-------------------------------------------------------------------------------- 144 | ItemGetServiceRequest_F1: 145 | %ServiceRequest(!SCM_GET, $F1) 146 | ;-------------------------------------------------------------------------------- 147 | ItemGetServiceRequest_F2: 148 | %ServiceRequest(!SCM_GET, $F2) 149 | ;-------------------------------------------------------------------------------- 150 | -------------------------------------------------------------------------------- /sharedplayerpalettefix.asm: -------------------------------------------------------------------------------- 1 | lorom 2 | 3 | ;SHARED SPRITE PALETTE FIX 4 | ; 5 | ;This is a repair so that sprites that previously shared Link's palette 6 | ;no longer share his palette. In the vanilla game this was not an issue 7 | ;but with custom sprites some very strange color transitions can occur. 8 | ; 9 | ;The convention in the comments here is that bits are labeled [7:0] 10 | ; 11 | ;Written by Artheau 12 | ;during a cold morning on Oct. 29, 2018 13 | ; 14 | 15 | 16 | ;Bee (Credits) 17 | ;Seems like this was a bug in the vanilla game 18 | ;This puts the bee on the palette it uses in the rest of the game (bits 1-3) 19 | ;Appears virtually identical 20 | org $8ECFBA ;$74FBA in ROM 21 | db $76 22 | 23 | ;Chests (Credits) 24 | ;Gives them a much more natural color (bits 1-3) 25 | ;There is one hex value for each chest 26 | ;The result is a visual improvement 27 | org $8ED35A ;7535A in ROM 28 | db $37 29 | org $8ED362 ;75362 in ROM 30 | db $37 31 | org $8ED36A ;7536A in ROM 32 | db $37 33 | 34 | ;Sweeping Woman (In-Game) 35 | ;Puts her on the same color of red that she is in the ending credits (bits 1-3) 36 | org $8DB383 ;6B383 in ROM 37 | db $07 38 | 39 | ;Ravens (Credits) 40 | ;Puts them on the same color as they are in-game (bits 1-3) 41 | org $8ED653 ;75653 in ROM 42 | db $09 43 | 44 | ;Running Man (In-Game) 45 | ;Puts the jacket on the same palette as the hat 46 | ;bits 1-3 are XORed with the base palette (currently 0b011) 47 | org $85E9DA ;2E9DA in ROM 48 | db $00 49 | org $85E9EA ;2E9EA in ROM 50 | db $40 51 | org $85E9FA ;2E9FA in ROM 52 | db $00 53 | org $85EA0A ;2EA0A in ROM 54 | db $40 55 | org $85EA1A ;2EA1A in ROM 56 | db $00 57 | org $85EA2A ;2EA2A in ROM 58 | db $00 59 | org $85EA3A ;2EA3A in ROM 60 | db $40 61 | org $85EA4A ;2EA4A in ROM 62 | db $40 63 | 64 | ;Running Man (Credits Only) 65 | ;Puts the jacket and the arm on the same palette as the hat (bits 1-3) 66 | org $8ECE72 ;74E72 in ROM 67 | db $47 68 | org $8ECE8A ;74E8A in ROM 69 | db $07 70 | org $8ECE92 ;74E92 in ROM 71 | db $07 72 | org $8ECEA2 ;74EA2 in ROM 73 | db $47 74 | org $8ECEAA ;74EAA in ROM 75 | db $07 76 | org $8ECEBA ;74EBA in ROM 77 | db $47 78 | 79 | ;Hoarder (when under a stone) 80 | ;Complete fix 81 | ;This was a bug that made the hoarder ignore its palette setting only when it was under a rock 82 | org $86AAAC ;32AAC in ROM 83 | db $F0 84 | ;But now we have to give it the correct palette info (bits 1-3) 85 | org $86AA46 ;32A46 in ROM 86 | db $0B 87 | org $86AA48 ;32A48 in ROM 88 | db $0B 89 | org $86AA4A ;32A4A in ROM 90 | db $0B 91 | org $86AA4C ;32A4C in ROM 92 | db $0B 93 | org $86AA4E ;32A4E in ROM 94 | db $4B 95 | 96 | ;Thief (friendly thief in cave) 97 | ;There is a subtle difference in color here (more pastel) 98 | ;His palette is given by bits 1-3 99 | org $8DC322 ;6C322 in ROM 100 | db $07 ;set him to red 101 | ;Alternate palette options: 102 | ;db $09 ;lavender 103 | ;db $0B ;green 104 | ;db $0D ;yellow (same as he is in the credits) 105 | 106 | ;Pedestal Pull 107 | ;This edit DOES create a visual difference 108 | ;so I also present some alternate options 109 | ; 110 | ; 111 | ;Option A: Fix the red pendant, but now it ignores shadows 112 | ;and as a result, looks bugged 113 | ;org $85893D ;2893D in ROM 114 | ;db $07 115 | ; 116 | ; 117 | ;Option B: Make the red pendant a yellow pendant 118 | ;org $85893D ;2893D in ROM 119 | ;db $0D 120 | ; 121 | ; 122 | ;Option C: Also change the other pendants so that they all 123 | ;ignore shadows. This looks better because they appear to 124 | ;glow even brighter 125 | ;BUT I had to compromise on the color of the blue pendant 126 | org $858933 ;28933 in ROM 127 | db $05 ;change palette of blue pendant 128 | org $858938 ;28938 in ROM 129 | db $01 ;change palette of green pendant 130 | org $85893D ;2893D in ROM 131 | db $07 ;change palette of red pendant 132 | ;the pendants travel in a direction determined by their color 133 | ;so option C also requires a fix to their directional movement 134 | org $858D21 ;28D21 in ROM 135 | db $04 136 | org $858D22 ;28D22 in ROM 137 | db $04 138 | org $858D23 ;28D23 in ROM 139 | db $FC 140 | org $858D24 ;28D24 in ROM 141 | db $00 142 | org $858D25 ;28D25 in ROM 143 | db $FE 144 | org $858D26 ;28D26 in ROM 145 | db $FE 146 | org $858D27 ;28D27 in ROM 147 | db $FE 148 | org $858D28 ;28D28 in ROM 149 | db $FC 150 | 151 | ;Blind Maiden 152 | ;Previously she switched palettes when she arrived at the light (although it was very subtle) 153 | ;Here we just set it so that she starts at that color 154 | org $8DB410 ;6B410 in ROM 155 | db $4B ;sets the palette of the prison sprite (bits 1-3) 156 | org $89A8EB ;4A8EB in ROM 157 | db $05 ;sets the palette of the tagalong (bits 0-2) 158 | 159 | ;Crystal Maiden (credits) 160 | ;One of the crystal maidens was on Link's palette, but only in the end sequence 161 | ;palette given by bits 1-3 162 | org $8EC8C3 ;748C3 in ROM 163 | db $37 164 | 165 | ;Cukeman (Everywhere) 166 | ;This guy is such a bugfest. Did you know that his body remains an enemy and if you try talking to him, 167 | ;you have to target the overlaid sprite that only has eyeballs and a mouth? 168 | ;This is why you can still be damaged by him. In any case, I digress. Let's talk edits. 169 | ; 170 | ;These edits specifically target the color of his lips 171 | ;Bits 1-3 are XORed with his base ID palette (0b100) 172 | ;and the base palette cannot be changed without breaking buzzblobs (i.e. green dancing pickles) 173 | org $9AFA93 ;D7A93 in ROM 174 | db $0F 175 | org $9AFAAB ;D7AAB in ROM 176 | db $0F 177 | org $9AFAC3 ;D7AC3 in ROM 178 | db $0F 179 | org $9AFADB ;D7ADB in ROM 180 | db $0F 181 | org $9AFAF3 ;D7AF3 in ROM 182 | db $0F 183 | org $9AFB0B ;D7B0B in ROM 184 | db $0F 185 | ;BUT there is a very specific ramification of the above edits: 186 | ;Because his lips were moved to the red palette, his lips 187 | ;no longer respond to shadowing effects 188 | ;(like how red rupees appear in lost woods) 189 | ;this will only be apparent if enemizer places him in areas like lost woods 190 | ;or in the end credits sequence during his short cameo, 191 | ;so the line below replaces him in the end sequence 192 | ;with a buzzblob 193 | org $8ED664 ;75664 in ROM 194 | db $00 ;number of cukeman in the scene (up to 4) 195 | -------------------------------------------------------------------------------- /spc.asm: -------------------------------------------------------------------------------- 1 | MSUCode = $00277E 2 | 3 | ;@ pushpc 4 | 5 | 6 | ; Change track 15 (unused) to point to 13 (Death Mountain) so dark woods can be track 15 7 | ; Bank 1 8 | org $1A9F15 ; PC 0x0D1F15 ; SPC $D01C 9 | dw $2B00 ; Set track 15 pointer to track 13's data 10 | 11 | pullpc 12 | 13 | ;--------------------------------------------------------------------------------------------------- 14 | 15 | arch spc700 16 | 17 | ;@ pushpc 18 | ;@ pushbase 19 | org $19FE41 ; SPC 0A73 20 | JMP MSUCode 21 | 22 | ; Hijack unreachable SFX data for globally available code 23 | org $1A9B2E 24 | base MSUCode 25 | 26 | SpecialCommand_Mute: 27 | CMP A,#$F0 ; The thing we overwrote 28 | BNE + 29 | JMP $0A81 ; SilenceSong 30 | + 31 | CMP A,#$FA ; New mute command $FA 32 | BNE + 33 | MOV $F4,A 34 | MOV A,#$00 35 | MOV $0A4A,A ; $0A49: MOV A,#$70 -> MOV A,#$00 36 | MOV $0AF3,A ; $0AF2: MOV $059,#$C0 -> MOV $059,#$00 37 | MOV $0C32,A ; $0C32: MOVW $058,YA -> NOP #2 38 | MOV $0C33,A 39 | MOV A,#$C4 ; $0D19: MOVW $058,YA -> MOV A,$058 40 | MOV $0D19,A 41 | MOV A,#$58 42 | MOV $0D1A,A 43 | BRA +++ 44 | + 45 | CMP A,#$FB ; New unmute command $FB 46 | BEQ + 47 | JMP $0A9D ; NewSongInput 48 | + 49 | MOV $F4,A 50 | MOV A,#$70 51 | MOV $0A4A,A ; $0A49: MOV A,#$70 52 | MOV A,#$C0 53 | MOV $0AF3,A ; $0AF2: MOV $059,#$C0 54 | MOV A,#$DA 55 | MOV $0C32,A ; $0C32: MOVW $058,YA 56 | MOV $0D19,A ; $0D19: MOVW $058,YA 57 | MOV A,#$58 58 | MOV $0C33,A 59 | MOV $0D1A,A 60 | +++ 61 | CALL $0A81 ; SilenceSong 62 | - MOV A,$F4 63 | BNE - 64 | CMP A,$F4 65 | BNE - 66 | MOV $F4,$00 67 | RET 68 | 69 | warnpc $1A9B91 70 | 71 | ;@ pullbase 72 | ;@ pullpc 73 | 74 | arch 65816 75 | -------------------------------------------------------------------------------- /spriteswap.asm: -------------------------------------------------------------------------------- 1 | org $008A01 ; 0xA01 - Bank00.asm (LDA.b #$10 : STA $4304 : STA $4314 : STA $4324) 2 | LDA.b PlayerSpriteBank 3 | 4 | org $1BEDF9 5 | JSL SpriteSwap_Palette_ArmorAndGloves ; 4bytes 6 | RTL ; 1byte 7 | NOP 8 | 9 | org $1BEE1B 10 | JSL SpriteSwap_Palette_ArmorAndGloves_part_two 11 | RTL 12 | 13 | !BANK_BASE = $A9 14 | 15 | org $BF8000 16 | SwapSpriteIfNecessary: 17 | PHP 18 | SEP #$20 ; set 8-bit accumulator 19 | LDA.l SpriteSwapper : BEQ + : CLC : ADC.b #!BANK_BASE : CMP.b PlayerSpriteBank : BEQ + 20 | STA.b PlayerSpriteBank 21 | STZ.w SkipOAM ; Set Normal Sprite NMI 22 | JSL.l SpriteSwap_Palette_ArmorAndGloves_part_two 23 | + 24 | PLP 25 | RTL 26 | 27 | SpriteSwap_Palette_ArmorAndGloves: 28 | { 29 | ; DEDF9 30 | LDA.l SpriteSwapper : BNE .continue 31 | LDA.b #$10 : STA.b PlayerSpriteBank ; Load Original Sprite Location 32 | REP #$21 33 | LDA.l ArmorEquipment 34 | JSL $9BEDFF ; Read Original Palette Code 35 | RTL 36 | .part_two 37 | SEP #$30 38 | LDA.l SpriteSwapper : BNE .continue 39 | REP #$30 40 | LDA.l GloveEquipment 41 | JSL $9BEE21 ; Read Original Palette Code 42 | RTL 43 | 44 | .continue 45 | 46 | PHX : PHY : PHA 47 | ; Load armor palette 48 | PHB : PHK : PLB 49 | REP #$20 ; set 16-bit accumulator 50 | 51 | ; Check what Link's armor value is. 52 | LDA.l ArmorEquipment : AND.w #$00FF : TAX 53 | 54 | LDA.l $9BEC06, X : AND.w #$00FF : ASL A : ADC.w #$F000 : STA.b Scrap00 55 | ; replace D308 by 7000 and search 56 | REP #$10 ; set 16-bit index registers 57 | 58 | LDA.w #$01E2 ; Target SP-7 (sprite palette 6) 59 | LDX.w #$000E ; Palette has 15 colors 60 | 61 | TXY : TAX 62 | 63 | LDA.b PlayerSpriteBank : AND.w #$00FF : STA.b Scrap02 64 | 65 | .loop 66 | 67 | LDA.b [Scrap00] : STA.l PaletteBufferAux, X : STA.l PaletteBuffer, X 68 | 69 | INC.b Scrap00 : INC.b Scrap00 70 | 71 | INX #2 72 | 73 | DEY : BPL .loop 74 | 75 | SEP #$30 76 | 77 | 78 | PLB 79 | INC.b NMICGRAM 80 | PLA : PLY : PLX 81 | RTL 82 | } 83 | -------------------------------------------------------------------------------- /stats/font.2bpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/stats/font.2bpp -------------------------------------------------------------------------------- /stats/statConfig.asm: -------------------------------------------------------------------------------- 1 | !FIRST_SWORD_X = 19 2 | !FIRST_SWORD_Y = 310 3 | !PEGASUS_BOOTS_X = 19 4 | !PEGASUS_BOOTS_Y = 313 5 | !FLUTE_X = 19 6 | !FLUTE_Y = 316 7 | !MIRROR_X = 19 8 | !MIRROR_Y = 319 9 | !SWORDLESS_X = 23 10 | !SWORDLESS_Y = 327 11 | !FIGHTERS_SWORD_X = 23 12 | !FIGHTERS_SWORD_Y = 330 13 | !MASTER_SWORD_X = 23 14 | !MASTER_SWORD_Y = 333 15 | !TEMPERED_SWORD_X = 23 16 | !TEMPERED_SWORD_Y = 336 17 | !GOLD_SWORD_X = 23 18 | !GOLD_SWORD_Y = 339 19 | !DAMAGETAKEN_X = 26 20 | !DAMAGETAKEN_Y = 346 21 | !MAGICUSED_X = 26 22 | !MAGICUSED_Y = 349 23 | !BONKS_X = 26 24 | !BONKS_Y = 352 25 | !SAVE_AND_QUITS_X = 26 26 | !SAVE_AND_QUITS_Y = 355 27 | !DEATHS_X = 26 28 | !DEATHS_Y = 358 29 | !FAERIE_REVIVALS_X = 26 30 | !FAERIE_REVIVALS_Y = 361 31 | !TOTAL_MENU_TIME_X = 19 32 | !TOTAL_MENU_TIME_Y = 364 33 | !TOTAL_LAG_TIME_X = 19 34 | !TOTAL_LAG_TIME_Y = 367 35 | !COLLECTION_RATE_X = 22 36 | !COLLECTION_RATE_Y = 380 37 | !TOTAL_TIME_X = 19 38 | !TOTAL_TIME_Y = 383 39 | 40 | macro AddStat(address, type, shiftRight, bits, digits, xPos, lineNumber) 41 | db <<2|<<9|>>8 42 | db 43 | db <<4| 44 | db <<5 45 | db $00 46 | dl
47 | endmacro 48 | 49 | CreditsStats: 50 | %AddStat(SwordTime, 1, 0, 32, 4, !FIRST_SWORD_X, !FIRST_SWORD_Y) 51 | %AddStat(BootsTime, 1, 0, 32, 4, !PEGASUS_BOOTS_X, !PEGASUS_BOOTS_Y) 52 | %AddStat(FluteTime, 1, 0, 32, 4, !FLUTE_X, !FLUTE_Y) 53 | %AddStat(MirrorTime, 1, 0, 32, 4, !MIRROR_X, !MIRROR_Y) 54 | %AddStat(SwordlessBossKills, 0, 0, 08, 2, !SWORDLESS_X, !SWORDLESS_Y) 55 | %AddStat(SwordBossKills, 0, 4, 04, 2, !FIGHTERS_SWORD_X, !FIGHTERS_SWORD_Y) 56 | %AddStat(SwordBossKills, 0, 0, 04, 2, !MASTER_SWORD_X, !MASTER_SWORD_Y) 57 | %AddStat(SwordBossKills+1, 0, 4, 04, 2, !TEMPERED_SWORD_X, !TEMPERED_SWORD_Y) 58 | %AddStat(SwordBossKills+1, 0, 0, 04, 2, !GOLD_SWORD_X, !GOLD_SWORD_Y) 59 | %AddStat(DamageCounter, 0, 0, 16, 5, !DAMAGETAKEN_X, !DAMAGETAKEN_Y) 60 | %AddStat(MagicCounter, 0, 0, 16, 5, !MAGICUSED_X, !MAGICUSED_Y) 61 | %AddStat(BonkCounter, 0, 0, 08, 3, !BONKS_X, !BONKS_Y) 62 | %AddStat(SaveQuitCounter, 0, 0, 08, 2, !SAVE_AND_QUITS_X, !SAVE_AND_QUITS_Y) 63 | %AddStat(DeathCounter, 0, 0, 08, 2, !DEATHS_X, !DEATHS_Y) 64 | %AddStat(FaerieRevivalCounter, 0, 0, 08, 3, !FAERIE_REVIVALS_X, !FAERIE_REVIVALS_Y) 65 | %AddStat(MenuFrames, 1, 8, 32, 4, !TOTAL_MENU_TIME_X, !TOTAL_MENU_TIME_Y) 66 | %AddStat(LagTime, 1, 0, 32, 4, !TOTAL_LAG_TIME_X, !TOTAL_LAG_TIME_Y) 67 | %AddStat(TotalItemCounter, 0, 0, 16, 3, !COLLECTION_RATE_X, !COLLECTION_RATE_Y) 68 | %AddStat(NMIFrames, 1, 0, 32, 4, !TOTAL_TIME_X, !TOTAL_TIME_Y) 69 | 70 | dw $FFFF 71 | -------------------------------------------------------------------------------- /swordswap.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Master / Tempered / Golden Sword Swap 3 | ;================================================================================ 4 | ;$03348E: smith sword check (to see if uprade-able) 5 | ;================================================================================ 6 | LoadSwordForDamage: 7 | LDA.w SpriteTypeTable, X : CMP.b #$88 : BNE .notMoth 8 | JSR.w LoadModifiedSwordLevel ; load normal sword value 9 | CMP.b #$04 : !BLT + : DEC : + ; if it's gold sword, change it to tempered 10 | RTL 11 | .notMoth 12 | JSR.w LoadModifiedSwordLevel ; load normal sword value 13 | RTL 14 | ;================================================================================ 15 | LookupDamageLevel: 16 | CPX.w #$0918 : BNE + 17 | LDA.l StalfosBombDamage 18 | RTL 19 | + 20 | PHP 21 | REP #$20 ; set 16-bit accumulator 22 | TXA : LSR : TAX : BCS .lower 23 | .upper 24 | PLP 25 | LDA.l Damage_Table, X 26 | LSR #4 27 | RTL 28 | .lower 29 | PLP 30 | LDA.l Damage_Table, X 31 | AND.b #$0F 32 | RTL 33 | ;================================================================================ 34 | LoadModifiedSwordLevel: ; returns short 35 | LDA.l SwordModifier : BEQ + 36 | !ADD SwordEquipment ; add normal sword value to modifier 37 | BNE ++ : LDA.b #$01 : RTS : ++ 38 | CMP.b #$05 : !BLT ++ : LDA.b #$04 : RTS : ++ 39 | RTS 40 | + 41 | LDA.l SwordEquipment ; load normal sword value 42 | RTS 43 | ;================================================================================ 44 | ; ArmorEquipment - Armor Inventory 45 | LoadModifiedArmorLevel: 46 | PHA 47 | LDA.l ArmorEquipment : !ADD ArmorModifier 48 | CMP.b #$FF : BNE + : LDA.b #$00 : + 49 | CMP.b #$03 : !BLT + : LDA.b #$02 : + 50 | STA.l ScratchBufferV 51 | PLA 52 | !ADD ScratchBufferV 53 | RTL 54 | ;================================================================================ 55 | ; MagicConsumption - Magic Inventory 56 | LoadModifiedMagicLevel: 57 | LDA.l MagicModifier : BEQ + 58 | !ADD MagicConsumption ; add normal magic value to modifier 59 | CMP.b #$FF : BNE ++ : LDA.b #$00 : RTL : ++ 60 | CMP.b #$03 : !BLT ++ : LDA.b #$02 : ++ 61 | RTL 62 | + 63 | LDA.l MagicConsumption ; load normal magic value 64 | RTL 65 | ;================================================================================ 66 | ; $7E0348 - Ice Value 67 | LoadModifiedIceFloorValue_a11: 68 | LDA.b RoomIndex : CMP.b #$91 : BEQ + : CMP.b #$92 : BEQ + : CMP.b #$93 : BEQ + ; mire basement currently broken - not sure why 69 | LDA.b LinkState : CMP.b #$01 : BEQ + : CMP.b #$17 : BEQ + : CMP.b #$1C : BEQ + 70 | LDA.b LinkSpeed : CMP.b #$02 : BEQ + 71 | LDA.b LinkSlipping : BNE + 72 | LDA.w TileActIce : ORA.l IceModifier : AND.b #$11 : RTL 73 | + : LDA.w TileActIce : AND.b #$11 74 | RTL 75 | LoadModifiedIceFloorValue_a01: 76 | LDA.b RoomIndex : CMP.b #$91 : BEQ + : CMP.b #$92 : BEQ + : CMP.b #$93 : BEQ + ; mire basement currently broken - not sure why 77 | LDA.b LinkState : CMP.b #$01 : BEQ + : CMP.b #$17 : BEQ + : CMP.b #$1C : BEQ + 78 | LDA.b LinkSpeed : CMP.b #$02 : BEQ + 79 | LDA.b LinkSlipping : BNE + 80 | LDA.w TileActIce : ORA.l IceModifier : AND.b #$01 : RTL 81 | + : LDA.w TileActIce : AND.b #$01 82 | RTL 83 | ;================================================================================ 84 | CheckTabletSword: 85 | LDA.l AllowHammerTablets : BEQ + 86 | LDA.l HammerEquipment : BEQ + ; check for hammer 87 | LDA.b #$02 : RTL 88 | + 89 | LDA.l SwordEquipment ; get actual sword value 90 | RTL 91 | ;================================================================================ 92 | GetSwordLevelForEvilBarrier: 93 | LDA.l AllowHammerEvilBarrierWithFighterSword : BEQ + 94 | LDA.b #$FF : RTL 95 | + 96 | LDA.l SwordEquipment 97 | RTL 98 | ;================================================================================ 99 | CheckGanonHammerDamage: 100 | LDA.l HammerableGanon : BEQ + 101 | LDA.w SpriteTypeTable, X : CMP.b #$D8 ; original behavior except ganon 102 | RTL 103 | + 104 | LDA.w SpriteTypeTable, X : CMP.b #$D6 ; original behavior 105 | RTL 106 | ;================================================================================ 107 | GetSmithSword: 108 | JSL ItemCheck_SmithSword : BEQ + : JML.l Smithy_AlreadyGotSword : + 109 | LDA.l SmithItemMode : BNE + 110 | JML.l Smithy_DoesntHaveSword ; Classic Smithy 111 | + 112 | 113 | REP #$20 : LDA.l CurrentRupees : CMP.w #$000A : SEP #$20 : !BGE .buy 114 | .cant_afford 115 | REP #$10 116 | LDA.b #$7A 117 | LDY.b #$01 118 | JSL.l Sprite_ShowMessageUnconditional 119 | LDA.b #$3C : STA.w SFX2 ; error sound 120 | SEP #$10 121 | BRA .done 122 | 123 | .buy 124 | LDA.l SmithItem : TAY 125 | STZ.w ItemReceiptMethod ; Item from NPC 126 | PHX : JSL Link_ReceiveItem : PLX 127 | 128 | REP #$20 : LDA.l CurrentRupees : !SUB.w #$000A : STA.l CurrentRupees : SEP #$20 ; Take 10 rupees 129 | JSL ItemSet_SmithSword 130 | 131 | .done 132 | JML.l Smithy_AlreadyGotSword 133 | ;================================================================================ 134 | CheckMedallionSword: 135 | LDA.l AllowSwordlessMedallionUse : BEQ .check_sword 136 | CMP.b #$01 : BEQ .check_pad 137 | LDA.b #$02 ; Pretend we have master sword 138 | RTL 139 | .check_sword 140 | LDA.l SwordEquipment 141 | RTL 142 | .check_pad 143 | PHB : PHX : PHY 144 | LDA.b IndoorsFlag : BEQ .outdoors 145 | .indoors 146 | REP #$20 ; set 16-bit accumulator 147 | LDA.b RoomIndex ; load room ID 148 | CMP.w #$000E : BNE + ; freezor1 149 | LDA.b LinkPosX : AND.w #$01FF ; check x-coord 150 | CMP.w #368-8 : !BLT .normal 151 | CMP.w #368+32-8 : !BGE .normal 152 | LDA.b LinkPosY : AND.w #$01FF ; check y-coord 153 | CMP.w #400-22 : !BLT .normal 154 | CMP.w #400+32-22 : !BGE .normal 155 | JMP .permit 156 | + : CMP.w #$007E : BNE + ; freezor2 157 | LDA.b LinkPosX : AND.w #$01FF ; check x-coord 158 | CMP.w #112-8 : !BLT .normal 159 | CMP.w #112+32-8 : !BGE .normal 160 | LDA.b LinkPosY : AND.w #$01FF ; check y-coord 161 | CMP.w #400-22 : !BLT .normal 162 | CMP.w #400+32-22 : !BGE .normal 163 | JMP .permit 164 | + : CMP.w #$00DE : BNE + ; kholdstare 165 | LDA.b LinkPosX : AND.w #$01FF ; check x-coord 166 | CMP.w #368-8 : !BLT .normal 167 | CMP.w #368+32-8 : !BGE .normal 168 | LDA.b LinkPosY : AND.w #$01FF ; check y-coord 169 | CMP.w #144-22 : !BLT .normal 170 | CMP.w #144+32-22 : !BGE .normal 171 | BRA .permit 172 | + : .normal 173 | SEP #$20 ; set 8-bit accumulator 174 | BRA .done 175 | .outdoors 176 | LDA.b OverworldIndex : CMP.b #$70 : BNE + 177 | LDA.l MireRequiredMedallion : TAX : LDA.l .medallion_type, X : CMP.w CurrentYItem : BNE .done 178 | LDA.l OverworldEventDataWRAM+$70 : AND.b #$20 : BNE .done 179 | LDA.b #$08 : PHA : PLB ; set data bank to $08 180 | LDY.b #$02 : JSL.l Ancilla_CheckIfEntranceTriggered : BCS .permit ; misery mire 181 | BRA .done 182 | + : CMP.b #$47 : BNE + 183 | LDA.l TRockRequiredMedallion : TAX : LDA.l .medallion_type, X : CMP.w CurrentYItem : BNE .done 184 | LDA.l OverworldEventDataWRAM+$47 : AND.b #$20 : BNE .done 185 | LDA.b #$08 : PHA : PLB ; set data bank to $08 186 | LDY.b #$03 : JSL.l Ancilla_CheckIfEntranceTriggered : BCS .permit ; turtle rock 187 | + 188 | .done 189 | PLY : PLX : PLB 190 | LDA.l SwordEquipment 191 | RTL 192 | .permit 193 | SEP #$20 ; set 8-bit accumulator 194 | PLY : PLX : PLB 195 | LDA.b #$02 ; Pretend we have master sword 196 | RTL 197 | .medallion_type 198 | db #$0F, #$10, #$11 199 | ;================================================================================ 200 | -------------------------------------------------------------------------------- /tablets.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Randomize Tablets 3 | ;-------------------------------------------------------------------------------- 4 | ItemSet_EtherTablet: 5 | PHA : LDA.l NpcFlags+1 : ORA.b #$01 : STA.l NpcFlags+1 : PLA 6 | RTS 7 | ;-------------------------------------------------------------------------------- 8 | ItemSet_BombosTablet: 9 | PHA : LDA.l NpcFlags+1 : ORA.b #$02 : STA.l NpcFlags+1 : PLA 10 | RTS 11 | ;-------------------------------------------------------------------------------- 12 | ItemCheck_EtherTablet: 13 | LDA.l NpcFlags+1 : AND.b #$01 14 | RTL 15 | ;-------------------------------------------------------------------------------- 16 | ItemCheck_BombosTablet: 17 | LDA.l NpcFlags+1 : AND.b #$02 18 | RTL 19 | ;-------------------------------------------------------------------------------- 20 | SetTabletItemFlag: 21 | PHA 22 | LDA.b OverworldIndex : CMP.b #$03 : BEQ .ether ; if we're on the map where ether is, we're the ether tablet 23 | .bombos 24 | JSR ItemSet_BombosTablet : BRA .done 25 | .ether 26 | JSR ItemSet_EtherTablet 27 | .done 28 | PLA 29 | RTS 30 | ;-------------------------------------------------------------------------------- 31 | SpawnTabletItem: 32 | JSL.l LoadOutdoorValue 33 | JSL.l AttemptItemSubstitution 34 | JSL.l ResolveLootIDLong 35 | PHA 36 | LDA.b #$EB : STA.l MiniGameTime 37 | JSL Sprite_SpawnDynamically 38 | PLA 39 | STA.w SpriteID,Y 40 | TYX 41 | JSL.l PrepDynamicTile_loot_resolved 42 | 43 | LDA.b LinkPosX : STA.w SpritePosXLow, Y 44 | LDA.b LinkPosX+1 : STA.w SpritePosXHigh, Y 45 | LDA.b LinkPosY : STA.w SpritePosYLow, Y 46 | LDA.b LinkPosY+1 : STA.w SpritePosYHigh, Y 47 | LDA.b #$00 : STA.w SpriteLayer, Y 48 | LDA.b #$7F : STA.w SpriteZCoord, Y ; spawn WAY up high 49 | RTL 50 | ;-------------------------------------------------------------------------------- 51 | MaybeUnlockTabletAnimation: 52 | PHA : PHP 53 | JSL.l IsMedallion : BCC + 54 | JSR SetTabletItemFlag 55 | STZ.w MedallionFlag ; disable falling-medallion mode 56 | STZ.w ForceSwordUp ; release link from item-up pose 57 | LDA.b #$00 : STA.b LinkState ; set link to ground state 58 | 59 | REP #$20 ; set 16-bit accumulator 60 | LDA.b OverworldIndex : CMP.w #$0030 : BNE ++ ; Desert 61 | SEP #$20 ; set 8-bit accumulator 62 | LDA.b #$02 : STA.b LinkDirection ; face link forward 63 | LDA.b #$3C : STA.b $46 ; lock link for 60f 64 | ++ 65 | SEP #$20 ; set 8-bit accumulator 66 | + 67 | PLP : PLA 68 | RTL 69 | ;-------------------------------------------------------------------------------- 70 | IsMedallion: 71 | REP #$20 ; set 16-bit accumulator 72 | LDA.b OverworldIndex 73 | CMP.w #$03 : BNE + ; Death Mountain 74 | LDA.b LinkPosX : CMP.w #1890 : !BGE ++ 75 | SEC 76 | BRA .done 77 | ++ 78 | BRA .false 79 | + CMP.w #$30 : BNE + ; Desert 80 | LDA.b LinkPosX : CMP.w #512 : !BLT ++ 81 | SEC 82 | BRA .done 83 | ++ 84 | + 85 | .false 86 | CLC 87 | .done 88 | SEP #$20 ; set 8-bit accumulator 89 | RTL 90 | ;-------------------------------------------------------------------------------- 91 | LoadNarrowObject: 92 | LDA.l SpriteProperties_standing_width, X : STA.b ($92), Y ; AddReceiveItem.wide_item_flag? 93 | RTL 94 | ;-------------------------------------------------------------------------------- 95 | CheckTabletItem: 96 | ;-------------------------------------------------------------------------------- 97 | ; Zero flag set = Item not collected 98 | ; Zero flag clear = Item collected 99 | ;-------------------------------------------------------------------------------- 100 | JSL.l IsMedallion : BCS .tablet 101 | LDA.l OverworldEventDataWRAM, X : AND.b #$40 ; What we wrote over 102 | RTL 103 | .tablet 104 | TDC 105 | RTL 106 | -------------------------------------------------------------------------------- /timer.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Challenge Timer 3 | ;================================================================================ 4 | ;-------------------------------------------------------------------------------- 5 | !FRAMES_PER_SECOND = 60 6 | !FRAMES_PER_MINUTE = 60*60 7 | !FRAMES_PER_HOUR = 60*60*60 8 | ;-------------------------------------------------------------------------------- 9 | macro DecIncr(value) 10 | LDA.w : INC 11 | CMP.w #$000A : !BLT ?noIncr 12 | LDA.w +2 : INC : STA.w +2 13 | LDA.w #$0000 14 | ?noIncr: 15 | STA.w 16 | endmacro 17 | ;-------------------------------------------------------------------------------- 18 | macro Sub32(minuend,subtrahend,result) 19 | LDA.l 20 | !SUB.l ; perform subtraction on the LSBs 21 | STA.w 22 | LDA.l +2 ; do the same for the MSBs, with carry 23 | SBC.l +2 ; set according to the previous result 24 | STA.w +2 25 | endmacro 26 | ;-------------------------------------------------------------------------------- 27 | macro Blt32(value1,value2) 28 | LDA.w +2 29 | CMP.l +2 30 | !BLT ?done 31 | BNE ?done 32 | LDA.l 33 | CMP.l 34 | ?done: 35 | endmacro 36 | ;-------------------------------------------------------------------------------- 37 | CalculateTimer: 38 | LDA.w #$0000 39 | STA.l ClockHours ; clear digit storage 40 | STA.l ClockHours+2 41 | STA.l ClockMinutes 42 | STA.l ClockMinutes+2 43 | STA.l ClockSeconds 44 | STA.l ClockSeconds+2 45 | 46 | LDA.l TimerStyle : AND.w #$00FF : CMP.w #$0002 : BNE + ; Stopwatch Mode 47 | %Sub32(NMIFrames,ChallengeTimer,ClockBuffer) 48 | BRA ++ 49 | + CMP.w #$0001 : BNE ++ ; Countdown Mode 50 | %Sub32(ChallengeTimer,NMIFrames,ClockBuffer) 51 | ++ 52 | 53 | %Blt32(ClockBuffer,.halfCycle) : !BLT + 54 | LDA.l TimeoutBehavior : AND.w #$00FF : BNE ++ ; DNF 55 | LDA.w #$0002 : STA.l ClockStatus ; Set DNF Mode 56 | LDA.l NMIFrames : STA.l ChallengeTimer 57 | LDA.l NMIFrames+2 : STA.l ChallengeTimer+2 58 | RTS 59 | ++ CMP.w #$0001 : BNE ++ ; Negative Time 60 | LDA.l ClockBuffer : EOR.w #$FFFF : !ADD.w #$0001 : STA.l ClockBuffer 61 | LDA.l ClockBuffer+2 : EOR.w #$FFFF : ADC.w #$0000 : STA.l ClockBuffer+2 62 | LDA.w #$0001 : STA.l ClockStatus ; Set Negative Mode 63 | BRA .prepDigits 64 | ++ CMP.w #$0002 : BNE ++ ; OHKO 65 | LDA.w #$0002 : STA.l ClockStatus ; Set DNF Mode 66 | LDA.l NMIFrames : STA.l ChallengeTimer 67 | LDA.l NMIFrames+2 : STA.l ChallengeTimer+2 68 | RTS 69 | ++ ; End Game 70 | SEP #$30 71 | JSL.l ActivateGoal 72 | REP #$30 73 | RTS 74 | + 75 | 76 | LDA.l TimerRestart : AND.w #$00FF : BEQ + 77 | LDA.w #$0000 : STA.l ClockStatus ; Set Positive Mode 78 | + 79 | .prepDigits 80 | 81 | - 82 | %Blt32(ClockBuffer,.hour) : !BLT + 83 | %DecIncr(ClockHours) 84 | %Sub32(ClockBuffer,.hour,ClockBuffer) : BRA - 85 | + - 86 | %Blt32(ClockBuffer,.minute) : !BLT + 87 | %DecIncr(ClockMinutes) 88 | %Sub32(ClockBuffer,.minute,ClockBuffer) : BRA - 89 | + - 90 | %Blt32(ClockBuffer,.second) : !BLT + 91 | %DecIncr(ClockSeconds) 92 | %Sub32(ClockBuffer,.second,ClockBuffer) : BRA - 93 | + 94 | 95 | LDA.l ClockHours : !ADD.w #$2490 : STA.l ClockHours ; convert decimal values to tiles 96 | LDA.l ClockHours+2 : !ADD.w #$2490 : STA.l ClockHours+2 97 | LDA.l ClockMinutes : !ADD.w #$2490 : STA.l ClockMinutes 98 | LDA.l ClockMinutes+2 : !ADD.w #$2490 : STA.l ClockMinutes+2 99 | LDA.l ClockSeconds : !ADD.w #$2490 : STA.l ClockSeconds 100 | LDA.l ClockSeconds+2 : !ADD.w #$2490 : STA.l ClockSeconds+2 101 | RTS 102 | ;-------------------------------------------------------------------------------- 103 | .hour 104 | dw #$4BC0, #$0003 105 | .minute 106 | dw #$0E10, #$0000 107 | .second 108 | dw #$003C, #$0000 109 | .halfCycle 110 | dw #$FFFF, #$7FFF 111 | ;-------------------------------------------------------------------------------- 112 | DrawChallengeTimer: 113 | JSR.w CheckOHKO : BCC ++ 114 | AND.w #$00FF : BEQ + 115 | LDA.w #$2807 : STA.l HUDTileMapBuffer+$90 116 | LDA.w #$280A : STA.l HUDTileMapBuffer+$92 117 | LDA.w #$280B : STA.l HUDTileMapBuffer+$94 118 | LDA.w #$280C : STA.l HUDTileMapBuffer+$96 119 | RTL 120 | + 121 | LDA.w #$247F : STA.l HUDTileMapBuffer+$90 122 | STA.l HUDTileMapBuffer+$92 123 | STA.l HUDTileMapBuffer+$94 124 | STA.l HUDTileMapBuffer+$96 125 | ++ 126 | LDA.l TimerStyle : BNE + : RTL : + ; Hud Timer 127 | LDA.w #$2807 : STA.l HUDTileMapBuffer+$92 128 | LDA.l ClockStatus : AND.w #$0002 : BEQ + ; DNF / OKHO 129 | 130 | LDA.l TimeoutBehavior : AND.w #$00FF : BNE ++ ; DNF 131 | LDA.w #$2808 : STA.l HUDTileMapBuffer+$94 132 | LDA.w #$2809 : STA.l HUDTileMapBuffer+$96 133 | LDA.w #$247F : STA.l HUDTileMapBuffer+$98 134 | STA.l HUDTileMapBuffer+$9A 135 | BRA +++ 136 | ++ ; OHKO 137 | LDA.w #$280A : STA.l HUDTileMapBuffer+$94 138 | LDA.w #$280B : STA.l HUDTileMapBuffer+$96 139 | LDA.w #$280C : STA.l HUDTileMapBuffer+$98 140 | LDA.w #$247F : STA.l HUDTileMapBuffer+$9A 141 | +++ 142 | STA.l HUDTileMapBuffer+$9C 143 | STA.l HUDTileMapBuffer+$9E 144 | STA.l HUDTileMapBuffer+$A0 145 | STA.l HUDTileMapBuffer+$A2 146 | STA.l HUDTileMapBuffer+$A4 147 | LDA.l TimerRestart : BNE +++ : RTL : +++ 148 | BRA ++ 149 | + ; Show Timer 150 | LDA.l ClockStatus : AND.w #$0001 : !ADD.w #$2804 : STA.l HUDTileMapBuffer+$94 151 | LDA.l ClockHours+2 : STA.l HUDTileMapBuffer+$96 152 | LDA.l ClockHours : STA.l HUDTileMapBuffer+$98 153 | LDA.w #$2806 : STA.l HUDTileMapBuffer+$9A 154 | LDA.l ClockMinutes+2 : STA.l HUDTileMapBuffer+$9C 155 | LDA.l ClockMinutes : STA.l HUDTileMapBuffer+$9E 156 | LDA.w #$2806 : STA.l HUDTileMapBuffer+$A0 157 | LDA.l ClockSeconds+2 : STA.l HUDTileMapBuffer+$A2 158 | LDA.l ClockSeconds : STA.l HUDTileMapBuffer+$A4 159 | ++ 160 | LDA.b FrameCounter : AND.w #$001F : BNE + : JSR CalculateTimer : + 161 | 162 | RTL 163 | ;-------------------------------------------------------------------------------- 164 | OHKOTimer: 165 | LDA.l OHKOFlag : BNE .kill 166 | LDA.l TimeoutBehavior : CMP.b #$02 : BNE + 167 | LDA.l ClockStatus : AND.b #$02 : BEQ + 168 | .kill 169 | LDA.b #$00 : STA.l CurrentHealth ; kill link 170 | + 171 | LDA.l CurrentHealth 172 | RTL 173 | ;-------------------------------------------------------------------------------- 174 | CheckOHKO: 175 | SEP #$20 176 | LDA.l OHKOFlag : CMP.l OHKOCached : BNE .change 177 | REP #$21 178 | RTS 179 | .change 180 | STA.l OHKOCached 181 | LDA.b #$01 : STA.l UpdateHUDFlag 182 | REP #$20 183 | SEC 184 | RTS 185 | ;-------------------------------------------------------------------------------- 186 | -------------------------------------------------------------------------------- /toast.asm: -------------------------------------------------------------------------------- 1 | ;-------------------------------------------------------------------------------- 2 | ; DoToast: 3 | ; in: A(w) - VRAM Destination 4 | ; in: X(w) - Length in Tiles 5 | ;-------------------------------------------------------------------------------- 6 | DoToast: 7 | PHY : PHP : PHA 8 | LDA.l ToastBuffer : TAY 9 | PLA 10 | JSL.l WriteVRAMBlock 11 | PLP : PLY 12 | RTL 13 | ;-------------------------------------------------------------------------------- 14 | -------------------------------------------------------------------------------- /tournament.asm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KatDevsGames/z3randomizer/2fd37999618219fbd7a1d5e673380ec992b2fcc0/tournament.asm -------------------------------------------------------------------------------- /zelda.asm: -------------------------------------------------------------------------------- 1 | ;================================================================================ 2 | ; Spawn Zelda (or not) 3 | ;-------------------------------------------------------------------------------- 4 | SpawnZelda: 5 | LDA.l FollowerIndicator : CMP.b #$08 : BEQ + ; don't spawn if dwarf is present 6 | CMP.b #$07 : BEQ + ; don't spawn if frog is present 7 | CMP.b #$0C : BEQ + ; don't spawn if purple chest is present 8 | CLC 9 | + RTL 10 | ;-------------------------------------------------------------------------------- 11 | EndRainState: 12 | LDA.l InitProgressIndicator : BIT.b #$80 : BNE + ; check for instant post-aga 13 | LDA.b #$02 : STA.l ProgressIndicator 14 | RTL 15 | + 16 | LDA.b #$03 : STA.l ProgressIndicator 17 | LDA.l InitLumberjackOW : STA.l OverworldEventDataWRAM+$02 18 | RTL 19 | ;-------------------------------------------------------------------------------- 20 | --------------------------------------------------------------------------------