Archipelago/worlds/ladx/LADXR/patches/bank3e.asm/multiworld.asm

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