diff --git a/cuccostorm.asm b/cuccostorm.asm index f21ec1c..b301748 100644 --- a/cuccostorm.asm +++ b/cuccostorm.asm @@ -1,74 +1,75 @@ ;================================================================================ -StartCuccoStorm: - ;STA $FFFFFF - PHA : PHX : PHY : PHP - SEP #$30 ; set 8-bit accumulator & index registers - LDA $1B : BNE .done ; skip if indoors +!CUCCO_STORM = "$7F50C5" +!IS_INDOORS = "$7E001B" +!ENEMY_STATE_TABLE = "$7E0DD0" +!ENEMY_TYPE_TABLE = "$7E0E20" +!ENEMY_AUX1_TABLE = "$7E0DA0" +!ENEMY_AUX2_TABLE = "$7E0DB0" +!ENEMY_DIRECTION_TABLE = "$7E0EB0" +!CUCCO = "#$0B" +!INERT = "#$00" +!INIT = "#$08" +!ALIVE = "#$09" +!CUCCO_ENRAGED = "#$23" +!LINK_POS_Y_LOW = "$20" +!LINK_POS_Y_HIGH = "$21" +!LINK_POS_X_LOW = "$22" +!LINK_POS_X_HIGH = "$23" +!ENEMY_POS_Y_LOW = "$7E0D00" +!ENEMY_POS_X_LOW = "$7E0D10" +!ENEMY_POS_Y_HIGH = "$7E0D20" +!ENEMY_POS_X_HIGH = "$7E0D30" +CuccoStorm: + + SEP #$30 ; set 8-bit accumulator index registers + LDA.l !CUCCO_STORM : BEQ + ; only if storm is on + LDA.b $10 : CMP.b #$09 : BNE + ; only if outdoors + LDA.l !LOOP_FRAMES_LOW : AND.b #$7F : BNE + ; check every 128 frames + + - + ;==== Find a Cucco - LDY.b #$0A - LDA.b #$0B : JSL Sprite_SpawnDynamically_arbitrary : BMI .done ; spawn a chicken - JSL Sprite_SetSpawnedCoords - LDA.b #$24 : STA $0DA0, Y ; turn it into an attack chicken - LDA.b #$01 : STA $0DB0, Y + LDY.b #$FF : PHY ; push "cucco not found" + + LDX.b #$00 : -- : CPX.b #$10 : !BGE .ldone + LDA.w !ENEMY_STATE_TABLE, X : CMP.b !ALIVE : BEQ +++ + ; enemy not found + CMP.b !INERT : BNE ++ + ; log inert enemy slot + PLA : PHX + BRA ++ + +++ + ; found an enemy + LDA.l !ENEMY_TYPE_TABLE, X : CMP.b !CUCCO : BNE ++ + ; it's a cucco + TXY ; record where we found the living cucco in case we don't find any angry ones + LDA.w !ENEMY_AUX1_TABLE, X : CMP.b !CUCCO_ENRAGED : !BLT ++ + PLA : BRA + ; we found an angry cucco, done + ++ : INX : BRA -- : .ldone - .done - PLP : PLY : PLX : PLA -RTL -;================================================================================ -SpawnAngryCucco: - TXA : EOR $1A : AND.b #$0F : ORA $1B : BNE .spawn_delay - - LDA.b #$0B - LDY.b #$0A - - JSL Sprite_SpawnDynamically_arbitrary : BMI .spawn_failed - - PHX - - TYX - - LDA.b #$1E : JSL Sound_SetSfx3PanLong - - PLX - - LDA.b #$01 : STA $0DB0, Y - - PHX - - JSL GetRandomInt : STA $0F : AND.b #$02 : BEQ .vertical_entry_point - - LDA $0F : ADC $E2 : STA $0D10, Y - LDA $E3 : ADC.b #$00 : STA $0D30, Y - - LDA $0F : AND.b #$01 : TAX - - LDA $9F3C, X : ADC $E8 : STA $0D00, Y - LDA $E9 : ADC.b #$00 : STA $0D20, Y - - BRA .set_velocity - -.vertical_entry_point - - LDA $0F : ADC $E8 : STA $0D00, Y - LDA $E9 : ADC.b #$00 : STA $0D20, Y - - LDA $0F : AND.b #$01 : TAX - - LDA $9F3C, X : ADC $E2 : STA $0D10, Y - LDA $E3 : ADC.b #$00 : STA $0D30, Y - -.set_velocity - - TYX - - LDA.b #$20 : JSL Sprite_ApplySpeedTowardsPlayerLong - - PLX - - LDA.b #$30 : JSL Sound_SetSfx2PanLong - -.spawn_failed -.spawn_delay - + ;==== Create a Cucco + + CPY.b #$FF : BNE ++ + ; we didn't find a cucco, so try to create one + PLY + CPY.b #$FF : BEQ + ; fail if no slots found + LDA.b !CUCCO : STA.w !ENEMY_TYPE_TABLE, Y + LDA.b !INIT : STA.w !ENEMY_STATE_TABLE, Y + LDA.b !LINK_POS_Y_LOW : STA.w !ENEMY_POS_Y_LOW, Y + LDA.b !LINK_POS_Y_HIGH : STA.w !ENEMY_POS_Y_HIGH, Y + LDA.b !LINK_POS_X_LOW : STA.w !ENEMY_POS_X_LOW, Y + LDA.b !LINK_POS_X_HIGH : STA.w !ENEMY_POS_X_HIGH, Y + BRA +++ + ++ + PLA + +++ + + ;==== Enrage a Cucco + + LDA.b !CUCCO_ENRAGED : STA.w !ENEMY_AUX1_TABLE, Y ; enrage the cucco + LDA.b #$00 : STA.w !ENEMY_AUX2_TABLE, Y : STA.w !ENEMY_DIRECTION_TABLE, Y + + ;==== + + RTL ;================================================================================ \ No newline at end of file diff --git a/entrances.asm b/entrances.asm index a76ae17..2b2f171 100644 --- a/entrances.asm +++ b/entrances.asm @@ -4,7 +4,9 @@ ;-------------------------------------------------------------------------------- LockAgahnimDoors: LDA.l AgahnimDoorStyle : AND.w #$00FF - BEQ .exit ; don't need to load 0, because we'd have it if we reached here + BNE + + ;#$0 = Never Locked + LDA.w #$0000 : RTL + : CMP.w #$0001 : BNE + LDA $7EF3C5 : AND.w #$000F : CMP.w #$0002 : !BGE .unlock ; if we rescued zelda, skip JSR.w LockAgahnimDoorsCore : RTL @@ -35,7 +37,7 @@ LockAgahnimDoors: .unlock LDA.w #$0000 ; fallback to never locked -.exit + RTL ;-------------------------------------------------------------------------------- LockAgahnimDoorsCore: @@ -202,14 +204,14 @@ RTL AnimatedEntranceFix: ;when an entrance animation tries to start PHA LDA.l InvertedMode : BEQ + ;If we are in inverted mode - PLA - BIT $8A : BVS ++ ; and in the light world + LDA $8A : AND.b #$40 : BNE + ;and in the light world + PLA STZ $04C6 ; skip it. LDA #$00 RTL + PLA -++ STA $02E4 ;what we wrote over + STA $02E4 ;what we wrote over STA $0FC1 ;what we wrote over STA $0710 ;what we wrote over RTL diff --git a/events.asm b/events.asm index e630da7..5f5bb8d 100644 --- a/events.asm +++ b/events.asm @@ -18,6 +18,7 @@ OnDrawHud: JSL.l DrHudOverride JSL.l NewDrawHud JSL.l SwapSpriteIfNecissary + JSL.l CuccoStorm JSL.l PollService JML.l ReturnFromOnDrawHud ;-------------------------------------------------------------------------------- diff --git a/inventory.asm b/inventory.asm index 48a6109..d872e1d 100644 --- a/inventory.asm +++ b/inventory.asm @@ -757,8 +757,8 @@ RTS ;-------------------------------------------------------------------------------- Link_ReceiveItem_HUDRefresh: LDA $7EF343 : BNE + ; skip if we have bombs - LDA $7EF375 : BEQ + ; skip if we are filling no bombs LDA $7EF370 : !ADD.l StartingMaxBombs : BEQ + ; skip if we can't have bombs + LDA $7EF375 : BEQ + ; skip if we are filling no bombs DEC : STA $7EF375 ; decrease bomb fill count LDA.b #$01 : STA $7EF343 ; increase actual bomb count + diff --git a/pendantcrystalhud.asm b/pendantcrystalhud.asm index ceaaacd..256b395 100644 --- a/pendantcrystalhud.asm +++ b/pendantcrystalhud.asm @@ -271,10 +271,10 @@ DrawHUDDungeonItems: .dungeon_positions dw 0 ; Hyrule Castle - dw 2 ; Agahnims Tower dw 6 ; Eastern dw 8 ; Desert dw 10 ; Hera + dw 2 ; Agahnims Tower dw 14 ; PoD dw 16 ; Swamp dw 18 ; Skull Woods @@ -286,10 +286,10 @@ DrawHUDDungeonItems: .small_key_x_offset dw $7EF37D-$7EF37D ; Hyrule Castle - dw $7EF380-$7EF37D ; Agahnims Tower dw $7EF37E-$7EF37D ; Eastern dw $7EF37F-$7EF37D ; Desert dw $7EF386-$7EF37D ; Hera + dw $7EF380-$7EF37D ; Agahnims Tower dw $7EF382-$7EF37D ; PoD dw $7EF381-$7EF37D ; Swamp dw $7EF384-$7EF37D ; Skull Woods @@ -302,10 +302,10 @@ DrawHUDDungeonItems: .dungeon_bitmasks dw $4000 ; Hyrule Castle - dw $0800 ; Agahnims Tower dw $2000 ; Eastern dw $1000 ; Desert dw $0020 ; Hera + dw $0800 ; Agahnims Tower dw $0200 ; PoD dw $0400 ; Swamp dw $0080 ; Skull Woods @@ -317,10 +317,10 @@ DrawHUDDungeonItems: .boss_room_ids dw $80*2 ; ; Hyrule Castle (BNC) - dw $20*2 ; ; Agahnim dw $C8*2 ; ; Eastern dw $33*2 ; ; Desert dw $07*2 ; ; Hera + dw $20*2 ; ; Agahnim dw $5A*2 ; ; PoD dw $06*2 ; ; Swamp dw $29*2 ; ; Skull Woods @@ -362,7 +362,7 @@ DrawHUDDungeonItems: -- STA.w $1686,X STA.w $16C6,X STA.w $1706,X - + DEX : DEX : BPL -- @@ -445,7 +445,7 @@ DrawHUDDungeonItems: LDA.w #$2826 LDX.w .dungeon_positions,Y - STA.w $1706,Y + STA.w $1706,X ..skip_boss_kill INY : INY diff --git a/tables.asm b/tables.asm index 51f9cae..42f6a4a 100644 --- a/tables.asm +++ b/tables.asm @@ -1507,7 +1507,7 @@ dw #9999 ; Rupee Limit ; $7F50C2 - Armor Modifier ; $7F50C3 - Magic Modifier ; $7F50C4 - Light Cone Modifier -; $7F50C5 - Unused +; $7F50C5 - Cucco Storm ; $7F50C6 - Old Man Dash Modifier ; $7F50C7 - Ice Physics Modifier ; $7F50C8 - Infinite Arrows Modifier