 81a239325d
			
		
	
	81a239325d
	
	
	
		
			
			Adds Link's Awakening: DX. Fully imports and forks LADXR, with permission - https://github.com/daid/LADXR
		
			
				
	
	
		
			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
 |