61 Commits

Author SHA1 Message Date
a5b068b15f Bombos-only stuffs? 2022-09-28 23:08:55 -07:00
bfc361ad3e Remove non-progressive bomb/cane upgrades 2022-09-18 15:02:37 -07:00
f7070dd30f Merge branch 'main' into kara 2022-07-23 17:33:34 -07:00
9d485e86cd Merge branch 'main' into kara 2022-07-23 16:47:01 -07:00
ba660409bf Bees in beemode only target enemies they can actually affect 2022-05-21 17:50:20 -07:00
3d93b0160f Golden Bee fix 2022-05-21 15:34:44 -07:00
bb35409bc8 Fix checking tablets in bee mode 2022-05-14 11:45:38 -07:00
ffdb5e837a Fix Trinexx 2022-05-12 12:53:29 -07:00
4d4ae6b894 Fix Arrghus 2022-04-30 21:21:21 -07:00
4f4f46352d More improvement to bee mode? 2022-04-30 14:04:22 -07:00
103c41ae94 Bee Mode WIP 2022-04-29 15:23:47 -07:00
90a4c50a01 unscramble lowercase letters for new font 2022-04-02 10:07:03 -07:00
3acc2a3f45 Merge branch 'main' into kara 2022-01-24 13:58:12 -08:00
5fd285c767 Make non-seeded rng a rom flag instead of compile flag 2022-01-24 13:53:03 -08:00
7f551ad1a4 Fix boomerang instakilling Armos Knights 2022-01-24 13:50:44 -08:00
Thomas Prescott
96e3427868 update credits 2022-01-03 12:27:15 -08:00
f629bcb15a Merge branch 'main' into kara 2021-12-29 18:56:36 -08:00
02ea894a40 Add permanent ice physics bit 2021-12-29 18:52:38 -08:00
ac81fcbf0f Fix bee damage 2021-12-27 14:05:28 -08:00
265089cedb Fix moldorm/somaria issue and add both-canes mode 2021-12-22 00:29:56 -08:00
6279f32fe3 Fix width of special cane freestanding sprites 2021-12-21 02:10:16 -08:00
843f1cad6f Prevent hitting stunned ganon in cane-mode with default vulnerability 2021-12-21 01:40:23 -08:00
c23b4ad5b2 Fix mothula/ganon breaking things (hopefully) 2021-12-20 19:02:02 -08:00
22b9c17f09 Remove bomb damage in cane modes 2021-12-20 17:37:49 -08:00
e210c85710 Add cane-only modes 2021-12-20 16:10:11 -08:00
e50641db11 Merge branch 'main' into kara 2021-12-20 01:35:56 -08:00
1ec9f22cea Shorten duration of boomerang stun 2021-11-10 00:08:57 -08:00
18a2214b23 Make boomerang in bomb-only mode stun enemies it would normally damage 2021-11-08 16:37:22 -08:00
f2a0cfc098 Fix bomb icons on file select/endgame screens 2021-11-07 23:58:06 -08:00
6565fbfd65 Show bomb level on file select screen in bomb-only mode 2021-11-07 19:32:57 -08:00
ae0a5c685a Unify handling of bomb colors in bomb-only mode 2021-11-07 00:28:28 -07:00
c323a71340 Merge branch 'main' into kara 2021-10-30 16:37:59 -07:00
f3e0def5a2 Allow early detonation of bombs and add build flag to remove static RNG 2021-10-30 09:02:57 -07:00
1fcde00d09 Merge remote-tracking branch 'kara/pseudoswords' into kara 2021-10-12 13:31:37 -07:00
123dcddc94 Merge branch 'main' into kara 2021-09-21 11:50:40 -07:00
7c8ef3afce Merge branch 'main' into kara 2021-08-26 08:39:23 -07:00
74e2f96e0a Merge branch 'fix_ohko' into kara 2021-08-09 15:32:51 -07:00
dafef001be Merge branch 'main' into kara 2021-08-02 18:59:58 -07:00
3f4db583f5 Add pseudo-sword mode 2021-07-24 16:06:01 -07:00
44f3f10bc1 Merge branch 'main' into kara 2021-07-22 12:05:40 -07:00
2bb5ec87b0 Fix Stalfos Knights in bomb-mode to have bombs instakill while collapsed 2021-07-20 20:33:28 -07:00
86a1f82d23 Color bombs in the HUD according to bomb level in bomb-only mode 2021-07-16 03:48:23 -07:00
1071b834cd Adjust things for replacing sword stats with bomb stats 2021-07-15 13:14:49 -07:00
2693e73a21 move storage of BOMB_LEVEL to make it play nicely with starting equipment 2021-07-13 11:15:07 -07:00
6d52427696 Fix bomb downgrades and track bomb stats in bomb-mode 2021-07-11 13:58:04 -07:00
374abe7e88 Merge branch 'kara' of github.com:ardnaxelarak/z3randomizer into kara 2021-07-11 13:56:01 -07:00
1b698808c3 Add L-1 bombs as separate from no bombs in bomb-only mode 2021-07-11 12:52:20 -07:00
62c81f2cf3 Fix extra space in credits 2021-07-11 02:14:01 -07:00
08166fe669 Allow bombing barrier and getting tablet checks with L2+ bombs 2021-07-10 17:40:08 -07:00
70ec318204 Fix junk graphics appearing during GAME OVER screen 2021-07-10 11:32:33 -07:00
081411a448 Merge branch 'main' into kara 2021-07-08 19:26:55 -07:00
55fd818f55 Merge branch 'main' into kara 2021-07-07 10:27:58 -07:00
37b90894e3 Show bombs placed in credits 2021-07-05 17:57:12 -07:00
f6983cee35 Fix quake not blobbing some enemies in bomb-only mode 2021-07-05 15:40:25 -07:00
642205bc68 Fix hookshot and armos knights
- hookshot now stuns enemies it would normally damage
- armos knights with L-2 bombs now take same damage as L-1 or L-3
2021-07-04 18:28:46 -07:00
a8bc95bd1f NO BOMBOS DAMAGE 2021-07-04 15:43:02 -07:00
0dcef701df Merge commit 'f403ca10da9e009599a531be8cdcd20a61b4801c' of github.com:spannerisms/z3randomizer into kara 2021-07-03 18:25:27 -07:00
1dafb620b0 Merge branch 'main' into kara 2021-07-03 18:23:05 -07:00
828a9df7d9 Allow Ganon to be vulnerable to arbitrary item 2021-06-29 16:28:19 -07:00
ea72d70b1b Implement always-allowed medallions 2021-06-29 16:24:21 -07:00
bf953e7953 Add bomb-only mode 2021-06-29 16:23:15 -07:00
41 changed files with 2312 additions and 635 deletions

2
.gitignore vendored
View File

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

View File

@@ -194,6 +194,8 @@ incsrc darkroomitems.asm
incsrc fastcredits.asm
incsrc msu.asm
incsrc dungeonmap.asm
incsrc special_weapons.asm
incsrc variable_ganon_vulnerability.asm
if !FEATURE_NEW_TEXT
incsrc textrenderer.asm
endif
@@ -257,8 +259,8 @@ incbin ice_palace_floor.bin
warnpc $31C801
org $31C800
Damage_Table:
incbin damage_table.bin
Damage_Table_Bombos:
incbin damage_table_bombos.bin
warnpc $31D001
org $31D000
@@ -271,6 +273,16 @@ InvertedCastleHole: ;address used by front end. DO NOT MOVE!
incbin sheet73.gfx
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
GFX_HUD_Palette:
incbin hudpalette.pal
@@ -721,3 +733,5 @@ Sprite_GetEmptyBottleIndex: ; this is totally in sprite_bees.asm
org $1EF4E7
Sprite_PlayerCantPassThrough:
;================================================================================
incsrc bombos_only.asm

203
bombos_only.asm Normal file
View File

@@ -0,0 +1,203 @@
!ITEMCOUNT = $F0
; ============== Replace all picked up item icons with bombos =================
org AddReceivedItemExpanded_y_offsets
fillbyte -4
fill !ITEMCOUNT
org AddReceivedItemExpanded_x_offsets
fillbyte 0
fill !ITEMCOUNT
org AddReceivedItemExpanded_item_graphics_indices
fillbyte $1B
fill !ITEMCOUNT
org AddReceivedItemExpanded_wide_item_flag
fillbyte $02
fill !ITEMCOUNT
org AddReceivedItemExpanded_properties
fillbyte 4
fill !ITEMCOUNT
org GetSpriteID_gfxSlots
fillbyte $1B
fill !ITEMCOUNT
org GetSpritePalette_gfxPalettes
fillbyte $08
fill !ITEMCOUNT
org IsNarrowSprite_smallSprites
padbyte $FF
pad PrepDynamicTile
; =============================================================================
; ===================== Remove attempt to animate rupees ======================
org $08C672
LDA.b #$0F : NOP
; =============================================================================
; ===================== Replace all menu icons with bombos ====================
macro bombos_icon()
dw $287D, $287E, $E87E, $E87D ; Bombos
endmacro
macro empty_icon()
dw $20F5, $20F5, $20F5, $20F5 ; No bombos
endmacro
org $0DF649
%empty_icon() ; No bow
%bombos_icon() ; Empty bow
%bombos_icon() ; Bow and arrows
%bombos_icon() ; Empty silvers bow
%bombos_icon() ; Silver bow and arrows
%empty_icon() ; No boomerang
%bombos_icon() ; Blue boomerang
%bombos_icon() ; Red boomerang
%empty_icon() ; No hookshot
%bombos_icon() ; Hookshot
%empty_icon() ; No bombs
%bombos_icon() ; Bombs
%empty_icon() ; No powder
%bombos_icon() ; Mushroom
%bombos_icon() ; Powder
%empty_icon() ; No fire rod
%bombos_icon() ; Fire rod
%empty_icon() ; No ice rod
%bombos_icon() ; Ice rod
%empty_icon() ; No bombos
%bombos_icon() ; Bombos
%empty_icon() ; No ether
%bombos_icon() ; Ether
%empty_icon() ; No quake
%bombos_icon() ; Quake
%empty_icon() ; No lamp
%bombos_icon() ; Lamp
%empty_icon() ; No hammer
%bombos_icon() ; Hammer
%empty_icon() ; No flute
%bombos_icon() ; Shovel
%bombos_icon() ; Flute (inactive)
%bombos_icon() ; Flute (active)
%empty_icon() ; No net
%bombos_icon() ; Net
%empty_icon() ; No book
%bombos_icon() ; Book of Mudora
%empty_icon() ; No bottle
%bombos_icon() ; Mushroom
%bombos_icon() ; Empty bottle
%bombos_icon() ; Red potion
%bombos_icon() ; Green potion
%bombos_icon() ; Blue potion
%bombos_icon() ; Fairy
%bombos_icon() ; Bee
%bombos_icon() ; Good bee
%empty_icon() ; No somaria
%bombos_icon() ; Cane of Somaria
%empty_icon() ; No byrna
%bombos_icon() ; Cane of Byrna
%empty_icon() ; No cape
%bombos_icon() ; Cape
%empty_icon() ; No mirror
%bombos_icon() ; Map
%bombos_icon() ; Mirror
%bombos_icon() ; Triforce (displays as arrows and bombs)
%empty_icon() ; No glove
%bombos_icon() ; Power glove
%bombos_icon() ; Titan's mitt
%empty_icon() ; No boots
%bombos_icon() ; Pegasus boots
%empty_icon() ; No flippers
%bombos_icon() ; Flippers
%empty_icon() ; No pearl
%bombos_icon() ; Moon pearl
%empty_icon() ; Nothing
%empty_icon() ; No sword
%bombos_icon() ; Fighter sword
%bombos_icon() ; Master sword
%bombos_icon() ; Tempered sword
%bombos_icon() ; Gold sword
%empty_icon() ; No shield
%bombos_icon() ; Fighter shield
%bombos_icon() ; Fire shield
%bombos_icon() ; Mirror shield
%bombos_icon() ; Green mail
%bombos_icon() ; Blue mail
%bombos_icon() ; Red mail
%empty_icon() ; No compass
%bombos_icon() ; Compass
%empty_icon() ; No big key
%bombos_icon() ; Big key
%bombos_icon() ; Big key and chest
%empty_icon() ; No map
%bombos_icon() ; Map
%empty_icon() ; No red pendant
%bombos_icon() ; Red pendant
%empty_icon() ; No blue pendant
%bombos_icon() ; Blue pendant
%empty_icon() ; No green pendant
%bombos_icon() ; Green pendant
%empty_icon() ; No white glove?
%bombos_icon() ; White glove?
%empty_icon() ; 0 heart pieces
dw $287D, $20F5, $20F5, $20F5 ; 1 heart piece
dw $287D, $20F5, $E87E, $20F5 ; 2 heart pieces
dw $287D, $287E, $E87E, $20F5 ; 3 heart pieces
; =============================================================================
; ===================== Replace menu pendants with bombos =====================
org DrawPendantCrystalDiagram_row0
dw $28FB, $28F9, $28F9, $28F9, $28F9, $28F9, $28F9, $28F9, $28F9, $68FB
dw $28FC, $24F5, $24F5, $24F5, $307D, $307E, $24F5, $24F5, $24F5, $68FC
dw $28FC, $24F5, $24F5, $24F5, $F07E, $F07D, $24F5, $24F5, $24F5, $68FC
dw $28FC, $24F5, $307D, $307E, $24F5, $24F5, $307D, $307E, $24F5, $68FC
dw $28FC, $24F5, $F07E, $F07D, $24F5, $24F5, $F07E, $F07D, $24F5, $68FC
dw $28FC, $24F5, $24F5, $24F5, $307D, $307E, $24F5, $24F5, $24F5, $68FC
dw $28FC, $24F5, $307D, $307E, $307D, $307E, $307D, $307E, $24F5, $68FC
dw $28FC, $24F5, $F07E, $F07D, $F07E, $F07D, $F07E, $F07D, $24F5, $68FC
dw $A8FB, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $E8FB
; =============================================================================
; ===================== Replace menu pendants with bombos =====================
org $308022
db $00
; =============================================================================

View File

@@ -1,10 +1,9 @@
;================================================================================
; Boots State Modifier
;--------------------------------------------------------------------------------
!BOOTS_MODIFIER = "$7F50CE"
ModifyBoots:
PHA
LDA !BOOTS_MODIFIER : CMP.b #$01 : BNE +
LDA BootsModifier : CMP.b #$01 : BNE +
PLA : AND AbilityFlags : ORA.b #$04 : RTL ; yes boots
+ : CMP.b #$02 : BNE +
PLA : AND AbilityFlags : AND.b #$FB : RTL ; no boots
@@ -21,7 +20,7 @@ AddBonkTremors:
LDA $46 : BNE + ; Check for incapacitated Link
JSL.l IncrementBonkCounter
+
LDA !BOOTS_MODIFIER : CMP.b #$01 : BEQ +
LDA BootsModifier : CMP.b #$01 : BEQ +
LDA BootsEquipment : BNE + ; Check for Boots
PLA : RTL
+
@@ -32,7 +31,7 @@ RTL
BonkBreakableWall:
PHX : PHP
SEP #$30 ; set 8-bit accumulator and index registers
LDA !BOOTS_MODIFIER : CMP.b #$01 : BEQ +
LDA BootsModifier : CMP.b #$01 : BEQ +
LDA BootsEquipment : BNE + ; Check for Boots
PLP : PLX : LDA.w #$0000 : RTL
+
@@ -41,7 +40,7 @@ BonkBreakableWall:
RTL
;--------------------------------------------------------------------------------
BonkRockPile:
LDA !BOOTS_MODIFIER : CMP.b #$01 : BEQ +
LDA BootsModifier : CMP.b #$01 : BEQ +
LDA BootsEquipment : BNE + ; Check for Boots
LDA.b #$00 : RTL
+
@@ -49,7 +48,7 @@ BonkRockPile:
RTL
;--------------------------------------------------------------------------------
GravestoneHook:
LDA !BOOTS_MODIFIER : CMP.b #$01 : BEQ +
LDA BootsModifier : CMP.b #$01 : BEQ +
LDA BootsEquipment : BEQ .done ; Check for Boots
+
LDA $0372 : BEQ .done ; things we wrote over
@@ -58,7 +57,7 @@ GravestoneHook:
JML.l GravestoneHook_continue
;--------------------------------------------------------------------------------
JumpDownLedge:
LDA !BOOTS_MODIFIER : CMP.b #$01 : BEQ +
LDA BootsModifier : CMP.b #$01 : BEQ +
LDA BootsEquipment : BNE + ; Check for Boots
; Disarm Waterwalk
LDA $5B : CMP.b #$01 : BNE +
@@ -69,7 +68,7 @@ JumpDownLedge:
RTL
;--------------------------------------------------------------------------------
BonkRecoil:
LDA !BOOTS_MODIFIER : CMP.b #$01 : BEQ +
LDA BootsModifier : CMP.b #$01 : BEQ +
LDA BootsEquipment : BNE + ; Check for Boots
LDA.b #$16 : STA $29 : RTL
+

