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
|