Archipelago/worlds/ladx/LADXR/patches/bank3e.asm/bowwow.asm

304 lines
6.6 KiB
NASM

CheckIfLoadBowWow:
; Check has bowwow flag
ld a, [$DB56]
cp $01
jr nz, .noLoadBowwow
ldh a, [$F6] ; load map number
cp $22
jr z, .loadBowwow
cp $23
jr z, .loadBowwow
cp $24
jr z, .loadBowwow
cp $32
jr z, .loadBowwow
cp $33
jr z, .loadBowwow
cp $34
jr z, .loadBowwow
.noLoadBowwow:
ld e, $00
ret
.loadBowwow:
ld e, $01
ret
; Special handler for when Bowwow tries to eat an entity.
; Our target entity index is loaded in BC.
BowwowEat:
; Load the entity type into A
ld hl, $C3A0 ; entity type
add hl, bc
ld a, [hl]
; Check if we need special handling for bosses
cp $59 ; Moldorm
jr z, BowwowHurtEnemy
cp $5C ; Genie
jr z, BowwowEatGenie
cp $5B ; SlimeEye
jp z, BowwowEatSlimeEye
cp $65 ; AnglerFish
jr z, BowwowHurtEnemy
cp $5D ; SlimeEel
jp z, BowwowEatSlimeEel
cp $5A ; Facade
jr z, BowwowHurtEnemy
cp $63 ; Eagle
jr z, BowwowHurtEnemy
cp $62 ; Hot head
jp z, BowwowEatHotHead
cp $F9 ; Hardhit beetle
jr z, BowwowHurtEnemy
cp $E6 ; Nightmare (all forms)
jp z, BowwowEatNightmare
; Check for special handling for minibosses
cp $87 ; Lanmola
jr z, BowwowHurtEnemy
; cp $88 ; Armos knight
; No special handling, just eat him, solves the fight real quick.
cp $81 ; rolling bones
jr z, BowwowHurtEnemy
cp $89 ; Hinox
jr z, BowwowHurtEnemy
cp $8E ; Cue ball
jr z, BowwowHurtEnemy
;cp $5E ; Gnoma
;jr z, BowwowHurtEnemy
cp $5F ; Master stalfos
jr z, BowwowHurtEnemy
cp $92 ; Smasher
jp z, BowwowEatSmasher
cp $BC ; Grim Creeper
jp z, BowwowEatGrimCreeper
cp $BE ; Blaino
jr z, BowwowHurtEnemy
cp $F8 ; Giant buzz blob
jr z, BowwowHurtEnemy
cp $F4 ; Avalaunch
jr z, BowwowHurtEnemy
; Some enemies
cp $E9 ; Color dungeon shell
jr z, BowwowHurtEnemy
cp $EA ; Color dungeon shell
jr z, BowwowHurtEnemy
cp $EB ; Color dungeon shell
jr z, BowwowHurtEnemy
; Play SFX
ld a, $03
ldh [$F2], a
; Call normal "destroy entity and drop item" handler
jp $3F50
BowwowHurtEnemy:
; Hurt enemy with damage type zero (sword)
ld a, $00
ld [$C19E], a
rst $18
; Play SFX
ld a, $03
ldh [$F2], a
ret
BowwowEatGenie:
; Get private state to find out if this is a bottle or the genie
ld hl, $C2B0
add hl, bc
ld a, [hl]
; Prepare loading state from hl
ld hl, $C290
add hl, bc
cp $00
jr z, .bottle
cp $01
jr z, .ghost
ret
.ghost:
; Get current state
ld a, [hl]
cp $04 ; Flying around without bottle
jr z, BowwowHurtEnemy
ret
.bottle:
; Get current state
ld a, [hl]
cp $03 ; Hopping around in bottle
jr z, BowwowHurtEnemy
ret
BowwowEatSlimeEye:
; On set privateCountdown2 to $0C to split, when privateState1 is $04 and state is $03
ld hl, $C290 ; state
add hl, bc
ld a, [hl]
cp $03
jr nz, .skipSplit
ld hl, $C2B0 ; private state1
add hl, bc
ld a, [hl]
cp $04
jr nz, .skipSplit
ld hl, $C300 ; private countdown 2
add hl, bc
ld [hl], $0C
.skipSplit:
jp BowwowHurtEnemy
BowwowEatSlimeEel:
; Get private state to find out if this is the tail or the head
ld hl, $C2B0
add hl, bc
ld a, [hl]
cp $01 ; not the head, so, skip.
ret nz
; Check if we are pulled out of the wall
ld hl, $C290
add hl, bc
ld a, [hl]
cp $03 ; pulled out of the wall
jr nz, .knockOutOfWall
ld hl, $D204
ld a, [hl]
cp $07
jr nc, .noExtraDamage
inc [hl]
.noExtraDamage:
jp BowwowHurtEnemy
.knockOutOfWall:
ld [hl], $03 ; set state to $03
ld hl, $C210 ; Y position
add hl, bc
ld a, [hl]
ld [hl], $60
cp $48
jp nc, BowwowHurtEnemy
ld [hl], $30
jp BowwowHurtEnemy
BowwowEatHotHead:
; Load health of hothead
ld hl, $C360
add hl, bc
ld a, [hl]
cp $20
jr c, .lowHp
ld [hl], $20
.lowHp:
jp BowwowHurtEnemy
BowwowEatSmasher:
; Check if this is the ball or the monster
ld hl, $C440
add hl, bc
ld a, [hl]
and a
ret nz
jp BowwowHurtEnemy
BowwowEatGrimCreeper:
; Check if this is the main enemy or the smaller ones. Only kill the small ones
ld hl, $C2B0
add hl, bc
ld a, [hl]
and a
ret z
jp BowwowHurtEnemy
BowwowEatNightmare:
; Check if this is the staircase.
ld hl, $C390
add hl, bc
ld a, [hl]
cp $02
ret z
; Prepare loading state from hl
ld hl, $C290
add hl, bc
ld a, [$D219] ; which form has the nightmare
cp $01
jr z, .slimeForm
cp $02
jr z, .agahnimForm
cp $03 ; moldormForm
jp z, BowwowHurtEnemy
cp $04 ; ganon and lanmola
jp z, BowwowHurtEnemy
cp $05 ; dethl
jp z, BowwowHurtEnemy
; 0 is the intro form
ret
.slimeForm:
ld a, [hl]
cp $02
jr z, .canHurtSlime
cp $03
ret nz
.canHurtSlime:
; We need quite some custom handling, normally the nightmare checks very directly if you use powder.
; No idea why this insta kills the slime form...
; Change state to hurt state
ld [hl], $07
; Set flash count
ld hl, $C420
add hl, bc
ld [hl], $14
; play proper sfx
ld a, $07
ldh [$F3], a
ld a, $37
ldh [$F2], a
; No idea why this is done, but it happens when you use powder on the slime
ld a, $03
ld [$D220], a
ret
.agahnimForm:
ld a, [hl]
; only damage in states 2 to 4
cp $02
ret c
cp $04
ret nc
; Decrease health
ld a, [$D220]
inc a
ld [$D220], a
; If dead, do stuff
cp $04
jr c, .agahnimNotDeadYet
ld [hl], $07
ld hl, $C2E0
add hl, bc
ld [hl], $C0
ld a, $36
ldh [$F2], a
.agahnimNotDeadYet:
ld hl, $C420
add hl, bc
ld [hl], $14
ld a, $07
ldh [$F3], a
ret