shithub: pokecrystal

ref: e0583934874a8fddb1204efd4357146be617cb1f
dir: /engine/events/battle_tower/rules.asm/

View raw version
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