View File

@@ -4,7 +4,6 @@
;--------------------------------------------------------------------------------
; Filtered Joypad 1 Register: [AXLR | ????]
; Filtered Joypad 1 Register: [BYST | udlr] [AXLR | ????]
!INVERT_DPAD = "$7F50CB"
InvertDPad:
LDA.l OneMindPlayerCount : BEQ .crowd_control
@@ -23,7 +22,7 @@ InvertDPad:
JML.l InvertDPadReturn
.crowd_control
LDA !INVERT_DPAD : BNE +
LDA InvertDPadModifier : BNE +
LDA $4218 : STA $00
LDA $4219 : STA $01

View File

@@ -1,5 +1,4 @@
;================================================================================
!CUCCO_STORM = "$7F50C5"
!IS_INDOORS = "$7E001B"
!ENEMY_STATE_TABLE = "$7E0DD0"
!ENEMY_TYPE_TABLE = "$7E0E20"
@@ -22,7 +21,7 @@
CuccoStorm:
SEP #$30 ; set 8-bit accumulator index registers
LDA.l !CUCCO_STORM : BEQ + ; only if storm is on
LDA.l CuccoStormModifier : BEQ + ; only if storm is on
LDA.b $10 : CMP.b #$09 : BNE + ; only if outdoors
LDA.l LoopFrames : AND.b #$7F : BNE + ; check every 128 frames

BIN
damage_table_bombos.bin Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

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

View File

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

View File

@@ -269,7 +269,7 @@ DialogFairyThrow:
LDA.l Restrict_Ponds : BEQ .normal
LDA BottleContentsOne
ORA BottleContentsTwo : ORA BottleContentsThree : ORA BottleContentsFour : BNE .normal
.noInventory
LDA $0D80, X : !ADD #$08 : STA $0D80, X
LDA.b #$51
@@ -300,31 +300,64 @@ RTL
; s = silver arrow bow
; p = 2nd progressive bow
DialogGanon2:
JSL.l CheckGanonVulnerability
JSL.l CheckGanonVulnerability
REP #$20
BCS +
LDA.w #$018D : BRA ++
+
LDA.w #$018D : JMP .done
+
LDA.l GanonVulnerabilityItem : AND #$00FF : BNE .special_item
LDA.l SpecialWeapons : AND.w #$00FF
CMP.w #$0001 : BEQ .bombs ; bombs if special bomb mode
.silver_arrows
LDA.l BowTracking
BIT.w #$0080 : BNE + ; branch if bow
LDA.w #$0192 : BRA ++
+
BIT.w #$0040 : BEQ + ; branch if no silvers
LDA.w #$0195 : BRA ++
+
BIT.w #$0020 : BNE + ; branch if p bow
LDA.w #$0194 : BRA ++
+
BIT.w #$0080 : BEQ + ; branch if no bow
LDA.w #$0193 : BRA ++
+
LDA.w #$016E
++
BIT.w #$0080 : BNE + ; branch if bow
LDA.w #$0192 : JMP .done
+
BIT.w #$0040 : BEQ + ; branch if no silvers
LDA.w #$0195 : JMP .done
+
BIT.w #$0020 : BNE + ; branch if p bow
LDA.w #$0194 : JMP .done
+
BIT.w #$0080 : BEQ + ; branch if no bow
LDA.w #$0193 : JMP .done
+
LDA.w #$016E : JMP .done
.special_item
CMP.w #$0001 : BEQ .silver_arrows
CMP.w #$0004 : BEQ .bombs
CMP.w #$0005 : BEQ .powder
CMP.w #$0010 : BEQ .bee
PHX : TAX
LDA.l EquipmentWRAM-1, X : PLX : AND #$00FF : BNE +
LDA.w #$0192 : JMP .done
+
LDA.w #$0195 : BRA .done
.bombs
LDA.l BombsEquipment : AND #$00FF : BNE +
LDA.l 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
SEP #$20
JSL.l Sprite_ShowMessageMinimal_Alt
JSL.l Sprite_ShowMessageMinimal_Alt
RTL
;--------------------------------------------------------------------------------
DialogEtherTablet:
@@ -334,11 +367,8 @@ DialogEtherTablet:
PLA : JML Sprite_ShowMessageUnconditional ; Wacky Hylian Text
+
BIT $F4 : BVC - ; Show normal text if Y is not pressed
LDA.l AllowHammerTablets : BEQ ++
LDA HammerEquipment : BEQ .yesText : BRA .noText
++
LDA SwordEquipment : CMP.b #$FF : BEQ .yesText : CMP.b #$02 : BCS .noText
;++
JSL CheckTabletSword : BMI .yesText
CMP.b #$02 : !BGE .noText
.yesText
PLA
LDA.b #$0C
@@ -356,13 +386,10 @@ DialogBombosTablet:
PLA : JML Sprite_ShowMessageUnconditional ; Wacky Hylian Text
+
BIT $F4 : BVC - ; Show normal text if Y is not pressed
LDA.l AllowHammerTablets : BEQ ++
LDA HammerEquipment : BEQ .yesText : BRA .noText
++
LDA SwordEquipment : CMP.b #$FF : BEQ .yesText : CMP.b #$02 : !BGE .noText
;++
JSL CheckTabletSword : BMI .yesText
CMP.b #$02 : !BGE .noText
.yesText
PLA
PLA
LDA.b #$0D
LDY.b #$01
JML Sprite_ShowMessageUnconditional ; Text From MSPedestalText (tables.asm)
@@ -374,7 +401,7 @@ RTL
DialogSahasrahla:
LDA.l PendantsField : AND #$04 : BEQ + ;Check if player has green pendant
LDA.b #$2F
LDY.b #$00
LDY.b #$00
JML Sprite_ShowMessageUnconditional
+
RTL
@@ -455,7 +482,7 @@ RTL
CalculateSignIndex:
; for the big 1024x1024 screens we are calculating link's effective
; screen area, as though the screen was 4 different 512x512 screens.
; And we do this in a way that will likely give the right value even
; And we do this in a way that will likely give the right value even
; with major glitches.
LDA $8A : ASL A : TAY ;what we wrote over
@@ -464,13 +491,13 @@ CalculateSignIndex:
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.
+
+
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.
+
; 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
RTL

View File

@@ -124,7 +124,7 @@ AllowStartFromSingleEntranceCave:
STZ $0699 ;zero out door overlays in case starting overworld door is not set
SEP #$20 ; set 8-bit accumulator
LDA $7EF3C8 : TAX
LDA StartingEntrance : TAX
LDA.l StartingAreaOverworldDoor, X : STA.l $7F5099 ;Load overworld door
REP #$20 ; reset 16-bit accumulator
JSL.l CacheDoorFrameData

View File

@@ -59,9 +59,9 @@ OnUncleItemGet:
PHA
LDA.l EscapeAssist
BIT.b #$04 : BEQ + : STA !INFINITE_MAGIC : +
BIT.b #$02 : BEQ + : STA !INFINITE_BOMBS : +
BIT.b #$01 : BEQ + : STA !INFINITE_ARROWS : +
BIT.b #$04 : BEQ + : STA InfiniteMagicModifier : +
BIT.b #$02 : BEQ + : STA InfiniteBombsModifier : +
BIT.b #$01 : BEQ + : STA InfiniteArrowsModifier : +
PLA
JSL.l Link_ReceiveItem
@@ -77,45 +77,45 @@ OnUncleItemGet:
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
+
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
;--------------------------------------------------------------------------------
OnAga2Defeated:
JSL.l Dungeon_SaveRoomData_justKeys ; thing we wrote over, make sure this is first
LDA.b #$01 : STA.l Aga2Duck
JML.l IncrementAgahnim2Sword
JSL.l Dungeon_SaveRoomData_justKeys ; thing we wrote over, make sure this is first
LDA.b #$01 : STA.l Aga2Duck
JML.l IncrementAgahnim2Sword
;--------------------------------------------------------------------------------
OnFileCreation:
; Copy initial SRAM state from ROM to cart SRAM
PHB
LDA.w #$03D7 ; \
LDX.w #$B000 ; | Copies from beginning of inital sram table up to file name
LDY.w #$0000 ; | (exclusively)
MVN $70, $30 ; /
; Skip file name and validity value
LDA.w #$010C ; \
LDX.w #$B3E3 ; | Rando-Specific Assignments & Game Stats block
LDY.w #$03E3 ; |
MVN $70, $30 ; /
PLB
; Copy initial SRAM state from ROM to cart SRAM
PHB
LDA.w #$03D7 ; \
LDX.w #$B000 ; | Copies from beginning of inital sram table up to file name
LDY.w #$0000 ; | (exclusively)
MVN $70, $30 ; /
; Skip file name and validity value
LDA.w #$010C ; \
LDX.w #$B3E3 ; | Rando-Specific Assignments & Game Stats block
LDY.w #$03E3 ; |
MVN $70, $30 ; /
PLB
; resolve instant post-aga if standard
SEP #$20
LDA.l InitProgressIndicator : BIT #$80 : BEQ +
LDA.b #$00 : STA.l ProgressIndicatorSRAM ; set post-aga after zelda rescue
LDA.b #$00 : STA.l OverworldEventDataSRAM+$02 ; keep rain state vanilla
+
REP #$20
; resolve instant post-aga if standard
SEP #$20
LDA.l InitProgressIndicator : BIT #$80 : BEQ +
LDA.b #$00 : STA.l ProgressIndicatorSRAM ; set post-aga after zelda rescue
LDA.b #$00 : STA.l OverworldEventDataSRAM+$02 ; keep rain state vanilla
+
REP #$20
; Set validity value and do some cleanup. Jump to checksum.
LDA.w #$55AA : STA.l $7003E1
STZ $00
STZ $01
LDX.b $00
LDY.w #$0000
TYA
; Set validity value and do some cleanup. Jump to checksum.
LDA.w #$55AA : STA.l $7003E1
STZ $00
STZ $01
LDX.b $00
LDY.w #$0000
TYA
JML.l InitializeSaveFile_build_checksum
;--------------------------------------------------------------------------------
@@ -251,6 +251,6 @@ PostItemAnimation:
JSL.l IncrementChestTurnCounter
+
STZ $02E9 : LDA $0C5E, X ; thing we wrote over to get here
STZ $02E9 : LDA $0C5E, X ; thing we wrote over to get here
RTL
;--------------------------------------------------------------------------------

View File

