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
 |