pokecrystal-board/engine/events/battle_tower/rules.asm
mid-kid 940256569b text_jump → text_far
The previous name for this was rather misleading. It isn't an actual
jump like you'd expect the `jp` instruction to behave as. Instead, it
behaves more like a `farcall`.
This also makes it consistent with its current command ID name of
`TX_FAR`.
2018-11-05 22:26:18 +01:00

309 lines
4.2 KiB
NASM

CheckForMobileBattleRules:
ld de, .PointerTables
call BattleTower_ExecuteJumptable
ret z
call BattleTower_PleaseReturnWhenReady
scf
ret
.PointerTables:
db 2
dw .Functions
dw .TextPointers
.Functions:
dw BattleTower_CheckPartyLengthIs3
dw BattleTower_CheckPartyHasThreeMonsThatAreNotEggs
.TextPointers:
dw .ExcuseMeText
dw JumpText_NeedAtLeastThreeMon
dw JumpText_EggDoesNotQualify
.ExcuseMeText:
; Excuse me!
text_far UnknownText_0x1c5937
db "@"
_CheckForBattleTowerRules:
ld hl, wStringBuffer2
ld [hl], "3"
inc hl
ld [hl], "@"
ld de, .PointerTables
call BattleTower_ExecuteJumptable
ret z
call BattleTower_PleaseReturnWhenReady
scf
ret
.PointerTables:
db 4
dw .Functions
dw .TextPointers
.Functions:
dw Function_PartyCountEq3
dw Function_PartySpeciesAreUnique
dw Function_PartyItemsAreUnique
dw Function_HasPartyAnEgg
.TextPointers:
dw JumpText_ExcuseMeYoureNotReady
dw JumpText_OnlyThreeMonMayBeEntered
dw JumpText_TheMonMustAllBeDifferentKinds
dw JumpText_TheMonMustNotHoldTheSameItems
dw JumpText_YouCantTakeAnEgg
JumpText_ExcuseMeYoureNotReady:
; Excuse me. You're not ready.
text_far Text_ExcuseMeYoureNotReady
db "@"
BattleTower_PleaseReturnWhenReady:
ld hl, .PleaseReturnWhenReady
call PrintText
ret
.PleaseReturnWhenReady:
; Please return when you're ready.
text_far UnknownText_0x1c5962
db "@"
JumpText_NeedAtLeastThreeMon:
; You need at least three #MON.
text_far UnknownText_0x1c5983
db "@"
JumpText_EggDoesNotQualify:
; Sorry, an EGG doesn't qualify.
text_far UnknownText_0x1c59a3
db "@"
JumpText_OnlyThreeMonMayBeEntered:
; Only three #MON may be entered.
text_far Text_OnlyThreeMonMayBeEntered
db "@"
JumpText_TheMonMustAllBeDifferentKinds:
; The @ #MON must all be different kinds.
text_far Text_TheMonMustAllBeDifferentKinds
db "@"
JumpText_TheMonMustNotHoldTheSameItems:
; The @ #MON must not hold the same items.
text_far Text_TheMonMustNotHoldTheSameItems
db "@"
JumpText_YouCantTakeAnEgg:
; You can't take an EGG!
text_far Text_YouCantTakeAnEgg
db "@"
BattleTower_ExecuteJumptable:
ld bc, 0
.loop
call .DoJumptableFunction
call c, .PrintFailureText
call .Next_CheckReachedEnd
jr nz, .loop
ld a, b
and a
ret
.DoJumptableFunction:
push de
push bc
call .GetFunctionPointer
ld a, c
rst JumpTable
pop bc
pop de
ret
.Next_CheckReachedEnd:
inc c
ld a, [de]
cp c
ret
.GetFunctionPointer:
inc de
ld a, [de]
ld l, a
inc de
ld a, [de]
ld h, a
ret
.GetTextPointers:
inc de
inc de
inc de
ld a, [de]
ld l, a
inc de
ld a, [de]
ld h, a
ret
.LoadTextPointer:
ld a, [hli]
ld h, [hl]
ld l, a
ret
.PrintFailureText:
push de
push bc
ld a, b
and a
call z, .PrintFirstText
pop bc
call .PrintNthText
ld b, $1
pop de
ret
.PrintFirstText:
push de
call .GetTextPointers
call .LoadTextPointer
call PrintText
pop de
ret
.PrintNthText:
push bc
call .GetTextPointers
inc hl
inc hl
ld b, $0
add hl, bc
add hl, bc
call .LoadTextPointer
call PrintText
pop bc
ret
BattleTower_CheckPartyLengthIs3:
ld a, [wPartyCount]
cp BATTLETOWER_PARTY_LENGTH
ret
BattleTower_CheckPartyHasThreeMonsThatAreNotEggs:
ld hl, wPartyCount
ld a, [hli]
ld b, $0
ld c, a
.loop
ld a, [hli]
cp EGG
jr z, .egg
inc b
.egg
dec c
jr nz, .loop
ld a, [wPartyCount]
cp b
ret z
ld a, b
cp BATTLETOWER_PARTY_LENGTH
ret
Function_PartyCountEq3:
ld a, [wPartyCount]
cp BATTLETOWER_PARTY_LENGTH
ret z
scf
ret
Function_PartySpeciesAreUnique:
ld hl, wPartyMon1Species
call VerifyUniqueness
ret
VerifyUniqueness:
ld de, wPartyCount
ld a, [de]
inc de
dec a
jr z, .done
ld b, a
.loop
push hl
push de
ld c, b
call .isegg
jr z, .next
ld a, [hl]
and a
jr z, .next
.loop2
call .nextmon
call .isegg
jr z, .next2
cp [hl]
jr z, .gotcha
.next2
dec c
jr nz, .loop2
.next
pop de
pop hl
call .nextmon
dec b
jr nz, .loop
.done
and a
ret
.gotcha
pop de
pop hl
scf
ret
.nextmon
push bc
ld bc, PARTYMON_STRUCT_LENGTH
add hl, bc
inc de
pop bc
ret
.isegg
push bc
ld b, a
ld a, [de]
cp EGG
ld a, b
pop bc
ret
Function_PartyItemsAreUnique:
ld hl, wPartyMon1Item
call VerifyUniqueness
ret
Function_HasPartyAnEgg:
ld hl, wPartyCount
ld a, [hli]
ld c, a
.loop
ld a, [hli]
cp EGG
jr z, .found
dec c
jr nz, .loop
and a
ret
.found
scf
ret