@@ -35,6 +35,20 @@ macro fs_draw16x16(screenrow,screencol)
%fs_draw16x8(<screenrow>+1,<screencol>)
endmacro
macro fs_draw_bombos_top(screenrow,screencol,color)
LDA.w #$0207|<color>
%fs_draw8x8(<screenrow>,<screencol>)
LDA.w #$0217|<color>|!FS_HFLIP|!FS_VFLIP
%fs_draw8x8(<screenrow>,<screencol>+1)
endmacro
macro fs_draw_bombos_right(screenrow,screencol,color)
LDA.w #$0217|<color>|!FS_HFLIP|!FS_VFLIP
%fs_draw8x8(<screenrow>,<screencol>)
LDA.w #$0207|<color>|!FS_HFLIP|!FS_VFLIP
%fs_draw8x8(<screenrow>+1,<screencol>)
endmacro
macro fs_LDY_screenpos(screenrow,screencol)
LDY.w #<screenrow>*$20+<screencol>*2+$1004
endmacro
@@ -83,28 +97,28 @@ JMP DrawItemGray
DrawBottle:
AND.w #$00FF : BNE +
LDX #FileSelectItems_empty_bottle
LDX #FileSelectItems_bombos
JMP DrawItemGray
+ : DEC #2 : BNE +
LDX #FileSelectItems_empty_bottle
LDX #FileSelectItems_bombos
JMP DrawItem
+ : DEC : BNE +
LDX #FileSelectItems_red_potion
LDX #FileSelectItems_bombos
JMP DrawItem
+ : DEC : BNE +
LDX #FileSelectItems_green_potion
LDX #FileSelectItems_bombos
JMP DrawItem
+ : DEC : BNE +
LDX #FileSelectItems_blue_potion
LDX #FileSelectItems_bombos
JMP DrawItem
+ : DEC : BNE +
LDX #FileSelectItems_fairy_bottle
LDX #FileSelectItems_bombos
JMP DrawItem
+ : DEC : BNE +
LDX #FileSelectItems_bee_bottle
LDX #FileSelectItems_bombos
JMP DrawItem
+
LDX #FileSelectItems_good_bee_bottle
LDX #FileSelectItems_bombos
JMP DrawItem
@@ -155,111 +169,111 @@ DrawPlayerFileShared:
; Bow
LDA.l BowTrackingSRAM : AND.w #$0040 : BEQ +
LDA EquipmentSRAM+$00 : AND.w #$00FF : BEQ ++
%fs_drawItem(3,12,FileSelectItems_silver_bow)
%fs_drawItem(3,12,FileSelectItems_bombos)
BRA .bow_end
++
%fs_drawItem(3,12,FileSelectItems_silver_arrow)
%fs_drawItem(3,12,FileSelectItems_bombos)
BRA .bow_end
+
LDA.l EquipmentSRAM : AND.w #$00FF : BEQ +
%fs_drawItem(3,12,FileSelectItems_bow)
%fs_drawItem(3,12,FileSelectItems_bombos)
BRA .bow_end
+
%fs_drawItemGray(3,12,FileSelectItems_bow)
%fs_drawItemGray(3,12,FileSelectItems_bombos)
.bow_end
; Boomerang
LDA.l InventoryTrackingSRAM : AND.w #$00C0 : CMP.w #$00C0 : BNE +
%fs_drawItem(3,14,FileSelectItems_both_boomerang)
%fs_drawItem(3,14,FileSelectItems_bombos)
BRA .boomerang_end
+
LDA.l InventoryTrackingSRAM : AND.w #$0040 : BEQ +
%fs_drawItem(3,14,FileSelectItems_red_boomerang)
%fs_drawItem(3,14,FileSelectItems_bombos)
BRA .boomerang_end
+
LDA.l InventoryTrackingSRAM : AND.w #$0080 : BEQ +
%fs_drawItem(3,14,FileSelectItems_blue_boomerang)
%fs_drawItem(3,14,FileSelectItems_bombos)
BRA .boomerang_end
+
%fs_drawItemGray(3,14,FileSelectItems_blue_boomerang)
%fs_drawItemGray(3,14,FileSelectItems_bombos)
.boomerang_end
; Hookshot
%fs_drawItemBasic(EquipmentSRAM+$02,3,16,FileSelectItems_hookshot)
%fs_drawItemBasic(EquipmentSRAM+$02,3,16,FileSelectItems_bombos)
; Bombs
; %fs_drawItemBasic(EquipmentSRAM+$03,3,18,FileSelectItems_bombs)
; %fs_drawItemBasic(EquipmentSRAM+$03,3,18,FileSelectItems_bombos)
; Powder
LDA.l InventoryTrackingSRAM : AND.w #$0010 : BEQ +
%fs_drawItem(3,20,FileSelectItems_powder)
%fs_drawItem(3,20,FileSelectItems_bombos)
BRA ++
+
%fs_drawItemGray(3,20,FileSelectItems_powder)
%fs_drawItemGray(3,20,FileSelectItems_bombos)
++
; Mushroom
LDA.l InventoryTrackingSRAM : AND.w #$0008 : BEQ +
%fs_drawItem(3,18,FileSelectItems_mushroom)
%fs_drawItem(3,18,FileSelectItems_bombos)
BRA ++
+
%fs_drawItemGray(3,18,FileSelectItems_mushroom)
%fs_drawItemGray(3,18,FileSelectItems_bombos)
++
; Flute
LDA.l InventoryTrackingSRAM : AND.w #$0003 : BEQ +
%fs_drawItem(7,16,FileSelectItems_flute)
%fs_drawItem(7,16,FileSelectItems_bombos)
BRA ++
+
%fs_drawItemGray(7,16,FileSelectItems_flute)
%fs_drawItemGray(7,16,FileSelectItems_bombos)
++
; Shovel
LDA.l InventoryTrackingSRAM : AND.w #$0004 : BEQ +
%fs_drawItem(9,12,FileSelectItems_shovel)
%fs_drawItem(9,12,FileSelectItems_bombos)
BRA ++
+
%fs_drawItemGray(9,12,FileSelectItems_shovel)
%fs_drawItemGray(9,12,FileSelectItems_bombos)
++
; Fire Rod
%fs_drawItemBasic(EquipmentSRAM+$05,5,12,FileSelectItems_fire_rod)
%fs_drawItemBasic(EquipmentSRAM+$05,5,12,FileSelectItems_bombos)
; Ice Rod
%fs_drawItemBasic(EquipmentSRAM+$06,5,14,FileSelectItems_ice_rod)
%fs_drawItemBasic(EquipmentSRAM+$06,5,14,FileSelectItems_bombos)
; Bombos Medallion
%fs_drawItemBasic(EquipmentSRAM+$07,5,16,FileSelectItems_bombos)
; Ether Medallion
%fs_drawItemBasic(EquipmentSRAM+$08,5,18,FileSelectItems_ether)
%fs_drawItemBasic(EquipmentSRAM+$08,5,18,FileSelectItems_bombos)
; Quake Medallion
%fs_drawItemBasic(EquipmentSRAM+$09,5,20,FileSelectItems_quake)
%fs_drawItemBasic(EquipmentSRAM+$09,5,20,FileSelectItems_bombos)
; Lamp
%fs_drawItemBasic(EquipmentSRAM+$0A,7,12,FileSelectItems_lamp)
%fs_drawItemBasic(EquipmentSRAM+$0A,7,12,FileSelectItems_bombos)
; Hammer
%fs_drawItemBasic(EquipmentSRAM+$0B,7,14,FileSelectItems_hammer)
%fs_drawItemBasic(EquipmentSRAM+$0B,7,14,FileSelectItems_bombos)
; Bug Net
%fs_drawItemBasic(EquipmentSRAM+$0D,7,18,FileSelectItems_bugnet)
%fs_drawItemBasic(EquipmentSRAM+$0D,7,18,FileSelectItems_bombos)
; Book of Mudora
%fs_drawItemBasic(EquipmentSRAM+$0E,7,20,FileSelectItems_book)
%fs_drawItemBasic(EquipmentSRAM+$0E,7,20,FileSelectItems_bombos)
; Red Cane
%fs_drawItemBasic(EquipmentSRAM+$10,9,14,FileSelectItems_redcane)
%fs_drawItemBasic(EquipmentSRAM+$10,9,14,FileSelectItems_bombos)
; Blue Cane
%fs_drawItemBasic(EquipmentSRAM+$11,9,16,FileSelectItems_bluecane)
%fs_drawItemBasic(EquipmentSRAM+$11,9,16,FileSelectItems_bombos)
; Cape
%fs_drawItemBasic(EquipmentSRAM+$12,9,18,FileSelectItems_cape)
%fs_drawItemBasic(EquipmentSRAM+$12,9,18,FileSelectItems_bombos)
; Mirror
%fs_drawItemBasic(EquipmentSRAM+$13,9,20,FileSelectItems_mirror)
%fs_drawItemBasic(EquipmentSRAM+$13,9,20,FileSelectItems_bombos)
; Bottles
%fs_drawBottle(EquipmentSRAM+$1C,3,23)
@@ -268,49 +282,72 @@ DrawPlayerFileShared:
%fs_drawBottle(EquipmentSRAM+$1F,9,23)
; Sword
LDA.l SpecialWeapons : AND.w #$00FF : CMP #$0001 : BEQ .bombSword
LDA.l EquipmentSRAM+$19 : AND.w #$00FF : BNE +
%fs_drawItemGray(3,26,FileSelectItems_fighters_sword)
%fs_drawItemGray(3,26,FileSelectItems_bombos)
JMP ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_bombos)
JMP ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_bombos)
JMP ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_bombos)
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_fighters_sword)
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_master_sword)
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_tempered_sword)
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_gold_sword)
%fs_drawItem(3,26,FileSelectItems_bombos)
BRA ++
+
; 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_bombos)
.bombSword
LDA.l $70038F : AND.w #$00FF : BNE +
%fs_drawItemGray(3,26,FileSelectItems_bombos)
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_bombos)
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_bombos)
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_bombos)
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_bombos)
BRA ++
+ : DEC : BNE +
%fs_drawItem(3,26,FileSelectItems_bombos)
BRA ++
+
; a bomb value above 5 is... who knows, let's just pretend it's 5
%fs_drawItem(3,26,FileSelectItems_bombos)
++
; Shield
LDA.l EquipmentSRAM+$1A : AND.w #$00FF : BNE +
%fs_drawItemGray(5,26,FileSelectItems_fighters_shield)
%fs_drawItemGray(5,26,FileSelectItems_bombos)
BRA ++
+ : DEC : BNE +
%fs_drawItem(5,26,FileSelectItems_fighters_shield)
%fs_drawItem(5,26,FileSelectItems_bombos)
BRA ++
+ : DEC : BNE +
%fs_drawItem(5,26,FileSelectItems_fire_shield)
%fs_drawItem(5,26,FileSelectItems_bombos)
BRA ++
+
%fs_drawItem(5,26,FileSelectItems_mirror_shield)
%fs_drawItem(5,26,FileSelectItems_bombos)
++
; Mail
LDA.l EquipmentSRAM+$1B : AND.w #$00FF : BNE +
%fs_drawItem(7,26,FileSelectItems_green_mail)
%fs_drawItem(7,26,FileSelectItems_bombos)
BRA ++
+ : DEC : BNE +
%fs_drawItem(7,26,FileSelectItems_blue_mail)
%fs_drawItem(7,26,FileSelectItems_bombos)
BRA ++
+
%fs_drawItem(7,26,FileSelectItems_red_mail)
%fs_drawItem(7,26,FileSelectItems_bombos)
++
; Heart Pieces
@@ -333,24 +370,24 @@ DrawPlayerFileShared:
LDA $7F5007 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(11,27)
; Boots
%fs_drawItemBasic(EquipmentSRAM+$15,3,28,FileSelectItems_boots)
%fs_drawItemBasic(EquipmentSRAM+$15,3,28,FileSelectItems_bombos)
; Gloves
LDA.l EquipmentSRAM+$14 : AND.w #$00FF : BNE +
%fs_drawItemGray(5,28,FileSelectItems_gloves)
%fs_drawItemGray(5,28,FileSelectItems_bombos)
BRA ++
+ : DEC : BNE +
%fs_drawItem(5,28,FileSelectItems_gloves)
%fs_drawItem(5,28,FileSelectItems_bombos)
BRA ++
+
%fs_drawItem(5,28,FileSelectItems_mitts)
%fs_drawItem(5,28,FileSelectItems_bombos)
++
; Flippers
%fs_drawItemBasic(EquipmentSRAM+$16,7,28,FileSelectItems_flippers)
%fs_drawItemBasic(EquipmentSRAM+$16,7,28,FileSelectItems_bombos)
; Moon Pearl
%fs_drawItemBasic(EquipmentSRAM+$17,9,28,FileSelectItems_pearl)
%fs_drawItemBasic(EquipmentSRAM+$17,9,28,FileSelectItems_bombos)
; Pendants
LDA EquipmentSRAM+$34 : AND.w #$0004 : BEQ +
@@ -376,53 +413,53 @@ DrawPlayerFileShared:
; Crystals
LDA EquipmentSRAM+$3A : AND.w #$0002 : BEQ +
LDA.w #$0297|!FS_COLOR_BLUE
%fs_draw_bombos_top(12,21,!FS_COLOR_YELLOW)
BRA ++
+
LDA.w #$0287|!FS_COLOR_GRAY
++ : %fs_draw16x8(13,18)
%fs_draw_bombos_top(12,21,!FS_COLOR_GRAY)
++
LDA EquipmentSRAM+$3A : AND.w #$0010 : BEQ +
LDA.w #$0297|!FS_COLOR_BLUE
LDA.w #$0207|!FS_COLOR_YELLOW
BRA ++
+
LDA.w #$0287|!FS_COLOR_GRAY
++ : %fs_draw16x8(12,19)
LDA.w #$0207|!FS_COLOR_GRAY
++ : %fs_draw8x16(13,19)
LDA EquipmentSRAM+$3A : AND.w #$0040 : BEQ +
LDA.w #$0297|!FS_COLOR_BLUE
%fs_draw_bombos_right(13,20,!FS_COLOR_YELLOW)
BRA ++
+
LDA.w #$0287|!FS_COLOR_GRAY
++ : %fs_draw16x8(13,20)
%fs_draw_bombos_right(13,20,!FS_COLOR_GRAY)
++
LDA EquipmentSRAM+$3A : AND.w #$0020 : BEQ +
LDA.w #$0297|!FS_COLOR_BLUE
LDA.w #$0207|!FS_COLOR_YELLOW
BRA ++
+
LDA.w #$0287|!FS_COLOR_GRAY
++ : %fs_draw16x8(12,21)
LDA.w #$0207|!FS_COLOR_GRAY
++ : %fs_draw8x16(13,21)
LDA EquipmentSRAM+$3A : AND.w #$0004 : BEQ +
LDA.w #$0297|!FS_COLOR_RED
%fs_draw_bombos_right(13,22,!FS_COLOR_RED)
BRA ++
+
LDA.w #$0287|!FS_COLOR_GRAY
++ : %fs_draw16x8(13,22)
%fs_draw_bombos_right(13,22,!FS_COLOR_GRAY)
++
LDA EquipmentSRAM+$3A : AND.w #$0001 : BEQ +
LDA.w #$0297|!FS_COLOR_RED
LDA.w #$0207|!FS_COLOR_RED
BRA ++
+
LDA.w #$0287|!FS_COLOR_GRAY
++ : %fs_draw16x8(12,23)
LDA.w #$0207|!FS_COLOR_GRAY
++ : %fs_draw8x16(13,23)
LDA EquipmentSRAM+$3A : AND.w #$0008 : BEQ +
LDA.w #$0297|!FS_COLOR_BLUE
%fs_draw_bombos_right(13,24,!FS_COLOR_YELLOW)
BRA ++
+
LDA.w #$0287|!FS_COLOR_GRAY
++ : %fs_draw16x8(13,24)
%fs_draw_bombos_right(13,24,!FS_COLOR_GRAY)
++
PLB : PLY : PLX
@@ -491,13 +528,13 @@ FileSelectItems:
dw #$0264|!FS_COLOR_RED, #$0265|!FS_COLOR_RED, #$0274|!FS_COLOR_RED, #$0275|!FS_COLOR_RED
.no_pendant
dw #$0285|!FS_COLOR_GRAY, #$0286|!FS_COLOR_GRAY, #$02B2|!FS_COLOR_GRAY, #$0296|!FS_COLOR_GRAY
dw #$0207|!FS_COLOR_GRAY, #$0217|!FS_COLOR_GRAY|!FS_HFLIP|!FS_VFLIP, #$0217|!FS_COLOR_GRAY, #$0207|!FS_COLOR_GRAY|!FS_HFLIP|!FS_VFLIP
.green_pendant
dw #$0285|!FS_COLOR_GREEN, #$0286|!FS_COLOR_GREEN, #$0295|!FS_COLOR_GREEN, #$0296|!FS_COLOR_GREEN
dw #$0207|!FS_COLOR_GREEN, #$0217|!FS_COLOR_GREEN|!FS_HFLIP|!FS_VFLIP, #$0217|!FS_COLOR_GREEN, #$0207|!FS_COLOR_GREEN|!FS_HFLIP|!FS_VFLIP
.blue_pendant
dw #$0285|!FS_COLOR_BLUE, #$0286|!FS_COLOR_BLUE, #$0295|!FS_COLOR_BLUE, #$0296|!FS_COLOR_BLUE
dw #$0207|!FS_COLOR_BLUE, #$0217|!FS_COLOR_BLUE|!FS_HFLIP|!FS_VFLIP, #$0217|!FS_COLOR_BLUE, #$0207|!FS_COLOR_BLUE|!FS_HFLIP|!FS_VFLIP
.red_pendant
dw #$0285|!FS_COLOR_RED, #$0286|!FS_COLOR_RED, #$0295|!FS_COLOR_RED, #$0296|!FS_COLOR_RED
dw #$0207|!FS_COLOR_RED, #$0217|!FS_COLOR_RED|!FS_HFLIP|!FS_VFLIP, #$0217|!FS_COLOR_RED, #$0207|!FS_COLOR_RED|!FS_HFLIP|!FS_VFLIP
.gloves
dw #$024E|!FS_COLOR_BROWN, #$024F|!FS_COLOR_BROWN, #$025E|!FS_COLOR_BROWN, #$025F|!FS_COLOR_BROWN
@@ -533,13 +570,13 @@ FileSelectItems:
dw #$026F|!FS_COLOR_RED, #$026F|!FS_COLOR_RED|!FS_HFLIP, #$027F|!FS_COLOR_RED, #$02B5|!FS_COLOR_RED
.heart_piece_0_of_4
dw #$0280|!FS_COLOR_RED, #$0280|!FS_COLOR_RED|!FS_HFLIP, #$0290|!FS_COLOR_RED, #$0290|!FS_COLOR_RED|!FS_HFLIP
dw #$0207|!FS_COLOR_GRAY, #$0217|!FS_COLOR_GRAY|!FS_HFLIP|!FS_VFLIP, #$0217|!FS_COLOR_GRAY, #$0207|!FS_COLOR_GRAY|!FS_HFLIP|!FS_VFLIP
.heart_piece_1_of_4
dw #$0281|!FS_COLOR_RED, #$0280|!FS_COLOR_RED|!FS_HFLIP, #$0290|!FS_COLOR_RED, #$0290|!FS_COLOR_RED|!FS_HFLIP
dw #$0207|!FS_COLOR_YELLOW, #$0217|!FS_COLOR_GRAY|!FS_HFLIP|!FS_VFLIP, #$0217|!FS_COLOR_GRAY, #$0207|!FS_COLOR_GRAY|!FS_HFLIP|!FS_VFLIP
.heart_piece_2_of_4
dw #$0281|!FS_COLOR_RED, #$0280|!FS_COLOR_RED|!FS_HFLIP, #$0291|!FS_COLOR_RED, #$0290|!FS_COLOR_RED|!FS_HFLIP
dw #$0207|!FS_COLOR_YELLOW, #$0217|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP, #$0217|!FS_COLOR_GRAY, #$0207|!FS_COLOR_GRAY|!FS_HFLIP|!FS_VFLIP
.heart_piece_3_of_4
dw #$0281|!FS_COLOR_RED, #$0281|!FS_COLOR_RED|!FS_HFLIP, #$0291|!FS_COLOR_RED, #$0290|!FS_COLOR_RED|!FS_HFLIP
dw #$0207|!FS_COLOR_YELLOW, #$0217|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP, #$0217|!FS_COLOR_YELLOW, #$0207|!FS_COLOR_GRAY|!FS_HFLIP|!FS_VFLIP
.empty_bottle
dw #$0240|!FS_COLOR_BW, #$0241|!FS_COLOR_BW, #$0250|!FS_COLOR_BW, #$0251|!FS_COLOR_BW
@@ -556,6 +593,18 @@ FileSelectItems:
.good_bee_bottle
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:
LDA #$029B|!FS_COLOR_GREEN : %fs_draw16x8(0,10)
@@ -566,11 +615,29 @@ FileSelectDrawHudBar:
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 SpecialWeapons : AND.w #$00FF : CMP #$0001 : BEQ .colorBombs
LDA #$028B|!FS_COLOR_BLUE : %fs_draw16x8(0,14)
LDA EquipmentSRAM+$03 : AND.w #$00FF
JSL.l HexToDec
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)
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 #$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 && ![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 && ![0xA3, 0xA1].include?(sprite) # bombos
ret[13] = 0
end
if ret[14] != 1 # ether
ret[14] = 0
end
if [1, 2].include?(ret[15]) # 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

51
generate_bombos_table.rb Normal file
View File

@@ -0,0 +1,51 @@
def process_values(sprite, values)
ret = values.clone
case sprite
when 0x09, 0x53, 0x54, 0x88 # moldorm, armos knights, lanmola, mothula
ret[13] = 1 # bombos - 16 damage
when 0x83, 0x84, 0x91, 0xC3 # green and red eyegores, stalfos knight, gibo
ret[13] = 1 # bombos - 16 damage
when 0x8C, 0x92 # arrghus, helmasaur king
ret[13] = 2 # bombos - 64 damage
when 0xBD # vitreous big eye
ret[13] = 2 # bombos - 64 damage
when 0x8D, 0xBE, 0xA2 # arrghus puff, vitreous small eye, kholdstare puffs
ret[13] = 1 # bombos - 16 damage
when 0xCB, 0xCC, 0xCD # trinexx, firenexx, icenexx
ret[13] = 2 # bombos - 64 damage
when 0xD0 # lynel
ret[13] = 1 # bombos - 16 damage
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_bombos.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 #$05 : BEQ .boomerang
CPX.b #$39 : BEQ .hookshot
CPX.b #$3b : BEQ .hookshot
CPX.b #$3c : BEQ .hookshot
CPX.b #$3d : BEQ .hookshot
CPX.b #$3B : BEQ .hookshot
CPX.b #$3C : BEQ .hookshot
CPX.b #$3D : BEQ .hookshot
LDA.l SpecialWeapons : CMP #$02 : BNE .normal
TXA : AND #$78 : CMP #$28 : BNE .normal
LDA $0DB8F1, X : BEQ .noDamage
LDA #$01
RTL
.normal
lda $0db8f1,x ;what we wrote over
LDA $0DB8F1, X ; what we wrote over
RTL
.boomerang
LDA.l StunItemAction : AND #$01 : BNE .normal

