304 lines
6.6 KiB
NASM
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
|