356 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
		
		
			
		
	
	
			356 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
|   | ; Handle the multiworld link | ||
|  | 
 | ||
|  | MainLoop: | ||
|  | #IF HARDWARE_LINK | ||
|  |     call handleSerialLink | ||
|  | #ENDIF | ||
|  |     ; Check if the gameplay is world | ||
|  |     ld   a, [$DB95] | ||
|  |     cp   $0B | ||
|  |     ret  nz | ||
|  |     ; Check if the world subtype is the normal one | ||
|  |     ld   a, [$DB96] | ||
|  |     cp   $07 | ||
|  |     ret  nz | ||
|  |     ; Check if we are moving between rooms | ||
|  |     ld   a, [$C124] | ||
|  |     and  a | ||
|  |     ret  nz | ||
|  |     ; Check if link is in a normal walking/swimming state | ||
|  |     ld   a, [$C11C] | ||
|  |     cp   $02 | ||
|  |     ret  nc | ||
|  |     ; Check if a dialog is open | ||
|  |     ld   a, [$C19F] | ||
|  |     and  a | ||
|  |     ret  nz | ||
|  |     ; Check if interaction is blocked | ||
|  |     ldh  a, [$A1] | ||
|  |     and  a | ||
|  |     ret  nz | ||
|  | 
 | ||
|  |     ld   a, [wLinkSpawnDelay] | ||
|  |     and  a | ||
|  |     jr   z, .allowSpawn | ||
|  |     dec  a | ||
|  |     ld   [wLinkSpawnDelay], a | ||
|  |     jr   .noSpawn | ||
|  | 
 | ||
|  | .allowSpawn: | ||
|  |     ld   a, [wZolSpawnCount] | ||
|  |     and  a | ||
|  |     call nz, LinkSpawnSlime | ||
|  |     ld   a, [wCuccoSpawnCount] | ||
|  |     and  a | ||
|  |     call nz, LinkSpawnCucco | ||
|  |     ld   a, [wDropBombSpawnCount] | ||
|  |     and  a | ||
|  |     call nz, LinkSpawnBomb | ||
|  | .noSpawn: | ||
|  | 
 | ||
|  |     ; Have an item to give? | ||
|  |     ld   hl, wLinkStatusBits | ||
|  |     bit  0, [hl] | ||
|  |     ret  z | ||
|  | 
 | ||
|  |     ; Give an item to the player | ||
|  |     ld   a, [wLinkGiveItem] | ||
|  |     ; if zol: | ||
|  |     cp   $22 ; zol item | ||
|  |     jr   z, LinkGiveSlime | ||
|  |     ; if special item | ||
|  |     cp   $F0 | ||
|  |     jr   nc, HandleSpecialItem | ||
|  |     ; tmpChestItem = a | ||
|  |     ldh  [$F1], a | ||
|  |     ; Give the item | ||
|  |     call GiveItemFromChest | ||
|  |     ; Paste the item text | ||
|  |     call BuildItemMessage | ||
|  |     ; Paste " from " | ||
|  |     ld hl, SpaceFrom | ||
|  |     call MessageCopyString | ||
|  |     ; Paste the player name | ||
|  |     ld  a, [wLinkGiveItemFrom] | ||
|  |     call MessageAddPlayerName | ||
|  |     ld   a, $C9 | ||
|  |     ; hl = $wLinkStatusBits | ||
|  |     ld   hl, wLinkStatusBits | ||
|  |     ; clear the 0 bit of *hl | ||
|  |     res  0, [hl] | ||
|  |     ; OpenDialog() | ||
|  |     jp   $2385 ; Opendialog in $000-$0FF range | ||
|  | 
 | ||
|  | LinkGiveSlime: | ||
|  |     ld   a, $05 | ||
|  |     ld   [wZolSpawnCount], a | ||
|  |     ld   hl, wLinkStatusBits | ||
|  |     res  0, [hl] | ||
|  |     ret | ||
|  | 
 | ||
|  | HandleSpecialItem: | ||
|  |     ld   hl, wLinkStatusBits | ||
|  |     res  0, [hl] | ||
|  | 
 | ||
