95 Commits

Author SHA1 Message Date
dacae98439 Merge branch 'OWMain' into overworld_kara 2024-02-28 16:29:01 -06:00
63f0f8002f Fix crash on bugnet upgrade acquisition 2023-09-26 16:53:20 -05:00
4b8de58460 Move SpecialWeaponLevel location to not overlap bow tracking 2023-09-09 11:13:51 -05:00
93e1cfa361 Add missing hook 2023-09-04 20:29:13 -05:00
fa484ec987 Fix picked up items not going in inventory 2023-09-04 17:59:42 -05:00
256f0fa270 Move non-swords not damaging enemies to high bit of special weapons 2023-09-04 17:05:25 -05:00
5ad699f731 Fix bugnet on aga not reflecting balls 2023-09-04 16:57:15 -05:00
0b01f75f80 Show B indicator in menu when can switch item to B button 2023-09-04 16:54:36 -05:00
f076566dca Changes to special weapon modes:
- allow killing red baris with fire rod/bombos
- allow medallions to kill bunny beams
2023-09-04 16:52:31 -05:00
4815c9971a Generalize item-on-B approach 2023-09-04 16:49:28 -05:00
723d359b0a Better icon on bugnet-on-B 2023-09-04 16:37:48 -05:00
ed85faaab5 Allow toggling strafe/bugnet-on-B 2023-09-04 16:36:51 -05:00
13ccba90c3 Add toggle of bugnet-on-B 2023-09-04 16:35:07 -05:00
b52404469b Fix gold bugnet mothula, bugnet on B 2023-09-04 16:32:12 -05:00
cd1a1f4288 First pass at bugnet mode 2023-09-04 16:23:19 -05:00
25c44cd2bb Merge branch 'OWMain' into overworld_kara 2023-09-04 15:03:18 -05:00
015f769521 Move kara-branch code to bank A2 so there's space 2023-02-26 14:31:51 -06:00
bfbc180ff3 Merge branch 'OWMain' into overworld_kara 2023-02-26 14:30:05 -06:00
ec6231955d Merge remote-tracking branch 'codemann/OWMain' into overworld_kara 2023-01-30 19:47:34 -06:00
9699c4d731 Fix swordless boss counter 2022-11-19 21:09:34 -08:00
846ad798cf Fix conflict between hammer-on-B code with bunny-pressing-A code 2022-11-19 10:06:37 -08:00
44e2ccf7f7 Fix bomb on file select screen in swordless 2022-11-16 14:39:47 -08:00
5d4e7fa62d Add Hammer-On-B mode 2022-11-16 14:39:05 -08:00
be81787446 Bee Mode 2022-11-16 14:37:42 -08:00
682583c215 Merge branch 'OWMain' into overworld_kara 2022-11-16 14:24:25 -08:00
3cec56c5d8 Revert "Fix mixing progressive/non-progressive swords and shields"
This reverts commit d05169d5e2.
2022-10-12 15:55:48 -07:00
d05169d5e2 Fix mixing progressive/non-progressive swords and shields 2022-10-08 15:43:28 -07:00
f93a817ed3 Show chest keys count always 2022-09-18 23:21:55 -07:00
d6f3aee02b Remove non-progressive bomb/cane upgrades 2022-09-18 18:18:12 -07:00
4817fa2013 Fix up labels
still WIP

still do not use
2022-09-18 18:11:21 -07:00
6f138825d9 Merge remote-tracking branch 'codemann/OWMain' into overworld_kara
WIP, Broken, Do Not Use
2022-09-18 17:36:49 -07:00
6400a563ea unscramble lowercase letters for new font 2022-04-02 10:07:39 -07:00
9c30e3cdf9 Merge commit '697a742e0937780d3e6d1193876c8096ef1e2200' into HEAD 2022-04-01 18:28:29 -07:00
7da5e6257a Merge branch 'OWMain' of github.com:codemann8/z3randomizer into overworld_kara 2022-02-11 13:36:00 -08:00
8dfdd3ee87 Merge branch 'main' into overworld_kara 2022-01-24 14:07:50 -08:00
ede8760b5c Make non-seeded rng a rom flag instead of compile flag 2022-01-24 13:55:29 -08:00
2a15f39e65 Fix boomerang instakilling Armos Knights 2022-01-24 13:55:19 -08:00
Thomas Prescott
c416bfa917 update credits 2022-01-03 12:29:04 -08:00
b2043ef15e Adjust credits to match layout of base randomizer fork 2022-01-03 12:26:15 -08:00
74c55cf048 Merge remote-tracking branch 'codemann/OWMain' into overworld_kara 2022-01-01 15:30:19 -08:00
spannerisms
e78c41ef38 match expected usage 2021-12-29 18:58:15 -08:00
6db6733d80 Add permanent ice physics bit 2021-12-29 18:51:42 -08:00
8ffef89fb8 Fix bee damage 2021-12-27 14:04:20 -08:00
8c6d2ac26d Fix moldorm/somaria issue and add both-canes mode 2021-12-23 22:13:30 -08:00
0f26e5aaa5 Fix width of special cane freestanding sprites 2021-12-23 22:13:30 -08:00
8a25dc9d52 Prevent hitting stunned ganon in cane-mode with default vulnerability 2021-12-23 22:13:30 -08:00
d2ad452170 Fix mothula/ganon breaking things (hopefully) 2021-12-23 22:13:30 -08:00
b1e3a7999c Remove bomb damage in cane modes 2021-12-23 22:13:30 -08:00
53792aea25 Add cane-only modes 2021-12-23 22:13:26 -08:00
0ab9095222 Merge branch 'OWMain' into overworld_kara 2021-11-29 00:04:13 -08:00
e96d802ed1 Shorten duration of boomerang stun 2021-11-10 00:08:35 -08:00
b515b59a38 Make boomerang in bomb-only mode stun enemies it would normally damage 2021-11-08 16:38:03 -08:00
69a669e16e Merge branch 'OWMain' into overworld_kara 2021-11-08 00:09:02 -08:00
4896985493 Fix bomb icons on file select/endgame screens 2021-11-07 23:58:40 -08:00
2fd459d8ca Show bomb level on file select screen in bomb-only mode 2021-11-07 19:32:27 -08:00
918eefc3bd Minor fixes 2021-11-07 19:31:53 -08:00
2b241b2340 Unify handling of bomb colors in bomb-only mode 2021-11-07 12:47:13 -08:00
0c6ba20470 Merge branch 'main' into overworld_kara 2021-10-30 16:38:09 -07:00
82c5190f63 Merge branch 'OWMain' into overworld_kara 2021-10-30 11:55:08 -07:00
aeec3fe6c6 Allow early detonation of bombs and add build flag to remove static RNG 2021-10-30 09:11:36 -07:00
825d4a1ead Merge branch 'overworld_kara' of github.com:ardnaxelarak/z3randomizer into overworld_kara 2021-10-02 21:19:06 -07:00
6d9cbc85b7 Merge branch 'OWMain' of github.com:codemann8/z3randomizer into overworld_kara 2021-10-02 20:46:14 -07:00
f6f6383913 Merge remote-tracking branch 'codemann/OWMain' into overworld_kara 2021-09-21 14:10:23 -07:00
fb4068a3e1 Merge branch 'main' into overworld_kara 2021-09-21 11:55:33 -07:00
42002ae839 Merge branch 'main' into overworld_kara 2021-08-26 08:44:15 -07:00
0816bb7cab Merge branch 'fix_ohko' into overworld_kara 2021-08-09 15:33:03 -07:00
a12b5a9188 Merge branch 'OWMain' into overworld_kara 2021-08-02 19:00:33 -07:00
f14fea3699 Merge branch 'main' into overworld_kara 2021-08-02 19:00:13 -07:00
07f0ee9962 Merge branch 'OWMain' into overworld_kara 2021-07-28 12:54:14 -07:00
7aac3970d1 Add pseudo-sword mode 2021-07-25 01:42:21 -07:00
b663bb982f Merge branch 'OWMain' into overworld_kara 2021-07-23 15:42:41 -07:00
73ac8d8c25 Merge branch 'main' into overworld_kara 2021-07-23 15:28:30 -07:00
6df8dca127 Fix Stalfos Knights in bomb-mode to have bombs instakill while collapsed 2021-07-20 20:34:08 -07:00
faf05fb9a9 Merge branch 'OWMain' into overworld_kara 2021-07-17 12:19:56 -07:00
6da1227578 Color bombs in the HUD according to bomb level in bomb-only mode 2021-07-17 12:11:25 -07:00
59affe8b93 Adjust things for replacing sword stats with bomb stats 2021-07-17 12:11:25 -07:00
bdd665db24 move storage of BOMB_LEVEL to make it play nicely with starting equipment 2021-07-13 11:28:04 -07:00
e81905a517 Fix bomb downgrades and track bomb stats in bomb-mode 2021-07-12 02:35:24 -07:00
da14e440c7 Add L-1 bombs as separate from no bombs in bomb-only mode 2021-07-12 02:34:57 -07:00
8d92e39451 Fix extra space in credits 2021-07-12 02:13:08 -07:00
2c221dfa37 Allow bombing barrier and getting tablet checks with L2+ bombs 2021-07-10 23:47:27 -07:00
a6a8cda041 Fix junk graphics appearing during GAME OVER screen 2021-07-10 11:32:48 -07:00
2c931527e9 Merge branch 'DRMain' into overworld_kara 2021-07-08 19:39:10 -07:00
8b173ac27b Fix printing damage and magic to stat counters in credits 2021-07-08 01:57:12 -07:00
d960103e86 Merge branch 'main' into overworld_kara 2021-07-07 09:15:29 -07:00
7022b8768a Merge branch 'OWMain' of github.com:codemann8/z3randomizer into overworld_kara 2021-07-06 19:00:52 -07:00
d4e1337471 Add bombs-placed counter to stat screen 2021-07-05 17:56:56 -07:00
b8545ca055 Fix quake not blobbifying certain enemies 2021-07-05 16:15:26 -07:00
f4e7d412ed Fix hookshot and armos knights:
- hookshot now stuns enemies it would normally damage
- armos knights now take same damage from L-2 bombs as L-1/L-3
2021-07-04 18:34:10 -07:00
28b84484e0 NO BOMBOS DAMAGE 2021-07-04 15:40:57 -07:00
2fec3f7484 Merge commit 'f403ca10da9e009599a531be8cdcd20a61b4801c' of github.com:spannerisms/z3randomizer into overworld_kara 2021-07-01 23:05:48 -07:00
01abf889d7 Merge branch 'main' into overworld_kara 2021-07-01 23:02:23 -07:00
b8dc86d7c5 Allow Ganon to be vulnerable to arbitrary item 2021-06-29 16:43:01 -07:00
8b0f0464f8 Implement always-allowed medallions 2021-06-29 16:43:01 -07:00
b3d649a0fb Add bomb-only mode 2021-06-29 16:43:01 -07:00
36 changed files with 2187 additions and 646 deletions

2
.gitignore vendored
View File

@@ -2,4 +2,4 @@ tournament.asm
/build /build
/.idea /.idea
/__pycache__ /__pycache__
/.vscode /.vscode

View File

@@ -77,7 +77,7 @@ dw !ROM_VERSION_HIGH
function hexto555(h) = ((((h&$FF)/8)<<10)|(((h>>8&$FF)/8)<<5)|(((h>>16&$FF)/8)<<0)) function hexto555(h) = ((((h&$FF)/8)<<10)|(((h>>8&$FF)/8)<<5)|(((h>>16&$FF)/8)<<0))
; Feature flags, run asar with -DFEATURE_X=1 to enable ; Feature flags, run asar with -DFEATURE_X=1 to enable
!FEATURE_NEW_TEXT ?= 0 !FEATURE_NEW_TEXT ?= 1
;================================================================================ ;================================================================================
@@ -229,6 +229,9 @@ warnpc $A58000
;org $228000 ; contrib area ;org $228000 ; contrib area
org $A28000 ; contrib area org $A28000 ; contrib area
incsrc contrib.asm incsrc contrib.asm
incsrc special_weapons.asm
incsrc item_on_b.asm
incsrc variable_ganon_vulnerability.asm
warnpc $A38000 warnpc $A38000
org $A38000 org $A38000
@@ -307,6 +310,16 @@ InvertedCastleHole: ;address used by front end. DO NOT MOVE!
incbin sheet73.gfx incbin sheet73.gfx
warnpc $31E501 warnpc $31E501
org $31E800
Damage_Table_Bombs:
incbin damage_table_sword_bombs.bin
warnpc $31F000
org $31F000
Damage_Table_Pseudo:
incbin damage_table_pseudo_sword.bin
warnpc $31F800
org $338000 org $338000
GFX_HUD_Palette: GFX_HUD_Palette:
incbin hudpalette.pal incbin hudpalette.pal
@@ -321,23 +334,24 @@ BossMapIconGFX:
incbin bossicons.4bpp incbin bossicons.4bpp
if !FEATURE_NEW_TEXT if !FEATURE_NEW_TEXT
org $339C00 org $339C00
NewFont: NewFont:
incbin newfont.bin incbin newfont.bin
NewFontInverted: NewFontInverted:
incbin newfont_inverted.bin incbin newfont_inverted.bin
org $0CD7DF
incbin text_unscramble1.bin org $0CD7DF
org $0CE4D5 incbin text_unscramble1.bin
incbin text_unscramble2.bin org $0CE4D5
incbin text_unscramble2.bin
endif endif
org $328000 org $328000
Extra_Text_Table: Extra_Text_Table:
if !FEATURE_NEW_TEXT if !FEATURE_NEW_TEXT
incsrc itemtext_lower.asm incsrc itemtext_lower.asm
else else
incsrc itemtext.asm incsrc itemtext.asm
endif endif
warnpc $32E000 warnpc $32E000
@@ -644,6 +658,12 @@ Player_HaltDashAttackLong:
org $07999D org $07999D
Link_ReceiveItem: Link_ReceiveItem:
org $079F82
Link_UseHammer:
org $07AFEE
Link_UseBugNet:
org $07A985 org $07A985
SetGameModeLikeMirror: SetGameModeLikeMirror:

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,13 +1,13 @@
CheckReceivedItemPropertiesBeforeLoad: CheckReceivedItemPropertiesBeforeLoad:
LDA $A0 : BEQ .normalCode LDA $A0 : BEQ .normalCode
LDA $7EC005 : BNE .lightOff LDA $7EC005 : BNE .lightOff
.normalCode .normalCode
LDA.l AddReceivedItemExpanded_properties, X ;Restore Rando Code JSL LoadReceivedItemExpandedProperties ; get palette
RTL RTL
.lightOff .lightOff
PHX : PHY : PHB PHX : PHY : PHB
LDA.l AddReceivedItemExpanded_properties, X ; get palette JSL LoadReceivedItemExpandedProperties ; get palette
REP #$30 REP #$30
AND #$0007 ; mask out palette AND #$0007 ; mask out palette

View File

@@ -165,22 +165,25 @@ RefreshRainAmmo:
.done .done
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
!INFINITE_ARROWS = "$7F50C8"
!INFINITE_BOMBS = "$7F50C9"
!INFINITE_MAGIC = "$7F50CA"
SetEscapeAssist: SetEscapeAssist:
LDA ProgressIndicator : CMP.b #$01 : BNE .no_train ; check if we're in rain state LDA ProgressIndicator : CMP.b #$01 : BNE .no_train ; check if we're in rain state
.rain .rain
LDA.l EscapeAssist LDA.l EscapeAssist
BIT.b #$04 : BEQ + : STA !INFINITE_MAGIC : + BIT.b #$04 : BEQ + : STA InfiniteMagicModifier : +
BIT.b #$02 : BEQ + : STA !INFINITE_BOMBS : + BIT.b #$02 : BEQ + : STA InfiniteBombsModifier : +
BIT.b #$01 : BEQ + : STA !INFINITE_ARROWS : + BIT.b #$01 : BEQ + : STA InfiniteArrowsModifier : +
BRA ++ BRA ++
.no_train ; choo choo .no_train ; choo choo
LDA.l EscapeAssist : BIT.b #$04 : BEQ + : LDA.b #$00 : STA !INFINITE_MAGIC : + LDA.l EscapeAssist
LDA.l EscapeAssist : BIT.b #$02 : BEQ + : LDA.b #$00 : STA !INFINITE_BOMBS : + BIT.b #$40 : BEQ + : STA InfiniteMagicModifier : +
LDA.l EscapeAssist : BIT.b #$01 : BEQ + : LDA.b #$00 : STA !INFINITE_ARROWS : + BIT.b #$20 : BEQ + : STA InfiniteBombsModifier : +
BIT.b #$10 : BEQ + : STA InfiniteArrowsModifier : +
++ ++
LDA.l SpecialWeapons : AND.b #$7F : CMP #$01 : BNE +
LDA.l SpecialWeaponLevel : BEQ +
LDA #$01 : STA InfiniteBombsModifier
+
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
SetSilverBowMode: SetSilverBowMode:

View File

@@ -268,8 +268,7 @@ RTL
DialogFairyThrow: DialogFairyThrow:
LDA.l Restrict_Ponds : BEQ .normal LDA.l Restrict_Ponds : BEQ .normal
LDA BottleContentsOne LDA BottleContentsOne
ORA BottleContentsTwo : ORA BottleContentsThree : ORA BottleContentsFour : BNE .normal ORA BottleContentsTwo : ORA BottleContentsThree : ORA BottleContentsFour : BNE .normal
.noInventory .noInventory
LDA $0D80, X : !ADD #$08 : STA $0D80, X LDA $0D80, X : !ADD #$08 : STA $0D80, X
LDA.b #$51 LDA.b #$51
@@ -300,31 +299,64 @@ RTL
; s = silver arrow bow ; s = silver arrow bow
; p = 2nd progressive bow ; p = 2nd progressive bow
DialogGanon2: DialogGanon2:
JSL.l CheckGanonVulnerability JSL.l CheckGanonVulnerability
REP #$20 REP #$20
BCS + BCS +
LDA.w #$018D : BRA ++ LDA.w #$018D : JMP .done
+ +
LDA.l GanonVulnerabilityItem : AND #$00FF : BNE .special_item
LDA.l SpecialWeapons : AND.w #$007F
CMP.w #$0001 : BEQ .bombs ; bombs if special bomb mode
.silver_arrows
LDA.l BowTracking LDA.l BowTracking
BIT.w #$0080 : BNE + ; branch if bow BIT.w #$0080 : BNE + ; branch if bow
LDA.w #$0192 : BRA ++ LDA.w #$0192 : JMP .done
+ +
BIT.w #$0040 : BEQ + ; branch if no silvers BIT.w #$0040 : BEQ + ; branch if no silvers
LDA.w #$0195 : BRA ++ LDA.w #$0195 : JMP .done
+ +
BIT.w #$0020 : BNE + ; branch if p bow BIT.w #$0020 : BNE + ; branch if p bow
LDA.w #$0194 : BRA ++ LDA.w #$0194 : JMP .done
+ +
BIT.w #$0080 : BEQ + ; branch if no bow BIT.w #$0080 : BEQ + ; branch if no bow
LDA.w #$0193 : BRA ++ LDA.w #$0193 : JMP .done
+ +
LDA.w #$016E LDA.w #$016E : JMP .done
++ .special_item
CMP.w #$0001 : BEQ .silver_arrows
CMP.w #$0004 : BEQ .bombs
CMP.w #$0005 : BEQ .powder
CMP.w #$0010 : BEQ .bee
PHX : TAX
LDA.l EquipmentWRAM-1, X : PLX : AND #$00FF : BNE +
LDA.w #$0192 : JMP .done
+
LDA.w #$0195 : BRA .done
.bombs
LDA.l BombsEquipment : AND #$00FF : BNE +
LDA.l InfiniteBombsModifier : AND #$00FF : BNE + ; check for infinite bombs
LDA.w #$0192 : BRA .done
+
LDA.w #$0195 : BRA .done
.powder
LDA.l InventoryTracking : AND #$0010 : BNE + ; check for powder
LDA.w #$0192 : BRA .done
+
LDA.w #$0195 : BRA .done
.bee
LDA.l BottleContentsOne : AND #$00FF : CMP.w #$0007 : BEQ + : CMP.w #$0008 : BEQ +
LDA.l BottleContentsTwo : AND #$00FF : CMP.w #$0007 : BEQ + : CMP.w #$0008 : BEQ +
LDA.l BottleContentsThree : AND #$00FF : CMP.w #$0007 : BEQ + : CMP.w #$0008 : BEQ +
LDA.l BottleContentsFour : AND #$00FF : CMP.w #$0007 : BEQ + : CMP.w #$0008 : BEQ +
LDA.w #$0192 : BRA .done
+
LDA.w #$0195 : BRA .done
.done
STA $1CF0 STA $1CF0
SEP #$20 SEP #$20
JSL.l Sprite_ShowMessageMinimal_Alt JSL.l Sprite_ShowMessageMinimal_Alt
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
DialogEtherTablet: DialogEtherTablet:
@@ -334,11 +366,8 @@ DialogEtherTablet:
PLA : JML Sprite_ShowMessageUnconditional ; Wacky Hylian Text PLA : JML Sprite_ShowMessageUnconditional ; Wacky Hylian Text
+ +
BIT $F4 : BVC - ; Show normal text if Y is not pressed BIT $F4 : BVC - ; Show normal text if Y is not pressed
LDA.l AllowHammerTablets : BEQ ++ JSL CheckTabletSword : BMI .yesText
LDA HammerEquipment : BEQ .yesText : BRA .noText CMP.b #$02 : !BGE .noText
++
LDA SwordEquipment : CMP.b #$FF : BEQ .yesText : CMP.b #$02 : BCS .noText
;++
.yesText .yesText
PLA PLA
LDA.b #$0C LDA.b #$0C
@@ -356,13 +385,10 @@ DialogBombosTablet:
PLA : JML Sprite_ShowMessageUnconditional ; Wacky Hylian Text PLA : JML Sprite_ShowMessageUnconditional ; Wacky Hylian Text
+ +
BIT $F4 : BVC - ; Show normal text if Y is not pressed BIT $F4 : BVC - ; Show normal text if Y is not pressed
LDA.l AllowHammerTablets : BEQ ++ JSL CheckTabletSword : BMI .yesText
LDA HammerEquipment : BEQ .yesText : BRA .noText CMP.b #$02 : !BGE .noText
++
LDA SwordEquipment : CMP.b #$FF : BEQ .yesText : CMP.b #$02 : !BGE .noText
;++
.yesText .yesText
PLA PLA
LDA.b #$0D LDA.b #$0D
LDY.b #$01 LDY.b #$01
JML Sprite_ShowMessageUnconditional ; Text From MSPedestalText (tables.asm) JML Sprite_ShowMessageUnconditional ; Text From MSPedestalText (tables.asm)
@@ -374,7 +400,7 @@ RTL
DialogSahasrahla: DialogSahasrahla:
LDA.l PendantsField : AND #$04 : BEQ + ;Check if player has green pendant LDA.l PendantsField : AND #$04 : BEQ + ;Check if player has green pendant
LDA.b #$2F LDA.b #$2F
LDY.b #$00 LDY.b #$00
JML Sprite_ShowMessageUnconditional JML Sprite_ShowMessageUnconditional
+ +
RTL RTL
@@ -455,7 +481,7 @@ RTL
CalculateSignIndex: CalculateSignIndex:
; for the big 1024x1024 screens we are calculating link's effective ; for the big 1024x1024 screens we are calculating link's effective
; screen area, as though the screen was 4 different 512x512 screens. ; screen area, as though the screen was 4 different 512x512 screens.
; And we do this in a way that will likely give the right value even ; And we do this in a way that will likely give the right value even
; with major glitches. ; with major glitches.
LDA $8A : ASL A : TAY ;what we wrote over LDA $8A : ASL A : TAY ;what we wrote over
@@ -464,13 +490,13 @@ CalculateSignIndex:
LDA $21 : AND.w #$0002 : ASL #2 : EOR $8A : AND.w #$0008 : BEQ + LDA $21 : AND.w #$0002 : ASL #2 : EOR $8A : AND.w #$0008 : BEQ +
TYA : !ADD.w #$0010 : TAY ;add 16 if we are in lower half of big screen. TYA : !ADD.w #$0010 : TAY ;add 16 if we are in lower half of big screen.
+ +
LDA $23 : AND.w #$0002 : LSR : EOR $8A : AND.w #$0001 : BEQ + LDA $23 : AND.w #$0002 : LSR : EOR $8A : AND.w #$0001 : BEQ +
TYA : INC #2 : TAY ;add 16 if we are in lower half of big screen. TYA : INC #2 : TAY ;add 16 if we are in lower half of big screen.
+ +
; ensure even if things go horribly wrong, we don't read the sign out of bounds and crash: ; ensure even if things go horribly wrong, we don't read the sign out of bounds and crash:
TYA : AND.w #$00FF : TAY TYA : AND.w #$00FF : TAY
.done .done
RTL RTL

View File

