1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
|
; doubles the damage at de if swords dance or focus energy was used
; in the last turn by the turn holder's arena Pokemon
HandleDoubleDamageSubstatus:
ld a, DUELVARS_ARENA_CARD_SUBSTATUS3
call GetTurnDuelistVariable
bit SUBSTATUS3_THIS_TURN_DOUBLE_DAMAGE, [hl]
call nz, .double_damage_at_de
ld a, DUELVARS_ARENA_CARD_SUBSTATUS1
call GetTurnDuelistVariable
or a
call nz, .ret1
ld a, DUELVARS_ARENA_CARD_SUBSTATUS2
call GetTurnDuelistVariable
or a
call nz, .ret2
ret
.ret1
ret
.double_damage_at_de
ld a, e
or d
ret z
sla e
rl d
ret
.ret2
ret
; check if the attacking card (non-turn holder's arena card) has any substatus that
; reduces the damage dealt this turn (SUBSTATUS2).
; check if the defending card (turn holder's arena card) has any substatus that
; reduces the damage dealt to it this turn (SUBSTATUS1 or Pkmn Powers).
; damage is given in de as input and the possibly updated damage is also returned in de.
HandleDamageReduction:
call HandleDamageReductionExceptSubstatus2
ld a, DUELVARS_ARENA_CARD_SUBSTATUS2
call GetNonTurnDuelistVariable
or a
ret z
cp SUBSTATUS2_REDUCE_BY_20
jr z, .reduce_damage_by_20
cp SUBSTATUS2_POUNCE
jr z, .reduce_damage_by_10
cp SUBSTATUS2_GROWL
jr z, .reduce_damage_by_10
ret
.reduce_damage_by_20
ld hl, -20
add hl, de
ld e, l
ld d, h
ret
.reduce_damage_by_10
ld hl, -10
add hl, de
ld e, l
ld d, h
ret
; check if the defending card (turn holder's arena card) has any substatus that
; reduces the damage dealt to it this turn. (SUBSTATUS1 or Pkmn Powers)
; damage is given in de as input and the possibly updated damage is also returned in de.
HandleDamageReductionExceptSubstatus2:
ld a, [wNoDamageOrEffect]
or a
jr nz, .no_damage
ld a, DUELVARS_ARENA_CARD_SUBSTATUS1
call GetTurnDuelistVariable
or a
jr z, .not_affected_by_substatus1
cp SUBSTATUS1_NO_DAMAGE_STIFFEN
jr z, .no_damage
cp SUBSTATUS1_NO_DAMAGE_10
jr z, .no_damage
cp SUBSTATUS1_NO_DAMAGE_11
jr z, .no_damage
cp SUBSTATUS1_NO_DAMAGE_17
jr z, .no_damage
cp SUBSTATUS1_REDUCE_BY_10
jr z, .reduce_damage_by_10
cp SUBSTATUS1_REDUCE_BY_20
jr z, .reduce_damage_by_20
cp SUBSTATUS1_HARDEN
jr z, .prevent_less_than_40_damage
cp SUBSTATUS1_HALVE_DAMAGE
jr z, .halve_damage
.not_affected_by_substatus1
call CheckCannotUseDueToStatus
ret c
.pkmn_power
ld a, [wLoadedAttackCategory]
cp POKEMON_POWER
ret z
ld a, [wTempNonTurnDuelistCardID]
cp MR_MIME
jr z, .prevent_less_than_30_damage ; invisible wall
cp KABUTO
jr z, .halve_damage2 ; kabuto armor
ret
.no_damage
ld de, 0
ret
.reduce_damage_by_10
ld hl, -10
add hl, de
ld e, l
ld d, h
ret
.reduce_damage_by_20
ld hl, -20
add hl, de
ld e, l
ld d, h
ret
.prevent_less_than_40_damage
ld bc, 40
call CompareDEtoBC
ret nc
ld de, 0
ret
.halve_damage
sla d
rr e
bit 0, e
ret z
ld hl, -5
add hl, de
ld e, l
ld d, h
ret
.prevent_less_than_30_damage
ld a, [wLoadedAttackCategory]
cp POKEMON_POWER
ret z
ld bc, 30
call CompareDEtoBC
ret c
ld de, 0
ret
.halve_damage2
sla d
rr e
bit 0, e
ret z
ld hl, -5
add hl, de
ld e, l
ld d, h
ret
; check for Invisible Wall, Kabuto Armor, NShield, or Transparency, in order to
; possibly reduce or make zero the damage at de.
HandleDamageReductionOrNoDamageFromPkmnPowerEffects:
ld a, [wLoadedAttackCategory]
cp POKEMON_POWER
ret z
ld a, MUK
call CountPokemonIDInBothPlayAreas
ret c
ld a, [wTempPlayAreaLocation_cceb]
or a
call nz, HandleDamageReductionExceptSubstatus2.pkmn_power
push de ; push damage from call above, which handles Invisible Wall and Kabuto Armor
call HandleNoDamageOrEffectSubstatus.pkmn_power
call nc, HandleTransparency
pop de ; restore damage
ret nc
; if carry was set due to NShield or Transparency, damage is 0
ld de, 0
ret
; when MACHAMP is damaged, if its Strikes Back is active, the
; attacking Pokemon (turn holder's arena Pokemon) takes 10 damage.
; ignore if damage taken at de is 0.
; used to bounce back a damaging attack.
HandleStrikesBack_AgainstDamagingAttack:
ld a, e
or d
ret z
ld a, [wIsDamageToSelf]
or a
ret nz
ld a, [wTempNonTurnDuelistCardID] ; ID of defending Pokemon
cp MACHAMP
ret nz
ld a, MUK
call CountPokemonIDInBothPlayAreas
ret c
ld a, [wLoadedAttackCategory] ; category of attack used
cp POKEMON_POWER
ret z
ld a, [wTempPlayAreaLocation_cceb] ; defending Pokemon's PLAY_AREA_*
or a ; cp PLAY_AREA_ARENA
jr nz, .in_bench
call CheckCannotUseDueToStatus
ret c
.in_bench
push hl
push de
; subtract 10 HP from attacking Pokemon (turn holder's arena Pokemon)
call SwapTurn
ld a, DUELVARS_ARENA_CARD
call GetTurnDuelistVariable
call LoadCardDataToBuffer2_FromDeckIndex
ld a, DUELVARS_ARENA_CARD_HP
call GetTurnDuelistVariable
push af
push hl
ld de, 10
call SubtractHP
ld a, [wLoadedCard2ID]
ld [wTempNonTurnDuelistCardID], a
ld hl, 10
call LoadTxRam3
ld hl, wLoadedCard2Name
ld a, [hli]
ld h, [hl]
ld l, a
call LoadTxRam2
ldtx hl, ReceivesDamageDueToStrikesBackText
call DrawWideTextBox_WaitForInput
pop hl
pop af
or a
jr z, .not_knocked_out
xor a
call PrintPlayAreaCardKnockedOutIfNoHP
.not_knocked_out
call SwapTurn
pop de
pop hl
ret
; return carry if NShield or Transparency activate (if MEW1 or HAUNTER1 is
; the turn holder's arena Pokemon), and print their corresponding text if so
HandleNShieldAndTransparency:
push de
ld a, DUELVARS_ARENA_CARD
add e
call GetTurnDuelistVariable
call GetCardIDFromDeckIndex
ld a, e
cp MEW1
jr z, .nshield
cp HAUNTER1
jr z, .transparency
.done
pop de
or a
ret
.nshield
ld a, DUELVARS_ARENA_CARD_STAGE
call GetNonTurnDuelistVariable
or a
jr z, .done
ld a, NO_DAMAGE_OR_EFFECT_NSHIELD
ld [wNoDamageOrEffect], a
ldtx hl, NoDamageOrEffectDueToNShieldText
.print_text
call DrawWideTextBox_WaitForInput
pop de
scf
ret
.transparency
xor a
ld [wDuelDisplayedScreen], a
ldtx de, TransparencyCheckText
call TossCoin
jr nc, .done
ld a, NO_DAMAGE_OR_EFFECT_TRANSPARENCY
ld [wNoDamageOrEffect], a
ldtx hl, NoDamageOrEffectDueToTransparencyText
jr .print_text
; return carry if the turn holder's arena Pokemon is under a condition that makes
; it unable to attack. also return in hl the text id to be displayed
HandleCantAttackSubstatus:
ld a, DUELVARS_ARENA_CARD_SUBSTATUS2
call GetTurnDuelistVariable
or a
ret z
ldtx hl, UnableToAttackDueToTailWagText
cp SUBSTATUS2_TAIL_WAG
jr z, .return_with_cant_attack
ldtx hl, UnableToAttackDueToLeerText
cp SUBSTATUS2_LEER
jr z, .return_with_cant_attack
ldtx hl, UnableToAttackDueToBoneAttackText
cp SUBSTATUS2_BONE_ATTACK
jr z, .return_with_cant_attack
or a
ret
.return_with_cant_attack
scf
ret
; return carry if the turn holder's arena Pokemon cannot use
; selected attack at wSelectedAttack due to amnesia
HandleAmnesiaSubstatus:
ld a, DUELVARS_ARENA_CARD_SUBSTATUS2
call GetTurnDuelistVariable
or a
jr nz, .check_amnesia
ret
.check_amnesia
cp SUBSTATUS2_AMNESIA
jr z, .affected_by_amnesia
.not_the_disabled_atk
or a
ret
.affected_by_amnesia
ld a, DUELVARS_ARENA_CARD_DISABLED_ATTACK_INDEX
call GetTurnDuelistVariable
ld a, [wSelectedAttack]
cp [hl]
jr nz, .not_the_disabled_atk
ldtx hl, UnableToUseAttackDueToAmnesiaText
scf
ret
; return carry if the turn holder's attack was unsuccessful due to sand attack or smokescreen effect
HandleSandAttackOrSmokescreenSubstatus:
call CheckSandAttackOrSmokescreenSubstatus
ret nc
call TossCoin
ld [wGotHeadsFromSandAttackOrSmokescreenCheck], a
ccf
ret nc
ldtx hl, AttackUnsuccessfulText
call DrawWideTextBox_WaitForInput
scf
ret
; return carry if the turn holder's arena card is under the effects of sand attack or smokescreen
CheckSandAttackOrSmokescreenSubstatus:
ld a, DUELVARS_ARENA_CARD_SUBSTATUS2
call GetTurnDuelistVariable
or a
ret z
ldtx de, SandAttackCheckText
cp SUBSTATUS2_SAND_ATTACK
jr z, .card_is_affected
ldtx de, SmokescreenCheckText
cp SUBSTATUS2_SMOKESCREEN
jr z, .card_is_affected
or a
ret
.card_is_affected
ld a, [wGotHeadsFromSandAttackOrSmokescreenCheck]
or a
ret nz
scf
ret
; return carry if the defending card (turn holder's arena card) is under a substatus
; that prevents any damage or effect dealt to it for a turn.
; also return the cause of the substatus in wNoDamageOrEffect
HandleNoDamageOrEffectSubstatus:
xor a
ld [wNoDamageOrEffect], a
ld a, [wLoadedAttackCategory]
cp POKEMON_POWER
ret z
ld a, DUELVARS_ARENA_CARD_SUBSTATUS1
call GetTurnDuelistVariable
ld e, NO_DAMAGE_OR_EFFECT_FLY
ldtx hl, NoDamageOrEffectDueToFlyText
cp SUBSTATUS1_FLY
jr z, .no_damage_or_effect
ld e, NO_DAMAGE_OR_EFFECT_BARRIER
ldtx hl, NoDamageOrEffectDueToBarrierText
cp SUBSTATUS1_BARRIER
jr z, .no_damage_or_effect
ld e, NO_DAMAGE_OR_EFFECT_AGILITY
ldtx hl, NoDamageOrEffectDueToAgilityText
cp SUBSTATUS1_AGILITY
jr z, .no_damage_or_effect
call CheckCannotUseDueToStatus
ccf
ret nc
.pkmn_power
ld a, [wTempNonTurnDuelistCardID]
cp MEW1
jr z, .neutralizing_shield
or a
ret
.no_damage_or_effect
ld a, e
ld [wNoDamageOrEffect], a
scf
ret
.neutralizing_shield
ld a, [wIsDamageToSelf]
or a
ret nz
; prevent damage if attacked by a non-basic Pokemon
ld a, [wTempTurnDuelistCardID]
ld e, a
ld d, $0
call LoadCardDataToBuffer2_FromCardID
ld a, [wLoadedCard2Stage]
or a
ret z
ld e, NO_DAMAGE_OR_EFFECT_NSHIELD
ldtx hl, NoDamageOrEffectDueToNShieldText
jr .no_damage_or_effect
; if the Pokemon being attacked is HAUNTER1, and its Transparency is active,
; there is a 50% chance that any damage or effect is prevented
; return carry if damage is prevented
HandleTransparency:
ld a, [wTempNonTurnDuelistCardID]
cp HAUNTER1
jr z, .transparency
.done
or a
ret
.transparency
ld a, [wLoadedAttackCategory]
cp POKEMON_POWER
jr z, .done ; Transparency has no effect against Pkmn Powers
ld a, [wTempPlayAreaLocation_cceb]
call CheckCannotUseDueToStatus_OnlyToxicGasIfANon0
jr c, .done
xor a
ld [wDuelDisplayedScreen], a
ldtx de, TransparencyCheckText
call TossCoin
ret nc
ld a, NO_DAMAGE_OR_EFFECT_TRANSPARENCY
ld [wNoDamageOrEffect], a
ldtx hl, NoDamageOrEffectDueToTransparencyText
scf
ret
; return carry and return the appropriate text id in hl if the target has an
; special status or power that prevents any damage or effect done to it this turn
; input: a = NO_DAMAGE_OR_EFFECT_*
CheckNoDamageOrEffect:
ld a, [wNoDamageOrEffect]
or a
ret z
bit 7, a
jr nz, .dont_print_text ; already been here so don't repeat the text
ld hl, wNoDamageOrEffect
set 7, [hl]
dec a
add a
ld e, a
ld d, $0
ld hl, NoDamageOrEffectTextIDTable
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
scf
ret
.dont_print_text
ld hl, $0000
scf
ret
NoDamageOrEffectTextIDTable:
tx NoDamageOrEffectDueToAgilityText ; NO_DAMAGE_OR_EFFECT_AGILITY
tx NoDamageOrEffectDueToBarrierText ; NO_DAMAGE_OR_EFFECT_BARRIER
tx NoDamageOrEffectDueToFlyText ; NO_DAMAGE_OR_EFFECT_FLY
tx NoDamageOrEffectDueToTransparencyText ; NO_DAMAGE_OR_EFFECT_TRANSPARENCY
tx NoDamageOrEffectDueToNShieldText ; NO_DAMAGE_OR_EFFECT_NSHIELD
; return carry if turn holder has Omanyte and its Clairvoyance Pkmn Power is active
IsClairvoyanceActive:
ld a, MUK
call CountPokemonIDInBothPlayAreas
ccf
ret nc
ld a, OMANYTE
call CountPokemonIDInPlayArea
ret
; returns carry if turn holder's arena card is paralyzed, asleep, confused,
; and/or toxic gas in play, meaning that attack and/or pkmn power cannot be used
CheckCannotUseDueToStatus:
xor a
; same as above, but if a is non-0, only toxic gas is checked
CheckCannotUseDueToStatus_OnlyToxicGasIfANon0:
or a
jr nz, .check_toxic_gas
ld a, DUELVARS_ARENA_CARD_STATUS
call GetTurnDuelistVariable
and CNF_SLP_PRZ
ldtx hl, CannotUseDueToStatusText
scf
jr nz, .done ; return carry
.check_toxic_gas
ld a, MUK
call CountPokemonIDInBothPlayAreas
ldtx hl, UnableDueToToxicGasText
.done
ret
; return, in a, the amount of times that the Pokemon card with a given ID is found in the
; play area of both duelists. Also return carry if the Pokemon card is at least found once.
; if the arena Pokemon is asleep, confused, or paralyzed (Pkmn Power-incapable), it doesn't count.
; input: a = Pokemon card ID to search
CountPokemonIDInBothPlayAreas:
push bc
ld [wTempPokemonID_ce7c], a
call CountPokemonIDInPlayArea
ld c, a
call SwapTurn
ld a, [wTempPokemonID_ce7c]
call CountPokemonIDInPlayArea
call SwapTurn
add c
or a
scf
jr nz, .found
or a
.found
pop bc
ret
; return, in a, the amount of times that the Pokemon card with a given ID is found in the
; turn holder's play area. Also return carry if the Pokemon card is at least found once.
; if the arena Pokemon is asleep, confused, or paralyzed (Pkmn Power-incapable), it doesn't count.
; input: a = Pokemon card ID to search
CountPokemonIDInPlayArea:
push hl
push de
push bc
ld [wTempPokemonID_ce7c], a
ld c, $0
ld a, DUELVARS_ARENA_CARD
call GetTurnDuelistVariable
cp -1
jr z, .check_bench
call GetCardIDFromDeckIndex
ld a, [wTempPokemonID_ce7c]
cp e
jr nz, .check_bench
ld a, DUELVARS_ARENA_CARD_STATUS
call GetTurnDuelistVariable
and CNF_SLP_PRZ
jr nz, .check_bench
inc c
.check_bench
ld a, DUELVARS_BENCH
call GetTurnDuelistVariable
.next_bench_slot
ld a, [hli]
cp -1
jr z, .done
call GetCardIDFromDeckIndex
ld a, [wTempPokemonID_ce7c]
cp e
jr nz, .skip
inc c
.skip
inc b
jr .next_bench_slot
.done
ld a, c
or a
scf
jr nz, .found
or a
.found
pop bc
pop de
pop hl
ret
; return, in a, the retreat cost of the card in wLoadedCard1,
; adjusting for any Dodrio's Retreat Aid Pkmn Power that is active.
GetLoadedCard1RetreatCost:
ld c, 0
ld a, DUELVARS_BENCH
call GetTurnDuelistVariable
.check_bench_loop
ld a, [hli]
cp -1
jr z, .no_more_bench
call GetCardIDFromDeckIndex
ld a, e
cp DODRIO
jr nz, .not_dodrio
inc c
.not_dodrio
jr .check_bench_loop
.no_more_bench
ld a, c
or a
jr nz, .dodrio_found
.muk_found
ld a, [wLoadedCard1RetreatCost] ; return regular retreat cost
ret
.dodrio_found
ld a, MUK
call CountPokemonIDInBothPlayAreas
jr c, .muk_found
ld a, [wLoadedCard1RetreatCost]
sub c ; apply Retreat Aid for each Pkmn Power-capable Dodrio
ret nc
xor a
ret
; return carry if the turn holder's arena Pokemon is affected by Acid and can't retreat
CheckCantRetreatDueToAcid:
ld a, DUELVARS_ARENA_CARD_SUBSTATUS2
call GetTurnDuelistVariable
or a
ret z
cp SUBSTATUS2_UNABLE_RETREAT
jr z, .cant_retreat
or a
ret
.cant_retreat
ldtx hl, UnableToRetreatDueToAcidText
scf
ret
; return carry if the turn holder is affected by Headache and trainer cards can't be used
CheckCantUseTrainerDueToHeadache:
ld a, DUELVARS_ARENA_CARD_SUBSTATUS3
call GetTurnDuelistVariable
or a
bit SUBSTATUS3_HEADACHE, [hl]
ret z
ldtx hl, UnableToUseTrainerDueToHeadacheText
scf
ret
; return carry if any duelist has Aerodactyl and its Prehistoric Power Pkmn Power is active
IsPrehistoricPowerActive:
ld a, AERODACTYL
call CountPokemonIDInBothPlayAreas
ret nc
ld a, MUK
call CountPokemonIDInBothPlayAreas
ldtx hl, UnableToEvolveDueToPrehistoricPowerText
ccf
ret
; clears some SUBSTATUS2 conditions from the turn holder's active Pokemon.
; more specifically, those conditions that reduce the damage from an attack
; or prevent the opposing Pokemon from attacking the substatus condition inducer.
ClearDamageReductionSubstatus2:
ld a, DUELVARS_ARENA_CARD_SUBSTATUS2
call GetTurnDuelistVariable
or a
ret z
cp SUBSTATUS2_REDUCE_BY_20
jr z, .zero
cp SUBSTATUS2_POUNCE
jr z, .zero
cp SUBSTATUS2_GROWL
jr z, .zero
cp SUBSTATUS2_TAIL_WAG
jr z, .zero
cp SUBSTATUS2_LEER
jr z, .zero
ret
.zero
ld [hl], 0
ret
; clears the SUBSTATUS1 and updates the double damage condition of the player about to start his turn
UpdateSubstatusConditions_StartOfTurn:
ld a, DUELVARS_ARENA_CARD_SUBSTATUS1
call GetTurnDuelistVariable
ld [hl], $0
or a
ret z
cp SUBSTATUS1_NEXT_TURN_DOUBLE_DAMAGE
ret nz
ld a, DUELVARS_ARENA_CARD_SUBSTATUS3
call GetTurnDuelistVariable
set SUBSTATUS3_THIS_TURN_DOUBLE_DAMAGE, [hl]
ret
; clears the SUBSTATUS2, Headache, and updates the double damage condition of the player ending his turn
UpdateSubstatusConditions_EndOfTurn:
ld a, DUELVARS_ARENA_CARD_SUBSTATUS3
call GetTurnDuelistVariable
res SUBSTATUS3_HEADACHE, [hl]
push hl
ld a, DUELVARS_ARENA_CARD_SUBSTATUS2
call GetTurnDuelistVariable
xor a
ld [hl], a
ld a, DUELVARS_ARENA_CARD_SUBSTATUS1
call GetTurnDuelistVariable
pop hl
cp SUBSTATUS1_NEXT_TURN_DOUBLE_DAMAGE
ret z
res SUBSTATUS3_THIS_TURN_DOUBLE_DAMAGE, [hl]
ret
; return carry if turn holder has Blastoise and its Rain Dance Pkmn Power is active
IsRainDanceActive:
ld a, BLASTOISE
call CountPokemonIDInPlayArea
ret nc ; return if no Pkmn Power-capable Blastoise found in turn holder's play area
ld a, MUK
call CountPokemonIDInBothPlayAreas
ccf
ret
; return carry if card at [hTempCardIndex_ff98] is a water energy card AND
; if card at [hTempPlayAreaLocation_ff9d] is a water Pokemon card.
CheckRainDanceScenario:
ldh a, [hTempCardIndex_ff98]
call GetCardIDFromDeckIndex
call GetCardType
cp TYPE_ENERGY_WATER
jr nz, .done
ldh a, [hTempPlayAreaLocation_ff9d]
call GetPlayAreaCardColor
cp TYPE_PKMN_WATER
jr nz, .done
scf
ret
.done
or a
ret
; if the defending (non-turn) card's HP is 0 and the attacking (turn) card's HP
; is not, the attacking card faints if it was affected by destiny bond
HandleDestinyBondSubstatus:
ld a, DUELVARS_ARENA_CARD_SUBSTATUS1
call GetNonTurnDuelistVariable
cp SUBSTATUS1_DESTINY_BOND
jr z, .check_hp
ret
.check_hp
ld a, DUELVARS_ARENA_CARD
call GetNonTurnDuelistVariable
cp -1
ret z
ld a, DUELVARS_ARENA_CARD_HP
call GetNonTurnDuelistVariable
or a
ret nz
ld a, DUELVARS_ARENA_CARD_HP
call GetTurnDuelistVariable
or a
ret z
ld [hl], 0
push hl
call DrawDuelMainScene
call DrawDuelHUDs
pop hl
ld l, DUELVARS_ARENA_CARD
ld a, [hl]
call LoadCardDataToBuffer2_FromDeckIndex
ld hl, wLoadedCard2Name
ld a, [hli]
ld h, [hl]
ld l, a
call LoadTxRam2
ldtx hl, KnockedOutDueToDestinyBondText
call DrawWideTextBox_WaitForInput
ret
; when MACHAMP is damaged, if its Strikes Back is active, the
; attacking Pokemon (turn holder's arena Pokemon) takes 10 damage.
; used to bounce back an attack of the RESIDUAL category
HandleStrikesBack_AgainstResidualAttack:
ld a, [wTempNonTurnDuelistCardID]
cp MACHAMP
jr z, .strikes_back
ret
.strikes_back
ld a, [wLoadedAttackCategory]
and RESIDUAL
ret nz
ld a, [wDealtDamage]
or a
ret z
call SwapTurn
call CheckCannotUseDueToStatus
call SwapTurn
ret c
ld hl, 10 ; damage to be dealt to attacker
call ApplyStrikesBack_AgainstResidualAttack
call nc, WaitForWideTextBoxInput
ret
ApplyStrikesBack_AgainstResidualAttack:
push hl
call LoadTxRam3
ld a, [wTempTurnDuelistCardID]
ld e, a
ld d, $0
call LoadCardDataToBuffer2_FromCardID
ld hl, wLoadedCard2Name
ld a, [hli]
ld h, [hl]
ld l, a
call LoadTxRam2
ld a, DUELVARS_ARENA_CARD_HP
call GetTurnDuelistVariable
pop de
push af
push hl
call SubtractHP
ldtx hl, ReceivesDamageDueToStrikesBackText
call DrawWideTextBox_PrintText
pop hl
pop af
or a
ret z
call WaitForWideTextBoxInput
xor a
call PrintPlayAreaCardKnockedOutIfNoHP
call DrawDuelHUDs
scf
ret
; if the id of the card provided in register a as a deck index is MUK,
; clear the changed type of all arena and bench Pokemon
ClearChangedTypesIfMuk:
call GetCardIDFromDeckIndex
ld a, e
cp MUK
ret nz
call SwapTurn
call .zero_changed_types
call SwapTurn
.zero_changed_types
ld a, DUELVARS_ARENA_CARD_CHANGED_TYPE
call GetTurnDuelistVariable
ld c, MAX_PLAY_AREA_POKEMON
.zero_changed_types_loop
xor a
ld [hli], a
dec c
jr nz, .zero_changed_types_loop
ret
|