|  |     and  $0F | ||
|  |     rst  0 | ||
|  |     dw SpecialSlimeStorm | ||
|  |     dw SpecialCuccoParty | ||
|  |     dw SpecialPieceOfPower | ||
|  |     dw SpecialHealth | ||
|  |     dw SpecialRandomTeleport | ||
|  |     dw .ret | ||
|  |     dw .ret | ||
|  |     dw .ret | ||
|  |     dw .ret | ||
|  |     dw .ret | ||
|  |     dw .ret | ||
|  |     dw .ret | ||
|  |     dw .ret | ||
|  |     dw .ret | ||
|  |     dw .ret | ||
|  |     dw .ret | ||
|  | .ret: | ||
|  |     ret | ||
|  | 
 | ||
|  | SpecialSlimeStorm: | ||
|  |     ld   a, $20 | ||
|  |     ld   [wZolSpawnCount], a | ||
|  |     ret | ||
|  | SpecialCuccoParty: | ||
|  |     ld   a, $20 | ||
|  |     ld   [wCuccoSpawnCount], a | ||
|  |     ret | ||
|  | SpecialPieceOfPower: | ||
|  |     ; Give the piece of power and the music | ||
|  |     ld   a, $01 | ||
|  |     ld   [$D47C], a | ||
|  |     ld   a, $27 | ||
|  |     ld   [$D368], a | ||
|  |     ld   a, $49 | ||
|  |     ldh  [$BD], a | ||
|  |     ldh  [$BF], a | ||
|  |     ret | ||
|  | SpecialHealth: | ||
|  |     ; Regen all health | ||
|  |     ld   hl, $DB93 | ||
|  |     ld   [hl], $FF | ||
|  |     ret | ||
|  | 
 | ||
|  | LinkSpawnSlime: | ||
|  |     ld   a, $1B | ||
|  |     ld   e, $08 | ||
|  |     call $3B98 ; SpawnNewEntity in range | ||
|  |     ret  c | ||
|  | 
 | ||
|  |     ; Place somewhere random | ||
|  |     call placeRandom | ||
|  | 
 | ||
|  |     ld   hl, $C310 | ||
|  |     add  hl, de | ||
|  |     ld   [hl], $7F | ||
|  | 
 | ||
|  |     ld   hl, wZolSpawnCount | ||
|  |     dec  [hl] | ||
|  | 
 | ||
|  |     call $280D | ||
|  |     and  $03 | ||
|  |     ld   [wLinkSpawnDelay], a | ||
|  |     ret | ||
|  | 
 | ||
|  | LinkSpawnCucco: | ||
|  |     ld   a, $6C | ||
|  |     ld   e, $04 | ||
|  |     call $3B98 ; SpawnNewEntity in range | ||
|  |     ret  c | ||
|  | 
 | ||
|  |     ; Place where link is at. | ||
|  |     ld   hl, $C200 | ||
|  |     add  hl, de | ||
|  |     ldh  a, [$98] | ||
|  |     ld   [hl], a | ||
|  |     ld   hl, $C210 | ||
|  |     add  hl, de | ||
|  |     ldh  a, [$99] | ||
|  |     ld   [hl], a | ||
|  | 
 | ||
|  |     ; Set the "hits till cucco killer attack" much lower | ||
|  |     ld   hl, $C2B0 | ||
|  |     add  hl, de | ||
|  |     ld   a, $21 | ||
|  |     ld   [hl], a | ||
|  | 
 | ||
|  |     ld   hl, wCuccoSpawnCount | ||
|  |     dec  [hl] | ||
|  | 
 | ||
|  |     call $280D | ||
|  |     and  $07 | ||
|  |     ld   [wLinkSpawnDelay], a | ||
|  |     ret | ||
|  | 
 | ||
|  | LinkSpawnBomb: | ||
|  |     ld   a, $02 | ||
|  |     ld   e, $08 | ||
|  |     call $3B98 ; SpawnNewEntity in range | ||
|  |     ret  c | ||
|  | 
 | ||
|  |     call placeRandom | ||
|  | 
 | ||
|  |     ld   hl, $C310 ; z pos | ||
|  |     add  hl, de | ||
|  |     ld   [hl], $4F | ||
|  | 
 | ||
|  |     ld   hl, $C430 ; wEntitiesOptions1Table | ||
|  |     add  hl, de | ||
|  |     res  0, [hl] | ||
|  |     ld   hl, $C2E0 ; wEntitiesTransitionCountdownTable | ||
|  |     add  hl, de | ||
|  |     ld   [hl], $80 | ||
|  |     ld   hl, $C440 ; wEntitiesPrivateState4Table | ||
|  |     add  hl, de | ||
|  |     ld   [hl], $01 | ||
|  | 
 | ||