@@ -62,7 +62,7 @@ HudAdditions:
+ lda #$207f + lda #$207f
.reminder sta $7ec702 .reminder sta $7ec702
+ lda.w DRFlags : and #$0004 : beq .restore + lda.w DRFlags : and #$0004 : beq .restore
lda MapField : and.l $0098c0, x : beq .restore ; lda MapField : and.l $0098c0, x : beq .restore
txa : lsr : tax txa : lsr : tax
lda.l GenericKeys : and #$00ff : bne + lda.l GenericKeys : and #$00ff : bne +
@@ -133,7 +133,7 @@ DrHudDungeonItemsAdditions:
jsr ConvertToDisplay2 : sta $1644, y jsr ConvertToDisplay2 : sta $1644, y
+ iny #2 : lda.w #$24f5 : sta $1644, y + iny #2 : lda.w #$24f5 : sta $1644, y
phx : ldx $00 phx : ldx $00
lda MapField : and.l $0098c0, x : beq + ; must have map ; lda MapField : and.l $0098c0, x : beq + ; must have map
plx : sep #$30 : lda.l ChestKeys, x : sta $02 plx : sep #$30 : lda.l ChestKeys, x : sta $02
lda.l GenericKeys : bne +++ lda.l GenericKeys : bne +++
lda $02 : !sub DungeonCollectedKeys, x : sta $02 lda $02 : !sub DungeonCollectedKeys, x : sta $02

View File

@@ -217,11 +217,11 @@ AnimatedEntranceFix: ;when an entrance animation tries to start
PHA : PHX PHA : PHX
LDA.l InvertedMode : BEQ + ;If we are in inverted mode LDA.l InvertedMode : BEQ + ;If we are in inverted mode
LDA.l OWMode+1 : AND.b #!FLAG_OW_MIXED : BNE + ;If we are in Mixed OW shuffle mode LDA.l OWMode+1 : AND.b #!FLAG_OW_MIXED : BNE + ;If we are in Mixed OW shuffle mode
LDA $8A : AND #$40 : BNE + ;and in the light world LDA $8A : AND #$40 : BNE + ;and in the light world
PLX : PLA PLX : PLA
STZ $04C6 ; skip it. STZ $04C6 ; skip it.
LDA #$00 LDA #$00
RTL RTL
+ +
PLX : PLA PLX : PLA
STA $02E4 ;what we wrote over STA $02E4 ;what we wrote over

View File

@@ -59,9 +59,9 @@ RTL
OnUncleItemGet: OnUncleItemGet:
PHA PHA
LDA.l EscapeAssist LDA.l EscapeAssist
BIT.b #$04 : BEQ + : STA !INFINITE_MAGIC : + BIT.b #$04 : BEQ + : STA InfiniteMagicModifier : +
BIT.b #$02 : BEQ + : STA !INFINITE_BOMBS : + BIT.b #$02 : BEQ + : STA InfiniteBombsModifier : +
BIT.b #$01 : BEQ + : STA !INFINITE_ARROWS : + BIT.b #$01 : BEQ + : STA InfiniteArrowsModifier : +
LDA UncleItem_Player : STA !MULTIWORLD_ITEM_PLAYER_ID LDA UncleItem_Player : STA !MULTIWORLD_ITEM_PLAYER_ID
PLA PLA
@@ -70,53 +70,53 @@ OnUncleItemGet:
LDA.l UncleRefill : BIT.b #$04 : BEQ + : LDA.b #$80 : STA.l MagicFiller : + ; refill magic LDA.l UncleRefill : BIT.b #$04 : BEQ + : LDA.b #$80 : STA.l MagicFiller : + ; refill magic
LDA.l UncleRefill : BIT.b #$02 : BEQ + : LDA.b #50 : STA.l BombsFiller : + ; refill bombs LDA.l UncleRefill : BIT.b #$02 : BEQ + : LDA.b #50 : STA.l BombsFiller : + ; refill bombs
LDA.l UncleRefill : BIT.b #$01 : BEQ + ; refill arrows LDA.l UncleRefill : BIT.b #$01 : BEQ + ; refill arrows
LDA.b #70 : STA.l ArrowsFiller LDA.b #70 : STA.l ArrowsFiller
LDA.l ArrowMode : BEQ + LDA.l ArrowMode : BEQ +
LDA.l BowTracking : ORA.b #$80 : STA.l BowTracking ; enable bow toggle LDA.l BowTracking : ORA #$80 : STA.l BowTracking ; enable bow toggle
REP #$20 ; set 16-bit accumulator REP #$20 ; set 16-bit accumulator
LDA.l CurrentRupees : !ADD.l FreeUncleItemAmount : STA.l CurrentRupees ; rupee arrows, so also give the player some money to start LDA.l CurrentRupees : !ADD.l FreeUncleItemAmount : STA.l CurrentRupees ; rupee arrows, so also give the player some money to start
SEP #$20 ; set 8-bit accumulator SEP #$20 ; set 8-bit accumulator
+
LDA.l ProgressIndicator : BNE +
LDA.b #$01 : STA.l ProgressIndicator ; handle rain state
+ +
LDA.l ProgressIndicator : BNE +
LDA.b #$01 : STA.l ProgressIndicator ; handle rain state
+
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
OnAga2Defeated: OnAga2Defeated:
JSL.l Dungeon_SaveRoomData_justKeys ; thing we wrote over, make sure this is first JSL.l Dungeon_SaveRoomData_justKeys ; thing we wrote over, make sure this is first
LDA.b #$01 : STA.l Aga2Duck LDA.b #$01 : STA.l Aga2Duck
JML.l IncrementAgahnim2Sword JML.l IncrementAgahnim2Sword
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
OnFileCreation: OnFileCreation:
; Copy initial SRAM state from ROM to cart SRAM ; Copy initial SRAM state from ROM to cart SRAM
PHB PHB
LDA.w #$03D7 ; \ LDA.w #$03D7 ; \
LDX.w #$B000 ; | Copies from beginning of inital sram table up to file name LDX.w #$B000 ; | Copies from beginning of inital sram table up to file name
LDY.w #$0000 ; | (exclusively) LDY.w #$0000 ; | (exclusively)
MVN $70, $30 ; / MVN $70, $30 ; /
; Skip file name and validity value ; Skip file name and validity value
LDA.w #$010C ; \ LDA.w #$010C ; \
LDX.w #$B3E3 ; | Rando-Specific Assignments & Game Stats block LDX.w #$B3E3 ; | Rando-Specific Assignments & Game Stats block
LDY.w #$03E3 ; | LDY.w #$03E3 ; |
MVN $70, $30 ; / MVN $70, $30 ; /
PLB PLB
; resolve instant post-aga if standard ; resolve instant post-aga if standard
SEP #$20 SEP #$20
LDA.l InitProgressIndicator : BIT #$80 : BEQ + LDA.l InitProgressIndicator : BIT #$80 : BEQ +
LDA.b #$00 : STA.l ProgressIndicatorSRAM ; set post-aga after zelda rescue LDA.b #$00 : STA.l ProgressIndicatorSRAM ; set post-aga after zelda rescue
LDA.b #$00 : STA.l OverworldEventDataSRAM+$02 ; keep rain state vanilla LDA.b #$00 : STA.l OverworldEventDataSRAM+$02 ; keep rain state vanilla
+ +
REP #$20 REP #$20
; Set validity value and do some cleanup. Jump to checksum. ; Set validity value and do some cleanup. Jump to checksum.
LDA.w #$55AA : STA.l $7003E1 LDA.w #$55AA : STA.l $7003E1
STZ $00 STZ $00
STZ $01 STZ $01
LDX.b $00 LDX.b $00
LDY.w #$0000 LDY.w #$0000
TYA TYA
JML.l InitializeSaveFile_build_checksum JML.l InitializeSaveFile_build_checksum
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -254,17 +254,17 @@ PostItemAnimation:
LDA $0403 : STA !MULTIWORLD_ROOMDATA LDA $0403 : STA !MULTIWORLD_ROOMDATA
+ +
LDA.w $02E9 : CMP.b #$01 : BNE +
LDA.b $2F : BEQ +
JSL.l IncrementChestTurnCounter
+
LDA !MULTIWORLD_ITEM_PLAYER_ID : BEQ + LDA !MULTIWORLD_ITEM_PLAYER_ID : BEQ +
STZ $02E9 STZ $02E9
LDA #$00 : STA !MULTIWORLD_ITEM_PLAYER_ID LDA #$00 : STA !MULTIWORLD_ITEM_PLAYER_ID
JML.l Ancilla_ReceiveItem_objectFinished JML.l Ancilla_ReceiveItem_objectFinished
+ +
LDA.w $02E9 : CMP.b #$01 : BNE + STZ $02E9 : LDA $0C5E, X ; thing we wrote over to get here
LDA.b $2F : BEQ +
JSL.l IncrementChestTurnCounter
+
STZ $02E9 : LDA $0C5E, X ; thing we wrote over to get here
JML.l Ancilla_ReceiveItem_optimus+6 JML.l Ancilla_ReceiveItem_optimus+6
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------

View File

@@ -268,15 +268,16 @@ DrawPlayerFileShared:
%fs_drawBottle(EquipmentSRAM+$1F,9,23) %fs_drawBottle(EquipmentSRAM+$1F,9,23)
; Sword ; Sword
LDA.l SpecialWeapons : AND.w #$007F : CMP #$0001 : BEQ .bombSword
LDA.l EquipmentSRAM+$19 : AND.w #$00FF : BNE + LDA.l EquipmentSRAM+$19 : AND.w #$00FF : BNE +
%fs_drawItemGray(3,26,FileSelectItems_fighters_sword) %fs_drawItemGray(3,26,FileSelectItems_fighters_sword)
BRA ++ JMP ++
+ : DEC : BNE + + : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_fighters_sword) %fs_drawItem(3,26,FileSelectItems_fighters_sword)
BRA ++ JMP ++
+ : DEC : BNE + + : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_master_sword) %fs_drawItem(3,26,FileSelectItems_master_sword)
BRA ++ JMP ++
+ : DEC : BNE + + : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_tempered_sword) %fs_drawItem(3,26,FileSelectItems_tempered_sword)
BRA ++ BRA ++
@@ -286,6 +287,29 @@ DrawPlayerFileShared:
+ +
; a sword value above 4 is either corrupted or 0xFF (a.k.a. swordless) ; a sword value above 4 is either corrupted or 0xFF (a.k.a. swordless)
%fs_drawItemGray(3,26,FileSelectItems_fighters_sword) %fs_drawItemGray(3,26,FileSelectItems_fighters_sword)
BRA ++
.bombSword
LDA.l $70038F : AND.w #$00FF : BNE +
%fs_drawItemGray(3,26,FileSelectItems_fighters_bombs)
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_fighters_bombs)
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_master_bombs)
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_tempered_bombs)
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_gold_bombs)
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_extra_gold_bombs)
BRA ++
+
; a bomb value above 5 is... who knows, let's just pretend it's 5
%fs_drawItem(3,26,FileSelectItems_extra_gold_bombs)
++ ++
; Shield ; Shield
@@ -556,6 +580,18 @@ FileSelectItems:
.good_bee_bottle .good_bee_bottle
dw #$0240|!FS_COLOR_BW, #$0241|!FS_COLOR_BW, #$0254|!FS_COLOR_YELLOW, #$0246|!FS_COLOR_YELLOW dw #$0240|!FS_COLOR_BW, #$0241|!FS_COLOR_BW, #$0254|!FS_COLOR_YELLOW, #$0246|!FS_COLOR_YELLOW
.fighters_bombs
dw #$020C|!FS_COLOR_GREEN, #$020D|!FS_COLOR_GREEN, #$021C|!FS_COLOR_GREEN, #$02A1|!FS_COLOR_GREEN
.master_bombs
dw #$020C|!FS_COLOR_BLUE, #$020D|!FS_COLOR_BLUE, #$021C|!FS_COLOR_BLUE, #$02A2|!FS_COLOR_BLUE
.tempered_bombs
dw #$020C|!FS_COLOR_RED, #$020D|!FS_COLOR_RED, #$021C|!FS_COLOR_RED, #$02A3|!FS_COLOR_RED
.gold_bombs
dw #$020C|!FS_COLOR_YELLOW, #$020D|!FS_COLOR_YELLOW, #$021C|!FS_COLOR_YELLOW, #$02A4|!FS_COLOR_YELLOW
.extra_gold_bombs
dw #$020C|!FS_COLOR_YELLOW, #$020D|!FS_COLOR_YELLOW, #$021C|!FS_COLOR_YELLOW, #$02A5|!FS_COLOR_YELLOW
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
FileSelectDrawHudBar: FileSelectDrawHudBar:
LDA #$029B|!FS_COLOR_GREEN : %fs_draw16x8(0,10) LDA #$029B|!FS_COLOR_GREEN : %fs_draw16x8(0,10)
@@ -566,11 +602,29 @@ FileSelectDrawHudBar:
LDA $7F5006 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,11) LDA $7F5006 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,11)
LDA $7F5007 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,12) LDA $7F5007 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,12)
LDA SpecialWeapons : AND.w #$007F : CMP #$0001 : BEQ .colorBombs
LDA #$028B|!FS_COLOR_BLUE : %fs_draw16x8(0,14) LDA #$028B|!FS_COLOR_BLUE : %fs_draw16x8(0,14)
LDA EquipmentSRAM+$03 : AND.w #$00FF LDA EquipmentSRAM+$03 : AND.w #$00FF
JSL.l HexToDec JSL.l HexToDec
LDA $7F5006 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,14) LDA $7F5006 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,14)
LDA $7F5007 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,15) LDA $7F5007 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,15)
BRA ++
.colorBombs
LDA $70038F : AND.w #$00FF : BNE +
; no bombs, draw no icon
BRA ++
+ : DEC : BNE +
LDA #$028B|!FS_COLOR_GREEN : %fs_draw16x8(0,14)
BRA ++
+ : DEC : BNE +
LDA #$028B|!FS_COLOR_BLUE : %fs_draw16x8(0,14)
BRA ++
+ : DEC : BNE +
LDA #$028B|!FS_COLOR_RED : %fs_draw16x8(0,14)
BRA ++
+
LDA #$028B|!FS_COLOR_YELLOW : %fs_draw16x8(0,14)
++
LDA.l BowTrackingSRAM : AND.w #$0040 : BEQ + LDA.l BowTrackingSRAM : AND.w #$0040 : BEQ +
LDA #$0299|!FS_COLOR_RED : %fs_draw16x8(0,17) LDA #$0299|!FS_COLOR_RED : %fs_draw16x8(0,17)

74
generate_bomb_table.rb Normal file
View File

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

View File

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

View File

@@ -76,12 +76,18 @@ GetItemDamageValue:
CPX.b #$04 : BEQ .boomerang CPX.b #$04 : BEQ .boomerang
CPX.b #$05 : BEQ .boomerang CPX.b #$05 : BEQ .boomerang
CPX.b #$39 : BEQ .hookshot CPX.b #$39 : BEQ .hookshot
CPX.b #$3b : BEQ .hookshot CPX.b #$3B : BEQ .hookshot
CPX.b #$3c : BEQ .hookshot CPX.b #$3C : BEQ .hookshot
CPX.b #$3d : BEQ .hookshot CPX.b #$3D : BEQ .hookshot
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$02 : BNE .normal
TXA : AND.b #$78 : CMP.b #$28 : BNE .normal
LDA.l $0DB8F1, X : BEQ .noDamage
LDA.b #$01
RTL
.normal .normal
lda $0db8f1,x ;what we wrote over LDA.l $0DB8F1, X ; what we wrote over
RTL RTL
.boomerang .boomerang
LDA.l StunItemAction : AND #$01 : BNE .normal LDA.l StunItemAction : AND #$01 : BNE .normal

258
hooks.asm
View File

