pokecrystal-board/engine/events/battle_tower/rules.asm
2019-04-12 13:58:49 +02: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 NeedAtLeastThreeMonText
dw EggDoesNotQualifyText
.ExcuseMeText:
; Excuse me!
text_far UnknownText_0x1c5937
text_end
_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 OnlyThreeMonMayBeEnteredText
dw TheMonMustAllBeDifferentKindsText
dw TheMonMustNotHoldTheSameItemsText
dw YouCantTakeAnEggText
JumpText_ExcuseMeYoureNotReady:
; Excuse me. You're not ready.
text_far Text_ExcuseMeYoureNotReady
text_end
BattleTower_PleaseReturnWhenReady:
ld hl, .PleaseReturnWhenReady
call PrintText
ret
.PleaseReturnWhenReady:
; Please return when you're ready.
text_far UnknownText_0x1c5962
text_end
NeedAtLeastThreeMonText:
; You need at least three #MON.
text_far _NeedAtLeastThreeMonText
text_end
EggDoesNotQualifyText:
; Sorry, an EGG doesn't qualify.
text_far _EggDoesNotQualifyText
text_end
OnlyThreeMonMayBeEnteredText:
; Only three #MON may be entered.
text_far _OnlyThreeMonMayBeEnteredText
text_end
TheMonMustAllBeDifferentKindsText:
; The @ #MON must all be different kinds.
text_far _TheMonMustAllBeDifferentKindsText
text_end
TheMonMustNotHoldTheSameItemsText:
; The @ #MON must not hold the same items.
text_far _TheMonMustNotHoldTheSameItemsText
text_end
YouCantTakeAnEggText:
; You can't take an EGG!
text_far _YouCantTakeAnEggText
text_end
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