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 |