@@ -396,9 +396,6 @@ JSL.l LoadBombCount
org $098133 ; <- 48133 - ancilla_init.asm : 211 (STA $7EF343 : BNE .bombs_left_over) org $098133 ; <- 48133 - ancilla_init.asm : 211 (STA $7EF343 : BNE .bombs_left_over)
JSL.l StoreBombCount JSL.l StoreBombCount
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $0DE4BF ; <- 6E4BF - equipment.asm : 1249 (LDA $7EF343 : AND.w #$00FF : BEQ .gotNoBombs)
JSL.l LoadBombCount16
;--------------------------------------------------------------------------------
org $0DDEB3 ; <- 6DEB3 - equipment.asm : 328 (LDA $7EF33F, X) org $0DDEB3 ; <- 6DEB3 - equipment.asm : 328 (LDA $7EF33F, X)
JSL.l IsItemAvailable JSL.l IsItemAvailable
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -478,9 +475,9 @@ PegProbability:
db $00 ; Probability out of 255. 0 = Vanilla behavior db $00 ; Probability out of 255. 0 = Vanilla behavior
TurtleRockTrollPegs: TurtleRockTrollPegs:
SEP #$20 SEP #$20
LDX.w $04C8 : CPX.w #$FFFF : BEQ .vanilla LDX.w $04C8 : CPX.w #$FFFF : BEQ .vanilla
JSL.l GetRandomInt JSL.l GetRandomInt
LDA.l PegProbability : BEQ .vanilla : CMP.l $7E0FA1 LDA.l PegProbability : BEQ .vanilla : CMP.l $7E0FA1
REP #$20 : !BGE .succeed REP #$20 : !BGE .succeed
.fail .fail
JMP.w TurtleRockPegFail JMP.w TurtleRockPegFail
@@ -2583,37 +2580,37 @@ BRA + : NOP #42 : +
; Hooks for roomloading.asm ; Hooks for roomloading.asm
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $02895D ; <- Bank02.asm:1812 (JSL Dungeon_LoadRoom) org $02895D ; <- Bank02.asm:1812 (JSL Dungeon_LoadRoom)
JSL LoadRoomHook JSL LoadRoomHook
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $028BE7 ; <- Bank02.asm:2299 (JSL Dungeon_LoadRoom) org $028BE7 ; <- Bank02.asm:2299 (JSL Dungeon_LoadRoom)
JSL LoadRoomHook_noStats JSL LoadRoomHook_noStats
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $029309 ; <- Bank02.asm:3533 (JSL Dungeon_LoadRoom) org $029309 ; <- Bank02.asm:3533 (JSL Dungeon_LoadRoom)
JSL LoadRoomHook_noStats JSL LoadRoomHook_noStats
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $02C2F3 ; <- Bank02.asm:10391 (JSL Dungeon_LoadRoom) org $02C2F3 ; <- Bank02.asm:10391 (JSL Dungeon_LoadRoom)
JSL LoadRoomHook_noStats JSL LoadRoomHook_noStats
;================================================================================ ;================================================================================
;================================================================================ ;================================================================================
; Hooks into the "Reloading all graphics" routine ; Hooks into the "Reloading all graphics" routine
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $00E64D ; <- Bank00.asm:5656 (STZ $00 : STX $01 : STA $02) org $00E64D ; <- Bank00.asm:5656 (STZ $00 : STX $01 : STA $02)
JML BgGraphicsLoading JML BgGraphicsLoading
BgGraphicsLoadingCancel: BgGraphicsLoadingCancel:
RTS : NOP RTS : NOP
BgGraphicsLoadingResume: BgGraphicsLoadingResume:
;================================================================================ ;================================================================================
;================================================================================ ;================================================================================
; Hook when updating the floor tileset in dungeons (such as between floors) ; Hook when updating the floor tileset in dungeons (such as between floors)
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $00DF62 ; <- Bank00.asm:4672 (LDX.w #$0000 : LDY.w #$0040) org $00DF62 ; <- Bank00.asm:4672 (LDX.w #$0000 : LDY.w #$0040)
JML ReloadingFloors JML ReloadingFloors
NOP : NOP NOP : NOP
ReloadingFloorsResume: ReloadingFloorsResume:
org $00DF6E ; <- A few instructions later, right after JSR Do3To.high16Bit org $00DF6E ; <- A few instructions later, right after JSR Do3To.high16Bit
ReloadingFloorsCancel: ReloadingFloorsCancel:
;================================================================================ ;================================================================================
;================================================================================ ;================================================================================
@@ -2899,6 +2896,176 @@ org $0AEEF2
org $008BE5 ; hijack stripes for boss GFX transfer org $008BE5 ; hijack stripes for boss GFX transfer
JSL DoDungeonMapBossIcon JSL DoDungeonMapBossIcon
;================================================================================
; Terrorpin AI fix
;--------------------------------------------------------------------------------
org $1EB2B1 ; sprite_terrorpin.asm(57) : AND.b #$03 : STA $0DE0, X ; 5 bytes
JSL FixTerrorpin ; 4 bytes
NOP ; 1 byte
;--------------------------------------------------------------------------------
;================================================================================
; Bomb-Only Mode
;--------------------------------------------------------------------------------
org $06ECC3 ; Bank06.asm@4704 (PHX : TAX : LDA.l .damage_classes, X : PLX)
JSL DamageClassCalc
BRA + : NOP #29 : +
;--------------------------------------------------------------------------------
org $0882D4 ; Bank08.asm@445 (PHX : TYX : ... )
JSL Utility_CheckAncillaOverlapWithSprite
BRA + : NOP #5 : +
;--------------------------------------------------------------------------------
org $088DB1 ; Bank08.asm@1207 (PHY : PHX : TYX : ... )
JSL Utility_CheckAncillaOverlapWithSprite
BRA + : NOP #7 : +
;--------------------------------------------------------------------------------
org $08E252 ; Bank08.asm@1770 (PHY : PHX : TYX : ... )
JSL Utility_CheckAncillaOverlapWithSprite
BRA + : NOP #7 : +
;--------------------------------------------------------------------------------
org $0882E8 ; Bank08.asm@456 (LDA $0DB0, Y : CMP.b #$03)
JSL Utility_CheckHelmasaurKingCollision
NOP
;--------------------------------------------------------------------------------
org $06ED94 ; Bank06.asm@4866 (LDA $0E60, X : AND.b #$40)
JSL Utility_CheckImpervious
NOP
;--------------------------------------------------------------------------------
org $068F94 ; sprite_prep.asm@1984 (INC $0BA0, X : JSL Sprite_InitializedSegmented)
JSL AllowBombingMoldorm
BRA + : NOP : +
;--------------------------------------------------------------------------------
org $06892F ; sprite_prep.asm@548 (LDA $0D00, X : SUB #$0C : STA $0D00, X : ...)
JSL AllowBombingBarrier
RTS : NOP #7
;--------------------------------------------------------------------------------
org $0DE4BF ; equipment.asm@1247 (LDA $7EF343 : AND.w #$00FF : BEQ .gotNoBombs : ...)
JSL DrawBombInMenu
BRA + : NOP #13 : +
;--------------------------------------------------------------------------------
org $0DFB6A ; headsup_display@727 (CPX #$0004 : BNE .bombsNotEquipped : LDA #$0001)
JSL DrawBombInYBox
BRA + : NOP #2 : +
;--------------------------------------------------------------------------------
org $0DEE05 ; equipment.asm@2065 (LDA $7EF359 : AND.w #$00FF : CMP.w #$00FF : ...)
JSL DrawSwordInMenu
BRA + : NOP #16 : +
;--------------------------------------------------------------------------------
org $0DFA92 ; headsup_display.asm@622 (PDB : LDA.w #$0149 : ...)
JSL DrawBombOnHud
BRA + : NOP #8 : +
;--------------------------------------------------------------------------------
org $089EF8 ; ancilla_bomb@1438 (LDA.w #$04 : STA $0B)
JSL SetBombSpriteColor
;--------------------------------------------------------------------------------
; bomb icons with numbers
org $0DFC51 ; we freed this up earlier in hooks; probably shouldn't use it but *shrug*
db $F5, $20, $F5, $20, $F5, $20, $F5, $20
db $B2, $3C, $B3, $3C, $C2, $3C, $17, $3C
db $B2, $2C, $B3, $2C, $C2, $2C, $18, $2C
db $B2, $24, $B3, $24, $C2, $24, $19, $24
db $B2, $28, $B3, $28, $C2, $28, $1A, $28
db $B2, $28, $B3, $28, $C2, $28, $1B, $28
; bomb icons without numbers
; $0DFC81
db $F5, $20, $F5, $20, $F5, $20, $F5, $20
db $B2, $3C, $B3, $3C, $C2, $3C, $C2, $7C
db $B2, $2C, $B3, $2C, $C2, $2C, $C2, $6C
db $B2, $24, $B3, $24, $C2, $24, $C2, $64
db $B2, $28, $B3, $28, $C2, $28, $C2, $68
db $B2, $28, $B3, $28, $C2, $28, $C2, $68
warnpc $0DFC51+197 ; we only filled in 197 NOPs so don't overwrite past that
;--------------------------------------------------------------------------------
org $1EDCF8 ; bank_1E.asm@16086 (LDX $0202 : ...)
JSL SetBeeType
BRA + : NOP #15 : +
;--------------------------------------------------------------------------------
org $1EB5E8 ; bank_1E.asm@9387 (LDA #$03 : STA $0D80, X)
JSL ArrghusBoing
;--------------------------------------------------------------------------------
org $1EDFAF ; bank_1E.asm@16607 (.next_sprite)
JSL BeeCheckTarget
BCS .bee_valid_target
BRA .bee_unsuitable_target
NOP #48
.bee_unsuitable_target
skip 11
.bee_valid_target
;--------------------------------------------------------------------------------
org $07F889 ; free rom from F877 - F88F; the starting part of this is used in quadrant glitch fix in overworld fork, however.
Link_UseItemLong:
PER .done-1
JMP.w ($0000)
.done
RTL
warnpc $07F890
;--------------------------------------------------------------------------------
org $06F2DC ; bank_06.asm@22763 (LDA.w $037A : AND.b #$10)
JSL CheckBugNet : NOP
org $06EB91 ; bank_06.asm@21178 (LDA.w $037A : AND.b #$10)
JSL CheckBugNet : NOP
;--------------------------------------------------------------------------------
org $06ED77 ; bank_06.asm@21597 (LDA.w $0301 : AND.b #$0A : ...)
JSL SetHammerClass
BRA + : NOP #7 : +
;--------------------------------------------------------------------------------
;================================================================================
; Variable Ganon Vulnerability
;--------------------------------------------------------------------------------
org $08BBD4 ; ancilla_magic_powder.asm@253 (LDA #$0A : JSL Ancilla_CheckSpriteDamage.preset_class)
JSL Ganon_CheckPowderVulnerability
NOP #2
;--------------------------------------------------------------------------------
org $1D8F4E ; sprite_ganon.asm@325 (LDA $04C5 : CMP #$02)
JSL Ganon_CheckInvincible
NOP
;--------------------------------------------------------------------------------
org $0DD628 ; Bank0D.asm@1266 (LDA $0B6B, Y : AND #$02)
JSL CheckBeeBoss
NOP
;--------------------------------------------------------------------------------
org $0DD676 ; Bank0D.asm@1303 (TYX : JSL Ancilla_CheckSpriteDamage.preset_class)
JSL Ganon_CheckBeeVulnerability
NOP
;--------------------------------------------------------------------------------
;================================================================================
; Pseudo-Sword Mode
;--------------------------------------------------------------------------------
org $06ED70 ; Bank06.asm@4842 (LDA $06ED39, X : STA $0CF2)
JSL StoreSwordDamage
;================================================================================
; Item-On-B
;--------------------------------------------------------------------------------
org $0DEB3C
JSL DrawBIndicator : BRA + : NOP #3 : +
;--------------------------------------------------------------------------------
org $079CE6 ; Bank07.asm@4632 (LDA #$80 : TSB $3A : ...)
JSL UseItem
BCC + : RTS : +
JSR $9C56
NOP #1
;--------------------------------------------------------------------------------
;================================================================================
; Fix quadrant glitch
org $07A879
JSR SwordSpinQuadrantFix
org $07F877 ; free rom
SwordSpinQuadrantFix:
LDA.l AllowAccidentalMajorGlitch
BEQ ++
JMP.w $07E8D9 ; HandleIndoorCameraAndDoors
++ RTS
warnpc $07F88C ; hammer-on-B hook uses the end of this free rom section
;================================================================================ ;================================================================================
org $01C4B8 : JSL FixJingleGlitch org $01C4B8 : JSL FixJingleGlitch
@@ -2914,44 +3081,37 @@ org $028818
org $02A463 org $02A463
JSL OnMenuLoad JSL OnMenuLoad
;================================================================================
; Terrorpin AI fix
;--------------------------------------------------------------------------------
org $1EB2B1 ; sprite_terrorpin.asm(57) : AND.b #$03 : STA $0DE0, X ; 5 bytes
JSL FixTerrorpin ; 4 bytes
NOP ; 1 byte
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
; Text Renderer ; Text Renderer
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
if !FEATURE_NEW_TEXT if !FEATURE_NEW_TEXT
org $0EF51B org $0EF51B
JML RenderCharExtended JML RenderCharExtended
org $0EF520 org $0EF520
RenderCharExtended_returnOriginal: RenderCharExtended_returnOriginal:
org $0EF567 org $0EF567
RenderCharExtended_returnUncompressed: RenderCharExtended_returnUncompressed:
org $0EF356 org $0EF356
JSL RenderCharLookupWidth JSL RenderCharLookupWidth
org $0EF3BA org $0EF3BA
JSL RenderCharLookupWidth JSL RenderCharLookupWidth
org $0EF48E org $0EF48E
JML RenderCharLookupWidthDraw JML RenderCharLookupWidthDraw
org $0EF499 org $0EF499
RenderCharLookupWidthDraw_return: RenderCharLookupWidthDraw_return:
org $0EF6AA org $0EF6AA
JML RenderCharToMapExtended JML RenderCharToMapExtended
org $0EF6C2 org $0EF6C2
RenderCharToMapExtended_return: RenderCharToMapExtended_return:
org $0EFA50 org $0EFA50
JSL RenderCharSetColorExtended JSL RenderCharSetColorExtended
org $0EEE5D org $0EEE5D
JSL RenderCharSetColorExtended_init JSL RenderCharSetColorExtended_init
org $0EF285 org $0EF285
JSL RenderCharSetColorExtended_close : NOP JSL RenderCharSetColorExtended_close : NOP
endif endif
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
; Back of tavern fixes ; Back of tavern fixes

View File

@@ -30,9 +30,10 @@
ProcessMenuButtons: ProcessMenuButtons:
;LDA #$FD : STA InventoryTracking ; DEBUG MODE ;LDA #$FD : STA InventoryTracking ; DEBUG MODE
;LDA $F6 : BIT #$20 : BNE .l_pressed ; check for P1 L-button ;LDA $F6 : BIT #$20 : BNE .l_pressed ; check for P1 L-button
LDA $F4 : BIT #$40 : BNE .y_pressed ; check for P1 Y-button LDA.b $F4 : BIT.b #$40 : BNE .y_pressed ; check for P1 Y-button
BIT #$20 : BNE .sel_pressed ; check for P1 Select button BIT.b #$20 : BNE .sel_pressed ; check for P1 Select button
LDA $F0 : BIT #$20 : BNE .sel_held BIT.b #$80 : BNE .b_pressed ; check for P1 B-button
LDA.b $F0 : BIT.b #$20 : BNE .sel_held
.sel_unheld .sel_unheld
LDA HudFlag : AND #$20 : BEQ + LDA HudFlag : AND #$20 : BEQ +
LDA HudFlag : AND #$DF : STA HudFlag ; select is released, unset hud flag LDA HudFlag : AND #$DF : STA HudFlag ; select is released, unset hud flag
@@ -48,6 +49,18 @@ RTL
LDA HudFlag : ORA #$20 : STA HudFlag ; set hud flag LDA HudFlag : ORA #$20 : STA HudFlag ; set hud flag
LDA.b #$20 : STA $012F ; menu select sound LDA.b #$20 : STA $012F ; menu select sound
JSL.l ResetEquipment JSL.l ResetEquipment
RTL
.b_pressed
JSR CanPressB : BCC .b_error
LDA.w $0202 : CMP.l ItemOnB : BNE .set_b
LDA.b #$00
.set_b
STA.l ItemOnB
BRA .b_done
.b_error
LDA.b #$3C : STA.w $012E ; error sound
.b_done
SEC
RTL RTL
.y_pressed ; Note: used as entry point by quickswap code. Must preserve X. .y_pressed ; Note: used as entry point by quickswap code. Must preserve X.
LDA.b #$10 : STA $0207 LDA.b #$10 : STA $0207
@@ -115,6 +128,27 @@ RTL
SEC SEC
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
CanPressB:
PHY : PHP : SEP #$30
LDA.l AllowedItemOnB : BEQ .no
CMP.b #$FF : BEQ .skip_allow_check
CMP.w $0202 : BNE .no
.skip_allow_check
PHX
LDA.w $0202 : TAX
LDA.l ValidItemOnB, X : BNE .plx_and_no
PLX
PLP : PLY
SEC
RTS
.plx_and_no
PLX
.no
PLP : PLY
CLC
RTS
;--------------------------------------------------------------------------------
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
;ProcessBottleMenu: ;ProcessBottleMenu:
@@ -146,7 +180,7 @@ RTL
OpenBottleMenu: OpenBottleMenu:
LDA $F6 : AND #$40 : BEQ .x_not_pressed ; skip if X is not down LDA $F6 : AND #$40 : BEQ .x_not_pressed ; skip if X is not down
LDA.b #$10 : STA $0207 ; set 16 frame cool off LDA.b #$10 : STA $0207 ; set 16 frame cool off
LDA.b #$20 : STA $012F ; make menu sound LDA.b #$20 : STA $012F ; make menu sound
LDA.b #$07 : STA $0200 ; thing we wrote over - opens bottle menu LDA.b #$07 : STA $0200 ; thing we wrote over - opens bottle menu
.x_not_pressed .x_not_pressed
RTL RTL
@@ -159,10 +193,10 @@ CloseBottleMenu:
LDA $F6 : AND #$40 : BEQ .x_not_pressed ; skip if X is not down LDA $F6 : AND #$40 : BEQ .x_not_pressed ; skip if X is not down
LDA.b #$10 : STA $0207 ; set 16 frame cool off LDA.b #$10 : STA $0207 ; set 16 frame cool off
LDA.b #$20 : STA $012F ; make menu sound LDA.b #$20 : STA $012F ; make menu sound
INC $0200 ; return to normal menu INC $0200 ; return to normal menu
STZ $0205 STZ $0205
LDA #$00 LDA #$00
RTL RTL
@@ -354,32 +388,32 @@ AddInventory:
+ +
CPY.b #$00 : BNE + ; Fighter's Sword & Fighter's Shield CPY.b #$00 : BNE + ; Fighter's Sword & Fighter's Shield
LDX #$01 LDX #$01
JSR .incrementSword JSR .incrementSword
JSR .incrementShield JSR .incrementShield
JMP .done JMP .done
+ CPY.b #$01 : BNE + ; Master Sword + CPY.b #$01 : BNE + ; Master Sword
LDX #$02 LDX #$02
JSR .incrementSword JSR .incrementSword
JMP .done JMP .done
+ CPY.b #$02 : BNE + ; Tempered Sword + CPY.b #$02 : BNE + ; Tempered Sword
LDX #$03 LDX #$03
JSR .incrementSword JSR .incrementSword
JMP .done JMP .done
+ CPY.b #$03 : BNE + ; Golden Sword + CPY.b #$03 : BNE + ; Golden Sword
LDX #$04 LDX #$04
JSR .incrementSword JSR .incrementSword
JMP .done JMP .done
+ CPY.b #$04 : BNE + ; Fighter's Shield + CPY.b #$04 : BNE + ; Fighter's Shield
LDX #$01 LDX #$01
JSR .incrementShield JSR .incrementShield
JMP .done JMP .done
+ CPY.b #$05 : BNE + ; Red Shield + CPY.b #$05 : BNE + ; Red Shield
LDX #$02 LDX #$02
JSR .incrementShield JSR .incrementShield
JMP .done JMP .done
+ CPY.b #$06 : BNE + ; Mirror Shield + CPY.b #$06 : BNE + ; Mirror Shield
LDX #$03 LDX #$03
JSR .incrementShield JSR .incrementShield
JMP .done JMP .done
+ CPY.b #$07 : !BLT + ; Items $07 - $0D + CPY.b #$07 : !BLT + ; Items $07 - $0D
@@ -420,16 +454,16 @@ AddInventory:
JSR .incrementY JSR .incrementY
JMP .done JMP .done
+ CPY.b #$22 : BNE + ; Blue Mail + CPY.b #$22 : BNE + ; Blue Mail
LDX #$01 LDX #$01
JSR .incrementMail JSR .incrementMail
+ CPY.b #$23 : BNE + ; Red Mail + CPY.b #$23 : BNE + ; Red Mail
LDX #$02 LDX #$02
JSR .incrementMail JSR .incrementMail
+ CPY.b #$24 : BNE + ; Small Key + CPY.b #$24 : BNE + ; Small Key
JSR .incrementKey JSR .incrementKey
JMP .done JMP .done
+ CPY.b #$25 : BNE + ; Compass + CPY.b #$25 : BNE + ; Compass
JSL MaybeFlagCompassTotalPickup JSL MaybeFlagCompassTotalPickup
JSR .incrementCompass JSR .incrementCompass
JMP .done JMP .done
+ CPY.b #$26 : BNE + ; Liar Heart (Container) + CPY.b #$26 : BNE + ; Liar Heart (Container)
@@ -460,7 +494,7 @@ AddInventory:
+ CPY.b #$37 : !BLT + ; Items $37 - $39 - Pendants + CPY.b #$37 : !BLT + ; Items $37 - $39 - Pendants
CPY.b #$3A : !BGE + CPY.b #$3A : !BGE +
JSR .incrementPendant JSR .incrementPendant
JSR .setDungeonCompletion JSR .setDungeonCompletion
JMP .done JMP .done
+ CPY.b #$3A : !BLT + ; Items $3A - $3B - Bow & Silver Arrows + CPY.b #$3A : !BLT + ; Items $3A - $3B - Bow & Silver Arrows
CPY.b #$3C : !BGE + CPY.b #$3C : !BGE +
@@ -480,7 +514,7 @@ AddInventory:
JSR .incrementY JSR .incrementY
JMP .done JMP .done
+ CPY.b #$49 : BNE + ; Fighter's Sword + CPY.b #$49 : BNE + ; Fighter's Sword
LDX #$01 LDX #$01
JSR .incrementSword JSR .incrementSword
JMP .done JMP .done
+ CPY.b #$4A : BNE + ; Flute (Active) + CPY.b #$4A : BNE + ; Flute (Active)
@@ -500,15 +534,15 @@ AddInventory:
JSR .incrementCapacity JSR .incrementCapacity
JMP .done JMP .done
+ CPY.b #$50 : BNE + ; Master Sword (Safe) + CPY.b #$50 : BNE + ; Master Sword (Safe)
LDX #$02 LDX #$02
JSR .incrementSword JSR .incrementSword
JMP .done JMP .done
+ CPY.b #$51 : BNE + ; 5 Bomb Capacity Upgrade + CPY.b #$51 : BNE + ; 5 Bomb Capacity Upgrade
LDX #$02 LDX #$02
JSR .maybeIncrementBombs JSR .maybeIncrementBombs
JMP .done JMP .done
+ CPY.b #$52 : BNE + ; 10 Bomb Capacity Upgrade + CPY.b #$52 : BNE + ; 10 Bomb Capacity Upgrade
LDX #$02 LDX #$02
JSR .maybeIncrementBombs JSR .maybeIncrementBombs
JMP .done JMP .done
+ CPY.b #$51 : !BLT + ; Items $51 - $54 - Capacity Upgrades + CPY.b #$51 : !BLT + ; Items $51 - $54 - Capacity Upgrades
@@ -519,15 +553,15 @@ AddInventory:
JSR .incrementBow JSR .incrementBow
JMP .done JMP .done
+ CPY.b #$5E : BNE + ; Progressive Sword + CPY.b #$5E : BNE + ; Progressive Sword
LDA SwordEquipment : INC : TAX LDA SwordEquipment : INC : TAX
JSR .incrementSword JSR .incrementSword
JMP .done JMP .done
+ CPY.b #$5F : BNE + ; Progressive Shield + CPY.b #$5F : BNE + ; Progressive Shield
LDA ShieldEquipment : INC : TAX LDA ShieldEquipment : INC : TAX
JSR .incrementShield JSR .incrementShield
JMP .done JMP .done
+ CPY.b #$60 : BNE + ; Progressive Armor + CPY.b #$60 : BNE + ; Progressive Armor
LDA ArmorEquipment : INC : TAX LDA ArmorEquipment : INC : TAX
JSR .incrementMail JSR .incrementMail
JMP .done JMP .done
+ CPY.b #$61 : BNE + ; Progressive Lifting Glove + CPY.b #$61 : BNE + ; Progressive Lifting Glove
@@ -546,17 +580,27 @@ AddInventory:
LDA.w AddReceivedItemExpanded_item_target_addr+$100, X : STA.b $00 LDA.w AddReceivedItemExpanded_item_target_addr+$100, X : STA.b $00
LDA.w AddReceivedItemExpanded_item_target_addr+$101, X : STA.b $01 LDA.w AddReceivedItemExpanded_item_target_addr+$101, X : STA.b $01
CPY.b #$90 : !BGE + CPY.b #$90 : !BGE +
JSL MaybeFlagCompassTotalPickup JSL MaybeFlagCompassTotalPickup
JSR .incrementCompass JSR .incrementCompass
JMP .done BRA .done
+ CPY.b #$90 : !BLT + ; Items $90 - $9F - Free Big Keys + CPY.b #$90 : !BLT + ; Items $90 - $9F - Free Big Keys
CPY.b #$A0 : !BGE + CPY.b #$A0 : !BGE +
JSR .incrementBigKey JSR .incrementBigKey
JMP .done BRA .done
+ CPY.b #$A0 : !BLT + ; Items $A0 - $AF - Free Small Keys + CPY.b #$A0 : !BLT + ; Items $A0 - $AF - Free Small Keys
CPY.b #$B0 : !BGE + CPY.b #$B0 : !BGE +
JSR .incrementKey JSR .incrementKey
JMP .done BRA .done
+ CPY.b #$C0 : BEQ .special_weapon ; Item $C0 - Bomb Upgrade
CPY.b #$C1 : BEQ .special_weapon ; Item $C1 - Cane Upgrade
CPY.b #$C2 : BEQ .special_weapon ; Item $C2 - Bug Net Upgrade
BRA .done
.special_weapon
JSR .stampSword ; update "first bomb" timestamp
LDA.l SpecialWeaponLevel ; get current bomb level
CMP #$05 : !BGE ++ ; check if already maxed
INC : STA.l SpecialWeaponLevel
++ BRA .done
+ +
.done .done
PLP : PLX : PLA PLP : PLX : PLA
@@ -606,21 +650,21 @@ RTS
.incrementSword .incrementSword
JSR .stampSword JSR .stampSword
LDA HighestSword LDA HighestSword
INC : STA $04 : CPX $04 : !BLT + ; don't increment unless we're getting a better sword INC : STA $04 : CPX $04 : !BLT + ; don't increment unless we're getting a better sword
TXA : STA HighestSword TXA : STA HighestSword
+ +
RTS RTS
.incrementShield .incrementShield
LDA HighestShield LDA HighestShield
INC : STA $04 : CPX $04 : !BLT + ; don't increment unless we're getting a better shield INC : STA $04 : CPX $04 : !BLT + ; don't increment unless we're getting a better shield
TXA : STA HighestShield TXA : STA HighestShield
+ +
RTS RTS
.incrementBow .incrementBow
LDA BowEquipment : BNE .dontCount ; Don't increment Y item count for extra bows LDA BowEquipment : BNE .dontCount ; Don't increment Y item count for extra bows
.incrementY .incrementY
LDA YAItemCounter : !ADD #$08 : STA YAItemCounter LDA YAItemCounter : !ADD #$08 : STA YAItemCounter
.dontCount .dontCount
@@ -653,11 +697,10 @@ RTS
RTS RTS
.incrementMail .incrementMail
LDA HighestMail
LDA HighestMail INC : STA $04 : CPX $04 : !BLT + ; don't increment unless we're getting a better mail
INC : STA $04 : CPX $04 : !BLT + ; don't increment unless we're getting a better mail TXA : STA HighestMail
TXA : STA HighestMail +
+
RTS RTS
.incrementKeyLong .incrementKeyLong
@@ -665,7 +708,7 @@ RTS
RTL RTL
.incrementKey .incrementKey
LDA SmallKeyCounter : INC : STA SmallKeyCounter LDA SmallKeyCounter : INC : STA SmallKeyCounter
RTS RTS
.incrementCompass .incrementCompass
@@ -677,7 +720,7 @@ RTS
RTS RTS
.incrementGTowerPreBigKey .incrementGTowerPreBigKey
LDA PreGTBKLocations : INC : STA PreGTBKLocations LDA PreGTBKLocations : INC : STA PreGTBKLocations
RTS RTS
.maybeIncrementBombs .maybeIncrementBombs
@@ -696,10 +739,17 @@ RTS
RTL RTL
.incrementBossSword .incrementBossSword
LDA SwordEquipment LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BEQ +
CMP.b #$03 : BEQ +
CMP.b #$04 : BEQ +
CMP.b #$05 : BEQ +
CMP.b #$08 : BEQ +
LDA SwordEquipment : BRA ++
+ : LDA SpecialWeaponLevel
++
BNE + : - BNE + : -
LDA SwordlessBossKills : INC : STA SwordlessBossKills LDA SwordlessBossKills : INC : STA SwordlessBossKills
RTS RTS
+ CMP #$FF : BEQ - + CMP #$FF : BEQ -
+ CMP #$01 : BNE + + CMP #$01 : BNE +
%TopHalf(SwordBossKills) : RTS %TopHalf(SwordBossKills) : RTS
@@ -771,6 +821,7 @@ AddYMarker:
+ CMP.w #$10 : BEQ .drawJarMarker + CMP.w #$10 : BEQ .drawJarMarker
.drawNormal .drawNormal
JSR CanPressB : BCS .drawBBubble
LDA.w #$7C60 LDA.w #$7C60
BRA .drawTile BRA .drawTile
@@ -779,12 +830,20 @@ AddYMarker:
LDA $0207 : AND.w #$0020 : BNE .drawXBubble LDA $0207 : AND.w #$0020 : BNE .drawXBubble
.drawYBubble .drawYBubble
JSR CanPressB : BCC .drawY
LDA.w $0207 : AND.w #$0020 : BNE .drawBBubble
.drawY
LDA.w #$3D4F LDA.w #$3D4F
BRA .drawTile BRA .drawTile
.drawXBubble .drawXBubble
JSR MakeCircleBlue JSR MakeCircleBlue
LDA.w #$2D3E LDA.w #$2D3E
BRA .drawTile
.drawBBubble
JSR MakeCircleRed
LDA.w #$293F
.drawTile .drawTile
STA $FFC4, Y STA $FFC4, Y
@@ -796,22 +855,40 @@ RTL
; this is horrible, make it better ; this is horrible, make it better
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
MakeCircleBlue: MakeCircleBlue:
LDA $FFC0, Y : AND.w #$EFFF : STA $FFC0, Y LDA $FFC0, Y : AND.w #$EFFF : STA $FFC0, Y
LDA $FFC2, Y : AND.w #$EFFF : STA $FFC2, Y LDA $FFC2, Y : AND.w #$EFFF : STA $FFC2, Y
LDA $FFFE, Y : AND.w #$EFFF : STA $FFFE, Y LDA $FFFE, Y : AND.w #$EFFF : STA $FFFE, Y
LDA $0004, Y : AND.w #$EFFF : STA $0004, Y LDA $0004, Y : AND.w #$EFFF : STA $0004, Y
LDA $003E, Y : AND.w #$EFFF : STA $003E, Y LDA $003E, Y : AND.w #$EFFF : STA $003E, Y
LDA $0044, Y : AND.w #$EFFF : STA $0044, Y LDA $0044, Y : AND.w #$EFFF : STA $0044, Y
LDA $0080, Y : AND.w #$EFFF : STA $0080, Y LDA $0080, Y : AND.w #$EFFF : STA $0080, Y
LDA $0082, Y : AND.w #$EFFF : STA $0082, Y LDA $0082, Y : AND.w #$EFFF : STA $0082, Y
LDA $FFBE, Y : AND.w #$EFFF : STA $FFBE, Y LDA $FFBE, Y : AND.w #$EFFF : STA $FFBE, Y
LDA $FFC4, Y : AND.w #$EFFF : STA $FFC4, Y LDA $FFC4, Y : AND.w #$EFFF : STA $FFC4, Y
LDA $0084, Y : AND.w #$EFFF : STA $0084, Y LDA $0084, Y : AND.w #$EFFF : STA $0084, Y
LDA $007E, Y : AND.w #$EFFF : STA $007E, Y LDA $007E, Y : AND.w #$EFFF : STA $007E, Y
RTS
MakeCircleRed:
LDA.w $FFC0, Y : AND.w #$EBFF : STA.w $FFC0, Y
LDA.w $FFC2, Y : AND.w #$EBFF : STA.w $FFC2, Y
LDA.w $FFFE, Y : AND.w #$EBFF : STA.w $FFFE, Y
LDA.w $0004, Y : AND.w #$EBFF : STA.w $0004, Y
LDA.w $003E, Y : AND.w #$EBFF : STA.w $003E, Y
LDA.w $0044, Y : AND.w #$EBFF : STA.w $0044, Y
LDA.w $0080, Y : AND.w #$EBFF : STA.w $0080, Y
LDA.w $0082, Y : AND.w #$EBFF : STA.w $0082, Y
LDA.w $FFBE, Y : AND.w #$EBFF : STA.w $FFBE, Y
LDA.w $FFC4, Y : AND.w #$EBFF : STA.w $FFC4, Y
LDA.w $0084, Y : AND.w #$EBFF : STA.w $0084, Y
LDA.w $007E, Y : AND.w #$EBFF : STA.w $007E, Y
RTS RTS
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -938,8 +1015,8 @@ RTL
; PrepItemScreenBigKey: ; PrepItemScreenBigKey:
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
PrepItemScreenBigKey: PrepItemScreenBigKey:
STZ $02 STZ $02
STZ $03 STZ $03
REP #$30 ; thing we wrote over - set 16-bit accumulator REP #$30 ; thing we wrote over - set 16-bit accumulator
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -1040,9 +1117,9 @@ CollectPowder:
LDA WitchItem_Player : STA !MULTIWORLD_ITEM_PLAYER_ID LDA WitchItem_Player : STA !MULTIWORLD_ITEM_PLAYER_ID
LDA.b #$01 : STA.l !SHOP_ENABLE_COUNT LDA.b #$01 : STA.l !SHOP_ENABLE_COUNT
PLA PLA
STZ $02E9 ; item from NPC STZ $02E9 ; item from NPC
JSL.l Link_ReceiveItem JSL.l Link_ReceiveItem
PHA : LDA.b #$00 : STA.l !SHOP_ENABLE_COUNT : PLA PHA : LDA.b #$00 : STA.l !SHOP_ENABLE_COUNT : PLA
;JSL.l FullInventoryExternal ;JSL.l FullInventoryExternal
JSL.l ItemSet_Powder JSL.l ItemSet_Powder
RTL RTL
@@ -1067,14 +1144,14 @@ RTL
DrawMagicHeader: DrawMagicHeader:
LDA MagicConsumption : AND.w #$00FF : CMP.w #$0002 : BEQ .quarterMagic LDA MagicConsumption : AND.w #$00FF : CMP.w #$0002 : BEQ .quarterMagic
.halfMagic .halfMagic
LDA.w #$28F7 : STA $7EC704 LDA.w #$28F7 : STA $7EC704
LDA.w #$2851 : STA $7EC706 LDA.w #$2851 : STA $7EC706
LDA.w #$28FA : STA $7EC708 LDA.w #$28FA : STA $7EC708
RTL RTL
.quarterMagic .quarterMagic
LDA.w #$28F7 : STA $7EC704 LDA.w #$28F7 : STA $7EC704
LDA.w #$2800 : STA $7EC706 LDA.w #$2800 : STA $7EC706
LDA.w #$2801 : STA $7EC708 LDA.w #$2801 : STA $7EC708
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -1123,7 +1200,7 @@ RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
SpawnShovelItem: SpawnShovelItem:
LDA $03FC : BEQ + LDA $03FC : BEQ +
JSL DiggingGameGuy_AttemptPrizeSpawn JSL DiggingGameGuy_AttemptPrizeSpawn
JMP .skip JMP .skip
+ +
@@ -1181,12 +1258,12 @@ RTL
{ {
.x_speeds .x_speeds
db $F0 db $F0
db $10 db $10
.x_offsets .x_offsets
db $00 db $00
db $13 db $13
} }
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------

98
item_on_b.asm Normal file
View File

@@ -0,0 +1,98 @@
;--------------------------------------------------------------------------------
ItemMenuLocations:
dw $11C8 ; Bow
dw $11CE ; Boomerang
dw $11D4 ; Hookshot
dw $11DA ; Bombs
dw $11E0 ; Powder / Mushroom
dw $1288 ; Fire Rod
dw $128E ; Ice Rod
dw $1294 ; Bombos
dw $129A ; Ether
dw $12A0 ; Quake
dw $1348 ; Lamp
dw $134E ; Hammer
dw $1354 ; Flute / Shovel
dw $135A ; Bug Net
dw $1360 ; Book
dw $1408 ; Bottles
dw $140E ; Somaria
dw $1414 ; Byrna
dw $141A ; Cape
dw $1420 ; Mirror
DrawBIndicator:
LDA.l ItemOnB : AND.w #$00FF : BEQ .done
DEC : ASL : TAX
LDA.l ItemMenuLocations, X : TAX
LDA.w #$3D3B
STA.w $0042, X
.done ; what we wrote over
LDA.w $0202
AND.w #$00FF
DEC
ASL
TAX
RTL
;--------------------------------------------------------------------------------
ItemHandlerLocs:
dw $A003 ; Bow
dw $A0B8 ; Boomerang
dw $AB23 ; Hookshot
dw $A139 ; Bombs
dw $FFFF ; Powder / Mushroom
dw $9EEC ; Fire Rod
dw $9EEC ; Ice Rod
dw $A55E ; Bombos
dw $A489 ; Ether
dw $A640 ; Quake
dw $A246 ; Lamp
dw $9F82 ; Hammer
dw $FFFF ; Flute / Shovel
dw $AFEE ; Bug Net
dw $A46E ; Book
dw $FFFF ; Bottles
dw $AEBB ; Somaria
dw $FFFF ; Byrna
dw $FFFF ; Cape
dw $A913 ; Mirror
ValidItemOnB:
db $FF
db $00, $00, $00, $00, $FF
db $00, $00, $00, $00, $00
db $00, $00, $FF, $00, $00
db $FF, $00, $FF, $FF, $00
UseItem:
JSL CheckDetonateBomb : BCS .normal
LDA.l ItemOnB : BEQ .normal
TAX
LDA.b $6C : BNE .prevent_swing
CPX.b #$11 : BNE .not_somaria
LDA.w $02F5 : BNE .prevent_swing
.not_somaria
LDA.l ValidItemOnB, X : BNE .normal
LDA.b $3A : ORA.b #$40 : STA.b $3A
LDA.l $0DFA35, X : STA.w $0304
CPX.b #$06 : BEQ .fire_rod
CPX.b #$07 : BNE .not_rod
.ice_rod
LDA.b #$02 : STA.w $0307
BRA .not_rod
.fire_rod
LDA.b #$01 : STA.w $0307
.not_rod
TXA : DEC : ASL : TAX
LDA.l ItemHandlerLocs+1, X : STA.b $01
LDA.l ItemHandlerLocs, X : STA.b $00
JSL Link_UseItemLong
.prevent_swing
SEC
RTL
.normal
LDA.b #$80 : TSB.b $3A
LDA.b #$01 : TSB.b $50
CLC
RTL

View File

@@ -9,29 +9,29 @@ RTL
ItemDowngradeFixMain: ItemDowngradeFixMain:
JSL.l AddInventory JSL.l AddInventory
BMI .dontWrite ; thing we wrote over part 1 BMI .dontWrite ; thing we wrote over part 1
CPY.b #$1B : BEQ .isPowerGloves ; Power Gloves CPY.b #$1B : BEQ .isPowerGloves ; Power Gloves
CPY.b #$05 : BEQ .isRedShield ; Red Shield CPY.b #$05 : BEQ .isRedShield ; Red Shield
CPY.b #$04 : BEQ .isBlueShield ; Blue Shield CPY.b #$04 : BEQ .isBlueShield ; Blue Shield
CPY.b #$0C : BEQ .isBlueBoomerang ; Blue Boomerang CPY.b #$0C : BEQ .isBlueBoomerang ; Blue Boomerang
CPY.b #$0B : BEQ .isBow ; Bow CPY.b #$0B : BEQ .isBow ; Bow
CPY.b #$3A : BEQ .isBowAndArrows ; Bow CPY.b #$3A : BEQ .isBowAndArrows ; Bow
CPY.b #$49 : BEQ .isSword ; Fighter's Sword CPY.b #$49 : BEQ .isSword ; Fighter's Sword
CPY.b #$01 : BEQ .isSword ; Master Sword CPY.b #$01 : BEQ .isSword ; Master Sword
CPY.b #$50 : BEQ .isSword ; Master Sword (Safe) CPY.b #$50 : BEQ .isSword ; Master Sword (Safe)
CPY.b #$02 : BEQ .isSword ; Tempered Sword CPY.b #$02 : BEQ .isSword ; Tempered Sword
CPY.b #$3B : BEQ .isSilverArrowBow ; Silver Arrow Bow CPY.b #$3B : BEQ .isSilverArrowBow ; Silver Arrow Bow
CPY.b #$2A : BEQ .isRedBoomerang ; Red Boomerang CPY.b #$2A : BEQ .isRedBoomerang ; Red Boomerang
CPY.b #$0D : BEQ .isMagicPowder ; Magic Powder CPY.b #$0D : BEQ .isMagicPowder ; Magic Powder
CPY.b #$14 : BEQ .isFlute ; Flute CPY.b #$14 : BEQ .isFlute ; Flute
CPY.b #$13 : BEQ .isShovel ; Shovel CPY.b #$13 : BEQ .isShovel ; Shovel
CPY.b #$29 : BEQ .isMushroom ; Mushroom CPY.b #$29 : BEQ .isMushroom ; Mushroom
CPY.b #$00 : BEQ .isUncleSwordShield ; Fighter's Sword & Shield CPY.b #$00 : BEQ .isUncleSwordShield ; Fighter's Sword & Shield
.done .done
STA [$00] ; thing we wrote over part 2 STA [$00] ; thing we wrote over part 2
.dontWrite .dontWrite
RTS RTS
@@ -60,7 +60,7 @@ RTS
RTS RTS
.isSword .isSword
PHA PHA
LDA HighestSword : STA $04 LDA HighestSword : STA $04
TYA ; load sword item TYA ; load sword item
CMP.b #$49 : BNE + : LDA.b #$00 : + ; convert extra fighter's sword to normal one CMP.b #$49 : BNE + : LDA.b #$00 : + ; convert extra fighter's sword to normal one
CMP.b #$50 : BNE + : LDA.b #$01 : + ; convert extra master sword to normal one CMP.b #$50 : BNE + : LDA.b #$01 : + ; convert extra master sword to normal one
@@ -71,11 +71,11 @@ RTS
+ +
PLA PLA
JMP .done JMP .done
.isUncleSwordShield .isUncleSwordShield
PHA PHA
LDA HighestSword : STA [$00] ; already set to 1 if we had no sword, always keep highest LDA HighestSword : STA [$00] ; already set to 1 if we had no sword, always keep highest
INC $00 INC $00
LDA HighestShield : STA [$00] LDA HighestShield : STA [$00]
PLA PLA
RTS RTS
;================================================================================ ;================================================================================

View File

@@ -3,18 +3,24 @@ NewDrawHud:
;================================================================================ ;================================================================================
; Draw bomb count ; Draw bomb count
!BOMBCOUNT_DRAW_ADDRESS = "$7EC75A" !BOMBCOUNT_DRAW_ADDRESS = "$7EC75A"
!INFINITE_BOMBS = "$7F50C9"
;================================================================================ ;================================================================================
LDA !INFINITE_BOMBS : BNE .infinite_bombs LDA InfiniteBombsModifier : BNE .infinite_bombs
.finite_bombs .finite_bombs
LDA.l $7EF343 ; bombs LDA.l SpecialWeapons : AND.b #$7F : CMP #$01 : BNE .normal
LDA.l SpecialWeaponLevel : BEQ .no_bombs
.normal
LDA.l BombsEquipment ; bombs
JSR HudHexToDec2Digit ;requires 8 bit registers! JSR HudHexToDec2Digit ;requires 8 bit registers!
REP #$20 REP #$20
LDX.b $06 : TXA : ORA.w #$2400 : STA !BOMBCOUNT_DRAW_ADDRESS ; Draw bombs 10 digit LDX.b $06 : TXA : ORA.w #$2400 : STA !BOMBCOUNT_DRAW_ADDRESS ; Draw bombs 10 digit
LDX.b $07 : TXA : ORA.w #$2400 : STA !BOMBCOUNT_DRAW_ADDRESS+2 ; Draw bombs 1 digit LDX.b $07 : TXA : ORA.w #$2400 : STA !BOMBCOUNT_DRAW_ADDRESS+2 ; Draw bombs 1 digit
BRA + BRA +
.no_bombs
REP #$20
LDA.w #$207F : STA !BOMBCOUNT_DRAW_ADDRESS ; blank
STA !BOMBCOUNT_DRAW_ADDRESS+2 ; blank
BRA +
.infinite_bombs .infinite_bombs
REP #$20 REP #$20
LDA.w #$2431 : STA !BOMBCOUNT_DRAW_ADDRESS ; infinity (left half) LDA.w #$2431 : STA !BOMBCOUNT_DRAW_ADDRESS ; infinity (left half)
@@ -36,14 +42,13 @@ NewDrawHud:
;================================================================================ ;================================================================================
; Draw arrow count ; Draw arrow count
!ARROWCOUNT_DRAW_ADDRESS = "$7EC760" !ARROWCOUNT_DRAW_ADDRESS = "$7EC760"
!INFINITE_ARROWS = "$7F50C8"
;================================================================================ ;================================================================================
SEP #$20 SEP #$20
LDA.l ArrowMode : BNE + LDA.l ArrowMode : BNE +
LDA !INFINITE_ARROWS : BNE .infinite_arrows LDA InfiniteArrowsModifier : BNE .infinite_arrows
.finite_arrows .finite_arrows
LDA.l $7EF377 ; arrows LDA.l CurrentArrows ; arrows
JSR HudHexToDec2Digit JSR HudHexToDec2Digit
REP #$20 REP #$20
LDX.b $06 : TXA : ORA.w #$2400 : STA !ARROWCOUNT_DRAW_ADDRESS ; Draw arrows 10 digit LDX.b $06 : TXA : ORA.w #$2400 : STA !ARROWCOUNT_DRAW_ADDRESS ; Draw arrows 10 digit
@@ -168,7 +173,6 @@ NewDrawHud:
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
; Draw Magic Meter ; Draw Magic Meter
!INFINITE_MAGIC = "$7F50CA"
!DrawMagicMeter_mp_tilemap = "$0DFE0F" !DrawMagicMeter_mp_tilemap = "$0DFE0F"
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
LDA CurrentMagic : AND #$00FF ; crap we wrote over when placing the hook for OnDrawHud LDA CurrentMagic : AND #$00FF ; crap we wrote over when placing the hook for OnDrawHud
@@ -176,7 +180,7 @@ NewDrawHud:
AND #$FFF8 AND #$FFF8
TAX ; end of crap TAX ; end of crap
LDA !INFINITE_MAGIC : AND.w #$00FF : BNE + : JMP .green : + LDA InfiniteMagicModifier : AND.w #$00FF : BNE + : JMP .green : +
SEP #$20 : LDA.b #$80 : STA CurrentMagic : REP #$30 ; set magic to max SEP #$20 : LDA.b #$80 : STA CurrentMagic : REP #$30 ; set magic to max
LDX.w #$0080 ; load full magic meter graphics LDX.w #$0080 ; load full magic meter graphics
LDA $1A : AND.w #$000C : LSR #2 LDA $1A : AND.w #$000C : LSR #2

View File

@@ -45,7 +45,9 @@
; #$B3 - Chicken ; #$B3 - Chicken
; #$B4 - Big Magic ; #$B4 - Big Magic
; #$B5 - Good Bee ; #$B5 - Good Bee
; #$B6/B7 - Reserved for Kara ; #$C0 - Progressive Bomb
; #$C1 - Progressive Cane
; #$C2 - Progressive Bug Net
; #$FE - Server Request (Asychronous Chest) ; #$FE - Server Request (Asychronous Chest)
; #$FF - Null Chest ; #$FF - Null Chest
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -75,13 +77,13 @@
;JML GetAnimatedSpriteGfxFile_return ;JML GetAnimatedSpriteGfxFile_return
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
GetAnimatedSpriteGfxFile: GetAnimatedSpriteGfxFile:
CMP.b #$0C : BNE + CMP.b #$0C : BNE +
LDY.b #$5C : JML GetAnimatedSpriteGfxFile_return LDY.b #$5C : JML GetAnimatedSpriteGfxFile_return
+ +
CMP.b #$23 : BNE + CMP.b #$23 : BNE +
LDY.b #$5D : JML GetAnimatedSpriteGfxFile_return LDY.b #$5D : JML GetAnimatedSpriteGfxFile_return
+ +
CMP.b #$48 : BNE + CMP.b #$48 : BNE +
LDY.b #$60 : JML GetAnimatedSpriteGfxFile_return LDY.b #$60 : JML GetAnimatedSpriteGfxFile_return
+ +
CMP.b #$4B : BNE + CMP.b #$4B : BNE +
@@ -91,13 +93,13 @@ GetAnimatedSpriteGfxFile:
LDY.b #$5E : JML GetAnimatedSpriteGfxFile_return LDY.b #$5E : JML GetAnimatedSpriteGfxFile_return
+ +
CMP.b #$24 : !BGE + CMP.b #$24 : !BGE +
LDY.b #$5B : JML GetAnimatedSpriteGfxFile_return LDY.b #$5B : JML GetAnimatedSpriteGfxFile_return
+ +
CMP.b #$37 : !BGE + CMP.b #$37 : !BGE +
LDY.b #$5C : JML GetAnimatedSpriteGfxFile_return LDY.b #$5C : JML GetAnimatedSpriteGfxFile_return
+ +
CMP.b #$39 : !BGE + CMP.b #$39 : !BGE +
LDY.b #$5D : JML GetAnimatedSpriteGfxFile_return LDY.b #$5D : JML GetAnimatedSpriteGfxFile_return
+ +
LDY.b #$32 LDY.b #$32
@@ -284,7 +286,7 @@ AddReceivedItemExpandedGetItem:
+ CMP.b #$57 : BNE + ; Programmable Object 3 + CMP.b #$57 : BNE + ; Programmable Object 3
%ProgrammableItemLogic(3) %ProgrammableItemLogic(3)
JMP .done JMP .done
+ CMP.b #$58 : BNE + ; Upgrade-Only Sivler Arrows + CMP.b #$58 : BNE + ; Upgrade-Only Silver Arrows
LDA.l SilverArrowsUseRestriction : BNE +++ LDA.l SilverArrowsUseRestriction : BNE +++
LDA.l SilverArrowsAutoEquip : AND.b #$01 : BEQ +++ LDA.l SilverArrowsAutoEquip : AND.b #$01 : BEQ +++
LDA BowEquipment : BEQ ++ : CMP.b #$03 : !BGE ++ LDA BowEquipment : BEQ ++ : CMP.b #$03 : !BGE ++
@@ -444,15 +446,15 @@ AddReceivedItemExpandedGetItem:
LDA.b $21 : SBC.b #$00 : STA.w $0D20,Y ; move up 16 pixels LDA.b $21 : SBC.b #$00 : STA.w $0D20,Y ; move up 16 pixels
LDA.b $EE : STA.w $0F20,Y ; spawns on same layer as link LDA.b $EE : STA.w $0F20,Y ; spawns on same layer as link
LDA.b #$FF : STA.w $0B58,Y ; allows them to expire LDA.b #$FF : STA.w $0B58,Y ; allows them to expire
++ BRA .done ++ JMP .done
+ CMP.b #$B3 : BNE + ; Chicken + CMP.b #$B3 : BNE + ; Chicken
LDA.b #$0B : JSL Sprite_SpawnDynamically : BMI .done LDA.b #$0B : JSL Sprite_SpawnDynamically : BMI ++
LDA $22 : CLC : ADC.b #$03 : AND.b #$F8 : STA $0D10,Y LDA $22 : CLC : ADC.b #$03 : AND.b #$F8 : STA $0D10,Y
LDA $23 : ADC.b #$00 : STA $0D30,Y ; round X to nearest 8 LDA $23 : ADC.b #$00 : STA $0D30,Y ; round X to nearest 8
LDA.b $20 : SEC : SBC.b #$08 : STA.w $0D00,Y LDA.b $20 : SEC : SBC.b #$08 : STA.w $0D00,Y
LDA.b $21 : SBC.b #$00 : STA.w $0D20,Y ; move up 8 pixels LDA.b $21 : SBC.b #$00 : STA.w $0D20,Y ; move up 8 pixels
LDA.b $EE : STA.w $0F20,Y ; spawns on same layer as link LDA.b $EE : STA.w $0F20,Y ; spawns on same layer as link
BRA .done ++ BRA .done
+ CMP.b #$B4 : BNE + ; Big Magic + CMP.b #$B4 : BNE + ; Big Magic
LDA.b #$80 : STA MagicFiller ; fill magic LDA.b #$80 : STA MagicFiller ; fill magic
BRA .done BRA .done
@@ -464,11 +466,28 @@ AddReceivedItemExpandedGetItem:
LDA.b $EE : STA.w $0F20,Y ; spawns on same layer as link LDA.b $EE : STA.w $0F20,Y ; spawns on same layer as link
JSL GoldBee_SpawnSelf_SetProperties JSL GoldBee_SpawnSelf_SetProperties
BRA .done BRA .done
+ CMP.b #$C0 : BNE + ; Bomb Upgrade
LDA #$01 : STA InfiniteBombsModifier ; infinite bombs
BRA .done
+ CMP.b #$C1 : BNE + ; Cane Upgrade
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$03 : BEQ .blue_cane
CMP.b #$04 : BEQ .red_cane
BRA .done
.blue_cane
LDA #$01 : STA ByrnaEquipment
BRA .done
.red_cane
LDA #$01 : STA SomariaEquipment
BRA .done
+ CMP.b #$C2 : BNE + ; Bug Net Upgrade
LDA.b #$01 : STA BugNetEquipment
BRA .done
+ +
.done .done
PLX PLX
LDA $02E9 : CMP.b #$01 ; thing we wrote over LDA $02E9 : CMP.b #$01 ; thing we wrote over
RTL RTL
;--------------------------------------------------------------------------------
; #$70 - Maps ; #$70 - Maps
; #$80 - Compasses ; #$80 - Compasses
; #$90 - Big Keys ; #$90 - Big Keys
@@ -585,9 +604,9 @@ AddReceivedItemExpanded:
LDA BowEquipment : INC : LSR : CMP.l ProgressiveBowLimit : !BLT + LDA BowEquipment : INC : LSR : CMP.l ProgressiveBowLimit : !BLT +
LDA.l ProgressiveBowReplacement : STA $02D8 : JMP .done LDA.l ProgressiveBowReplacement : STA $02D8 : JMP .done
+ LDA BowEquipment : INC : LSR : CMP.b #$00 : BNE + ; No Bow + LDA BowEquipment : INC : LSR : CMP.b #$00 : BNE + ; No Bow
LDA.b #$3A : STA $02D8 : BRA .done LDA.b #$3A : STA $02D8 : JMP .done
+ ; Any Bow + ; Any Bow
LDA.b #$3B : STA $02D8 : BRA .done LDA.b #$3B : STA $02D8 : JMP .done
++ : CMP.b #$65 : BNE ++ ; Progressive Bow 2 ++ : CMP.b #$65 : BNE ++ ; Progressive Bow 2
LDA !MULTIWORLD_ITEM_PLAYER_ID : BNE +++ LDA !MULTIWORLD_ITEM_PLAYER_ID : BNE +++
LDA.l BowTracking : ORA #$20 : STA.l BowTracking LDA.l BowTracking : ORA #$20 : STA.l BowTracking
@@ -599,50 +618,46 @@ AddReceivedItemExpanded:
JSL.l GetRNGItemSingle : STA $02D8 JSL.l GetRNGItemSingle : STA $02D8
XBA : JSR.w MarkRNGItemSingle XBA : JSR.w MarkRNGItemSingle
LDA #$FF : STA !LOCK_IN ; clear lock-in LDA #$FF : STA !LOCK_IN ; clear lock-in
BRA .done JMP .done
++ : CMP.b #$63 : BNE ++ ; RNG Item (Multi) ++ : CMP.b #$63 : BNE ++ ; RNG Item (Multi)
JSL.l GetRNGItemMulti : STA $02D8 JSL.l GetRNGItemMulti : STA $02D8
LDA #$FF : STA !LOCK_IN ; clear lock-in LDA #$FF : STA !LOCK_IN ; clear lock-in
BRA .done JMP .done
++ : CMP.b #$B0 : BNE ++ ; Bee Trap ++ : CMP.b #$B0 : BNE ++ ; Bee Trap
LDA !MULTIWORLD_ITEM_PLAYER_ID : BEQ +++ LDA !MULTIWORLD_ITEM_PLAYER_ID : BEQ +++
LDA.b #$0E : STA $02D8 : BRA .done ; Bee in a bottle LDA.b #$0E : STA $02D8 : JMP .done ; Bee in a bottle
+++ +++
++ ++
.done .done
PLX : PLA PLX : PLA
PHB : PHK ; we're skipping the corresponding instructions to grab the data bank PHB : PHK ; we're skipping the corresponding instructions to grab the data bank
JML.l AddReceivedItem+2 JML.l AddReceivedItem+2
} }
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
;DATA AddReceivedItemExpanded ;DATA AddReceivedItemExpanded
{ {
; This is a temporary measure for Fish to have consistent addresses
warnpc $A08A00
org $A08A00
.y_offsets .y_offsets
db -5, -5, -5, -5, -5, -4, -4, -5 db -5, -5, -5, -5, -5, -4, -4, -5
db -5, -4, -4, -4, -2, -4, -4, -4 db -5, -4, -4, -4, -2, -4, -4, -4
db -4, -4, -4, -4, -4, -4, -4, -4 db -4, -4, -4, -4, -4, -4, -4, -4
db -4, -4, -4, -4, -4, -4, -4, -4 db -4, -4, -4, -4, -4, -4, -4, -4
db -4, -4, -4, -5, -4, -4, -4, -4 db -4, -4, -4, -5, -4, -4, -4, -4
db -4, -4, -2, -4, -4, -4, -4, -4 db -4, -4, -2, -4, -4, -4, -4, -4
db -4, -4, -4, -4, -2, -2, -2, -4 db -4, -4, -4, -4, -2, -2, -2, -4
db -4, -4, -4, -4, -4, -4, -4, -4 db -4, -4, -4, -4, -4, -4, -4, -4
db -4, -4, -2, -2, -4, -2, -4, -4 db -4, -4, -2, -2, -4, -2, -4, -4
db -4, -5, -4, -4 db -4, -5, -4, -4
;new ;new
db -4, -4, -4, -4 db -4, -4, -4, -4
db -5 ; Master Sword (Safe) db -5 ; Master Sword (Safe)
db -4, -4, -4, -4 ; +5/+10 Bomb Arrows db -4, -4, -4, -4 ; +5/+10 Bomb Arrows
db -4, -4, -4 ; 3x Programmable Item db -4, -4, -4 ; 3x Programmable Item
db -4 ; Upgrade-Only Sivler Arrows db -4 ; Upgrade-Only Silver Arrows
db -4 ; 1 Rupoor db -4 ; 1 Rupoor
db -4 ; Null Item db -4 ; Null Item
db -4, -4, -4 ; Red, Blue & Green Clocks db -4, -4, -4 ; Red, Blue & Green Clocks
@@ -663,31 +678,34 @@ org $A08A00
db -4 ; Big Magic db -4 ; Big Magic
db -4 ; Good Bee db -4 ; Good Bee
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused db -4 ; Bomb Upgrade
db -4 ; Cane Upgrade
db -4 ; Bug Net Upgrade
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused
.x_offsets .x_offsets
db 4, 4, 4, 4, 4, 0, 0, 4 db 4, 4, 4, 4, 4, 0, 0, 4
db 4, 4, 4, 4, 5, 0, 0, 0 db 4, 4, 4, 4, 5, 0, 0, 0
db 0, 0, 0, 4, 0, 4, 0, 0 db 0, 0, 0, 4, 0, 4, 0, 0
db 4, 0, 0, 0, 0, 0, 0, 0 db 4, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 4, 0, 0, 0 db 0, 0, 0, 0, 4, 0, 0, 0
db 0, 0, 5, 0, 0, 0, 0, 0 db 0, 0, 5, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 4, 4, 4, 0 db 0, 0, 0, 0, 4, 4, 4, 0
db 0, 0, 0, 0, 0, 0, 0, 0 db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 4, 4, 0, 4, 0, 0 db 0, 0, 4, 4, 0, 4, 0, 0
db 0, 4, 0, 0 db 0, 4, 0, 0
;new ;new
db 0, 0, 0, 0 db 0, 0, 0, 0
db 4 ; Master Sword (Safe) db 4 ; Master Sword (Safe)
db 0, 0, 0, 0 ; +5/+10 Bomb Arrows db 0, 0, 0, 0 ; +5/+10 Bomb Arrows
db 0, 0, 0 ; 3x Programmable Item db 0, 0, 0 ; 3x Programmable Item
db 0 ; Upgrade-Only Sivler Arrows db 0 ; Upgrade-Only Silver Arrows
db 4 ; 1 Rupoor db 4 ; 1 Rupoor
db 0 ; Null Item db 0 ; Null Item
db 0, 0, 0 ; Red, Blue & Green Clocks db 0, 0, 0 ; Red, Blue & Green Clocks
@@ -709,32 +727,35 @@ org $A08A00
db 4 ; Big Magic db 4 ; Big Magic
db 0 ; Good Bee db 0 ; Good Bee
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused db 0 ; Bomb Upgrade
db 4 ; Cane Upgrade
db 0 ; Bug Net Upgrade
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused
.item_graphics_indices .item_graphics_indices
db $06, $18, $18, $18, $2D, $20, $2E, $09 db $06, $18, $18, $18, $2D, $20, $2E, $09
db $09, $0A, $08, $05, $10, $0B, $2C, $1B db $09, $0A, $08, $05, $10, $0B, $2C, $1B
db $1A, $1C, $14, $19, $0C, $07, $1D, $2F db $1A, $1C, $14, $19, $0C, $07, $1D, $2F
db $07, $15, $12, $0D, $0D, $0E, $11, $17 db $07, $15, $12, $0D, $0D, $0E, $11, $17
db $28, $27, $04, $04, $0F, $16, $03, $13 db $28, $27, $04, $04, $0F, $16, $03, $13
db $01, $1E, $10, $00, $00, $00, $00, $00 db $01, $1E, $10, $00, $00, $00, $00, $00
db $00, $30, $22, $21, $24, $24, $24, $23 db $00, $30, $22, $21, $24, $24, $24, $23
db $23, $23, $29, $2A, $2C, $2B, $03, $03 db $23, $23, $29, $2A, $2C, $2B, $03, $03
db $34, $35, $31, $33, $02, $32, $36, $37 db $34, $35, $31, $33, $02, $32, $36, $37
db $2C, $06, $0C, $38 db $2C, $06, $0C, $38
;new ;new
db $39, $3A, $3B, $3C db $39, $3A, $3B, $3C
;5x ;5x
db $18 ; Master Sword (Safe) db $18 ; Master Sword (Safe)
db $3D, $3E, $3F, $40 ; +5/+10 Bomb Arrows db $3D, $3E, $3F, $40 ; +5/+10 Bomb Arrows
db $00, $00, $00 ; 3x Programmable Item db $00, $00, $00 ; 3x Programmable Item
db $41 ; Upgrade-Only Sivler Arrows db $41 ; Upgrade-Only Silver Arrows
db $24 ; 1 Rupoor db $24 ; 1 Rupoor
db $47 ; Null Item db $47 ; Null Item
db $48, $48, $48 ; Red, Blue & Green Clocks db $48, $48, $48 ; Red, Blue & Green Clocks
@@ -760,31 +781,34 @@ org $A08A00
db $3B ; Big Magic db $3B ; Big Magic
db $47 ; Good Bee db $47 ; Good Bee
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused db $13 ; Bomb Upgrade
db $07 ; Cane Upgrade
db $27 ; Bug Net Upgrade
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
.wide_item_flag .wide_item_flag
db $00, $00, $00, $00, $00, $02, $02, $00 db $00, $00, $00, $00, $00, $02, $02, $00
db $00, $00, $00, $00, $00, $02, $02, $02 db $00, $00, $00, $00, $00, $02, $02, $02
db $02, $02, $02, $00, $02, $00, $02, $02 db $02, $02, $02, $00, $02, $00, $02, $02
db $00, $02, $02, $02, $02, $02, $02, $02 db $00, $02, $02, $02, $02, $02, $02, $02
db $02, $02, $02, $02, $00, $02, $02, $02 db $02, $02, $02, $02, $00, $02, $02, $02
db $02, $02, $00, $02, $02, $02, $02, $02 db $02, $02, $00, $02, $02, $02, $02, $02
db $02, $02, $02, $02, $00, $00, $00, $02 db $02, $02, $02, $02, $00, $00, $00, $02
db $02, $02, $02, $02, $02, $02, $02, $02 db $02, $02, $02, $02, $02, $02, $02, $02
db $02, $02, $00, $00, $02, $00, $02, $02 db $02, $02, $00, $00, $02, $00, $02, $02
db $02, $00, $02, $02 db $02, $00, $02, $02
;new ;new
db $02, $02, $02, $02 db $02, $02, $02, $02
db $00 ; Master Sword (Safe) db $00 ; Master Sword (Safe)
db $02, $02, $02, $02 ; +5/+10 Bomb Arrows db $02, $02, $02, $02 ; +5/+10 Bomb Arrows
db $02, $02, $02 ; 3x Programmable Item db $02, $02, $02 ; 3x Programmable Item
db $02 ; Upgrade-Only Sivler Arrows db $02 ; Upgrade-Only Silver Arrows
db $00 ; 1 Rupoor db $00 ; 1 Rupoor
db $02 ; Null Item db $02 ; Null Item
db $02, $02, $02 ; Red, Blue & Green Clocks db $02, $02, $02 ; Red, Blue & Green Clocks
@@ -804,34 +828,36 @@ org $A08A00
db $02 ; Chicken db $02 ; Chicken
db $00 ; Big Magic db $00 ; Big Magic
db $02 ; Good Bee db $02 ; Good Bee
db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused
db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused db $02 ; Bomb Upgrade
db $00 ; Cane Upgrade
db $02 ; Bug Net Upgrade
db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused
db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused
db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused
db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused
.properties .properties
db 5, -1, 5, 5, 5, 5, 5, 1 db 5, -1, 5, 5, 5, 5, 5, 1
db 2, 1, 1, 1, 2, 2, 2, 4 db 2, 1, 1, 1, 2, 2, 2, 4
db 4, 4, 1, 1, 2, 1, 1, 1 db 4, 4, 1, 1, 2, 1, 1, 1
db 2, 1, 2, 1, 4, 4, 2, 1 db 2, 1, 2, 1, 4, 4, 2, 1
db 6, 1, 2, 1, 2, 2, 1, 2 db 6, 1, 2, 1, 2, 2, 1, 2
db 2, 4, 1, 1, 4, 2, 1, 4 db 2, 4, 1, 1, 4, 2, 1, 4
db 2, 2, 4, 4, 4, 2, 1, 4 db 2, 2, 4, 4, 4, 2, 1, 4
db 1, 2, 2, 1, 2, 2, 1, 1 db 1, 2, 2, 1, 2, 2, 1, 1
db 4, 4, 1, 2, 2, 4, 4, 4 db 4, 4, 1, 2, 2, 4, 4, 4
db 2, 5, 2, 1 db 2, 5, 2, 1
;new ;new
db 4, 4, 4, 4 db 4, 4, 4, 4
db 5 ; Master Sword (Safe) db 5 ; Master Sword (Safe)
db 4, 4, 4, 4 ; +5/+10 Bomb Arrows db 4, 4, 4, 4 ; +5/+10 Bomb Arrows
db 4, 4, 4 ; 3x Programmable Item db 4, 4, 4 ; 3x Programmable Item
db 1 ; Upgrade-Only Sivler Arrows db 1 ; Upgrade-Only Silver Arrows
db 3 ; 1 Rupoor db 3 ; 1 Rupoor
db 1 ; Null Item db 1 ; Null Item
db 1, 2, 4 ; Red, Blue & Green Clocks db 1, 2, 4 ; Red, Blue & Green Clocks
@@ -852,27 +878,30 @@ org $A08A00
db 4 ; Big Magic db 4 ; Big Magic
db 1 ; Good Bee db 1 ; Good Bee
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused db 5 ; Bomb Upgrade
db 5 ; Cane Upgrade
db 1 ; Bug Net Upgrade
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused
; \item Target SRAM addresses for items you receive ; \item Target SRAM addresses for items you receive
.item_target_addr .item_target_addr
dw $F359, $F359, $F359, $F359, $F35A, $F35A, $F35A, $F345 dw $F359, $F359, $F359, $F359, $F35A, $F35A, $F35A, $F345
dw $F346, $F34B, $F342, $F340, $F341, $F344, $F35C, $F347 dw $F346, $F34B, $F342, $F340, $F341, $F344, $F35C, $F347
dw $F348, $F349, $F34A, $F34C, $F34C, $F350, $F35C, $F36B dw $F348, $F349, $F34A, $F34C, $F34C, $F350, $F35C, $F36B
dw $F351, $F352, $F353, $F354, $F354, $F34E, $F356, $F357 dw $F351, $F352, $F353, $F354, $F354, $F34E, $F356, $F357
dw $F37A, $F34D, $F35B, $F35B, $F36F, $F364, $F36C, $F375 dw $F37A, $F34D, $F35B, $F35B, $F36F, $F364, $F36C, $F375
dw $F375, $F344, $F341, $F35C, $F35C, $F35C, $F36D, $F36E dw $F375, $F344, $F341, $F35C, $F35C, $F35C, $F36D, $F36E
dw $F36E, $F375, $F366, $F368, $F360, $F360, $F360, $F374 dw $F36E, $F375, $F366, $F368, $F360, $F360, $F360, $F374
dw $F374, $F374, $F340, $F340, $F35C, $F35C, $F36C, $F36C dw $F374, $F374, $F340, $F340, $F35C, $F35C, $F36C, $F36C
dw $F360, $F360, $F372, $F376, $F376, $F373, $F360, $F360 dw $F360, $F360, $F372, $F376, $F376, $F373, $F360, $F360
dw $F35C, $F359, $F34C, $F355 dw $F35C, $F359, $F34C, $F355
;new ;new
dw $F375, $F376, $F373, $F373 dw $F375, $F376, $F373, $F373
dw $F359 ; Master Sword (Safe) dw $F359 ; Master Sword (Safe)
@@ -899,7 +928,10 @@ org $A08A00
dw $F373 ; Big Magic dw $F373 ; Big Magic
dw $F36A ; Good Bee dw $F36A ; Good Bee
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused dw $F38F ; Bomb Upgrade
dw $F38F ; Cane Upgrade
dw $F38F ; Bug Net Upgrade
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused
@@ -908,26 +940,26 @@ org $A08A00
; DATA Values to write to the above SRAM locations. ; DATA Values to write to the above SRAM locations.
{ {
.item_values .item_values
db $01, $02, $03, $04, $01, $02, $03, $01 db $01, $02, $03, $04, $01, $02, $03, $01
db $01, $01, $01, $01, $01, $02, $FF, $01 db $01, $01, $01, $01, $01, $02, $FF, $01
db $01, $01, $01, $01, $02, $01, $FF, $FF db $01, $01, $01, $01, $02, $01, $FF, $FF
db $01, $01, $02, $01, $02, $01, $01, $01 db $01, $01, $02, $01, $02, $01, $01, $01
db $FF, $01, $FF, $02, $FF, $FF, $FF, $FF db $FF, $01, $FF, $02, $FF, $FF, $FF, $FF
db $FF, $FF, $02, $FF, $FF, $FF, $FF, $FF db $FF, $FF, $02, $FF, $FF, $FF, $FF, $FF
db $FF, $FF, $FF, $FF, $FF, $FB, $EC, $FF db $FF, $FF, $FF, $FF, $FF, $FB, $EC, $FF
db $FF, $FF, $01, $03, $FF, $FF, $FF, $FF db $FF, $FF, $01, $03, $FF, $FF, $FF, $FF
db $9C, $CE, $FF, $01, $0A, $FF, $FF, $FF db $9C, $CE, $FF, $01, $0A, $FF, $FF, $FF
db $FF, $01, $03, $01 db $FF, $01, $03, $01
;new ;new
db $32, $46, $80, $80 db $32, $46, $80, $80
db $02 ; Master Sword (Safe) db $02 ; Master Sword (Safe)
db $FF, $FF, $FF, $FF ; +5/+10 Bomb Arrows db $FF, $FF, $FF, $FF ; +5/+10 Bomb Arrows
db $FF, $FF, $FF ; 3x Programmable Item db $FF, $FF, $FF ; 3x Programmable Item
db $FF ; Upgrade-Only Sivler Arrows db $FF ; Upgrade-Only Silver Arrows
db $FF ; 1 Rupoor db $FF ; 1 Rupoor
db $FF ; Null Item db $FF ; Null Item
db $FF, $FF, $FF ; Red, Blue & Green Clocks db $FF, $FF, $FF ; Red, Blue & Green Clocks
@@ -948,71 +980,74 @@ org $A08A00
db $80 ; Big Magic db $80 ; Big Magic
db $FF ; Good Bee db $FF ; Good Bee
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused db $FF ; Bomb Upgrade
db $FF ; Cane Upgrade
db $FF ; Bug Net Upgrade
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused
;0x00 - Sewer Passage ;0x00 - Sewer Passage
;0x02 - Hyrule Castle ;0x02 - Hyrule Castle
;0x04 - Eastern Palace ;0x04 - Eastern Palace
;0x06 - Desert Palace ;0x06 - Desert Palace
;0x08 - Hyrule Castle 2 ;0x08 - Hyrule Castle 2
;0x0A - Swamp Palace ;0x0A - Swamp Palace
;0x0C - Dark Palace ;0x0C - Dark Palace
;0x0E - Misery Mire ;0x0E - Misery Mire
;0x10 - Skull Woods ;0x10 - Skull Woods
;0x12 - Ice Palace ;0x12 - Ice Palace
;0x14 - Tower of Hera ;0x14 - Tower of Hera
;0x16 - Gargoyle's Domain ;0x16 - Gargoyle's Domain
;0x18 - Turtle Rock ;0x18 - Turtle Rock
;0x1A - Ganon's Tower ;0x1A - Ganon's Tower
.item_masks ; these are dungeon correlations to $7EF364 - $7EF369 so it knows where to store compasses, etc .item_masks ; these are dungeon correlations to $7EF364 - $7EF369 so it knows where to store compasses, etc
; sewers and castle get 2 bits active so that they can share their items elegantly ; sewers and castle get 2 bits active so that they can share their items elegantly
dw $C000, $C000, $2000, $1000, $0800, $0400, $0200, $0100 dw $C000, $C000, $2000, $1000, $0800, $0400, $0200, $0100
dw $0080, $0040, $0020, $0010, $0008, $0004, $4B8B, $20AB ; last two can be re-used dw $0080, $0040, $0020, $0010, $0008, $0004, $4B8B, $20AB ; last two can be re-used
; caves ; caves
dw $9CCE, $0390, $2F82, $AD03, $02E9, $01C9, $06D0, $72A5 dw $9CCE, $0390, $2F82, $AD03, $02E9, $01C9, $06D0, $72A5
dw $A548, $4873, $01A0, $D8AD, $C902, $D020, $A002, $9802 dw $A548, $4873, $01A0, $D8AD, $C902, $D020, $A002, $9802
dw $E48D, $DA02, $D8AC, $D002, $A215, $BD08, $84E2, $0085 dw $E48D, $DA02, $D8AC, $D002, $A215, $BD08, $84E2, $0085
dw $E3BD, $8584, $A901, $857E, $B902, $857A, $0087, $0A98 dw $E3BD, $8584, $A901, $857E, $B902, $857A, $0087, $0A98
dw $BDAA, $84E2, $0085, $E3BD, $8584, $A901, $857E, $B902 dw $BDAA, $84E2, $0085, $E3BD, $8584, $A901, $857E, $B902
dw $857A, $0230, $0087, $1FC0, $02D0, $5664, $04A9, $4BC0 dw $857A, $0230, $0087, $1FC0, $02D0, $5664, $04A9, $4BC0
dw $06F0, $1EC0, $0AD0, $02A9, $790F, $7EF3, $798F, $7EF3 dw $06F0, $1EC0, $0AD0, $02A9, $790F, $7EF3, $798F, $7EF3
dw $1BC0, $04F0, $1CC0, $07D0, $1B22, $1BEE, $0182, $A201 dw $1BC0, $04F0, $1CC0, $07D0, $1B22, $1BEE, $0182, $A201
dw $C004, $F037, $A20C, $C001, $F038, $A206, $C002, $D039 dw $C004, $F037, $A20C, $C001, $F038, $A206, $C002, $D039
dw $8A14, $0007, $0087, $00EE, $2902, $C907, $D007, $A906 dw $8A14, $0007, $0087, $00EE, $2902, $C907, $D007, $A906
dw $8F04, $F3C7, $C07E, $D022, $A70A, $D000, $A904, $8701 dw $8F04, $F3C7, $C07E, $D022, $A70A, $D000, $A904, $8701
dw $8000, $C0C9, $F025, $C008, $F032, $C004, $D033, $AE11 dw $8000, $C0C9, $F025, $C008, $F032, $C004, $D033, $AE11
dw $040C, $20C2, $C6BD, $0785, $8700, $E200, $8220, $00B0 dw $040C, $20C2, $C6BD, $0785, $8700, $E200, $8220, $00B0
dw $3EC0, $0AD0, $082C, $1003, $A905, $8D02, $0309, $20C0 dw $3EC0, $0AD0, $082C, $1003, $A905, $8D02, $0309, $20C0
dw $44D0 dw $44D0
} }
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
BottleListExpanded: BottleListExpanded:
db $16, $2B, $2C, $2D, $3D, $3C, $48 db $16, $2B, $2C, $2D, $3D, $3C, $48
PotionListExpanded: PotionListExpanded:
db $2E, $2F, $30, $FF, $0E db $2E, $2F, $30, $FF, $0E
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
Link_ReceiveItemAlternatesExpanded: Link_ReceiveItemAlternatesExpanded:
{ {
db -1, -1, -1, -1, -1, -1, -1, -1 db -1, -1, -1, -1, -1, -1, -1, -1
db -1, -1, -1, -1, -1, -1, -1, -1 ; db -1, -1, -1, -1, $44, -1, -1, -1 db -1, -1, -1, -1, -1, -1, -1, -1 ; db -1, -1, -1, -1, $44, -1, -1, -1
db -1, -1, $35, -1, -1, -1, -1, -1 db -1, -1, $35, -1, -1, -1, -1, -1
db -1, -1, -1, -1, -1, -1, -1, -1 db -1, -1, -1, -1, -1, -1, -1, -1
db -1, -1, -1, -1, -1, -1, -1, -1 db -1, -1, -1, -1, -1, -1, -1, -1
db -1, -1, -1, -1, -1, -1, -1, -1 ; db -1, -1, $46, -1, -1, -1, -1, -1 db -1, -1, -1, -1, -1, -1, -1, -1 ; db -1, -1, $46, -1, -1, -1, -1, -1
db -1, -1, -1, -1, -1, -1, -1, -1 db -1, -1, -1, -1, -1, -1, -1, -1
db -1, -1, -1, -1, -1, -1, -1, -1 db -1, -1, -1, -1, -1, -1, -1, -1
db -1, -1, -1, -1, -1, -1, -1, -1 db -1, -1, -1, -1, -1, -1, -1, -1
db -1, -1, -1, -1 db -1, -1, -1, -1
db -1, -1, -1, -1 db -1, -1, -1, -1
db -1 ; Master Sword (Safe) db -1 ; Master Sword (Safe)
@@ -1039,7 +1074,10 @@ Link_ReceiveItemAlternatesExpanded:
db -1 ; Big Magic db -1 ; Big Magic
db -1 ; Good Bee db -1 ; Good Bee
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused db -1 ; Bomb Upgrade
db -1 ; Cane Upgrade
db -1 ; Bug Net Upgrade
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused
@@ -1064,10 +1102,10 @@ RTL
;DrawHUDSilverArrows: ;DrawHUDSilverArrows:
; LDA BowEquipment : AND.w #$00FF : BNE + ; LDA BowEquipment : AND.w #$00FF : BNE +
; LDA BowTracking : AND.w #$0040 : BEQ + ; LDA BowTracking : AND.w #$0040 : BEQ +
; LDA.w #$2810 : STA $11C8 ; LDA.w #$2810 : STA $11C8
; LDA.w #$2811 : STA $11CA ; LDA.w #$2811 : STA $11CA
; LDA.w #$2820 : STA $1208 ; LDA.w #$2820 : STA $1208
; LDA.w #$2821 : STA $120A ; LDA.w #$2821 : STA $120A
; + ; +
; LDA.w #$11CE : STA $00 ; thing we wrote over ; LDA.w #$11CE : STA $00 ; thing we wrote over
;RTL ;RTL
@@ -1247,83 +1285,97 @@ AttemptItemSubstitution:
RTS RTS
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
CountBottles: CountBottles:
PHX PHX
LDX.b #$00 LDX.b #$00
LDA BottleContentsOne : BEQ ++ : INX LDA BottleContentsOne : BEQ ++ : INX
++ : LDA BottleContentsTwo : BEQ ++ : INX ++ : LDA BottleContentsTwo : BEQ ++ : INX
++ : LDA BottleContentsThree : BEQ ++ : INX ++ : LDA BottleContentsThree : BEQ ++ : INX
++ : LDA BottleContentsFour : BEQ ++ : INX ++ : LDA BottleContentsFour : BEQ ++ : INX
++ ++
TXA TXA
PLX PLX
RTS RTS
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
ActivateGoal: ActivateGoal:
STZ $11 STZ $11
STZ $B0 STZ $B0
JML.l StatsFinalPrep JML.l StatsFinalPrep
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
ChestPrep: ChestPrep:
LDA.b #$01 : STA $02E9 LDA.b #$01 : STA $02E9
JSL.l IncrementChestCounter JSL.l IncrementChestCounter
LDA.l ServerRequestMode : BEQ + LDA.l ServerRequestMode : BEQ +
JSL.l ChestItemServiceRequest JSL.l ChestItemServiceRequest
RTL RTL
+ +
LDY $0C ; get item value LDY $0C ; get item value
SEC SEC
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
Ancilla22_ItemReceipt_ContinueB: Ancilla22_ItemReceipt_ContinueB:
CMP.b #$6A : BNE .return CMP.b #$6A : BNE .return
JSL ActivateTriforceCutscene JSL ActivateTriforceCutscene
.return .return
STZ.w $0C4A,X : STZ.w $0FC1 ; what we wrote over STZ.w $0C4A,X : STZ.w $0FC1 ; what we wrote over
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
; Set a flag in SRAM if we pick up a compass in its own dungeon with HUD compass ; Set a flag in SRAM if we pick up a compass in its own dungeon with HUD compass
; counts on ; counts on
MaybeFlagCompassTotalPickup: MaybeFlagCompassTotalPickup:
LDA.l CompassMode : AND.b #$0F : BEQ .done LDA.l CompassMode : AND.b #$0F : BEQ .done
LDA $040C : CMP #$FF : BEQ .done LDA $040C : CMP #$FF : BEQ .done
LSR : STA $04 : LDA #$0F : !SUB $04 ; Compute flag "index" LSR : STA $04 : LDA #$0F : !SUB $04 ; Compute flag "index"
CPY #$25 : BEQ .setFlag ; Set flag if it's a compass for this dungeon CPY #$25 : BEQ .setFlag ; Set flag if it's a compass for this dungeon
STA $04 STA $04
TYA : AND #$0F : CMP $04 : BNE .done ; Check if compass is for this dungeon TYA : AND #$0F : CMP $04 : BNE .done ; Check if compass is for this dungeon
.setFlag .setFlag
CMP #$08 : !BGE ++ CMP #$08 : !BGE ++
%ValueShift() %ValueShift()
ORA CompassCountDisplay : STA CompassCountDisplay ORA CompassCountDisplay : STA CompassCountDisplay
BRA .done BRA .done
++ ++
!SUB #$08 !SUB #$08
%ValueShift() %ValueShift()
BIT.b #$C0 : BEQ + : LDA.b #$C0 : + ; Make Hyrule Castle / Sewers Count for Both BIT.b #$C0 : BEQ + : LDA.b #$C0 : + ; Make Hyrule Castle / Sewers Count for Both
ORA CompassCountDisplay+1 : STA CompassCountDisplay+1 ORA CompassCountDisplay+1 : STA CompassCountDisplay+1
.done .done
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
; Set the compass count display flag if we're entering a dungeon and alerady have ; Set the compass count display flag if we're entering a dungeon and alerady have
; that compass ; that compass
MaybeFlagCompassTotalEntrance: MaybeFlagCompassTotalEntrance:
LDX $040C : CPX #$FF : BEQ .done ; Skip if we're not entering dungeon LDX $040C : CPX #$FF : BEQ .done ; Skip if we're not entering dungeon
LDA.l CompassMode : AND.w #$000F : BEQ .done ; Skip if we're not showing compass counts LDA.l CompassMode : AND.w #$000F : BEQ .done ; Skip if we're not showing compass counts
CMP.w #$0002 : BEQ .countShown CMP.w #$0002 : BEQ .countShown
LDA CompassField : AND.l DungeonItemMasks, X : BEQ .done ; skip if we don't have compass LDA CompassField : AND.l DungeonItemMasks, X : BEQ .done ; skip if we don't have compass
.countShown .countShown
SEP #$20 SEP #$20
TXA : LSR : STA.b $04 : LDA.b #$0F : !SUB $04 ; Compute flag "index" TXA : LSR : STA.b $04 : LDA.b #$0F : !SUB $04 ; Compute flag "index"
CMP #$08 : !BGE ++ CMP #$08 : !BGE ++
%ValueShift() %ValueShift()
ORA CompassCountDisplay : STA CompassCountDisplay ORA CompassCountDisplay : STA CompassCountDisplay
REP #$20 REP #$20
BRA .done BRA .done
++ ++
!SUB #$08 !SUB #$08
%ValueShift() %ValueShift()
BIT.b #$C0 : BEQ + : LDA.b #$C0 : + ; Make Hyrule Castle / Sewers Count for Both BIT.b #$C0 : BEQ + : LDA.b #$C0 : + ; Make Hyrule Castle / Sewers Count for Both
ORA CompassCountDisplay+1 : STA CompassCountDisplay+1 ORA CompassCountDisplay+1 : STA CompassCountDisplay+1
REP #$20 REP #$20
.done .done
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
LoadReceivedItemExpandedProperties:
CPX.b #$C0 : BEQ .bomb_upgrade
LDA.l AddReceivedItemExpanded_properties, X ; load from table
RTL
.bomb_upgrade
LDA SpecialWeaponLevel
CMP.b #$01 : BNE + ; L1 Bombs
LDA.b #4 : RTL
+ : CMP.b #$02 : BNE + ; L2 Bombs
LDA.b #2 : RTL
+ : CMP.b #$03 : BNE + ; L3 Bombs
LDA.b #1 : RTL
+ ; Everything Else
LDA.b #5 : RTL

View File

@@ -33,6 +33,7 @@ QuickSwap:
CPX.b #$01 : BEQ + ; bow CPX.b #$01 : BEQ + ; bow
CPX.b #$05 : BEQ + ; powder CPX.b #$05 : BEQ + ; powder
CPX.b #$0D : BEQ + ; flute CPX.b #$0D : BEQ + ; flute
CPX.b #$0E : BEQ + ; bug net
CPX.b #$10 : BEQ + ; bottle CPX.b #$10 : BEQ + ; bottle
BRA .store BRA .store
+ STX $0202 : JSL ProcessMenuButtons_y_pressed + STX $0202 : JSL ProcessMenuButtons_y_pressed

View File

@@ -1,6 +1,5 @@
!INFINITE_BOMBS = "$7F50C9"
IsItemAvailable: IsItemAvailable:
LDA !INFINITE_BOMBS : BEQ .finite LDA InfiniteBombsModifier : BEQ .finite
.infinite .infinite
CPX.b #$04 : BNE .finite CPX.b #$04 : BNE .finite
LDA.b #$01 : RTL LDA.b #$01 : RTL
@@ -8,34 +7,39 @@ IsItemAvailable:
LDA EquipmentWRAM-1, X LDA EquipmentWRAM-1, X
RTL RTL
LoadBombCount: LoadBombCount:
LDA !INFINITE_BOMBS : BNE .infinite LDA InfiniteBombsModifier : BNE .infinite
.finite .finite
LDA BombsEquipment LDA BombsEquipment
.infinite .infinite
RTL RTL
LoadBombCount16: LoadBombCount16:
LDA !INFINITE_BOMBS : AND.w #$00FF : BNE .infinite LDA InfiniteBombsModifier : AND.w #$00FF : BNE .infinite
.finite .finite
LDA BombsEquipment LDA BombsEquipment
.infinite .infinite
RTL RTL
StoreBombCount: StoreBombCount:
PHA : LDA !INFINITE_BOMBS : BEQ .finite JSL IncrementBombsPlacedCounter
PHA : LDA InfiniteBombsModifier : BEQ .finite
.infinite .infinite
PLA : LDA.b #$01 : RTL PLA : LDA.b #$01 : RTL
.finite .finite
PLA : STA BombsEquipment PLA : STA.l BombsEquipment
BNE .done
LDA.l ItemOnB : CMP #$04 : BNE .done
LDA.b #$00 : STA.l ItemOnB
.done
LDA.l BombsEquipment
RTL RTL
SearchForEquippedItem: SearchForEquippedItem:
LDA !INFINITE_BOMBS : BEQ + LDA InfiniteBombsModifier : BEQ +
LDA.b #$01 : LDX.b #$00 : RTL LDA.b #$01 : LDX.b #$00 : RTL
+ +
LDA BowEquipment ; thing we wrote over LDA BowEquipment ; thing we wrote over
RTL RTL
!INFINITE_ARROWS = "$7F50C8"
DecrementArrows: DecrementArrows:
LDA !INFINITE_ARROWS : BNE .infinite LDA InfiniteArrowsModifier : BNE .infinite
LDA.l ArrowMode : BNE .rupees : BRA .normal LDA.l ArrowMode : BNE .rupees : BRA .normal
.infinite .infinite
LDA.b #$01 : RTL LDA.b #$01 : RTL

View File

@@ -111,6 +111,10 @@ RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
!RNG_POINTERS = "$7F5200" !RNG_POINTERS = "$7F5200"
GetStaticRNG: GetStaticRNG:
LDA.l SeededRNG : BNE .seeded
JML GetRandomInt
RTL
.seeded
PHX : PHP PHX : PHP
REP #$30 ; set 16-bit accumulator and index registers REP #$30 ; set 16-bit accumulator and index registers
AND.w #$000F AND.w #$000F

600
special_weapons.asm Normal file
View File

@@ -0,0 +1,600 @@
;--------------------------------------------------------------------------------
!ANCILLA_DAMAGE = "$06EC84"
; start with X = sprite index, A = ancilla type index
;--------------------------------------------------------------------------------
DamageClassCalc:
PHA
LDA GanonVulnerabilityItem : BEQ +
LDA $0E20, X : CMP #$D7 : BNE +
PLA
JSL Ganon_CheckAncillaVulnerability
RTL
+
LDA SpecialWeapons : AND.b #$7F : CMP #$06 : BEQ .cane_immune ; only crystal switches in bee mode
PLA
CMP #$01 : BEQ .red_cane
CMP #$2C : BEQ .red_cane
CMP #$31 : BEQ .blue_cane
CMP #$0C : BEQ .beam
BRA .not_cane_or_beam
.red_cane
PHA
LDA SpecialWeapons : AND.b #$7F : CMP.b #$04 : BEQ .special_cane
CMP.b #$05 : BEQ .special_cane
LDA SpecialWeapons : AND.b #$80 : BNE .cane_immune
BRA .normal
.blue_cane
PHA
LDA SpecialWeapons : AND.b #$7F : CMP.b #$03 : BEQ .special_cane
CMP.b #$05 : BEQ .special_cane
LDA SpecialWeapons : AND.b #$80 : BNE .cane_immune
BRA .normal
.cane_immune
LDA $0E20, X : CMP.b #$1E : BEQ .normal ; crystal switch
PLA
BRA .impervious
.special_cane
PLA
LDA $0E20, X : CMP.b #$D6 : BEQ .unstunned_ganon
CMP.b #$88 : BEQ .mothula
BRA .special_level
.impervious
LDA #$FF
RTL
.beam
PHA
LDA SpecialWeapons : AND.b #$7F : CMP.b #$02 : BNE .normal
PLA
LDA #$05
RTL
.normal
PLA
.not_cane_or_beam
CMP #$07 : BNE .no_change
LDA SpecialWeapons : AND.b #$7F : CMP #$01 : BNE .normal_bombs
LDA SpecialWeaponLevel : BEQ .normal_bombs
LDA $0E20, X : CMP.b #$D6 : BEQ .unstunned_ganon
CMP.b #$D7 : BEQ .stunned_ganon
CMP.b #$88 : BEQ .mothula
CMP.b #$91 : BEQ .stalfos_knight
CMP.b #$92 : BEQ .helmasaur_king
.special_level
LDA SpecialWeaponLevel
BRA .done
.mothula
LDA SpecialWeaponLevel
CMP #$04 : !BGE .fix_mothula
BRA .done
.fix_mothula
LDA #$03
BRA .done
.stalfos_knight
LDA !StalfosBombDamage : BEQ .special_level
LDA #$08
BRA .done
.helmasaur_king
LDA $0DB0, X : CMP #$03 : !BGE .special_level
LDA #$08
BRA .done
.unstunned_ganon
LDA $04C5 : CMP.b #$02 : BNE .impervious
LDA $0EE0, X : BNE .impervious
LDA #$34 : STA $0EE0, X ; give the poor pig some iframes
BRA .special_level
.stunned_ganon
LDA $0EE0, X : BNE .impervious
LDA #$34 : STA $0EE0, X ; give the poor pig some iframes
LDA #$20 : STA $0F10, X ; knock ganon back or something? idk
LDA #$09
BRA .done
.normal_bombs
LDA #$07
.no_change
PHX : TAX
LDA.l !ANCILLA_DAMAGE, X
PLX
CMP.b #$06 : BNE .done ; not arrows
LDA BowEquipment : CMP.b #$03 : !BGE .actual_silver_arrows
.normal_arrows
LDA #$06
.done
RTL
.actual_silver_arrows
LDA $0E20, X : CMP.b #$D7 : BNE +
LDA SpecialWeapons : AND.b #$7F : CMP #$01 : BEQ .normal_arrows
LDA #$20 : STA $0F10, X
+
LDA #$09
RTL
; end with X = sprite index, A = damage class
;--------------------------------------------------------------------------------
!SPRITE_SETUP_HIT_BOX_LONG = "$0683EA"
!UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG = "$0683E6"
; start with X = ancilla index, Y = sprite index
;--------------------------------------------------------------------------------
Utility_CheckAncillaOverlapWithSprite:
LDA $0E20, Y : CMP #$09 : BEQ .giant_moldorm
CMP #$CB : BEQ .trinexx
.not_giant_moldorm ; ordinary collision checking
PHY : PHX
TYX
JSL !SPRITE_SETUP_HIT_BOX_LONG
PLX : PLY
JSL !UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG
RTL
.giant_moldorm
LDA.w $0E10, Y : BNE .ignore_collision ; Moldy can have little a I-Frames, as a treat
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BNE ++
LDA.w $0C4A, X : CMP.b #$07 : BEQ .check_collision_moldorm
BRA .ignore_collision ; don't collide with non-bombs
++ : CMP.b #$03 : BNE ++
LDA.w $0C4A, X : CMP.b #$31 : BEQ .check_collision_moldorm
BRA .ignore_collision ; don't collide with non-byrna
++ : CMP.b #$04 : BNE ++
LDA.w $0C4A, X : CMP.b #$01 : BEQ .check_collision_moldorm
CMP.b #$2C : BEQ .check_collision_moldorm
BRA .ignore_collision ; don't collide with non-somaria
++ : CMP.b #$05 : BNE .ignore_collision
LDA.w $0C4A, X : CMP.b #$01 : BEQ .check_collision_moldorm
CMP.b #$2C : BEQ .check_collision_moldorm
CMP.b #$31 : BEQ .check_collision_moldorm
BRA .ignore_collision ; don't collide with non-canes
.check_collision_moldorm
JSR SetUpMoldormHitbox
JSL !UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG
RTL
.ignore_collision
CLC
RTL
.trinexx
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BNE ++
LDA.w $0C4A, X : CMP.b #$07 : BEQ .check_collision_trinexx
BRA .ignore_collision ; don't collide with non-bombs
++ : CMP.b #$03 : BNE ++
LDA.w $0C4A, X : CMP.b #$31 : BEQ .check_collision_trinexx
JMP .ignore_collision ; don't collide with non-byrna
++ : CMP.b #$04 : BNE ++
LDA.w $0C4A, X : CMP.b #$01 : BEQ .check_collision_trinexx
CMP.b #$2C : BEQ .check_collision_trinexx
JMP .ignore_collision ; don't collide with non-somaria
++ : CMP #$05 : BNE .ignore_collision
LDA.w $0C4A, X : CMP.b #$01 : BEQ .check_collision_trinexx
CMP.b #$2C : BEQ .check_collision_trinexx
CMP.b #$31 : BEQ .check_collision_trinexx
JMP .ignore_collision ; don't collide with non-canes
.check_collision_trinexx
JSR SetUpTrinexxHitbox
JSL !UTILITY_CHECK_IF_HIT_BOXES_OVERLAP_LONG
RTL
; returns carry clear if there was no overlap
;--------------------------------------------------------------------------------
SetUpTrinexxHitbox:
; rearrange trinexx's hitbox to be her middle instead of her head
LDA $0CAA, Y : PHA
LDA $0E60, Y : PHA
LDA $0D10, Y : PHA
LDA $0D30, Y : PHA
LDA $0D00, Y : PHA
LDA $0D20, Y : PHA
LDA #$80 : STA $0CAA, Y
PHX
LDA $0E80, Y : !SUB.l $1DAF28 : AND.b #$7F : TAX
LDA $7FFC00, X : STA $0D10, Y
LDA $7FFC80, X : STA $0D30, Y
LDA $7FFD00, X : STA $0D00, Y
LDA $7FFD80, X : STA $0D20, Y
TYX
STZ $0E60, X
JSL !SPRITE_SETUP_HIT_BOX_LONG
PLX
PLA : STA $0D20, Y
PLA : STA $0D00, Y
PLA : STA $0D30, Y
PLA : STA $0D10, Y
PLA : STA $0E60, Y
PLA : STA $0CAA, Y
RTS
;--------------------------------------------------------------------------------
SetUpMoldormHitbox:
; rearrange moldorm's hitbox to be his tail instead of his head
LDA $0D90, Y : PHA
LDA $0F60, Y : PHA
LDA $0D10, Y : PHA
LDA $0D30, Y : PHA
LDA $0D00, Y : PHA
LDA $0D20, Y : PHA
PHY : PHX
LDA $0E80, Y : !SUB.b #$30 : AND.b #$7F : TAX
LDA $7FFC00, X : STA $0D10, Y
LDA $7FFC80, X : STA $0D30, Y
LDA $7FFD00, X : STA $0D00, Y
LDA $7FFD80, X : STA $0D20, Y
LDA #$01 : STA $09D0, Y
TYX
STZ $0F60, X
JSL !SPRITE_SETUP_HIT_BOX_LONG
PLX : PLY
PLA : STA $0D20, Y
PLA : STA $0D00, Y
PLA : STA $0D30, Y
PLA : STA $0D10, Y
PLA : STA $0F60, Y
PLA : STA $0D90, Y
RTS
;--------------------------------------------------------------------------------
; start with X = ancilla index, Y = sprite index
Utility_CheckHelmasaurKingCollision:
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BNE ++
LDA.w $0C4A, X : CMP.b #$07 : BEQ .collide
BRA .normal ; normal behavior with non-bombs
++ : CMP.b #$03 : BNE ++
LDA.w $0C4A, X : CMP.b #$31 : BEQ .collide
BRA .normal ; normal behavior with non-byrna
++ : CMP.b #$04 : BNE ++
LDA.w $0C4A, X : CMP.b #$01 : BEQ .collide
CMP.b #$2C : BEQ .collide
BRA .normal ; normal behavior with non-somaria
++ : CMP.b #$05 : BNE .normal
LDA.w $0C4A, X : CMP.b #$01 : BEQ .collide
CMP.b #$2C : BEQ .collide
CMP.b #$31 : BEQ .collide
BRA .normal ; normal behavior with non-canes
.collide
CLC
RTL
.normal
LDA.w $0DB0, Y : CMP.b #$03
RTL
; returns carry set if there is collision immunity
;--------------------------------------------------------------------------------
Utility_CheckImpervious:
LDA $0E20, X : CMP.b #$CB : BNE .normal
.trinexx
LDA SpecialWeapons : AND.b #$7F : CMP.b #$06 : BEQ .check_sidenexx
LDA SpecialWeapons : AND.b #$80 : BNE +
BRA .normal
+
LDA $0301 : AND.b #$0A : BNE .impervious ; impervious to hammer
.check_sidenexx
LDA.w $0DD1 : ORA.w $0DD2 : BNE .impervious ; at least one sidenexx alive
LDA.w $0D80, X : CMP.b #$02 : BCS .impervious ; at least one sidenexx alive
BRA .not_impervious
.normal
LDA $0E60, X : AND.b #$40 : BNE .impervious
LDA $0CF2 : CMP #$FF : BEQ .impervious ; special "always-impervious" class
LDA $0E20, X : CMP.b #$CC : BEQ .sidenexx : CMP.b #$CD : BEQ .sidenexx
LDA $0301 : AND.b #$0A : BEQ .not_impervious ; normal behavior if not hammer
JSL Ganon_CheckHammerVulnerability : BCS .not_impervious
LDA SpecialWeapons : AND.b #$80 : BEQ .not_impervious
LDA $0E20, X : CMP.b #$1E : BEQ .not_impervious ; crystal switch
CMP.b #$40 : BEQ .not_impervious ; aga barrier
BRA .impervious
.not_impervious
LDA #$00 : RTL
.impervious
LDA #$01 : RTL
.sidenexx
LDA $0CAA, X : AND.b #$04 : BEQ .vulnerable
LDA.l SpecialWeapons : AND.b #$80 : BEQ .not_impervious
LDA $0CF2 : CMP #$06 : !BLT .impervious ; swords are ineffective
BRA .not_impervious
.vulnerable
LDA.l SpecialWeapons : AND.b #$80 : BEQ .not_impervious
LDA $0CF2 : CMP #$06 : !BGE .impervious ; non-swords are ineffective
BRA .not_impervious
; returns nonzero A if impervious
;--------------------------------------------------------------------------------
!SPRITE_INITIALIZED_SEGMENTED = "$1DD6D1"
; start with X = sprite index
;--------------------------------------------------------------------------------
AllowBombingMoldorm:
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BEQ .no_disable_projectiles
CMP.b #$03 : BEQ .no_disable_projectiles
CMP.b #$04 : BEQ .no_disable_projectiles
CMP.b #$05 : BEQ .no_disable_projectiles
CMP.b #$06 : BEQ .no_disable_projectiles
INC $0BA0, X
.no_disable_projectiles
JSL !SPRITE_INITIALIZED_SEGMENTED
RTL
;--------------------------------------------------------------------------------
AllowBombingBarrier:
; what we wrote over
LDA $0D00, X : !SUB.b #$0C : STA $0D00, X
LDA $0E20, X : CMP #$40 : BNE .disable_projectiles
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BEQ .no_disable_projectiles
CMP.b #$03 : BEQ .no_disable_projectiles
CMP.b #$04 : BEQ .no_disable_projectiles
CMP.b #$05 : BEQ .no_disable_projectiles
CMP.b #$06 : BEQ .no_disable_projectiles
.disable_projectiles
INC $0BA0, X
.no_disable_projectiles
RTL
;--------------------------------------------------------------------------------
DrawBombInMenu:
JSL LoadBombCount16 : AND.w #$00FF : BEQ .noBombs
LDA SpecialWeapons : AND.w #$007F : CMP.w #$0001 : BNE .vanillaBombs
LDA.l SpecialWeaponLevel : AND.w #$00FF : BEQ .noBombs : STA $02
LDA.w #$FC81 : STA $04
BRA .done
.vanillaBombs
LDA.w #$0001 : STA $02
LDA.w #$F699 : STA $04
BRA .done
.noBombs
LDA.w #$0000 : STA $02
LDA.w #$F699 : STA $04
.done
RTL
;--------------------------------------------------------------------------------
DrawSwordInMenu:
LDA SpecialWeapons : AND.w #$007F : CMP.w #$0001 : BEQ .specialSword
CMP.w #$0003 : BEQ .specialSword
CMP.w #$0004 : BEQ .specialSword
CMP.w #$0005 : BEQ .specialSword
CMP.w #$0008 : BEQ .specialSword
LDA SwordEquipment : AND.w #$00FF : CMP.w #$00FF : BEQ .noSword
.hasSword
STA $02
LDA.w #$F859 : STA $04
RTL
.noSword
LDA.w #$0000 : STA $02
LDA.w #$F859 : STA $04
RTL
.specialSword
LDA SpecialWeaponLevel : AND.w #$00FF : STA $02
LDA.w #$FC51 : STA $04
RTL
;--------------------------------------------------------------------------------
DrawBombInYBox:
CPX.w #$0004 : BNE .done
LDA SpecialWeapons : AND.w #$007F : CMP.w #$0001 : BNE .vanilla
LDA SpecialWeaponLevel : AND.w #$00FF : CLC : ADC.w #$00BD : BRA .done
.vanilla
LDA.w #$0001
.done
RTL
;--------------------------------------------------------------------------------
BombIcon:
dw $207F, $207F, $3C88, $3C89, $2C88, $2C89, $2488, $2489, $2888, $2889,$2888, $2889
DrawBombOnHud:
PHB
LDA.w #$0149
LDX.w #$86B0
LDY.w #$C700
MVN $7E, $21
PLB
LDA.l SpecialWeapons : AND.w #$007F : CMP.w #$0001 : BNE .regularBombs
LDA.l SpecialWeaponLevel : AND.w #$00FF : ASL #2 : TAX
LDA.l BombIcon, X : STA.l $7EC71A
LDA.l BombIcon+2, X : STA.l $7EC71C
.regularBombs
RTL
;--------------------------------------------------------------------------------
BombSpriteColor:
db $04, $08, $04, $02, $0A, $0A
SetBombSpriteColor:
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BNE .normal
PHX
LDA.l SpecialWeaponLevel
TAX
LDA.l BombSpriteColor, X
STA $0B
PLX
RTL
.normal
LDA #$04 : STA $0B
RTL
;--------------------------------------------------------------------------------
StoreSwordDamage:
LDA.l SpecialWeapons : AND.b #$7F : CMP #$02 : BEQ +
LDA.l $06ED39, X : RTL
+
LDA #$05
RTL
;--------------------------------------------------------------------------------
BeeDamageClass:
db $FF
db $06, $00, $07, $08, $0A
db $0B, $0C, $0D, $0E, $0F
db $FF, $03, $FF, $FF, $FF
db $FF, $01, $01, $FF, $FF
;--------------------------------------------------------------------------------
CheckDetonateBomb:
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BEQ .detonate_bombs
CMP.b #$06 : BEQ .release_bee
CLC : RTL
.detonate_bombs
LDX.b #09
.check_ancilla
LDA.w $0C4A, X
CMP.b #$07
BNE .next_ancilla
LDA.b #03
STA.w $039F, X
.next_ancilla
DEX
BPL .check_ancilla
JMP .done
.release_bee
LDX.w $0202
LDA.l BeeDamageClass, X : CMP.b #$FF : BEQ .nope
JSL $1EDCC9
BMI .nope
LDX.w $0202
LDA.l BeeDamageClass, X
CMP.b #$06 : BNE .set_bee_class
LDA.l $7EF340 : CMP.b #$03 : !BGE .silver_arrows
LDA.b #$06
BRA .set_bee_class
.silver_arrows
LDA.b #$09
.set_bee_class
STA.w $0ED0, Y
BRA .done
.nope
LDA.b #$3C
STA.w $0CF8
JSL $0DBB67
ORA.w $0CF8
STA.w $012E
.done
SEC
RTL
;--------------------------------------------------------------------------------
SetBeeType:
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$06 : BEQ .bee_mode
LDX.w $0202
.check_bee_type
LDA.l $7EF33F, X
TAX
LDA.l $7EF35B, X
CMP.b #$08
BNE .regular_bee
LDA.b #$01
STA.w $0EB0, Y
.regular_bee
LDA.b #$01
STA.w $0ED0, Y
RTL
.bee_mode
LDX.w $0202
CPX.b #$10 : BEQ .check_bee_type
BRA .regular_bee
;--------------------------------------------------------------------------------
ArrghusBoing:
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$06 : BNE .done
LDA.w $0F60, X : AND.b #$BF : STA.w $0F60, X
.done
; what we wrote over
LDA.b #$03
STA.w $0D80, X
RTL
;--------------------------------------------------------------------------------
BeeCheckTarget:
CPY.w $0FA0
BEQ .unsuitable_target
LDA.w $0DD0,Y
CMP.b #$09
BCC .unsuitable_target
LDA.w $0F00,Y
BNE .unsuitable_target
; in bee-mode skip targets that the bee can't hurt
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$06 : BNE +
JSR BeeCheckDamage
CMP.b #$00 : BEQ .unsuitable_target
+
LDA.w $0E40,Y
BMI .potential_target
LDA.w $0F20,Y
CMP.w $0F20,X
BNE .unsuitable_target
LDA.w $0F60,Y
AND.b #$40
BEQ +
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$06 : BNE .unsuitable_target
; in bee mode, allow targetting anti-fairies, bunny beams, and keese
LDA.w $0E20,Y
CMP.b #$15 : BEQ + ; anti-fairy
CMP.b #$6F : BEQ + ; keese
CMP.b #$D1 : BEQ + ; bunny beam
BRA .unsuitable_target
+
LDA.w $0BA0,Y
BEQ .valid_target
BRA .unsuitable_target
.potential_target
LDA.w $0EB0,X
BEQ .unsuitable_target
LDA.w $0CD2,Y
AND.b #$40
BNE .valid_target
.unsuitable_target
CLC : RTL
.valid_target
SEC : RTL
;--------------------------------------------------------------------------------
BeeCheckDamage:
PHX : PHP
REP #$20
LDA.w $0E20,Y : AND.w #$00FF
ASL #4
SEP #$20
ORA.w $0ED0,X
REP #$30
TAX
SEP #$20
JSL LookupDamageLevel
SEP #$10
PLP : PLX
RTS
;--------------------------------------------------------------------------------
CheckBugNet:
LDA.w $037A : AND.b #$10 : BEQ .done ; normal behavior if not bugnet
PHP ; we want to preserve the carry bit
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$08 : BNE .return_10 ; normal behavior if not bugnet mode
.bugnet_mode
LDA.w $0E20, X : CMP.b #$E3 : BEQ .return_10 ; normal behavior if fairy
CMP.b #$79 : BEQ .return_10 ; normal behavior if bee
CMP.b #$B2 : BEQ .return_10 ; normal behavior if bee
PLP : LDA.b #$00 : RTL
.return_10
PLP : LDA.b #$10
.done
RTL
;--------------------------------------------------------------------------------
SetHammerClass:
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$08 : BNE .normal ; normal behavior if not bugnet mode
LDA.w $037A : AND.b #$10 : BEQ .normal ; normal behavior if not bugnet
LDA 4, S : TAX ; get sprite index off of stack
LDA.w $0E20, X : CMP.b #$88 : BNE .not_mothula
LDA.l SpecialWeaponLevel
CMP #$04 : !BGE .fix_mothula
BRA .done
.fix_mothula
LDA #$03
BRA .done
.not_mothula
LDA.l SpecialWeaponLevel
.done
STA.w $0CF2
RTL
.normal
LDA.w $0301
AND.b #$0A
BEQ .not_hammer
LDA.b #$03
STA.w $0CF2
.not_hammer
RTL
;--------------------------------------------------------------------------------

View File

@@ -168,13 +168,14 @@ CurrentGenericKeys: skip 1 ; Generic small keys
;================================================================================ ;================================================================================
; Tracking & Indicators ($7EF38C - $7EF3F0) ; Tracking & Indicators ($7EF38C - $7EF3F0)
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
InventoryTracking: skip 2 ; b r m p n s k f - - - - - - o q (bitfield) InventoryTracking: skip 2 ; - - - - - - o q b r m p n s k f (bitfield)
; b = Blue Boomerang | r = Red Boomerang | m = Mushroom Current ; b = Blue Boomerang | r = Red Boomerang | m = Mushroom Current
; p = Magic Powder | n = Mushroom Past | s = Shovel ; p = Magic Powder | n = Mushroom Past | s = Shovel
; k = Inactive Flute | f = Active Flute | o = Any bomb acquired ; k = Inactive Flute | f = Active Flute | o = Any bomb acquired
; q = Quickswap locked ; q = Quickswap locked
BowTracking: skip 2 ; b s p - - - - - - - - - - - - - (bitfield) BowTracking: skip 2 ; - - - - - - - - b s p f - - - - (bitfield)
; b = Bow | s = Silver Arrows Upgrade | p = Second Progressive Bow ; b = Any Bow | s = Silver Arrows Upgrade | p = Second Progressive Bow
; f = First progressive bow
; The front end writes two distinct progressive bow items. p ; The front end writes two distinct progressive bow items. p
; indicates whether the "second" has been found independent of ; indicates whether the "second" has been found independent of
; the first ; the first
@@ -182,7 +183,9 @@ ItemLimitCounts: skip 16 ; Keeps track of limited non-progressive items s
; See: ItemSubstitutionRules in tables.asm ; See: ItemSubstitutionRules in tables.asm
; Right now this is only used for three items but extra space is ; Right now this is only used for three items but extra space is
; reserved ; reserved
skip 37 ; Unused skip 35 ; Unused
SpecialWeaponLevel: skip 1 ; Keeps track of level of weapon in item modes
ItemOnB: skip 1 ; same table as $0202; $01 = arrows .. $14 = mirror
ProgressIndicator: skip 1 ; $00 = Pre-Uncle | $01 = Post-Uncle item | $02 = Zelda Rescued ProgressIndicator: skip 1 ; $00 = Pre-Uncle | $01 = Post-Uncle item | $02 = Zelda Rescued
; $03 = Agahnim 1 defeated ; $03 = Agahnim 1 defeated
; $04 and above don't do anything. $00-$02 used in standard mode ; $04 and above don't do anything. $00-$02 used in standard mode
@@ -313,7 +316,8 @@ HeartPieceCounter: skip 1 ; Total Number of heartpieces collected (integer
CrystalCounter: skip 1 ; Total Number of crystals collected (integer) CrystalCounter: skip 1 ; Total Number of crystals collected (integer)
DungeonsCompleted: skip 2 ; Bitfield indicating whether a dungeon's prize has been collected. DungeonsCompleted: skip 2 ; Bitfield indicating whether a dungeon's prize has been collected.
; This has the same shape as the dungeon item bitfields. ; This has the same shape as the dungeon item bitfields.
skip 44 ; Unused BombsPlaced: skip 2 ; Total Number of bombs placed (16-bit integer)
skip 42 ; Unused
ServiceSequenceRx: ; Service sequence receive ServiceSequenceRx: ; Service sequence receive
ServiceSequenceTx: ; Service sequence transmit ServiceSequenceTx: ; Service sequence transmit
ServiceSequence: skip 8 ; Service request block. See servicerequest.asm ServiceSequence: skip 8 ; Service request block. See servicerequest.asm
@@ -371,6 +375,26 @@ FileMarker: skip 1 ; $FF = Active save file | $00 = Inactive save f
skip 13 ; Unused skip 13 ; Unused
InverseChecksum: skip 2 ; Vanilla Inverse Checksum. Don't write unless computing checksum. InverseChecksum: skip 2 ; Vanilla Inverse Checksum. Don't write unless computing checksum.
;================================================================================
; Temporary Effects ($7F50C0 - $7F50CF)
;--------------------------------------------------------------------------------
base $7F50C0
SwordModifier: skip 1
ShieldModifier: skip 1 ; (not implemented)
ArmorModifier: skip 1
MagicModifier: skip 1
LightConeModifier: skip 1
CuccoStormModifier: skip 1
OldManDashModifier: skip 1
IcePhysicsModifier: skip 1
InfiniteArrowsModifier: skip 1
InfiniteBombsModifier: skip 1
InfiniteMagicModifier: skip 1
InvertDPadModifier: skip 1
TemporaryOHKO: skip 1
SpriteSwapper: skip 1
BootsModifier: skip 1 ; (0=Off, 1=Always, 2=Never)
;================================================================================ ;================================================================================
; Expanded SRAM ($7F6000 - $7F6FFF) ; Expanded SRAM ($7F6000 - $7F6FFF)
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -527,6 +551,7 @@ endmacro
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
%assertSRAM(InventoryTracking, $7EF38C) %assertSRAM(InventoryTracking, $7EF38C)
%assertSRAM(BowTracking, $7EF38E) %assertSRAM(BowTracking, $7EF38E)
%assertSRAM(SpecialWeaponLevel, $7EF3C3)
%assertSRAM(ItemLimitCounts, $7EF390) %assertSRAM(ItemLimitCounts, $7EF390)
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
%assertSRAM(GameCounter, $7EF3FF) %assertSRAM(GameCounter, $7EF3FF)

View File

@@ -184,6 +184,16 @@ IncrementChestTurnCounter:
PLA PLA
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
IncrementBombsPlacedCounter:
PHA
LDA StatsLocked : BNE +
PHP : REP #$20
LDA BombsPlaced : INC : STA BombsPlaced
PLP
+
PLA
RTL
;--------------------------------------------------------------------------------
IncrementChestCounter: IncrementChestCounter:
LDA.b #$01 : STA $02E9 ; thing we wrote over LDA.b #$01 : STA $02E9 ; thing we wrote over
PHA PHA
@@ -204,9 +214,9 @@ RTL
DecrementItemCounter: DecrementItemCounter:
PHA PHA
LDA StatsLocked : BNE + LDA StatsLocked : BNE +
REP #$20 REP #$20
LDA TotalItemCounter : DEC : STA TotalItemCounter LDA TotalItemCounter : DEC : STA TotalItemCounter
SEP #$20 SEP #$20
+ +
PLA PLA
RTL RTL

View File

@@ -3,31 +3,67 @@
;=================================================================================================== ;===================================================================================================
table "creditscharmapbighi.txt" table "creditscharmapbighi.txt"
YourSpriteCreditsHi: YourSpriteCreditsHi:
db 2 db 2, 55, " " ; $238002
db 55
db " " ; $238002
table "creditscharmapbiglo.txt" table "creditscharmapbiglo.txt"
YourSpriteCreditsLo: YourSpriteCreditsLo:
db 2 db 2, 55, " " ; $238020
db 55
db " " ; $238020
table "creditscharmapbighi.txt"
CollectionRateHi: CollectionRateHi:
db 2, 55 db 2, 55, "COLLECTION RATE /216" ; $23803E, "216" at $238057
db $5F, $6B, $68, $68, $61, $5F, $70, $65, $6B, $6A, $9F, $6E, $5D, $70, $61 ; "Collection Rate"
db $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F ; " " 8 spaces
print "Collection Rate High Start: ", pc
db $9F, $A2 ; " /"
db $55, $54, $59 ; 216
table "creditscharmapbiglo.txt"
CollectionRateLo: CollectionRateLo:
db 2, 55 db 2, 55, "COLLECTION RATE /216" ; $23805C, "216" at $238075
db $85, $91, $8E, $8E, $87, $85, $96, $8B, $91, $90, $9F, $94, $83, $96, $87 ; "Collection Rate"
db $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F ; " " 8 spaces table "creditscharmapbighi.txt"
print "Collection Rate Low Start: ", pc FirstSwordStatsHi:
db $9F, $C2 ; " /" db 2, 55, "FIRST SWORD " ; $23807A
db $7B, $7A, $7F ; 216
table "creditscharmapbiglo.txt"
FirstSwordStatsLo:
db 2, 55, "FIRST SWORD " ; $238098
table "creditscharmapbighi.txt"
SwordlessKillsHi:
db 2, 55, "SWORDLESS /13" ; $2380B6
table "creditscharmapbiglo.txt"
SwordlessKillsLo:
db 2, 55, "SWORDLESS /13" ; $2380D4
table "creditscharmapbighi.txt"
FighterSwordKillsHi:
db 2, 55, "FIGHTER'S SWORD /13" ; $2380F2
table "creditscharmapbiglo.txt"
FighterSwordKillsLo:
db 2, 55, "FIGHTER'S SWORD /13" ; $238110
table "creditscharmapbighi.txt"
MasterSwordKillsHi:
db 2, 55, "MASTER SWORD /13" ; $23812E
table "creditscharmapbiglo.txt"
MasterSwordKillsLo:
db 2, 55, "MASTER SWORD /13" ; $23814C
table "creditscharmapbighi.txt"
TemperedSwordKillsHi:
db 2, 55, "TEMPERED SWORD /13" ; $23816A
table "creditscharmapbiglo.txt"
TemperedSwordKillsLo:
db 2, 55, "TEMPERED SWORD /13" ; $238188
table "creditscharmapbighi.txt"
GoldSwordKillsHi:
db 2, 55, "GOLD SWORD /13" ; $2381A6
table "creditscharmapbiglo.txt"
GoldSwordKillsLo:
db 2, 55, "GOLD SWORD /13" ; $2381C4
;=================================================================================================== ;===================================================================================================
@@ -475,11 +511,15 @@ CreditsLineBlank:
%blankline() %blankline()
%bigcredits("ACHY ARTHEAU TARTHORON") %bigcredits("ACHY ARTHEAU")
%blankline() %blankline()
%bigcredits("GLAN PLAGUEDONE TWROXAS") %bigcredits("GLAN TWROXAS")
%blankline()
%bigcredits("PLAGUEDONE TARTHORON")
%blankline() %blankline()
%blankline() %blankline()
@@ -537,7 +577,11 @@ CreditsLineBlank:
%blankline() %blankline()
%bigcredits("MICHAELK FOUTON BONTA") %bigcredits("MICHAELK FOUTON")
%blankline()
%bigcredits("BONTA EMOSARU")
%blankline() %blankline()
@@ -577,12 +621,6 @@ CreditsLineBlank:
%emptyline() %emptyline()
%emptyline() %emptyline()
%emptyline() %emptyline()
%emptyline()
%emptyline()
%emptyline()
%emptyline()
%emptyline()
%emptyline()
;=================================================================================================== ;===================================================================================================
@@ -613,7 +651,8 @@ endif
%blankline() %blankline()
%blankline() %blankline()
%bigcreditsleft("FIRST SWORD") %addarbline(FirstSwordStatsHi)
%addarbline(FirstSwordStatsLo)
%blankline() %blankline()
@@ -636,23 +675,28 @@ endif
%blankline() %blankline()
%blankline() %blankline()
%bigcreditsleft("SWORDLESS /13") %addarbline(SwordlessKillsHi)
%addarbline(SwordlessKillsLo)
%blankline() %blankline()
%bigcreditsleft("FIGHTER'S SWORD /13") %addarbline(FighterSwordKillsHi)
%addarbline(FighterSwordKillsLo)
%blankline() %blankline()
%bigcreditsleft("MASTER SWORD /13") %addarbline(MasterSwordKillsHi)
%addarbline(MasterSwordKillsLo)
%blankline() %blankline()
%bigcreditsleft("TEMPERED SWORD /13") %addarbline(TemperedSwordKillsHi)
%addarbline(TemperedSwordKillsLo)
%blankline() %blankline()
%bigcreditsleft("GOLD SWORD /13") %addarbline(GoldSwordKillsHi)
%addarbline(GoldSwordKillsLo)
%blankline() %blankline()
%blankline() %blankline()
@@ -674,6 +718,10 @@ endif
%blankline() %blankline()
%bigcreditsleft("BOMBS PLACED")
%blankline()
%bigcreditsleft("SAVE AND QUITS") %bigcreditsleft("SAVE AND QUITS")
%blankline() %blankline()
@@ -693,11 +741,6 @@ endif
%bigcreditsleft("TOTAL LAG TIME") %bigcreditsleft("TOTAL LAG TIME")
%blankline() %blankline()
%blankline()
%blankline()
%blankline()
%blankline() %blankline()
@@ -729,42 +772,3 @@ endif
%emptyline() %emptyline()
;--------------------------------------------------------------------------------------------------- ;---------------------------------------------------------------------------------------------------
!FIRST_SWORD_X = 19
!FIRST_SWORD_Y = 310
!PEGASUS_BOOTS_X = 19
!PEGASUS_BOOTS_Y = 313
!FLUTE_X = 19
!FLUTE_Y = 316
!MIRROR_X = 19
!MIRROR_Y = 319
!SWORDLESS_X = 23
!SWORDLESS_Y = 327
!FIGHTERS_SWORD_X = 23
!FIGHTERS_SWORD_Y = 330
!MASTER_SWORD_X = 23
!MASTER_SWORD_Y = 333
!TEMPERED_SWORD_X = 23
!TEMPERED_SWORD_Y = 336
!GOLD_SWORD_X = 23
!GOLD_SWORD_Y = 339
!DAMAGETAKEN_X = 26
!DAMAGETAKEN_Y = 346
!MAGICUSED_X = 26
!MAGICUSED_Y = 349
!BONKS_X = 26
!BONKS_Y = 352
!SAVE_AND_QUITS_X = 26
!SAVE_AND_QUITS_Y = 355
!DEATHS_X = 26
!DEATHS_Y = 358
!FAERIE_REVIVALS_X = 26
!FAERIE_REVIVALS_Y = 361
!TOTAL_MENU_TIME_X = 19
!TOTAL_MENU_TIME_Y = 364
!TOTAL_LAG_TIME_X = 19
!TOTAL_LAG_TIME_Y = 367
!COLLECTION_RATE_X = 22
!COLLECTION_RATE_Y = 380
!TOTAL_TIME_X = 19
!TOTAL_TIME_Y = 383

View File

@@ -1,10 +1,51 @@
!FIRST_SWORD_X = 19
!FIRST_SWORD_Y = 310
!PEGASUS_BOOTS_X = 19
!PEGASUS_BOOTS_Y = 313
!FLUTE_X = 19
!FLUTE_Y = 316
!MIRROR_X = 19
!MIRROR_Y = 319
!SWORDLESS_X = 23
!SWORDLESS_Y = 327
!FIGHTERS_SWORD_X = 23
!FIGHTERS_SWORD_Y = 330
!MASTER_SWORD_X = 23
!MASTER_SWORD_Y = 333
!TEMPERED_SWORD_X = 23
!TEMPERED_SWORD_Y = 336
!GOLD_SWORD_X = 23
!GOLD_SWORD_Y = 339
!DAMAGETAKEN_X = 26
!DAMAGETAKEN_Y = 346
!MAGICUSED_X = 26
!MAGICUSED_Y = 349
!BONKS_X = 26
!BONKS_Y = 352
!BOMBS_X = 26
!BOMBS_Y = 355
!SAVE_AND_QUITS_X = 26
!SAVE_AND_QUITS_Y = 358
!DEATHS_X = 26
!DEATHS_Y = 361
!FAERIE_REVIVALS_X = 26
!FAERIE_REVIVALS_Y = 364
!TOTAL_MENU_TIME_X = 19
!TOTAL_MENU_TIME_Y = 367
!TOTAL_LAG_TIME_X = 19
!TOTAL_LAG_TIME_Y = 370
!COLLECTION_RATE_X = 22
!COLLECTION_RATE_Y = 380
!TOTAL_TIME_X = 19
!TOTAL_TIME_Y = 383
;(address, type, shiftRight, bits, digits, xPos, lineNumber) ;(address, type, shiftRight, bits, digits, xPos, lineNumber)
%AddStat(SwordTime, 1, 0, 32, 4, !FIRST_SWORD_X, !FIRST_SWORD_Y) %AddStat(SwordTime, 1, 0, 32, 4, !FIRST_SWORD_X, !FIRST_SWORD_Y)
%AddStat(BootsTime, 1, 0, 32, 4, !PEGASUS_BOOTS_X, !PEGASUS_BOOTS_Y) %AddStat(BootsTime, 1, 0, 32, 4, !PEGASUS_BOOTS_X, !PEGASUS_BOOTS_Y)
%AddStat(FluteTime, 1, 0, 32, 4, !FLUTE_X, !FLUTE_Y) %AddStat(FluteTime, 1, 0, 32, 4, !FLUTE_X, !FLUTE_Y)
%AddStat(MirrorTime, 1, 0, 32, 4, !MIRROR_X, !MIRROR_Y) %AddStat(MirrorTime, 1, 0, 32, 4, !MIRROR_X, !MIRROR_Y)
%AddStat(SwordlessBossKills, 0, 0, 08, 2, !SWORDLESS_X, !SWORDLESS_Y) %AddStat(SwordlessBossKills, 0, 0, 04, 2, !SWORDLESS_X, !SWORDLESS_Y)
%AddStat(SwordBossKills, 0, 4, 04, 2, !FIGHTERS_SWORD_X, !FIGHTERS_SWORD_Y) %AddStat(SwordBossKills, 0, 4, 04, 2, !FIGHTERS_SWORD_X, !FIGHTERS_SWORD_Y)
%AddStat(SwordBossKills, 0, 0, 04, 2, !MASTER_SWORD_X, !MASTER_SWORD_Y) %AddStat(SwordBossKills, 0, 0, 04, 2, !MASTER_SWORD_X, !MASTER_SWORD_Y)
%AddStat(SwordBossKills+1, 0, 4, 04, 2, !TEMPERED_SWORD_X, !TEMPERED_SWORD_Y) %AddStat(SwordBossKills+1, 0, 4, 04, 2, !TEMPERED_SWORD_X, !TEMPERED_SWORD_Y)
@@ -12,6 +53,7 @@
%AddStat(DamageCounter, 0, 0, 16, 5, !DAMAGETAKEN_X, !DAMAGETAKEN_Y) %AddStat(DamageCounter, 0, 0, 16, 5, !DAMAGETAKEN_X, !DAMAGETAKEN_Y)
%AddStat(MagicCounter, 0, 0, 16, 5, !MAGICUSED_X, !MAGICUSED_Y) %AddStat(MagicCounter, 0, 0, 16, 5, !MAGICUSED_X, !MAGICUSED_Y)
%AddStat(BonkCounter, 0, 0, 08, 3, !BONKS_X, !BONKS_Y) %AddStat(BonkCounter, 0, 0, 08, 3, !BONKS_X, !BONKS_Y)
%AddStat(BombsPlaced, 0, 0, 16, 4, !BOMBS_X, !BOMBS_Y)
%AddStat(SaveQuitCounter, 0, 0, 08, 2, !SAVE_AND_QUITS_X, !SAVE_AND_QUITS_Y) %AddStat(SaveQuitCounter, 0, 0, 08, 2, !SAVE_AND_QUITS_X, !SAVE_AND_QUITS_Y)
%AddStat(DeathCounter, 0, 0, 08, 2, !DEATHS_X, !DEATHS_Y) %AddStat(DeathCounter, 0, 0, 08, 2, !DEATHS_X, !DEATHS_Y)
%AddStat(FaerieRevivalCounter, 0, 0, 08, 3, !FAERIE_REVIVALS_X, !FAERIE_REVIVALS_Y) %AddStat(FaerieRevivalCounter, 0, 0, 08, 3, !FAERIE_REVIVALS_X, !FAERIE_REVIVALS_Y)

View File

@@ -39,25 +39,34 @@ LoadSwordForDamage:
JSR.w LoadModifiedSwordLevel ; load normal sword value JSR.w LoadModifiedSwordLevel ; load normal sword value
RTL RTL
;================================================================================ ;================================================================================
macro LookupDamageSubclass(table_address)
PHP
REP #$20 ; set 16-bit accumulator
TXA : LSR : TAX : BCS +
PLP
LDA.l <table_address>, X
LSR #4
BRA ++
+
PLP
LDA.l <table_address>, X
AND.b #$0F
++
endmacro
;================================================================================
;!StalfosBombDamage = "$7F509D" ;!StalfosBombDamage = "$7F509D"
LookupDamageLevel: LookupDamageLevel:
CPX.w #$0918 : BNE + CPX.w #$0918 : BNE +
LDA.l !StalfosBombDamage LDA.l !StalfosBombDamage
RTL RTL
+ +
PHP LDA SpecialWeapons : AND.b #$7F : CMP.b #$02 : BEQ .pseudo_table
REP #$20 ; set 16-bit accumulator LDA SpecialWeapons : AND.b #$80 : BNE .bomb_table
TXA : LSR : TAX : BCS .lower %LookupDamageSubclass(Damage_Table) : RTL
.upper .bomb_table
PLP %LookupDamageSubclass(Damage_Table_Bombs) : RTL
LDA.l Damage_Table, X .pseudo_table
LSR #4 %LookupDamageSubclass(Damage_Table_Pseudo) : RTL
RTL
.lower
PLP
LDA.l Damage_Table, X
AND.b #$0F
RTL
;================================================================================ ;================================================================================
; $7F50C0 - Sword Modifier ; $7F50C0 - Sword Modifier
LoadModifiedSwordLevel: ; returns short LoadModifiedSwordLevel: ; returns short
@@ -96,29 +105,40 @@ LoadModifiedMagicLevel:
RTL RTL
;================================================================================ ;================================================================================
; $7E0348 - Ice Value ; $7E0348 - Ice Value
; $7F50C7 - Ice Modifier ; $7F50C7 - Temporary Ice Modifier
; $30802D - Permanent Ice Modifier ($01 bit)
LoadModifiedIceFloorValue:
LDA $A0 : CMP #$91 : BEQ + : CMP #$92 : BEQ + : CMP #$93 : BEQ + ; mire basement currently broken - not sure why
LDA $5D : CMP #$01 : BEQ + : CMP #$17 : BEQ + : CMP #$1C : BEQ +
LDA $5E : CMP #$02 : BEQ +
LDA $5B : BNE +
LDA.l $30802D : BIT #$01 : BEQ ++
LDA $A0 : CMP #$16 : BEQ ++ ; swamp supertile with current -- fine for temporary physics but impossible without boots for permanent
LDA.w $0348 : ORA $7F50C7 : ORA #$10 : RTS
++ : LDA.w $0348 : ORA $7F50C7 : RTS
+ : LDA.w $0348
RTS
LoadModifiedIceFloorValue_a11: LoadModifiedIceFloorValue_a11:
LDA $A0 : CMP #$91 : BEQ + : CMP #$92 : BEQ + : CMP #$93 : BEQ + ; mire basement currently broken - not sure why JSR LoadModifiedIceFloorValue : AND.b #$11 : RTL
LDA $5D : CMP #$01 : BEQ + : CMP #$17 : BEQ + : CMP #$1C : BEQ +
LDA $5E : CMP #$02 : BEQ +
LDA $5B : BNE +
LDA.w $0348 : ORA $7F50C7 : AND.b #$11 : RTL
+ : LDA.w $0348 : AND.b #$11
RTL
LoadModifiedIceFloorValue_a01: LoadModifiedIceFloorValue_a01:
LDA $A0 : CMP #$91 : BEQ + : CMP #$92 : BEQ + : CMP #$93 : BEQ + ; mire basement currently broken - not sure why JSR LoadModifiedIceFloorValue : AND.b #$01 : RTL
LDA $5D : CMP #$01 : BEQ + : CMP #$17 : BEQ + : CMP #$1C : BEQ +
LDA $5E : CMP #$02 : BEQ +
LDA $5B : BNE +
LDA.w $0348 : ORA $7F50C7 : AND.b #$01 : RTL
+ : LDA.w $0348 : AND.b #$01
RTL
;================================================================================ ;================================================================================
CheckTabletSword: CheckTabletSword:
LDA.l AllowHammerTablets : BEQ + LDA.l AllowHammerTablets : BEQ +
LDA HammerEquipment : BEQ + ; check for hammer LDA HammerEquipment : BNE .allow ; check for hammer
LDA.b #$02 : RTL
+ +
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$01 : BEQ .check_special
CMP.b #$03 : BEQ .check_special
CMP.b #$04 : BEQ .check_special
CMP.b #$05 : BEQ .check_special
CMP.b #$06 : BEQ .allow
CMP.b #$08 : BEQ .check_special
BRA .normal
.allow
LDA.b #$02 : RTL
.check_special
LDA SpecialWeaponLevel : CMP #$02 : !BGE .allow ; check for master bombs
.normal
LDA SwordEquipment ; get actual sword value LDA SwordEquipment ; get actual sword value
RTL RTL
;================================================================================ ;================================================================================
@@ -126,15 +146,27 @@ GetSwordLevelForEvilBarrier:
LDA.l AllowHammerEvilBarrierWithFighterSword : BEQ + LDA.l AllowHammerEvilBarrierWithFighterSword : BEQ +
LDA #$FF : RTL LDA #$FF : RTL
+ +
LDA SwordEquipment LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$08 : BEQ +
RTL LDA.l SwordEquipment : RTL
+
LDA.l SpecialWeaponLevel : RTL
;================================================================================ ;================================================================================
CheckGanonHammerDamage: CheckGanonHammerDamage:
LDA.l HammerableGanon : BEQ + LDA.l HammerableGanon : BEQ +
LDA $0E20, X : CMP.b #$D8 ; original behavior except ganon LDA $0E20, X : CMP.b #$D8 ; original behavior except ganon
RTL RTL
+ +
LDA.l GanonVulnerabilityItem : CMP.b #$0C : BEQ +
LDA $0E20, X : CMP.b #$D6 ; original behavior LDA $0E20, X : CMP.b #$D6 ; original behavior
RTL
+
LDA $0E20, X : CMP.b #$D8 : BCC +
RTL
+
CMP.b #$D6 : BNE +
RTL
+
CLC
RTL RTL
;================================================================================ ;================================================================================
GetSmithSword: GetSmithSword:
@@ -161,7 +193,7 @@ GetSmithSword:
REP #$20 : LDA CurrentRupees : !SUB.w #$000A : STA CurrentRupees : SEP #$20 ; Take 10 rupees REP #$20 : LDA CurrentRupees : !SUB.w #$000A : STA CurrentRupees : SEP #$20 ; Take 10 rupees
JSL ItemSet_SmithSword JSL ItemSet_SmithSword
.done .done
JML.l Smithy_AlreadyGotSword JML.l Smithy_AlreadyGotSword
;================================================================================ ;================================================================================

View File

@@ -98,7 +98,44 @@ db #$02 ; #$02 = Tempered Sword (default)
;org $05EBD4 ; PC 0x2EBD4 - sprite_zelda.asm:23 - (LDA $7EF359 : CMP.b #$02 : BCS .hasMasterSword) - Zelda Spawnpoint Sword Check ;org $05EBD4 ; PC 0x2EBD4 - sprite_zelda.asm:23 - (LDA $7EF359 : CMP.b #$02 : BCS .hasMasterSword) - Zelda Spawnpoint Sword Check
;db #$05 ; #$02 = Tempered Sword (default) - #$05 = All Swords ;db #$05 ; #$02 = Tempered Sword (default) - #$05 = All Swords
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
; 0x18002B- 0x180030 (Unused) ; 0x18002B (Unused)
;--------------------------------------------------------------------------------
org $30802C ; PC 0x18002C
AllowedItemOnB:
db #$00
; $00 = None (default)
; $01 - $20 = Only selected item
; $FF = Any valid
;--------------------------------------------------------------------------------
org $30802D ; PC 0x18002D
ChallengeModes:
; ---- ---i
; i: Permanent Ice Physics
db #$00 ; #$00 = Default behavior;
;--------------------------------------------------------------------------------
org $30802E ; PC 0x18002E
GanonVulnerabilityItem:
db #$00 ; #$00 = Default behavior (silver arrows)
;--------------------------------------------------------------------------------
org $30802F ; PC 0x18002F
SpecialWeapons:
db #$00
; s - - - m m m m (bitfield)
; s - only swords damage can hurt enemies
; m - special weapon mode
; $00 = Off (default)
; $01 = Bomb mode
; $02 = Pseudosword
; $03 = Byrna mode
; $04 = Somaria mode
; $05 = Canes mode
; $06 = Bee mode
; $07 = Unused
; $08 = Bugnet mode
;--------------------------------------------------------------------------------
org $308030 ; PC 0x180030
EnableSRAMTrace:
db #$00 ; #$00 = Off (default) - #$01 = On
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $308031 ; PC 0x180031 org $308031 ; PC 0x180031
EnableEasterEggs: EnableEasterEggs:
@@ -214,10 +251,13 @@ db #$00 ; #$00 = Off (default) - #$01 = On (frog/smith can enter multi-entrance
org $30804D ; PC 0x18004D org $30804D ; PC 0x18004D
EscapeAssist: ; ScrubMode: EscapeAssist: ; ScrubMode:
db #$00 db #$00
;---- -mba ;-MBA -mba
;m - Infinite Magic ;M - Infinite Magic (after escape)
;b - Infinite Bombs ;B - Infinite Bombs (after escape)
;a - Infinite Arrows ;A - Infinite Arrows (after escape)
;m - Infinite Magic (during escape)
;b - Infinite Bombs (during escape)
;a - Infinite Arrows (during escape)
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $30804E ; PC 0x18004E org $30804E ; PC 0x18004E
UncleRefill: UncleRefill:
@@ -233,7 +273,7 @@ db #$01 ; #$00 = Off - #$01 = On (default)
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $308050 ; PC 0x180050 - 0x18005D org $308050 ; PC 0x180050 - 0x18005D
CrystalPendantFlags_2: CrystalPendantFlags_2:
db $02 ; Ganons Tower - because 5D is not available right now - sewers doesn't get one db $02 ; Ganons Tower - because 5D is not available right now - sewers doesn't get one
db $04 ; Hyrule Castle db $04 ; Hyrule Castle
db $00 ; Eastern Palace db $00 ; Eastern Palace
db $00 ; Desert Palace db $00 ; Desert Palace
@@ -241,7 +281,7 @@ CrystalPendantFlags_2:
db $40 ; Swamp Palace db $40 ; Swamp Palace
db $40 ; Palace of Darkness db $40 ; Palace of Darkness
db $40 ; Misery Mire db $40 ; Misery Mire
db $40 ; Skull Woods db $40 ; Skull Woods
db $40 ; Ice Palace db $40 ; Ice Palace
.hera .hera
db $00 ; Tower of Hera db $00 ; Tower of Hera
@@ -384,8 +424,6 @@ org $30808F ; PC 0x18008F
SwapAgaGanonsTower: SwapAgaGanonsTower:
db $00 ; #$00 = Off (default) - #$01 = On db $00 ; #$00 = Off (default) - #$01 = On
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
; 0x18008F (unused)
;--------------------------------------------------------------------------------
org $308090 ; PC 0x180090 - 0x180097 org $308090 ; PC 0x180090 - 0x180097
ProgressiveSwordLimit: ProgressiveSwordLimit:
db #$04 ; #$04 - 4 Swords (default) db #$04 ; #$04 - 4 Swords (default)
@@ -426,7 +464,11 @@ org $30809D
DungeonMapIcons: DungeonMapIcons:
db $01 db $01
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
; 0x18009E - 0x18009F (unused) ; 0x18009E (unused)
;--------------------------------------------------------------------------------
org $30809F ; PC 0x18009F
SeededRNG:
db $01 ; #$00 = Off - #$01 = Seeded RNG (default for rando)
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $3080A0 ; PC 0x1800A0 - 0x1800A4 org $3080A0 ; PC 0x1800A0 - 0x1800A4
Bugfix_MirrorlessSQToLW: Bugfix_MirrorlessSQToLW:
@@ -644,7 +686,7 @@ dw $6434 ; #6434 - Crystal
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $02A09B ; PC 0x1209B - Bank02.asm:5802 - (pool MilestoneItem_Flags:) org $02A09B ; PC 0x1209B - Bank02.asm:5802 - (pool MilestoneItem_Flags:)
CrystalPendantFlags: CrystalPendantFlags:
db $00 ; Sewers db $00 ; Sewers
db $00 ; Hyrule Castle db $00 ; Hyrule Castle
db $04 ; Eastern Palace db $04 ; Eastern Palace
db $02 ; Desert Palace db $02 ; Desert Palace
@@ -652,7 +694,7 @@ CrystalPendantFlags:
db $10 ; Swamp Palace db $10 ; Swamp Palace
db $02 ; Palace of Darkness db $02 ; Palace of Darkness
db $01 ; Misery Mire db $01 ; Misery Mire
db $40 ; Skull Woods db $40 ; Skull Woods
db $04 ; Ice Palace db $04 ; Ice Palace
.hera .hera
db $01 ; Tower of Hera db $01 ; Tower of Hera
@@ -1404,6 +1446,16 @@ db $04
;AD - Small Key of Ganon's Tower ;AD - Small Key of Ganon's Tower
;AE - Reserved ;AE - Reserved
;AF - Generic Small Key ;AF - Generic Small Key
;B0 - Bee Trap
;B1 - Apples
;B2 - Fairy
;B3 - Chicken
;B4 - Big Magic
;B5 - 5 Arrows
;C0 - Progressive Bomb
;C1 - Progressive Cane
;C2 - Progressive Bug Net
;================================================================================ ;================================================================================
;;Residual Portal ;;Residual Portal
;org $0283E0 ; PC 0x103E0 (Bank02.asm:816) (BNE) ;org $0283E0 ; PC 0x103E0 (Bank02.asm:816) (BNE)

View File

@@ -2,7 +2,6 @@
; Challenge Timer ; Challenge Timer
;================================================================================ ;================================================================================
!Temp = "$7F5020" !Temp = "$7F5020"
!TemporaryOHKO = "$7F50CC"
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
!CLOCK_HOURS = "$7F5080" ; $7F5080 - $7F5083 - Clock Hours !CLOCK_HOURS = "$7F5080" ; $7F5080 - $7F5083 - Clock Hours
!CLOCK_MINUTES = "$7F5084" ; $7F5084 - $7F5087 - Clock Minutes !CLOCK_MINUTES = "$7F5084" ; $7F5084 - $7F5087 - Clock Minutes
@@ -176,7 +175,7 @@ DrawChallengeTimer:
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
OHKOTimer: OHKOTimer:
LDA !TemporaryOHKO : BNE .kill LDA TemporaryOHKO : BNE .kill
LDA.l TimeoutBehavior : CMP #$02 : BNE + LDA.l TimeoutBehavior : CMP #$02 : BNE +
LDA !Status : AND.b #$02 : BEQ + LDA !Status : AND.b #$02 : BEQ +
.kill .kill

View File

@@ -107,19 +107,19 @@ RTL
;DATA - Loot Identifier to Sprite ID ;DATA - Loot Identifier to Sprite ID
{ {
.gfxSlots .gfxSlots
db $06, $44, $45, $46, $2D, $20, $2E, $09 db $06, $44, $45, $46, $2D, $20, $2E, $09
db $09, $0A, $08, $05, $10, $0B, $2C, $1B db $09, $0A, $08, $05, $10, $0B, $2C, $1B
db $1A, $1C, $14, $19, $0C, $07, $1D, $2F db $1A, $1C, $14, $19, $0C, $07, $1D, $2F
db $07, $15, $12, $0D, $0D, $0E, $11, $17 db $07, $15, $12, $0D, $0D, $0E, $11, $17
db $28, $27, $04, $04, $0F, $16, $03, $13 db $28, $27, $04, $04, $0F, $16, $03, $13
db $01, $1E, $10, $00, $00, $00, $00, $00 db $01, $1E, $10, $00, $00, $00, $00, $00
db $00, $30, $22, $21, $24, $24, $24, $23 db $00, $30, $22, $21, $24, $24, $24, $23
db $23, $23, $29, $2A, $2C, $2B, $03, $03 db $23, $23, $29, $2A, $2C, $2B, $03, $03
db $34, $35, $31, $33, $02, $32, $36, $37 db $34, $35, $31, $33, $02, $32, $36, $37
db $2C, $43, $0C, $38, $39, $3A, $F9, $3C db $2C, $43, $0C, $38, $39, $3A, $F9, $3C
; db $2C, $06, $0C, $38, $FF, $FF, $FF, $FF ; db $2C, $06, $0C, $38, $FF, $FF, $FF, $FF
@@ -161,8 +161,10 @@ RTL
db $3B ; Big Magic db $3B ; Big Magic
db $4A ; Good Bee db $4A ; Good Bee
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
db $13 ; Bomb Upgrade
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused db $07 ; Cane Upgrade
db $27 ; Bug Net Upgrade
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Reserved db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Reserved
@@ -195,7 +197,7 @@ GetSpritePalette:
;-------- ;--------
TAX : LDA.l .gfxPalettes, X ; look up item gfx TAX : LDA.l .gfxPalettes, X ; look up item gfx
PLB : PLX PLB : PLX
CMP.b #$F8 : !BGE .specialHandling CMP.b #$F6 : !BGE .specialHandling
RTL RTL
.specialHandling .specialHandling
CMP.b #$FD : BNE ++ ; Progressive Sword CMP.b #$FD : BNE ++ ; Progressive Sword
@@ -245,6 +247,16 @@ RTL
LDA.b #$08 : RTL LDA.b #$08 : RTL
+ ; Any Bow + ; Any Bow
LDA.b #$02 : RTL LDA.b #$02 : RTL
++ : CMP.b #$F7 : BNE ++ ; Progressive Bombs
LDA SpecialWeaponLevel
CMP.b #$00 : BNE + ; No Bombs
LDA.b #$08 : RTL
+ : CMP.b #$01 : BNE + ; L1 Bombs
LDA.b #$04 : RTL
+ : CMP.b #$02 : BNE + ; L2 Bombs
LDA.b #$02 : RTL
+ ; Everything Else
LDA.b #$0A : RTL
++ : CMP.b #$FA : BNE ++ ; RNG Item (Single) ++ : CMP.b #$FA : BNE ++ ; RNG Item (Single)
JSL.l GetRNGItemSingle : JMP GetSpritePalette JSL.l GetRNGItemSingle : JMP GetSpritePalette
++ : CMP.b #$FB : BNE ++ ; RNG Item (Multi) ++ : CMP.b #$FB : BNE ++ ; RNG Item (Multi)
@@ -297,7 +309,10 @@ RTL
db $08 ; Big Magic db $08 ; Big Magic
db $04 ; Good Bee db $04 ; Good Bee
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused db $F7 ; Bomb Upgrade
db $0A ; Cane Upgrade
db $02 ; Bug Net Upgrade
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused
@@ -352,12 +367,12 @@ IsNarrowSprite:
++ CMP.b #$63 : BNE ++ ; RNG Item (Multi) ++ CMP.b #$63 : BNE ++ ; RNG Item (Multi)
JSL.l GetRNGItemMulti JSL.l GetRNGItemMulti
++ CMP.b #$64 : BEQ + ; Progressive Bow ++ CMP.b #$64 : BEQ + ; Progressive Bow
CMP.b #$65 : BNE .continue ; Progressive Bow (alt) CMP.b #$65 : BNE .continue ; Progressive Bow (alt)
+ : LDA BowEquipment : INC : LSR + : LDA BowEquipment : INC : LSR
CMP.l ProgressiveBowLimit : !BLT + CMP.l ProgressiveBowLimit : !BLT +
LDA.l ProgressiveBowReplacement LDA.l ProgressiveBowReplacement
JSL.l IsNarrowSprite JSL.l IsNarrowSprite
JMP .done JMP .done
.continue .continue
;-------- ;--------
@@ -387,7 +402,7 @@ RTL
db $15, $18, $24, $2A, $34, $35, $36, $42 db $15, $18, $24, $2A, $34, $35, $36, $42
db $43, $45, $59, $A0, $A1, $A2, $A3, $A4 db $43, $45, $59, $A0, $A1, $A2, $A3, $A4
db $A5, $A6, $A7, $A8, $A9, $AA, $AB, $AC db $A5, $A6, $A7, $A8, $A9, $AA, $AB, $AC
db $AD, $AE, $AF, $B4, $B5 db $AD, $AE, $AF, $B4, $B5, $C1
.smallSprites_end .smallSprites_end
} }
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -569,8 +584,8 @@ LoadModifiedTileBufferAddress:
LDA.w #$0000 : STA !TILE_UPLOAD_OFFSET_OVERRIDE LDA.w #$0000 : STA !TILE_UPLOAD_OFFSET_OVERRIDE
BRA .done BRA .done
+ +
LDX.w #$2D40 LDX.w #$2D40
LDY.w #$0002 LDY.w #$0002
.done .done
PLA PLA
RTL RTL
@@ -582,7 +597,7 @@ RTL
; out: Carry - 1 = On Screen, 0 = Off Screen ; out: Carry - 1 = On Screen, 0 = Off Screen
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
Sprite_IsOnscreen: Sprite_IsOnscreen:
JSR _Sprite_IsOnscreen_DoWork JSR _Sprite_IsOnscreen_DoWork
BCS + BCS +
REP #$20 REP #$20
LDA $E2 : PHA : !SUB.w #$0F : STA $E2 LDA $E2 : PHA : !SUB.w #$0F : STA $E2
@@ -597,11 +612,11 @@ Sprite_IsOnscreen:
RTL RTL
_Sprite_IsOnscreen_DoWork: _Sprite_IsOnscreen_DoWork:
LDA $0D10, X : CMP $E2 LDA $0D10, X : CMP $E2
LDA $0D30, X : SBC $E3 : BNE .offscreen LDA $0D30, X : SBC $E3 : BNE .offscreen
LDA $0D00, X : CMP $E8 LDA $0D00, X : CMP $E8
LDA $0D20, X : SBC $E9 : BNE .offscreen LDA $0D20, X : SBC $E9 : BNE .offscreen
SEC SEC
RTS RTS
.offscreen .offscreen

View File

@@ -0,0 +1,141 @@
;--------------------------------------------------------------------------------
!ANCILLA_DAMAGE = "$06EC84"
; start with X = sprite index, A = ancilla type index
;--------------------------------------------------------------------------------
Ganon_CheckAncillaVulnerability:
PHA
LDA $0EE0, X : BNE .not_vulnerable_pla
PLA
PHX : PHA
LDA.l GanonVulnerabilityItem
TAX : PLA
CMP.l Ganon_CheckByAncilla, X : BNE +
PLX : BRA .vulnerable
+
PLX : PHA
LDA.l GanonVulnerabilityItem
CMP #$01 : BEQ .silver_arrows
CMP #$11 : BEQ .somaria
BRA .not_vulnerable_pla
.silver_arrows
PLA : CMP #$09 : BNE .not_vulnerable
LDA $7EF340 : CMP.b #$03 : !BGE +
LDA #$09 : BRA .not_vulnerable
+
BRA .vulnerable
.hammer
BRA .not_vulnerable_pla ; NYI
.golden_bee
BRA .not_vulnerable_pla ; NYI
.somaria
PLA : CMP #$01 : BEQ .vulnerable
CMP #$2C : BEQ .vulnerable
BRA .vulnerable
.vulnerable
PHX
LDA.l GanonVulnerabilityItem
TAX
LDA.l Ganon_IFrameDuration, X
PLX
STA $0EE0, X ; give the poor pig some iframes
LDA #$20 : STA $0F10, X
LDA #$09
RTL
.not_vulnerable_pla
PLA
.not_vulnerable
PHX : TAX
LDA.l !ANCILLA_DAMAGE, X
PLX
RTL
; end with X = sprite index, A = damage class
;--------------------------------------------------------------------------------
!ANCILLA_CHECK_SPRITE_DAMAGE_PRESET_CLASS = "$06ECE6"
;--------------------------------------------------------------------------------
Ganon_CheckPowderVulnerability: ; we know it's powder
LDA.l GanonVulnerabilityItem : CMP #$05 : BNE .normal ; ganon not vulnerable to powder
LDA $0E20, X : CMP #$D7 : BNE .normal ; not stunned ganon
LDA $0EE0, X : BNE .normal ; ganon has iframes
LDA.l Ganon_IFrameDuration+$05
STA $0EE0, X ; give the poor pig some iframes
LDA #$20 : STA $0F10, X
LDA #$09
BRA .done
.normal
LDA.b #$0A
.done
JSL.l !ANCILLA_CHECK_SPRITE_DAMAGE_PRESET_CLASS
RTL
;--------------------------------------------------------------------------------
Ganon_CheckBeeVulnerability: ; we know it's a bee
; X is bee sprite index
; Y is target sprite index
LDA.l GanonVulnerabilityItem : CMP #$10 : BNE .normal ; ganon not vulnerable to bee
LDA $0E20, Y : CMP #$D7 : BNE .normal ; not stunned ganon
LDA $0EE0, Y : BNE .normal ; ganon has iframes
LDA.l Ganon_IFrameDuration+$10
STA $0EE0, Y ; give the poor pig some iframes
LDA #$20 : STA $0F10, Y
LDA #$09
BRA .done
.normal
LDA.l SpecialWeapons : AND.b #$7F : CMP.b #$06 : BNE .regular_bee
LDA.w $0ED0, X
BRA .done
.regular_bee
LDA.b #$01
.done
TYX
JSL.l !ANCILLA_CHECK_SPRITE_DAMAGE_PRESET_CLASS
RTL
;--------------------------------------------------------------------------------
Ganon_CheckInvincible:
LDA $04C5 : CMP.b #$02 : BEQ .not_transparent
LDA $0E20, X : CMP #$D7 : BNE .transparent ; non-stunned ganon
LDA $0301 : AND.b #$0A : BEQ .transparent ; normal behavior if not hammer
LDA.l GanonVulnerabilityItem : CMP #$0C : BNE .transparent ; ganon not vulnerable to hammer
.not_transparent
LDA #$00 : RTL
.transparent
LDA #$01 : RTL
; return non-zero A if ganon should be invincible
;--------------------------------------------------------------------------------
Ganon_CheckHammerVulnerability: ; we know it's hammer
LDA.l GanonVulnerabilityItem : CMP #$0C : BNE .normal ; ganon not vulnerable to hammer
LDA $0E20, X : CMP #$D7 : BNE .normal ; not stunned ganon
LDA $0EE0, X : BNE .normal ; ganon has iframes
LDA.l Ganon_IFrameDuration+$0C
STA $0EE0, X ; give the poor pig some iframes
LDA #$20 : STA $0F10, X
LDA #$09 : STA $0CF2 ; set damage class to silver
SEC : RTL
.normal
CLC : RTL
; return carry set bit if stunned Ganon and Ganon vulnerable to hammer
;--------------------------------------------------------------------------------
CheckBeeBoss:
; Y is sprite index
LDA.l SpecialWeapons : AND.b #$7F : CMP #$06 : BNE .not_bee_mode
LDA #$00 : RTL
.not_bee_mode
LDA.l GanonVulnerabilityItem : CMP #$10 : BNE .normal ; ganon not vulnerable to bee
LDA $0E20, Y : CMP #$D7 : BNE .normal ; not stunned ganon
LDA #$00 : RTL
.normal
LDA $0B6B, Y : AND.b #$02
RTL
; return non-zero A if entity is a boss (and bee should not attack)
;--------------------------------------------------------------------------------
Ganon_CheckByAncilla:
db #$00 ; default behavior--we shouldn't be checking the table here anyway
db #$00, #$05, #$1F, #$07, #$00
db #$02, #$0B, #$19, #$18, #$1C
db #$00, #$00, #$00, #$00, #$00
db #$00, #$00, #$31, #$00, #$00
Ganon_IFrameDuration:
db #$00 ; default behavior--we shouldn't be here anyway
db #$00, #$00, #$00, #$34, #$00
db #$00, #$00, #$00, #$00, #$00
db #$00, #$00, #$00, #$00, #$00
db #$00, #$00, #$00, #$00, #$00
;--------------------------------------------------------------------------------

View File

@@ -9,11 +9,11 @@ SpawnZelda:
+ RTL + RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
EndRainState: EndRainState:
LDA.l InitProgressIndicator : BIT.b #$80 : BNE + ; check for instant post-aga LDA.l InitProgressIndicator : BIT.b #$80 : BNE + ; check for instant post-aga
LDA.b #$02 : STA.l ProgressIndicator LDA.b #$02 : STA.l ProgressIndicator
RTL RTL
+ +
LDA.b #$03 : STA.l ProgressIndicator LDA.b #$03 : STA.l ProgressIndicator
LDA.l InitLumberjackOW : STA.l OverworldEventDataWRAM+$02 LDA.l InitLumberjackOW : STA.l OverworldEventDataWRAM+$02
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------