139
hooks.asm
View File

@@ -383,9 +383,6 @@ JSL.l LoadBombCount
org $098133 ; <- 48133 - ancilla_init.asm : 211 (STA $7EF343 : BNE .bombs_left_over)
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)
JSL.l IsItemAvailable
;--------------------------------------------------------------------------------
@@ -980,12 +977,9 @@ LDA.w AddReceivedItemExpanded_item_target_addr+1, X
org $09861F ; 4861F - ancilla_init.asm:724 (LDA .item_values, Y)
LDA.w AddReceivedItemExpanded_item_values, Y
org $098627 ; 48627 - ancilla_init.asm:731 (LDA .item_target_addr+0, X)
LDA.w AddReceivedItemExpanded_item_target_addr+0, X
org $09862C ; 4862C - ancilla_init.asm:722 (LDA .item_target_addr+1, X)
LDA.w AddReceivedItemExpanded_item_target_addr+1, X
org $098635 ; 48635 - ancilla_init.asm:727 (LDA .item_values, Y)
LDA.w AddReceivedItemExpanded_item_values, Y
org $098624 ; 48624 - ancilla_init.asm:728 (TYA : ASL A : TAX)
JSL.l UpdateInventoryLocationExpanded
BRA + : NOP #18 : +
org $0986AA ; 486AA - ancilla_init.asm:848 (LDA .item_masks, X)
LDA.w AddReceivedItemExpanded_item_masks, X
@@ -2357,9 +2351,6 @@ NOP #6
;--------------------------------------------------------------------------------
org $09865E ; <- 4865E
JSL.l $1BEE1B ; fix something i wrote over i shouldn't have
;--------------------------------------------------------------------------------
org $098638 ; <- 48638 - ancilla_init.asm:737 - LDA .item_values, Y : BMI .dontWrite (BMI)
JSL.l ItemDowngradeFix
;================================================================================
;================================================================================
@@ -2776,6 +2767,128 @@ org $01C536 : JSL FixJingleGlitch
org $01C592 : JSL FixJingleGlitch
org $01C65F : JSL FixJingleGlitch
;================================================================================
; 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 $1E838C ; sprite_helmasaur_king.asm@522 (LDA $0301 : AND.b #$0A)
JSL Utility_CheckHammerHelmasaurKingMask
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 ; is this being used? I hope not! let's find out if anything breaks!
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
org $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
;--------------------------------------------------------------------------------
org $079CE6 ; Bank07.asm@4632 (LDA #$80 : TSB $3A)
JSL CheckDetonateBomb
;--------------------------------------------------------------------------------
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
;--------------------------------------------------------------------------------
;================================================================================
; 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
;================================================================================
; Text Renderer
;--------------------------------------------------------------------------------
@@ -2807,4 +2920,4 @@ if !FEATURE_NEW_TEXT
JSL RenderCharSetColorExtended_init
org $0EF285
JSL RenderCharSetColorExtended_close : NOP
endif
endif

View File

@@ -288,17 +288,17 @@ AddInventory:
SEP #$20 ; Set 8-bit Accumulator
LDA $040C ; get dungeon id
CMP.b #$FF : BEQ .fullItemCounts
CMP.b #$FF : BEQ .fullItemCounts
CMP.l BallNChainDungeon : BNE +
CMP.l BallNChainDungeon : BNE +
CPY.b #$32 : BNE +
JMP .done
+
CMP.b #$04 : BCS +
LDA SewersLocations : INC : STA SewersLocations
LDA HCLocations : INC : STA HCLocations
BRA .fullItemCounts
+ LSR : TAX : LDA DungeonLocationsChecked, X : INC : STA DungeonLocationsChecked, X
CMP.b #$04 : BCS +
LDA SewersLocations : INC : STA SewersLocations
LDA HCLocations : INC : STA HCLocations
BRA .fullItemCounts
+ LSR : TAX : LDA DungeonLocationsChecked, X : INC : STA DungeonLocationsChecked, X
++ CPX.b #$0D : BNE +
LDA BigKeyField : AND #$04 : BNE ++
JSR .incrementGTowerPreBigKey
@@ -319,39 +319,39 @@ AddInventory:
LDA PreFluteLocations : INC : STA PreFluteLocations ; Increment Pre Mirror Counter
+
REP #$20
REP #$20
LDA TotalItemCounter : INC : STA TotalItemCounter ; Increment Item Total
SEP #$20
SEP #$20
.itemCounts
CPY.b #$00 : BNE + ; Fighter's Sword & Fighter's Shield
LDX #$01
LDX #$01
JSR .incrementSword
JSR .incrementShield
JMP .done
+ CPY.b #$01 : BNE + ; Master Sword
LDX #$02
LDX #$02
JSR .incrementSword
JMP .done
+ CPY.b #$02 : BNE + ; Tempered Sword
LDX #$03
LDX #$03
JSR .incrementSword
JMP .done
+ CPY.b #$03 : BNE + ; Golden Sword
LDX #$04
LDX #$04
JSR .incrementSword
JMP .done
+ CPY.b #$04 : BNE + ; Fighter's Shield
LDX #$01
LDX #$01
JSR .incrementShield
JMP .done
+ CPY.b #$05 : BNE + ; Red Shield
LDX #$02
LDX #$02
JSR .incrementShield
JMP .done
+ CPY.b #$06 : BNE + ; Mirror Shield
LDX #$03
LDX #$03
JSR .incrementShield
JMP .done
+ CPY.b #$07 : !BLT + ; Items $07 - $0D
@@ -386,22 +386,22 @@ AddInventory:
JMP .done
+ CPY.b #$20 : BNE + ; Crystal
JSR .incrementCrystal
JSR .setDungeonCompletion
JSR .setDungeonCompletion
JMP .done
+ CPY.b #$21 : BNE + ; Bug Net
JSR .incrementY
JMP .done
+ CPY.b #$22 : BNE + ; Blue Mail
LDX #$01
JSR .incrementMail
LDX #$01
JSR .incrementMail
+ CPY.b #$23 : BNE + ; Red Mail
LDX #$02
JSR .incrementMail
LDX #$02
JSR .incrementMail
+ CPY.b #$24 : BNE + ; Small Key
JSR .incrementKey
JMP .done
+ CPY.b #$25 : BNE + ; Compass
JSL MaybeFlagCompassTotalPickup
JSL MaybeFlagCompassTotalPickup
JSR .incrementCompass
JMP .done
+ CPY.b #$26 : BNE + ; Liar Heart (Container)
@@ -432,7 +432,7 @@ AddInventory:
+ CPY.b #$37 : !BLT + ; Items $37 - $39 - Pendants
CPY.b #$3A : !BGE +
JSR .incrementPendant
JSR .setDungeonCompletion
JSR .setDungeonCompletion
JMP .done
+ CPY.b #$3A : !BLT + ; Items $3A - $3B - Bow & Silver Arrows
CPY.b #$3C : !BGE +
@@ -452,7 +452,7 @@ AddInventory:
JSR .incrementY
JMP .done
+ CPY.b #$49 : BNE + ; Fighter's Sword
LDX #$01
LDX #$01
JSR .incrementSword
JMP .done
+ CPY.b #$4A : BNE + ; Flute (Active)
@@ -472,15 +472,15 @@ AddInventory:
JSR .incrementCapacity
JMP .done
+ CPY.b #$50 : BNE + ; Master Sword (Safe)
LDX #$02
LDX #$02
JSR .incrementSword
JMP .done
+ CPY.b #$51 : BNE + ; 5 Bomb Capacity Upgrade
LDX #$02
LDX #$02
JSR .maybeIncrementBombs
JMP .done
+ CPY.b #$52 : BNE + ; 10 Bomb Capacity Upgrade
LDX #$02
LDX #$02
JSR .maybeIncrementBombs
JMP .done
+ CPY.b #$51 : !BLT + ; Items $51 - $54 - Capacity Upgrades
@@ -491,15 +491,15 @@ AddInventory:
JSR .incrementBow
JMP .done
+ CPY.b #$5E : BNE + ; Progressive Sword
LDA SwordEquipment : INC : TAX
LDA SwordEquipment : INC : TAX
JSR .incrementSword
JMP .done
+ CPY.b #$5F : BNE + ; Progressive Shield
LDA ShieldEquipment : INC : TAX
LDA ShieldEquipment : INC : TAX
JSR .incrementShield
JMP .done
+ CPY.b #$60 : BNE + ; Progressive Armor
LDA ArmorEquipment : INC : TAX
LDA ArmorEquipment : INC : TAX
JSR .incrementMail
JMP .done
+ CPY.b #$61 : BNE + ; Progressive Lifting Glove
@@ -515,7 +515,7 @@ AddInventory:
JMP .done
+ CPY.b #$80 : !BLT + ; Items $80 - $8F - Free Compasses
CPY.b #$90 : !BGE +
JSL MaybeFlagCompassTotalPickup
JSL MaybeFlagCompassTotalPickup
JSR .incrementCompass
JMP .done
+ CPY.b #$90 : !BLT + ; Items $90 - $9F - Free Big Keys
@@ -526,6 +526,18 @@ AddInventory:
CPY.b #$B0 : !BGE +
JSR .incrementKey
JMP .done
+ CPY.b #$B6 : BNE + ; Item $B6 - Bomb Upgrade
JSR .stampSword ; update "first bomb" timestamp
LDA.l SpecialWeaponLevel ; get current bomb level
CMP #$05 : !BGE ++ ; check if already maxed
INC : STA.l SpecialWeaponLevel
++ JMP .done
+ CPY.b #$B7 : BNE + ; Item $B7 - Cane Upgrade
JSR .stampSword ; update "first cane" timestamp
LDA.l SpecialWeaponLevel ; get current cane level
CMP #$05 : !BGE ++ ; check if already maxed
INC : STA.l SpecialWeaponLevel
++ JMP .done
+
.done
PLP : PLX : PLA
@@ -575,21 +587,21 @@ RTS
.incrementSword
JSR .stampSword
LDA HighestSword
INC : STA $04 : CPX $04 : !BLT + ; don't increment unless we're getting a better sword
TXA : STA HighestSword
+
LDA HighestSword
INC : STA $04 : CPX $04 : !BLT + ; don't increment unless we're getting a better sword
TXA : STA HighestSword
+
RTS
.incrementShield
LDA HighestShield
INC : STA $04 : CPX $04 : !BLT + ; don't increment unless we're getting a better shield
TXA : STA HighestShield
+
LDA HighestShield
INC : STA $04 : CPX $04 : !BLT + ; don't increment unless we're getting a better shield
TXA : STA HighestShield
+
RTS
.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
LDA YAItemCounter : !ADD #$08 : STA YAItemCounter
.dontCount
@@ -622,10 +634,10 @@ RTS
RTS
.incrementMail
LDA HighestMail
INC : STA $04 : CPX $04 : !BLT + ; don't increment unless we're getting a better mail
TXA : STA HighestMail
+
LDA HighestMail
INC : STA $04 : CPX $04 : !BLT + ; don't increment unless we're getting a better mail
TXA : STA HighestMail
+
RTS
.incrementKeyLong
@@ -633,7 +645,7 @@ RTS
RTL
.incrementKey
LDA SmallKeyCounter : INC : STA SmallKeyCounter
LDA SmallKeyCounter : INC : STA SmallKeyCounter
RTS
.incrementCompass
@@ -645,7 +657,7 @@ RTS
RTS
.incrementGTowerPreBigKey
LDA PreGTBKLocations : INC : STA PreGTBKLocations
LDA PreGTBKLocations : INC : STA PreGTBKLocations
RTS
.maybeIncrementBombs
@@ -664,10 +676,16 @@ RTS
RTL
.incrementBossSword
LDA SwordEquipment
LDA SpecialWeapons : CMP #$01 : BEQ +
CMP #$03 : BEQ +
CMP #$04 : BEQ +
CMP #$05 : BEQ +
LDA SwordEquipment : BRA ++
+ : LDA SpecialWeaponLevel
++
BNE + : -
LDA SwordlessBossKills : INC : STA SwordlessBossKills
RTS
LDA SwordlessBossKills : INC : STA SwordlessBossKills
RTS
+ CMP #$FF : BEQ -
+ CMP #$01 : BNE +
%TopHalf(SwordBossKills) : RTS
@@ -1071,8 +1089,8 @@ RTL
SpawnShovelItem:
LDA.b #$01 : STA !REDRAW
LDA $03FC : BEQ +
JSL DiggingGameGuy_AttemptPrizeSpawn
LDA $03FC : BEQ +
JSL DiggingGameGuy_AttemptPrizeSpawn
JMP .skip
+

View File

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

View File

@@ -4,8 +4,8 @@
; Output: 0 for darkness, 1 for lamp cone
;--------------------------------------------------------------------------------
LampCheck:
LDA $7F50C4 : CMP.b #$01 : BNE + : RTL : +
CMP.b #$FF : BNE + : INC : RTL : +
LDA LightConeModifier : CMP.b #$01 : BNE + : RTL : +
CMP.b #$FF : BNE + : INC : RTL : +
LDA LampEquipment : BNE .done ; skip if we already have lantern

View File

@@ -40,8 +40,8 @@ TryOpenTRock:
RTL
;--------------------------------------------------------------------------------
MedallionTrigger_Bombos:
STZ $50 ; stuff we wrote over
STZ $0FC1
STZ $50 ; stuff we wrote over
STZ $0FC1
PHA
LDA.l MireRequiredMedallion : BNE +

View File

@@ -3,18 +3,26 @@ SEP #$30
;================================================================================
; Draw bomb count
!BOMBCOUNT_DRAW_ADDRESS = "$7EC75A"
!INFINITE_BOMBS = "$7F50C9"
;================================================================================
LDA !INFINITE_BOMBS : BNE .infinite_bombs
LDA InfiniteBombsModifier : BNE .infinite_bombs
.finite_bombs
LDA.l SpecialWeapons : 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
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
BRA +
.no_bombs
REP #$20
LDA.w #$207F : STA !BOMBCOUNT_DRAW_ADDRESS
STA !BOMBCOUNT_DRAW_ADDRESS+2
BRA +
.infinite_bombs
REP #$20
LDA.w #$2431 : STA !BOMBCOUNT_DRAW_ADDRESS ; infinity (left half)
@@ -36,12 +44,11 @@ SEP #$30
;================================================================================
; Draw arrow count
!ARROWCOUNT_DRAW_ADDRESS = "$7EC760"
!INFINITE_ARROWS = "$7F50C8"
;================================================================================
SEP #$20
LDA.l ArrowMode : BNE +
LDA !INFINITE_ARROWS : BNE .infinite_arrows
LDA InfiniteArrowsModifier : BNE .infinite_arrows
.finite_arrows
LDA.l CurrentArrows ; arrows
JSR HudHexToDec2Digit
@@ -173,7 +180,6 @@ SEP #$30
;--------------------------------------------------------------------------------
; Draw Magic Meter
!INFINITE_MAGIC = "$7F50CA"
!DrawMagicMeter_mp_tilemap = "$0DFE0F"
;--------------------------------------------------------------------------------
LDA CurrentMagic : AND #$00FF ; crap we wrote over when placing the hook for OnDrawHud
@@ -181,7 +187,7 @@ SEP #$30
AND #$FFF8
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
LDX.w #$0080 ; load full magic meter graphics
LDA $1A : AND.w #$000C : LSR #2

View File

@@ -39,6 +39,14 @@
; #$80 - Compasses
; #$90 - Big Keys
; #$A0 - Small Keys
; #$B0 - reserved for bee traps
; #$B1 - reserved for bonk shuffle
; #$B2 - reserved for bonk shuffle
; #$B3 - reserved for bonk shuffle
; #$B4 - reserved for bonk shuffle
; #$B5 - reserved for bonk shuffle
; #$B6 - Progressive Bomb
; #$B7 - Progressive Cane
; #$FE - Server Request (Asychronous Chest)
; #$FF - Null Chest
;--------------------------------------------------------------------------------
@@ -68,23 +76,23 @@
;JML GetAnimatedSpriteGfxFile_return
;--------------------------------------------------------------------------------
GetAnimatedSpriteGfxFile:
CMP.b #$0C : BNE +
CMP.b #$0C : BNE +
LDY.b #$5C : JML GetAnimatedSpriteGfxFile_return
+
CMP.b #$23 : BNE +
CMP.b #$23 : BNE +
LDY.b #$5D : JML GetAnimatedSpriteGfxFile_return
+
CMP.b #$48 : BNE +
CMP.b #$48 : BNE +
LDY.b #$60 : JML GetAnimatedSpriteGfxFile_return
+
CMP.b #$24 : !BGE +
CMP.b #$24 : !BGE +
LDY.b #$5B : JML GetAnimatedSpriteGfxFile_return
+
CMP.b #$37 : !BGE +
CMP.b #$37 : !BGE +
LDY.b #$5C : JML GetAnimatedSpriteGfxFile_return
+
CMP.b #$39 : !BGE +
CMP.b #$39 : !BGE +
LDY.b #$5D : JML GetAnimatedSpriteGfxFile_return
+
LDY.b #$32
@@ -165,14 +173,14 @@ ProcessEventItems:
LDA RNGItem : INC : STA RNGItem
SEP #$10 ; set 8-bit index registers
REP #$20 ; set 16-bit accumulator
REP #$20 ; set 16-bit accumulator
LDA GoalItemRequirement : BEQ ++
LDA GoalCounter : INC : STA GoalCounter
CMP GoalItemRequirement : !BLT ++
LDA TurnInGoalItems : AND.w #$00FF : BNE ++
JSL.l ActivateGoal
++
SEP #$20 ; set 8-bit accumulator
SEP #$20 ; set 8-bit accumulator
LDX.b #$01 : BRA .done
+
LDX.b #$00
@@ -256,7 +264,7 @@ AddReceivedItemExpandedGetItem:
+ CMP.b #$57 : BNE + ; Programmable Object 3
%ProgrammableItemLogic(3)
JMP .done
+ CMP.b #$58 : BNE + ; Upgrade-Only Sivler Arrows
+ CMP.b #$58 : BNE + ; Upgrade-Only Silver Arrows
LDA.l SilverArrowsUseRestriction : BNE +++
LDA.l SilverArrowsAutoEquip : AND.b #$01 : BEQ +++
LDA BowEquipment : BEQ ++ : CMP.b #$03 : !BGE ++
@@ -312,14 +320,14 @@ AddReceivedItemExpandedGetItem:
BRA .multi_collect
+ CMP.b #$6C : BNE + ; Goal Collectable (Multi/Power Star) Alternate Graphic
.multi_collect
REP #$20 ; set 16-bit accumulator
REP #$20 ; set 16-bit accumulator
LDA.l GoalItemRequirement : BEQ ++
LDA.l GoalCounter : INC : STA.l GoalCounter
CMP.w GoalItemRequirement : !BLT ++
LDA.l TurnInGoalItems : AND.w #$00FF : BNE ++
JSL.l ActivateGoal
++
SEP #$20 ; set 8-bit accumulator
SEP #$20 ; set 8-bit accumulator
JMP .done
+ CMP.b #$6D : BNE + ; Server Request F0
JSL.l ItemGetServiceRequest_F0
@@ -385,11 +393,26 @@ AddReceivedItemExpandedGetItem:
LDA CurrentSmallKeys : INC : STA CurrentSmallKeys
++
JMP .done
+ CMP.b #$B6 : BNE + ; Bomb Upgrade
LDA #$01 : STA InfiniteBombsModifier
JMP .done
+ : CMP.b #$B7 : BNE + ; Cane Upgrade
LDA.l SpecialWeapons : CMP #$03 : BEQ .blue_cane
CMP #$04 : BEQ .red_cane
BRA .done
.blue_cane
LDA #$01 : STA ByrnaEquipment
BRA .done
.red_cane
LDA #$01 : STA SomariaEquipment
BRA .done
BRA .done
+
.done
PLX
LDA $02E9 : CMP.b #$01 ; thing we wrote over
RTL
;--------------------------------------------------------------------------------
; #$70 - Maps
; #$80 - Compasses
; #$90 - Big Keys
@@ -479,16 +502,16 @@ AddReceivedItemExpanded:
LDA.b #$23 : STA $02D8 : JMP .done
++ : CMP.b #$61 : BNE ++ ; Progressive Lifting Glove
LDA GloveEquipment : BNE + ; No Lift
LDA.b #$1B : STA $02D8 : BRA .done
LDA.b #$1B : STA $02D8 : JMP .done
+ ; Everything Else
LDA.b #$1C : STA $02D8 : BRA .done
LDA.b #$1C : STA $02D8 : JMP .done
++ : CMP.b #$64 : BNE ++ : -- ; Progressive Bow
LDA BowEquipment : INC : LSR : CMP.l ProgressiveBowLimit : !BLT +
LDA.l ProgressiveBowReplacement : STA $02D8 : JMP .done
+ : CMP.b #$00 : BNE + ; No Bow
LDA.b #$3A : STA $02D8 : BRA .done
LDA.b #$3A : STA $02D8 : JMP .done
+ ; Any Bow
LDA.b #$3B : STA $02D8 : BRA .done
LDA.b #$3B : STA $02D8 : JMP .done
++ : CMP.b #$65 : BNE ++ ; Progressive Bow 2
LDA.l BowTracking : ORA #$20 : STA.l BowTracking
BRA --
@@ -499,45 +522,42 @@ AddReceivedItemExpanded:
JSL.l GetRNGItemSingle : STA $02D8
XBA : JSR.w MarkRNGItemSingle
LDA #$FF : STA !LOCK_IN ; clear lock-in
BRA .done
JMP .done
++ : CMP.b #$63 : BNE ++ ; RNG Item (Multi)
JSL.l GetRNGItemMulti : STA $02D8
LDA #$FF : STA !LOCK_IN ; clear lock-in
BRA .done
JMP .done
++
.done
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
}
;--------------------------------------------------------------------------------
;DATA AddReceivedItemExpanded
{
; This is a temporary measure for Fish to have consistent addresses
org $A08800
.y_offsets
db -5, -5, -5, -5, -5, -4, -4, -5
db -5, -4, -4, -4, -2, -4, -4, -4
db -5, -5, -5, -5, -5, -4, -4, -5
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, -2, -4, -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, -4, -4, -2, -2, -2, -4
db -4, -4, -4, -4, -4, -4, -4, -4
db -4, -4, -4, -4, -2, -2, -2, -4
db -4, -4, -4, -4, -4, -4, -4, -4
db -4, -4, -2, -2, -4, -2, -4, -4
db -4, -5, -4, -4
db -4, -4, -2, -2, -4, -2, -4, -4
db -4, -5, -4, -4
;new
db -4, -4, -4, -4
db -5 ; Master Sword (Safe)
db -4, -4, -4, -4 ; +5/+10 Bomb Arrows
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 ; Null Item
db -4, -4, -4 ; Red, Blue & Green Clocks
@@ -551,32 +571,36 @@ org $A08800
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Free Compass
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Free Big Key
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Free Small Key
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused
db -4 ; reserved for bee traps
db -4, -4, -4, -4, -4 ; reserved for bonk shuffle
db -4 ; Bomb Upgrade
db -4 ; Cane Upgrade
db -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
db 4, 4, 4, 4, 4, 0, 0, 4
db 4, 4, 4, 4, 5, 0, 0, 0
db 4, 4, 4, 4, 4, 0, 0, 4
db 4, 4, 4, 4, 5, 0, 0, 0
db 0, 0, 0, 4, 0, 4, 0, 0
db 4, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 4, 0, 4, 0, 0
db 4, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 4, 0, 0, 0
db 0, 0, 5, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 4, 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, 0, 0, 0, 0
db 0, 0, 0, 0, 4, 4, 4, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 4, 4, 0, 4, 0, 0
db 0, 4, 0, 0
db 0, 0, 4, 4, 0, 4, 0, 0
db 0, 4, 0, 0
;new
db 0, 0, 0, 0
db 4 ; Master Sword (Safe)
db 0, 0, 0, 0 ; +5/+10 Bomb Arrows
db 0, 0, 0 ; 3x Programmable Item
db 0 ; Upgrade-Only Sivler Arrows
db 0 ; Upgrade-Only Silver Arrows
db 4 ; 1 Rupoor
db 0 ; Null Item
db 0, 0, 0 ; Red, Blue & Green Clocks
@@ -591,33 +615,37 @@ org $A08800
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Free Big Key
;db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; *EVENT*
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Free Small Key
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused
db 0 ; reserved for bee traps
db 0, 0, 0, 0, 0 ; reserved for bonk shuffle
db 0 ; Bomb Upgrade
db 4 ; Cane Upgrade
db 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
db $06, $18, $18, $18, $2D, $20, $2E, $09
db $09, $0A, $08, $05, $10, $0B, $2C, $1B
db $06, $18, $18, $18, $2D, $20, $2E, $09
db $09, $0A, $08, $05, $10, $0B, $2C, $1B
db $1A, $1C, $14, $19, $0C, $07, $1D, $2F
db $07, $15, $12, $0D, $0D, $0E, $11, $17
db $1A, $1C, $14, $19, $0C, $07, $1D, $2F
db $07, $15, $12, $0D, $0D, $0E, $11, $17
db $28, $27, $04, $04, $0F, $16, $03, $13
db $01, $1E, $10, $00, $00, $00, $00, $00
db $28, $27, $04, $04, $0F, $16, $03, $13
db $01, $1E, $10, $00, $00, $00, $00, $00
db $00, $30, $22, $21, $24, $24, $24, $23
db $23, $23, $29, $2A, $2C, $2B, $03, $03
db $00, $30, $22, $21, $24, $24, $24, $23
db $23, $23, $29, $2A, $2C, $2B, $03, $03
db $34, $35, $31, $33, $02, $32, $36, $37
db $2C, $06, $0C, $38
db $34, $35, $31, $33, $02, $32, $36, $37
db $2C, $06, $0C, $38
;new
db $39, $3A, $3B, $3C
;5x
db $18 ; Master Sword (Safe)
db $3D, $3E, $3F, $40 ; +5/+10 Bomb Arrows
db $00, $00, $00 ; 3x Programmable Item
db $41 ; Upgrade-Only Sivler Arrows
db $41 ; Upgrade-Only Silver Arrows
db $24 ; 1 Rupoor
db $47 ; Null Item
db $48, $48, $48 ; Red, Blue & Green Clocks
@@ -635,33 +663,36 @@ org $A08800
;db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; *EVENT*
;db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; *EVENT*
;db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; *EVENT*
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
db $49 ; reserved for bee traps
db $49, $49, $49, $49, $49 ; reserved for bonk shuffle
db $13 ; Bomb Upgrade
db $07 ; Cane Upgrade
db $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
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, $00
db $00, $00, $00, $00, $00, $02, $02, $02
db $02, $02, $02, $00, $02, $00, $02, $02
db $00, $02, $02, $02, $02, $02, $02, $02
db $02, $02, $02, $00, $02, $00, $02, $02
db $00, $02, $02, $02, $02, $02, $02, $02
db $02, $02, $02, $02, $00, $02, $02, $02
db $02, $02, $00, $02, $02, $02, $02, $02
db $02, $02, $02, $02, $00, $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, $02, $02, $02, $02
db $02, $02, $02, $02, $00, $00, $00, $02
db $02, $02, $02, $02, $02, $02, $02, $02
db $02, $02, $00, $00, $02, $00, $02, $02
db $02, $00, $02, $02
db $02, $02, $00, $00, $02, $00, $02, $02
db $02, $00, $02, $02
;new
db $02, $02, $02, $02
db $00 ; Master Sword (Safe)
db $02, $02, $02, $02 ; +5/+10 Bomb Arrows
db $02, $02, $02 ; 3x Programmable Item
db $02 ; Upgrade-Only Sivler Arrows
db $02 ; Upgrade-Only Silver Arrows
db $00 ; 1 Rupoor
db $02 ; Null Item
db $02, $02, $02 ; Red, Blue & Green Clocks
@@ -675,34 +706,37 @@ org $A08800
db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Free Compass
db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Free Big Key
db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; Free Small Key
db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused
db $02 ; reserved for bee traps
db $02, $02, $02, $02, $02 ; reserved for bonk shuffle
db $02 ; Bomb Upgrade
db $00 ; Cane Upgrade
db $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
db 5, -1, 5, 5, 5, 5, 5, 1
db 2, 1, 1, 1, 2, 2, 2, 4
db 5, -1, 5, 5, 5, 5, 5, 1
db 2, 1, 1, 1, 2, 2, 2, 4
db 4, 4, 1, 1, 2, 1, 1, 1
db 2, 1, 2, 1, 4, 4, 2, 1
db 4, 4, 1, 1, 2, 1, 1, 1
db 2, 1, 2, 1, 4, 4, 2, 1
db 6, 1, 2, 1, 2, 2, 1, 2
db 2, 4, 1, 1, 4, 2, 1, 4
db 6, 1, 2, 1, 2, 2, 1, 2
db 2, 4, 1, 1, 4, 2, 1, 4
db 2, 2, 4, 4, 4, 2, 1, 4
db 1, 2, 2, 1, 2, 2, 1, 1
db 2, 2, 4, 4, 4, 2, 1, 4
db 1, 2, 2, 1, 2, 2, 1, 1
db 4, 4, 1, 2, 2, 4, 4, 4
db 2, 5, 2, 1
db 4, 4, 1, 2, 2, 4, 4, 4
db 2, 5, 2, 1
;new
db 4, 4, 4, 4
db 5 ; Master Sword (Safe)
db 4, 4, 4, 4 ; +5/+10 Bomb Arrows
db 4, 4, 4 ; 3x Programmable Item
db 1 ; Upgrade-Only Sivler Arrows
db 1 ; Upgrade-Only Silver Arrows
db 3 ; 1 Rupoor
db 1 ; Null Item
db 1, 2, 4 ; Red, Blue & Green Clocks
@@ -716,7 +750,11 @@ org $A08800
db 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ; Free Compass
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Free Big Key
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Free Small Key
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused
db 4 ; reserved for bee traps
db 4, 4, 4, 4, 4 ; reserved for bonk shuffle
db 5 ; Bomb Upgrade
db 5 ; Cane Upgrade
db 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
@@ -724,20 +762,20 @@ org $A08800
; \item Target SRAM addresses for items you receive
.item_target_addr
dw $F359, $F359, $F359, $F359, $F35A, $F35A, $F35A, $F345
dw $F346, $F34B, $F342, $F340, $F341, $F344, $F35C, $F347
dw $F359, $F359, $F359, $F359, $F35A, $F35A, $F35A, $F345
dw $F346, $F34B, $F342, $F340, $F341, $F344, $F35C, $F347
dw $F348, $F349, $F34A, $F34C, $F34C, $F350, $F35C, $F36B
dw $F351, $F352, $F353, $F354, $F354, $F34E, $F356, $F357
dw $F348, $F349, $F34A, $F34C, $F34C, $F350, $F35C, $F36B
dw $F351, $F352, $F353, $F354, $F354, $F34E, $F356, $F357
dw $F37A, $F34D, $F35B, $F35B, $F36F, $F364, $F36C, $F375
dw $F375, $F344, $F341, $F35C, $F35C, $F35C, $F36D, $F36E
dw $F37A, $F34D, $F35B, $F35B, $F36F, $F364, $F36C, $F375
dw $F375, $F344, $F341, $F35C, $F35C, $F35C, $F36D, $F36E
dw $F36E, $F375, $F366, $F368, $F360, $F360, $F360, $F374
dw $F374, $F374, $F340, $F340, $F35C, $F35C, $F36C, $F36C
dw $F36E, $F375, $F366, $F368, $F360, $F360, $F360, $F374
dw $F374, $F374, $F340, $F340, $F35C, $F35C, $F36C, $F36C
dw $F360, $F360, $F372, $F376, $F376, $F373, $F360, $F360
dw $F35C, $F359, $F34C, $F355
dw $F360, $F360, $F372, $F376, $F376, $F373, $F360, $F360
dw $F35C, $F359, $F34C, $F355
;new
dw $F375, $F376, $F373, $F373
dw $F359 ; Master Sword (Safe)
@@ -757,7 +795,11 @@ org $A08800
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Free Compass
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Free Big Key
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Free Small Key
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused
dw $F36A ; reserved for bee traps
dw $F36A, $F36A, $F36A, $F36A, $F36A ; reserved for bonk shuffle
dw $F38F ; Bomb Upgrade
dw $F38F ; Cane Upgrade
dw $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
@@ -767,26 +809,26 @@ org $A08800
; DATA Values to write to the above SRAM locations.
{
.item_values
db $01, $02, $03, $04, $01, $02, $03, $01
db $01, $01, $01, $01, $01, $02, $FF, $01
db $01, $02, $03, $04, $01, $02, $03, $01
db $01, $01, $01, $01, $01, $02, $FF, $01
db $01, $01, $01, $01, $02, $01, $FF, $FF
db $01, $01, $02, $01, $02, $01, $01, $01
db $01, $01, $01, $01, $02, $01, $FF, $FF
db $01, $01, $02, $01, $02, $01, $01, $01
db $FF, $01, $FF, $02, $FF, $FF, $FF, $FF
db $FF, $FF, $02, $FF, $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, $FF, $FF, $FF, $FB, $EC, $FF
db $FF, $FF, $01, $03, $FF, $FF, $FF, $FF
db $FF, $FF, $FF, $FF, $FF, $FB, $EC, $FF
db $FF, $FF, $01, $03, $FF, $FF, $FF, $FF
db $9C, $CE, $FF, $01, $0A, $FF, $FF, $FF
db $FF, $01, $03, $01
db $9C, $CE, $FF, $01, $0A, $FF, $FF, $FF
db $FF, $01, $03, $01
;new
db $32, $46, $80, $80
db $02 ; Master Sword (Safe)
db $FF, $FF, $FF, $FF ; +5/+10 Bomb Arrows
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 ; Null Item
db $FF, $FF, $FF ; Red, Blue & Green Clocks
@@ -800,26 +842,30 @@ org $A08800
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Free Compass
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Free Big Key
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Free Small Key
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused
db $FF ; reserved for bee traps
db $FF, $FF, $FF, $FF, $FF ; reserved for bonk shuffle
db $FF ; Bomb Upgrade
db $FF ; Cane Upgrade
db $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
;0x02 - Hyrule Castle
;0x04 - Eastern Palace
;0x06 - Desert Palace
;0x08 - Hyrule Castle 2
;0x0A - Swamp Palace
;0x0C - Dark Palace
;0x0E - Misery Mire
;0x10 - Skull Woods
;0x12 - Ice Palace
;0x14 - Tower of Hera
;0x16 - Gargoyle's Domain
;0x18 - Turtle Rock
;0x1A - Ganon's Tower
;0x00 - Sewer Passage
;0x02 - Hyrule Castle
;0x04 - Eastern Palace
;0x06 - Desert Palace
;0x08 - Hyrule Castle 2
;0x0A - Swamp Palace
;0x0C - Dark Palace
;0x0E - Misery Mire
;0x10 - Skull Woods
;0x12 - Ice Palace
;0x14 - Tower of Hera
;0x16 - Gargoyle's Domain
;0x18 - Turtle Rock
;0x1A - Ganon's Tower
.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
@@ -845,27 +891,27 @@ org $A08800
}
;--------------------------------------------------------------------------------
BottleListExpanded:
db $16, $2B, $2C, $2D, $3D, $3C, $48
db $16, $2B, $2C, $2D, $3D, $3C, $48
PotionListExpanded:
db $2E, $2F, $30, $FF, $0E
db $2E, $2F, $30, $FF, $0E
;--------------------------------------------------------------------------------
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, $44, -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, $35, -1, -1, -1, -1, -1
db -1, -1, -1, -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, $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, $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
db -1, -1, -1, -1, -1, -1, -1, -1
db -1, -1, -1, -1
db -1, -1, -1, -1
db -1 ; Master Sword (Safe)
@@ -885,7 +931,11 @@ Link_ReceiveItemAlternatesExpanded:
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Free Compass
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Free Big Key
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Free Small Key
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused
db -1 ; reserved for bee traps
db -1, -1, -1, -1, -1 ; reserved for bonk shuffle
db -1 ; Bomb Upgrade
db -1 ; Cane Upgrade
db -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
@@ -904,10 +954,10 @@ RTL
;DrawHUDSilverArrows:
; LDA BowEquipment : AND.w #$00FF : BNE +
; LDA BowTracking : AND.w #$0040 : BEQ +
; LDA.w #$2810 : STA $11C8
; LDA.w #$2811 : STA $11CA
; LDA.w #$2820 : STA $1208
; LDA.w #$2821 : STA $120A
; LDA.w #$2810 : STA $11C8
; LDA.w #$2811 : STA $11CA
; LDA.w #$2820 : STA $1208
; LDA.w #$2821 : STA $120A
; +
; LDA.w #$11CE : STA $00 ; thing we wrote over
;RTL
@@ -1087,76 +1137,107 @@ AttemptItemSubstitution:
RTS
;--------------------------------------------------------------------------------
CountBottles:
PHX
LDX.b #$00
LDA BottleContentsOne : BEQ ++ : INX
++ : LDA BottleContentsTwo : BEQ ++ : INX
++ : LDA BottleContentsThree : BEQ ++ : INX
++ : LDA BottleContentsFour : BEQ ++ : INX
++
TXA
PLX
PHX
LDX.b #$00
LDA BottleContentsOne : BEQ ++ : INX
++ : LDA BottleContentsTwo : BEQ ++ : INX
++ : LDA BottleContentsThree : BEQ ++ : INX
++ : LDA BottleContentsFour : BEQ ++ : INX
++
TXA
PLX
RTS
;--------------------------------------------------------------------------------
ActivateGoal:
STZ $11
STZ $B0
STZ $11
STZ $B0
JML.l StatsFinalPrep
;--------------------------------------------------------------------------------
ChestPrep:
LDA.b #$01 : STA $02E9
JSL.l IncrementChestCounter
JSL.l IncrementChestCounter
LDA.l ServerRequestMode : BEQ +
JSL.l ChestItemServiceRequest
RTL
+
LDY $0C ; get item value
LDY $0C ; get item value
SEC
RTL
;--------------------------------------------------------------------------------
UpdateInventoryLocationExpanded:
{
REP #$30
TYA : AND #$00FF : ASL A : TAX
; Tells what inventory location to write to.
LDA.w AddReceivedItemExpanded_item_target_addr, X : STA $00
SEP #$30
LDA.b #$7E : STA $02
LDA.w AddReceivedItemExpanded_item_values, Y
JSL ItemDowngradeFix
RTL
}
;--------------------------------------------------------------------------------
; Set a flag in SRAM if we pick up a compass in its own dungeon with HUD compass
; counts on
MaybeFlagCompassTotalPickup:
LDA.l CompassMode : AND.b #$0F : BEQ .done
LDA $040C : CMP #$FF : BEQ .done
LSR : STA $04 : LDA #$0F : !SUB $04 ; Compute flag "index"
CPY #$25 : BEQ .setFlag ; Set flag if it's a compass for this dungeon
STA $04
TYA : AND #$0F : CMP $04 : BNE .done ; Check if compass is for this dungeon
.setFlag
CMP #$08 : !BGE ++
%ValueShift()
ORA CompassCountDisplay : STA CompassCountDisplay
BRA .done
++
!SUB #$08
%ValueShift()
BIT.b #$C0 : BEQ + : LDA.b #$C0 : + ; Make Hyrule Castle / Sewers Count for Both
ORA CompassCountDisplay+1 : STA CompassCountDisplay+1
.done
LDA.l CompassMode : AND.b #$0F : BEQ .done
LDA $040C : CMP #$FF : BEQ .done
LSR : STA $04 : LDA #$0F : !SUB $04 ; Compute flag "index"
CPY #$25 : BEQ .setFlag ; Set flag if it's a compass for this dungeon
STA $04
TYA : AND #$0F : CMP $04 : BNE .done ; Check if compass is for this dungeon
.setFlag
CMP #$08 : !BGE ++
%ValueShift()
ORA CompassCountDisplay : STA CompassCountDisplay
BRA .done
++
!SUB #$08
%ValueShift()
BIT.b #$C0 : BEQ + : LDA.b #$C0 : + ; Make Hyrule Castle / Sewers Count for Both
ORA CompassCountDisplay+1 : STA CompassCountDisplay+1
.done
RTL
;--------------------------------------------------------------------------------
; Set the compass count display flag if we're entering a dungeon and alerady have
; that compass
MaybeFlagCompassTotalEntrance:
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
CMP.w #$0002 : BEQ .countShown
LDA CompassField : AND.l DungeonItemMasks, X : BEQ .done ; skip if we don't have compass
.countShown
SEP #$20
TXA : LSR : STA.b $04 : LDA.b #$0F : !SUB $04 ; Compute flag "index"
CMP #$08 : !BGE ++
%ValueShift()
ORA CompassCountDisplay : STA CompassCountDisplay
REP #$20
BRA .done
++
!SUB #$08
%ValueShift()
BIT.b #$C0 : BEQ + : LDA.b #$C0 : + ; Make Hyrule Castle / Sewers Count for Both
ORA CompassCountDisplay+1 : STA CompassCountDisplay+1
REP #$20
.done
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
CMP.w #$0002 : BEQ .countShown
LDA CompassField : AND.l DungeonItemMasks, X : BEQ .done ; skip if we don't have compass
.countShown
SEP #$20
TXA : LSR : STA.b $04 : LDA.b #$0F : !SUB $04 ; Compute flag "index"
CMP #$08 : !BGE ++
%ValueShift()
ORA CompassCountDisplay : STA CompassCountDisplay
REP #$20
BRA .done
++
!SUB #$08
%ValueShift()
BIT.b #$C0 : BEQ + : LDA.b #$C0 : + ; Make Hyrule Castle / Sewers Count for Both
ORA CompassCountDisplay+1 : STA CompassCountDisplay+1
REP #$20
.done
RTL
;--------------------------------------------------------------------------------
LoadReceivedItemExpandedProperties:
CPX.b #$B6 : 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

@@ -543,60 +543,117 @@ DrawPendantCrystalDiagram:
LDA PendantsField
LSR : BCC + ; pendant of wisdom (red)
LDX.w #$252B
LDX.w #$247D
STX.w $13B6
INX : STX.w $13B8
INX : STX.w $13F6
INX : STX.w $13F8
LDX.w #$E47E
STX.w $13F6
DEX : STX.w $13F8
; LDX.w #$252B
; STX.w $13B6
; INX : STX.w $13B8
; INX : STX.w $13F6
; INX : STX.w $13F8
+ LSR : BCC + ; pendant of power (blue)
LDX.w #$2D2B
LDX.w #$2C7D
STX.w $13AE
INX : STX.w $13B0
INX : STX.w $13EE
INX : STX.w $13F0
LDX.w #$EC7E
STX.w $13EE
DEX : STX.w $13F0
; LDX.w #$2D2B
; STX.w $13AE
; INX : STX.w $13B0
; INX : STX.w $13EE
; INX : STX.w $13F0
+ LSR : BCC + ; pendant of courage (green)
LDX.w #$3D2B
LDX.w #$3C7D
STX.w $1332
INX : STX.w $1334
INX : STX.w $1372
INX : STX.w $1374
LDX.w #$FC7E
STX.w $1372
DEX : STX.w $1374
; LDX.w #$3D2B
; STX.w $1332
; INX : STX.w $1334
; INX : STX.w $1372
; INX : STX.w $1374
+
; ; crystals
; LDA CrystalsField
; LDX.w #$2D44
; LDY.w #$2D45
; BIT.w #$0002 : BEQ + ; crystal 1
; STX.w $14AC
; STY.w $14AE
; + BIT.w #$0010 : BEQ + ; crystal 2
; STX.w $146E
; STY.w $1470
; + BIT.w #$0040 : BEQ + ; crystal 3
; STX.w $14B0
; STY.w $14B2
; + BIT.w #$0020 : BEQ + ; crystal 4
; STX.w $1472
; STY.w $1474
; + BIT.w #$0008 : BEQ + ; crystal 7
; STX.w $14B8
; STY.w $14BA
; +
; LDX.w #$2544
; LDY.w #$2545
; BIT.w #$0004 : BEQ + ; crystal 5
; STX.w $14B4
; STY.w $14B6
; + BIT.w #$0001 : BEQ + ; crystal 6
; STX.w $1476
; STY.w $1478
; +
; crystals
LDA CrystalsField
LDX.w #$2D44
LDY.w #$2D45
BIT.w #$0002 : BEQ + ; crystal 1
STX.w $14AC
STY.w $14AE
LDX.w #$287D
STX.w $1432
LDX.w #$287E
STX.w $1434
+ BIT.w #$0010 : BEQ + ; crystal 2
LDX.w #$287D
STX.w $146E
STY.w $1470
LDX.w #$E87E
STX.w $14AE
+ BIT.w #$0040 : BEQ + ; crystal 3
LDX.w #$287E
STX.w $1470
LDX.w #$E87D
STX.w $14B0
STY.w $14B2
+ BIT.w #$0020 : BEQ + ; crystal 4
LDX.w #$287D
STX.w $1472
STY.w $1474
+ BIT.w #$0008 : BEQ + ; crystal 7
STX.w $14B8
STY.w $14BA
+
LDX.w #$2544
LDY.w #$2545
BIT.w #$0004 : BEQ + ; crystal 5
LDX.w #$E87E
STX.w $14B2
+ BIT.w #$0004 : BEQ + ; crystal 5
LDX.w #$247E
STX.w $1474
LDX.w #$E47D
STX.w $14B4
STY.w $14B6
+ BIT.w #$0001 : BEQ + ; crystal 6
LDX.w #$247D
STX.w $1476
STY.w $1478
LDX.w #$E47E
STX.w $14B6
+ BIT.w #$0008 : BEQ + ; crystal 7
LDX.w #$287E
STX.w $1478
LDX.w #$E87D
STX.w $14B8
+
PLB : PLP

View File

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

View File

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

587
special_weapons.asm Normal file
View File

@@ -0,0 +1,587 @@
;--------------------------------------------------------------------------------
!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 : 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 : CMP #$01 : BEQ .cane_immune
CMP #$03 : BEQ .cane_immune
CMP #$04 : BEQ .special_cane
CMP #$05 : BEQ .special_cane
BRA .normal
.blue_cane
PHA
LDA SpecialWeapons : CMP #$01 : BEQ .cane_immune
CMP #$03 : BEQ .special_cane
CMP #$04 : BEQ .cane_immune
CMP #$05 : BEQ .special_cane
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 : CMP #$02 : BNE .normal
PLA
LDA #$05
RTL
.normal
PLA
.not_cane_or_beam
CMP #$07 : BNE .no_change
LDA SpecialWeapons : 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 : 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 $0E10, Y : BNE .ignore_collision ; Moldy can have little a I-Frames, as a treat
LDA.l SpecialWeapons : CMP #$01 : BNE ++
LDA $0C4A, X : CMP #$07 : BEQ .check_collision_moldorm
BRA .ignore_collision ; don't collide with non-bombs
++ : LDA.l SpecialWeapons : CMP #$03 : BNE ++
LDA $0C4A, X : CMP #$31 : BEQ .check_collision_moldorm
BRA .ignore_collision ; don't collide with non-byrna
++ : LDA.l SpecialWeapons : CMP #$04 : BNE ++
LDA $0C4A, X : CMP #$01 : BEQ .check_collision_moldorm
CMP #$2C : BEQ .check_collision_moldorm
BRA .ignore_collision ; don't collide with non-somaria
++ : LDA.l SpecialWeapons : CMP #$05 : BNE .ignore_collision
LDA $0C4A, X : CMP #$01 : BEQ .check_collision_moldorm
CMP #$2C : BEQ .check_collision_moldorm
CMP #$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 : CMP #$01 : BNE ++
LDA $0C4A, X : CMP #$07 : BEQ .check_collision_trinexx
BRA .ignore_collision ; don't collide with non-bombs
++ : LDA.l SpecialWeapons : CMP #$03 : BNE ++
LDA $0C4A, X : CMP #$31 : BEQ .check_collision_trinexx
JMP .ignore_collision ; don't collide with non-byrna
++ : LDA.l SpecialWeapons : CMP #$04 : BNE ++
LDA $0C4A, X : CMP #$01 : BEQ .check_collision_trinexx
CMP #$2C : BEQ .check_collision_trinexx
JMP .ignore_collision ; don't collide with non-somaria
++ : LDA.l SpecialWeapons : CMP #$05 : BNE .ignore_collision
LDA $0C4A, X : CMP #$01 : BEQ .check_collision_trinexx
CMP #$2C : BEQ .check_collision_trinexx
CMP #$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 : CMP #$01 : BNE ++
LDA $0C4A, X : CMP #$07 : BEQ .collide
BRA .normal ; normal behavior with non-bombs
++ : LDA.l SpecialWeapons : CMP #$03 : BNE ++
LDA $0C4A, X : CMP #$31 : BEQ .collide
BRA .normal ; normal behavior with non-byrna
++ : LDA.l SpecialWeapons : CMP #$04 : BNE ++
LDA $0C4A, X : CMP #$01 : BEQ .collide
CMP #$2C : BEQ .collide
BRA .normal ; normal behavior with non-somaria
++ : LDA.l SpecialWeapons : CMP #$05 : BNE .normal
LDA $0C4A, X : CMP #$01 : BEQ .collide
CMP #$2C : BEQ .collide
CMP #$31 : BEQ .collide
BRA .normal ; normal behavior with non-canes
.collide
CLC
RTL
.normal
LDA $0DB0, Y : CMP.b #$03
RTL
; returns carry set if there is collision immunity
;--------------------------------------------------------------------------------
Utility_CheckHammerHelmasaurKingMask:
LDA.l SpecialWeapons : CMP #$01 : BEQ .no_effect
LDA $0301 : AND #$0A
RTL
.no_effect
LDA #$00
RTL
;--------------------------------------------------------------------------------
Utility_CheckImpervious:
LDA $0E20, X : CMP.b #$CB : BNE .normal
.trinexx
LDA SpecialWeapons : CMP #$01 : BEQ +
CMP #$03 : BEQ +
CMP #$04 : BEQ +
CMP #$05 : BEQ +
CMP #$06 : BEQ .check_sidenexx
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 : CMP #$01 : BEQ +
CMP #$03 : BEQ +
CMP #$04 : BEQ +
CMP #$05 : BEQ +
BRA .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 SpecialWeapons : CMP #$01 : BEQ +
CMP #$03 : BEQ +
CMP #$04 : BEQ +
CMP #$05 : BEQ +
BRA .not_impervious
+
LDA $0CF2 : CMP #$06 : !BLT .impervious ; swords are ineffective
BRA .not_impervious
.vulnerable
LDA SpecialWeapons : CMP #$01 : BEQ +
CMP #$03 : BEQ +
CMP #$04 : BEQ +
CMP #$05 : BEQ +
BRA .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 SpecialWeapons : CMP #$01 : BEQ .no_disable_projectiles
CMP #$03 : BEQ .no_disable_projectiles
CMP #$04 : BEQ .no_disable_projectiles
CMP #$05 : BEQ .no_disable_projectiles
CMP #$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 SpecialWeapons : CMP #$01 : BEQ .no_disable_projectiles
CMP #$03 : BEQ .no_disable_projectiles
CMP #$04 : BEQ .no_disable_projectiles
CMP #$05 : BEQ .no_disable_projectiles
CMP #$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 #$00FF : 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 #$00FF : CMP.w #$0001 : BEQ .specialSword
CMP.w #$0003 : BEQ .specialSword
CMP.w #$0004 : BEQ .specialSword
CMP.w #$0005 : 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 #$00FF : 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 #$00FF : 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 : 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 : 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 : CMP.b #$01 : BNE .not_bomb_mode
.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
BRA .done
.not_bomb_mode
LDA.l SpecialWeapons : CMP.b #$06 : BNE .done
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 BowEquipment : 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
; what we wrote over
LDA.b #$80
TSB.b $3A
RTL
;--------------------------------------------------------------------------------
SetBeeType:
LDA.l SpecialWeapons : CMP.b #$06 : BEQ .bee_mode
LDX.w $0202
.check_bee_type
LDA.l EquipmentWRAM-1, X
TAX
LDA.l BottleContents-1, 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 : 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 : 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 : 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

View File

@@ -10,7 +10,6 @@ org $1BEE1B
JSL SpriteSwap_Palette_ArmorAndGloves_part_two
RTL
!SPRITE_SWAP = "$7F50CD"
;!STABLE_SCRATCH = "$7EC178"
!BANK_BASE = "#$29"
@@ -18,7 +17,7 @@ org $BF8000
SwapSpriteIfNecessary:
PHP
SEP #$20 ; set 8-bit accumulator
LDA !SPRITE_SWAP : BEQ + : !ADD !BANK_BASE : CMP $BC : BEQ +
LDA SpriteSwapper : BEQ + : !ADD !BANK_BASE : CMP $BC : BEQ +
STA $BC
STZ $0710 ; Set Normal Sprite NMI
JSL.l SpriteSwap_Palette_ArmorAndGloves_part_two
@@ -29,7 +28,7 @@ RTL
SpriteSwap_Palette_ArmorAndGloves:
{
;DEDF9
LDA !SPRITE_SWAP : BNE .continue
LDA SpriteSwapper : BNE .continue
LDA.b #$10 : STA $BC ; Load Original Sprite Location
REP #$21
LDA ArmorEquipment
@@ -37,7 +36,7 @@ SpriteSwap_Palette_ArmorAndGloves:
RTL
.part_two
SEP #$30
LDA !SPRITE_SWAP : BNE .continue
LDA SpriteSwapper : BNE .continue
REP #$30
LDA GloveEquipment
JSL $1BEE21 ; Read Original Palette Code

View File

@@ -170,11 +170,12 @@ InventoryTracking: skip 2 ; b r m p n s k f - - - - - - o q (bitfield)
; p = Magic Powder | n = Mushroom Past | s = Shovel
; k = Inactive Flute | f = Active Flute | o = Any bomb acquired
; q = Quickswap locked
BowTracking: skip 2 ; b s p - - - - - - - - - - - - - (bitfield)
BowTracking: skip 1 ; b s p - - - - - (bitfield)
; b = Bow | s = Silver Arrows Upgrade | p = Second Progressive Bow
; The front end writes two distinct progressive bow items. p
; indicates whether the "second" has been found independent of
; the first
SpecialWeaponLevel: skip 1 ; Keeps track of level of weapon in bomb-only and cane-only modes
ItemLimitCounts: skip 16 ; Keeps track of limited non-progressive items such as lamp.
; See: ItemSubstitutionRules in tables.asm
; Right now this is only used for three items but extra space is
@@ -310,7 +311,8 @@ HeartPieceCounter: skip 1 ; Total Number of heartpieces collected (integer
CrystalCounter: skip 1 ; Total Number of crystals collected (integer)
DungeonsCompleted: skip 2 ; Bitfield indicating whether a dungeon's prize has been collected.
; 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
ServiceSequenceTx: ; Service sequence transmit
ServiceSequence: skip 8 ; Service request block. See servicerequest.asm
@@ -368,6 +370,26 @@ FileMarker: skip 1 ; $FF = Active save file | $00 = Inactive save f
skip 13 ; Unused
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)
;--------------------------------------------------------------------------------
@@ -524,6 +546,7 @@ endmacro
;--------------------------------------------------------------------------------
%assertSRAM(InventoryTracking, $7EF38C)
%assertSRAM(BowTracking, $7EF38E)
%assertSRAM(SpecialWeaponLevel, $7EF38F)
%assertSRAM(ItemLimitCounts, $7EF390)
;--------------------------------------------------------------------------------
%assertSRAM(GameCounter, $7EF3FF)
@@ -635,6 +658,22 @@ endmacro
%assertSRAM(GTCollectedKeys, $7EF4ED)
%assertSRAM(FileMarker, $7EF4F0)
;--------------------------------------------------------------------------------
%assertSRAM(SwordModifier, $7F50C0)
%assertSRAM(ShieldModifier, $7F50C1)
%assertSRAM(ArmorModifier, $7F50C2)
%assertSRAM(MagicModifier, $7F50C3)
%assertSRAM(LightConeModifier, $7F50C4)
%assertSRAM(CuccoStormModifier, $7F50C5)
%assertSRAM(OldManDashModifier, $7F50C6)
%assertSRAM(IcePhysicsModifier, $7F50C7)
%assertSRAM(InfiniteArrowsModifier, $7F50C8)
%assertSRAM(InfiniteBombsModifier, $7F50C9)
%assertSRAM(InfiniteMagicModifier, $7F50CA)
%assertSRAM(InvertDPadModifier, $7F50CB)
%assertSRAM(TemporaryOHKO, $7F50CC)
%assertSRAM(SpriteSwapper, $7F50CD)
%assertSRAM(BootsModifier, $7F50CE)
;--------------------------------------------------------------------------------
%assertSRAM(ExtendedFileNameWRAM, $7F6000)
%assertSRAM(RoomPotData, $7F6018)
%assertSRAM(SpritePotData, $7F6268)

View File

@@ -51,7 +51,7 @@ DungeonStairsTransition:
JSL Dungeon_SaveRoomQuadrantData
BRA StatTransitionCounter
DungeonExitTransition:
LDA $7F50C7 : BEQ + ; ice physics
LDA IcePhysicsModifier : BEQ + ; ice physics
JSL Player_HaltDashAttackLong
LDA.b #$00 : STA $0301 ; stop item dashing
+
@@ -181,6 +181,16 @@ IncrementChestTurnCounter:
PLA
RTL
;--------------------------------------------------------------------------------
IncrementBombsPlacedCounter:
PHA
LDA StatsLocked : BNE +
PHP : REP #$20
LDA BombsPlaced : INC : STA BombsPlaced
PLP
+
PLA
RTL
;--------------------------------------------------------------------------------
IncrementChestCounter:
LDA.b #$01 : STA $02E9 ; thing we wrote over
PHA

View File

@@ -3,15 +3,59 @@
;===================================================================================================
table "creditscharmapbighi.txt"
YourSpriteCreditsHi:
db 2
db 55
db " " ; $238002
db 2, 55, " " ; $238002
table "creditscharmapbiglo.txt"
YourSpriteCreditsLo:
db 2
db 55
db " " ; $238020
db 2, 55, " " ; $238020
table "creditscharmapbighi.txt"
FirstSwordStatsHi:
db 2, 55, "FIRST BOMBOS " ; $23803E
table "creditscharmapbiglo.txt"
FirstSwordStatsLo:
db 2, 55, "FIRST BOMBOS " ; $23805C
table "creditscharmapbighi.txt"
SwordlessKillsHi:
db 2, 55, "BOMBOSLESS /13" ; $23807A
table "creditscharmapbiglo.txt"
SwordlessKillsLo:
db 2, 55, "BOMBOSLESS /13" ; $238098
table "creditscharmapbighi.txt"
FighterSwordKillsHi:
db 2, 55, "FIGHTER'S BOMBOS /13" ; $2380B6
table "creditscharmapbiglo.txt"
FighterSwordKillsLo:
db 2, 55, "FIGHTER'S BOMBOS /13" ; $2380D4
table "creditscharmapbighi.txt"
MasterSwordKillsHi:
db 2, 55, "MASTER BOMBOS /13" ; $2380F2
table "creditscharmapbiglo.txt"
MasterSwordKillsLo:
db 2, 55, "MASTER BOMBOS /13" ; $238110
table "creditscharmapbighi.txt"
TemperedSwordKillsHi:
db 2, 55, "TEMPERED BOMBOS /13" ; $23812E
table "creditscharmapbiglo.txt"
TemperedSwordKillsLo:
db 2, 55, "TEMPERED BOMBOS /13" ; $23814C
table "creditscharmapbighi.txt"
GoldSwordKillsHi:
db 2, 55, "GOLD BOMBOS /13" ; $23816A
table "creditscharmapbiglo.txt"
GoldSwordKillsLo:
db 2, 55, "GOLD BOMBOS /13" ; $238188
;===================================================================================================
@@ -362,8 +406,6 @@ CreditsLineBlank:
%blankline()
%emptyline()
%emptyline()
%emptyline()
%emptyline()
@@ -552,10 +594,18 @@ CreditsLineBlank:
%emptyline()
%emptyline()
%emptyline()
%emptyline()
%emptyline()
%emptyline()
%emptyline()
%smallcredits("BOMBOS MOD BY KARAFRUIT", "yellow")
%blankline()
%smallcredits("CREATED FOR SAKURATSUBASA", "green")
%blankline()
%blankline()
%smallcredits("THANKS FOR PLAYING", "red")
%emptyline()
%emptyline()
%emptyline()
@@ -596,19 +646,20 @@ endif
%blankline()
%blankline()
%bigcreditsleft("FIRST SWORD")
%addarbline(FirstSwordStatsHi)
%addarbline(FirstSwordStatsLo)
%blankline()
%bigcreditsleft("PEGASUS BOOTS")
%bigcreditsleft("BOMBOS")
%blankline()
%bigcreditsleft("FLUTE")
%bigcreditsleft("BOMBOS")
%blankline()
%bigcreditsleft("MIRROR")
%bigcreditsleft("BOMBOS")
%blankline()
%blankline()
@@ -619,23 +670,28 @@ endif
%blankline()
%blankline()
%bigcreditsleft("SWORDLESS /13")
%addarbline(SwordlessKillsHi)
%addarbline(SwordlessKillsLo)
%blankline()
%bigcreditsleft("FIGHTER'S SWORD /13")
%addarbline(FighterSwordKillsHi)
%addarbline(FighterSwordKillsLo)
%blankline()
%bigcreditsleft("MASTER SWORD /13")
%addarbline(MasterSwordKillsHi)
%addarbline(MasterSwordKillsLo)
%blankline()
%bigcreditsleft("TEMPERED SWORD /13")
%addarbline(TemperedSwordKillsHi)
%addarbline(TemperedSwordKillsLo)
%blankline()
%bigcreditsleft("GOLD SWORD /13")
%addarbline(GoldSwordKillsHi)
%addarbline(GoldSwordKillsLo)
%blankline()
%blankline()
@@ -653,7 +709,11 @@ endif
%blankline()
%bigcreditsleft("BONKS")
%bigcreditsleft("BONKBOS")
%blankline()
%bigcreditsleft("BOMBOS PLACED")
%blankline()
@@ -665,7 +725,7 @@ endif
%blankline()
%bigcreditsleft("FAERIE REVIVALS")
%bigcreditsleft("BOMBOS REVIVALS")
%blankline()
@@ -676,11 +736,6 @@ endif
%bigcreditsleft("TOTAL LAG TIME")
%blankline()
%blankline()
%blankline()
%blankline()
%blankline()
@@ -695,7 +750,7 @@ endif
%emptyline()
%emptyline()
%bigcreditsleft("COLLECTION RATE /216")
%bigcreditsleft("BOMBOS RATE /216")
%blankline()
@@ -736,16 +791,18 @@ endif
!MAGICUSED_Y = 349
!BONKS_X = 26
!BONKS_Y = 352
!BOMBS_X = 26
!BOMBS_Y = 355
!SAVE_AND_QUITS_X = 26
!SAVE_AND_QUITS_Y = 355
!SAVE_AND_QUITS_Y = 358
!DEATHS_X = 26
!DEATHS_Y = 358
!DEATHS_Y = 361
!FAERIE_REVIVALS_X = 26
!FAERIE_REVIVALS_Y = 361
!FAERIE_REVIVALS_Y = 364
!TOTAL_MENU_TIME_X = 19
!TOTAL_MENU_TIME_Y = 364
!TOTAL_MENU_TIME_Y = 367
!TOTAL_LAG_TIME_X = 19
!TOTAL_LAG_TIME_Y = 367
!TOTAL_LAG_TIME_Y = 370
!COLLECTION_RATE_X = 22
!COLLECTION_RATE_Y = 380
!TOTAL_TIME_X = 19

View File

@@ -12,6 +12,7 @@
%AddStat(DamageCounter, 0, 0, 16, 5, !DAMAGETAKEN_X, !DAMAGETAKEN_Y)
%AddStat(MagicCounter, 0, 0, 16, 5, !MAGICUSED_X, !MAGICUSED_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(DeathCounter, 0, 0, 08, 2, !DEATHS_X, !DEATHS_Y)
%AddStat(FaerieRevivalCounter, 0, 0, 08, 3, !FAERIE_REVIVALS_X, !FAERIE_REVIVALS_Y)

View File

@@ -39,29 +39,40 @@ LoadSwordForDamage:
JSR.w LoadModifiedSwordLevel ; load normal sword value
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"
LookupDamageLevel:
CPX.w #$0918 : BNE +
LDA.l !StalfosBombDamage
RTL
+
PHP
REP #$20 ; set 16-bit accumulator
TXA : LSR : TAX : BCS .lower
.upper
PLP
LDA.l Damage_Table, X
LSR #4
RTL
.lower
PLP
LDA.l Damage_Table, X
AND.b #$0F
RTL
LDA SpecialWeapons : CMP #$01 : BEQ .bomb_table
CMP #$02 : BEQ .pseudo_table
CMP #$03 : BEQ .bomb_table
CMP #$04 : BEQ .bomb_table
CMP #$05 : BEQ .bomb_table
%LookupDamageSubclass(Damage_Table_Bombos) : RTL
.bomb_table
%LookupDamageSubclass(Damage_Table_Bombs) : RTL
.pseudo_table
%LookupDamageSubclass(Damage_Table_Pseudo) : RTL
;================================================================================
; $7F50C0 - Sword Modifier
LoadModifiedSwordLevel: ; returns short
LDA $7F50C0 : BEQ +
LDA SwordModifier : BEQ +
!ADD SwordEquipment ; add normal sword value to modifier
BNE ++ : LDA.b #$01 : RTS : ++
CMP.b #$05 : !BLT ++ : LDA.b #$04 : RTS : ++
@@ -71,11 +82,10 @@ LoadModifiedSwordLevel: ; returns short
RTS
;================================================================================
; ArmorEquipment - Armor Inventory
; $7F50C2 - Armor Modifier
; $7F5020 - Scratch Space (Caller Preserved)
LoadModifiedArmorLevel:
PHA
LDA ArmorEquipment : !ADD $7F50C2
LDA ArmorEquipment : !ADD ArmorModifier
CMP.b #$FF : BNE + : LDA.b #$00 : +
CMP.b #$03 : !BLT + : LDA.b #$02 : +
STA $7F5020
@@ -84,9 +94,8 @@ LoadModifiedArmorLevel:
RTL
;================================================================================
; MagicConsumption - Magic Inventory
; $7F50C3 - Magic Modifier
LoadModifiedMagicLevel:
LDA $7F50C3 : BEQ +
LDA MagicModifier : BEQ +
!ADD MagicConsumption ; add normal magic value to modifier
CMP.b #$FF : BNE ++ : LDA.b #$00 : RTL : ++
CMP.b #$03 : !BLT ++ : LDA.b #$02 : ++
@@ -96,29 +105,38 @@ LoadModifiedMagicLevel:
RTL
;================================================================================
; $7E0348 - Ice Value
; $7F50C7 - Ice Modifier
; ChallengeModes - 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 ChallengeModes : 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 IcePhysicsModifier : ORA #$10 : RTS
++ : LDA.w $0348 : ORA IcePhysicsModifier : RTS
+ : LDA.w $0348
RTS
LoadModifiedIceFloorValue_a11:
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.w $0348 : ORA $7F50C7 : AND.b #$11 : RTL
+ : LDA.w $0348 : AND.b #$11
RTL
JSR LoadModifiedIceFloorValue : AND.b #$11 : RTL
LoadModifiedIceFloorValue_a01:
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.w $0348 : ORA $7F50C7 : AND.b #$01 : RTL
+ : LDA.w $0348 : AND.b #$01
RTL
JSR LoadModifiedIceFloorValue : AND.b #$01 : RTL
;================================================================================
CheckTabletSword:
LDA.l AllowHammerTablets : BEQ +
LDA HammerEquipment : BEQ + ; check for hammer
LDA.b #$02 : RTL
LDA HammerEquipment : BNE .allow ; check for hammer
+
LDA.l SpecialWeapons : CMP #$01 : BEQ .check_special
CMP #$03 : BEQ .check_special
CMP #$04 : BEQ .check_special
CMP #$05 : BEQ .check_special
CMP #$06 : BEQ .allow
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
RTL
;================================================================================
@@ -134,7 +152,17 @@ CheckGanonHammerDamage:
LDA $0E20, X : CMP.b #$D8 ; original behavior except ganon
RTL
+
LDA.l GanonVulnerabilityItem : CMP.b #$0C : BEQ +
LDA $0E20, X : CMP.b #$D6 ; original behavior
RTL
+
LDA $0E20, X : CMP.b #$D8 : BCC +
RTL
+
CMP.b #$D6 : BNE +
RTL
+
CLC
RTL
;================================================================================
GetSmithSword:
@@ -160,7 +188,7 @@ GetSmithSword:
REP #$20 : LDA CurrentRupees : !SUB.w #$000A : STA CurrentRupees : SEP #$20 ; Take 10 rupees
JSL ItemSet_SmithSword
.done
JML.l Smithy_AlreadyGotSword
;================================================================================

View File

@@ -98,7 +98,32 @@ 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
;db #$05 ; #$02 = Tempered Sword (default) - #$05 = All Swords
;--------------------------------------------------------------------------------
; 0x18002B- 0x180030 (Unused)
; 0x18002B- 0x18002C (Unused)
;--------------------------------------------------------------------------------
org $30802D ; PC 0x18003D
ChallengeModes:
; ---- ---i
; i: Permanent Ice Physics
db #$00 ; #$00 = Default behavior;
;--------------------------------------------------------------------------------
org $30802E ; PC 0x18003E
GanonVulnerabilityItem:
db #$00 ; #$00 = Default behavior (silver arrows)
;--------------------------------------------------------------------------------
org $30802F ; PC 0x18003F
SpecialWeapons:
db #$00
; $00 = Off (default)
; $01 = Bomb-Only mode
; $02 = Pseudosword
; $03 = Byrna-Only mode
; $04 = Somaria-Only mode
; $05 = Canes-Only mode
; $06 = Bee mode
;--------------------------------------------------------------------------------
org $308030 ; PC 0x180030
EnableSRAMTrace:
db #$00 ; #$00 = Off (default) - #$01 = On
;--------------------------------------------------------------------------------
org $308031 ; PC 0x180031
EnableEasterEggs:
@@ -211,10 +236,13 @@ db #$00 ; #$00 = Off (default) - #$01 = On (frog/smith can enter multi-entrance
org $30804D ; PC 0x18004D
EscapeAssist: ; ScrubMode:
db #$00
;---- -mba
;m - Infinite Magic
;b - Infinite Bombs
;a - Infinite Arrows
;-MBA -mba
;M - Infinite Magic (after escape)
;B - Infinite Bombs (after escape)
;A - Infinite Arrows (after escape)
;m - Infinite Magic (during escape)
;b - Infinite Bombs (during escape)
;a - Infinite Arrows (during escape)
;--------------------------------------------------------------------------------
org $30804E ; PC 0x18004E
UncleRefill:
@@ -230,7 +258,7 @@ db #$01 ; #$00 = Off - #$01 = On (default)
;--------------------------------------------------------------------------------
org $308050 ; PC 0x180050 - 0x18005C
CrystalPendantFlags_2:
db $00 ; Sewers
db $00 ; Sewers
db $00 ; Hyrule Castle
db $00 ; Eastern Palace
db $00 ; Desert Palace
@@ -238,7 +266,7 @@ CrystalPendantFlags_2:
db $40 ; Swamp Palace
db $40 ; Palace of Darkness
db $40 ; Misery Mire
db $40 ; Skull Woods
db $40 ; Skull Woods
db $40 ; Ice Palace
.hera
db $00 ; Tower of Hera
@@ -370,7 +398,9 @@ org $30808E ; PC 0x18008E
FakeBoots:
db $00 ; #$00 = Off (default) - #$01 = On
;--------------------------------------------------------------------------------
; 0x18008F (unused)
org $30808F ; PC 0x18008F
SeededRNG:
db $01 ; #$00 = Off - #$01 = Seeded RNG (default for rando)
;--------------------------------------------------------------------------------
org $308090 ; PC 0x180090 - 0x180097
ProgressiveSwordLimit:
@@ -630,7 +660,7 @@ dw $6434 ; #6434 - Crystal
;--------------------------------------------------------------------------------
org $02A09B ; PC 0x1209B - Bank02.asm:5802 - (pool MilestoneItem_Flags:)
CrystalPendantFlags:
db $00 ; Sewers
db $00 ; Sewers
db $00 ; Hyrule Castle
db $04 ; Eastern Palace
db $02 ; Desert Palace
@@ -638,7 +668,7 @@ CrystalPendantFlags:
db $10 ; Swamp Palace
db $02 ; Palace of Darkness
db $01 ; Misery Mire
db $40 ; Skull Woods
db $40 ; Skull Woods
db $04 ; Ice Palace
.hera
db $01 ; Tower of Hera
@@ -1385,6 +1415,15 @@ db $04
;AD - Small Key of Ganon's Tower
;AE - Reserved
;AF - Generic Small Key
;B0 - reserved for bee traps
;B1 - reserved for bonk shuffle
;B2 - reserved for bonk shuffle
;B3 - reserved for bonk shuffle
;B4 - reserved for bonk shuffle
;B5 - reserved for bonk shuffle
;B6 - Progressive Bomb
;B7 - Progressive Cane
;================================================================================
;;Residual Portal
;org $0283E0 ; PC 0x103E0 (Bank02.asm:816) (BNE)

View File

@@ -2,7 +2,6 @@
; Challenge Timer
;================================================================================
!Temp = "$7F5020"
!TemporaryOHKO = "$7F50CC"
;--------------------------------------------------------------------------------
!CLOCK_HOURS = "$7F5080" ; $7F5080 - $7F5083 - Clock Hours
!CLOCK_MINUTES = "$7F5084" ; $7F5084 - $7F5087 - Clock Minutes
@@ -121,26 +120,25 @@ dw #$003C, #$0000
.halfCycle
dw #$FFFF, #$7FFF
;--------------------------------------------------------------------------------
!TEMPORARY_OHKO = "$7F50CC"
DrawChallengeTimer:
LDA !TEMPORARY_OHKO : AND.w #$00FF : BEQ +
LDA.w #$2807 : STA $7EC790
LDA TemporaryOHKO : AND.w #$00FF : BEQ +
LDA.w #$2807 : STA $7EC790
LDA.w #$280A : STA $7EC792
LDA.w #$280B : STA $7EC794
LDA.w #$280C : STA $7EC796
RTL
+
LDA.w #$247F : STA $7EC790
LDA.w #$247F : STA $7EC790
STA $7EC792
STA $7EC794
STA $7EC796
++
LDA.l TimerStyle : BNE + : RTL : + ; Hud Timer
LDA.w #$2807 : STA $7EC792
LDA.l !Status : AND.w #$0002 : BEQ + ; DNF / OKHO
LDA.w #$2807 : STA $7EC792
LDA.l !Status : AND.w #$0002 : BEQ + ; DNF / OKHO
LDA.l TimeoutBehavior : AND.w #$00FF : BNE ++ ; DNF
LDA.w #$2808 : STA $7EC794
LDA.w #$2809 : STA $7EC796
@@ -161,13 +159,13 @@ DrawChallengeTimer:
LDA.l TimerRestart : BNE +++ : RTL : +++
BRA ++
+ ; Show Timer
LDA.l !Status : AND.w #$0001 : !ADD.w #$2804 : STA $7EC794
LDA.l !Status : AND.w #$0001 : !ADD.w #$2804 : STA $7EC794
LDA !CLOCK_HOURS+2 : STA $7EC796
LDA !CLOCK_HOURS : STA $7EC798
LDA.w #$2806 : STA $7EC79A
LDA.w #$2806 : STA $7EC79A
LDA !CLOCK_MINUTES+2 : STA $7EC79C
LDA !CLOCK_MINUTES : STA $7EC79E
LDA.w #$2806 : STA $7EC7A0
LDA.w #$2806 : STA $7EC7A0
LDA !CLOCK_SECONDS+2 : STA $7EC7A2
LDA !CLOCK_SECONDS : STA $7EC7A4
++
@@ -176,7 +174,7 @@ DrawChallengeTimer:
RTL
;--------------------------------------------------------------------------------
OHKOTimer:
LDA !TemporaryOHKO : BNE .kill
LDA TemporaryOHKO : BNE .kill
LDA.l TimeoutBehavior : CMP #$02 : BNE +
LDA !Status : AND.b #$02 : BEQ +
.kill

View File

@@ -97,19 +97,19 @@ RTL
;DATA - Loot Identifier to Sprite ID
{
.gfxSlots
db $06, $44, $45, $46, $2D, $20, $2E, $09
db $09, $0A, $08, $05, $10, $0B, $2C, $1B
db $06, $44, $45, $46, $2D, $20, $2E, $09
db $09, $0A, $08, $05, $10, $0B, $2C, $1B
db $1A, $1C, $14, $19, $0C, $07, $1D, $2F
db $07, $15, $12, $0D, $0D, $0E, $11, $17
db $1A, $1C, $14, $19, $0C, $07, $1D, $2F
db $07, $15, $12, $0D, $0D, $0E, $11, $17
db $28, $27, $04, $04, $0F, $16, $03, $13
db $01, $1E, $10, $00, $00, $00, $00, $00
db $28, $27, $04, $04, $0F, $16, $03, $13
db $01, $1E, $10, $00, $00, $00, $00, $00
db $00, $30, $22, $21, $24, $24, $24, $23
db $23, $23, $29, $2A, $2C, $2B, $03, $03
db $00, $30, $22, $21, $24, $24, $24, $23
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, $06, $0C, $38, $FF, $FF, $FF, $FF
@@ -143,7 +143,12 @@ RTL
;Ax
db $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F ; Free Small Key
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused
;Bx
db $49 ; reserved for bee traps
db $13, $13, $13, $13, $13 ; reserved for bonk shuffle
db $13 ; Bomb Upgrade
db $07 ; Cane Upgrade
db $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
@@ -177,7 +182,7 @@ GetSpritePalette:
;--------
TAX : LDA.l .gfxPalettes, X ; look up item gfx
PLB : PLX
CMP.b #$F8 : !BGE .specialHandling
CMP.b #$F6 : !BGE .specialHandling
RTL
.specialHandling
CMP.b #$FD : BNE ++ ; Progressive Sword
@@ -227,6 +232,16 @@ RTL
LDA.b #$08 : RTL
+ ; Any Bow
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)
JSL.l GetRNGItemSingle : JMP GetSpritePalette
++ : CMP.b #$FB : BNE ++ ; RNG Item (Multi)
@@ -272,7 +287,11 @@ RTL
;db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; *EVENT*
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Free Big Key
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Free Small Key
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused
db $08 ; reserved for bee traps
db $08, $08, $08, $08, $08 ; reserved for bonk shuffle
db $F7 ; Bomb Upgrade
db $0A ; Cane Upgrade
db $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
@@ -328,19 +347,19 @@ IsNarrowSprite:
++ CMP.b #$63 : BNE ++ ; RNG Item (Multi)
JSL.l GetRNGItemMulti
++ CMP.b #$64 : BEQ + ; Progressive Bow
CMP.b #$65 : BNE .continue ; Progressive Bow (alt)
+ : LDA BowEquipment : INC : LSR
CMP.l ProgressiveBowLimit : !BLT +
CMP.b #$65 : BNE .continue ; Progressive Bow (alt)
+ : LDA BowEquipment : INC : LSR
CMP.l ProgressiveBowLimit : !BLT +
LDA.l ProgressiveBowReplacement
JSL.l IsNarrowSprite
JMP .done
JMP .done
.continue
;--------
LDX.b #$00 ; set index counter to 0
;----
-
CPX.b #$24 : !BGE .false ; finish if we've done the whole list
CPX.b #$2A : !BGE .false ; finish if we've done the whole list
CMP.l .smallSprites, X : BNE + ; skip to next if we don't match
;--
SEC ; set true state
@@ -363,7 +382,8 @@ RTL
db $15, $18, $24, $2A, $34, $35, $36, $42
db $43, $45, $59, $A0, $A1, $A2, $A3, $A4
db $A5, $A6, $A7, $A8, $A9, $AA, $AB, $AC
db $AD, $AE, $AF, $FF, $FF, $FF, $FF, $FF
db $AD, $AE, $AF, $B7, $FF, $FF, $FF, $FF
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
}
;--------------------------------------------------------------------------------
@@ -490,12 +510,12 @@ LoadModifiedTileBufferAddress:
PHA
LDA !TILE_UPLOAD_OFFSET_OVERRIDE : BEQ +
TAX
LDY.w #$0002
LDY.w #$0002
LDA.w #$0000 : STA !TILE_UPLOAD_OFFSET_OVERRIDE
BRA .done
+
LDX.w #$2D40
LDY.w #$0002
LDX.w #$2D40
LDY.w #$0002
.done
PLA
RTL
@@ -507,7 +527,7 @@ RTL
; out: Carry - 1 = On Screen, 0 = Off Screen
;--------------------------------------------------------------------------------
Sprite_IsOnscreen:
JSR _Sprite_IsOnscreen_DoWork
JSR _Sprite_IsOnscreen_DoWork
BCS +
REP #$20
LDA $E2 : PHA : !SUB.w #$0F : STA $E2
@@ -522,11 +542,11 @@ Sprite_IsOnscreen:
RTL
_Sprite_IsOnscreen_DoWork:
LDA $0D10, X : CMP $E2
LDA $0D30, X : SBC $E3 : BNE .offscreen
LDA $0D10, X : CMP $E2
LDA $0D30, X : SBC $E3 : BNE .offscreen
LDA $0D00, X : CMP $E8
LDA $0D20, X : SBC $E9 : BNE .offscreen
LDA $0D00, X : CMP $E8
LDA $0D20, X : SBC $E9 : BNE .offscreen
SEC
RTS
.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 BowEquipment : 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 : 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 : 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
;--------------------------------------------------------------------------------
EndRainState:
LDA.l InitProgressIndicator : BIT.b #$80 : BNE + ; check for instant post-aga
LDA.b #$02 : STA.l ProgressIndicator
RTL
LDA.l InitProgressIndicator : BIT.b #$80 : BNE + ; check for instant post-aga
LDA.b #$02 : STA.l ProgressIndicator
RTL
+
LDA.b #$03 : STA.l ProgressIndicator
LDA.l InitLumberjackOW : STA.l OverworldEventDataWRAM+$02
LDA.b #$03 : STA.l ProgressIndicator
LDA.l InitLumberjackOW : STA.l OverworldEventDataWRAM+$02
RTL
;--------------------------------------------------------------------------------