|  |     ld   hl, wDropBombSpawnCount | ||
|  |     dec  [hl] | ||
|  | 
 | ||
|  |     call $280D | ||
|  |     and  $1F | ||
|  |     ld   [wLinkSpawnDelay], a | ||
|  |     ret | ||
|  | 
 | ||
|  | placeRandom: | ||
|  |     ; Place somewhere random | ||
|  |     ld   hl, $C200 | ||
|  |     add  hl, de | ||
|  |     call $280D ; random number | ||
|  |     and  $7F | ||
|  |     add  a, $08 | ||
|  |     ld   [hl], a | ||
|  |     ld   hl, $C210 | ||
|  |     add  hl, de | ||
|  |     call $280D ; random number | ||
|  |     and  $3F | ||
|  |     add  a, $20 | ||
|  |     ld   [hl], a | ||
|  |     ret | ||
|  | 
 | ||
|  | SpecialRandomTeleport: | ||
|  |     xor  a | ||
|  |     ; Warp data | ||
|  |     ld   [$D401], a | ||
|  |     ld   [$D402], a | ||
|  |     call $280D ; random number | ||
|  |     ld   [$D403], a | ||
|  |     ld   hl, RandomTeleportPositions | ||
|  |     ld   d, $00 | ||
|  |     ld   e, a | ||
|  |     add  hl, de | ||
|  |     ld   e, [hl] | ||
|  |     ld   a, e | ||
|  |     and  $0F | ||
|  |     swap a | ||
|  |     add  a, $08 | ||
|  |     ld   [$D404], a | ||
|  |     ld   a, e | ||
|  |     and  $F0 | ||
|  |     add  a, $10 | ||
|  |     ld   [$D405], a | ||
|  | 
 | ||
|  |     ldh  a, [$98] | ||
|  |     swap a | ||
|  |     and  $0F | ||
|  |     ld   e, a | ||
|  |     ldh  a, [$99] | ||
|  |     sub  $08 | ||
|  |     and  $F0 | ||
|  |     or   e | ||
|  |     ld   [$D416], a ; wWarp0PositionTileIndex | ||
|  | 
 | ||
|  |     call $0C7D | ||
|  |     ld   a, $07 | ||
|  |     ld   [$DB96], a ; wGameplaySubtype | ||
|  | 
 | ||
|  |     ret | ||
|  | 
 | ||
|  | Data_004_7AE5: ; @TODO Palette data | ||
|  |     db   $33, $62, $1A, $01, $FF, $0F, $FF, $7F | ||
|  | 
 | ||
|  | 
 | ||
|  | Deathlink: | ||
|  |     ; Spawn the entity | ||
|  |     ld   a, $CA               ; $7AF3: $3E $CA | ||
|  |     call $3B86                ; $7AF5: $CD $86 $3B  ;SpawnEntityTrampoline | ||
|  |     ld   a, $26               ; $7AF8: $3E $26      ; | ||
|  |     ldh  [$F4], a             ; $7AFA: $E0 $F4      ; set noise | ||
|  |     ; Set posX = linkX | ||
|  |     ldh  a, [$98] ; LinkX | ||
|  |     ld   hl, $C200 ; wEntitiesPosXTable | ||
|  |     add  hl, de | ||
|  |     ld   [hl], a | ||
|  |     ; set posY = linkY - 54 | ||
|  |     ldh  a, [$99] ; LinkY | ||
|  |     sub  a, 54 | ||
|  |     ld   hl, $C210 ; wEntitiesPosYTable | ||
|  |     add  hl, de | ||
|  |     ld   [hl], a | ||
|  |     ; wEntitiesPrivateState3Table | ||
|  |     ld   hl, $C2D0          ; $7B0A: $21 $D0 $C2 | ||
|  |     add  hl, de                                   ; $7B0D: $19 | ||
|  |     ld   [hl], $01                                ; $7B0E: $36 $01 | ||
|  |     ; wEntitiesTransitionCountdownTable     | ||
|  |     ld   hl, $C2E0    ; $7B10: $21 $E0 $C2 | ||
|  |     add  hl, de                                   ; $7B13: $19 | ||
|  |     ld   [hl], $C0                                ; $7B14: $36 $C0 | ||
|  |     ; GetEntityTransitionCountdown              | ||
|  |     call $0C05             ; $7B16: $CD $05 $0C | ||
|  |     ld   [hl], $C0                                ; $7B19: $36 $C0 | ||
|  |     ; IncrementEntityState | ||
|  |     call $3B12                ; $7B1B: $CD $12 $3B | ||
|  | 
 | ||
