From fbb70b372743fca1c9323e0011a498e672d4707b Mon Sep 17 00:00:00 2001 From: GriffinR Date: Fri, 21 Aug 2020 14:47:55 -0400 Subject: [PATCH] Document contest AI scripts --- asm/macros/contest_ai_script.inc | 15 +- data/contest_ai_scripts.s | 1091 ++++++++++++++++-------------- include/constants/contest.h | 41 ++ include/contest.h | 6 +- src/contest.c | 4 +- src/contest_ai.c | 29 +- src/data/contest_moves.h | 96 +-- src/data/contest_opponents.h | 231 ++++--- 8 files changed, 824 insertions(+), 689 deletions(-) diff --git a/asm/macros/contest_ai_script.inc b/asm/macros/contest_ai_script.inc index 7a5d669f4..9ab7184c3 100644 --- a/asm/macros/contest_ai_script.inc +++ b/asm/macros/contest_ai_script.inc @@ -510,6 +510,14 @@ .4byte \destination .endm + .macro if_used_combo_starter mon:req, destination:req + if_used_combo_starter_eq \mon, TRUE, \destination + .endm + + .macro if_not_used_combo_starter mon:req, destination:req + if_used_combo_starter_eq \mon, FALSE, \destination + .endm + @ whether the mon can make an appeal .macro check_can_participate mon:req @@ -803,7 +811,7 @@ .4byte \destination .endm - @ NOTE: Random is broken (see ContestAICmd_if_random_less_than) + @ NOTE: The random commands are broken (see ContestAICmd_if_random_less_than) .macro if_random_less_than num:req, destination:req .byte 0x7D .byte \num @@ -844,6 +852,7 @@ .4byte \destination .endm + @ This is used incorrectly to check for an effect; see ContestAICmd_check_user_has_move .macro check_user_has_move move:req .byte 0x85 .2byte \move @@ -855,8 +864,8 @@ .4byte \destination .endm - .macro if_effect_in_user_moveset effect:req, destination:req + .macro if_user_doesnt_have_move move:req, destination:req .byte 0x87 - .2byte \effect + .2byte \move .4byte \destination .endm diff --git a/data/contest_ai_scripts.s b/data/contest_ai_scripts.s index bb8d32f57..e47ccb4c8 100644 --- a/data/contest_ai_scripts.s +++ b/data/contest_ai_scripts.s @@ -13,848 +13,889 @@ enum MON_4 .align 2 -gContestAIChecks:: @ 82DE350 - .4byte AI_CheckForBadMove @ CONTEST_AI_CHECK_BAD_MOVE - .4byte AI_CheckForCombo @ CONTEST_AI_CHECK_COMBO +gContestAI_ScriptsTable:: @ 82DE350 + .4byte AI_CheckBadMove @ CONTEST_AI_CHECK_BAD_MOVE + .4byte AI_CheckCombo @ CONTEST_AI_CHECK_COMBO .4byte AI_CheckBoring @ CONTEST_AI_CHECK_BORING .4byte AI_CheckExcitement @ CONTEST_AI_CHECK_EXCITEMENT .4byte AI_CheckOrder @ CONTEST_AI_CHECK_ORDER - .4byte AI_CheckForGoodMove @ CONTEST_AI_CHECK_GOOD_MOVE + .4byte AI_CheckGoodMove @ CONTEST_AI_CHECK_GOOD_MOVE .4byte AI_Erratic @ CONTEST_AI_ERRATIC - .4byte AI_Nothing // 0x00000080 - .4byte AI_Nothing // 0x00000100 - .4byte AI_Nothing // 0x00000200 - .4byte AI_Nothing // 0x00000400 - .4byte AI_Nothing // 0x00000800 - .4byte AI_Nothing // 0x00001000 - .4byte AI_Nothing // 0x00002000 - .4byte AI_Nothing // 0x00004000 - .4byte AI_Nothing // 0x00008000 - .4byte AI_Nothing // 0x00010000 - .4byte AI_Nothing // 0x00020000 - .4byte AI_Nothing // 0x00040000 - .4byte AI_Nothing // 0x00080000 - .4byte AI_Nothing // 0x00100000 - .4byte AI_Nothing // 0x00200000 - .4byte AI_Nothing // 0x00400000 - .4byte AI_Nothing // 0x00800000 - .4byte AI_Nothing // 0x01000000 - .4byte AI_Nothing // 0x02000000 - .4byte AI_Nothing // 0x04000000 - .4byte AI_Nothing // 0x08000000 - .4byte AI_Nothing // 0x10000000 - .4byte AI_Nothing // 0x20000000 - .4byte AI_Nothing // 0x40000000 - .4byte AI_Nothing // 0x80000000 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_1 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_2 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_3 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_4 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_5 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_6 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_7 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_8 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_9 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_10 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_11 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_12 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_13 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_14 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_15 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_16 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_17 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_18 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_19 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_20 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_21 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_22 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_23 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_24 + .4byte AI_Nothing @ CONTEST_AI_DUMMY_25 -@ Unreferenced AI routine to encourage moves that improve condition on the first -@ appeal. Additionally, it checks the turn order of the user and the effect -@ type, but the code is buggy and doesn't affect the score. - if_appeal_num_not_eq 0, ContestUnreferenced_80 - if_effect_not_eq CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, ContestUnreferenced_80 +@ Unused. Encourages improving condition on the 1st appeal, or startling mons if the users turn is later +AI_CheckTiming: + if_appeal_num_not_eq 0, AI_CheckTiming_SkipCondition + if_effect_not_eq CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, AI_CheckTiming_SkipCondition score +10 -ContestUnreferenced_80: - call ContestUnreferenced_0D +AI_CheckTiming_SkipCondition: + call AI_CheckTiming_TryStartle end -ContestUnreferenced_0D: - if_user_order_more_than MON_2, ContestUnreferenced_end - if_effect_type_not_eq 2, ContestUnreferenced_end - if_effect_type_not_eq 3, ContestUnreferenced_end - score +10 @ unreachable -ContestUnreferenced_end: +AI_CheckTiming_TryStartle: + if_user_order_more_than MON_2, AI_CheckTiming_End + if_effect_type_not_eq CONTEST_EFFECT_TYPE_STARTLE_MON, AI_CheckTiming_End + if_effect_type_not_eq CONTEST_EFFECT_TYPE_STARTLE_MONS, AI_CheckTiming_End + score +10 +AI_CheckTiming_End: end -@ Unreferenced AI routine that doesn't make much sense. - if_appeal_num_eq 0, ContestUnreferenced_0F_1 - if_appeal_num_eq 1, ContestUnreferenced_0F_2 - if_appeal_num_eq 2, ContestUnreferenced_0F_3 - if_appeal_num_eq 3, ContestUnreferenced_0F_4 - if_last_appeal ContestUnreferenced_0F_5 +@ Unused, doesnt make much sense +@ Encourages using an avoid being startled move +@ The various appeal and turn checks are pointless, it will always encourage these moves +AI_AvoidStartle: + if_appeal_num_eq 0, AI_AvoidStartle_1stAppeal + if_appeal_num_eq 1, AI_AvoidStartle_2ndAppeal + if_appeal_num_eq 2, AI_AvoidStartle_3rdAppeal + if_appeal_num_eq 3, AI_AvoidStartle_4thAppeal + if_last_appeal AI_AvoidStartle_LastAppeal end -ContestUnreferenced_0F_1: - if_user_order_not_eq MON_1, ContestUnreferenced_2B_1 - if_user_order_not_eq MON_2, ContestUnreferenced_2B_2 - if_user_order_not_eq MON_3, ContestUnreferenced_2B_1 - if_user_order_not_eq MON_4, ContestUnreferenced_2B_1 +AI_AvoidStartle_1stAppeal: + if_user_order_not_eq MON_1, AI_AvoidStartle_EncourageIfAvoidMove + if_user_order_not_eq MON_2, AI_AvoidStartle_EncourageIfAvoidMove2 + if_user_order_not_eq MON_3, AI_AvoidStartle_EncourageIfAvoidMove + if_user_order_not_eq MON_4, AI_AvoidStartle_EncourageIfAvoidMove end -ContestUnreferenced_2B_1: - if_effect_type_eq 1, ContestUnreferenced_score +AI_AvoidStartle_EncourageIfAvoidMove: + if_effect_type_eq CONTEST_EFFECT_TYPE_AVOID_STARTLE, AI_AvoidStartle_Encourage end -ContestUnreferenced_2B_2: - if_effect_type_eq 1, ContestUnreferenced_score +AI_AvoidStartle_EncourageIfAvoidMove2: + if_effect_type_eq CONTEST_EFFECT_TYPE_AVOID_STARTLE, AI_AvoidStartle_Encourage end - if_effect_type_eq 1, ContestUnreferenced_score +AI_AvoidStartle_EncourageIfAvoidMove3: + if_effect_type_eq CONTEST_EFFECT_TYPE_AVOID_STARTLE, AI_AvoidStartle_Encourage end -ContestUnreferenced_0F_2: - if_user_order_not_eq MON_1, ContestUnreferenced_2B_1 - if_user_order_not_eq MON_2, ContestUnreferenced_2B_1 - if_user_order_not_eq MON_3, ContestUnreferenced_2B_1 - if_user_order_not_eq MON_4, ContestUnreferenced_2B_1 +AI_AvoidStartle_2ndAppeal: + if_user_order_not_eq MON_1, AI_AvoidStartle_EncourageIfAvoidMove + if_user_order_not_eq MON_2, AI_AvoidStartle_EncourageIfAvoidMove + if_user_order_not_eq MON_3, AI_AvoidStartle_EncourageIfAvoidMove + if_user_order_not_eq MON_4, AI_AvoidStartle_EncourageIfAvoidMove end -ContestUnreferenced_0F_3: - if_user_order_not_eq MON_1, ContestUnreferenced_2B_1 - if_user_order_not_eq MON_2, ContestUnreferenced_2B_1 - if_user_order_not_eq MON_3, ContestUnreferenced_2B_1 - if_user_order_not_eq MON_4, ContestUnreferenced_2B_1 +AI_AvoidStartle_3rdAppeal: + if_user_order_not_eq MON_1, AI_AvoidStartle_EncourageIfAvoidMove + if_user_order_not_eq MON_2, AI_AvoidStartle_EncourageIfAvoidMove + if_user_order_not_eq MON_3, AI_AvoidStartle_EncourageIfAvoidMove + if_user_order_not_eq MON_4, AI_AvoidStartle_EncourageIfAvoidMove end -ContestUnreferenced_0F_4: - if_user_order_not_eq MON_1, ContestUnreferenced_2B_1 - if_user_order_not_eq MON_2, ContestUnreferenced_2B_1 - if_user_order_not_eq MON_3, ContestUnreferenced_2B_1 - if_user_order_not_eq MON_4, ContestUnreferenced_2B_1 +AI_AvoidStartle_4thAppeal: + if_user_order_not_eq MON_1, AI_AvoidStartle_EncourageIfAvoidMove + if_user_order_not_eq MON_2, AI_AvoidStartle_EncourageIfAvoidMove + if_user_order_not_eq MON_3, AI_AvoidStartle_EncourageIfAvoidMove + if_user_order_not_eq MON_4, AI_AvoidStartle_EncourageIfAvoidMove end -ContestUnreferenced_0F_5: - if_user_order_not_eq MON_1, ContestUnreferenced_2B_1 - if_user_order_not_eq MON_2, ContestUnreferenced_2B_1 - if_user_order_not_eq MON_3, ContestUnreferenced_2B_1 - if_user_order_not_eq MON_4, ContestUnreferenced_2B_1 +AI_AvoidStartle_LastAppeal: + if_user_order_not_eq MON_1, AI_AvoidStartle_EncourageIfAvoidMove + if_user_order_not_eq MON_2, AI_AvoidStartle_EncourageIfAvoidMove + if_user_order_not_eq MON_3, AI_AvoidStartle_EncourageIfAvoidMove + if_user_order_not_eq MON_4, AI_AvoidStartle_EncourageIfAvoidMove end -ContestUnreferenced_score: - score +10 - end - - end - -@ Unreferenced AI routine to encourage the most appealing move. - if_most_appealing_move ContestUnreferenced_score2 - end -ContestUnreferenced_score2: +AI_AvoidStartle_Encourage: + score +10 + end +AI_AvoidStartle_End: + end + +@ Unused +AI_PreferMostAppealingMove: + if_most_appealing_move AI_PreferMostAppealingMove_Encourage + end +AI_PreferMostAppealingMove_Encourage: score +10 end +@ Discourages using the same move multiple times if it would get boring AI_CheckBoring: if_effect_eq CONTEST_EFFECT_REPETITION_NOT_BORING, AI_CheckBoring_NotBoring - if_move_used_count_eq 1, AI_CheckBoring_FirstRepeat - if_move_used_count_eq 2, AI_CheckBoring_SecondRepeat - if_move_used_count_eq 3, AI_CheckBoring_ThirdRepeat - if_move_used_count_eq 4, AI_CheckBoring_FourthRepeat + if_move_used_count_eq 1, AI_CheckBoring_1stRepeat + if_move_used_count_eq 2, AI_CheckBoring_2ndRepeat + if_move_used_count_eq 3, AI_CheckBoring_3rdRepeat + if_move_used_count_eq 4, AI_CheckBoring_4thRepeat @ No repeats end -AI_CheckBoring_FirstRepeat: +AI_CheckBoring_1stRepeat: score -5 end -AI_CheckBoring_SecondRepeat: +AI_CheckBoring_2ndRepeat: score -15 end -AI_CheckBoring_ThirdRepeat: +AI_CheckBoring_3rdRepeat: score -20 end -AI_CheckBoring_FourthRepeat: +AI_CheckBoring_4thRepeat: score -25 end AI_CheckBoring_NotBoring: end +@ Strongly encourages using an exciting move if user is in a position to receive the max excitement bonus +@ Encourages using exciting moves in general +@ If the user doesnt have a good exciting move to use, then encourage lowering excitement to prevent +@ opponents from benefitting from the excitement AI_CheckExcitement: - if_move_excitement_less_than 0, AI_contest09_081DC2AB - if_move_excitement_eq 0, AI_contest7D_4_081DC2AB - if_move_excitement_eq 1, AI_contest3D_081DC2AB + if_move_excitement_less_than 0, AI_CheckExcitement_Negative + if_move_excitement_eq 0, AI_CheckExcitement_Neutral + if_move_excitement_eq 1, AI_CheckExcitement_Positive end -AI_contest09_081DC2AB: - if_excitement_eq 4, AI_contest0F_1_081DC2AB - if_excitement_eq 3, AI_contest0F_2_081DC2AB - if_user_has_exciting_move AI_end_081DC2AB +AI_CheckExcitement_Negative: + if_excitement_eq 4, AI_CheckExcitement_Negative_1AwayFromMax + if_excitement_eq 3, AI_CheckExcitement_Negative_2AwayFromMax + if_user_has_exciting_move AI_CheckExcitement_End score +15 end -AI_contest0F_1_081DC2AB: - if_user_order_not_eq MON_1, AI_contest7D_1_081DC2AB - if_random_less_than 51, AI_end_081DC2AB +AI_CheckExcitement_Negative_1AwayFromMax: + if_user_order_not_eq MON_1, AI_CheckExcitement_Negative_1AwayFromMax_Not1stUp + if_random_less_than 51, AI_CheckExcitement_End score +20 end -AI_contest7D_1_081DC2AB: - if_random_less_than 127, AI_end_081DC2AB +AI_CheckExcitement_Negative_1AwayFromMax_Not1stUp: + if_random_less_than 127, AI_CheckExcitement_End score -10 end -AI_contest0F_2_081DC2AB: - if_user_order_not_eq MON_1, AI_contest7D_3_081DC2AB - if_last_appeal AI_score_081DC2AB -AI_contest7D_2_081DC2AB: - if_random_less_than 51, AI_end_081DC2AB +AI_CheckExcitement_Negative_2AwayFromMax: + if_user_order_not_eq MON_1, AI_CheckExcitement_Negative_2AwayFromMax_Not1stUp + if_last_appeal AI_CheckExcitement_Negative_2AwayFromMax_LastAppeal + if_random_less_than 51, AI_CheckExcitement_End score +10 end -AI_score_081DC2AB: +AI_CheckExcitement_Negative_2AwayFromMax_LastAppeal: score +15 end -AI_contest7D_3_081DC2AB: - if_random_less_than 127, AI_end_081DC2AB +AI_CheckExcitement_Negative_2AwayFromMax_Not1stUp: + if_random_less_than 127, AI_CheckExcitement_End score +10 end -AI_contest7D_4_081DC2AB: - if_random_less_than 127, AI_end_081DC2AB +AI_CheckExcitement_Neutral: + if_random_less_than 127, AI_CheckExcitement_End score +10 end -AI_contest3D_081DC2AB: - if_move_used_count_more_than 0, AI_contest29_081DC2AB - if_user_order_not_eq MON_1, AI_contest7D_5_081DC2AB - if_excitement_not_eq 4, AI_contest7D_5_081DC2AB +AI_CheckExcitement_Positive: + if_move_used_count_more_than 0, AI_CheckExcitement_Positive_Repeat + if_user_order_not_eq MON_1, AI_CheckExcitement_Positive_Not1stUpForMax + if_excitement_not_eq 4, AI_CheckExcitement_Positive_Not1stUpForMax score +30 end -AI_contest7D_5_081DC2AB: - if_random_less_than 100, AI_end_081DC2AB +AI_CheckExcitement_Positive_Not1stUpForMax: + if_random_less_than 100, AI_CheckExcitement_End score +10 end -AI_contest29_081DC2AB: - if_effect_not_eq CONTEST_EFFECT_REPETITION_NOT_BORING, AI_end_081DC2AB - if_user_order_not_eq MON_1, AI_contest7D_5_081DC2AB - if_excitement_not_eq 4, AI_contest7D_5_081DC2AB +AI_CheckExcitement_Positive_Repeat: + if_effect_not_eq CONTEST_EFFECT_REPETITION_NOT_BORING, AI_CheckExcitement_End + if_user_order_not_eq MON_1, AI_CheckExcitement_Positive_Not1stUpForMax + if_excitement_not_eq 4, AI_CheckExcitement_Positive_Not1stUpForMax score +30 end -AI_end_081DC2AB: +AI_CheckExcitement_End: end -AI_CheckForCombo: - if_would_finish_combo AI_score_081DC348 - call AI_contest3F_081DC348 - call AI_contest45_081DC348 +@ Strongly encourages using a move if it would finish a combo +@ Encourages using a move if it would start a combo, esp if the user goes earlier +@ Discourages starting a combo in the last round +@ Discourages using a combo finisher when its combo starter hasnt been used yet +AI_CheckCombo: + if_would_finish_combo AI_CheckCombo_WouldFinish + call AI_CheckCombo_CheckStarter + call AI_CheckCombo_CheckFinisherWithoutStarter end -AI_contest3F_081DC348: - if_move_used_count_not_eq 0, AI_end_081DC348 - if_not_combo_starter AI_end_081DC348 - if_user_order_eq MON_1, AI_contest04_1_081DC348 - if_user_order_eq MON_2, AI_contest04_2_081DC348 - if_user_order_eq MON_3, AI_contest04_3_081DC348 - if_user_order_eq MON_4, AI_contest04_4_081DC348 +AI_CheckCombo_CheckStarter: + if_move_used_count_not_eq 0, AI_CheckCombo_End + if_not_combo_starter AI_CheckCombo_End + if_user_order_eq MON_1, AI_CheckCombo_Starter1stUp + if_user_order_eq MON_2, AI_CheckCombo_Starter2ndUp + if_user_order_eq MON_3, AI_CheckCombo_Starter3rdUp + if_user_order_eq MON_4, AI_CheckCombo_StarterLast end -AI_contest45_081DC348: - if_not_combo_finisher AI_end_081DC348 +AI_CheckCombo_CheckFinisherWithoutStarter: + if_not_combo_finisher AI_CheckCombo_End score -10 end -AI_score_081DC348: +AI_CheckCombo_WouldFinish: score +25 end -AI_contest04_1_081DC348: - if_last_appeal AI_contest7D_081DC348 - if_random_less_than 150, AI_end_081DC348 +AI_CheckCombo_Starter1stUp: + if_last_appeal AI_CheckCombo_StarterOnLastAppeal + if_random_less_than 150, AI_CheckCombo_End score +10 end -AI_contest04_2_081DC348: - if_last_appeal AI_contest7D_081DC348 - if_random_less_than 125, AI_end_081DC348 +AI_CheckCombo_Starter2ndUp: + if_last_appeal AI_CheckCombo_StarterOnLastAppeal + if_random_less_than 125, AI_CheckCombo_End score +10 end -AI_contest04_3_081DC348: - if_last_appeal AI_contest7D_081DC348 - if_random_less_than 50, AI_end_081DC348 +AI_CheckCombo_Starter3rdUp: + if_last_appeal AI_CheckCombo_StarterOnLastAppeal + if_random_less_than 50, AI_CheckCombo_End score +10 end -AI_contest04_4_081DC348: - if_last_appeal AI_contest7D_081DC348 +AI_CheckCombo_StarterLast: + if_last_appeal AI_CheckCombo_StarterOnLastAppeal score +10 end -AI_contest7D_081DC348: - if_random_less_than 125, AI_end_081DC348 +AI_CheckCombo_StarterOnLastAppeal: + if_random_less_than 125, AI_CheckCombo_End score -15 end -AI_end_081DC348: +AI_CheckCombo_End: end -AI_CheckForGoodMove: - if_effect_eq CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, ContestEffect39 - if_effect_eq CONTEST_EFFECT_NEXT_APPEAL_EARLIER, ContestEffect40 - if_effect_eq CONTEST_EFFECT_NEXT_APPEAL_LATER, ContestEffect41 - if_effect_eq CONTEST_EFFECT_REPETITION_NOT_BORING, ContestEffect3 - if_effect_eq CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, ContestEffect38 - if_effect_eq CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, ContestEffect47 - if_effect_eq CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, ContestEffect31 - if_effect_eq CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, ContestEffect32 - if_effect_eq CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, ContestEffect46 - if_effect_eq CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, ContestEffect27 - if_effect_eq CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, ContestEffect16or17 - if_effect_eq CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, ContestEffect16or17 - if_effect_eq CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, ContestEffect_FollowingMonsNervous - if_effect_eq CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, ContestEffect18 +@ Checks if move should be encouraged based on its effect +AI_CheckGoodMove: + if_effect_eq CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, AI_CGM_BetterWithGoodCondition + if_effect_eq CONTEST_EFFECT_NEXT_APPEAL_EARLIER, AI_CGM_NextAppealEarlier + if_effect_eq CONTEST_EFFECT_NEXT_APPEAL_LATER, AI_CGM_NextAppealLater + if_effect_eq CONTEST_EFFECT_REPETITION_NOT_BORING, AI_CGM_RepetitionNotBoring + if_effect_eq CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, AI_CGM_ImproveCondition + if_effect_eq CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, AI_CGM_DontExciteAudience + if_effect_eq CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, AI_CGM_AppealAsGoodAsPrevOnes + if_effect_eq CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, AI_CGM_AppealAsGoodAsPrevOne + if_effect_eq CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, AI_CGM_BetterWhenAudienceExcited + if_effect_eq CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, AI_CGM_WorsenConditionOfPrevMons + if_effect_eq CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, AI_CGM_TargetMonWithJudgesAttention + if_effect_eq CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, AI_CGM_TargetMonWithJudgesAttention + if_effect_eq CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, AI_CGM_MakeFollowingMonsNervous + if_effect_eq CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, AI_CGM_JamsOthersButMissOneTurn end -ContestEffect39: - if_user_condition_eq 3, ContestEffect39_score1 - if_user_condition_eq 2, ContestEffect39_score2 - if_user_condition_eq 1, ContestEffect39_score3 - if_user_condition_eq 0, ContestEffect39_score4 +AI_CGM_BetterWithGoodCondition: + if_user_condition_eq 3, AI_CGM_BetterWithGoodCondition_3 + if_user_condition_eq 2, AI_CGM_BetterWithGoodCondition_2 + if_user_condition_eq 1, AI_CGM_BetterWithGoodCondition_1 + if_user_condition_eq 0, AI_CGM_BetterWithGoodCondition_0 end -ContestEffect39_score1: +AI_CGM_BetterWithGoodCondition_3: score +20 end -ContestEffect39_score2: - if_random_less_than 125, ContestEffectEnd +AI_CGM_BetterWithGoodCondition_2: + if_random_less_than 125, AI_CGM_End score +15 end -ContestEffect39_score3: - if_random_less_than 125, ContestEffectEnd +AI_CGM_BetterWithGoodCondition_1: + if_random_less_than 125, AI_CGM_End score +5 end -ContestEffect39_score4: +AI_CGM_BetterWithGoodCondition_0: score -20 end -ContestEffect40: - if_effect_in_user_moveset CONTEST_EFFECT_BETTER_IF_FIRST, ContestEffectEnd - if_random_less_than 50, ContestEffectEnd +AI_CGM_NextAppealEarlier: + if_user_doesnt_have_move CONTEST_EFFECT_BETTER_IF_FIRST, AI_CGM_End + if_random_less_than 50, AI_CGM_End score +20 end -ContestEffect41: - if_effect_in_user_moveset CONTEST_EFFECT_BETTER_IF_LAST, ContestEffectEnd - if_random_less_than 50, ContestEffectEnd +AI_CGM_NextAppealLater: + if_user_doesnt_have_move CONTEST_EFFECT_BETTER_IF_LAST, AI_CGM_End + if_random_less_than 50, AI_CGM_End score +20 end -ContestEffect3: - if_user_order_not_eq MON_4, ContestEffectEnd - if_random_less_than 50, ContestEffectEnd +AI_CGM_RepetitionNotBoring: + if_user_order_not_eq MON_4, AI_CGM_End + if_random_less_than 50, AI_CGM_End score +15 end - if_last_appeal ContestEffect3_7D - if_random_less_than 220, ContestEffect3_score + +AI_CGM_Unused: + if_last_appeal AI_CGM_Unused_LastAppeal + if_random_less_than 220, AI_CGM_Unused_Discourage score +10 end -ContestEffect3_7D: - if_random_less_than 20, ContestEffectEnd +AI_CGM_Unused_LastAppeal: + if_random_less_than 20, AI_CGM_End score +15 end -ContestEffect3_score: +AI_CGM_Unused_Discourage: score -20 end -ContestEffect38: - if_effect_in_user_moveset CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, ContestEffect38_contest04 - if_user_condition_eq 3, ContestEffect38_score1 - if_random_less_than 50, ContestEffectEnd +@ Enourages improving condition, esp if user has moves better with good condition or on 1st appeal +@ Discourages improving condition if at max condition, or if last appeal +AI_CGM_ImproveCondition: + if_user_doesnt_have_move CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, AI_CGM_ImproveCondition_CheckAppealNum + if_user_condition_eq 3, AI_CGM_ImproveCondition_AtMax + if_random_less_than 50, AI_CGM_End score +15 end -ContestEffect38_score1: +AI_CGM_ImproveCondition_AtMax: score -10 end -ContestEffect38_contest04: - if_last_appeal ContestEffect38_score2 - if_appeal_num_eq 0, ContestEffect38_random - if_move_used_count_eq 1, ContestEffectEnd - if_random_less_than 125, ContestEffectEnd +AI_CGM_ImproveCondition_CheckAppealNum: + if_last_appeal AI_CGM_ImproveCondition_LastAppeal + if_appeal_num_eq 0, AI_CGM_ImproveCondition_FirstAppeal + if_move_used_count_eq 1, AI_CGM_End + if_random_less_than 125, AI_CGM_End score +10 end -ContestEffect38_random: - if_random_less_than 100, ContestEffectEnd +AI_CGM_ImproveCondition_FirstAppeal: + if_random_less_than 100, AI_CGM_End score +10 end -ContestEffect38_score2: +AI_CGM_ImproveCondition_LastAppeal: score -10 end -ContestEffect47: - if_move_used_count_eq 1, ContestEffectEnd - if_user_order_eq MON_1, ContestEffect47_random - if_user_order_eq MON_2, ContestEffect47_random - if_not_last_appeal ContestEffectEnd - if_user_has_exciting_move ContestEffectEnd - if_excitement_less_than 1, ContestEffectEnd +@ Encourage stopping audience excitement early in the appeal, or last appeal if no better options +AI_CGM_DontExciteAudience: + if_move_used_count_eq 1, AI_CGM_End + if_user_order_eq MON_1, AI_CGM_DontExciteAudience_EarlyTurn + if_user_order_eq MON_2, AI_CGM_DontExciteAudience_EarlyTurn + if_not_last_appeal AI_CGM_End + if_user_has_exciting_move AI_CGM_End + if_excitement_less_than 1, AI_CGM_End score +10 end -ContestEffect47_random: - if_random_less_than 127, ContestEffectEnd +AI_CGM_DontExciteAudience_EarlyTurn: + if_random_less_than 127, AI_CGM_End score +10 end -ContestEffect31: - if_user_order_eq MON_2, ContestEffect31_score1 - if_user_order_eq MON_3, ContestEffect31_score2 - if_user_order_eq MON_4, ContestEffect31_score3 +@ Encourages move the later the user goes +AI_CGM_AppealAsGoodAsPrevOnes: + if_user_order_eq MON_2, AI_CGM_AppealAsGoodAsPrevOnes_2ndUp + if_user_order_eq MON_3, AI_CGM_AppealAsGoodAsPrevOnes_3rdUp + if_user_order_eq MON_4, AI_CGM_AppealAsGoodAsPrevOnes_Last end -ContestEffect31_score1: +AI_CGM_AppealAsGoodAsPrevOnes_2ndUp: score +5 end -ContestEffect31_score2: +AI_CGM_AppealAsGoodAsPrevOnes_3rdUp: score +15 end -ContestEffect31_score3: +AI_CGM_AppealAsGoodAsPrevOnes_Last: score +20 end -ContestEffect32: - if_user_order_eq MON_1, ContestEffect32_score1 - if_user_order_eq MON_2, ContestEffect32_score2 - if_user_order_eq MON_3, ContestEffect32_score3 - if_user_order_eq MON_4, ContestEffect32_score5 +@ Encourages move more for each opponent who will have a turn before the user +AI_CGM_AppealAsGoodAsPrevOne: + if_user_order_eq MON_1, AI_CGM_AppealAsGoodAsPrevOne_1stUp + if_user_order_eq MON_2, AI_CGM_AppealAsGoodAsPrevOne_2ndUp + if_user_order_eq MON_3, AI_CGM_AppealAsGoodAsPrevOne_3rdUp + if_user_order_eq MON_4, AI_CGM_AppealAsGoodAsPrevOne_Last end -ContestEffect32_score1: +AI_CGM_AppealAsGoodAsPrevOne_1stUp: score -10 end -ContestEffect32_score2: - if_cannot_participate MON_1, ContestEffectEnd +AI_CGM_AppealAsGoodAsPrevOne_2ndUp: + if_cannot_participate MON_1, AI_CGM_End score +5 end -ContestEffect32_score3: - if_cannot_participate MON_1, ContestEffect32_score4 +AI_CGM_AppealAsGoodAsPrevOne_3rdUp: + if_cannot_participate MON_1, AI_CGM_AppealAsGoodAsPrevOne_3rdUp_CheckMon2 score +5 - goto ContestEffect32_score4 + goto AI_CGM_AppealAsGoodAsPrevOne_3rdUp_CheckMon2 end -ContestEffect32_score4: - if_cannot_participate MON_2, ContestEffectEnd +AI_CGM_AppealAsGoodAsPrevOne_3rdUp_CheckMon2: + if_cannot_participate MON_2, AI_CGM_End score +5 end -ContestEffect32_score5: - if_cannot_participate MON_1, ContestEffect32_score6 +AI_CGM_AppealAsGoodAsPrevOne_Last: + if_cannot_participate MON_1, AI_CGM_AppealAsGoodAsPrevOne_Last_CheckMon2 score +5 - goto ContestEffect32_score6 + goto AI_CGM_AppealAsGoodAsPrevOne_Last_CheckMon2 end -ContestEffect32_score6: - if_cannot_participate MON_2, ContestEffect32_score7 +AI_CGM_AppealAsGoodAsPrevOne_Last_CheckMon2: + if_cannot_participate MON_2, AI_CGM_AppealAsGoodAsPrevOne_Last_CheckMon3 score +5 - goto ContestEffect32_score7 + goto AI_CGM_AppealAsGoodAsPrevOne_Last_CheckMon3 end -ContestEffect32_score7: - if_cannot_participate MON_3, ContestEffectEnd +AI_CGM_AppealAsGoodAsPrevOne_Last_CheckMon3: + if_cannot_participate MON_3, AI_CGM_End score +5 end -ContestEffect46: - if_user_order_eq MON_1, ContestEffect46_05 - if_user_order_more_than MON_1, ContestEffect46_score4 +@ Encourage move if audience is close to full exictement and user goes first +@ See bug note, only does this on 1st appeal (when it will never happen) +AI_CGM_BetterWhenAudienceExcited: + if_user_order_eq MON_1, AI_CGM_BetterWhenAudienceExcited_1stUp + if_user_order_more_than MON_1, AI_CGM_BetterWhenAudienceExcited_Not1stUp end -ContestEffect46_05: - if_appeal_num_not_eq 0, ContestEffect46_score1 - if_excitement_eq 4, ContestEffect46_score2 - if_excitement_eq 3, ContestEffect46_score3 +AI_CGM_BetterWhenAudienceExcited_1stUp: + @ BUG: Should be if_appeal_num_eq 0 + @ 1st up on 1st appeal excitement will always be 0 + if_appeal_num_not_eq 0, AI_CGM_BetterWhenAudienceExcited_Not1stAppeal + if_excitement_eq 4, AI_CGM_BetterWhenAudienceExcited_1AwayFromMax + if_excitement_eq 3, AI_CGM_BetterWhenAudienceExcited_2AwayFromMax end -ContestEffect46_score1: - if_random_less_than 125, ContestEffectEnd +AI_CGM_BetterWhenAudienceExcited_Not1stAppeal: + if_random_less_than 125, AI_CGM_End score -15 end -ContestEffect46_score2: - if_random_less_than 125, ContestEffectEnd +AI_CGM_BetterWhenAudienceExcited_1AwayFromMax: + if_random_less_than 125, AI_CGM_End score +20 end -ContestEffect46_score3: - if_random_less_than 125, ContestEffectEnd +AI_CGM_BetterWhenAudienceExcited_2AwayFromMax: + if_random_less_than 125, AI_CGM_End score +15 end -ContestEffect46_score4: - if_random_less_than 178, ContestEffectEnd +AI_CGM_BetterWhenAudienceExcited_Not1stUp: + if_random_less_than 178, AI_CGM_End score +10 end -ContestEffect27: - if_user_order_eq MON_1, ContestEffectEnd - goto ContestEffect27_55_1 +@ Encourage move more for each condition star the prev mons have +AI_CGM_WorsenConditionOfPrevMons: + if_user_order_eq MON_1, AI_CGM_End + goto AI_CGM_WorsenConditionOfPrevMons_CheckMon1 end -ContestEffect27_55_1: - if_cannot_participate MON_1, ContestEffect27_noscore - if_condition_eq MON_1, 0, ContestEffect27_noscore - if_condition_eq MON_1, 1, ContestEffect27_score1 - if_condition_eq MON_1, 2, ContestEffect27_score2 - if_condition_eq MON_1, 3, ContestEffect27_score3 +AI_CGM_WorsenConditionOfPrevMons_CheckMon1: + if_cannot_participate MON_1, AI_CGM_WorsenConditionOfPrevMons_TryCheckMon2 + if_condition_eq MON_1, 0, AI_CGM_WorsenConditionOfPrevMons_TryCheckMon2 + if_condition_eq MON_1, 1, AI_CGM_WorsenConditionOfPrevMons_Mon1Has1Star + if_condition_eq MON_1, 2, AI_CGM_WorsenConditionOfPrevMons_Mon1Has2Stars + if_condition_eq MON_1, 3, AI_CGM_WorsenConditionOfPrevMons_Mon1Has3Stars end -ContestEffect27_score1: - if_random_less_than 125, ContestEffect27_55_2 +AI_CGM_WorsenConditionOfPrevMons_Mon1Has1Star: + if_random_less_than 125, AI_CGM_WorsenConditionOfPrevMons_CheckMon2 score +5 - if_user_order_more_than MON_2, ContestEffect27_55_2 + if_user_order_more_than MON_2, AI_CGM_WorsenConditionOfPrevMons_CheckMon2 end -ContestEffect27_score2: - if_random_less_than 125, ContestEffect27_55_2 +AI_CGM_WorsenConditionOfPrevMons_Mon1Has2Stars: + if_random_less_than 125, AI_CGM_WorsenConditionOfPrevMons_CheckMon2 score +10 - if_user_order_more_than MON_2, ContestEffect27_55_2 + if_user_order_more_than MON_2, AI_CGM_WorsenConditionOfPrevMons_CheckMon2 end -ContestEffect27_score3: - if_random_less_than 125, ContestEffect27_55_2 +AI_CGM_WorsenConditionOfPrevMons_Mon1Has3Stars: + if_random_less_than 125, AI_CGM_WorsenConditionOfPrevMons_CheckMon2 score +15 - if_user_order_more_than MON_2, ContestEffect27_55_2 + if_user_order_more_than MON_2, AI_CGM_WorsenConditionOfPrevMons_CheckMon2 end -ContestEffect27_noscore: - if_user_order_more_than MON_2, ContestEffect27_55_2 +AI_CGM_WorsenConditionOfPrevMons_TryCheckMon2: + if_user_order_more_than MON_2, AI_CGM_WorsenConditionOfPrevMons_CheckMon2 end -ContestEffect27_55_2: - if_cannot_participate MON_2, ContestEffect27_noscore2 - if_condition_eq MON_2, 0, ContestEffect27_noscore2 - if_condition_eq MON_2, 1, ContestEffect27_score4 - if_condition_eq MON_2, 2, ContestEffect27_score5 - if_condition_eq MON_2, 3, ContestEffect27_score6 +AI_CGM_WorsenConditionOfPrevMons_CheckMon2: + if_cannot_participate MON_2, AI_CGM_WorsenConditionOfPrevMons_TryCheckMon3 + if_condition_eq MON_2, 0, AI_CGM_WorsenConditionOfPrevMons_TryCheckMon3 + if_condition_eq MON_2, 1, AI_CGM_WorsenConditionOfPrevMons_Mon2Has1Star + if_condition_eq MON_2, 2, AI_CGM_WorsenConditionOfPrevMons_Mon2Has2Stars + if_condition_eq MON_2, 3, AI_CGM_WorsenConditionOfPrevMons_Mon2Has3Stars end -ContestEffect27_score4: - if_random_less_than 125, ContestEffect27_55_3 +AI_CGM_WorsenConditionOfPrevMons_Mon2Has1Star: + if_random_less_than 125, AI_CGM_WorsenConditionOfPrevMons_CheckMon3 score +5 - if_user_order_more_than MON_3, ContestEffect27_55_3 + if_user_order_more_than MON_3, AI_CGM_WorsenConditionOfPrevMons_CheckMon3 end -ContestEffect27_score5: - if_random_less_than 125, ContestEffect27_55_3 +AI_CGM_WorsenConditionOfPrevMons_Mon2Has2Stars: + if_random_less_than 125, AI_CGM_WorsenConditionOfPrevMons_CheckMon3 score +10 - if_user_order_more_than MON_3, ContestEffect27_55_3 + if_user_order_more_than MON_3, AI_CGM_WorsenConditionOfPrevMons_CheckMon3 end -ContestEffect27_score6: - if_random_less_than 125, ContestEffect27_55_3 +AI_CGM_WorsenConditionOfPrevMons_Mon2Has3Stars: + if_random_less_than 125, AI_CGM_WorsenConditionOfPrevMons_CheckMon3 score +15 - if_user_order_more_than MON_3, ContestEffect27_55_3 + if_user_order_more_than MON_3, AI_CGM_WorsenConditionOfPrevMons_CheckMon3 end -ContestEffect27_noscore2: - if_user_order_more_than MON_3, ContestEffect27_55_3 +AI_CGM_WorsenConditionOfPrevMons_TryCheckMon3: + if_user_order_more_than MON_3, AI_CGM_WorsenConditionOfPrevMons_CheckMon3 end -ContestEffect27_55_3: - if_cannot_participate MON_3, ContestEffect27_end - if_condition_eq MON_3, 0, ContestEffect27_end - if_condition_eq MON_3, 1, ContestEffect27_score7 - if_condition_eq MON_3, 2, ContestEffect27_score8 - if_condition_eq MON_3, 3, ContestEffect27_score9 +AI_CGM_WorsenConditionOfPrevMons_CheckMon3: + if_cannot_participate MON_3, AI_CGM_WorsenConditionOfPrevMons_end + if_condition_eq MON_3, 0, AI_CGM_WorsenConditionOfPrevMons_end + if_condition_eq MON_3, 1, AI_CGM_WorsenConditionOfPrevMons_Mon3Has1Star + if_condition_eq MON_3, 2, AI_CGM_WorsenConditionOfPrevMons_Mon3Has2Stars + if_condition_eq MON_3, 3, AI_CGM_WorsenConditionOfPrevMons_Mon3Has3Stars end -ContestEffect27_score7: - if_random_less_than 125, ContestEffectEnd +AI_CGM_WorsenConditionOfPrevMons_Mon3Has1Star: + if_random_less_than 125, AI_CGM_End score +5 end -ContestEffect27_score8: - if_random_less_than 125, ContestEffectEnd +AI_CGM_WorsenConditionOfPrevMons_Mon3Has2Stars: + if_random_less_than 125, AI_CGM_End score +10 end -ContestEffect27_score9: - if_random_less_than 125, ContestEffectEnd +AI_CGM_WorsenConditionOfPrevMons_Mon3Has3Stars: + if_random_less_than 125, AI_CGM_End score +15 end -ContestEffect27_end: +AI_CGM_WorsenConditionOfPrevMons_end: end -ContestEffect16or17: - if_user_order_eq MON_1, ContestEffectEnd - goto ContestEffect16or17_55 +@ Encourage if a prev mon has started a combo, esp if they havent completed it yet +@ BUG: Incorrectly uses if_used_combo_starter below, instead of if_not_used_combo_starter +@ As a result it encourages move if a prev mon has not begun a combo +AI_CGM_TargetMonWithJudgesAttention: + if_user_order_eq MON_1, AI_CGM_End + goto AI_CGM_TargetMonWithJudgesAttention_CheckMon1 end -ContestEffect16or17_55: - if_cannot_participate MON_1, ContestEffect16or17_0E_1 - if_used_combo_starter_eq MON_1, TRUE, ContestEffect16or17_0E_1 - if_random_less_than 125, ContestEffect16or17_0E_1 +AI_CGM_TargetMonWithJudgesAttention_CheckMon1: + if_cannot_participate MON_1, AI_CGM_TargetMonWithJudgesAttention_CheckMon2 + if_used_combo_starter MON_1, AI_CGM_TargetMonWithJudgesAttention_CheckMon2 + if_random_less_than 125, AI_CGM_TargetMonWithJudgesAttention_CheckMon2 score +2 - if_not_completed_combo MON_1, ContestEffect16or17_0E_1 + if_not_completed_combo MON_1, AI_CGM_TargetMonWithJudgesAttention_CheckMon2 score +8 end -ContestEffect16or17_0E_1: - if_user_order_eq MON_2, ContestEffectEnd - if_cannot_participate MON_2, ContestEffect16or17_0E_2 - if_used_combo_starter_eq MON_2, TRUE, ContestEffect16or17_0E_2 - if_random_less_than 125, ContestEffect16or17_0E_2 +AI_CGM_TargetMonWithJudgesAttention_CheckMon2: + if_user_order_eq MON_2, AI_CGM_End + if_cannot_participate MON_2, AI_CGM_TargetMonWithJudgesAttention_CheckMon3 + if_used_combo_starter MON_2, AI_CGM_TargetMonWithJudgesAttention_CheckMon3 + if_random_less_than 125, AI_CGM_TargetMonWithJudgesAttention_CheckMon3 score +2 - if_not_completed_combo MON_2, ContestEffect16or17_0E_2 + if_not_completed_combo MON_2, AI_CGM_TargetMonWithJudgesAttention_CheckMon3 score +8 end -ContestEffect16or17_0E_2: - if_user_order_eq MON_3, ContestEffectEnd - if_cannot_participate MON_3, ContestEffectEnd - if_used_combo_starter_eq MON_3, TRUE, ContestEffectEnd - if_random_less_than 125, ContestEffectEnd +AI_CGM_TargetMonWithJudgesAttention_CheckMon3: + if_user_order_eq MON_3, AI_CGM_End + if_cannot_participate MON_3, AI_CGM_End + if_used_combo_starter MON_3, AI_CGM_End + if_random_less_than 125, AI_CGM_End score +2 - if_not_completed_combo MON_3, ContestEffectEnd + if_not_completed_combo MON_3, AI_CGM_End score +8 end -ContestEffect_FollowingMonsNervous: - if_user_order_eq MON_4, ContestEffectEnd - goto ContestEffect_FollowingMonsNervous_CheckMon4 +@ Encourage making mons nervous that have started a combo and can appeal after the user +AI_CGM_MakeFollowingMonsNervous: + if_user_order_eq MON_4, AI_CGM_End + goto AI_CGM_MakeFollowingMonsNervous_CheckMon4 end -ContestEffect_FollowingMonsNervous_CheckMon4: - if_cannot_participate MON_4, ContestEffect_FollowingMonsNervous_CheckMon3 - if_used_combo_starter_eq MON_4, FALSE, ContestEffect_FollowingMonsNervous_CheckMon3 +AI_CGM_MakeFollowingMonsNervous_CheckMon4: + if_cannot_participate MON_4, AI_CGM_MakeFollowingMonsNervous_CheckMon3 + if_not_used_combo_starter MON_4, AI_CGM_MakeFollowingMonsNervous_CheckMon3 score +5 - if_random_less_than 125, ContestEffect16or17_0E_1 + if_random_less_than 125, AI_CGM_TargetMonWithJudgesAttention_CheckMon2 score +5 end -ContestEffect_FollowingMonsNervous_CheckMon3: - if_user_order_eq MON_3, ContestEffectEnd - if_cannot_participate MON_3, ContestEffect_FollowingMonsNervous_CheckMon2 - if_used_combo_starter_eq MON_3, FALSE, ContestEffect_FollowingMonsNervous_CheckMon2 +AI_CGM_MakeFollowingMonsNervous_CheckMon3: + if_user_order_eq MON_3, AI_CGM_End + if_cannot_participate MON_3, AI_CGM_MakeFollowingMonsNervous_CheckMon2 + if_not_used_combo_starter MON_3, AI_CGM_MakeFollowingMonsNervous_CheckMon2 score +5 - if_random_less_than 125, ContestEffect16or17_0E_2 + if_random_less_than 125, AI_CGM_TargetMonWithJudgesAttention_CheckMon3 score +5 end -ContestEffect_FollowingMonsNervous_CheckMon2: - if_user_order_eq MON_2, ContestEffectEnd - if_cannot_participate MON_2, ContestEffectEnd - if_used_combo_starter_eq MON_2, FALSE, ContestEffectEnd +AI_CGM_MakeFollowingMonsNervous_CheckMon2: + if_user_order_eq MON_2, AI_CGM_End + if_cannot_participate MON_2, AI_CGM_End + if_not_used_combo_starter MON_2, AI_CGM_End score +5 - if_random_less_than 125, ContestEffectEnd + if_random_less_than 125, AI_CGM_End score +5 end -ContestEffect18: - if_last_appeal ContestEffect18_score1 - goto ContestEffect18_0E +@ Encourages move if users turn is later, or if its the last appeal +AI_CGM_JamsOthersButMissOneTurn: + if_last_appeal AI_CGM_JamsOthersButMissOneTurn_LastAppeal + goto AI_CGM_JamsOthersButMissOneTurn_TurnOrder end -ContestEffect18_score1: +AI_CGM_JamsOthersButMissOneTurn_LastAppeal: score +5 - goto ContestEffect18_0E + goto AI_CGM_JamsOthersButMissOneTurn_TurnOrder end -ContestEffect18_0E: - if_user_order_eq MON_1, ContestEffect18_score2 - if_user_order_eq MON_2, ContestEffect18_random1 - if_user_order_eq MON_3, ContestEffect18_random2 - if_user_order_eq MON_4, ContestEffect18_random3 +AI_CGM_JamsOthersButMissOneTurn_TurnOrder: + if_user_order_eq MON_1, AI_CGM_JamsOthersButMissOneTurn_1stUp + if_user_order_eq MON_2, AI_CGM_JamsOthersButMissOneTurn_2ndUp + if_user_order_eq MON_3, AI_CGM_JamsOthersButMissOneTurn_3rdUp + if_user_order_eq MON_4, AI_CGM_JamsOthersButMissOneTurn_Last end -ContestEffect18_score2: +AI_CGM_JamsOthersButMissOneTurn_1stUp: score -15 end -ContestEffect18_random1: - if_random_less_than 125, ContestEffectEnd +AI_CGM_JamsOthersButMissOneTurn_2ndUp: + if_random_less_than 125, AI_CGM_End score -10 end -ContestEffect18_random2: - if_random_less_than 125, ContestEffectEnd +AI_CGM_JamsOthersButMissOneTurn_3rdUp: + if_random_less_than 125, AI_CGM_End score +5 end -ContestEffect18_random3: - if_random_less_than 125, ContestEffectEnd +AI_CGM_JamsOthersButMissOneTurn_Last: + if_random_less_than 125, AI_CGM_End score +15 end -ContestEffectEnd: +AI_CGM_End: end @ Randomly encourage moves in Cute, Smart, and Tough contests. AI_Erratic: - if_contest_type_eq CONTEST_CATEGORY_CUTE, Erratic_CuteSmartTough - if_contest_type_eq CONTEST_CATEGORY_SMART, Erratic_CuteSmartTough - if_contest_type_eq CONTEST_CATEGORY_TOUGH, Erratic_CuteSmartTough + if_contest_type_eq CONTEST_CATEGORY_CUTE, AI_Erratic_CuteSmartTough + if_contest_type_eq CONTEST_CATEGORY_SMART, AI_Erratic_CuteSmartTough + if_contest_type_eq CONTEST_CATEGORY_TOUGH, AI_Erratic_CuteSmartTough end -Erratic_CuteSmartTough: - if_random_less_than 125, Erratic_NoScoreIncrease +AI_Erratic_CuteSmartTough: + if_random_less_than 125, AI_Erratic_End score +10 end -Erratic_NoScoreIncrease: +AI_Erratic_End: end -AI_CheckForBadMove: - if_effect_eq CONTEST_EFFECT_STARTLE_FRONT_MON, ContestEffect2_8 - if_effect_eq CONTEST_EFFECT_STARTLE_PREV_MON, ContestEffect2_8 - if_effect_eq CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, ContestEffect2_8 - if_effect_eq CONTEST_EFFECT_STARTLE_PREV_MON_2, ContestEffect2_8 - if_effect_eq CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, ContestEffect2_8 - if_effect_eq CONTEST_EFFECT_BETTER_IF_SAME_TYPE, ContestEffect2_8 - if_effect_eq CONTEST_EFFECT_BETTER_IF_DIFF_TYPE, ContestEffect2_8 - if_effect_eq CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, ContestEffect2_8 - if_effect_eq CONTEST_EFFECT_SLIGHTLY_STARTLE_PREV_MONS, ContestEffect2_9 - if_effect_eq CONTEST_EFFECT_STARTLE_PREV_MONS, ContestEffect2_9 - if_effect_eq CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, ContestEffect2_9 - if_effect_eq CONTEST_EFFECT_STARTLE_PREV_MONS_2, ContestEffect2_9 - if_effect_eq CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, ContestEffect2_9 - if_effect_eq CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, ContestEffect2_9 - if_effect_eq CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, ContestEffect2_9 - if_effect_eq CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, ContestEffect2_9 - if_effect_eq CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, ContestEffect2_9 - if_effect_eq CONTEST_EFFECT_STARTLE_MONS_COOL_APPEAL, ContestEffect2_9 - if_effect_eq CONTEST_EFFECT_STARTLE_MONS_BEAUTY_APPEAL, ContestEffect2_9 - if_effect_eq CONTEST_EFFECT_STARTLE_MONS_CUTE_APPEAL, ContestEffect2_9 - if_effect_eq CONTEST_EFFECT_STARTLE_MONS_SMART_APPEAL, ContestEffect2_9 - if_effect_eq CONTEST_EFFECT_STARTLE_MONS_TOUGH_APPEAL, ContestEffect2_9 - if_effect_eq CONTEST_EFFECT_BADLY_STARTLES_MONS_IN_GOOD_CONDITION, ContestEffect2_9 - if_effect_eq CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, ContestEffect2_9 - if_effect_eq CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, ContestEffect2_9 - if_effect_eq CONTEST_EFFECT_MAKE_FOLLOWING_MON_NERVOUS, ContestEffect2_25 - if_effect_eq CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, ContestEffect2_26 - if_effect_eq CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, ContestEffect2_26 - if_effect_eq CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, ContestEffect2_38 - if_effect_eq CONTEST_EFFECT_AVOID_STARTLE_ONCE, ContestEffect2_4 - if_effect_eq CONTEST_EFFECT_AVOID_STARTLE, ContestEffect2_4 - if_effect_eq CONTEST_EFFECT_AVOID_STARTLE_SLIGHTLY, ContestEffect2_4 - if_effect_eq CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, ContestEffect2_2 +@ Checks if move should be discouraged based on its effect +AI_CheckBadMove: + if_effect_eq CONTEST_EFFECT_STARTLE_FRONT_MON, AI_CBM_DependsOnPrevMon + if_effect_eq CONTEST_EFFECT_STARTLE_PREV_MON, AI_CBM_DependsOnPrevMon + if_effect_eq CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, AI_CBM_DependsOnPrevMon + if_effect_eq CONTEST_EFFECT_STARTLE_PREV_MON_2, AI_CBM_DependsOnPrevMon + if_effect_eq CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, AI_CBM_DependsOnPrevMon + if_effect_eq CONTEST_EFFECT_BETTER_IF_SAME_TYPE, AI_CBM_DependsOnPrevMon + if_effect_eq CONTEST_EFFECT_BETTER_IF_DIFF_TYPE, AI_CBM_DependsOnPrevMon + if_effect_eq CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, AI_CBM_DependsOnPrevMon + if_effect_eq CONTEST_EFFECT_SLIGHTLY_STARTLE_PREV_MONS, AI_CBM_DependsOnPrevMons + if_effect_eq CONTEST_EFFECT_STARTLE_PREV_MONS, AI_CBM_DependsOnPrevMons + if_effect_eq CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, AI_CBM_DependsOnPrevMons + if_effect_eq CONTEST_EFFECT_STARTLE_PREV_MONS_2, AI_CBM_DependsOnPrevMons + if_effect_eq CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, AI_CBM_DependsOnPrevMons + if_effect_eq CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, AI_CBM_DependsOnPrevMons + if_effect_eq CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, AI_CBM_DependsOnPrevMons + if_effect_eq CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, AI_CBM_DependsOnPrevMons + if_effect_eq CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, AI_CBM_DependsOnPrevMons + if_effect_eq CONTEST_EFFECT_STARTLE_MONS_COOL_APPEAL, AI_CBM_DependsOnPrevMons + if_effect_eq CONTEST_EFFECT_STARTLE_MONS_BEAUTY_APPEAL, AI_CBM_DependsOnPrevMons + if_effect_eq CONTEST_EFFECT_STARTLE_MONS_CUTE_APPEAL, AI_CBM_DependsOnPrevMons + if_effect_eq CONTEST_EFFECT_STARTLE_MONS_SMART_APPEAL, AI_CBM_DependsOnPrevMons + if_effect_eq CONTEST_EFFECT_STARTLE_MONS_TOUGH_APPEAL, AI_CBM_DependsOnPrevMons + if_effect_eq CONTEST_EFFECT_BADLY_STARTLES_MONS_IN_GOOD_CONDITION, AI_CBM_DependsOnPrevMons + if_effect_eq CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, AI_CBM_DependsOnPrevMons + if_effect_eq CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, AI_CBM_DependsOnPrevMons + if_effect_eq CONTEST_EFFECT_MAKE_FOLLOWING_MON_NERVOUS, AI_CBM_DependsOnNextMon + if_effect_eq CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, AI_CBM_DependsOnNextMons + if_effect_eq CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, AI_CBM_DependsOnNextMons + if_effect_eq CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, AI_CBM_ImproveCondition + if_effect_eq CONTEST_EFFECT_AVOID_STARTLE_ONCE, AI_CBM_AvoidStartle + if_effect_eq CONTEST_EFFECT_AVOID_STARTLE, AI_CBM_AvoidStartle + if_effect_eq CONTEST_EFFECT_AVOID_STARTLE_SLIGHTLY, AI_CBM_AvoidStartle + if_effect_eq CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, AI_CBM_NoMoreMoves end -ContestEffect2_8: - if_user_order_eq MON_1, ContestEffect2_8_score1 - if_user_order_eq MON_2, ContestEffect2_8_score2 - if_user_order_eq MON_3, ContestEffect2_8_score3 - if_user_order_eq MON_4, ContestEffect2_8_score4 +@ If previous mon is skipping turn (or user is first), discourage move +AI_CBM_DependsOnPrevMon: + if_user_order_eq MON_1, AI_CBM_DependsOnPrevMon_1stUp + if_user_order_eq MON_2, AI_CBM_DependsOnPrevMon_2ndUp + if_user_order_eq MON_3, AI_CBM_DependsOnPrevMon_3rdUp + if_user_order_eq MON_4, AI_CBM_DependsOnPrevMon_Last end -ContestEffect2_8_score1: +AI_CBM_DependsOnPrevMon_1stUp: score -10 end -ContestEffect2_8_score2: - if_can_participate MON_1, ContestEffectEnd2 +AI_CBM_DependsOnPrevMon_2ndUp: + if_can_participate MON_1, AI_CBM_End score -10 end -ContestEffect2_8_score3: - if_can_participate MON_2, ContestEffectEnd2 +AI_CBM_DependsOnPrevMon_3rdUp: + if_can_participate MON_2, AI_CBM_End score -10 end -ContestEffect2_8_score4: - if_can_participate MON_3, ContestEffectEnd2 +AI_CBM_DependsOnPrevMon_Last: + if_can_participate MON_3, AI_CBM_End score -10 end -ContestEffect2_9: - if_user_order_eq MON_1, ContestEffect2_9_score1 - if_user_order_eq MON_2, ContestEffect2_9_score2 - if_user_order_eq MON_3, ContestEffect2_9_score3 - if_user_order_eq MON_4, ContestEffect2_9_score4 +@ If previous mons are all skipping turns (or user is first), discourage move +AI_CBM_DependsOnPrevMons: + if_user_order_eq MON_1, AI_CBM_DependsOnPrevMons_1stUp + if_user_order_eq MON_2, AI_CBM_DependsOnPrevMons_2ndUp + if_user_order_eq MON_3, AI_CBM_DependsOnPrevMons_3rdUp + if_user_order_eq MON_4, AI_CBM_DependsOnPrevMons_Last end -ContestEffect2_9_score1: +AI_CBM_DependsOnPrevMons_1stUp: score -20 end -ContestEffect2_9_score2: - if_can_participate MON_1, ContestEffectEnd2 +AI_CBM_DependsOnPrevMons_2ndUp: + if_can_participate MON_1, AI_CBM_End score -15 end -ContestEffect2_9_score3: - if_can_participate MON_1, ContestEffectEnd2 - if_can_participate MON_2, ContestEffectEnd2 +AI_CBM_DependsOnPrevMons_3rdUp: + if_can_participate MON_1, AI_CBM_End + if_can_participate MON_2, AI_CBM_End score -15 end -ContestEffect2_9_score4: - if_can_participate MON_1, ContestEffectEnd2 - if_can_participate MON_2, ContestEffectEnd2 - if_can_participate MON_3, ContestEffectEnd2 +AI_CBM_DependsOnPrevMons_Last: + if_can_participate MON_1, AI_CBM_End + if_can_participate MON_2, AI_CBM_End + if_can_participate MON_3, AI_CBM_End score -15 end -ContestEffect2_25: - if_user_order_eq MON_1, ContestEffect2_25_score1 - if_user_order_eq MON_2, ContestEffect2_25_score2 - if_user_order_eq MON_3, ContestEffect2_25_score3 +@ If next mon is skipping turn (or user is last), discourage move +AI_CBM_DependsOnNextMon: + if_user_order_eq MON_1, AI_CBM_DependsOnNextMon_1stUp + if_user_order_eq MON_2, AI_CBM_DependsOnNextMon_2ndUp + if_user_order_eq MON_3, AI_CBM_DependsOnNextMon_3rdUp score -10 end -ContestEffect2_25_score1: - if_can_participate MON_2, ContestEffectEnd2 +AI_CBM_DependsOnNextMon_1stUp: + if_can_participate MON_2, AI_CBM_End score -10 end -ContestEffect2_25_score2: - if_can_participate MON_3, ContestEffectEnd2 +AI_CBM_DependsOnNextMon_2ndUp: + if_can_participate MON_3, AI_CBM_End score -10 end -ContestEffect2_25_score3: - if_can_participate MON_4, ContestEffectEnd2 +AI_CBM_DependsOnNextMon_3rdUp: + if_can_participate MON_4, AI_CBM_End score -10 end -ContestEffect2_26: - if_user_order_eq MON_1, ContestEffect2_26_score1 - if_user_order_eq MON_2, ContestEffect2_26_score2 - if_user_order_eq MON_3, ContestEffect2_26_score3 +@ If next mons are all skipping turns (or user is last), discourage move +AI_CBM_DependsOnNextMons: + if_user_order_eq MON_1, AI_CBM_DependsOnNextMons_1stUp + if_user_order_eq MON_2, AI_CBM_DependsOnNextMons_2ndUp + if_user_order_eq MON_3, AI_CBM_DependsOnNextMons_3rdUp score -10 end -ContestEffect2_26_score1: - if_can_participate MON_2, ContestEffectEnd2 - if_can_participate MON_3, ContestEffectEnd2 - if_can_participate MON_4, ContestEffectEnd2 +AI_CBM_DependsOnNextMons_1stUp: + if_can_participate MON_2, AI_CBM_End + if_can_participate MON_3, AI_CBM_End + if_can_participate MON_4, AI_CBM_End score -10 end -ContestEffect2_26_score2: - if_can_participate MON_3, ContestEffectEnd2 - if_can_participate MON_4, ContestEffectEnd2 +AI_CBM_DependsOnNextMons_2ndUp: + if_can_participate MON_3, AI_CBM_End + if_can_participate MON_4, AI_CBM_End score -10 end -ContestEffect2_26_score3: - if_can_participate MON_4, ContestEffectEnd2 +AI_CBM_DependsOnNextMons_3rdUp: + if_can_participate MON_4, AI_CBM_End score -10 end -ContestEffect2_38: - if_user_condition_less_than 3, ContestEffectEnd2 +@ If at max condition, discourage move +AI_CBM_ImproveCondition: + if_user_condition_less_than 3, AI_CBM_End score -20 end -ContestEffect2_4: - if_user_order_eq MON_1, ContestEffect2_4_score1 - if_user_order_eq MON_2, ContestEffect2_4_score2 - if_user_order_eq MON_3, ContestEffect2_4_score3 +@ If there are no upcoming mons who can make an appeal (or if user is last), discourage move +@ Identical to AI_CBM_DependsOnNextMons +AI_CBM_AvoidStartle: + if_user_order_eq MON_1, AI_CBM_AvoidStartle_1stUp + if_user_order_eq MON_2, AI_CBM_AvoidStartle_2ndUp + if_user_order_eq MON_3, AI_CBM_AvoidStartle_3rdUp score -10 end -ContestEffect2_4_score1: - if_can_participate MON_2, ContestEffectEnd2 - if_can_participate MON_3, ContestEffectEnd2 - if_can_participate MON_4, ContestEffectEnd2 +AI_CBM_AvoidStartle_1stUp: + if_can_participate MON_2, AI_CBM_End + if_can_participate MON_3, AI_CBM_End + if_can_participate MON_4, AI_CBM_End score -10 end -ContestEffect2_4_score2: - if_can_participate MON_3, ContestEffectEnd2 - if_can_participate MON_4, ContestEffectEnd2 +AI_CBM_AvoidStartle_2ndUp: + if_can_participate MON_3, AI_CBM_End + if_can_participate MON_4, AI_CBM_End score -10 end -ContestEffect2_4_score3: - if_can_participate MON_4, ContestEffectEnd2 +AI_CBM_AvoidStartle_3rdUp: + if_can_participate MON_4, AI_CBM_End score -10 end -ContestEffect2_2: - if_appeal_num_eq 0, ContestEffect2_2_score1 - if_appeal_num_eq 1, ContestEffect2_2_score2 - if_appeal_num_eq 2, ContestEffect2_2_score3 - if_appeal_num_eq 3, ContestEffect2_2_score4 - if_last_appeal ContestEffect2_2_score5 +@ Very good if its the last appeal, otherwise discourage move +AI_CBM_NoMoreMoves: + if_appeal_num_eq 0, AI_CBM_NoMoreMoves_1stAppeal + if_appeal_num_eq 1, AI_CBM_NoMoreMoves_2ndAppeal + if_appeal_num_eq 2, AI_CBM_NoMoreMoves_3rdAppeal + if_appeal_num_eq 3, AI_CBM_NoMoreMoves_4thAppeal + if_last_appeal AI_CBM_NoMoreMoves_LastAppeal end -ContestEffect2_2_score1: - if_random_less_than 20, ContestEffectEnd2 +AI_CBM_NoMoreMoves_1stAppeal: + if_random_less_than 20, AI_CBM_End score -15 end -ContestEffect2_2_score2: - if_random_less_than 40, ContestEffectEnd2 +AI_CBM_NoMoreMoves_2ndAppeal: + if_random_less_than 40, AI_CBM_End score -15 end -ContestEffect2_2_score3: - if_random_less_than 60, ContestEffectEnd2 +AI_CBM_NoMoreMoves_3rdAppeal: + if_random_less_than 60, AI_CBM_End score -15 end -ContestEffect2_2_score4: - if_random_less_than 80, ContestEffectEnd2 +AI_CBM_NoMoreMoves_4thAppeal: + if_random_less_than 80, AI_CBM_End score -15 end -ContestEffect2_2_score5: - if_random_less_than 20, ContestEffectEnd2 +AI_CBM_NoMoreMoves_LastAppeal: + if_random_less_than 20, AI_CBM_End score +20 end -ContestEffectEnd2: +AI_CBM_End: end +@ Encourages/discourages move affected by the move order +@ e.g. use BETTER_IF_FIRST moves if user is first, dont use AVOID_STARTLE moves if last AI_CheckOrder: - if_user_order_eq MON_1, AI_effectcheck1_081DCA4C - if_user_order_eq MON_2, AI_effectcheck2_081DCA4C - if_user_order_eq MON_3, AI_effectcheck3_081DCA4C - if_user_order_eq MON_4, AI_effectcheck4_081DCA4C + if_user_order_eq MON_1, AI_CheckOrder_1stUp + if_user_order_eq MON_2, AI_CheckOrder_2ndUp + if_user_order_eq MON_3, AI_CheckOrder_3rdUp + if_user_order_eq MON_4, AI_CheckOrder_Last end -AI_effectcheck1_081DCA4C: - if_effect_eq CONTEST_EFFECT_BETTER_IF_FIRST, AI_score1_081DCA4C - if_effect_eq CONTEST_EFFECT_BETTER_WHEN_LATER, AI_score2_081DCA4C - if_effect_type_eq 1, AI_random1_081DCA4C +AI_CheckOrder_1stUp: + if_effect_eq CONTEST_EFFECT_BETTER_IF_FIRST, AI_CheckOrder_1stUp_Encourage + if_effect_eq CONTEST_EFFECT_BETTER_WHEN_LATER, AI_CheckOrder_1stUp_Discourage + if_effect_type_eq CONTEST_EFFECT_TYPE_AVOID_STARTLE, AI_CheckOrder_1stUp_RandomEncourage end -AI_score1_081DCA4C: +AI_CheckOrder_1stUp_Encourage: score +15 end -AI_score2_081DCA4C: +AI_CheckOrder_1stUp_Discourage: score -15 end -AI_random1_081DCA4C: - if_random_less_than 100, ContestEffectEnd2 +AI_CheckOrder_1stUp_RandomEncourage: + if_random_less_than 100, AI_CBM_End score +10 end -AI_effectcheck2_081DCA4C: - if_effect_eq CONTEST_EFFECT_BETTER_WHEN_LATER, AI_score3_081DCA4C - if_effect_type_eq 1, AI_random2_081DCA4C +AI_CheckOrder_2ndUp: + if_effect_eq CONTEST_EFFECT_BETTER_WHEN_LATER, AI_CheckOrder_2ndUp_Discourage + if_effect_type_eq CONTEST_EFFECT_TYPE_AVOID_STARTLE, AI_CheckOrder_2ndUp_RandomEncourage end -AI_score3_081DCA4C: +AI_CheckOrder_2ndUp_Discourage: score -5 end -AI_random2_081DCA4C: - if_random_less_than 125, ContestEffectEnd2 +AI_CheckOrder_2ndUp_RandomEncourage: + if_random_less_than 125, AI_CBM_End score +10 end -AI_effectcheck3_081DCA4C: - if_effect_eq CONTEST_EFFECT_BETTER_WHEN_LATER, AI_score4_081DCA4C - if_effect_eq CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, AI_score4_081DCA4C - if_effect_eq CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, AI_score4_081DCA4C +AI_CheckOrder_3rdUp: + if_effect_eq CONTEST_EFFECT_BETTER_WHEN_LATER, AI_CheckOrder_3rdUp_Encourage + if_effect_eq CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, AI_CheckOrder_3rdUp_Encourage + if_effect_eq CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, AI_CheckOrder_3rdUp_Encourage end -AI_score4_081DCA4C: +AI_CheckOrder_3rdUp_Encourage: score +5 end -AI_effectcheck4_081DCA4C: - if_effect_eq CONTEST_EFFECT_BETTER_WHEN_LATER, AI_score5_081DCA4C - if_effect_eq CONTEST_EFFECT_BETTER_IF_LAST, AI_score5_081DCA4C - if_effect_eq CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, AI_score5_081DCA4C - if_effect_eq CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, AI_score5_081DCA4C - if_effect_eq CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, AI_score7_081DCA4C - if_effect_type_eq 1, AI_score6_081DCA4C - if_effect_type_eq 3, AI_random3_081DCA4C +AI_CheckOrder_Last: + if_effect_eq CONTEST_EFFECT_BETTER_WHEN_LATER, AI_CheckOrder_Last_StronglyEncourage + if_effect_eq CONTEST_EFFECT_BETTER_IF_LAST, AI_CheckOrder_Last_StronglyEncourage + if_effect_eq CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, AI_CheckOrder_Last_StronglyEncourage + if_effect_eq CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, AI_CheckOrder_Last_StronglyEncourage + if_effect_eq CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN, AI_CheckOrder_Last_Encourage + if_effect_type_eq CONTEST_EFFECT_TYPE_AVOID_STARTLE, AI_CheckOrder_Last_Discourage + if_effect_type_eq CONTEST_EFFECT_TYPE_STARTLE_MONS, AI_CheckOrder_Last_RandomEncourage end -AI_score5_081DCA4C: +AI_CheckOrder_Last_StronglyEncourage: score +15 end -AI_score6_081DCA4C: +AI_CheckOrder_Last_Discourage: score -10 end -AI_random3_081DCA4C: - if_random_less_than 125, ContestEffectEnd2 +AI_CheckOrder_Last_RandomEncourage: + if_random_less_than 125, AI_CBM_End score +10 end -AI_score7_081DCA4C: +AI_CheckOrder_Last_Encourage: score +5 end diff --git a/include/constants/contest.h b/include/constants/contest.h index 5ec4c4f69..9eb6b26e4 100644 --- a/include/constants/contest.h +++ b/include/constants/contest.h @@ -52,6 +52,37 @@ #define CONTEST_AI_CHECK_ORDER (1 << 4) #define CONTEST_AI_CHECK_GOOD_MOVE (1 << 5) #define CONTEST_AI_ERRATIC (1 << 6) +#define CONTEST_AI_DUMMY_1 (1 << 7) +#define CONTEST_AI_DUMMY_2 (1 << 8) +#define CONTEST_AI_DUMMY_3 (1 << 9) +#define CONTEST_AI_DUMMY_4 (1 << 10) +#define CONTEST_AI_DUMMY_5 (1 << 11) +#define CONTEST_AI_DUMMY_6 (1 << 12) +#define CONTEST_AI_DUMMY_7 (1 << 13) +#define CONTEST_AI_DUMMY_8 (1 << 14) +#define CONTEST_AI_DUMMY_9 (1 << 15) +#define CONTEST_AI_DUMMY_10 (1 << 16) +#define CONTEST_AI_DUMMY_11 (1 << 17) +#define CONTEST_AI_DUMMY_12 (1 << 18) +#define CONTEST_AI_DUMMY_13 (1 << 19) +#define CONTEST_AI_DUMMY_14 (1 << 20) +#define CONTEST_AI_DUMMY_15 (1 << 21) +#define CONTEST_AI_DUMMY_16 (1 << 22) +#define CONTEST_AI_DUMMY_17 (1 << 23) +#define CONTEST_AI_DUMMY_18 (1 << 24) +#define CONTEST_AI_DUMMY_19 (1 << 25) +#define CONTEST_AI_DUMMY_20 (1 << 26) +#define CONTEST_AI_DUMMY_21 (1 << 27) +#define CONTEST_AI_DUMMY_22 (1 << 28) +#define CONTEST_AI_DUMMY_23 (1 << 29) +#define CONTEST_AI_DUMMY_24 (1 << 30) +#define CONTEST_AI_DUMMY_25 (1 << 31) + +// The below scripts are used by every AI contest opponent +// It includes every non-dummy script +#define CONTEST_AI_COMMON (CONTEST_AI_CHECK_BAD_MOVE | CONTEST_AI_CHECK_COMBO | CONTEST_AI_CHECK_BORING | \ + CONTEST_AI_CHECK_EXCITEMENT | CONTEST_AI_CHECK_ORDER | CONTEST_AI_CHECK_GOOD_MOVE | CONTEST_AI_ERRATIC | \ + CONTEST_AI_DUMMY_1 | CONTEST_AI_DUMMY_2 | CONTEST_AI_DUMMY_3 | CONTEST_AI_DUMMY_4 | CONTEST_AI_DUMMY_5) #define CONTEST_EFFECT_HIGHLY_APPEALING 0 #define CONTEST_EFFECT_USER_MORE_EASILY_STARTLED 1 @@ -102,6 +133,16 @@ #define CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED 46 #define CONTEST_EFFECT_DONT_EXCITE_AUDIENCE 47 +// Each of the above effects is grouped into one of these effect type categories +// Only a few of these get checked by the AI, the rest go unused +#define CONTEST_EFFECT_TYPE_APPEAL 0 +#define CONTEST_EFFECT_TYPE_AVOID_STARTLE 1 +#define CONTEST_EFFECT_TYPE_STARTLE_MON 2 +#define CONTEST_EFFECT_TYPE_STARTLE_MONS 3 +#define CONTEST_EFFECT_TYPE_WORSEN 4 +#define CONTEST_EFFECT_TYPE_SPECIAL_APPEAL 5 +#define CONTEST_EFFECT_TYPE_TURN_ORDER 6 + #define COMBO_STARTER_RAIN_DANCE 1 #define COMBO_STARTER_RAGE 2 #define COMBO_STARTER_FOCUS_ENERGY 3 diff --git a/include/contest.h b/include/contest.h index d53aec212..1dd4340bd 100644 --- a/include/contest.h +++ b/include/contest.h @@ -90,7 +90,7 @@ struct ContestPokemon u8 nickname[POKEMON_NAME_LENGTH + 1]; u8 trainerName[PLAYER_NAME_LENGTH + 1]; u8 trainerGfxId; - u32 aiChecks; + u32 aiFlags; u8 whichRank:2; u8 aiPool_Cool:1; u8 aiPool_Beauty:1; @@ -231,8 +231,8 @@ struct ContestAIInfo /*0x05*/ u8 moveScores[MAX_MON_MOVES]; /*0x09*/ u8 aiAction; /*0x0A*/ u8 filler[6]; - /*0x10*/ u8 currentAICheck; - /*0x14*/ u32 aiChecks; + /*0x10*/ u8 currentAIFlag; + /*0x14*/ u32 aiFlags; /*0x18*/ s16 scriptResult; /*0x1A*/ s16 vars[3]; /*0x20*/ const u8 *stack[8]; diff --git a/src/contest.c b/src/contest.c index 32a8675e5..af9e734fa 100644 --- a/src/contest.c +++ b/src/contest.c @@ -2789,7 +2789,7 @@ void CreateContestMonFromParty(u8 partyIndex) gContestMons[gContestPlayerMonIndex].trainerGfxId = OBJ_EVENT_GFX_LINK_BRENDAN; else gContestMons[gContestPlayerMonIndex].trainerGfxId = OBJ_EVENT_GFX_LINK_MAY; - gContestMons[gContestPlayerMonIndex].aiChecks = 0; + gContestMons[gContestPlayerMonIndex].aiFlags = 0; gContestMons[gContestPlayerMonIndex].highestRank = 0; gContestMons[gContestPlayerMonIndex].species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES); GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, name); @@ -5620,7 +5620,7 @@ void ClearContestWinnerPicsInContestHall(void) s32 i; for (i = 0; i < 8; i++) - gSaveBlock1Ptr->contestWinners[i] = gUnknown_08587FA4[i]; + gSaveBlock1Ptr->contestWinners[i] = gDefaultContestWinners[i]; } static void SetContestLiveUpdateFlags(u8 contestant) diff --git a/src/contest_ai.c b/src/contest_ai.c index 463553998..2f048718f 100644 --- a/src/contest_ai.c +++ b/src/contest_ai.c @@ -7,7 +7,7 @@ #include "constants/moves.h" extern const u8 *gAIScriptPtr; -extern const u8 *gContestAIChecks[]; +extern const u8 *gContestAI_ScriptsTable[]; static void ContestAICmd_score(void); static void ContestAICmd_get_appeal_num(void); @@ -144,7 +144,7 @@ static void ContestAICmd_if_user_has_exciting_move(void); static void ContestAICmd_if_user_doesnt_have_exciting_move(void); static void ContestAICmd_check_user_has_move(void); static void ContestAICmd_if_user_has_move(void); -static void ContestAICmd_if_effect_in_user_moveset(void); +static void ContestAICmd_if_user_doesnt_have_move(void); typedef void (* ContestAICmdFunc)(void); @@ -285,7 +285,7 @@ static const ContestAICmdFunc sContestAICmdTable[] = ContestAICmd_if_user_doesnt_have_exciting_move, // 0x84 ContestAICmd_check_user_has_move, // 0x85 ContestAICmd_if_user_has_move, // 0x86 - ContestAICmd_if_effect_in_user_moveset, // 0x87 + ContestAICmd_if_user_doesnt_have_move, // 0x87 }; static void ContestAI_DoAIProcessing(void); @@ -303,20 +303,20 @@ void ContestAI_ResetAI(u8 contestantAI) eContestAI.contestantId = contestantAI; eContestAI.stackSize = 0; - eContestAI.aiChecks = gContestMons[eContestAI.contestantId].aiChecks; + eContestAI.aiFlags = gContestMons[eContestAI.contestantId].aiFlags; } u8 ContestAI_GetActionToUse(void) { - while (eContestAI.aiChecks != 0) + while (eContestAI.aiFlags != 0) { - if (eContestAI.aiChecks & 1) + if (eContestAI.aiFlags & 1) { eContestAI.aiState = CONTESTAI_SETTING_UP; ContestAI_DoAIProcessing(); } - eContestAI.aiChecks >>= 1; - eContestAI.currentAICheck++; + eContestAI.aiFlags >>= 1; + eContestAI.currentAIFlag++; eContestAI.nextMoveIndex = 0; } @@ -346,7 +346,7 @@ static void ContestAI_DoAIProcessing(void) case CONTESTAI_DO_NOT_PROCESS: break; case CONTESTAI_SETTING_UP: - gAIScriptPtr = gContestAIChecks[eContestAI.currentAICheck]; + gAIScriptPtr = gContestAI_ScriptsTable[eContestAI.currentAIFlag]; if (gContestMons[eContestAI.contestantId].moves[eContestAI.nextMoveIndex] == MOVE_NONE) eContestAI.nextMove = MOVE_NONE; // don't process a move that doesn't exist. @@ -1627,7 +1627,8 @@ static void ContestAICmd_if_not_eq_var(void) } // UB: Should just be comparing to gAIScriptPtr[1] in the functions below -// With the values passed to if_random_less_than this goes way OOB on vars +// The values passed via gAIScriptPtr[1] range from 0-255 +// and vars is an s16[3], so this goes way out of bounds static void ContestAICmd_if_random_less_than(void) { #ifndef UBFIX @@ -1729,6 +1730,12 @@ static void ContestAICmd_if_user_doesnt_have_exciting_move(void) gAIScriptPtr += 4; } +// BUG: This is checking if the user has a specific move, but when it's used in the AI script +// they're checking for an effect. Checking for a specific effect would make more sense, +// but given that effects are normally read as a single byte and this reads 2 bytes, it +// seems reading a move was intended and the AI script is using it incorrectly. +// In any case, to fix it to correctly check for effects replace the u16 move assignment with +// u16 move = gContestMoves[gContestMons[eContestAI.contestantId].moves[i]].effect; static void ContestAICmd_check_user_has_move(void) { int hasMove = FALSE; @@ -1759,7 +1766,7 @@ static void ContestAICmd_if_user_has_move(void) gAIScriptPtr += 4; } -static void ContestAICmd_if_effect_in_user_moveset(void) +static void ContestAICmd_if_user_doesnt_have_move(void) { ContestAICmd_check_user_has_move(); diff --git a/src/data/contest_moves.h b/src/data/contest_moves.h index 5460ac806..658528210 100644 --- a/src/data/contest_moves.h +++ b/src/data/contest_moves.h @@ -2838,289 +2838,289 @@ const struct ContestEffect gContestEffects[] = { [CONTEST_EFFECT_HIGHLY_APPEALING] = { - .effectType = 0, + .effectType = CONTEST_EFFECT_TYPE_APPEAL, .appeal = 40, .jam = 0, }, [CONTEST_EFFECT_USER_MORE_EASILY_STARTLED] = { - .effectType = 0, + .effectType = CONTEST_EFFECT_TYPE_APPEAL, .appeal = 60, .jam = 0, }, [CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES] = { - .effectType = 0, + .effectType = CONTEST_EFFECT_TYPE_APPEAL, .appeal = 80, .jam = 0, }, [CONTEST_EFFECT_REPETITION_NOT_BORING] = { - .effectType = 0, + .effectType = CONTEST_EFFECT_TYPE_APPEAL, .appeal = 30, .jam = 0, }, [CONTEST_EFFECT_AVOID_STARTLE_ONCE] = { - .effectType = 1, + .effectType = CONTEST_EFFECT_TYPE_AVOID_STARTLE, .appeal = 20, .jam = 0, }, [CONTEST_EFFECT_AVOID_STARTLE] = { - .effectType = 1, + .effectType = CONTEST_EFFECT_TYPE_AVOID_STARTLE, .appeal = 10, .jam = 0, }, [CONTEST_EFFECT_AVOID_STARTLE_SLIGHTLY] = { - .effectType = 1, + .effectType = CONTEST_EFFECT_TYPE_AVOID_STARTLE, .appeal = 30, .jam = 0, }, [CONTEST_EFFECT_USER_LESS_EASILY_STARTLED] = { - .effectType = 1, + .effectType = CONTEST_EFFECT_TYPE_AVOID_STARTLE, .appeal = 30, .jam = 0, }, [CONTEST_EFFECT_STARTLE_FRONT_MON] = { - .effectType = 2, + .effectType = CONTEST_EFFECT_TYPE_STARTLE_MON, .appeal = 30, .jam = 20, }, [CONTEST_EFFECT_SLIGHTLY_STARTLE_PREV_MONS] = { - .effectType = 3, + .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 30, .jam = 10, }, [CONTEST_EFFECT_STARTLE_PREV_MON] = { - .effectType = 2, + .effectType = CONTEST_EFFECT_TYPE_STARTLE_MON, .appeal = 20, .jam = 30, }, [CONTEST_EFFECT_STARTLE_PREV_MONS] = { - .effectType = 3, + .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 20, .jam = 20, }, [CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON] = { - .effectType = 2, + .effectType = CONTEST_EFFECT_TYPE_STARTLE_MON, .appeal = 10, .jam = 40, }, [CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS] = { - .effectType = 3, + .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 10, .jam = 30, }, [CONTEST_EFFECT_STARTLE_PREV_MON_2] = { - .effectType = 2, + .effectType = CONTEST_EFFECT_TYPE_STARTLE_MON, .appeal = 30, .jam = 20, }, [CONTEST_EFFECT_STARTLE_PREV_MONS_2] = { - .effectType = 3, + .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 30, .jam = 10, }, [CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION] = { - .effectType = 4, + .effectType = CONTEST_EFFECT_TYPE_WORSEN, .appeal = 30, .jam = 0, }, [CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION] = { - .effectType = 3, + .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 20, .jam = 10, }, [CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN] = { - .effectType = 3, + .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 40, .jam = 40, }, [CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL] = { - .effectType = 3, + .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 20, .jam = 10, }, [CONTEST_EFFECT_STARTLE_MONS_COOL_APPEAL] = { - .effectType = 3, + .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 20, .jam = 10, }, [CONTEST_EFFECT_STARTLE_MONS_BEAUTY_APPEAL] = { - .effectType = 3, + .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 20, .jam = 10, }, [CONTEST_EFFECT_STARTLE_MONS_CUTE_APPEAL] = { - .effectType = 3, + .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 20, .jam = 10, }, [CONTEST_EFFECT_STARTLE_MONS_SMART_APPEAL] = { - .effectType = 3, + .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 20, .jam = 10, }, [CONTEST_EFFECT_STARTLE_MONS_TOUGH_APPEAL] = { - .effectType = 3, + .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 20, .jam = 10, }, [CONTEST_EFFECT_MAKE_FOLLOWING_MON_NERVOUS] = { - .effectType = 4, + .effectType = CONTEST_EFFECT_TYPE_WORSEN, .appeal = 20, .jam = 0, }, [CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS] = { - .effectType = 4, + .effectType = CONTEST_EFFECT_TYPE_WORSEN, .appeal = 20, .jam = 0, }, [CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS] = { - .effectType = 4, + .effectType = CONTEST_EFFECT_TYPE_WORSEN, .appeal = 30, .jam = 0, }, [CONTEST_EFFECT_BADLY_STARTLES_MONS_IN_GOOD_CONDITION] = { - .effectType = 3, + .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 30, .jam = 10, }, [CONTEST_EFFECT_BETTER_IF_FIRST] = { - .effectType = 5, + .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 20, .jam = 0, }, [CONTEST_EFFECT_BETTER_IF_LAST] = { - .effectType = 5, + .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 20, .jam = 0, }, [CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES] = { - .effectType = 5, + .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 10, .jam = 0, }, [CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE] = { - .effectType = 5, + .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 10, .jam = 0, }, [CONTEST_EFFECT_BETTER_WHEN_LATER] = { - .effectType = 5, + .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 10, .jam = 0, }, [CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING] = { - .effectType = 5, + .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 10, .jam = 0, }, [CONTEST_EFFECT_BETTER_IF_SAME_TYPE] = { - .effectType = 5, + .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 20, .jam = 0, }, [CONTEST_EFFECT_BETTER_IF_DIFF_TYPE] = { - .effectType = 5, + .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 20, .jam = 0, }, [CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL] = { - .effectType = 5, + .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 30, .jam = 0, }, [CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS] = { - .effectType = 5, + .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 10, .jam = 0, }, [CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION] = { - .effectType = 5, + .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 10, .jam = 0, }, [CONTEST_EFFECT_NEXT_APPEAL_EARLIER] = { - .effectType = 6, + .effectType = CONTEST_EFFECT_TYPE_TURN_ORDER, .appeal = 30, .jam = 0, }, [CONTEST_EFFECT_NEXT_APPEAL_LATER] = { - .effectType = 6, + .effectType = CONTEST_EFFECT_TYPE_TURN_ORDER, .appeal = 30, .jam = 0, }, [CONTEST_EFFECT_MAKE_SCRAMBLING_TURN_ORDER_EASIER] = { - .effectType = 6, + .effectType = CONTEST_EFFECT_TYPE_TURN_ORDER, .appeal = 30, .jam = 0, }, [CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER] = { - .effectType = 6, + .effectType = CONTEST_EFFECT_TYPE_TURN_ORDER, .appeal = 30, .jam = 0, }, [CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST] = { - .effectType = 5, + .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 10, .jam = 0, }, [CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS] = { - .effectType = 3, + .effectType = CONTEST_EFFECT_TYPE_STARTLE_MONS, .appeal = 20, .jam = 10, }, [CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED] = { - .effectType = 5, + .effectType = CONTEST_EFFECT_TYPE_SPECIAL_APPEAL, .appeal = 10, .jam = 0, }, [CONTEST_EFFECT_DONT_EXCITE_AUDIENCE] = { - .effectType = 4, + .effectType = CONTEST_EFFECT_TYPE_WORSEN, .appeal = 30, .jam = 0, }, diff --git a/src/data/contest_opponents.h b/src/data/contest_opponents.h index 53868fc84..6de931ef2 100644 --- a/src/data/contest_opponents.h +++ b/src/data/contest_opponents.h @@ -100,7 +100,44 @@ #define CONTEST_OPPONENT_TREY 94 #define CONTEST_OPPONENT_LANE 95 -const struct ContestWinner gUnknown_08587FA4[] = +// All contest opponents have a common set of AI flags (which contains all of the actually +// useful AI scripts, as well as some dummys) and a random combination of 2-3 dummy flags. +// Seems that like the battle AI they had more plans for this than what ended up in the final game +#define CONTEST_AI_SET_1 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_20 | CONTEST_AI_DUMMY_21) +#define CONTEST_AI_SET_2 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_19 | CONTEST_AI_DUMMY_25) +#define CONTEST_AI_SET_3 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_18 | CONTEST_AI_DUMMY_23) +#define CONTEST_AI_SET_4 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_17 | CONTEST_AI_DUMMY_23) +#define CONTEST_AI_SET_5 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_16 | CONTEST_AI_DUMMY_25) +#define CONTEST_AI_SET_6 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_15 | CONTEST_AI_DUMMY_22) +#define CONTEST_AI_SET_7 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_14 | CONTEST_AI_DUMMY_23) +#define CONTEST_AI_SET_8 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_13 | CONTEST_AI_DUMMY_21) +#define CONTEST_AI_SET_9 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_12 | CONTEST_AI_DUMMY_24) +#define CONTEST_AI_SET_A (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_11 | CONTEST_AI_DUMMY_25) +#define CONTEST_AI_SET_B (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_10 | CONTEST_AI_DUMMY_21) +#define CONTEST_AI_SET_C (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_9 | CONTEST_AI_DUMMY_21) +#define CONTEST_AI_SET_D (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_8 | CONTEST_AI_DUMMY_22 | CONTEST_AI_DUMMY_25) +#define CONTEST_AI_SET_E (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_7 | CONTEST_AI_DUMMY_24) +#define CONTEST_AI_SET_F (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_6 | CONTEST_AI_DUMMY_25) +#define CONTEST_AI_SET_10 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_20 | CONTEST_AI_DUMMY_23) +#define CONTEST_AI_SET_11 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_18 | CONTEST_AI_DUMMY_25) +#define CONTEST_AI_SET_12 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_17 | CONTEST_AI_DUMMY_25) +#define CONTEST_AI_SET_13 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_16 | CONTEST_AI_DUMMY_22) +#define CONTEST_AI_SET_14 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_15 | CONTEST_AI_DUMMY_21) +#define CONTEST_AI_SET_15 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_14 | CONTEST_AI_DUMMY_22) +#define CONTEST_AI_SET_16 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_13 | CONTEST_AI_DUMMY_25) +#define CONTEST_AI_SET_17 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_12 | CONTEST_AI_DUMMY_23 | CONTEST_AI_DUMMY_25) +#define CONTEST_AI_SET_18 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_10 | CONTEST_AI_DUMMY_25) +#define CONTEST_AI_SET_19 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_9 | CONTEST_AI_DUMMY_25) +#define CONTEST_AI_SET_1A (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_8 | CONTEST_AI_DUMMY_25) +#define CONTEST_AI_SET_1B (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_7 | CONTEST_AI_DUMMY_21) +#define CONTEST_AI_SET_1C (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_6 | CONTEST_AI_DUMMY_21) +#define CONTEST_AI_SET_1D (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_20 | CONTEST_AI_DUMMY_25) +#define CONTEST_AI_SET_1E (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_15 | CONTEST_AI_DUMMY_25) +#define CONTEST_AI_SET_1F (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_14 | CONTEST_AI_DUMMY_25) +#define CONTEST_AI_SET_20 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_12 | CONTEST_AI_DUMMY_25) +#define CONTEST_AI_SET_21 (CONTEST_AI_COMMON | CONTEST_AI_DUMMY_7 | CONTEST_AI_DUMMY_25) + +const struct ContestWinner gDefaultContestWinners[] = { { .personality = 0, @@ -183,7 +220,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("POOCHY"), .trainerName = _("JIMMY"), .trainerGfxId = OBJ_EVENT_GFX_BOY_1, - .aiChecks = 0xC000FFF, + .aiFlags = CONTEST_AI_SET_1, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -211,7 +248,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("MUSILLE"), .trainerName = _("EDITH"), .trainerGfxId = OBJ_EVENT_GFX_GIRL_1, - .aiChecks = 0x82000FFF, + .aiFlags = CONTEST_AI_SET_2, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -239,7 +276,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("DUSTER"), .trainerName = _("EVAN"), .trainerGfxId = OBJ_EVENT_GFX_LITTLE_BOY, - .aiChecks = 0x21000FFF, + .aiFlags = CONTEST_AI_SET_3, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -267,7 +304,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("DOTS"), .trainerName = _("KELSEY"), .trainerGfxId = OBJ_EVENT_GFX_WOMAN_1, - .aiChecks = 0x20800FFF, + .aiFlags = CONTEST_AI_SET_4, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -295,7 +332,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("TATAY"), .trainerName = _("MADISON"), .trainerGfxId = OBJ_EVENT_GFX_POKEFAN_F, - .aiChecks = 0x80400FFF, + .aiFlags = CONTEST_AI_SET_5, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -323,7 +360,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("NINDA"), .trainerName = _("RAYMOND"), .trainerGfxId = OBJ_EVENT_GFX_BLACK_BELT, - .aiChecks = 0x10200FFF, + .aiFlags = CONTEST_AI_SET_6, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -351,7 +388,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("SMISH"), .trainerName = _("GRANT"), .trainerGfxId = OBJ_EVENT_GFX_YOUNGSTER, - .aiChecks = 0x20100FFF, + .aiFlags = CONTEST_AI_SET_7, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -379,7 +416,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("SLEAL"), .trainerName = _("PAIGE"), .trainerGfxId = OBJ_EVENT_GFX_WOMAN_4, - .aiChecks = 0x8080FFF, + .aiFlags = CONTEST_AI_SET_8, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -407,7 +444,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("SLOKTH"), .trainerName = _("ALEC"), .trainerGfxId = OBJ_EVENT_GFX_CAMPER, - .aiChecks = 0x40040FFF, + .aiFlags = CONTEST_AI_SET_9, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -435,7 +472,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("WHIRIS"), .trainerName = _("SYDNEY"), .trainerGfxId = OBJ_EVENT_GFX_LASS, - .aiChecks = 0x80020FFF, + .aiFlags = CONTEST_AI_SET_A, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -463,7 +500,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("MAHITA"), .trainerName = _("MORRIS"), .trainerGfxId = OBJ_EVENT_GFX_SCHOOL_KID_M, - .aiChecks = 0x8010FFF, + .aiFlags = CONTEST_AI_SET_B, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -491,7 +528,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("RONAR"), .trainerName = _("MARIAH"), .trainerGfxId = OBJ_EVENT_GFX_GIRL_2, - .aiChecks = 0x8008FFF, + .aiFlags = CONTEST_AI_SET_C, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -519,7 +556,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("BATRO"), .trainerName = _("RUSSELL"), .trainerGfxId = OBJ_EVENT_GFX_MAN_3, - .aiChecks = 0x90004FFF, + .aiFlags = CONTEST_AI_SET_D, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -547,7 +584,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("GULIN"), .trainerName = _("MELANIE"), .trainerGfxId = OBJ_EVENT_GFX_TWIN, - .aiChecks = 0x40002FFF, + .aiFlags = CONTEST_AI_SET_E, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -575,7 +612,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("RIKELEC"), .trainerName = _("CHANCE"), .trainerGfxId = OBJ_EVENT_GFX_RICH_BOY, - .aiChecks = 0x80001FFF, + .aiFlags = CONTEST_AI_SET_F, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = TRUE, .aiPool_Beauty = TRUE, @@ -603,7 +640,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("BULBY"), .trainerName = _("AGATHA"), .trainerGfxId = OBJ_EVENT_GFX_WOMAN_2, - .aiChecks = 0xC000FFF, + .aiFlags = CONTEST_AI_SET_1, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -631,7 +668,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("FUTTERBE"), .trainerName = _("BEAU"), .trainerGfxId = OBJ_EVENT_GFX_HEX_MANIAC, - .aiChecks = 0x82000FFF, + .aiFlags = CONTEST_AI_SET_2, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -659,7 +696,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("PIDEOT"), .trainerName = _("KAY"), .trainerGfxId = OBJ_EVENT_GFX_WOMAN_5, - .aiChecks = 0x21000FFF, + .aiFlags = CONTEST_AI_SET_3, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = TRUE, .aiPool_Beauty = TRUE, @@ -687,7 +724,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("DIGLE"), .trainerName = _("CALE"), .trainerGfxId = OBJ_EVENT_GFX_HIKER, - .aiChecks = 0x20800FFF, + .aiFlags = CONTEST_AI_SET_4, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -715,7 +752,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("WAGIL"), .trainerName = _("CAITLIN"), .trainerGfxId = OBJ_EVENT_GFX_TUBER_F, - .aiChecks = 0x80400FFF, + .aiFlags = CONTEST_AI_SET_5, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -743,7 +780,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("TOTDIL"), .trainerName = _("COLBY"), .trainerGfxId = OBJ_EVENT_GFX_NINJA_BOY, - .aiChecks = 0x10200FFF, + .aiFlags = CONTEST_AI_SET_6, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = TRUE, .aiPool_Beauty = TRUE, @@ -771,7 +808,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("BALEDY"), .trainerName = _("KYLIE"), .trainerGfxId = OBJ_EVENT_GFX_BEAUTY, - .aiChecks = 0x20100FFF, + .aiFlags = CONTEST_AI_SET_7, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -799,7 +836,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("BIRDLY"), .trainerName = _("LIAM"), .trainerGfxId = OBJ_EVENT_GFX_MAN_5, - .aiChecks = 0x8080FFF, + .aiFlags = CONTEST_AI_SET_8, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -827,7 +864,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("TARVITAR"), .trainerName = _("MILO"), .trainerGfxId = OBJ_EVENT_GFX_MANIAC, - .aiChecks = 0x40040FFF, + .aiFlags = CONTEST_AI_SET_9, .whichRank = CONTEST_RANK_NORMAL, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -855,7 +892,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("RELIA"), .trainerName = _("KARINA"), .trainerGfxId = OBJ_EVENT_GFX_PICNICKER, - .aiChecks = 0x24000FFF, + .aiFlags = CONTEST_AI_SET_10, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -883,7 +920,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("DUODO"), .trainerName = _("BOBBY"), .trainerGfxId = OBJ_EVENT_GFX_RUNNING_TRIATHLETE_M, - .aiChecks = 0x82000FFF, + .aiFlags = CONTEST_AI_SET_2, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = TRUE, .aiPool_Beauty = TRUE, @@ -911,7 +948,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("PINCHIN"), .trainerName = _("CLAIRE"), .trainerGfxId = OBJ_EVENT_GFX_GIRL_1, - .aiChecks = 0x81000FFF, + .aiFlags = CONTEST_AI_SET_11, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -939,7 +976,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("NACAC"), .trainerName = _("WILLIE"), .trainerGfxId = OBJ_EVENT_GFX_LITTLE_BOY, - .aiChecks = 0x80800FFF, + .aiFlags = CONTEST_AI_SET_12, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -967,7 +1004,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("SHRAND"), .trainerName = _("CASSIDY"), .trainerGfxId = OBJ_EVENT_GFX_POKEFAN_F, - .aiChecks = 0x10400FFF, + .aiFlags = CONTEST_AI_SET_13, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -995,7 +1032,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("TOYBAL"), .trainerName = _("MORGAN"), .trainerGfxId = OBJ_EVENT_GFX_BLACK_BELT, - .aiChecks = 0x8200FFF, + .aiFlags = CONTEST_AI_SET_14, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -1023,7 +1060,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("CHAMCHAM"), .trainerName = _("SUMMER"), .trainerGfxId = OBJ_EVENT_GFX_WOMAN_4, - .aiChecks = 0x10100FFF, + .aiFlags = CONTEST_AI_SET_15, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = TRUE, .aiPool_Beauty = TRUE, @@ -1051,7 +1088,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("SPININ"), .trainerName = _("MILES"), .trainerGfxId = OBJ_EVENT_GFX_CAMPER, - .aiChecks = 0x80080FFF, + .aiFlags = CONTEST_AI_SET_16, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -1079,7 +1116,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("SWABY"), .trainerName = _("AUDREY"), .trainerGfxId = OBJ_EVENT_GFX_LASS, - .aiChecks = 0xA0040FFF, + .aiFlags = CONTEST_AI_SET_17, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -1107,7 +1144,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("POINKER"), .trainerName = _("AVERY"), .trainerGfxId = OBJ_EVENT_GFX_SCHOOL_KID_M, - .aiChecks = 0x80020FFF, + .aiFlags = CONTEST_AI_SET_A, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -1135,7 +1172,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("KECON"), .trainerName = _("ARIANA"), .trainerGfxId = OBJ_EVENT_GFX_GIRL_2, - .aiChecks = 0x80010FFF, + .aiFlags = CONTEST_AI_SET_18, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -1163,7 +1200,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("GOLDEN"), .trainerName = _("ASHTON"), .trainerGfxId = OBJ_EVENT_GFX_MAN_3, - .aiChecks = 0x80008FFF, + .aiFlags = CONTEST_AI_SET_19, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = TRUE, .aiPool_Beauty = TRUE, @@ -1191,7 +1228,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("BOBOACH"), .trainerName = _("SANDRA"), .trainerGfxId = OBJ_EVENT_GFX_TWIN, - .aiChecks = 0x80004FFF, + .aiFlags = CONTEST_AI_SET_1A, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -1219,7 +1256,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("CORPY"), .trainerName = _("CARSON"), .trainerGfxId = OBJ_EVENT_GFX_YOUNGSTER, - .aiChecks = 0x8002FFF, + .aiFlags = CONTEST_AI_SET_1B, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = TRUE, .aiPool_Beauty = TRUE, @@ -1247,7 +1284,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("TADO"), .trainerName = _("KATRINA"), .trainerGfxId = OBJ_EVENT_GFX_WOMAN_1, - .aiChecks = 0x8001FFF, + .aiFlags = CONTEST_AI_SET_1C, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -1275,7 +1312,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("BROWLO"), .trainerName = _("LUKE"), .trainerGfxId = OBJ_EVENT_GFX_FAT_MAN, - .aiChecks = 0xC000FFF, + .aiFlags = CONTEST_AI_SET_1, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -1303,7 +1340,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("FETCHIN"), .trainerName = _("RAUL"), .trainerGfxId = OBJ_EVENT_GFX_MAN_5, - .aiChecks = 0x82000FFF, + .aiFlags = CONTEST_AI_SET_2, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -1331,7 +1368,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("SEELEY"), .trainerName = _("JADA"), .trainerGfxId = OBJ_EVENT_GFX_WOMAN_2, - .aiChecks = 0x21000FFF, + .aiFlags = CONTEST_AI_SET_3, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -1359,7 +1396,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("DROWZIN"), .trainerName = _("ZEEK"), .trainerGfxId = OBJ_EVENT_GFX_PSYCHIC_M, - .aiChecks = 0x20800FFF, + .aiFlags = CONTEST_AI_SET_4, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -1387,7 +1424,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("HITEMON"), .trainerName = _("DIEGO"), .trainerGfxId = OBJ_EVENT_GFX_EXPERT_M, - .aiChecks = 0x80400FFF, + .aiFlags = CONTEST_AI_SET_5, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -1415,7 +1452,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("BLISS"), .trainerName = _("ALIYAH"), .trainerGfxId = OBJ_EVENT_GFX_TEALA, - .aiChecks = 0x10200FFF, + .aiFlags = CONTEST_AI_SET_6, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -1443,7 +1480,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("KIDLEK"), .trainerName = _("NATALIA"), .trainerGfxId = OBJ_EVENT_GFX_POKEFAN_F, - .aiChecks = 0x20100FFF, + .aiFlags = CONTEST_AI_SET_7, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -1471,7 +1508,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("SNUBBINS"), .trainerName = _("DEVIN"), .trainerGfxId = OBJ_EVENT_GFX_GENTLEMAN, - .aiChecks = 0x8080FFF, + .aiFlags = CONTEST_AI_SET_8, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -1499,7 +1536,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("DREAVIS"), .trainerName = _("TYLOR"), .trainerGfxId = OBJ_EVENT_GFX_HEX_MANIAC, - .aiChecks = 0x40040FFF, + .aiFlags = CONTEST_AI_SET_9, .whichRank = CONTEST_RANK_SUPER, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -1527,7 +1564,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("LAIRN"), .trainerName = _("RONNIE"), .trainerGfxId = OBJ_EVENT_GFX_HIKER, - .aiChecks = 0x84000FFF, + .aiFlags = CONTEST_AI_SET_1D, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -1555,7 +1592,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("SHIFTY"), .trainerName = _("CLAUDIA"), .trainerGfxId = OBJ_EVENT_GFX_GIRL_1, - .aiChecks = 0x82000FFF, + .aiFlags = CONTEST_AI_SET_2, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = TRUE, .aiPool_Beauty = TRUE, @@ -1583,7 +1620,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("NINAS"), .trainerName = _("ELIAS"), .trainerGfxId = OBJ_EVENT_GFX_LITTLE_BOY, - .aiChecks = 0x81000FFF, + .aiFlags = CONTEST_AI_SET_11, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -1611,7 +1648,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("WELOW"), .trainerName = _("JADE"), .trainerGfxId = OBJ_EVENT_GFX_POKEFAN_F, - .aiChecks = 0x80800FFF, + .aiFlags = CONTEST_AI_SET_12, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = TRUE, .aiPool_Beauty = TRUE, @@ -1639,7 +1676,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("YENA"), .trainerName = _("FRANCIS"), .trainerGfxId = OBJ_EVENT_GFX_BLACK_BELT, - .aiChecks = 0x80400FFF, + .aiFlags = CONTEST_AI_SET_5, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -1667,7 +1704,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("TIFLY"), .trainerName = _("ALISHA"), .trainerGfxId = OBJ_EVENT_GFX_WOMAN_4, - .aiChecks = 0x80200FFF, + .aiFlags = CONTEST_AI_SET_1E, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -1695,7 +1732,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("KINGSEA"), .trainerName = _("SAUL"), .trainerGfxId = OBJ_EVENT_GFX_CAMPER, - .aiChecks = 0x80100FFF, + .aiFlags = CONTEST_AI_SET_1F, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -1723,7 +1760,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("CASTER"), .trainerName = _("FELICIA"), .trainerGfxId = OBJ_EVENT_GFX_LASS, - .aiChecks = 0x80080FFF, + .aiFlags = CONTEST_AI_SET_16, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = TRUE, .aiPool_Beauty = TRUE, @@ -1751,7 +1788,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("CHOKEM"), .trainerName = _("EMILIO"), .trainerGfxId = OBJ_EVENT_GFX_SCHOOL_KID_M, - .aiChecks = 0x80040FFF, + .aiFlags = CONTEST_AI_SET_20, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -1779,7 +1816,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("LOMBE"), .trainerName = _("KARLA"), .trainerGfxId = OBJ_EVENT_GFX_GIRL_2, - .aiChecks = 0x80020FFF, + .aiFlags = CONTEST_AI_SET_A, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -1807,7 +1844,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("VIPES"), .trainerName = _("DARRYL"), .trainerGfxId = OBJ_EVENT_GFX_MAN_3, - .aiChecks = 0x80010FFF, + .aiFlags = CONTEST_AI_SET_18, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -1835,7 +1872,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("MERAIL"), .trainerName = _("SELENA"), .trainerGfxId = OBJ_EVENT_GFX_EXPERT_F, - .aiChecks = 0x80008FFF, + .aiFlags = CONTEST_AI_SET_19, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -1863,7 +1900,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("KARPAG"), .trainerName = _("NOEL"), .trainerGfxId = OBJ_EVENT_GFX_YOUNGSTER, - .aiChecks = 0x80004FFF, + .aiFlags = CONTEST_AI_SET_1A, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -1891,7 +1928,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("LUNONE"), .trainerName = _("LACEY"), .trainerGfxId = OBJ_EVENT_GFX_WOMAN_1, - .aiChecks = 0x80002FFF, + .aiFlags = CONTEST_AI_SET_21, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -1919,7 +1956,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("ABSO"), .trainerName = _("CORBIN"), .trainerGfxId = OBJ_EVENT_GFX_MANIAC, - .aiChecks = 0x80001FFF, + .aiFlags = CONTEST_AI_SET_F, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = TRUE, .aiPool_Beauty = TRUE, @@ -1947,7 +1984,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("EGGSOR"), .trainerName = _("GRACIE"), .trainerGfxId = OBJ_EVENT_GFX_PICNICKER, - .aiChecks = 0xC000FFF, + .aiFlags = CONTEST_AI_SET_1, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -1975,7 +2012,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("CUBIN"), .trainerName = _("COLTIN"), .trainerGfxId = OBJ_EVENT_GFX_MAN_4, - .aiChecks = 0x82000FFF, + .aiFlags = CONTEST_AI_SET_2, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -2003,7 +2040,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("HITMON"), .trainerName = _("ELLIE"), .trainerGfxId = OBJ_EVENT_GFX_EXPERT_F, - .aiChecks = 0x21000FFF, + .aiFlags = CONTEST_AI_SET_3, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -2031,7 +2068,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("SURTLE"), .trainerName = _("MARCUS"), .trainerGfxId = OBJ_EVENT_GFX_SAILOR, - .aiChecks = 0x20800FFF, + .aiFlags = CONTEST_AI_SET_4, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -2059,7 +2096,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("KHANKAN"), .trainerName = _("KIARA"), .trainerGfxId = OBJ_EVENT_GFX_GIRL_3, - .aiChecks = 0x80400FFF, + .aiFlags = CONTEST_AI_SET_5, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -2087,7 +2124,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("PINOC"), .trainerName = _("BRYCE"), .trainerGfxId = OBJ_EVENT_GFX_BUG_CATCHER, - .aiChecks = 0x10200FFF, + .aiFlags = CONTEST_AI_SET_6, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -2115,7 +2152,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("DILTOT"), .trainerName = _("JAMIE"), .trainerGfxId = OBJ_EVENT_GFX_WOMAN_5, - .aiChecks = 0x20100FFF, + .aiFlags = CONTEST_AI_SET_7, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -2143,7 +2180,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("DOOMOND"), .trainerName = _("JORGE"), .trainerGfxId = OBJ_EVENT_GFX_GENTLEMAN, - .aiChecks = 0x8080FFF, + .aiFlags = CONTEST_AI_SET_8, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = TRUE, .aiPool_Beauty = TRUE, @@ -2171,7 +2208,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("MILKAN"), .trainerName = _("DEVON"), .trainerGfxId = OBJ_EVENT_GFX_POKEFAN_M, - .aiChecks = 0x40040FFF, + .aiFlags = CONTEST_AI_SET_9, .whichRank = CONTEST_RANK_HYPER, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -2199,7 +2236,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("RADOS"), .trainerName = _("JUSTINA"), .trainerGfxId = OBJ_EVENT_GFX_PICNICKER, - .aiChecks = 0x84000FFF, + .aiFlags = CONTEST_AI_SET_1D, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = TRUE, .aiPool_Beauty = TRUE, @@ -2227,7 +2264,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("LOUDERD"), .trainerName = _("RALPH"), .trainerGfxId = OBJ_EVENT_GFX_EXPERT_M, - .aiChecks = 0x82000FFF, + .aiFlags = CONTEST_AI_SET_2, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -2255,7 +2292,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("SITTY"), .trainerName = _("ROSA"), .trainerGfxId = OBJ_EVENT_GFX_GIRL_1, - .aiChecks = 0x81000FFF, + .aiFlags = CONTEST_AI_SET_11, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -2283,7 +2320,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("SLING"), .trainerName = _("KEATON"), .trainerGfxId = OBJ_EVENT_GFX_LITTLE_BOY, - .aiChecks = 0x80800FFF, + .aiFlags = CONTEST_AI_SET_12, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -2311,7 +2348,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("TARIA"), .trainerName = _("MAYRA"), .trainerGfxId = OBJ_EVENT_GFX_POKEFAN_F, - .aiChecks = 0x80400FFF, + .aiFlags = CONTEST_AI_SET_5, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = TRUE, .aiPool_Beauty = TRUE, @@ -2339,7 +2376,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("LIRKI"), .trainerName = _("LAMAR"), .trainerGfxId = OBJ_EVENT_GFX_RICH_BOY, - .aiChecks = 0x80200FFF, + .aiFlags = CONTEST_AI_SET_1E, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -2367,7 +2404,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("BLOSSOM"), .trainerName = _("AUBREY"), .trainerGfxId = OBJ_EVENT_GFX_WOMAN_4, - .aiChecks = 0x80100FFF, + .aiFlags = CONTEST_AI_SET_1F, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -2395,7 +2432,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("EYESAB"), .trainerName = _("NIGEL"), .trainerGfxId = OBJ_EVENT_GFX_CAMPER, - .aiChecks = 0x80080FFF, + .aiFlags = CONTEST_AI_SET_16, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -2423,7 +2460,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("UTAN"), .trainerName = _("CAMILLE"), .trainerGfxId = OBJ_EVENT_GFX_LASS, - .aiChecks = 0x80040FFF, + .aiFlags = CONTEST_AI_SET_20, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -2451,7 +2488,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("PEDOS"), .trainerName = _("DEON"), .trainerGfxId = OBJ_EVENT_GFX_SCHOOL_KID_M, - .aiChecks = 0x80020FFF, + .aiFlags = CONTEST_AI_SET_A, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -2479,7 +2516,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("LUVIS"), .trainerName = _("JANELLE"), .trainerGfxId = OBJ_EVENT_GFX_GIRL_2, - .aiChecks = 0x80010FFF, + .aiFlags = CONTEST_AI_SET_18, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -2507,7 +2544,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("HEROSS"), .trainerName = _("HEATH"), .trainerGfxId = OBJ_EVENT_GFX_MAN_3, - .aiChecks = 0x80008FFF, + .aiFlags = CONTEST_AI_SET_19, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -2535,7 +2572,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("RODLECT"), .trainerName = _("SASHA"), .trainerGfxId = OBJ_EVENT_GFX_TWIN, - .aiChecks = 0x80004FFF, + .aiFlags = CONTEST_AI_SET_1A, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = TRUE, .aiPool_Beauty = TRUE, @@ -2563,7 +2600,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("CHUPY"), .trainerName = _("FRANKIE"), .trainerGfxId = OBJ_EVENT_GFX_YOUNGSTER, - .aiChecks = 0x80002FFF, + .aiFlags = CONTEST_AI_SET_21, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -2591,7 +2628,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("WOBET"), .trainerName = _("HELEN"), .trainerGfxId = OBJ_EVENT_GFX_WOMAN_1, - .aiChecks = 0x80001FFF, + .aiFlags = CONTEST_AI_SET_F, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = TRUE, .aiPool_Beauty = TRUE, @@ -2619,7 +2656,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("GAREN"), .trainerName = _("CAMILE"), .trainerGfxId = OBJ_EVENT_GFX_HEX_MANIAC, - .aiChecks = 0xC000FFF, + .aiFlags = CONTEST_AI_SET_1, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -2647,7 +2684,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("GONPOR"), .trainerName = _("MARTIN"), .trainerGfxId = OBJ_EVENT_GFX_SCIENTIST_1, - .aiChecks = 0x82000FFF, + .aiFlags = CONTEST_AI_SET_2, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = TRUE, .aiPool_Beauty = TRUE, @@ -2675,7 +2712,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("DRITE"), .trainerName = _("SERGIO"), .trainerGfxId = OBJ_EVENT_GFX_BOY_1, - .aiChecks = 0x21000FFF, + .aiFlags = CONTEST_AI_SET_3, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE, @@ -2703,7 +2740,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("MEOWY"), .trainerName = _("KAILEY"), .trainerGfxId = OBJ_EVENT_GFX_TWIN, - .aiChecks = 0x20800FFF, + .aiFlags = CONTEST_AI_SET_4, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -2731,7 +2768,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("NYX"), .trainerName = _("PERLA"), .trainerGfxId = OBJ_EVENT_GFX_BEAUTY, - .aiChecks = 0x80400FFF, + .aiFlags = CONTEST_AI_SET_5, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = FALSE, .aiPool_Beauty = TRUE, @@ -2759,7 +2796,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("GEPITO"), .trainerName = _("CLARA"), .trainerGfxId = OBJ_EVENT_GFX_WOMAN_2, - .aiChecks = 0x10200FFF, + .aiFlags = CONTEST_AI_SET_6, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -2787,7 +2824,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("SPEON"), .trainerName = _("JAKOB"), .trainerGfxId = OBJ_EVENT_GFX_PSYCHIC_M, - .aiChecks = 0x20100FFF, + .aiFlags = CONTEST_AI_SET_7, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = TRUE, .aiPool_Beauty = TRUE, @@ -2815,7 +2852,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("SLOWGO"), .trainerName = _("TREY"), .trainerGfxId = OBJ_EVENT_GFX_SAILOR, - .aiChecks = 0x8080FFF, + .aiFlags = CONTEST_AI_SET_8, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = FALSE, .aiPool_Beauty = FALSE, @@ -2843,7 +2880,7 @@ const struct ContestPokemon gContestOpponents[] = .nickname = _("URSING"), .trainerName = _("LANE"), .trainerGfxId = OBJ_EVENT_GFX_BLACK_BELT, - .aiChecks = 0x40040FFF, + .aiFlags = CONTEST_AI_SET_9, .whichRank = CONTEST_RANK_MASTER, .aiPool_Cool = TRUE, .aiPool_Beauty = FALSE,