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
							 |