|  |     ; Remove medicine | ||
|  |     xor  a                                        ; $7B1E: $AF | ||
|  |     ld   [$DB0D], a           ; $7B1F: $EA $0D $DB ; ld   [wHasMedicine], a | ||
|  |     ; Reduce health by a lot | ||
|  |     ld   a, $FF                                   ; $7B22: $3E $FF | ||
|  |     ld   [$DB94], a           ; $7B24: $EA $94 $DB ; ld   [wSubtractHealthBuffer], a | ||
|  | 
 | ||
|  |     ld   hl, $DC88                             ; $7B2C: $21 $88 $DC | ||
|  |     ; Set palette | ||
|  |     ld   de, Data_004_7AE5                        ; $7B2F: $11 $E5 $7A | ||
|  |      | ||
|  | loop_7B32: | ||
|  |     ld   a, [de]                                  ; $7B32: $1A | ||
|  |     ; ld   [hl+], a                                 ; $7B33: $22 | ||
|  |     db $22 | ||
|  |     inc  de                                       ; $7B34: $13 | ||
|  |     ld   a, l                                     ; $7B35: $7D | ||
|  |     and  $07                                      ; $7B36: $E6 $07 | ||
|  |     jr   nz, loop_7B32                           ; $7B38: $20 $F8 | ||
|  | 
 | ||
|  |     ld   a, $02                                   ; $7B3A: $3E $02 | ||
|  |     ld   [$DDD1], a                              ; $7B3C: $EA $D1 $DD | ||
|  | 
 | ||
|  |     ret | ||
|  | 
 | ||
|  | ; probalby wants | ||
|  | ;     ld   a, $02                                   ; $7B40: $3E $02 | ||
|  |     ;ldh  [hLinkInteractiveMotionBlocked], a  | ||
|  | 
 | ||
|  | RandomTeleportPositions: | ||
|  |     db $55, $54, $54, $54, $55, $55, $55, $54, $65, $55, $54, $65, $56, $56, $55, $55 | ||
|  |     db $55, $45, $65, $54, $55, $55, $55, $55, $55, $55, $55, $58, $43, $57, $55, $55 | ||
|  |     db $55, $55, $55, $55, $55, $54, $55, $53, $54, $56, $65, $65, $56, $55, $57, $65 | ||
|  |     db $45, $55, $55, $55, $55, $55, $55, $55, $48, $45, $43, $34, $35, $35, $36, $34 | ||
|  |     db $65, $55, $55, $54, $54, $54, $55, $54, $56, $65, $55, $55, $55, $55, $54, $54 | ||
|  |     db $55, $55, $55, $55, $56, $55, $55, $54, $55, $55, $55, $53, $45, $35, $53, $46 | ||
|  |     db $56, $55, $55, $55, $53, $55, $54, $54, $55, $55, $55, $54, $44, $55, $55, $54 | ||
|  |     db $55, $55, $45, $55, $55, $54, $45, $45, $63, $55, $65, $55, $45, $45, $44, $54 | ||
|  |     db $56, $56, $54, $55, $54, $55, $55, $55, $55, $55, $55, $56, $54, $55, $65, $56 | ||
|  |     db $54, $54, $55, $65, $56, $54, $55, $56, $55, $55, $55, $66, $65, $65, $55, $56 | ||
|  |     db $65, $55, $55, $75, $55, $55, $55, $54, $55, $55, $65, $57, $55, $54, $53, $45 | ||
|  |     db $55, $56, $55, $55, $55, $45, $54, $55, $54, $55, $56, $55, $55, $55, $55, $54 | ||
|  |     db $55, $55, $65, $55, $55, $54, $53, $58, $55, $05, $58, $55, $55, $55, $74, $55 | ||
|  |     db $55, $55, $55, $55, $46, $55, $55, $56, $55, $55, $55, $54, $55, $45, $55, $55 | ||
|  |     db $55, $55, $54, $55, $55, $55, $65, $55, $55, $46, $55, $55, $56, $55, $55, $55 | ||
|  |     db $55, $55, $54, $55, $55, $55, $45, $36, $53, $51, $57, $53, $56, $54, $45, $46 |