Merge pull request #1138 from GriffinRichards/doc-contest

Document contest
This commit is contained in:
GriffinR 2020-08-20 16:03:47 -04:00 committed by GitHub
commit 6c34effda9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
76 changed files with 4369 additions and 4251 deletions

View File

@ -5,36 +5,42 @@
.byte \score
.endm
@ turn (AKA "Appeal No.")
.macro get_turn
.macro get_appeal_num
.byte 0x01
.endm
.macro if_turn_less_than param, addr
.macro if_appeal_num_less_than param, addr
.byte 0x02
.byte \param
.4byte \addr
.endm
.macro if_turn_more_than param, addr
.macro if_appeal_num_more_than param, addr
.byte 0x03
.byte \param
.4byte \addr
.endm
.macro if_turn_eq param, addr
.macro if_appeal_num_eq param, addr
.byte 0x04
.byte \param
.4byte \addr
.endm
.macro if_turn_not_eq param, addr
.macro if_appeal_num_not_eq param, addr
.byte 0x05
.byte \param
.4byte \addr
.endm
.macro if_last_appeal addr:req
if_appeal_num_eq CONTEST_LAST_APPEAL, \addr
.endm
.macro if_not_last_appeal addr:req
if_appeal_num_not_eq CONTEST_LAST_APPEAL, \addr
.endm
@ audience excitement
.macro get_excitement
@ -65,7 +71,7 @@
.4byte \addr
.endm
@ the order that the user goes in the current turn
@ the order that the user goes in the current appeal
.macro get_user_order
.byte 0x0B

View File

@ -12,9 +12,9 @@ gRecvCmds
gLinkStatus
gLinkDummy1
gLinkDummy2
gUnknown_030030EC
gUnknown_030030F0
gUnknown_030030F4
gReadyToExitStandby
gReadyToCloseLink
gReadyCloseLinkType
gSuppressLinkErrorMessage
gWirelessCommType
gSavedLinkPlayerCount

View File

@ -1,4 +1,2 @@
.include "constants/gba_constants.inc"
.include "constants/global.inc"
.include "constants/contest_constants.inc"
.include "constants/contest_move_effects.inc"

View File

@ -1,68 +0,0 @@
.set CONTEST_COOL, 0x00
.set CONTEST_BEAUTY, 0x01
.set CONTEST_CUTE, 0x02
.set CONTEST_SMART, 0x03
.set CONTEST_TOUGH, 0x04
.set COMBO_STARTER_RAIN_DANCE, 0x01
.set COMBO_STARTER_RAGE, 0x02
.set COMBO_STARTER_FOCUS_ENERGY, 0x03
.set COMBO_STARTER_HYPNOSIS, 0x04
.set COMBO_STARTER_ENDURE, 0x05
.set COMBO_STARTER_HORN_ATTACK, 0x06
.set COMBO_STARTER_SWORDS_DANCE, 0x07
.set COMBO_STARTER_STOCKPILE, 0x08
.set COMBO_STARTER_SUNNY_DAY, 0x09
.set COMBO_STARTER_REST, 0x0A
.set COMBO_STARTER_VICE_GRIP, 0x0B
.set COMBO_STARTER_DEFENSE_CURL, 0x0C
.set COMBO_STARTER_CHARGE, 0x0D
.set COMBO_STARTER_ROCK_THROW, 0x0E
.set COMBO_STARTER_YAWN, 0x0F
.set COMBO_STARTER_SCARY_FACE, 0x10
.set COMBO_STARTER_POWDER_SNOW, 0x11
.set COMBO_STARTER_LOCK_ON, 0x12
.set COMBO_STARTER_SOFT_BOILED, 0x13
.set COMBO_STARTER_MEAN_LOOK, 0x14
.set COMBO_STARTER_SCRATCH, 0x15
.set COMBO_STARTER_GROWTH, 0x16
.set COMBO_STARTER_HAIL, 0x17
.set COMBO_STARTER_SANDSTORM, 0x18
.set COMBO_STARTER_BELLY_DRUM, 0x19
.set COMBO_STARTER_MIND_READER, 0x1A
.set COMBO_STARTER_DRAGON_BREATH, 0x1B
.set COMBO_STARTER_DRAGON_RAGE, 0x1C
.set COMBO_STARTER_DRAGON_DANCE, 0x1D
.set COMBO_STARTER_SURF, 0x1E
.set COMBO_STARTER_DIVE, 0x1F
.set COMBO_STARTER_STRING_SHOT, 0x20
.set COMBO_STARTER_LEER, 0x21
.set COMBO_STARTER_TAUNT, 0x22
.set COMBO_STARTER_CHARM, 0x23
.set COMBO_STARTER_HARDEN, 0x24
.set COMBO_STARTER_SING, 0x25
.set COMBO_STARTER_EARTHQUAKE, 0x26
.set COMBO_STARTER_DOUBLE_TEAM, 0x27
.set COMBO_STARTER_CURSE, 0x28
.set COMBO_STARTER_SWEET_SCENT, 0x29
.set COMBO_STARTER_SLUDGE, 0x2A
.set COMBO_STARTER_SLUDGE_BOMB, 0x2B
.set COMBO_STARTER_THUNDER_PUNCH, 0x2C
.set COMBO_STARTER_FIRE_PUNCH, 0x2D
.set COMBO_STARTER_ICE_PUNCH, 0x2E
.set COMBO_STARTER_PECK, 0x2F
.set COMBO_STARTER_METAL_SOUND, 0x30
.set COMBO_STARTER_MUD_SPORT, 0x31
.set COMBO_STARTER_WATER_SPORT, 0x32
.set COMBO_STARTER_BONE_CLUB, 0x33
.set COMBO_STARTER_BONEMERANG, 0x34
.set COMBO_STARTER_BONE_RUSH, 0x35
.set COMBO_STARTER_SAND_ATTACK, 0x36
.set COMBO_STARTER_MUD_SLAP, 0x37
.set COMBO_STARTER_FAKE_OUT, 0x38
.set COMBO_STARTER_PSYCHIC, 0x39
.set COMBO_STARTER_KINESIS, 0x3A
.set COMBO_STARTER_CONFUSION, 0x3B
.set COMBO_STARTER_POUND, 0x3C
.set COMBO_STARTER_SMOG, 0x3D
.set COMBO_STARTER_CALM_MIND, 0x3E

View File

@ -1,49 +0,0 @@
enum_start
enum CONTEST_EFFECT_HIGHLY_APPEALING @ 0
enum CONTEST_EFFECT_USER_MORE_EASILY_STARTLED @ 1
enum CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES @ 2
enum CONTEST_EFFECT_REPETITION_NOT_BORING @ 3
enum CONTEST_EFFECT_AVOID_STARTLE_ONCE @ 4
enum CONTEST_EFFECT_AVOID_STARTLE @ 5
enum CONTEST_EFFECT_AVOID_STARTLE_SLIGHTLY @ 6
enum CONTEST_EFFECT_USER_LESS_EASILY_STARTLED @ 7
enum CONTEST_EFFECT_STARTLE_FRONT_MON @ 8
enum CONTEST_EFFECT_SLIGHTLY_STARTLE_PREV_MONS @ 9
enum CONTEST_EFFECT_STARTLE_PREV_MON @ 10
enum CONTEST_EFFECT_STARTLE_PREV_MONS @ 11
enum CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON @ 12
enum CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS @ 13
enum CONTEST_EFFECT_STARTLE_PREV_MON_2 @ 14
enum CONTEST_EFFECT_STARTLE_PREV_MONS_2 @ 15
enum CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION @ 16
enum CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION @ 17
enum CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN @ 18
enum CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL @ 19
enum CONTEST_EFFECT_STARTLE_MONS_COOL_APPEAL @ 20
enum CONTEST_EFFECT_STARTLE_MONS_BEAUTY_APPEAL @ 21
enum CONTEST_EFFECT_STARTLE_MONS_CUTE_APPEAL @ 22
enum CONTEST_EFFECT_STARTLE_MONS_SMART_APPEAL @ 23
enum CONTEST_EFFECT_STARTLE_MONS_TOUGH_APPEAL @ 24
enum CONTEST_EFFECT_MAKE_FOLLOWING_MON_NERVOUS @ 25
enum CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS @ 26
enum CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS @ 27
enum CONTEST_EFFECT_BADLY_STARTLES_MONS_IN_GOOD_CONDITION @ 28
enum CONTEST_EFFECT_BETTER_IF_FIRST @ 29
enum CONTEST_EFFECT_BETTER_IF_LAST @ 30
enum CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES @ 31
enum CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE @ 32
enum CONTEST_EFFECT_BETTER_WHEN_LATER @ 33
enum CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING @ 34
enum CONTEST_EFFECT_BETTER_IF_SAME_TYPE @ 35
enum CONTEST_EFFECT_BETTER_IF_DIFF_TYPE @ 36
enum CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL @ 37
enum CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS @ 38
enum CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION @ 39
enum CONTEST_EFFECT_NEXT_APPEAL_EARLIER @ 40
enum CONTEST_EFFECT_NEXT_APPEAL_LATER @ 41
enum CONTEST_EFFECT_MAKE_SCRAMBLING_TURN_ORDER_EASIER @ 42
enum CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER @ 43
enum CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST @ 44
enum CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS @ 45
enum CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED @ 46
enum CONTEST_EFFECT_DONT_EXCITE_AUDIENCE @ 47

View File

@ -1,3 +1,5 @@
#include "constants/global.h"
#include "constants/contest.h"
.include "asm/macros.inc"
.include "asm/macros/contest_ai_script.inc"
.include "constants/constants.inc"
@ -12,13 +14,13 @@
.align 2
gContestAIChecks:: @ 82DE350
.4byte AI_CheckForBadMove // 0x00000001
.4byte AI_CheckForCombo // 0x00000002
.4byte AI_CheckBoring // 0x00000004
.4byte AI_CheckExcitement // 0x00000008
.4byte AI_CheckOrder // 0x00000010
.4byte AI_CheckForGoodMove // 0x00000020
.4byte AI_Erratic // 0x00000040
.4byte AI_CheckForBadMove @ CONTEST_AI_CHECK_BAD_MOVE
.4byte AI_CheckForCombo @ 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_Erratic @ CONTEST_AI_ERRATIC
.4byte AI_Nothing // 0x00000080
.4byte AI_Nothing // 0x00000100
.4byte AI_Nothing // 0x00000200
@ -47,9 +49,9 @@ gContestAIChecks:: @ 82DE350
@ Unreferenced AI routine to encourage moves that improve condition on the first
@ turn. Additionally, it checks the appeal order of the user and the effect
@ 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_turn_not_eq 0, ContestUnreferenced_80
if_appeal_num_not_eq 0, ContestUnreferenced_80
if_effect_not_eq CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, ContestUnreferenced_80
score +10
ContestUnreferenced_80:
@ -64,11 +66,11 @@ ContestUnreferenced_end:
end
@ Unreferenced AI routine that doesn't make much sense.
if_turn_eq 0, ContestUnreferenced_0F_1
if_turn_eq 1, ContestUnreferenced_0F_2
if_turn_eq 2, ContestUnreferenced_0F_3
if_turn_eq 3, ContestUnreferenced_0F_4
if_turn_eq 4, ContestUnreferenced_0F_5
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
end
ContestUnreferenced_0F_1:
if_user_order_not_eq MON_1, ContestUnreferenced_2B_1
@ -122,25 +124,26 @@ ContestUnreferenced_score2:
end
AI_CheckBoring:
if_effect_eq CONTEST_EFFECT_REPETITION_NOT_BORING, AI_end_081DC27F
if_move_used_count_eq 1, AI_score1_081DC27F
if_move_used_count_eq 2, AI_score2_081DC27F
if_move_used_count_eq 3, AI_score3_081DC27F
if_move_used_count_eq 4, AI_score4_081DC27F
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
@ No repeats
end
AI_score1_081DC27F:
AI_CheckBoring_FirstRepeat:
score -5
end
AI_score2_081DC27F:
AI_CheckBoring_SecondRepeat:
score -15
end
AI_score3_081DC27F:
AI_CheckBoring_ThirdRepeat:
score -20
end
AI_score4_081DC27F:
AI_CheckBoring_FourthRepeat:
score -25
end
AI_end_081DC27F:
AI_CheckBoring_NotBoring:
end
AI_CheckExcitement:
@ -165,7 +168,7 @@ AI_contest7D_1_081DC2AB:
end
AI_contest0F_2_081DC2AB:
if_user_order_not_eq MON_1, AI_contest7D_3_081DC2AB
if_turn_eq 4, AI_score_081DC2AB
if_last_appeal AI_score_081DC2AB
AI_contest7D_2_081DC2AB:
if_random 51, AI_end_081DC2AB
score +10
@ -221,22 +224,22 @@ AI_score_081DC348:
score +25
end
AI_contest04_1_081DC348:
if_turn_eq 4, AI_contest7D_081DC348
if_last_appeal AI_contest7D_081DC348
if_random 150, AI_end_081DC348
score +10
end
AI_contest04_2_081DC348:
if_turn_eq 4, AI_contest7D_081DC348
if_last_appeal AI_contest7D_081DC348
if_random 125, AI_end_081DC348
score +10
end
AI_contest04_3_081DC348:
if_turn_eq 4, AI_contest7D_081DC348
if_last_appeal AI_contest7D_081DC348
if_random 50, AI_end_081DC348
score +10
end
AI_contest04_4_081DC348:
if_turn_eq 4, AI_contest7D_081DC348
if_last_appeal AI_contest7D_081DC348
score +10
end
AI_contest7D_081DC348:
@ -301,7 +304,7 @@ ContestEffect3:
if_random 50, ContestEffectEnd
score +15
end
if_turn_eq 4, ContestEffect3_7D
if_last_appeal ContestEffect3_7D
if_random 220, ContestEffect3_score
score +10
end
@ -323,8 +326,8 @@ ContestEffect38_score1:
score -10
end
ContestEffect38_contest04:
if_turn_eq 4, ContestEffect38_score2
if_turn_eq 0, ContestEffect38_random
if_last_appeal ContestEffect38_score2
if_appeal_num_eq 0, ContestEffect38_random
if_move_used_count_eq 1, ContestEffectEnd
if_random 125, ContestEffectEnd
score +10
@ -341,7 +344,7 @@ 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_turn_not_eq 4, ContestEffectEnd
if_not_last_appeal ContestEffectEnd
if_user_has_exciting_move ContestEffectEnd
if_excitement_less_than 1, ContestEffectEnd
score +10
@ -408,7 +411,7 @@ ContestEffect46:
if_user_order_more_than MON_1, ContestEffect46_score4
end
ContestEffect46_05:
if_turn_not_eq 0, ContestEffect46_score1
if_appeal_num_not_eq 0, ContestEffect46_score1
if_excitement_eq 4, ContestEffect46_score2
if_excitement_eq 3, ContestEffect46_score3
end
@ -565,7 +568,7 @@ ContestEffect_FollowingMonsNervous_CheckMon2:
end
ContestEffect18:
if_turn_eq 4, ContestEffect18_score1
if_last_appeal ContestEffect18_score1
jump ContestEffect18_0E
end
ContestEffect18_score1:
@ -599,9 +602,9 @@ ContestEffectEnd:
@ Randomly encourage moves in Cute, Smart, and Tough contests.
AI_Erratic:
if_contest_type_eq CONTEST_CUTE, Erratic_CuteSmartTough
if_contest_type_eq CONTEST_SMART, Erratic_CuteSmartTough
if_contest_type_eq CONTEST_TOUGH, Erratic_CuteSmartTough
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
end
Erratic_CuteSmartTough:
if_random 125, Erratic_NoScoreIncrease
@ -762,11 +765,11 @@ ContestEffect2_4_score3:
end
ContestEffect2_2:
if_turn_eq 0, ContestEffect2_2_score1
if_turn_eq 1, ContestEffect2_2_score2
if_turn_eq 2, ContestEffect2_2_score3
if_turn_eq 3, ContestEffect2_2_score4
if_turn_eq 4, ContestEffect2_2_score5
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
end
ContestEffect2_2_score1:
if_random 20, ContestEffectEnd2

View File

@ -18,7 +18,7 @@ ContestHall_OnTransition: @ 823B79F
ContestHall_EventScript_ReadyContestMusic:: @ 823B7AF
call ContestHall_EventScript_TryWaitForLink
special ScriptGetMultiplayerId
special GetContestMultiplayerId
compare VAR_RESULT, 0
call_if_eq ContestHall_EventScript_SaveContestMusicPlayer1
compare VAR_RESULT, 1
@ -136,7 +136,7 @@ ContestHall_EventScript_SetRandomAudience7:: @ 823B8ED
ContestHall_EventScript_GetRandomAudienceGfxId:: @ 823B8F8
setvar VAR_RESULT, 32
special ScriptRandom
special GenerateContestRand
addvar VAR_RESULT, 1
switch VAR_RESULT
case 1, ContestHall_EventScript_RandomAudienceNinjaBoy

View File

@ -542,7 +542,7 @@ ContestHall_EventScript_AudienceHeartEmotes:: @ 827A34F
ContestHall_EventScript_DisplayHearts:: @ 827A3E5
setvar VAR_RESULT, 8
special ScriptRandom
special GenerateContestRand
compare VAR_RESULT, 0
call_if_eq ContestHall_EventScript_TryDisplayHeartAudienceMember1
compare VAR_RESULT, 1

View File

@ -149,7 +149,7 @@ gSpecials:: @ 81DBA64
def_special SaveMuseumContestPainting
def_special DoesContestCategoryHaveWinner
def_special CountPlayerContestPaintings
def_special ShowContestWinner
def_special ShowContestWinnerPainting
def_special MauvilleGymSetDefaultBarriers
def_special MauvilleGymPressSwitch
def_special ShowFieldMessageStringVar4
@ -336,7 +336,7 @@ gSpecials:: @ 81DBA64
def_special BattleSetup_StartLatiBattle
def_special SetRoute119Weather
def_special SetRoute123Weather
def_special ScriptGetMultiplayerId
def_special GetContestMultiplayerId
def_special ScriptGetPartyMonSpecies
def_special IsSelectedMonEgg
def_special TryInitBattleTowerAwardManObjectEvent
@ -350,7 +350,7 @@ gSpecials:: @ 81DBA64
def_special BufferLottoTicketNumber
def_special TryHideBattleTowerReporter
def_special DoesPartyHaveEnigmaBerry
def_special ScriptRandom
def_special GenerateContestRand
def_special SetChampionSaveWarp
def_special TryPutTreasureInvestigatorsOnAir
def_special TryPutLotteryWinnerReportOnAir

View File

@ -2436,7 +2436,7 @@ gTVSafariFanClubText10:: @ 08289D33
.string "and make the challenge yourself!\p"
.string "Until next time, cheerio!$"
gTVContestLiveUpdatesText00:: @ 08289DD6
ContestLiveUpdates_Text_Intro:: @ 08289DD6
.string "“POKéMON CONTEST LIVE UPDATES!”\p"
.string "MC: Thanks for joining us!\p"
.string "We're live from the just-ended\n"
@ -2455,117 +2455,117 @@ gTVContestLiveUpdatesText00:: @ 08289DD6
.string "MC: Let's hear what the fans have\n"
.string "to say about this CONTEST.$"
gTVContestLiveUpdatesText01:: @ 08289F53
ContestLiveUpdates_Text_WonBothRounds:: @ 08289F53
.string "Spectator: The {STR_VAR_2} was tops in\n"
.string "both primary and secondary judging!\p"
.string "That {STR_VAR_2} will keep winning!$"
gTVContestLiveUpdatesText02:: @ 08289FB0
ContestLiveUpdates_Text_BetterRound2:: @ 08289FB0
.string "Spectator: The {STR_VAR_2} didn't do\n"
.string "well in the primary judging, but it\l"
.string "cleaned up in the secondary judging!\p"
.string "It was a miraculous comeback\n"
.string "for that {STR_VAR_2}. Yippee!$"
gTVContestLiveUpdatesText03:: @ 0828A047
ContestLiveUpdates_Text_EqualRounds:: @ 0828A047
.string "Spectator: The {STR_VAR_2} remained\n"
.string "consistent throughout both primary\l"
.string "and secondary judging.\p"
.string "{STR_VAR_3} and the {STR_VAR_2},\n"
.string "they're no ordinary combo!$"
gTVContestLiveUpdatesText04:: @ 0828A0C6
ContestLiveUpdates_Text_BetterRound1:: @ 0828A0C6
.string "Spectator: In terms of being {STR_VAR_1},\n"
.string "that {STR_VAR_2} was outstanding.\p"
.string "I hope it makes better appeals\n"
.string "next time, though.$"
gTVContestLiveUpdatesText05:: @ 0828A132
ContestLiveUpdates_Text_GotNervous:: @ 0828A132
.string "Spectator: When the {STR_VAR_2} got\n"
.string "nervous, I couldn't stop myself from\l"
.string "shouting encouragement.\p"
.string "I'd like to say this to that\n"
.string "{STR_VAR_2}, “Congratulations!”$"
gTVContestLiveUpdatesText06:: @ 0828A1BE
ContestLiveUpdates_Text_StartledFoes:: @ 0828A1BE
.string "Spectator: That {STR_VAR_2}'s appeal\n"
.string "startled even me!\p"
.string "{STR_VAR_2}, you were awesome!$"
gTVContestLiveUpdatesText07:: @ 0828A202
ContestLiveUpdates_Text_UsedCombo:: @ 0828A202
.string "Spectator: That {STR_VAR_2}'s combo\n"
.string "appeal was stunning!\p"
.string "It's shaken me to the core!$"
gTVContestLiveUpdatesText08:: @ 0828A24E
ContestLiveUpdates_Text_ExcitingAppeal:: @ 0828A24E
.string "Spectator: The winning {STR_VAR_2}'s\n"
.string "appeal got my heart pounding!$"
gTVContestLiveUpdatesText09:: @ 0828A288
ContestLiveUpdates_Text_WasCool:: @ 0828A288
.string "{STR_VAR_2}!\n"
.string "You were cool!$"
gTVContestLiveUpdatesText10:: @ 0828A29B
ContestLiveUpdates_Text_WasBeautiful:: @ 0828A29B
.string "{STR_VAR_2}!\n"
.string "You were beautiful!$"
gTVContestLiveUpdatesText11:: @ 0828A2B3
ContestLiveUpdates_Text_WasCute:: @ 0828A2B3
.string "{STR_VAR_2}!\n"
.string "You were cute!$"
gTVContestLiveUpdatesText12:: @ 0828A2C6
ContestLiveUpdates_Text_WasSmart:: @ 0828A2C6
.string "{STR_VAR_2}!\n"
.string "You were smart!$"
gTVContestLiveUpdatesText13:: @ 0828A2DA
ContestLiveUpdates_Text_WasTough:: @ 0828A2DA
.string "{STR_VAR_2}!\n"
.string "You were tough!$"
gTVContestLiveUpdatesText14:: @ 0828A2EE
ContestLiveUpdates_Text_VeryExcitingAppeal:: @ 0828A2EE
.string "Spectator: The winning {STR_VAR_2}'s\n"
.string "appeal still has my heart pounding!$"
gTVContestLiveUpdatesText15:: @ 0828A32E
ContestLiveUpdates_Text_VeryCool:: @ 0828A32E
.string "{STR_VAR_2}!\n"
.string "You're the last word in cool!$"
gTVContestLiveUpdatesText16:: @ 0828A350
ContestLiveUpdates_Text_VeryBeautiful:: @ 0828A350
.string "{STR_VAR_2}!\n"
.string "You're the most beautiful!$"
gTVContestLiveUpdatesText17:: @ 0828A36F
ContestLiveUpdates_Text_VeryCute:: @ 0828A36F
.string "{STR_VAR_2}!\n"
.string "You're simply the cutest!$"
gTVContestLiveUpdatesText18:: @ 0828A38D
ContestLiveUpdates_Text_VerySmart:: @ 0828A38D
.string "{STR_VAR_2}!\n"
.string "You're the smartest among the smart!$"
gTVContestLiveUpdatesText19:: @ 0828A3B6
ContestLiveUpdates_Text_VeryTough:: @ 0828A3B6
.string "{STR_VAR_2}!\n"
.string "You're the toughest of the tough!$"
gTVContestLiveUpdatesText20:: @ 0828A3DC
ContestLiveUpdates_Text_TookBreak:: @ 0828A3DC
.string "Spectator: Even when the {STR_VAR_2}\n"
.string "took a break from making appeals,\l"
.string "I couldn't take my eyes off it.\p"
.string "I'm captivated by that {STR_VAR_2}.$"
gTVContestLiveUpdatesText21:: @ 0828A455
ContestLiveUpdates_Text_GotStartled:: @ 0828A455
.string "Spectator: When the {STR_VAR_2} was\n"
.string "startled by another POKéMON's appeal,\l"
.string "I was close to tears.\p"
.string "{STR_VAR_2}, you were resilient!\n"
.string "Way to go!$"
gTVContestLiveUpdatesText22:: @ 0828A4CF
ContestLiveUpdates_Text_MoveWonderful:: @ 0828A4CF
.string "Spectator: Oh…\n"
.string "That {STR_VAR_2}'s {STR_VAR_3}!\l"
.string "{STR_VAR_2}'s {STR_VAR_3}!\l"
.string "{STR_VAR_2}'s {STR_VAR_3}!\l"
.string "How could it be so wonderful?$"
gTVContestLiveUpdatesText23:: @ 0828A51C
ContestLiveUpdates_Text_TalkAboutAnotherMon:: @ 0828A51C
.string "MC: Well, there you have it. This place\n"
.string "is full of the {STR_VAR_1}'s fans!\p"
.string "I should also mention that another\n"
@ -2573,20 +2573,20 @@ gTVContestLiveUpdatesText23:: @ 0828A51C
.string "caught my eye.\p"
.string "{STR_VAR_2}'s {STR_VAR_3}…$"
gTVContestLiveUpdatesText24:: @ 0828A5AC
ContestLiveUpdates_Text_FailedToAppeal:: @ 0828A5AC
.string "It failed to make a single appeal during\n"
.string "secondary judging out of nervousness.\p"
.string "Next time, I would like to see this\n"
.string "{STR_VAR_1} make even one appeal.$"
gTVContestLiveUpdatesText25:: @ 0828A638
ContestLiveUpdates_Text_LastInBothRounds:: @ 0828A638
.string "It came dead last in both primary\n"
.string "and secondary judging.\p"
.string "I hope that {STR_VAR_1} will retrain this\n"
.string "{STR_VAR_2} and erase the shame of\l"
.string "this undisputed last-place finish.$"
gTVContestLiveUpdatesText26:: @ 0828A6CF
ContestLiveUpdates_Text_NotExcitingEnough:: @ 0828A6CF
.string "It failed to take advantage of\n"
.string "the audience's excitement and make\l"
.string "an appropriate appeal.\p"
@ -2594,7 +2594,7 @@ gTVContestLiveUpdatesText26:: @ 0828A6CF
.string "a feel for the audience and whip their\l"
.string "excitement to a fever pitch next time.$"
gTVContestLiveUpdatesText27:: @ 0828A797
ContestLiveUpdates_Text_LostAfterWinningRound1:: @ 0828A797
.string "While finishing first in the primary\n"
.string "judging, its appeals in the secondary\l"
.string "judging failed to click.\p"
@ -2603,14 +2603,14 @@ gTVContestLiveUpdatesText27:: @ 0828A797
.string "I'm sure {STR_VAR_1} is studying how to\n"
.string "make more effective appeals now.$"
gTVContestLiveUpdatesText28:: @ 0828A86D
ContestLiveUpdates_Text_NeverExciting:: @ 0828A86D
.string "The audience never got excited by its\n"
.string "appeals during the secondary judging.\p"
.string "We hope it will stop worrying about\n"
.string "other POKéMON and learn to pitch\l"
.string "its appeals to the audience more.$"
gTVContestLiveUpdatesText29:: @ 0828A920
ContestLiveUpdates_Text_LostBySmallMargin:: @ 0828A920
.string "It lost to {STR_VAR_1}'s {STR_VAR_2}\n"
.string "by only a small margin.\p"
.string "It must be heartbreaking to come\n"
@ -2618,7 +2618,7 @@ gTVContestLiveUpdatesText29:: @ 0828A920
.string "I wouldn't be surprised if {STR_VAR_3}\n"
.string "were weeping over this outcome.$"
gTVContestLiveUpdatesText30:: @ 0828A9CC
ContestLiveUpdates_Text_RepeatedAppeals:: @ 0828A9CC
.string "It disappointed the JUDGE by\n"
.string "repeating the same appeals.\p"
.string "It's an unforgivable error in any\n"
@ -2626,14 +2626,14 @@ gTVContestLiveUpdatesText30:: @ 0828A9CC
.string "{STR_VAR_1} should feel guilty for\n"
.string "this sorry showing.$"
gTVContestLiveUpdatesText31:: @ 0828AA74
ContestLiveUpdates_Text_ValiantEffortButLost:: @ 0828AA74
.string "{STR_VAR_1} turned in a valiant effort,\n"
.string "but…\p"
.string "It was all for naught, finishing last.\p"
.string "{STR_VAR_1} should learn from this loss\n"
.string "and put the knowledge to good use.$"
gTVContestLiveUpdatesText32:: @ 0828AB01
ContestLiveUpdates_Text_Outro:: @ 0828AB01
.string "I'd like to end this program with our\n"
.string "usual farewell to the winners.\p"
.string "This time, it's {STR_VAR_1} and\n"

View File

Before

Width:  |  Height:  |  Size: 873 B

After

Width:  |  Height:  |  Size: 873 B

View File

@ -1,9 +1,9 @@
#ifndef GUARD_CONSTANTS_CONTEST_H
#define GUARD_CONSTANTS_CONTEST_H
#define CONTESTANT_COUNT 4
#define APPLAUSE_METER_SIZE 5
#define CONTEST_TURN_COUNT 5
#define CONTEST_NUM_APPEALS 5
#define CONTEST_LAST_APPEAL (CONTEST_NUM_APPEALS - 1)
#define LINK_CONTEST_FLAG_IS_LINK (1 << 0)
#define LINK_CONTEST_FLAG_IS_WIRELESS (1 << 1)
@ -22,13 +22,6 @@
#define CONTEST_TYPE_NPC_MASTER (CONTEST_RANK_MASTER + 1)
#define CONTEST_TYPE_LINK (CONTEST_RANK_LINK + 1)
#define CONTEST_CATEGORY_COOL 0
#define CONTEST_CATEGORY_BEAUTY 1
#define CONTEST_CATEGORY_CUTE 2
#define CONTEST_CATEGORY_SMART 3
#define CONTEST_CATEGORY_TOUGH 4
#define CONTEST_CATEGORIES_COUNT 5
#define CONTEST_WINNER_ARTIST 0 // Winner shown by the artist, painting not necessarily saved
#define CONTEST_WINNER_HALL_1 1
#define CONTEST_WINNER_HALL_2 2
@ -52,4 +45,124 @@
#define CANT_ENTER_CONTEST_EGG 3
#define CANT_ENTER_CONTEST_FAINTED 4
#define CONTEST_AI_CHECK_BAD_MOVE (1 << 0)
#define CONTEST_AI_CHECK_COMBO (1 << 1)
#define CONTEST_AI_CHECK_BORING (1 << 2)
#define CONTEST_AI_CHECK_EXCITEMENT (1 << 3)
#define CONTEST_AI_CHECK_ORDER (1 << 4)
#define CONTEST_AI_CHECK_GOOD_MOVE (1 << 5)
#define CONTEST_AI_ERRATIC (1 << 6)
#define CONTEST_EFFECT_HIGHLY_APPEALING 0
#define CONTEST_EFFECT_USER_MORE_EASILY_STARTLED 1
#define CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES 2
#define CONTEST_EFFECT_REPETITION_NOT_BORING 3
#define CONTEST_EFFECT_AVOID_STARTLE_ONCE 4
#define CONTEST_EFFECT_AVOID_STARTLE 5
#define CONTEST_EFFECT_AVOID_STARTLE_SLIGHTLY 6
#define CONTEST_EFFECT_USER_LESS_EASILY_STARTLED 7
#define CONTEST_EFFECT_STARTLE_FRONT_MON 8
#define CONTEST_EFFECT_SLIGHTLY_STARTLE_PREV_MONS 9
#define CONTEST_EFFECT_STARTLE_PREV_MON 10
#define CONTEST_EFFECT_STARTLE_PREV_MONS 11
#define CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON 12
#define CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS 13
#define CONTEST_EFFECT_STARTLE_PREV_MON_2 14
#define CONTEST_EFFECT_STARTLE_PREV_MONS_2 15
#define CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION 16
#define CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION 17
#define CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN 18
#define CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL 19
#define CONTEST_EFFECT_STARTLE_MONS_COOL_APPEAL 20
#define CONTEST_EFFECT_STARTLE_MONS_BEAUTY_APPEAL 21
#define CONTEST_EFFECT_STARTLE_MONS_CUTE_APPEAL 22
#define CONTEST_EFFECT_STARTLE_MONS_SMART_APPEAL 23
#define CONTEST_EFFECT_STARTLE_MONS_TOUGH_APPEAL 24
#define CONTEST_EFFECT_MAKE_FOLLOWING_MON_NERVOUS 25
#define CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS 26
#define CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS 27
#define CONTEST_EFFECT_BADLY_STARTLES_MONS_IN_GOOD_CONDITION 28
#define CONTEST_EFFECT_BETTER_IF_FIRST 29
#define CONTEST_EFFECT_BETTER_IF_LAST 30
#define CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES 31
#define CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE 32
#define CONTEST_EFFECT_BETTER_WHEN_LATER 33
#define CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING 34
#define CONTEST_EFFECT_BETTER_IF_SAME_TYPE 35
#define CONTEST_EFFECT_BETTER_IF_DIFF_TYPE 36
#define CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL 37
#define CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS 38
#define CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION 39
#define CONTEST_EFFECT_NEXT_APPEAL_EARLIER 40
#define CONTEST_EFFECT_NEXT_APPEAL_LATER 41
#define CONTEST_EFFECT_MAKE_SCRAMBLING_TURN_ORDER_EASIER 42
#define CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER 43
#define CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST 44
#define CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS 45
#define CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED 46
#define CONTEST_EFFECT_DONT_EXCITE_AUDIENCE 47
#define COMBO_STARTER_RAIN_DANCE 1
#define COMBO_STARTER_RAGE 2
#define COMBO_STARTER_FOCUS_ENERGY 3
#define COMBO_STARTER_HYPNOSIS 4
#define COMBO_STARTER_ENDURE 5
#define COMBO_STARTER_HORN_ATTACK 6
#define COMBO_STARTER_SWORDS_DANCE 7
#define COMBO_STARTER_STOCKPILE 8
#define COMBO_STARTER_SUNNY_DAY 9
#define COMBO_STARTER_REST 10
#define COMBO_STARTER_VICE_GRIP 11
#define COMBO_STARTER_DEFENSE_CURL 12
#define COMBO_STARTER_CHARGE 13
#define COMBO_STARTER_ROCK_THROW 14
#define COMBO_STARTER_YAWN 15
#define COMBO_STARTER_SCARY_FACE 16
#define COMBO_STARTER_POWDER_SNOW 17
#define COMBO_STARTER_LOCK_ON 18
#define COMBO_STARTER_SOFT_BOILED 19
#define COMBO_STARTER_MEAN_LOOK 20
#define COMBO_STARTER_SCRATCH 21
#define COMBO_STARTER_GROWTH 22
#define COMBO_STARTER_HAIL 23
#define COMBO_STARTER_SANDSTORM 24
#define COMBO_STARTER_BELLY_DRUM 25
#define COMBO_STARTER_MIND_READER 26
#define COMBO_STARTER_DRAGON_BREATH 27
#define COMBO_STARTER_DRAGON_RAGE 28
#define COMBO_STARTER_DRAGON_DANCE 29
#define COMBO_STARTER_SURF 30
#define COMBO_STARTER_DIVE 31
#define COMBO_STARTER_STRING_SHOT 32
#define COMBO_STARTER_LEER 33
#define COMBO_STARTER_TAUNT 34
#define COMBO_STARTER_CHARM 35
#define COMBO_STARTER_HARDEN 36
#define COMBO_STARTER_SING 37
#define COMBO_STARTER_EARTHQUAKE 38
#define COMBO_STARTER_DOUBLE_TEAM 39
#define COMBO_STARTER_CURSE 40
#define COMBO_STARTER_SWEET_SCENT 41
#define COMBO_STARTER_SLUDGE 42
#define COMBO_STARTER_SLUDGE_BOMB 43
#define COMBO_STARTER_THUNDER_PUNCH 44
#define COMBO_STARTER_FIRE_PUNCH 45
#define COMBO_STARTER_ICE_PUNCH 46
#define COMBO_STARTER_PECK 47
#define COMBO_STARTER_METAL_SOUND 48
#define COMBO_STARTER_MUD_SPORT 49
#define COMBO_STARTER_WATER_SPORT 50
#define COMBO_STARTER_BONE_CLUB 51
#define COMBO_STARTER_BONEMERANG 52
#define COMBO_STARTER_BONE_RUSH 53
#define COMBO_STARTER_SAND_ATTACK 54
#define COMBO_STARTER_MUD_SLAP 55
#define COMBO_STARTER_FAKE_OUT 56
#define COMBO_STARTER_PSYCHIC 57
#define COMBO_STARTER_KINESIS 58
#define COMBO_STARTER_CONFUSION 59
#define COMBO_STARTER_POUND 60
#define COMBO_STARTER_SMOG 61
#define COMBO_STARTER_CALM_MIND 62
#endif // GUARD_CONSTANTS_CONTEST_H

View File

@ -60,6 +60,14 @@
#define MAX_MON_MOVES 4
#define NUM_STATS 6
#define CONTESTANT_COUNT 4
#define CONTEST_CATEGORY_COOL 0
#define CONTEST_CATEGORY_BEAUTY 1
#define CONTEST_CATEGORY_CUTE 2
#define CONTEST_CATEGORY_SMART 3
#define CONTEST_CATEGORY_TOUGH 4
#define CONTEST_CATEGORIES_COUNT 5
// party sizes
#define PARTY_SIZE 6
#define MULTI_PARTY_SIZE PARTY_SIZE / 2

View File

@ -133,5 +133,59 @@
#define NUM_SECRET_BASE_FLAGS 32 // by definition, bitfield of 2 u16s
// TV Show states for Pokemon Contest Live Updates
#define CONTESTLIVE_STATE_INTRO 0
#define CONTESTLIVE_STATE_WON_BOTH_ROUNDS 1
#define CONTESTLIVE_STATE_BETTER_ROUND2 2
#define CONTESTLIVE_STATE_EQUAL_ROUNDS 3
#define CONTESTLIVE_STATE_BETTER_ROUND1 4
#define CONTESTLIVE_STATE_GOT_NERVOUS 5
#define CONTESTLIVE_STATE_STARTLED_OTHER 6
#define CONTESTLIVE_STATE_USED_COMBO 7
#define CONTESTLIVE_STATE_EXCITING_APPEAL 8
#define CONTESTLIVE_STATE_COOL 9
#define CONTESTLIVE_STATE_BEAUTIFUL 10
#define CONTESTLIVE_STATE_CUTE 11
#define CONTESTLIVE_STATE_SMART 12
#define CONTESTLIVE_STATE_TOUGH 13
#define CONTESTLIVE_STATE_VERY_EXCITING_APPEAL 14
#define CONTESTLIVE_STATE_VERY_COOL 15
#define CONTESTLIVE_STATE_VERY_BEAUTIFUL 16
#define CONTESTLIVE_STATE_VERY_CUTE 17
#define CONTESTLIVE_STATE_VERY_SMART 18
#define CONTESTLIVE_STATE_VERY_TOUGH 19
#define CONTESTLIVE_STATE_TOOK_BREAK 20
#define CONTESTLIVE_STATE_GOT_STARTLED 21
#define CONTESTLIVE_STATE_USED_MOVE 22
#define CONTESTLIVE_STATE_TALK_ABOUT_LOSER 23
#define CONTESTLIVE_STATE_NO_APPEALS 24
#define CONTESTLIVE_STATE_LAST_BOTH 25
#define CONTESTLIVE_STATE_NOT_EXCITING_ENOUGH 26
#define CONTESTLIVE_STATE_LOST_AFTER_ROUND1_WIN 27
#define CONTESTLIVE_STATE_NO_EXCITING_APPEALS 28
#define CONTESTLIVE_STATE_LOST_SMALL_MARGIN 29
#define CONTESTLIVE_STATE_REPEATED_APPEALS 30
#define CONTESTLIVE_STATE_LOST 31
#define CONTESTLIVE_STATE_OUTRO 32
// Flags used to comment on winner
#define CONTESTLIVE_FLAG_EXCITING_APPEAL (1 << 0)
#define CONTESTLIVE_FLAG_GOT_NERVOUS (1 << 1)
#define CONTESTLIVE_FLAG_MAXED_EXCITEMENT (1 << 2)
#define CONTESTLIVE_FLAG_USED_COMBO (1 << 3)
#define CONTESTLIVE_FLAG_STARTLED_OTHER (1 << 4)
#define CONTESTLIVE_FLAG_SKIPPED_TURN (1 << 5)
#define CONTESTLIVE_FLAG_GOT_STARTLED (1 << 6)
#define CONTESTLIVE_FLAG_MADE_APPEAL (1 << 7)
// Flags used to comment on loser
#define CONTESTLIVE_FLAG_LOST (1 << 0)
#define CONTESTLIVE_FLAG_REPEATED_MOVE (1 << 1)
#define CONTESTLIVE_FLAG_LOST_SMALL_MARGIN (1 << 2)
#define CONTESTLIVE_FLAG_NO_EXCITEMENT (1 << 3)
#define CONTESTLIVE_FLAG_BLEW_LEAD (1 << 4)
#define CONTESTLIVE_FLAG_MISSED_EXCITEMENT (1 << 5)
#define CONTESTLIVE_FLAG_LAST_BOTH_ROUNDS (1 << 6)
#define CONTESTLIVE_FLAG_NO_APPEALS (1 << 7)
#endif //GUARD_CONSTANTS_TV_H

View File

@ -4,135 +4,6 @@
#include "palette.h"
#include "constants/contest.h"
enum
{
CONTEST_DEBUG_MODE_OFF,
// Prints the totalPoints value for each contestant.
CONTEST_DEBUG_MODE_PRINT_POINT_TOTAL,
// Prints the ContestResourcesField1C::unk_C value as a bitstring for each contestant.
CONTEST_DEBUG_MODE_PRINT_UNK_C,
// Prints the ContestResourcesField1C::unk_D value as a bitstring for each contestant.
CONTEST_DEBUG_MODE_PRINT_UNK_D
};
enum
{
CONTEST_EFFECT_HIGHLY_APPEALING,
CONTEST_EFFECT_USER_MORE_EASILY_STARTLED,
CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES,
CONTEST_EFFECT_REPETITION_NOT_BORING,
CONTEST_EFFECT_AVOID_STARTLE_ONCE,
CONTEST_EFFECT_AVOID_STARTLE,
CONTEST_EFFECT_AVOID_STARTLE_SLIGHTLY,
CONTEST_EFFECT_USER_LESS_EASILY_STARTLED,
CONTEST_EFFECT_STARTLE_FRONT_MON,
CONTEST_EFFECT_SLIGHTLY_STARTLE_PREV_MONS,
CONTEST_EFFECT_STARTLE_PREV_MON,
CONTEST_EFFECT_STARTLE_PREV_MONS,
CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON,
CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS,
CONTEST_EFFECT_STARTLE_PREV_MON_2,
CONTEST_EFFECT_STARTLE_PREV_MONS_2,
CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION,
CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION,
CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN,
CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL,
CONTEST_EFFECT_STARTLE_MONS_COOL_APPEAL,
CONTEST_EFFECT_STARTLE_MONS_BEAUTY_APPEAL,
CONTEST_EFFECT_STARTLE_MONS_CUTE_APPEAL,
CONTEST_EFFECT_STARTLE_MONS_SMART_APPEAL,
CONTEST_EFFECT_STARTLE_MONS_TOUGH_APPEAL,
CONTEST_EFFECT_MAKE_FOLLOWING_MON_NERVOUS,
CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS,
CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS,
CONTEST_EFFECT_BADLY_STARTLES_MONS_IN_GOOD_CONDITION,
CONTEST_EFFECT_BETTER_IF_FIRST,
CONTEST_EFFECT_BETTER_IF_LAST,
CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES,
CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE,
CONTEST_EFFECT_BETTER_WHEN_LATER,
CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING,
CONTEST_EFFECT_BETTER_IF_SAME_TYPE,
CONTEST_EFFECT_BETTER_IF_DIFF_TYPE,
CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL,
CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS,
CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION,
CONTEST_EFFECT_NEXT_APPEAL_EARLIER,
CONTEST_EFFECT_NEXT_APPEAL_LATER,
CONTEST_EFFECT_MAKE_SCRAMBLING_TURN_ORDER_EASIER,
CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER,
CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST,
CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS,
CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED,
CONTEST_EFFECT_DONT_EXCITE_AUDIENCE
};
enum
{
COMBO_STARTER_RAIN_DANCE = 1,
COMBO_STARTER_RAGE,
COMBO_STARTER_FOCUS_ENERGY,
COMBO_STARTER_HYPNOSIS,
COMBO_STARTER_ENDURE,
COMBO_STARTER_HORN_ATTACK,
COMBO_STARTER_SWORDS_DANCE,
COMBO_STARTER_STOCKPILE,
COMBO_STARTER_SUNNY_DAY,
COMBO_STARTER_REST,
COMBO_STARTER_VICE_GRIP,
COMBO_STARTER_DEFENSE_CURL,
COMBO_STARTER_CHARGE,
COMBO_STARTER_ROCK_THROW,
COMBO_STARTER_YAWN,
COMBO_STARTER_SCARY_FACE,
COMBO_STARTER_POWDER_SNOW,
COMBO_STARTER_LOCK_ON,
COMBO_STARTER_SOFT_BOILED,
COMBO_STARTER_MEAN_LOOK,
COMBO_STARTER_SCRATCH,
COMBO_STARTER_GROWTH,
COMBO_STARTER_HAIL,
COMBO_STARTER_SANDSTORM,
COMBO_STARTER_BELLY_DRUM,
COMBO_STARTER_MIND_READER,
COMBO_STARTER_DRAGON_BREATH,
COMBO_STARTER_DRAGON_RAGE,
COMBO_STARTER_DRAGON_DANCE,
COMBO_STARTER_SURF,
COMBO_STARTER_DIVE,
COMBO_STARTER_STRING_SHOT,
COMBO_STARTER_LEER,
COMBO_STARTER_TAUNT,
COMBO_STARTER_CHARM,
COMBO_STARTER_HARDEN,
COMBO_STARTER_SING,
COMBO_STARTER_EARTHQUAKE,
COMBO_STARTER_DOUBLE_TEAM,
COMBO_STARTER_CURSE,
COMBO_STARTER_SWEET_SCENT,
COMBO_STARTER_SLUDGE,
COMBO_STARTER_SLUDGE_BOMB,
COMBO_STARTER_THUNDER_PUNCH,
COMBO_STARTER_FIRE_PUNCH,
COMBO_STARTER_ICE_PUNCH,
COMBO_STARTER_PECK,
COMBO_STARTER_METAL_SOUND,
COMBO_STARTER_MUD_SPORT,
COMBO_STARTER_WATER_SPORT,
COMBO_STARTER_BONE_CLUB,
COMBO_STARTER_BONEMERANG,
COMBO_STARTER_BONE_RUSH,
COMBO_STARTER_SAND_ATTACK,
COMBO_STARTER_MUD_SLAP,
COMBO_STARTER_FAKE_OUT,
COMBO_STARTER_PSYCHIC,
COMBO_STARTER_KINESIS,
COMBO_STARTER_CONFUSION,
COMBO_STARTER_POUND,
COMBO_STARTER_SMOG,
COMBO_STARTER_CALM_MIND
};
enum
{
CONTEST_STRING_MORE_CONSCIOUS,
@ -206,29 +77,38 @@ enum {
CONTEST_FILTER_ONLY_POSTGAME
};
// Constants for changing in-contest Condition (the stars that appear during appeals)
enum {
CONDITION_NO_CHANGE,
CONDITION_GAIN,
CONDITION_LOSE,
};
struct ContestPokemon
{
/*0x00*/ u16 species;
/*0x02*/ u8 nickname[POKEMON_NAME_LENGTH + 1];
/*0x0D*/ u8 trainerName[PLAYER_NAME_LENGTH + 1];
/*0x15*/ u8 trainerGfxId;
/*0x18*/ u32 aiChecks;
/*0x1C*/ u8 whichRank:2; // 0x1 0x2
u8 aiPool_Cool:1; // 0x4
u8 aiPool_Beauty:1; // 0x8
u8 aiPool_Cute:1; // 0x10
u8 aiPool_Smart:1; // 0x20
u8 aiPool_Tough:1; // 0x40
/*0x1E*/ u16 moves[MAX_MON_MOVES]; // moves
/*0x26*/ u8 cool; // cool
/*0x27*/ u8 beauty; // beauty
/*0x28*/ u8 cute; // cute
/*0x29*/ u8 smart; // smart
/*0x2A*/ u8 tough; // tough
/*0x2B*/ u8 sheen; // sheen
/*0x2C*/ u8 unk2C[12];
/*0x38*/ u32 personality; // personality
/*0x3C*/ u32 otId; // otId
u16 species;
u8 nickname[POKEMON_NAME_LENGTH + 1];
u8 trainerName[PLAYER_NAME_LENGTH + 1];
u8 trainerGfxId;
u32 aiChecks;
u8 whichRank:2;
u8 aiPool_Cool:1;
u8 aiPool_Beauty:1;
u8 aiPool_Cute:1;
u8 aiPool_Smart:1;
u8 aiPool_Tough:1;
u16 moves[MAX_MON_MOVES];
u8 cool;
u8 beauty;
u8 cute;
u8 smart;
u8 tough;
u8 sheen;
u8 highestRank;
bool8 gameCleared;
u8 unused[10];
u32 personality;
u32 otId;
};
struct Shared1A004
@ -239,101 +119,101 @@ struct Shared1A004
u8 savedJunk[0x800];
};
struct ContestStruct_field_18
struct ContestMoveAnimData
{
u16 species;
u16 unk2;
u8 unk4_0:1;
u8 unk5;
u32 unk8;
u32 unkC;
u32 unk10;
u16 targetSpecies;
bool8 hasTargetAnim:1;
u8 contestant;
u32 personality;
u32 otId;
u32 targetPersonality;
};
struct Contest
{
/*0x0*/ u8 playerMoveChoice;
/*0x1*/ u8 turnNumber;
/*0x2*/ u8 unused2[CONTESTANT_COUNT];
/*0x6*/ u16 unk1920A_0:1; // Task active flags?
u16 unk1920A_1:1;
u16 unk1920A_2:1;
u16 unk1920A_3:1;
u16 unk1920A_4:1;
u16 isShowingApplauseMeter:1;
u16 applauseMeterIsMoving:1;
u16 unk1920A_7:1;
/*0x7*/ u16 unk1920B_0:1;
u16 unk1920B_1:1;
u16 unk1920B_2:1;
/*0x8*/ u8 mainTaskId;
/*0x9*/ u8 unk1920D[4];
/*0xD*/ u8 unk19211;
/*0xE*/ u8 unk19212;
/*0xF*/ u8 filler19213;
/*0x10*/ u8 unk19214;
/*0x11*/ u8 unk19215;
/*0x12*/ u8 unk19216; // sprite ID
/*0x13*/ s8 applauseLevel;
/*0x19218*/ u8 prevTurnOrder[CONTESTANT_COUNT];
/*0x1921C*/ u32 unk1921C; // saved RNG value?
u16 moveHistory[CONTEST_TURN_COUNT][CONTESTANT_COUNT];
u8 excitementHistory[CONTEST_TURN_COUNT][CONTESTANT_COUNT];
u8 playerMoveChoice;
u8 appealNumber;
u8 unk[CONTESTANT_COUNT]; // never read
bool16 unused1:1;
bool16 unused2:1;
bool16 unused3:1;
bool16 unused4:1;
bool16 waitForJudgeSpeechBubble:1;
bool16 isShowingApplauseMeter:1;
bool16 applauseMeterIsMoving:1;
bool16 animatingAudience:1;
bool16 waitForAudienceBlend:1;
bool16 sliderHeartsAnimating:1; // When the slider heart is appearing/disappearing
bool16 waitForLink:1;
u8 mainTaskId;
u8 filler1[4];
u8 judgeAttentionTaskId;
u8 blendTaskId;
u8 filler2;
u8 turnNumber;
u8 currentContestant;
u8 judgeSpeechBubbleSpriteId;
s8 applauseLevel;
u8 prevTurnOrder[CONTESTANT_COUNT];
u32 unusedRng;
u16 moveHistory[CONTEST_NUM_APPEALS][CONTESTANT_COUNT];
u8 excitementHistory[CONTEST_NUM_APPEALS][CONTESTANT_COUNT];
u8 applauseMeterSpriteId;
/*0x1925D*/ u8 contestSetupState;
/*0x1925E*/ u8 unk1925E;
u8 contestSetupState;
u8 moveAnimTurnCount;
};
struct ContestantStatus
{
/*0x00*/ s16 appeal1; // move appeal?
/*0x02*/ s16 appeal2; // final appeal after end of turn, maybe?
/*0x04*/ s16 pointTotal;
/*0x06*/ u16 currMove;
/*0x08*/ u16 prevMove;
/*0x0A*/ u8 moveCategory;
/*0x0B*/ u8 ranking:2;
u8 unkB_2:2;
s16 baseAppeal;
s16 appeal;
s16 pointTotal;
u16 currMove;
u16 prevMove;
u8 moveCategory;
u8 ranking:2;
u8 unused1:2;
u8 moveRepeatCount:3;
u8 noMoreTurns:1; // used a one-time move?
/*0x0C*/ u8 nervous:1;
bool8 noMoreTurns:1; // used a one-time move?
bool8 nervous:1;
u8 numTurnsSkipped:2;
/*0x0D*/ s8 condition;
/*0x0E*/ u8 jam;
/*0x0F*/ u8 jamReduction;
s8 condition;
u8 jam;
u8 jamReduction;
// Flags set by move effect
/*0x10*/ u8 resistant:1;
u8 immune:1;
u8 moreEasilyStartled:1;
u8 usedRepeatableMove:1;
bool8 resistant:1;
bool8 immune:1;
bool8 moreEasilyStartled:1;
bool8 usedRepeatableMove:1;
u8 conditionMod:2; // 1: just raised condition; 2: appeal greatly improved by condition
u8 turnOrderMod:2; // 1: defined; 2: random
/*0x11*/ u8 turnOrderModAction:2; // 1: made first; 2: made last; 3: made random
u8 turnSkipped:1;
u8 exploded:1;
u8 overrideCategoryExcitementMod:1;
u8 appealTripleCondition:1;
u8 turnOrderModAction:2; // 1: made first; 2: made last; 3: made random
bool8 turnSkipped:1;
bool8 exploded:1;
bool8 overrideCategoryExcitementMod:1;
bool8 appealTripleCondition:1;
/*0x12*/ u8 jamSafetyCount;
/*0x13*/ u8 effectStringId; // status action?
/*0x14*/ u8 effectStringId2;
/*0x15*/ u8 disappointedRepeat:1;
u8 unk15_1:1;
u8 unk15_2:1;
u8 unk15_3:1;
u8 hasJudgesAttention:1;
u8 judgesAttentionWasRemoved:1;
u8 unk15_6:1;
/*0x16*/ u8 unk16;
/*0x17*/ u8 unk17;
/*0x18*/ u8 unk18;
/*0x19*/ u8 nextTurnOrder; // turn position
/*0x1A*/ u8 attentionLevel; // How much the Pokemon "stood out"
/*0x1B*/ u8 unk1B;
u8 jamSafetyCount;
u8 effectStringId; // status action?
u8 effectStringId2;
bool8 repeatedMove:1;
bool8 unused2:1;
bool8 repeatedPrevMove:1; // never read
bool8 unk15_3:1;
bool8 hasJudgesAttention:1;
bool8 judgesAttentionWasRemoved:1;
bool8 usedComboMove:1;
bool8 completedCombo;
u8 comboAppealBonus;
u8 repeatJam;
u8 nextTurnOrder; // turn position
u8 attentionLevel; // How much the Pokemon "stood out"
u8 contestantAnimTarget;
};
struct UnknownContestStruct7
struct ContestAppealMoveResults
{
u8 turnOrder[CONTESTANT_COUNT];
s16 jam;
@ -348,9 +228,9 @@ struct ContestAIInfo
/*0x00*/ u8 aiState;
/*0x02*/ u16 nextMove;
/*0x04*/ u8 nextMoveIndex;
/*0x05*/ u8 unk5[4];
/*0x05*/ u8 moveScores[MAX_MON_MOVES];
/*0x09*/ u8 aiAction;
/*0x0A*/ u8 fillerA[0x6]; // TODO: don't know what's here
/*0x0A*/ u8 filler[6];
/*0x10*/ u8 currentAICheck;
/*0x14*/ u32 aiChecks;
/*0x18*/ s16 scriptResult;
@ -360,85 +240,85 @@ struct ContestAIInfo
/*0x41*/ u8 contestantId;
};
struct UnknownContestStruct5
struct ContestExcitement
{
s8 bits_0; // current move excitement?
u8 excitementFrozen:1;
u8 excitementFreezer:3;
s8 unk2;
s8 moveExcitement;
u8 frozen:1;
u8 freezer:3;
s8 excitementAppealBonus;
};
struct UnknownContestStruct4
struct ContestGraphicsState
{
u8 unk0; // sprite ID
u8 unk1; // sprite ID
u8 unk2_0:1;
u8 unk2_1:1;
u8 unk2_2:1;
u8 sliderHeartSpriteId;
u8 nextTurnSpriteId;
bool8 sliderUpdating:1;
bool8 boxBlinking:1;
bool8 updatingAppealHearts:1;
};
struct UnknownContestStruct6
struct ContestFinalStandings
{
s32 unk0;
s32 unk4;
s32 unk8;
s32 unkC;
s32 totalPoints;
s32 round1Points;
s32 random;
s32 contestant;
};
struct ContestResourcesField1C
struct ContestTV
{
u16 unk0[5];
s16 unkA;
u8 unkC;
u8 unkD;
u8 unkE_1:1;
u8 unkE_2:1;
u16 appeals[CONTEST_NUM_APPEALS];
s16 move;
u8 winnerFlags;
u8 loserFlags;
bool8 madeAppeal:1;
bool8 madeExcitingAppeal:1;
};
struct ContestResourcesField20
struct ContestUnused
{
u8 filler_00[0x0C];
u8 filler[12];
};
struct ContestResources
{
struct Contest *contest;
struct ContestantStatus *status;
struct UnknownContestStruct7 *field_8;
struct ContestAppealMoveResults *appealResults;
struct ContestAIInfo *aiData;
struct UnknownContestStruct5 *field_10;
struct UnknownContestStruct4 *field_14;
struct ContestStruct_field_18 *field_18;
struct ContestResourcesField1C * field_1c;
struct ContestResourcesField20 * field_20;
struct ContestExcitement *excitement;
struct ContestGraphicsState *gfxState;
struct ContestMoveAnimData *moveAnim;
struct ContestTV *tv;
struct ContestUnused * unused;
u8 * contestBgTilemaps[CONTESTANT_COUNT];
void * field_34;
void * field_38;
void * boxBlinkTiles1;
void * boxBlinkTiles2;
void * field_3c;
};
#define eContest (*gContestResources->contest)
#define eContestantStatus (gContestResources->status)
#define eContestResources8 (*gContestResources->field_8)
#define eContestAppealResults (*gContestResources->appealResults)
#define eContestAI (*gContestResources->aiData)
#define eContestResources10 (*gContestResources->field_10)
#define eContestResources14 (*gContestResources->field_14)
#define eUnzippedContestAudienceGfx (gHeap + 0x18000)
#define eUnknownHeap19000 (gHeap + 0x19000)
#define eContestExcitement (*gContestResources->excitement)
#define eContestGfxState (gContestResources->gfxState)
#define eUnzippedContestAudience_Gfx (gHeap + 0x18000)
#define eContestAudienceFrame2_Gfx (gHeap + 0x19000)
#define eContestDebugMode (gHeap[0x1a000])
#define eUnknownHeap1A004 (*(struct Shared1A004 *)(gHeap + 0x1a004))
extern struct ContestPokemon gContestMons[CONTESTANT_COUNT];
extern s16 gContestMonConditions[CONTESTANT_COUNT];
extern s16 gContestMonRound1Points[CONTESTANT_COUNT];
extern s16 gContestMonTotalPoints[CONTESTANT_COUNT];
extern s16 gUnknown_02039F10[CONTESTANT_COUNT];
extern s16 gContestMonAppealPointTotals[CONTESTANT_COUNT];
extern s16 gContestMonRound2Points[CONTESTANT_COUNT];
extern u8 gContestFinalStandings[CONTESTANT_COUNT];
extern u8 gContestMonPartyIndex;
extern u8 gContestPlayerMonIndex;
extern u8 gContestantTurnOrder[CONTESTANT_COUNT];
extern u8 gLinkContestFlags;
extern u8 gUnknown_02039F2B;
extern u8 gContestLinkLeaderIndex;
extern u16 gSpecialVar_ContestCategory;
extern u16 gSpecialVar_ContestRank;
extern u8 gNumLinkContestPlayers;
@ -454,11 +334,11 @@ extern u32 gContestRngValue;
void ResetLinkContestBoolean(void);
void LoadContestBgAfterMoveAnim(void);
void CB2_StartContest(void);
void sub_80DA8C8(u8 partyIndex);
void sub_80DAB8C(u8 contestType, u8 rank);
void sub_80DACBC(u8 contestType, u8 rank, bool32 isPostgame);
void CreateContestMonFromParty(u8 partyIndex);
void SetContestants(u8 contestType, u8 rank);
void SetLinkAIContestants(u8 contestType, u8 rank, bool32 isPostgame);
u8 GetContestEntryEligibility(struct Pokemon *pkmn);
void sub_80DB09C(u8 contestCategory);
void CalculateRound1Points(u8 contestCategory);
bool8 IsSpeciesNotUnown(u16 species);
bool8 Contest_IsMonsTurnDisabled(u8 a);
void SaveLinkContestResults(void);
@ -468,24 +348,12 @@ void SetContestantEffectStringID2(u8 a, u8 b);
void SetStartledString(u8 contestant, u8 jam);
void MakeContestantNervous(u8 p);
s8 Contest_GetMoveExcitement(u16 move);
bool8 sub_80DE1E8(u8 a);
bool8 IsContestantAllowedToCombo(u8 contestant);
void Contest_PrintTextToBg0WindowAt(u32 windowId, u8 *currChar, s32 x, s32 y, s32 fontId);
void ResetContestLinkResults(void);
bool8 sub_80DEDA8(u8 a);
u8 sub_80DEFA8(u8 a, u8 b);
void ClearContestWinnerPicsInContestHall(void);
void sub_80DFA08(struct ContestPokemon *mon, s32 language);
// contest link
void sub_81D9DE4(u8 taskId);
void sub_80FCF40(u8);
void sub_80FCFD0(u8);
void sub_80F8714(u8);
bool32 sub_80FC670(s16 *);
bool32 sub_80FC4F4(void *, u16);
bool8 sub_80FC55C(void);
bool8 sub_80FC530(u8);
u8 sub_80F86E0(u8 *);
void sub_80FC9F8(u8 taskId);
void StripPlayerAndMonNamesForLinkContest(struct ContestPokemon *mon, s32 language);
#endif //GUARD_CONTEST_H

View File

@ -1,13 +1,23 @@
#ifndef GUARD_CONTEST_LINK_H
#define GUARD_CONTEST_LINK_H
void sub_80FCC88(u8);
void sub_80FCC88(u8);
void sub_80FCACC(u8);
void sub_80FC580(u8);
void sub_80FC6BC(u8);
void sub_80FC804(u8);
void sub_80FCE48(u8);
void sub_80FC894(u8);
void Task_LinkContest_CommunicateAppealsState(u8);
void Task_LinkContest_CommunicateFinalStandings(u8);
void Task_LinkContest_Init(u8);
void Task_LinkContest_CommunicateMonsRS(u8);
void Task_LinkContest_CommunicateRngRS(u8);
void Task_LinkContest_CommunicateLeaderIdsRS(u8);
void Task_LinkContest_CommunicateCategoryRS(u8);
void Task_LinkContest_CommunicateMonIdxs(u8);
void Task_LinkContest_StartCommunicationEm(u8);
void Task_LinkContest_CommunicateRound1Points(u8);
void Task_LinkContest_CommunicateTurnOrder(u8);
void Task_LinkContest_FinalizeConnection(u8);
void Task_LinkContest_CommunicateMoveSelections(u8);
bool32 LinkContest_TryLinkStandby(s16 *);
bool32 LinkContest_SendBlock(void *, u16);
bool8 LinkContest_GetBlockReceivedFromAllPlayers(void);
bool8 LinkContest_GetBlockReceived(u8);
u8 LinkContest_GetLeaderIndex(u8 *);
#endif //GUARD_CONTEST_LINK_H

View File

@ -7,6 +7,8 @@ void StartContest(void);
void BufferContestantMonSpecies(void);
void ShowContestResults(void);
void ContestLinkTransfer(u8);
void sub_80FC998(u8 taskId);
void ShowContestWinnerPainting(void);
u16 GetContestRand(void);
u8 CountPlayerContestPaintings(void);
#endif // GUARD_CONTEST_UTIL_H

View File

@ -294,39 +294,39 @@ extern const u8 gTVSafariFanClubText07[];
extern const u8 gTVSafariFanClubText08[];
extern const u8 gTVSafariFanClubText09[];
extern const u8 gTVSafariFanClubText10[];
extern const u8 gTVContestLiveUpdatesText00[];
extern const u8 gTVContestLiveUpdatesText01[];
extern const u8 gTVContestLiveUpdatesText02[];
extern const u8 gTVContestLiveUpdatesText03[];
extern const u8 gTVContestLiveUpdatesText04[];
extern const u8 gTVContestLiveUpdatesText05[];
extern const u8 gTVContestLiveUpdatesText06[];
extern const u8 gTVContestLiveUpdatesText07[];
extern const u8 gTVContestLiveUpdatesText08[];
extern const u8 gTVContestLiveUpdatesText09[];
extern const u8 gTVContestLiveUpdatesText10[];
extern const u8 gTVContestLiveUpdatesText11[];
extern const u8 gTVContestLiveUpdatesText12[];
extern const u8 gTVContestLiveUpdatesText13[];
extern const u8 gTVContestLiveUpdatesText14[];
extern const u8 gTVContestLiveUpdatesText15[];
extern const u8 gTVContestLiveUpdatesText16[];
extern const u8 gTVContestLiveUpdatesText17[];
extern const u8 gTVContestLiveUpdatesText18[];
extern const u8 gTVContestLiveUpdatesText19[];
extern const u8 gTVContestLiveUpdatesText20[];
extern const u8 gTVContestLiveUpdatesText21[];
extern const u8 gTVContestLiveUpdatesText22[];
extern const u8 gTVContestLiveUpdatesText23[];
extern const u8 gTVContestLiveUpdatesText24[];
extern const u8 gTVContestLiveUpdatesText25[];
extern const u8 gTVContestLiveUpdatesText26[];
extern const u8 gTVContestLiveUpdatesText27[];
extern const u8 gTVContestLiveUpdatesText28[];
extern const u8 gTVContestLiveUpdatesText29[];
extern const u8 gTVContestLiveUpdatesText30[];
extern const u8 gTVContestLiveUpdatesText31[];
extern const u8 gTVContestLiveUpdatesText32[];
extern const u8 ContestLiveUpdates_Text_Intro[];
extern const u8 ContestLiveUpdates_Text_WonBothRounds[];
extern const u8 ContestLiveUpdates_Text_BetterRound2[];
extern const u8 ContestLiveUpdates_Text_EqualRounds[];
extern const u8 ContestLiveUpdates_Text_BetterRound1[];
extern const u8 ContestLiveUpdates_Text_GotNervous[];
extern const u8 ContestLiveUpdates_Text_StartledFoes[];
extern const u8 ContestLiveUpdates_Text_UsedCombo[];
extern const u8 ContestLiveUpdates_Text_ExcitingAppeal[];
extern const u8 ContestLiveUpdates_Text_WasCool[];
extern const u8 ContestLiveUpdates_Text_WasBeautiful[];
extern const u8 ContestLiveUpdates_Text_WasCute[];
extern const u8 ContestLiveUpdates_Text_WasSmart[];
extern const u8 ContestLiveUpdates_Text_WasTough[];
extern const u8 ContestLiveUpdates_Text_VeryExcitingAppeal[];
extern const u8 ContestLiveUpdates_Text_VeryCool[];
extern const u8 ContestLiveUpdates_Text_VeryBeautiful[];
extern const u8 ContestLiveUpdates_Text_VeryCute[];
extern const u8 ContestLiveUpdates_Text_VerySmart[];
extern const u8 ContestLiveUpdates_Text_VeryTough[];
extern const u8 ContestLiveUpdates_Text_TookBreak[];
extern const u8 ContestLiveUpdates_Text_GotStartled[];
extern const u8 ContestLiveUpdates_Text_MoveWonderful[];
extern const u8 ContestLiveUpdates_Text_TalkAboutAnotherMon[];
extern const u8 ContestLiveUpdates_Text_FailedToAppeal[];
extern const u8 ContestLiveUpdates_Text_LastInBothRounds[];
extern const u8 ContestLiveUpdates_Text_NotExcitingEnough[];
extern const u8 ContestLiveUpdates_Text_LostAfterWinningRound1[];
extern const u8 ContestLiveUpdates_Text_NeverExciting[];
extern const u8 ContestLiveUpdates_Text_LostBySmallMargin[];
extern const u8 ContestLiveUpdates_Text_RepeatedAppeals[];
extern const u8 ContestLiveUpdates_Text_ValiantEffortButLost[];
extern const u8 ContestLiveUpdates_Text_Outro[];
extern const u8 gTVPokemonBattleUpdateText00[];
extern const u8 gTVPokemonBattleUpdateText01[];
extern const u8 gTVPokemonBattleUpdateText02[];

View File

@ -480,7 +480,7 @@ struct SaveBlock2
/*0x20C*/ struct BerryPickingResults berryPick;
/*0x21C*/ struct RankingHall1P hallRecords1P[HALL_FACILITIES_COUNT][2][3]; // From record mixing.
/*0x57C*/ struct RankingHall2P hallRecords2P[2][3]; // From record mixing.
/*0x624*/ u16 contestLinkResults[5][4]; // 4 positions for 5 categories.
/*0x624*/ u16 contestLinkResults[CONTEST_CATEGORIES_COUNT][CONTESTANT_COUNT];
/*0x64C*/ struct BattleFrontier frontier;
}; // sizeof=0xF2C
@ -489,7 +489,7 @@ extern struct SaveBlock2 *gSaveBlock2Ptr;
struct SecretBaseParty
{
u32 personality[PARTY_SIZE];
u16 moves[PARTY_SIZE * 4];
u16 moves[PARTY_SIZE * MAX_MON_MOVES];
u16 species[PARTY_SIZE];
u16 heldItems[PARTY_SIZE];
u8 levels[PARTY_SIZE];

View File

@ -124,18 +124,18 @@ typedef union // size = 0x24
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u16 winningSpecies;
/*0x04*/ u8 winningTrainerName[8];
/*0x0C*/ u8 appealFlags2;
/*0x0D*/ u8 round1Rank;
/*0x0e*/ u8 round2Rank;
/*0x0f*/ u8 appealFlags1;
/*0x02*/ u16 losingSpecies;
/*0x04*/ u8 losingTrainerName[8];
/*0x0C*/ u8 loserAppealFlag;
/*0x0D*/ u8 round1Placing;
/*0x0e*/ u8 round2Placing;
/*0x0f*/ u8 winnerAppealFlag;
/*0x10*/ u16 move;
/*0x12*/ u16 species;
/*0x14*/ u8 playerName[8];
/*0x12*/ u16 winningSpecies;
/*0x14*/ u8 winningTrainerName[8];
/*0x1C*/ u8 category;
/*0x1D*/ u8 language;
/*0x1E*/ u8 winningTrainerLanguage;
/*0x1D*/ u8 winningTrainerLanguage;
/*0x1E*/ u8 losingTrainerLanguage;
} contestLiveUpdates;
// TVSHOW_3_CHEERS_FOR_POKEBLOCKS

View File

@ -4786,10 +4786,10 @@ extern const u32 gOldContestGfx[];
extern const u32 gOldContestPalette[];
extern const u32 gUnknown_08C17170[];
extern const u32 gUnknown_08C17980[];
extern const u32 gTiles_8C19450[];
extern const u32 gContestSliderHeart_Gfx[];
extern const u32 gContestNextTurnGfx[];
extern const u16 gContestPal[];
extern const u32 gUnknown_08C19168[];
extern const u32 gContestFaces_Gfx[];
extern const u32 gContestApplauseGfx[];
extern const u32 gContestJudgeGfx[];
extern const u32 gContestJudgeSymbolsGfx[];

View File

@ -49,11 +49,11 @@
(((status) & LINK_STAT_ERRORS) >> LINK_STAT_ERRORS_SHIFT)
#define LINKCMD_SEND_LINK_TYPE 0x2222
#define LINKCMD_0x2FFE 0x2FFE
#define LINKCMD_READY_EXIT_STANDBY 0x2FFE
#define LINKCMD_SEND_HELD_KEYS 0x4444
#define LINKCMD_0x5555 0x5555
#define LINKCMD_0x5566 0x5566
#define LINKCMD_0x5FFF 0x5FFF
#define LINKCMD_READY_CLOSE_LINK 0x5FFF
#define LINKCMD_0x6666 0x6666
#define LINKCMD_0x7777 0x7777
#define LINKCMD_CONT_BLOCK 0x8888
@ -64,7 +64,7 @@
#define LINKCMD_INIT_BLOCK 0xBBBB
#define LINKCMD_READY_CANCEL_TRADE 0xBBCC
#define LINKCMD_SEND_HELD_KEYS_2 0xCAFE
#define LINKCMD_0xCCCC 0xCCCC
#define LINKCMD_SEND_BLOCK_REQ 0xCCCC
#define LINKCMD_START_TRADE 0xCCDD
#define LINKCMD_CONFIRM_FINISH_TRADE 0xDCBA
#define LINKCMD_SET_MONS_TO_TRADE 0xDDDD
@ -273,11 +273,11 @@ bool32 InUnionRoom(void);
void LoadWirelessStatusIndicatorSpriteGfx(void);
bool8 IsLinkTaskFinished(void);
void CreateWirelessStatusIndicatorSprite(u8, u8);
void sub_800ADF8(void);
void SetLinkStandbyCallback(void);
void SetWirelessCommType1(void);
void CheckShouldAdvanceLinkState(void);
u8 IsLinkMaster(void);
void sub_800AC34(void);
void SetCloseLinkCallback(void);
bool8 HandleLinkConnection(void);
void SetLinkDebugValues(u32 seed, u32 flags);
void sub_800A418(void);
@ -305,9 +305,9 @@ extern u16 gLinkHeldKeys;
extern u32 gLinkStatus;
extern u8 gUnknown_030030E4;
extern u8 gUnknown_030030E8;
extern u8 gUnknown_030030EC[MAX_LINK_PLAYERS];
extern u8 gUnknown_030030F0[MAX_LINK_PLAYERS];
extern u16 gUnknown_030030F4;
extern bool8 gReadyToExitStandby[MAX_LINK_PLAYERS];
extern bool8 gReadyToCloseLink[MAX_LINK_PLAYERS];
extern u16 gReadyCloseLinkType;
extern u8 gSuppressLinkErrorMessage;
extern u8 gWirelessCommType;
extern bool8 gSavedLinkPlayerCount;
@ -334,15 +334,15 @@ bool32 LinkDummy_Return2(void);
void SetLocalLinkPlayerId(u8);
u8 GetSavedPlayerCount(void);
void sub_8009FAC(void);
bool8 sub_800A4D8(u8 a0);
bool8 SendBlockRequest(u8 type);
u8 GetLinkPlayerCountAsBitFlags(void);
u8 sub_800A0C8(s32, s32);
u8 GetSavedLinkPlayerCountAsBitFlags(void);
void sub_800AD10(void);
void SetCloseLinkCallbackHandleJP(void);
void CheckLinkPlayersMatchSaved(void);
void StartSendingKeysToLink(void);
bool8 DoesLinkPlayerCountMatchSaved(void);
void sub_800ABF4(u16 a0);
void SetCloseLinkCallbackAndType(u16 type);
bool32 IsSendingKeysToLink(void);
u32 GetLinkRecvQueueLength(void);

View File

@ -8,11 +8,11 @@
#define RFU_COMMAND_0x4400 0x4400
#define RFU_COMMAND_0x8800 0x8800
#define RFU_COMMAND_0x8900 0x8900
#define RFU_COMMAND_0xA100 0xA100
#define RFU_COMMAND_SEND_BLOCK_REQ 0xA100
#define RFU_COMMAND_0x7700 0x7700
#define RFU_COMMAND_0x7800 0x7800
#define RFU_COMMAND_0x6600 0x6600
#define RFU_COMMAND_0x5F00 0x5F00
#define RFU_COMMAND_READY_EXIT_STANDBY 0x6600
#define RFU_COMMAND_READY_CLOSE_LINK 0x5F00
#define RFU_COMMAND_0x2F00 0x2F00
#define RFU_COMMAND_0xBE00 0xBE00
#define RFU_COMMAND_0xEE00 0xEE00
@ -125,7 +125,7 @@ struct GFRfuManager
/* 0x012 */ u16 unk_12;
/* 0x014 */ u8 unk_14[RFU_CHILD_MAX][14];
/* 0x04c */ u8 unk_4c[14];
/* 0x05a */ u8 unk_5a;
/* 0x05a */ u8 blockRequestType;
/* 0x05b */ u8 unk_5b;
/* 0x05c */ bool8 blockReceived[MAX_RFU_PLAYERS];
/* 0x061 */ bool8 numBlocksReceived[MAX_RFU_PLAYERS];
@ -134,14 +134,14 @@ struct GFRfuManager
/* 0x068 */ u8 filler_68[4];
/* 0x06c */ struct RfuBlockSend sendBlock;
/* 0x080 */ struct RfuBlockSend recvBlock[MAX_RFU_PLAYERS];
/* 0x0e4 */ u8 unk_e4[5];
/* 0x0e9 */ u8 unk_e9[5];
/* 0x0e4 */ bool8 readyCloseLink[MAX_RFU_PLAYERS];
/* 0x0e9 */ bool8 readyExitStandby[MAX_RFU_PLAYERS];
/* 0x0ee */ vu8 errorState;
/* 0x0ef */ bool8 isShuttingDown;
/* 0x0f0 */ u8 linkLossRecoveryState;
/* 0x0f1 */ u8 status;
/* 0x0f2 */ u16 unk_f2[6];
/* 0x0fe */ u16 unk_fe;
/* 0x0fe */ u16 resendExitStandbyTimer;
/* 0x100 */ u16 unk_100;
/* 0x102 */ u8 unk_102;
/* 0x103 */ u8 filler_103[0x10A - 0x103];
@ -203,11 +203,11 @@ bool32 Rfu_InitBlockSend(const u8 *src, size_t size);
void ClearLinkRfuCallback(void);
u8 Rfu_GetLinkPlayerCount(void);
u8 Rfu_GetMultiplayerId(void);
bool8 sub_8010100(u8 a0);
bool8 Rfu_SendBlockRequest(u8 type);
bool8 IsLinkRfuTaskFinished(void);
bool8 Rfu_IsMaster(void);
void task_add_05_task_del_08FA224_when_no_RfuFunc(void);
void sub_8010434(void);
void Rfu_SetCloseLinkCallback(void);
void Rfu_SetLinkStandbyCallback(void);
void ResetLinkRfuGFLayer(void);
void UpdateWirelessStatusIndicatorSprite(void);
void InitRFU(void);

View File

@ -1,10 +0,0 @@
#ifndef GUARD_SCRIPTPOKE80F8_H
#define GUARD_SCRIPTPOKE80F8_H
void ShowContestWinner(void);
u8 ScriptGiveMon(u16, u8, u16, u32, u32, u8);
u8 ScriptGiveEgg(u16);
void CreateScriptedWildMon(u16, u8, u16);
void ScriptSetMonMoveSlot(u8, u16, u8);
#endif

View File

@ -0,0 +1,11 @@
#ifndef GUARD_SCRIPT_POKEMON_UTIL
#define GUARD_SCRIPT_POKEMON_UTIL
u8 ScriptGiveMon(u16, u8, u16, u32, u32, u8);
u8 ScriptGiveEgg(u16);
void CreateScriptedWildMon(u16, u8, u16);
void ScriptSetMonMoveSlot(u8, u16, u8);
void ReducePlayerPartyToSelectedMons(void);
void HealPlayerParty(void);
#endif // GUARD_SCRIPT_POKEMON_UTIL

View File

@ -1,9 +0,0 @@
#ifndef GUARD_SCRIPT_POKEMON_UTIL_80F87D8_H
#define GUARD_SCRIPT_POKEMON_UTIL_80F87D8_H
u16 GetContestRand(void);
void ReducePlayerPartyToSelectedMons(void);
void HealPlayerParty(void);
u8 CountPlayerContestPaintings(void);
#endif // GUARD_SCRIPT_POKEMON_UTIL_80F87D8_H

View File

@ -59,11 +59,11 @@ void SaveRecordedItemPurchasesForTVShow(void);
bool8 ShouldAirFrontierTVShow(void);
void sub_80EE8C8(u16 winStreak, u8 facilityAndMode);
void BravoTrainerPokemonProfile_BeforeInterview2(u8 contestStandingPlace);
void ContestLiveUpdates_BeforeInterview_1(u8 a0);
void ContestLiveUpdates_BeforeInterview_2(u8 a0);
void ContestLiveUpdates_BeforeInterview_3(u8 a0);
void ContestLiveUpdates_BeforeInterview_4(u16 a0);
void ContestLiveUpdates_BeforeInterview_5(u8 a0, u8 a1);
void ContestLiveUpdates_Init(u8 round1Placing);
void ContestLiveUpdates_SetRound2Placing(u8 round2Placing);
void ContestLiveUpdates_SetWinnerAppealFlag(u8 flag);
void ContestLiveUpdates_SetWinnerMoveUsed(u16 move);
void ContestLiveUpdates_SetLoserData(u8 flag, u8 loser);
void ResetGabbyAndTy(void);
#endif //GUARD_TV_H

View File

@ -170,7 +170,7 @@ SECTIONS {
src/secret_base.o(.text);
src/tv.o(.text);
src/contest_util.o(.text);
src/script_pokemon_util_80F87D8.o(.text);
src/script_pokemon_util.o(.text);
src/field_poison.o(.text);
src/pokemon_size_record.o(.text);
src/fldeff_misc.o(.text);
@ -545,7 +545,7 @@ SECTIONS {
src/secret_base.o(.rodata);
src/tv.o(.rodata);
src/contest_util.o(.rodata);
src/script_pokemon_util_80F87D8.o(.rodata);
src/script_pokemon_util.o(.rodata);
src/pokemon_size_record.o(.rodata)
src/fldeff_misc.o(.rodata);
src/field_special_scene.o(.rodata);

View File

@ -1849,8 +1849,8 @@ void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMo
}
else
{
for (i = 0; i < 4; i++)
gAnimBattlerSpecies[i] = gContestResources->field_18->species;
for (i = 0; i < CONTESTANT_COUNT; i++)
gAnimBattlerSpecies[i] = gContestResources->moveAnim->species;
}
if (!isMoveAnim)
@ -2311,7 +2311,7 @@ void MoveBattlerSpriteToBG(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible)
battlerSpriteId = gBattlerSpriteIds[battlerId];
gBattle_BG1_X = -(gSprites[battlerSpriteId].pos1.x + gSprites[battlerSpriteId].pos2.x) + 0x20;
if (IsContest() && IsSpeciesNotUnown(gContestResources->field_18->species))
if (IsContest() && IsSpeciesNotUnown(gContestResources->moveAnim->species))
gBattle_BG1_X--;
gBattle_BG1_Y = -(gSprites[battlerSpriteId].pos1.y + gSprites[battlerSpriteId].pos2.y) + 0x20;
@ -2369,7 +2369,7 @@ static void sub_80A46A0(void)
struct BattleAnimBgData animBg;
u16 *ptr;
if (IsSpeciesNotUnown(gContestResources->field_18->species))
if (IsSpeciesNotUnown(gContestResources->moveAnim->species))
{
sub_80A6B30(&animBg);
ptr = animBg.bgTilemap;

View File

@ -849,7 +849,7 @@ void AnimTask_MetallicShine(u8 taskId)
if (IsContest())
{
species = gContestResources->field_18->species;
species = gContestResources->moveAnim->species;
}
else
{

View File

@ -2297,7 +2297,7 @@ void AnimTask_TransformMon(u8 taskId)
LoadBgTiles(1, animBg.bgTiles, 0x800, animBg.tilesOffset);
if (IsContest())
{
if (IsSpeciesNotUnown(gContestResources->field_18->species) != IsSpeciesNotUnown(gContestResources->field_18->unk2))
if (IsSpeciesNotUnown(gContestResources->moveAnim->species) != IsSpeciesNotUnown(gContestResources->moveAnim->targetSpecies))
{
bgTilemap = (u16 *)animBg.bgTilemap;
for (i = 0; i < 8; i++)
@ -2319,7 +2319,7 @@ void AnimTask_TransformMon(u8 taskId)
}
}
if (IsSpeciesNotUnown(gContestResources->field_18->unk2))
if (IsSpeciesNotUnown(gContestResources->moveAnim->targetSpecies))
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].affineAnims = gUnknown_082FF6C0;
else
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].affineAnims = gUnknown_082FF694;
@ -3196,10 +3196,10 @@ void AnimTask_RolePlaySilhouette(u8 taskId)
GetAnimBattlerSpriteId(ANIM_ATTACKER);
if (IsContest())
{
isBackPic = 1;
personality = gContestResources->field_18->unk10;
otId = gContestResources->field_18->unkC;
species = gContestResources->field_18->unk2;
isBackPic = TRUE;
personality = gContestResources->moveAnim->targetPersonality;
otId = gContestResources->moveAnim->otId;
species = gContestResources->moveAnim->targetSpecies;
xOffset = 20;
priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker);
}
@ -5031,9 +5031,9 @@ void AnimTask_SnatchOpposingMonMove(u8 taskId)
case 1:
if (IsContest())
{
personality = gContestResources->field_18->unk8;
otId = gContestResources->field_18->unkC;
species = gContestResources->field_18->species;
personality = gContestResources->moveAnim->personality;
otId = gContestResources->moveAnim->otId;
species = gContestResources->moveAnim->species;
subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker);
isBackPic = 0;
x = -32;

View File

@ -141,10 +141,10 @@ u8 GetBattlerSpriteCoord(u8 battlerId, u8 coordType)
default:
if (IsContest())
{
if (gContestResources->field_18->unk4_0)
species = gContestResources->field_18->unk2;
if (gContestResources->moveAnim->hasTargetAnim)
species = gContestResources->moveAnim->targetSpecies;
else
species = gContestResources->field_18->species;
species = gContestResources->moveAnim->species;
}
else
{
@ -189,10 +189,10 @@ u8 GetBattlerYDelta(u8 battlerId, u16 species)
{
if (IsContest())
{
if (gContestResources->field_18->unk4_0)
personality = gContestResources->field_18->unk10;
if (gContestResources->moveAnim->hasTargetAnim)
personality = gContestResources->moveAnim->targetPersonality;
else
personality = gContestResources->field_18->unk8;
personality = gContestResources->moveAnim->personality;
}
else
{
@ -306,10 +306,10 @@ u8 GetBattlerSpriteCoord2(u8 battlerId, u8 coordType)
{
if (IsContest())
{
if (gContestResources->field_18->unk4_0)
species = gContestResources->field_18->unk2;
if (gContestResources->moveAnim->hasTargetAnim)
species = gContestResources->moveAnim->targetSpecies;
else
species = gContestResources->field_18->species;
species = gContestResources->moveAnim->species;
}
else
{
@ -1851,7 +1851,7 @@ static u16 GetBattlerYDeltaFromSpriteId(u8 spriteId)
{
if (IsContest())
{
species = gContestResources->field_18->species;
species = gContestResources->moveAnim->species;
return gMonBackPicCoords[species].y_offset;
}
else
@ -2103,15 +2103,15 @@ s16 GetBattlerSpriteCoordAttr(u8 battlerId, u8 attr)
if (IsContest())
{
if (gContestResources->field_18->unk4_0)
if (gContestResources->moveAnim->hasTargetAnim)
{
species = gContestResources->field_18->unk2;
personality = gContestResources->field_18->unk10;
species = gContestResources->moveAnim->targetSpecies;
personality = gContestResources->moveAnim->targetPersonality;
}
else
{
species = gContestResources->field_18->species;
personality = gContestResources->field_18->unk8;
species = gContestResources->moveAnim->species;
personality = gContestResources->moveAnim->personality;
}
if (species == SPECIES_UNOWN)
{

View File

@ -134,7 +134,7 @@ void SoundTask_PlayCryHighPitch(u8 taskId)
if (IsContest())
{
if (gBattleAnimArgs[0] == ANIM_ATTACKER)
species = gContestResources->field_18->species;
species = gContestResources->moveAnim->species;
else
DestroyAnimVisualTask(taskId); // UB: function should return upon destroying task.
}
@ -180,7 +180,7 @@ void SoundTask_PlayDoubleCry(u8 taskId)
if (IsContest())
{
if (gBattleAnimArgs[0] == ANIM_ATTACKER)
species = gContestResources->field_18->species;
species = gContestResources->moveAnim->species;
else
DestroyAnimVisualTask(taskId); // UB: function should return upon destroying task.
}
@ -284,7 +284,7 @@ void SoundTask_PlayCryWithEcho(u8 taskId)
pan = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);
if (IsContest())
species = gContestResources->field_18->species;
species = gContestResources->moveAnim->species;
else
species = gAnimBattlerSpecies[gBattleAnimAttacker];

View File

@ -318,7 +318,7 @@ void AnimTask_DrawFallingWhiteLinesOnAttacker(u8 taskId)
if (IsContest())
{
species = gContestResources->field_18->species;
species = gContestResources->moveAnim->species;
}
else
{
@ -440,7 +440,7 @@ static void sub_8116F04(u8 taskId)
if (IsContest())
{
sAnimStatsChangeData->species = gContestResources->field_18->species;
sAnimStatsChangeData->species = gContestResources->moveAnim->species;
}
else
{
@ -810,7 +810,7 @@ void sub_8117854(u8 taskId, int unused, u16 arg2, u8 battler1, u8 arg4, u8 arg5,
if (IsContest())
{
species = gContestResources->field_18->species;
species = gContestResources->moveAnim->species;
}
else
{

View File

@ -886,9 +886,9 @@ void sub_80587B0(void)
if (IsLinkTaskFinished())
{
if (gWirelessCommType == 0)
sub_800AC34();
SetCloseLinkCallback();
else
sub_800ADF8();
SetLinkStandbyCallback();
gBattlerControllerFuncs[gActiveBattler] = sub_80586F8;
}

View File

@ -29,7 +29,7 @@
#include "international_string_util.h"
#include "trainer_pokemon_sprites.h"
#include "scanline_effect.h"
#include "script_pokemon_util_80F87D8.h"
#include "script_pokemon_util.h"
#include "graphics.h"
#include "constants/battle_dome.h"
#include "constants/frontier_util.h"

View File

@ -916,14 +916,14 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform
if (IsContest())
{
position = 0;
targetSpecies = gContestResources->field_18->unk2;
personalityValue = gContestResources->field_18->unk8;
otId = gContestResources->field_18->unkC;
targetSpecies = gContestResources->moveAnim->targetSpecies;
personalityValue = gContestResources->moveAnim->personality;
otId = gContestResources->moveAnim->otId;
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[targetSpecies],
gMonSpritesGfxPtr->sprites[0],
targetSpecies,
gContestResources->field_18->unk10);
gContestResources->moveAnim->targetPersonality);
}
else
{

View File

@ -1484,9 +1484,9 @@ static void CB2_PreInitMultiBattle(void)
{
gBattleCommunication[MULTIUSE_STATE]++;
if (gWirelessCommType)
sub_800ADF8();
SetLinkStandbyCallback();
else
sub_800AC34();
SetCloseLinkCallback();
}
break;
case 3:
@ -2368,7 +2368,7 @@ static void sub_8038F34(void)
case 6:
if (IsLinkTaskFinished() == TRUE)
{
sub_800ADF8();
SetLinkStandbyCallback();
BattlePutTextOnWindow(gText_LinkStandby3, 0);
gBattleCommunication[MULTIUSE_STATE]++;
}
@ -2382,7 +2382,7 @@ static void sub_8038F34(void)
break;
case 8:
if (!gWirelessCommType)
sub_800AC34();
SetCloseLinkCallback();
gBattleCommunication[MULTIUSE_STATE]++;
break;
case 9:
@ -2556,7 +2556,7 @@ static void sub_803939C(void)
HandleBattleWindow(0x18, 8, 0x1D, 0xD, WINDOW_CLEAR);
if (gMain.field_439_x4)
{
sub_800ADF8();
SetLinkStandbyCallback();
BattlePutTextOnWindow(gText_LinkStandby3, 0);
}
gBattleCommunication[MULTIUSE_STATE]++;
@ -2566,7 +2566,7 @@ static void sub_803939C(void)
if (--gBattleCommunication[1] == 0)
{
if (gMain.field_439_x4 && !gWirelessCommType)
sub_800AC34();
SetCloseLinkCallback();
gBattleCommunication[MULTIUSE_STATE]++;
}
break;
@ -2605,7 +2605,7 @@ static void sub_803939C(void)
{
if (gMain.field_439_x4)
{
sub_800ADF8();
SetLinkStandbyCallback();
BattlePutTextOnWindow(gText_LinkStandby3, 0);
}
gBattleCommunication[MULTIUSE_STATE]++;

View File

@ -12,7 +12,7 @@
#include "fieldmap.h"
#include "random.h"
#include "starter_choose.h"
#include "script_pokemon_80F8.h"
#include "script_pokemon_util.h"
#include "palette.h"
#include "window.h"
#include "event_object_movement.h"

View File

@ -2627,7 +2627,7 @@ static void LoadLinkMultiOpponentsData(void)
}
break;
case 4:
sub_800AC34();
SetCloseLinkCallback();
gSpecialVar_Result = 5;
break;
case 5:
@ -2644,7 +2644,7 @@ static void LoadLinkMultiOpponentsData(void)
static void sub_8164DCC(void)
{
if (gWirelessCommType != 0)
sub_800AC34();
SetCloseLinkCallback();
}
static void SetMultiPartnerGfx(void)

View File

@ -1230,7 +1230,7 @@ static void sub_8080018(void)
sBerryBlenderData->field_114 = 0;
Blender_CopyBerryData(&sBerryBlenderData->blendedBerries[0], gSpecialVar_ItemId);
memcpy(gBlockSendBuffer, &sBerryBlenderData->blendedBerries[0], sizeof(struct BlenderBerry));
sub_800ADF8();
SetLinkStandbyCallback();
sBerryBlenderData->framesToWait = 0;
break;
case 9:
@ -1238,7 +1238,7 @@ static void sub_8080018(void)
{
ResetBlockReceivedFlags();
if (GetMultiplayerId() == 0)
sub_800A4D8(4);
SendBlockRequest(4);
sBerryBlenderData->mainState++;
}
break;
@ -1332,7 +1332,7 @@ static void sub_8080018(void)
sBerryBlenderData->mainState++;
break;
case 19:
sub_800ADF8();
SetLinkStandbyCallback();
sBerryBlenderData->mainState++;
break;
case 20:
@ -2587,7 +2587,7 @@ static bool8 LinkPlayAgainHandleSaving(void)
switch (sBerryBlenderData->field_1A0)
{
case 0:
sub_800ADF8();
SetLinkStandbyCallback();
sBerryBlenderData->field_1A0 = 1;
sBerryBlenderData->framesToWait = 0;
break;
@ -2606,7 +2606,7 @@ static bool8 LinkPlayAgainHandleSaving(void)
case 3:
if (++sBerryBlenderData->framesToWait == 10)
{
sub_800ADF8();
SetLinkStandbyCallback();
sBerryBlenderData->field_1A0++;
}
break;
@ -2682,7 +2682,7 @@ static void CB2_HandlePlayerLinkPlayAgainChoice(void)
break;
case 5:
Blender_PrintText(&sBerryBlenderData->textState, gText_SavingDontTurnOff2, 0);
sub_800ADF8();
SetLinkStandbyCallback();
sBerryBlenderData->gameEndState++;
break;
case 6:
@ -2702,7 +2702,7 @@ static void CB2_HandlePlayerLinkPlayAgainChoice(void)
break;
case 8:
sBerryBlenderData->gameEndState++;
sub_800ADF8();
SetLinkStandbyCallback();
break;
case 9:
if (IsLinkTaskFinished())
@ -2732,7 +2732,7 @@ static void CB2_HandlePlayerLinkPlayAgainChoice(void)
case 11:
if (++sBerryBlenderData->framesToWait > 30)
{
sub_800AC34();
SetCloseLinkCallback();
sBerryBlenderData->gameEndState++;
}
break;

View File

@ -1125,7 +1125,7 @@ int sub_802130C(void)
switch (var0->unkC)
{
case 0:
sub_8010434();
Rfu_SetLinkStandbyCallback();
break;
case 1:
if (!IsLinkTaskFinished())
@ -2027,7 +2027,7 @@ static u32 sub_8022CB0(struct BerryCrushGame *r4, u8 *r5)
r4->unkC = 3;
return 0;
case 1:
sub_8010434();
Rfu_SetLinkStandbyCallback();
++r4->unkC;
return 0;
case 2:
@ -2110,7 +2110,7 @@ static u32 sub_8022E5C(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1
switch (r4->unkC)
{
case 0:
sub_8010434();
Rfu_SetLinkStandbyCallback();
break;
case 1:
if (IsLinkTaskFinished())
@ -2167,7 +2167,7 @@ static u32 sub_8022F1C(struct BerryCrushGame *r5, u8 *r2)
sub_8022BEC(3, 1, NULL);
return 0;
case 1:
sub_8010434();
Rfu_SetLinkStandbyCallback();
break;
case 2:
if (!IsLinkTaskFinished())
@ -2213,7 +2213,7 @@ static u32 sub_8023070(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r
{
case 0:
sub_80214A8(r4, &r4->unk138);
sub_8010434();
Rfu_SetLinkStandbyCallback();
break;
case 1:
if (!IsLinkTaskFinished())
@ -2233,7 +2233,7 @@ static u32 sub_8023070(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r
return 0;
r4->unk138.unk38[r4->unk138.unk0] = NULL;
++r4->unk138.unk0;
sub_8010434();
Rfu_SetLinkStandbyCallback();
break;
case 4:
if (!IsLinkTaskFinished())
@ -2247,7 +2247,7 @@ static u32 sub_8023070(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r
break;
case 5:
sub_80216A8(r4, &r4->unk138);
sub_8010434();
Rfu_SetLinkStandbyCallback();
break;
case 6:
if (!IsLinkTaskFinished())
@ -2295,7 +2295,7 @@ static u32 sub_80231B8(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r
SetGpuReg(REG_OFFSET_BG0VOFS, 0);
SetGpuReg(REG_OFFSET_BG2VOFS, 0);
SetGpuReg(REG_OFFSET_BG3VOFS, 0);
sub_8010434();
Rfu_SetLinkStandbyCallback();
break;
case 3:
if (!IsLinkTaskFinished())
@ -2323,7 +2323,7 @@ static u32 sub_80232EC(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r
return 0;
// fallthrough
case 0:
sub_8010434();
Rfu_SetLinkStandbyCallback();
break;
case 3:
if (!IsLinkTaskFinished())
@ -2703,7 +2703,7 @@ static u32 sub_8023A30(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1
case 4:
if (!sub_80218D4(r4, &r4->unk138))
return 0;
sub_8010434();
Rfu_SetLinkStandbyCallback();
r4->unk10 = 0;
break;
case 5:
@ -2737,7 +2737,7 @@ static u32 sub_8023BC0(struct BerryCrushGame *r5, u8 *r6)
case 2:
if (!sub_80218D4(r5, &r5->unk138))
return 0;
sub_8010434();
Rfu_SetLinkStandbyCallback();
r5->unk10 = 0;
SetGpuReg(REG_OFFSET_BG0VOFS, 0);
SetGpuReg(REG_OFFSET_BG2VOFS, 0);
@ -3005,7 +3005,7 @@ static u32 sub_8024134(struct BerryCrushGame *r5, u8 *r4)
r5->unkC = 0;
return 0;
case 1:
sub_8010434();
Rfu_SetLinkStandbyCallback();
break;
case 2:
if (!IsLinkTaskFinished())
@ -3084,7 +3084,7 @@ static u32 sub_80242E0(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1
switch (r4->unkC)
{
case 0:
sub_8010434();
Rfu_SetLinkStandbyCallback();
break;
case 1:
if (!IsLinkTaskFinished())
@ -3184,12 +3184,12 @@ static u32 sub_8024508(struct BerryCrushGame *r5, __attribute__((unused)) u8 *r1
switch (r5->unkC)
{
case 0:
sub_8010434();
Rfu_SetLinkStandbyCallback();
break;
case 1:
if (!IsLinkTaskFinished())
return 0;
sub_800AC34();
SetCloseLinkCallback();
break;
case 2:
if (gReceivedRemoteLinkPlayers != 0)

View File

@ -20,7 +20,7 @@
#include "union_room.h"
#include "mevent2.h"
#include "script.h"
#include "script_pokemon_util_80F87D8.h"
#include "script_pokemon_util.h"
#include "sound.h"
#include "start_menu.h"
#include "string_util.h"
@ -203,7 +203,7 @@ static void sub_80B2600(u8 taskId)
gTasks[taskId].data[0]++;
if (gTasks[taskId].data[0] == 10)
{
sub_800A4D8(2);
SendBlockRequest(2);
DestroyTask(taskId);
}
}
@ -357,7 +357,7 @@ static void Task_LinkupExchangeDataWithLeader(u8 taskId)
if (gSpecialVar_Result == LINKUP_DIFF_SELECTIONS
|| gSpecialVar_Result == LINKUP_WRONG_NUM_PLAYERS)
{
sub_800AC34();
SetCloseLinkCallback();
HideFieldMessageBox();
gTasks[taskId].func = Task_StopLinkup;
}
@ -392,7 +392,7 @@ static void Task_LinkupCheckStatusAfterConfirm(u8 taskId)
{
if (!Link_AnyPartnersPlayingRubyOrSapphire())
{
sub_800AC34();
SetCloseLinkCallback();
HideFieldMessageBox();
gTasks[taskId].func = Task_StopLinkup;
}
@ -405,7 +405,7 @@ static void Task_LinkupCheckStatusAfterConfirm(u8 taskId)
}
else if (gSpecialVar_Result == LINKUP_DIFF_SELECTIONS)
{
sub_800AC34();
SetCloseLinkCallback();
HideFieldMessageBox();
gTasks[taskId].func = Task_StopLinkup;
}
@ -426,7 +426,7 @@ static void Task_LinkupCheckStatusAfterConfirm(u8 taskId)
card->monSpecies[0] = GetMonData(&gPlayerParty[gSelectedOrderFromParty[0] - 1], MON_DATA_SPECIES, NULL);
card->monSpecies[1] = GetMonData(&gPlayerParty[gSelectedOrderFromParty[1] - 1], MON_DATA_SPECIES, NULL);
gTasks[taskId].func = Task_LinkupAwaitTrainerCardData;
sub_800A4D8(2);
SendBlockRequest(2);
}
}
@ -481,7 +481,7 @@ static void FinishLinkup(u16 *linkupStatus, u32 taskId)
{
// Unsuccessful battle tower linkup
*linkupStatus = LINKUP_FAILED_BATTLE_TOWER;
sub_800AC34();
SetCloseLinkCallback();
gTasks[taskId].func = Task_StopLinkup;
}
else
@ -503,7 +503,7 @@ static void FinishLinkup(u16 *linkupStatus, u32 taskId)
else
{
// Unsuccessful linkup
sub_800AC34();
SetCloseLinkCallback();
gTasks[taskId].func = Task_StopLinkup;
}
}
@ -686,7 +686,7 @@ static void Task_ValidateMixingGameLanguage(u8 taskId)
if (mixingForeignGames)
{
gSpecialVar_Result = LINKUP_FOREIGN_GAME;
sub_800AD10();
SetCloseLinkCallbackHandleJP();
gTasks[taskId].tState = 1;
return;
}
@ -856,7 +856,7 @@ static void Task_StartWiredCableClubBattle(u8 taskId)
task->tState++;
break;
case 3:
sub_800AC34();
SetCloseLinkCallback();
task->tState++;
break;
case 4:
@ -919,7 +919,7 @@ static void Task_StartWirelessCableClubBattle(u8 taskId)
tState = 5;
break;
case 5:
sub_800ADF8();
SetLinkStandbyCallback();
tState = 6;
break;
case 6:
@ -974,7 +974,7 @@ static void CB2_ReturnFromUnionRoomBattle(void)
}
else
{
sub_800AC34();
SetCloseLinkCallback();
gMain.state = 1;
}
break;
@ -1113,7 +1113,7 @@ static void Task_StartWiredTrade(u8 taskId)
gSelectedTradeMonPositions[TRADE_PLAYER] = 0;
gSelectedTradeMonPositions[TRADE_PARTNER] = 0;
m4aMPlayAllStop();
sub_800AC34();
SetCloseLinkCallback();
task->tState++;
break;
case 3:
@ -1146,7 +1146,7 @@ static void Task_StartWirelessTrade(u8 taskId)
gSelectedTradeMonPositions[TRADE_PLAYER] = 0;
gSelectedTradeMonPositions[TRADE_PARTNER] = 0;
m4aMPlayAllStop();
sub_800ADF8();
SetLinkStandbyCallback();
tState++;
break;
case 3:
@ -1264,7 +1264,7 @@ static void sub_80B3AAC(u8 taskId)
// Unused
static void sub_80B3AD0(u8 taskId)
{
sub_800AC34();
SetCloseLinkCallback();
gTasks[taskId].func = sub_80B3AAC;
}

File diff suppressed because it is too large Load Diff

View File

@ -4,16 +4,17 @@
#include "random.h"
#include "contest_ai.h"
#include "contest_effect.h"
#include "constants/moves.h"
extern const u8 *gAIScriptPtr;
extern const u8 *gContestAIChecks[];
static void ContestAICmd_score(void);
static void ContestAICmd_get_turn(void);
static void ContestAICmd_if_turn_less_than(void);
static void ContestAICmd_if_turn_more_than(void);
static void ContestAICmd_if_turn_eq(void);
static void ContestAICmd_if_turn_not_eq(void);
static void ContestAICmd_get_appeal_num(void);
static void ContestAICmd_if_appeal_num_less_than(void);
static void ContestAICmd_if_appeal_num_more_than(void);
static void ContestAICmd_if_appeal_num_eq(void);
static void ContestAICmd_if_appeal_num_not_eq(void);
static void ContestAICmd_get_excitement(void);
static void ContestAICmd_if_excitement_less_than(void);
static void ContestAICmd_if_excitement_more_than(void);
@ -150,11 +151,11 @@ typedef void (* ContestAICmdFunc)(void);
static const ContestAICmdFunc sContestAICmdTable[] =
{
ContestAICmd_score, // 0x00
ContestAICmd_get_turn, // 0x01
ContestAICmd_if_turn_less_than, // 0x02
ContestAICmd_if_turn_more_than, // 0x03
ContestAICmd_if_turn_eq, // 0x04
ContestAICmd_if_turn_not_eq, // 0x05
ContestAICmd_get_appeal_num, // 0x01
ContestAICmd_if_appeal_num_less_than, // 0x02
ContestAICmd_if_appeal_num_more_than, // 0x03
ContestAICmd_if_appeal_num_eq, // 0x04
ContestAICmd_if_appeal_num_not_eq, // 0x05
ContestAICmd_get_excitement, // 0x06
ContestAICmd_if_excitement_less_than, // 0x07
ContestAICmd_if_excitement_more_than, // 0x08
@ -288,7 +289,7 @@ static const ContestAICmdFunc sContestAICmdTable[] =
};
static void ContestAI_DoAIProcessing(void);
static bool8 sub_81563B0(u8);
static bool8 GetContestantIdByTurn(u8);
static void AIStackPushVar(const u8 *);
static u8 AIStackPop(void);
@ -297,8 +298,8 @@ void ContestAI_ResetAI(u8 contestantAI)
int i;
memset(&eContestAI, 0, sizeof(struct ContestAIInfo));
for (i = 0; i < 4; i++)
eContestAI.unk5[i] = 100;
for (i = 0; i < MAX_MON_MOVES; i++)
eContestAI.moveScores[i] = 100;
eContestAI.contestantId = contestantAI;
eContestAI.stackSize = 0;
@ -321,16 +322,18 @@ u8 ContestAI_GetActionToUse(void)
while (1)
{
u8 rval = Random() & 3;
u8 r2 = eContestAI.unk5[rval];
// Randomly choose a move index. If it's the move
// with the highest (or tied highest) score, return
u8 moveIdx = Random() & (MAX_MON_MOVES - 1); // % MAX_MON_MOVES doesn't match
u8 score = eContestAI.moveScores[moveIdx];
int i;
for (i = 0; i < 4; i++)
for (i = 0; i < MAX_MON_MOVES; i++)
{
if (r2 < eContestAI.unk5[i])
if (score < eContestAI.moveScores[i])
break;
}
if (i == 4)
return rval;
if (i == MAX_MON_MOVES)
return moveIdx;
}
}
@ -345,26 +348,26 @@ static void ContestAI_DoAIProcessing(void)
case CONTESTAI_SETTING_UP:
gAIScriptPtr = gContestAIChecks[eContestAI.currentAICheck];
if (gContestMons[eContestAI.contestantId].moves[eContestAI.nextMoveIndex] == 0)
eContestAI.nextMove = 0; // don't process a move that doesn't exist.
if (gContestMons[eContestAI.contestantId].moves[eContestAI.nextMoveIndex] == MOVE_NONE)
eContestAI.nextMove = MOVE_NONE; // don't process a move that doesn't exist.
else
eContestAI.nextMove = gContestMons[eContestAI.contestantId].moves[eContestAI.nextMoveIndex];
eContestAI.aiState++;
break;
case CONTESTAI_PROCESSING:
if (eContestAI.nextMove != 0)
if (eContestAI.nextMove != MOVE_NONE)
{
sContestAICmdTable[*gAIScriptPtr](); // run the command.
}
else
{
eContestAI.unk5[eContestAI.nextMoveIndex] = 0; // don't consider a move that doesn't exist.
eContestAI.moveScores[eContestAI.nextMoveIndex] = 0; // don't consider a move that doesn't exist.
eContestAI.aiAction |= 1;
}
if (eContestAI.aiAction & 1)
{
eContestAI.nextMoveIndex++;
if (eContestAI.nextMoveIndex < 4)
if (eContestAI.nextMoveIndex < MAX_MON_MOVES)
eContestAI.aiState = 0;
else
// aiState = CONTESTAI_FINISHED
@ -376,12 +379,12 @@ static void ContestAI_DoAIProcessing(void)
}
}
static u8 sub_81563B0(u8 var)
static u8 GetContestantIdByTurn(u8 turn)
{
int i;
for (i = 0; i < 4; i++)
if (eContestResources8.turnOrder[i] == var)
for (i = 0; i < CONTESTANT_COUNT; i++)
if (eContestAppealResults.turnOrder[i] == turn)
break;
return i;
@ -389,27 +392,27 @@ static u8 sub_81563B0(u8 var)
static void ContestAICmd_score(void)
{
s16 score = eContestAI.unk5[eContestAI.nextMoveIndex] + (s8)gAIScriptPtr[1];
s16 score = eContestAI.moveScores[eContestAI.nextMoveIndex] + (s8)gAIScriptPtr[1];
if (score > 255)
score = 255;
else if (score < 0)
score = 0;
eContestAI.unk5[eContestAI.nextMoveIndex] = score;
eContestAI.moveScores[eContestAI.nextMoveIndex] = score;
gAIScriptPtr += 2;
}
static void ContestAICmd_get_turn(void)
static void ContestAICmd_get_appeal_num(void)
{
eContestAI.scriptResult = eContest.turnNumber;
eContestAI.scriptResult = eContest.appealNumber;
gAIScriptPtr += 1;
}
static void ContestAICmd_if_turn_less_than(void)
static void ContestAICmd_if_appeal_num_less_than(void)
{
ContestAICmd_get_turn();
ContestAICmd_get_appeal_num();
if (eContestAI.scriptResult < gAIScriptPtr[0])
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1);
@ -417,9 +420,9 @@ static void ContestAICmd_if_turn_less_than(void)
gAIScriptPtr += 5;
}
static void ContestAICmd_if_turn_more_than(void)
static void ContestAICmd_if_appeal_num_more_than(void)
{
ContestAICmd_get_turn();
ContestAICmd_get_appeal_num();
if (eContestAI.scriptResult > gAIScriptPtr[0])
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1);
@ -427,9 +430,9 @@ static void ContestAICmd_if_turn_more_than(void)
gAIScriptPtr += 5;
}
static void ContestAICmd_if_turn_eq(void)
static void ContestAICmd_if_appeal_num_eq(void)
{
ContestAICmd_get_turn();
ContestAICmd_get_appeal_num();
if (eContestAI.scriptResult == gAIScriptPtr[0])
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1);
@ -437,9 +440,9 @@ static void ContestAICmd_if_turn_eq(void)
gAIScriptPtr += 5;
}
static void ContestAICmd_if_turn_not_eq(void)
static void ContestAICmd_if_appeal_num_not_eq(void)
{
ContestAICmd_get_turn();
ContestAICmd_get_appeal_num();
if (eContestAI.scriptResult != gAIScriptPtr[0])
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1);
@ -495,7 +498,7 @@ static void ContestAICmd_if_excitement_not_eq(void)
static void ContestAICmd_get_user_order(void)
{
eContestAI.scriptResult = eContestResources8.turnOrder[eContestAI.contestantId];
eContestAI.scriptResult = eContestAppealResults.turnOrder[eContestAI.contestantId];
gAIScriptPtr += 1;
}
@ -633,7 +636,7 @@ static void ContestAICmd_unk_19(void)
static void ContestAICmd_unk_1A(void)
{
eContestAI.scriptResult = gContestMonConditions[eContestAI.contestantId];
eContestAI.scriptResult = gContestMonRound1Points[eContestAI.contestantId];
gAIScriptPtr += 1;
}
@ -1146,9 +1149,9 @@ static void ContestAICmd_if_would_not_finish_combo(void)
static void ContestAICmd_get_condition(void)
{
int var = sub_81563B0(gAIScriptPtr[1]);
u8 contestant = GetContestantIdByTurn(gAIScriptPtr[1]);
eContestAI.scriptResult = eContestantStatus[var].condition / 10;
eContestAI.scriptResult = eContestantStatus[contestant].condition / 10;
gAIScriptPtr += 2;
}
@ -1194,11 +1197,11 @@ static void ContestAICmd_if_condition_not_eq(void)
static void ContestAICmd_get_used_combo_starter(void)
{
u16 result = 0;
u8 var = sub_81563B0(gAIScriptPtr[1]);
u16 result = FALSE;
u8 contestant = GetContestantIdByTurn(gAIScriptPtr[1]);
if (sub_80DE1E8(var))
result = gContestMoves[eContestantStatus[var].prevMove].comboStarterId ? 1 : 0;
if (IsContestantAllowedToCombo(contestant))
result = gContestMoves[eContestantStatus[contestant].prevMove].comboStarterId ? TRUE : FALSE;
eContestAI.scriptResult = result;
gAIScriptPtr += 2;
@ -1246,7 +1249,7 @@ static void ContestAICmd_if_used_combo_starter_not_eq(void)
static void ContestAICmd_check_can_participate(void)
{
if (Contest_IsMonsTurnDisabled(sub_81563B0(gAIScriptPtr[1])))
if (Contest_IsMonsTurnDisabled(GetContestantIdByTurn(gAIScriptPtr[1])))
eContestAI.scriptResult = FALSE;
else
eContestAI.scriptResult = TRUE;
@ -1276,9 +1279,9 @@ static void ContestAICmd_if_cannot_participate(void)
static void ContestAICmd_get_val_812A188(void)
{
u8 var = sub_81563B0(gAIScriptPtr[1]);
u8 contestant = GetContestantIdByTurn(gAIScriptPtr[1]);
eContestAI.scriptResult = eContestantStatus[var].unk15_3;
eContestAI.scriptResult = eContestantStatus[contestant].unk15_3;
gAIScriptPtr += 2;
}
@ -1304,9 +1307,9 @@ static void ContestAICmd_contest_58(void)
static void ContestAICmd_unk_59(void)
{
u8 var = sub_81563B0(gAIScriptPtr[1]);
u8 contestant = GetContestantIdByTurn(gAIScriptPtr[1]);
eContestAI.scriptResult = eContestantStatus[var].pointTotal - eContestantStatus[eContestAI.contestantId].pointTotal;
eContestAI.scriptResult = eContestantStatus[contestant].pointTotal - eContestantStatus[eContestAI.contestantId].pointTotal;
gAIScriptPtr += 2;
}
@ -1352,9 +1355,9 @@ static void ContestAICmd_unk_5D(void)
static void ContestAICmd_unk_5E(void)
{
u8 var = sub_81563B0(gAIScriptPtr[1]);
u8 contestant = GetContestantIdByTurn(gAIScriptPtr[1]);
eContestAI.scriptResult = gContestMonConditions[var] - gContestMonConditions[eContestAI.contestantId];
eContestAI.scriptResult = gContestMonRound1Points[contestant] - gContestMonRound1Points[eContestAI.contestantId];
gAIScriptPtr += 2;
}
@ -1400,9 +1403,9 @@ static void ContestAICmd_unk_62(void)
static void ContestAICmd_unk_63(void)
{
u8 var = sub_81563B0(gAIScriptPtr[1]);
u8 var2 = gAIScriptPtr[2];
u16 move = eContest.moveHistory[var2][var];
u8 contestant = GetContestantIdByTurn(gAIScriptPtr[1]);
u8 turn = gAIScriptPtr[2];
u16 move = eContest.moveHistory[turn][contestant];
eContestAI.scriptResult = gContestMoves[move].effect;
gAIScriptPtr += 3;
@ -1450,9 +1453,9 @@ static void ContestAICmd_unk_67(void)
static void ContestAICmd_unk_68(void)
{
u8 var = sub_81563B0(gAIScriptPtr[1]);
u8 var2 = gAIScriptPtr[2];
s8 result = eContest.excitementHistory[var2][var];
u8 contestant = GetContestantIdByTurn(gAIScriptPtr[1]);
u8 turn = gAIScriptPtr[2];
s8 result = eContest.excitementHistory[turn][contestant];
eContestAI.scriptResult = result;
gAIScriptPtr += 3;
@ -1500,9 +1503,9 @@ static void ContestAICmd_unk_6C(void)
static void ContestAICmd_unk_6D(void)
{
u8 var = sub_81563B0(gAIScriptPtr[1]);
u8 var2 = gAIScriptPtr[2];
u16 move = eContest.moveHistory[var2][var];
u8 contestant = GetContestantIdByTurn(gAIScriptPtr[1]);
u8 turn = gAIScriptPtr[2];
u16 move = eContest.moveHistory[turn][contestant];
eContestAI.scriptResult = gContestEffects[gContestMoves[move].effect].effectType;
gAIScriptPtr += 3;

File diff suppressed because it is too large Load Diff

View File

@ -8,10 +8,18 @@
#include "task.h"
#include "contest_link.h"
static void sub_80FC5C0(u8);
static void sub_80FC5DC(u8);
static void Task_LinkContest_StartInitFlags(u8);
static void Task_LinkContest_InitFlags(u8);
bool32 sub_80FC4F4(void *src, u16 size)
#define tState data[0]
#define tDelayTimer data[1]
#define tCategories(i) data[(i) + 1]
#define tLeaderIds(i) data[(i) + 5]
#define tCategory data[9]
#define tTimer data[11]
#define tStandbyState data[12]
bool32 LinkContest_SendBlock(void *src, u16 size)
{
memcpy(gDecompressionBuffer, src, size);
if (SendBlock(bitmask_all_link_players_but_self(), gDecompressionBuffer, size))
@ -20,21 +28,21 @@ bool32 sub_80FC4F4(void *src, u16 size)
return FALSE;
}
bool8 sub_80FC530(u8 arg0)
bool8 LinkContest_GetBlockReceived(u8 flag)
{
u8 mask = (1 << arg0);
u8 mask = (1 << flag);
if (!(GetBlockReceivedStatus() & mask))
{
return FALSE;
}
else
{
ResetBlockReceivedFlag(arg0);
ResetBlockReceivedFlag(flag);
return TRUE;
}
}
bool8 sub_80FC55C(void)
bool8 LinkContest_GetBlockReceivedFromAllPlayers(void)
{
if (GetBlockReceivedStatus() == GetLinkPlayerCountAsBitFlags())
{
@ -47,23 +55,23 @@ bool8 sub_80FC55C(void)
}
}
void sub_80FC580(u8 taskId)
void Task_LinkContest_Init(u8 taskId)
{
u8 i;
for (i = 0; i < 4; i++)
for (i = 0; i < CONTESTANT_COUNT; i++)
gBlockRecvBuffer[i][0] = 0xFF;
gTasks[taskId].data[0] = 0;
gTasks[taskId].func = sub_80FC5C0;
gTasks[taskId].tState = 0;
gTasks[taskId].func = Task_LinkContest_StartInitFlags;
}
static void sub_80FC5C0(u8 taskId)
static void Task_LinkContest_StartInitFlags(u8 taskId)
{
gTasks[taskId].func = sub_80FC5DC;
gTasks[taskId].func = Task_LinkContest_InitFlags;
}
static void sub_80FC5DC(u8 taskId)
static void Task_LinkContest_InitFlags(u8 taskId)
{
int i;
@ -76,6 +84,7 @@ static void sub_80FC5DC(u8 taskId)
if (gWirelessCommType == 1)
gLinkContestFlags = LINK_CONTEST_FLAG_IS_LINK | LINK_CONTEST_FLAG_IS_WIRELESS;
// Get number of players using Emerald/FRLG
for (i = 0; i < gNumLinkContestPlayers && (u32)(gLinkPlayers[i].version & 0xFF) - 1 > VERSION_RUBY - 1; i++)
;
@ -85,22 +94,23 @@ static void sub_80FC5DC(u8 taskId)
SwitchTaskToFollowupFunc(taskId);
}
bool32 sub_80FC670(s16 *arg0)
bool32 LinkContest_TryLinkStandby(s16 *state)
{
// Skip standby for RS cabled links
if (gLinkContestFlags & LINK_CONTEST_FLAG_HAS_RS_PLAYER)
return TRUE;
switch (*arg0)
switch (*state)
{
case 0:
if (IsLinkTaskFinished())
{
sub_800ADF8();
(*arg0)++;
SetLinkStandbyCallback();
(*state)++;
}
return FALSE;
case 1:
(*arg0)++;
(*state)++;
return FALSE;
default:
if (IsLinkTaskFinished() != TRUE)
@ -110,438 +120,443 @@ bool32 sub_80FC670(s16 *arg0)
}
}
void sub_80FC6BC(u8 taskId)
void Task_LinkContest_CommunicateMonsRS(u8 taskId)
{
int i;
if (!sub_80FC670(&gTasks[taskId].data[12]))
if (!LinkContest_TryLinkStandby(&gTasks[taskId].tStandbyState))
return;
switch (gTasks[taskId].data[0])
switch (gTasks[taskId].tState)
{
case 0:
// Send players mon
if (GetMultiplayerId() == 0)
{
if (IsLinkTaskFinished())
{
memcpy(gBlockSendBuffer, &gContestMons[gContestPlayerMonIndex], sizeof(struct ContestPokemon));
gTasks[taskId].data[0] = 10;
gTasks[taskId].tState = 10;
}
}
else
{
memcpy(gBlockSendBuffer, &gContestMons[gContestPlayerMonIndex], sizeof(struct ContestPokemon));
gTasks[taskId].data[0] = 1;
gTasks[taskId].tState = 1;
}
break;
case 1:
if (sub_80FC55C())
// Wait for other players data
if (LinkContest_GetBlockReceivedFromAllPlayers())
{
for (i = 0; i < gNumLinkContestPlayers; i++)
{
memcpy(&gContestMons[i], gBlockRecvBuffer[i], sizeof(struct ContestPokemon));
sub_80DFA08(&gContestMons[i], gLinkPlayers[i].language);
StripPlayerAndMonNamesForLinkContest(&gContestMons[i], gLinkPlayers[i].language);
}
gTasks[taskId].data[0]++;
gTasks[taskId].tState++;
}
break;
case 10:
if (++gTasks[taskId].data[11] > 300)
// Only if leader. Request other players data
if (++gTasks[taskId].tTimer > 300)
{
sub_800A4D8(2);
gTasks[taskId].data[0] = 1;
SendBlockRequest(2);
gTasks[taskId].tState = 1;
}
break;
default:
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[11] = 0;
gTasks[taskId].data[12] = 0;
gTasks[taskId].tState = 0;
gTasks[taskId].tTimer = 0;
gTasks[taskId].tStandbyState = 0;
SwitchTaskToFollowupFunc(taskId);
break;
}
}
void sub_80FC804(u8 taskId)
void Task_LinkContest_CommunicateRngRS(u8 taskId)
{
switch (gTasks[taskId].data[0])
switch (gTasks[taskId].tState)
{
case 0:
if (GetMultiplayerId() == 0)
{
if (IsLinkTaskFinished() && sub_80FC4F4(&gRngValue, sizeof(gRngValue)) == TRUE)
gTasks[taskId].data[0]++;
if (IsLinkTaskFinished() && LinkContest_SendBlock(&gRngValue, sizeof(gRngValue)) == TRUE)
gTasks[taskId].tState++;
}
else
{
gTasks[taskId].data[0]++;
gTasks[taskId].tState++;
}
break;
case 1:
if (sub_80FC530(0))
if (LinkContest_GetBlockReceived(0))
{
memcpy(&gRngValue, gBlockRecvBuffer[0], sizeof(gRngValue));
memcpy(&gContestRngValue, gBlockRecvBuffer[0], sizeof(gContestRngValue));
gTasks[taskId].data[0]++;
gTasks[taskId].tState++;
}
break;
default:
gTasks[taskId].data[0] = 0;
gTasks[taskId].tState = 0;
SwitchTaskToFollowupFunc(taskId);
break;
}
}
void sub_80FC894(u8 taskId)
void Task_LinkContest_CommunicateCategoryRS(u8 taskId)
{
int i;
if (!sub_80FC670(&gTasks[taskId].data[12]))
if (!LinkContest_TryLinkStandby(&gTasks[taskId].tStandbyState))
return;
switch (gTasks[taskId].data[0])
switch (gTasks[taskId].tState)
{
case 0:
gBlockSendBuffer[0] = gTasks[taskId].data[9];
gBlockSendBuffer[0] = gTasks[taskId].tCategory;
if (GetMultiplayerId() == 0)
{
if (IsLinkTaskFinished())
gTasks[taskId].data[0] = 10;
gTasks[taskId].tState = 10;
}
else
{
gTasks[taskId].data[0]++;
gTasks[taskId].tState++;
}
break;
case 1:
if (sub_80FC55C())
if (LinkContest_GetBlockReceivedFromAllPlayers())
{
for (i = 0; i < gNumLinkContestPlayers; i++)
gTasks[taskId].data[i + 1] = gBlockRecvBuffer[i][0];
gTasks[taskId].tCategories(i) = gBlockRecvBuffer[i][0];
gTasks[taskId].data[0]++;
gTasks[taskId].tState++;
}
break;
case 10:
if (++gTasks[taskId].data[11] > 10)
if (++gTasks[taskId].tTimer > 10)
{
sub_800A4D8(2);
gTasks[taskId].data[0] = 1;
SendBlockRequest(2);
gTasks[taskId].tState = 1;
}
break;
default:
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[11] = 0;
gTasks[taskId].data[12] = 0;
gTasks[taskId].tState = 0;
gTasks[taskId].tTimer = 0;
gTasks[taskId].tStandbyState = 0;
SwitchTaskToFollowupFunc(taskId);
break;
}
}
void sub_80FC998(u8 taskId)
void Task_LinkContest_CommunicateMonIdxs(u8 taskId)
{
switch (gTasks[taskId].data[0])
switch (gTasks[taskId].tState)
{
case 0:
if (IsLinkTaskFinished())
{
if (sub_80FC4F4(&gContestPlayerMonIndex, sizeof(gContestPlayerMonIndex)) == TRUE)
gTasks[taskId].data[0]++;
if (LinkContest_SendBlock(&gContestPlayerMonIndex, sizeof(gContestPlayerMonIndex)) == TRUE)
gTasks[taskId].tState++;
}
break;
case 1:
if (sub_80FC55C())
gTasks[taskId].data[0]++;
if (LinkContest_GetBlockReceivedFromAllPlayers())
gTasks[taskId].tState++;
break;
default:
gTasks[taskId].data[0] = 0;
gTasks[taskId].tState = 0;
SwitchTaskToFollowupFunc(taskId);
break;
}
}
void sub_80FC9F8(u8 taskId)
void Task_LinkContest_CommunicateMoveSelections(u8 taskId)
{
int i;
switch (gTasks[taskId].data[0])
switch (gTasks[taskId].tState)
{
case 0:
if (IsLinkTaskFinished())
{
if (sub_80FC4F4(&eContestantStatus[gContestPlayerMonIndex].currMove, sizeof(eContestantStatus[gContestPlayerMonIndex].currMove)) == TRUE)
gTasks[taskId].data[0]++;
// Send player's move selection
if (LinkContest_SendBlock(&eContestantStatus[gContestPlayerMonIndex].currMove, sizeof(eContestantStatus[gContestPlayerMonIndex].currMove)) == TRUE)
gTasks[taskId].tState++;
}
break;
case 1:
if (sub_80FC55C())
if (LinkContest_GetBlockReceivedFromAllPlayers())
{
// Receive partners' move selections
for (i = 0; i < gNumLinkContestPlayers; i++)
eContestantStatus[i].currMove = gBlockRecvBuffer[i][0];
gTasks[taskId].data[0]++;
gTasks[taskId].tState++;
}
break;
default:
gTasks[taskId].data[0] = 0;
gTasks[taskId].tState = 0;
SwitchTaskToFollowupFunc(taskId);
break;
}
}
void sub_80FCACC(u8 taskId)
void Task_LinkContest_CommunicateFinalStandings(u8 taskId)
{
switch (gTasks[taskId].data[0])
switch (gTasks[taskId].tState)
{
case 0:
if (IsLinkTaskFinished())
{
if (sub_80FC4F4(gContestMonTotalPoints, sizeof(gContestMonTotalPoints)) == 1)
gTasks[taskId].data[0]++;
if (LinkContest_SendBlock(gContestMonTotalPoints, sizeof(gContestMonTotalPoints)) == 1)
gTasks[taskId].tState++;
}
break;
case 1:
if (sub_80FC55C())
if (LinkContest_GetBlockReceivedFromAllPlayers())
{
memcpy(gContestMonTotalPoints, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestMonTotalPoints));
gTasks[taskId].data[0]++;
memcpy(gContestMonTotalPoints, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof(gContestMonTotalPoints));
gTasks[taskId].tState++;
}
break;
case 2:
case 5:
case 8:
case 11:
if (gTasks[taskId].data[1]++ > 10)
if (gTasks[taskId].tDelayTimer++ > 10)
{
gTasks[taskId].data[1] = 0;
gTasks[taskId].data[0]++;
gTasks[taskId].tDelayTimer = 0;
gTasks[taskId].tState++;
}
break;
case 3:
if (IsLinkTaskFinished())
{
if (sub_80FC4F4(gUnknown_02039F10, sizeof(gUnknown_02039F10)) == 1)
gTasks[taskId].data[0]++;
if (LinkContest_SendBlock(gContestMonAppealPointTotals, sizeof(gContestMonAppealPointTotals)) == 1)
gTasks[taskId].tState++;
}
break;
case 4:
if (sub_80FC55C())
if (LinkContest_GetBlockReceivedFromAllPlayers())
{
memcpy(gUnknown_02039F10, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gUnknown_02039F10));
gTasks[taskId].data[0]++;
memcpy(gContestMonAppealPointTotals, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof(gContestMonAppealPointTotals));
gTasks[taskId].tState++;
}
break;
case 6:
if (IsLinkTaskFinished())
{
if (sub_80FC4F4(gContestMonRound2Points, sizeof(gContestMonRound2Points)) == 1)
gTasks[taskId].data[0]++;
if (LinkContest_SendBlock(gContestMonRound2Points, sizeof(gContestMonRound2Points)) == 1)
gTasks[taskId].tState++;
}
break;
case 7:
if (sub_80FC55C())
if (LinkContest_GetBlockReceivedFromAllPlayers())
{
memcpy(gContestMonRound2Points, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestMonRound2Points));
gTasks[taskId].data[0]++;
memcpy(gContestMonRound2Points, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof(gContestMonRound2Points));
gTasks[taskId].tState++;
}
break;
case 9:
if (IsLinkTaskFinished())
{
if (sub_80FC4F4(gContestFinalStandings, sizeof(gContestFinalStandings)) == 1)
gTasks[taskId].data[0]++;
if (LinkContest_SendBlock(gContestFinalStandings, sizeof(gContestFinalStandings)) == 1)
gTasks[taskId].tState++;
}
break;
case 10:
if (sub_80FC55C())
if (LinkContest_GetBlockReceivedFromAllPlayers())
{
memcpy(gContestFinalStandings, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestFinalStandings));
gTasks[taskId].data[0]++;
memcpy(gContestFinalStandings, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof(gContestFinalStandings));
gTasks[taskId].tState++;
}
break;
default:
gTasks[taskId].data[0] = 0;
gTasks[taskId].tState = 0;
SwitchTaskToFollowupFunc(taskId);
break;
}
}
void sub_80FCC88(u8 taskId)
void Task_LinkContest_CommunicateAppealsState(u8 taskId)
{
switch (gTasks[taskId].data[0])
switch (gTasks[taskId].tState)
{
case 0:
if (IsLinkTaskFinished())
{
if (sub_80FC4F4(eContestantStatus, 4 * sizeof(struct ContestantStatus)) == 1)
gTasks[taskId].data[0]++;
if (LinkContest_SendBlock(eContestantStatus, CONTESTANT_COUNT * sizeof(struct ContestantStatus)) == 1)
gTasks[taskId].tState++;
}
break;
case 1:
if (sub_80FC55C())
if (LinkContest_GetBlockReceivedFromAllPlayers())
{
memcpy(eContestantStatus, gBlockRecvBuffer[gUnknown_02039F2B], 4 * sizeof(struct ContestantStatus));
gTasks[taskId].data[0]++;
memcpy(eContestantStatus, gBlockRecvBuffer[gContestLinkLeaderIndex], CONTESTANT_COUNT * sizeof(struct ContestantStatus));
gTasks[taskId].tState++;
}
break;
case 2:
case 5:
case 8:
case 11:
if (gTasks[taskId].data[1]++ > 10)
if (gTasks[taskId].tDelayTimer++ > 10)
{
gTasks[taskId].data[1] = 0;
gTasks[taskId].data[0]++;
gTasks[taskId].tDelayTimer = 0;
gTasks[taskId].tState++;
}
break;
case 3:
if (IsLinkTaskFinished())
{
if (sub_80FC4F4(gContestResources->field_8, sizeof(struct UnknownContestStruct7)) == 1)
gTasks[taskId].data[0]++;
if (LinkContest_SendBlock(gContestResources->appealResults, sizeof(struct ContestAppealMoveResults)) == 1)
gTasks[taskId].tState++;
}
break;
case 4:
if (sub_80FC55C())
if (LinkContest_GetBlockReceivedFromAllPlayers())
{
memcpy(gContestResources->field_8, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(struct UnknownContestStruct7));
gTasks[taskId].data[0]++;
memcpy(gContestResources->appealResults, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof(struct ContestAppealMoveResults));
gTasks[taskId].tState++;
}
break;
case 6:
if (IsLinkTaskFinished())
{
if (sub_80FC4F4(gContestResources->field_10, sizeof(struct UnknownContestStruct5)) == 1)
gTasks[taskId].data[0]++;
if (LinkContest_SendBlock(gContestResources->excitement, sizeof(struct ContestExcitement)) == 1)
gTasks[taskId].tState++;
}
break;
case 7:
if (sub_80FC55C())
if (LinkContest_GetBlockReceivedFromAllPlayers())
{
memcpy(gContestResources->field_10, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(struct UnknownContestStruct5));
gTasks[taskId].data[0]++;
memcpy(gContestResources->excitement, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof(struct ContestExcitement));
gTasks[taskId].tState++;
}
break;
case 9:
if (IsLinkTaskFinished())
{
if (sub_80FC4F4(gContestantTurnOrder, sizeof(gContestantTurnOrder)) == 1)
gTasks[taskId].data[0]++;
if (LinkContest_SendBlock(gContestantTurnOrder, sizeof(gContestantTurnOrder)) == 1)
gTasks[taskId].tState++;
}
break;
case 10:
if (sub_80FC55C())
if (LinkContest_GetBlockReceivedFromAllPlayers())
{
memcpy(gContestantTurnOrder, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestantTurnOrder));
gTasks[taskId].data[0]++;
memcpy(gContestantTurnOrder, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof(gContestantTurnOrder));
gTasks[taskId].tState++;
}
break;
default:
gTasks[taskId].data[0] = 0;
gTasks[taskId].tState = 0;
SwitchTaskToFollowupFunc(taskId);
break;
}
}
void sub_80FCE48(u8 taskId)
void Task_LinkContest_CommunicateLeaderIdsRS(u8 taskId)
{
int i;
if (!sub_80FC670(&gTasks[taskId].data[12]))
if (!LinkContest_TryLinkStandby(&gTasks[taskId].tStandbyState))
return;
switch (gTasks[taskId].data[0])
switch (gTasks[taskId].tState)
{
case 0:
gBlockSendBuffer[0] = 0x6E;
if (GetMultiplayerId() == 0)
{
if (IsLinkTaskFinished())
gTasks[taskId].data[0] = 10;
gTasks[taskId].tState = 10;
}
else
{
gTasks[taskId].data[0]++;
gTasks[taskId].tState++;
}
break;
case 1:
if (sub_80FC55C())
if (LinkContest_GetBlockReceivedFromAllPlayers())
{
for (i = 0; i < 4; i++)
gTasks[taskId].data[i + 5] = gBlockRecvBuffer[i][0];
for (i = 0; i < CONTESTANT_COUNT; i++)
gTasks[taskId].tLeaderIds(i) = gBlockRecvBuffer[i][0];
gTasks[taskId].data[0]++;
gTasks[taskId].tState++;
}
break;
case 10:
if (++gTasks[taskId].data[11] > 10)
if (++gTasks[taskId].tTimer > 10)
{
sub_800A4D8(2);
gTasks[taskId].data[0] = 1;
SendBlockRequest(2);
gTasks[taskId].tState = 1;
}
break;
default:
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[11] = 0;
gTasks[taskId].data[12] = 0;
gTasks[taskId].tState = 0;
gTasks[taskId].tTimer = 0;
gTasks[taskId].tStandbyState = 0;
SwitchTaskToFollowupFunc(taskId);
break;
}
}
void sub_80FCF40(u8 taskId)
void Task_LinkContest_CommunicateRound1Points(u8 taskId)
{
if (!sub_80FC670(&gTasks[taskId].data[12]))
if (!LinkContest_TryLinkStandby(&gTasks[taskId].tStandbyState))
return;
switch (gTasks[taskId].data[0])
switch (gTasks[taskId].tState)
{
case 0:
if (IsLinkTaskFinished())
{
if (sub_80FC4F4(gContestMonConditions, sizeof(gContestMonConditions)) == 1)
gTasks[taskId].data[0]++;
if (LinkContest_SendBlock(gContestMonRound1Points, sizeof(gContestMonRound1Points)) == 1)
gTasks[taskId].tState++;
}
break;
case 1:
if (sub_80FC55C())
if (LinkContest_GetBlockReceivedFromAllPlayers())
{
memcpy(gContestMonConditions, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestMonConditions));
gTasks[taskId].data[0]++;
memcpy(gContestMonRound1Points, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof(gContestMonRound1Points));
gTasks[taskId].tState++;
}
break;
default:
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[12] = 0;
gTasks[taskId].tState = 0;
gTasks[taskId].tStandbyState = 0;
SwitchTaskToFollowupFunc(taskId);
break;
}
}
void sub_80FCFD0(u8 taskId)
void Task_LinkContest_CommunicateTurnOrder(u8 taskId)
{
if (!sub_80FC670(&gTasks[taskId].data[12]))
if (!LinkContest_TryLinkStandby(&gTasks[taskId].tStandbyState))
return;
switch (gTasks[taskId].data[0])
switch (gTasks[taskId].tState)
{
case 0:
if (IsLinkTaskFinished())
{
if (sub_80FC4F4(gContestantTurnOrder, sizeof(gContestantTurnOrder)) == 1)
gTasks[taskId].data[0]++;
if (LinkContest_SendBlock(gContestantTurnOrder, sizeof(gContestantTurnOrder)) == 1)
gTasks[taskId].tState++;
}
break;
case 1:
if (sub_80FC55C())
if (LinkContest_GetBlockReceivedFromAllPlayers())
{
memcpy(gContestantTurnOrder, gBlockRecvBuffer[gUnknown_02039F2B], sizeof(gContestantTurnOrder));
gTasks[taskId].data[0]++;
memcpy(gContestantTurnOrder, gBlockRecvBuffer[gContestLinkLeaderIndex], sizeof(gContestantTurnOrder));
gTasks[taskId].tState++;
}
break;
default:
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[12] = 0;
gTasks[taskId].tState = 0;
gTasks[taskId].tStandbyState = 0;
SwitchTaskToFollowupFunc(taskId);
break;
}

View File

@ -1,148 +1,158 @@
#include "global.h"
#include "contest.h"
#include "contest_link.h"
#include "event_data.h"
#include "link.h"
#include "random.h"
#include "task.h"
static void sub_81D9F14(u8);
static void sub_81D9F30(u8);
static void sub_81D9F4C(u8);
static void sub_81D9F68(u8);
static void sub_81DA10C(u8);
static void sub_81DA138(u8);
static void sub_81DA160(u8);
static void sub_81DA244(u8);
static void sub_81DA2E8(u8);
static void sub_81DA3B8(u8);
static void sub_81DA488(u8);
/*
The functions in this file handle preliminary communication
for Emerald-only link contests. If the link contest has an RS
player linked, none of these functions are used.
void sub_81D9DE4(u8 taskId)
The equivalent functions for RS-linked contests are spread
between contest_link.c and contest_util.c, and are suffixed RS
instead of Em
*/
static void Task_LinkContest_CommunicateMonsEm(u8);
static void Task_LinkContest_StartCommunicateRngEm(u8);
static void Task_LinkContest_CommunicateRngEm(u8);
static void Task_LinkContest_StartCommunicateLeaderIdsEm(u8);
static void Task_LinkContest_CommunicateLeaderIdsEm(u8);
static void Task_LinkContest_StartCommunicateCategoryEm(u8);
static void Task_LinkContest_CommunicateCategoryEm(u8);
static void Task_LinkContest_SetUpContestEm(u8);
static void Task_LinkContest_CommunicateAIMonsEm(u8);
static void Task_LinkContest_CalculateRound1Em(u8);
static void Task_LinkContest_CalculateTurnOrderEm(u8);
#define tCategory data[9]
void Task_LinkContest_StartCommunicationEm(u8 taskId)
{
int gameCleared;
switch (gTasks[taskId].data[9])
switch (gTasks[taskId].tCategory)
{
case 0:
case CONTEST_CATEGORY_COOL:
gHighestRibbonRank = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON);
break;
case 1:
case CONTEST_CATEGORY_BEAUTY:
gHighestRibbonRank = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON);
break;
case 2:
case CONTEST_CATEGORY_CUTE:
gHighestRibbonRank = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON);
break;
case 3:
case CONTEST_CATEGORY_SMART:
gHighestRibbonRank = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON);
break;
case 4:
case CONTEST_CATEGORY_TOUGH:
default:
gHighestRibbonRank = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON);
break;
}
gContestMons[gContestPlayerMonIndex].unk2C[0] = gHighestRibbonRank;
gContestMons[gContestPlayerMonIndex].highestRank = gHighestRibbonRank;
gameCleared = FlagGet(FLAG_SYS_GAME_CLEAR) > 0;
gContestMons[gContestPlayerMonIndex].unk2C[1] = gameCleared;
SetTaskFuncWithFollowupFunc(taskId, sub_81DA160, sub_81D9F14);
gContestMons[gContestPlayerMonIndex].gameCleared = gameCleared;
SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateMonsEm, Task_LinkContest_StartCommunicateRngEm);
}
static void sub_81D9F14(u8 taskId)
static void Task_LinkContest_StartCommunicateRngEm(u8 taskId)
{
SetTaskFuncWithFollowupFunc(taskId, sub_81DA244, sub_81D9F30);
SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateRngEm, Task_LinkContest_StartCommunicateLeaderIdsEm);
}
static void sub_81D9F30(u8 taskId)
static void Task_LinkContest_StartCommunicateLeaderIdsEm(u8 taskId)
{
SetTaskFuncWithFollowupFunc(taskId, sub_81DA2E8, sub_81D9F4C);
SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateLeaderIdsEm, Task_LinkContest_StartCommunicateCategoryEm);
}
static void sub_81D9F4C(u8 taskId)
static void Task_LinkContest_StartCommunicateCategoryEm(u8 taskId)
{
SetTaskFuncWithFollowupFunc(taskId, sub_81DA3B8, sub_81D9F68);
SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateCategoryEm, Task_LinkContest_SetUpContestEm);
}
static void sub_81D9F68(u8 taskId)
static void Task_LinkContest_SetUpContestEm(u8 taskId)
{
u8 i;
u8 rank;
int gameCleared;
u8 data1[4];
u8 data2[4];
u8 categories[CONTESTANT_COUNT];
u8 leaderIds[CONTESTANT_COUNT];
memset(data1, 0, sizeof(data1));
memset(data2, 0, sizeof(data2));
memset(categories, 0, sizeof(categories));
memset(leaderIds, 0, sizeof(leaderIds));
for (i = 0; i < gNumLinkContestPlayers; i++)
data1[i] = gTasks[taskId].data[i + 1];
categories[i] = gTasks[taskId].data[i + 1];
i = 0;
if (i < gNumLinkContestPlayers)
{
while (++i < gNumLinkContestPlayers)
{
if (data1[0] != data1[i])
break;
}
}
// Ensure all players are doing the same category
for (i = 0; i < gNumLinkContestPlayers && categories[0] == categories[i]; i++)
;
if (i == gNumLinkContestPlayers)
gSpecialVar_0x8004 = 0;
gSpecialVar_0x8004 = FALSE; // Category choices the same
else
gSpecialVar_0x8004 = 1;
gSpecialVar_0x8004 = TRUE; // Category choices differ
for (i = 0; i < gNumLinkContestPlayers; i++)
data2[i] = gTasks[taskId].data[i + 5];
leaderIds[i] = gTasks[taskId].data[i + 5];
if (gNumLinkContestPlayers != 4 && GetMultiplayerId() == 0)
// If < 4 players and player is leader, set AI contestants based on rank and game clear
if (gNumLinkContestPlayers != CONTESTANT_COUNT && GetMultiplayerId() == 0)
{
rank = gContestMons[0].unk2C[0];
rank = gContestMons[0].highestRank;
for (i = 1; i < gNumLinkContestPlayers; i++)
{
if (rank < gContestMons[i].unk2C[0])
rank = gContestMons[i].unk2C[0];
if (rank < gContestMons[i].highestRank)
rank = gContestMons[i].highestRank;
}
if (rank)
rank--;
gameCleared = 1;
gameCleared = TRUE;
for (i = 0; i < gNumLinkContestPlayers; i++)
{
if (!gContestMons[i].unk2C[1])
if (!gContestMons[i].gameCleared)
{
gameCleared = 0;
gameCleared = FALSE;
break;
}
}
sub_80DACBC(data1[0], rank, gameCleared);
SetLinkAIContestants(categories[0], rank, gameCleared);
}
gUnknown_02039F2B = sub_80F86E0(data2);
if (gNumLinkContestPlayers < 4)
SetTaskFuncWithFollowupFunc(taskId, sub_81DA488, sub_81DA10C);
// Assign link leader. After initial communication all players will read data only from them
gContestLinkLeaderIndex = LinkContest_GetLeaderIndex(leaderIds);
if (gNumLinkContestPlayers < CONTESTANT_COUNT)
SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateAIMonsEm, Task_LinkContest_CalculateRound1Em);
else
gTasks[taskId].func = sub_81DA10C;
gTasks[taskId].func = Task_LinkContest_CalculateRound1Em;
}
static void sub_81DA10C(u8 taskId)
static void Task_LinkContest_CalculateRound1Em(u8 taskId)
{
sub_80DB09C(gSpecialVar_ContestCategory);
SetTaskFuncWithFollowupFunc(taskId, sub_80FCF40, sub_81DA138);
CalculateRound1Points(gSpecialVar_ContestCategory);
SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateRound1Points, Task_LinkContest_CalculateTurnOrderEm);
}
static void sub_81DA138(u8 taskId)
static void Task_LinkContest_CalculateTurnOrderEm(u8 taskId)
{
SortContestants(FALSE);
SetTaskFuncWithFollowupFunc(taskId, sub_80FCFD0, sub_80F8714);
SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateTurnOrder, Task_LinkContest_FinalizeConnection);
}
static void sub_81DA160(u8 taskId)
static void Task_LinkContest_CommunicateMonsEm(u8 taskId)
{
int i;
if (!sub_80FC670(&gTasks[taskId].data[12]))
if (!LinkContest_TryLinkStandby(&gTasks[taskId].data[12]))
return;
switch (gTasks[taskId].data[0])
@ -155,17 +165,17 @@ static void sub_81DA160(u8 taskId)
case 0:
if (IsLinkTaskFinished())
{
if (sub_80FC4F4(&gContestMons[gContestPlayerMonIndex], sizeof(struct ContestPokemon)) == 1)
if (LinkContest_SendBlock(&gContestMons[gContestPlayerMonIndex], sizeof(struct ContestPokemon)) == 1)
gTasks[taskId].data[0]++;
}
break;
case 1:
if (sub_80FC55C())
if (LinkContest_GetBlockReceivedFromAllPlayers())
{
for (i = 0; i < gNumLinkContestPlayers; i++)
{
memcpy(&gContestMons[i], gBlockRecvBuffer[i], sizeof(struct ContestPokemon));
sub_80DFA08(&gContestMons[i], gLinkPlayers[i].language);
StripPlayerAndMonNamesForLinkContest(&gContestMons[i], gLinkPlayers[i].language);
}
gTasks[taskId].data[0]++;
@ -174,9 +184,9 @@ static void sub_81DA160(u8 taskId)
}
}
static void sub_81DA244(u8 taskId)
static void Task_LinkContest_CommunicateRngEm(u8 taskId)
{
if (!sub_80FC670(&gTasks[taskId].data[12]))
if (!LinkContest_TryLinkStandby(&gTasks[taskId].data[12]))
return;
switch (gTasks[taskId].data[0])
@ -189,19 +199,22 @@ static void sub_81DA244(u8 taskId)
case 0:
if (GetMultiplayerId() == 0)
{
// Only the leader sends the RNG seed
if (!IsLinkTaskFinished())
return;
if (sub_80FC4F4(&gRngValue, sizeof(gRngValue)) == 1)
if (LinkContest_SendBlock(&gRngValue, sizeof(gRngValue)) == 1)
gTasks[taskId].data[0]++;
}
else
{
// Other link members skip to waiting
gTasks[taskId].data[0]++;
}
break;
case 1:
if (sub_80FC530(0))
// Wait to receive RNG data
if (LinkContest_GetBlockReceived(0))
{
memcpy(&gRngValue, gBlockRecvBuffer[0], sizeof(gRngValue));
memcpy(&gContestRngValue, gBlockRecvBuffer[0], sizeof(gContestRngValue));
@ -211,13 +224,13 @@ static void sub_81DA244(u8 taskId)
}
}
static void sub_81DA2E8(u8 taskId)
static void Task_LinkContest_CommunicateLeaderIdsEm(u8 taskId)
{
int i;
u16 data[4];
u16 var0;
u16 data[CONTESTANT_COUNT];
u16 leaderId;
if (!sub_80FC670(&gTasks[taskId].data[12]))
if (!LinkContest_TryLinkStandby(&gTasks[taskId].data[12]))
return;
switch (gTasks[taskId].data[0])
@ -230,13 +243,13 @@ static void sub_81DA2E8(u8 taskId)
case 0:
if (IsLinkTaskFinished())
{
var0 = 0x6E;
if (sub_80FC4F4(&var0, sizeof(var0)) == 1)
leaderId = 0x6E;
if (LinkContest_SendBlock(&leaderId, sizeof(leaderId)) == 1)
gTasks[taskId].data[0]++;
}
break;
case 1:
if (sub_80FC55C())
if (LinkContest_GetBlockReceivedFromAllPlayers())
{
for (i = 0; i < gNumLinkContestPlayers; i++)
{
@ -250,13 +263,13 @@ static void sub_81DA2E8(u8 taskId)
}
}
static void sub_81DA3B8(u8 taskId)
static void Task_LinkContest_CommunicateCategoryEm(u8 taskId)
{
int i;
u16 data[4];
u16 var0;
u16 data[CONTESTANT_COUNT];
u16 category;
if (!sub_80FC670(&gTasks[taskId].data[12]))
if (!LinkContest_TryLinkStandby(&gTasks[taskId].data[12]))
return;
switch (gTasks[taskId].data[0])
@ -269,13 +282,13 @@ static void sub_81DA3B8(u8 taskId)
case 0:
if (IsLinkTaskFinished())
{
var0 = gTasks[taskId].data[9];
if (sub_80FC4F4(&var0, sizeof(var0)) == 1)
category = gTasks[taskId].tCategory;
if (LinkContest_SendBlock(&category, sizeof(category)) == 1)
gTasks[taskId].data[0]++;
}
break;
case 1:
if (sub_80FC55C())
if (LinkContest_GetBlockReceivedFromAllPlayers())
{
for (i = 0; i < gNumLinkContestPlayers; i++)
{
@ -289,11 +302,11 @@ static void sub_81DA3B8(u8 taskId)
}
}
static void sub_81DA488(u8 taskId)
static void Task_LinkContest_CommunicateAIMonsEm(u8 taskId)
{
int i;
if (!sub_80FC670(&gTasks[taskId].data[12]))
if (!LinkContest_TryLinkStandby(&gTasks[taskId].data[12]))
return;
switch (gTasks[taskId].data[0])
@ -309,7 +322,7 @@ static void sub_81DA488(u8 taskId)
if (!IsLinkTaskFinished())
return;
if (sub_80FC4F4(&gContestMons[gNumLinkContestPlayers], (4 - gNumLinkContestPlayers) * sizeof(struct ContestPokemon)) == 1)
if (LinkContest_SendBlock(&gContestMons[gNumLinkContestPlayers], (CONTESTANT_COUNT - gNumLinkContestPlayers) * sizeof(struct ContestPokemon)) == 1)
gTasks[taskId].data[0]++;
}
else
@ -318,11 +331,11 @@ static void sub_81DA488(u8 taskId)
}
break;
case 1:
if (sub_80FC530(0))
if (LinkContest_GetBlockReceived(0))
{
memcpy(&gContestMons[gNumLinkContestPlayers], gBlockRecvBuffer[0], (4 - gNumLinkContestPlayers) * sizeof(struct ContestPokemon));
for (i = gNumLinkContestPlayers; i < 4; i++)
sub_80DFA08(&gContestMons[i], gLinkPlayers[0].language);
memcpy(&gContestMons[gNumLinkContestPlayers], gBlockRecvBuffer[0], (CONTESTANT_COUNT - gNumLinkContestPlayers) * sizeof(struct ContestPokemon));
for (i = gNumLinkContestPlayers; i < CONTESTANT_COUNT; i++)
StripPlayerAndMonNamesForLinkContest(&gContestMons[i], gLinkPlayers[0].language);
gTasks[taskId].data[0]++;
}

View File

@ -6,10 +6,12 @@
#include "contest.h"
#include "contest_util.h"
#include "contest_link.h"
#include "contest_painting.h"
#include "data.h"
#include "decompress.h"
#include "dma3.h"
#include "event_data.h"
#include "event_object_movement.h"
#include "field_specials.h"
#include "gpu_regs.h"
#include "graphics.h"
@ -27,6 +29,7 @@
#include "save.h"
#include "scanline_effect.h"
#include "script.h"
#include "script_menu.h"
#include "sound.h"
#include "string_util.h"
#include "strings.h"
@ -36,6 +39,7 @@
#include "tv.h"
#include "util.h"
#include "window.h"
#include "constants/event_objects.h"
#include "constants/field_specials.h"
#include "constants/game_stat.h"
#include "constants/rgb.h"
@ -117,8 +121,8 @@ static void CB2_ShowContestResults(void);
static void VBlankCB_ShowContestResults(void);
static void Task_SlideContestResultsBg(u8);
static void Task_WaitForLinkPartnersBeforeResults(u8);
static void sub_80F5F14(u8);
static void sub_80F5F30(u8);
static void Task_CommunicateMonIdxsForResults(u8);
static void Task_WaitForLinkPartnerMonIdxs(u8);
static void Task_AnnouncePreliminaryResults(u8);
static void Task_FlashStarsAndHearts(u8);
static void Task_ShowPreliminaryResults(u8);
@ -150,15 +154,22 @@ static void Task_CreateConfetti(u8);
static void SpriteCB_TextBoxSlideIn(struct Sprite *);
static void SpriteCB_TextBoxSlideOut(struct Sprite *);
static void SpriteCB_EndTextBoxSlideIn(struct Sprite *);
static void sub_80F8508(u8);
static void sub_80F8568(u8);
static void sub_80F8584(u8);
static void sub_80F85A0(u8);
static void sub_80F85BC(u8);
static void sub_80F86B8(u8);
static void sub_80F878C(u8);
static void sub_80F87B4(u8);
static void Task_StartCommunication(u8);
static void Task_StartCommunicateRngRS(u8);
static void Task_StartCommunicateLeaderIdsRS(u8);
static void Task_StartCommunicateCategoryRS(u8);
static void Task_LinkContest_SetUpContestRS(u8);
static void Task_LinkContest_CalculateTurnOrderRS(u8);
static void Task_LinkContest_Disconnect(u8);
static void Task_LinkContest_WaitDisconnect(u8);
static void SpriteCB_Confetti(struct Sprite *sprite);
static void Task_ShowContestEntryMonPic(u8 taskId);
static void Task_LinkContestWaitForConnection(u8 taskId);
extern const u16 gObjectEventPalette8[];
extern const u16 gObjectEventPalette17[];
extern const u16 gObjectEventPalette33[];
extern const u16 gObjectEventPalette34[];
static const u16 sUnknown_0858D6B0[] = INCBIN_U16("graphics/unknown/unknown_58D6B0.gbapal");
static const u8 sUnknown_0858D6D0[] = INCBIN_U8("graphics/unknown/unknown_58D6D0.4bpp");
@ -601,7 +612,7 @@ static void Task_ShowContestResults(u8 taskId)
case 2:
if (IsLinkTaskFinished())
{
sub_800ADF8();
SetLinkStandbyCallback();
gTasks[taskId].tState++;
}
return;
@ -645,17 +656,17 @@ static void Task_WaitForLinkPartnersBeforeResults(u8 taskId)
{
if (gReceivedRemoteLinkPlayers)
{
CreateTask(sub_80F5F14, 0);
CreateTask(Task_CommunicateMonIdxsForResults, 0);
gTasks[taskId].func = TaskDummy;
}
}
static void sub_80F5F14(u8 taskId)
static void Task_CommunicateMonIdxsForResults(u8 taskId)
{
SetTaskFuncWithFollowupFunc(taskId, sub_80FC998, sub_80F5F30);
SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateMonIdxs, Task_WaitForLinkPartnerMonIdxs);
}
static void sub_80F5F30(u8 taskId)
static void Task_WaitForLinkPartnerMonIdxs(u8 taskId)
{
if (IsLinkTaskFinished())
{
@ -974,7 +985,7 @@ static void Task_TryDisconnectLinkPartners(u8 taskId)
if (!gTasks[taskId].data[10])
{
ShowLinkResultsTextBox(gText_CommunicationStandby);
sub_800AC34();
SetCloseLinkCallback();
gTasks[taskId].func = Task_WaitForLinkPartnersDisconnect;
}
}
@ -1717,7 +1728,7 @@ static void LoadContestResultsTilemaps(void)
// Represented on results board as stars
static u8 GetNumPreliminaryPoints(u8 monIndex, bool8 capPoints)
{
u32 condition = gContestMonConditions[monIndex] << 16;
u32 condition = gContestMonRound1Points[monIndex] << 16;
u32 numStars = condition / 0x3F;
if (numStars & 0xFFFF)
@ -1965,7 +1976,7 @@ static void CalculateContestantsResultData(void)
for (i = 0; i < CONTESTANT_COUNT; i++)
{
relativePoints = (gContestMonConditions[i] * 1000) / abs(highestPoints);
relativePoints = (gContestMonRound1Points[i] * 1000) / abs(highestPoints);
if (relativePoints % 10 > 4)
relativePoints += 10;
(*sContestResults->monResults)[i].relativePreliminaryPoints = relativePoints / 10;
@ -2205,8 +2216,8 @@ void TryEnterContestMon(void)
// Nonzero eligibility can still be non-eligibile, if mon is fainted or egg
if (eligibility)
{
sub_80DAB8C(gSpecialVar_ContestCategory, gSpecialVar_ContestRank);
sub_80DB09C(gSpecialVar_ContestCategory);
SetContestants(gSpecialVar_ContestCategory, gSpecialVar_ContestRank);
CalculateRound1Points(gSpecialVar_ContestCategory);
}
gSpecialVar_Result = eligibility;
@ -2323,7 +2334,7 @@ void GetContestMonConditionRanking(void)
for (i = 0, rank = 0; i < CONTESTANT_COUNT; i++)
{
if (gContestMonConditions[gSpecialVar_0x8006] < gContestMonConditions[i])
if (gContestMonRound1Points[gSpecialVar_0x8006] < gContestMonRound1Points[i])
rank++;
}
@ -2332,7 +2343,7 @@ void GetContestMonConditionRanking(void)
void GetContestMonCondition(void)
{
gSpecialVar_0x8004 = gContestMonConditions[gSpecialVar_0x8006];
gSpecialVar_0x8004 = gContestMonRound1Points[gSpecialVar_0x8006];
}
void GetContestWinnerId(void)
@ -2404,107 +2415,106 @@ void GetContestPlayerId(void)
gSpecialVar_0x8004 = gContestPlayerMonIndex;
}
void ContestLinkTransfer(u8 taskId)
void ContestLinkTransfer(u8 category)
{
u8 newTaskId;
ScriptContext2_Enable();
newTaskId = CreateTask(sub_80FC580, 0);
SetTaskFuncWithFollowupFunc(newTaskId, sub_80FC580, sub_80F8508);
gTasks[newTaskId].data[9] = taskId;
newTaskId = CreateTask(Task_LinkContest_Init, 0);
SetTaskFuncWithFollowupFunc(newTaskId, Task_LinkContest_Init, Task_StartCommunication);
gTasks[newTaskId].data[9] = category;
}
static void sub_80F8508(u8 taskId)
static void Task_StartCommunication(u8 taskId)
{
if (gLinkContestFlags & LINK_CONTEST_FLAG_HAS_RS_PLAYER)
{
sub_80DA8C8(gContestMonPartyIndex);
SetTaskFuncWithFollowupFunc(taskId, sub_80FC6BC, sub_80F8568);
CreateContestMonFromParty(gContestMonPartyIndex);
SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateMonsRS, Task_StartCommunicateRngRS);
}
else
{
sub_80DA8C8(gContestMonPartyIndex);
gTasks[taskId].func = sub_81D9DE4;
CreateContestMonFromParty(gContestMonPartyIndex);
gTasks[taskId].func = Task_LinkContest_StartCommunicationEm;
}
}
static void sub_80F8568(u8 taskId)
static void Task_StartCommunicateRngRS(u8 taskId)
{
SetTaskFuncWithFollowupFunc(taskId, sub_80FC804, sub_80F8584);
SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateRngRS, Task_StartCommunicateLeaderIdsRS);
}
static void sub_80F8584(u8 taskId)
static void Task_StartCommunicateLeaderIdsRS(u8 taskId)
{
SetTaskFuncWithFollowupFunc(taskId, sub_80FCE48, sub_80F85A0);
SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateLeaderIdsRS, Task_StartCommunicateCategoryRS);
}
static void sub_80F85A0(u8 taskId)
static void Task_StartCommunicateCategoryRS(u8 taskId)
{
SetTaskFuncWithFollowupFunc(taskId, sub_80FC894, sub_80F85BC);
SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateCategoryRS, Task_LinkContest_SetUpContestRS);
}
static void sub_80F85BC(u8 taskId)
static void Task_LinkContest_SetUpContestRS(u8 taskId)
{
u8 i;
u8 sp0[4];
u8 sp4[4];
u8 categories[CONTESTANT_COUNT];
u8 leaderIds[CONTESTANT_COUNT];
memset(sp0, 0, sizeof(sp0));
memset(sp4, 0, sizeof(sp4));
memset(categories, 0, sizeof(categories));
memset(leaderIds, 0, sizeof(leaderIds));
for (i = 0; i < gNumLinkContestPlayers; i++)
sp0[i] = gTasks[taskId].data[i + 1];
categories[i] = gTasks[taskId].data[i + 1];
for (i = 0; i < gNumLinkContestPlayers;)
{
i++;
if (i >= gNumLinkContestPlayers || sp0[0] != sp0[i])
break;
}
// Ensure all players are doing the same category
for (i = 0; i < gNumLinkContestPlayers && categories[0] == categories[i]; i++)
;
if (i == gNumLinkContestPlayers)
gSpecialVar_0x8004 = 0;
gSpecialVar_0x8004 = FALSE; // Category choices the same
else
gSpecialVar_0x8004 = 1;
gSpecialVar_0x8004 = TRUE; // Category choices differ
for (i = 0; i < gNumLinkContestPlayers; i++)
sp4[i] = gTasks[taskId].data[i + 5];
leaderIds[i] = gTasks[taskId].data[i + 5];
gUnknown_02039F2B = sub_80F86E0(sp4);
sub_80DB09C(gSpecialVar_ContestCategory);
SetTaskFuncWithFollowupFunc(taskId, sub_80FCF40, sub_80F86B8);
gContestLinkLeaderIndex = LinkContest_GetLeaderIndex(leaderIds);
CalculateRound1Points(gSpecialVar_ContestCategory);
SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateRound1Points, Task_LinkContest_CalculateTurnOrderRS);
}
static void sub_80F86B8(u8 taskId)
static void Task_LinkContest_CalculateTurnOrderRS(u8 taskId)
{
SortContestants(FALSE);
SetTaskFuncWithFollowupFunc(taskId, sub_80FCFD0, sub_80F8714);
SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_CommunicateTurnOrder, Task_LinkContest_FinalizeConnection);
}
u8 sub_80F86E0(u8 *arg0)
u8 LinkContest_GetLeaderIndex(u8 *ids)
{
int i;
u8 result = 0;
u8 leaderIdx = 0;
for (i = 1; i < gNumLinkContestPlayers; i++)
{
if (arg0[result] < arg0[i])
result = i;
if (ids[leaderIdx] < ids[i])
leaderIdx = i;
}
return result;
return leaderIdx;
}
void sub_80F8714(u8 taskId)
void Task_LinkContest_FinalizeConnection(u8 taskId)
{
int i;
if (gSpecialVar_0x8004 == 1)
if (gSpecialVar_0x8004 == TRUE)
{
// Link partner data doesn't agree, disconnect
if (IsLinkTaskFinished())
gTasks[taskId].func = sub_80F878C;
gTasks[taskId].func = Task_LinkContest_Disconnect;
}
else
{
// Succesfully connected
for (i = 0; i < CONTESTANT_COUNT; i++)
StringGetEnd10(gContestMons[i].nickname);
@ -2515,13 +2525,13 @@ void sub_80F8714(u8 taskId)
}
}
static void sub_80F878C(u8 taskId)
static void Task_LinkContest_Disconnect(u8 taskId)
{
sub_800AC34();
gTasks[taskId].func = sub_80F87B4;
SetCloseLinkCallback();
gTasks[taskId].func = Task_LinkContest_WaitDisconnect;
}
static void sub_80F87B4(u8 taskId)
static void Task_LinkContest_WaitDisconnect(u8 taskId)
{
if (!gReceivedRemoteLinkPlayers)
{
@ -2530,3 +2540,479 @@ static void sub_80F87B4(u8 taskId)
EnableBothScriptContexts();
}
}
void SetContestTrainerGfxIds(void)
{
gSaveBlock1Ptr->vars[VAR_OBJ_GFX_ID_0 - VARS_START] = gContestMons[0].trainerGfxId;
gSaveBlock1Ptr->vars[VAR_OBJ_GFX_ID_1 - VARS_START] = gContestMons[1].trainerGfxId;
gSaveBlock1Ptr->vars[VAR_OBJ_GFX_ID_2 - VARS_START] = gContestMons[2].trainerGfxId;
}
// Unused
void sub_80F8814(void)
{
u16 var1;
u8 var0 = gSpecialVar_0x8005;
switch (var0)
{
case 0:
var1 = 3;
break;
case 1:
var1 = 4;
break;
case 2:
var1 = 5;
break;
default:
var1 = 100;
break;
}
gSpecialVar_0x8004 = var1;
}
void BufferContestTrainerAndMonNames(void)
{
BufferContestantTrainerName();
BufferContestantMonNickname();
BufferContestantMonSpecies();
}
// Unused
void DoesContestCategoryHaveWinner(void)
{
int contestWinner;
switch (gSpecialVar_ContestCategory)
{
case CONTEST_CATEGORY_COOL:
contestWinner = 8;
break;
case CONTEST_CATEGORY_BEAUTY:
contestWinner = 9;
break;
case CONTEST_CATEGORY_CUTE:
contestWinner = 10;
break;
case CONTEST_CATEGORY_SMART:
contestWinner = 11;
break;
case CONTEST_CATEGORY_TOUGH:
default:
contestWinner = 12;
break;
}
if (gSaveBlock1Ptr->contestWinners[contestWinner].species == SPECIES_NONE)
gSpecialVar_0x8004 = FALSE;
else
gSpecialVar_0x8004 = TRUE;
}
void SaveMuseumContestPainting(void)
{
sub_80DEDA8(0xFF);
}
void ShouldReadyContestArtist(void)
{
if (gContestFinalStandings[gContestPlayerMonIndex] == 0
&& gSpecialVar_ContestRank == CONTEST_RANK_MASTER
&& gContestMonTotalPoints[gContestPlayerMonIndex] >= 800)
{
gSpecialVar_0x8004 = TRUE;
}
else
{
gSpecialVar_0x8004 = FALSE;
}
}
u8 CountPlayerContestPaintings(void)
{
int i;
u8 count = 0;
for (i = 0; i < 5; i++)
{
if (gSaveBlock1Ptr->contestWinners[8 + i].species)
count++;
}
return count;
}
// Unused
void sub_80F8970(void)
{
s16 conditions[CONTESTANT_COUNT];
int i, j;
s16 condition;
s8 var0;
u8 var2;
u8 r8;
u8 r7;
for (i = 0; i < CONTESTANT_COUNT; i++)
conditions[i] = gContestMonRound1Points[i];
for (i = 0; i < CONTESTANT_COUNT - 1; i++)
{
for (j = CONTESTANT_COUNT - 1; j > i; j--)
{
if (conditions[j - 1] < conditions[j])
{
int temp;
SWAP(conditions[j], conditions[j - 1], temp)
}
}
}
condition = conditions[gSpecialVar_0x8006];
var0 = 0;
r8 = 0;
for (i = 0; i < CONTESTANT_COUNT; i++)
{
if (conditions[i] == condition)
{
var0++;
if (i == gSpecialVar_0x8006)
r8 = var0;
}
}
for (i = 0; i < CONTESTANT_COUNT; i++)
{
if (conditions[i] == condition)
break;
}
r7 = i;
var2 = r8;
for (i = 0; i < CONTESTANT_COUNT; i++)
{
if (condition == gContestMonRound1Points[i])
{
if (var2 == 1)
break;
var2--;
}
}
StringCopy(gStringVar1, gContestMons[i].nickname);
StringCopy(gStringVar2, gContestMons[i].trainerName);
sub_81DB5AC(gStringVar2);
if (var0 == 1)
gSpecialVar_0x8006 = r7;
else if (r8 == var0)
gSpecialVar_0x8006 = r7;
else
gSpecialVar_0x8006 = r7 + 4;
}
static void ExitContestWinnerPainting(void)
{
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
void ShowContestWinnerPainting(void)
{
SetMainCallback2(CB2_ContestPainting);
gMain.savedCallback = ExitContestWinnerPainting;
}
void SetLinkContestPlayerGfx(void)
{
int i;
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK)
{
for (i = 0; i < gNumLinkContestPlayers; i++)
{
int version = (u8)gLinkPlayers[i].version;
if (version == VERSION_RUBY || version == VERSION_SAPPHIRE)
{
if (gLinkPlayers[i].gender == MALE)
gContestMons[i].trainerGfxId = OBJ_EVENT_GFX_LINK_RS_BRENDAN;
else
gContestMons[i].trainerGfxId = OBJ_EVENT_GFX_LINK_RS_MAY;
}
}
VarSet(VAR_OBJ_GFX_ID_0, gContestMons[0].trainerGfxId);
VarSet(VAR_OBJ_GFX_ID_1, gContestMons[1].trainerGfxId);
VarSet(VAR_OBJ_GFX_ID_2, gContestMons[2].trainerGfxId);
VarSet(VAR_OBJ_GFX_ID_3, gContestMons[3].trainerGfxId);
}
}
void LoadLinkContestPlayerPalettes(void)
{
int i;
u8 objectEventId;
int version;
struct Sprite *sprite;
static const u8 sContestantLocalIds[CONTESTANT_COUNT] = { 3, 4, 5, 14 };
gReservedSpritePaletteCount = 12;
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK)
{
for (i = 0; i < gNumLinkContestPlayers; i++)
{
objectEventId = GetObjectEventIdByLocalIdAndMap(sContestantLocalIds[i], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
sprite = &gSprites[gObjectEvents[objectEventId].spriteId];
sprite->oam.paletteNum = 6 + i;
version = (u8)gLinkPlayers[i].version;
if (version == VERSION_RUBY || version == VERSION_SAPPHIRE)
{
if (gLinkPlayers[i].gender == MALE)
LoadPalette(gObjectEventPalette33, 0x160 + i * 0x10, 0x20);
else
LoadPalette(gObjectEventPalette34, 0x160 + i * 0x10, 0x20);
}
else
{
if (gLinkPlayers[i].gender == MALE)
LoadPalette(gObjectEventPalette8, 0x160 + i * 0x10, 0x20);
else
LoadPalette(gObjectEventPalette17, 0x160 + i * 0x10, 0x20);
}
}
}
}
bool8 GiveMonArtistRibbon(void)
{
u8 hasArtistRibbon;
hasArtistRibbon = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_ARTIST_RIBBON);
if (!hasArtistRibbon
&& gContestFinalStandings[gContestPlayerMonIndex] == 0
&& gSpecialVar_ContestRank == CONTEST_RANK_MASTER
&& gContestMonTotalPoints[gContestPlayerMonIndex] >= 800)
{
hasArtistRibbon = 1;
SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_ARTIST_RIBBON, &hasArtistRibbon);
if (GetRibbonCount(&gPlayerParty[gContestMonPartyIndex]) > NUM_CUTIES_RIBBONS)
TryPutSpotTheCutiesOnAir(&gPlayerParty[gContestMonPartyIndex], MON_DATA_ARTIST_RIBBON);
return TRUE;
}
else
{
return FALSE;
}
}
bool8 IsContestDebugActive(void)
{
return FALSE; // gUnknown_0203856C in pokeruby
}
void ShowContestEntryMonPic(void)
{
const struct CompressedSpritePalette *palette;
u32 personality, otId;
u16 species;
u8 spriteId;
u8 taskId;
u8 left, top;
if (FindTaskIdByFunc(Task_ShowContestEntryMonPic) == 0xFF)
{
AllocateMonSpritesGfx();
left = 10;
top = 3;
species = gContestMons[gSpecialVar_0x8006].species;
personality = gContestMons[gSpecialVar_0x8006].personality;
otId = gContestMons[gSpecialVar_0x8006].otId;
taskId = CreateTask(Task_ShowContestEntryMonPic, 0x50);
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = species;
if (gSpecialVar_0x8006 == gContestPlayerMonIndex)
HandleLoadSpecialPokePic_2(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[1], species, personality);
else
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[1], species, personality);
palette = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality);
LoadCompressedSpritePalette(palette);
SetMultiuseSpriteTemplateToPokemon(species, 1);
gMultiuseSpriteTemplate.paletteTag = palette->tag;
spriteId = CreateSprite(&gMultiuseSpriteTemplate, (left + 1) * 8 + 32, (top * 8) + 40, 0);
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK)
{
if (!(gLinkContestFlags & LINK_CONTEST_FLAG_HAS_RS_PLAYER))
DoMonFrontSpriteAnimation(&gSprites[spriteId], species, FALSE, 0);
}
else
{
DoMonFrontSpriteAnimation(&gSprites[spriteId], species, FALSE, 0);
}
gTasks[taskId].data[2] = spriteId;
gTasks[taskId].data[3] = left;
gTasks[taskId].data[4] = top;
gSprites[spriteId].callback = SpriteCallbackDummy;
gSprites[spriteId].oam.priority = 0;
}
}
void HideContestEntryMonPic(void)
{
u8 taskId = FindTaskIdByFunc(Task_ShowContestEntryMonPic);
if (taskId != 0xFF)
{
gTasks[taskId].data[0]++;
FreeMonSpritesGfx();
}
}
static void Task_ShowContestEntryMonPic(u8 taskId)
{
struct Task *task = &gTasks[taskId];
struct Sprite *sprite;
switch(task->data[0])
{
case 0:
task->data[0]++;
break;
case 1:
task->data[5] = CreateWindowFromRect(10, 3, 8, 8);
SetStandardWindowBorderStyle(task->data[5], 1);
task->data[0]++;
break;
case 2:
break;
case 3:
sprite = &gSprites[task->data[2]];
FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum));
if(sprite->oam.affineMode)
FreeOamMatrix(sprite->oam.matrixNum);
DestroySprite(sprite);
task->data[0]++;
break;
case 4:
ClearToTransparentAndRemoveWindow(gTasks[taskId].data[5]);
DestroyTask(taskId);
break;
}
}
void GetContestMultiplayerId(void)
{
if ((gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK)
&& gNumLinkContestPlayers == CONTESTANT_COUNT
&& !(gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS))
gSpecialVar_Result = GetMultiplayerId();
else
gSpecialVar_Result = MAX_LINK_PLAYERS;
}
void GenerateContestRand(void)
{
u16 random;
u16 *result;
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK)
{
gContestRngValue = ISO_RANDOMIZE1(gContestRngValue);
random = gContestRngValue >> 16;
result = &gSpecialVar_Result;
}
else
{
result = &gSpecialVar_Result;
random = Random();
}
*result = random % *result;
}
u16 GetContestRand(void)
{
gContestRngValue = ISO_RANDOMIZE1(gContestRngValue);
return gContestRngValue >> 16;
}
bool8 LinkContestWaitForConnection(void)
{
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS)
{
CreateTask(Task_LinkContestWaitForConnection, 5);
return TRUE;
}
else
{
return FALSE;
}
}
static void Task_LinkContestWaitForConnection(u8 taskId)
{
switch (gTasks[taskId].data[0])
{
case 0:
if (IsLinkTaskFinished())
{
SetLinkStandbyCallback();
gTasks[taskId].data[0]++;
}
break;
case 1:
gTasks[taskId].data[0]++;
break;
default:
if (IsLinkTaskFinished() == 1)
{
EnableBothScriptContexts();
DestroyTask(taskId);
}
break;
}
}
void LinkContestTryShowWirelessIndicator(void)
{
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS)
{
if (gReceivedRemoteLinkPlayers)
{
LoadWirelessStatusIndicatorSpriteGfx();
CreateWirelessStatusIndicatorSprite(8, 8);
}
}
}
void LinkContestTryHideWirelessIndicator(void)
{
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS)
{
if (gReceivedRemoteLinkPlayers)
DestroyWirelessStatusIndicatorSprite();
}
}
bool8 IsContestWithRSPlayer(void)
{
if (gLinkContestFlags & LINK_CONTEST_FLAG_HAS_RS_PLAYER)
return TRUE;
else
return FALSE;
}
void ClearLinkContestFlags(void)
{
gLinkContestFlags = 0;
}
bool8 IsWirelessContest(void)
{
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS)
return TRUE;
else
return FALSE;
}

View File

@ -203,7 +203,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 3,
.tough = 4,
.sheen = 50,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -232,7 +231,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 1,
.tough = 2,
.sheen = 60,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -261,7 +259,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 12,
.tough = 4,
.sheen = 70,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -290,7 +287,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 2,
.tough = 7,
.sheen = 80,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -319,7 +315,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 5,
.tough = 4,
.sheen = 90,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -348,7 +343,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 7,
.tough = 8,
.sheen = 100,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -377,7 +371,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 2,
.tough = 2,
.sheen = 50,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -406,7 +399,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 10,
.tough = 10,
.sheen = 60,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -435,7 +427,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 5,
.tough = 18,
.sheen = 70,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -464,7 +455,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 2,
.tough = 7,
.sheen = 80,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -493,7 +483,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 8,
.tough = 1,
.sheen = 90,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -522,7 +511,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 10,
.tough = 2,
.sheen = 100,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -551,7 +539,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 2,
.tough = 10,
.sheen = 50,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -580,7 +567,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 10,
.tough = 5,
.sheen = 60,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -609,7 +595,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 1,
.tough = 1,
.sheen = 70,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -638,7 +623,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 10,
.tough = 4,
.sheen = 50,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -667,7 +651,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 10,
.tough = 4,
.sheen = 60,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -696,7 +679,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 2,
.tough = 3,
.sheen = 70,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -725,7 +707,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 5,
.tough = 10,
.sheen = 80,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -754,7 +735,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 3,
.tough = 10,
.sheen = 90,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -783,7 +763,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 1,
.tough = 5,
.sheen = 100,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -812,7 +791,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 6,
.tough = 2,
.sheen = 90,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -841,7 +819,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 5,
.tough = 3,
.sheen = 80,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -870,7 +847,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 8,
.tough = 10,
.sheen = 70,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -899,7 +875,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 10,
.tough = 20,
.sheen = 100,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -928,7 +903,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 85,
.tough = 35,
.sheen = 110,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -957,7 +931,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 10,
.tough = 25,
.sheen = 120,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -986,7 +959,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 65,
.tough = 25,
.sheen = 130,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1015,7 +987,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 10,
.tough = 100,
.sheen = 140,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1044,7 +1015,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 35,
.tough = 35,
.sheen = 150,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1073,7 +1043,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 40,
.tough = 40,
.sheen = 100,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1102,7 +1071,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 10,
.tough = 25,
.sheen = 110,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1131,7 +1099,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 30,
.tough = 25,
.sheen = 120,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1160,7 +1127,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 40,
.tough = 30,
.sheen = 130,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1189,7 +1155,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 75,
.tough = 35,
.sheen = 140,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1218,7 +1183,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 30,
.tough = 25,
.sheen = 150,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1247,7 +1211,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 25,
.tough = 15,
.sheen = 100,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1276,7 +1239,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 60,
.tough = 20,
.sheen = 110,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1305,7 +1267,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 15,
.tough = 75,
.sheen = 120,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1334,7 +1295,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 30,
.tough = 20,
.sheen = 100,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1363,7 +1323,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 20,
.tough = 20,
.sheen = 110,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1392,7 +1351,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 20,
.tough = 20,
.sheen = 120,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1421,7 +1379,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 30,
.tough = 45,
.sheen = 130,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1450,7 +1407,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 20,
.tough = 45,
.sheen = 140,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1479,7 +1435,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 20,
.tough = 20,
.sheen = 150,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1508,7 +1463,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 25,
.tough = 25,
.sheen = 140,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1537,7 +1491,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 20,
.tough = 20,
.sheen = 130,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1566,7 +1519,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 45,
.tough = 20,
.sheen = 120,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1595,7 +1547,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 100,
.tough = 90,
.sheen = 200,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1624,7 +1575,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 35,
.tough = 70,
.sheen = 210,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1653,7 +1603,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 70,
.tough = 70,
.sheen = 220,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1682,7 +1631,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 75,
.tough = 40,
.sheen = 230,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1711,7 +1659,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 70,
.tough = 70,
.sheen = 240,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1740,7 +1687,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 80,
.tough = 100,
.sheen = 250,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1769,7 +1715,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 70,
.tough = 90,
.sheen = 200,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1798,7 +1743,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 50,
.tough = 65,
.sheen = 210,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1827,7 +1771,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 60,
.tough = 50,
.sheen = 220,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1856,7 +1799,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 45,
.tough = 70,
.sheen = 230,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1885,7 +1827,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 40,
.tough = 100,
.sheen = 240,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1914,7 +1855,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 50,
.tough = 30,
.sheen = 250,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1943,7 +1883,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 50,
.tough = 160,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -1972,7 +1911,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 70,
.tough = 50,
.sheen = 210,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2001,7 +1939,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 35,
.tough = 35,
.sheen = 220,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2030,7 +1967,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 100,
.tough = 80,
.sheen = 200,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2059,7 +1995,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 35,
.tough = 100,
.sheen = 210,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2088,7 +2023,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 50,
.tough = 100,
.sheen = 220,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2117,7 +2051,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 40,
.tough = 95,
.sheen = 230,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2146,7 +2079,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 50,
.tough = 100,
.sheen = 240,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2175,7 +2107,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 80,
.tough = 80,
.sheen = 250,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2204,7 +2135,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 40,
.tough = 110,
.sheen = 240,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2233,7 +2163,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 25,
.tough = 80,
.sheen = 230,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2262,7 +2191,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 35,
.tough = 40,
.sheen = 220,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2291,7 +2219,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 40,
.tough = 160,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2320,7 +2247,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 150,
.tough = 160,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2349,7 +2275,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 185,
.tough = 60,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2378,7 +2303,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 110,
.tough = 150,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2407,7 +2331,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 30,
.tough = 90,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2436,7 +2359,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 230,
.tough = 80,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2465,7 +2387,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 130,
.tough = 40,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2494,7 +2415,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 150,
.tough = 160,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2523,7 +2443,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 130,
.tough = 170,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2552,7 +2471,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 75,
.tough = 100,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2581,7 +2499,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 40,
.tough = 190,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2610,7 +2527,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 240,
.tough = 140,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2639,7 +2555,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 35,
.tough = 50,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2668,7 +2583,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 115,
.tough = 120,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2697,7 +2611,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 220,
.tough = 210,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2726,7 +2639,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 80,
.tough = 180,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2755,7 +2667,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 130,
.tough = 130,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2784,7 +2695,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 120,
.tough = 150,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2813,7 +2723,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 170,
.tough = 80,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2842,7 +2751,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 150,
.tough = 120,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2871,7 +2779,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 120,
.tough = 80,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2900,7 +2807,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 80,
.tough = 150,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2929,7 +2835,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 110,
.tough = 170,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
},
@ -2958,7 +2863,6 @@ const struct ContestPokemon gContestOpponents[] =
.smart = 80,
.tough = 190,
.sheen = 255,
.unk2C = {0},
.personality = 0,
.otId = 0xFFFF
}

View File

@ -558,7 +558,7 @@ static void sub_8024BC8(u8 taskId)
case 2:
if (!sub_802A770())
{
sub_8010434();
Rfu_SetLinkStandbyCallback();
gUnknown_02022C98->unk0C++;
}
break;
@ -671,7 +671,7 @@ static void sub_8024E38(void)
gUnknown_02022C98->unk10++;
break;
case 1:
sub_8010434();
Rfu_SetLinkStandbyCallback();
gUnknown_02022C98->unk10++;
break;
case 2:
@ -690,7 +690,7 @@ static void sub_8024E38(void)
case 4:
if (++gUnknown_02022C98->unk30 > 5)
{
sub_8010434();
Rfu_SetLinkStandbyCallback();
gUnknown_02022C98->unk10++;
}
break;
@ -1081,7 +1081,7 @@ static void sub_8025644(void)
switch (gUnknown_02022C98->unk10)
{
case 0:
sub_800AC34();
SetCloseLinkCallback();
sub_80292E0(7);
gUnknown_02022C98->unk10++;
break;

View File

@ -192,7 +192,7 @@ static u32 sub_81D4EE4(u8 *arg0, u16 *arg1)
}
break;
case 4:
sub_800ABF4(0);
SetCloseLinkCallbackAndType(0);
*arg0 = 5;
break;
case 5:
@ -403,7 +403,7 @@ static void sub_81D5084(u8 taskId)
break;
case 15:
data->unkE = EReader_IsReceivedDataValid((struct EReaderTrainerHillSet *)gDecompressionBuffer);
sub_800ABF4(data->unkE);
SetCloseLinkCallbackAndType(data->unkE);
data->unk8 = 16;
break;
case 16:

View File

@ -194,7 +194,7 @@ static void Task_ReturnToFieldWirelessLink(u8 taskId)
switch (task->data[0])
{
case 0:
sub_800ADF8();
SetLinkStandbyCallback();
task->data[0]++;
break;
case 1:
@ -227,7 +227,7 @@ void Task_ReturnToFieldRecordMixing(u8 taskId)
switch (task->data[0])
{
case 0:
sub_800ADF8();
SetLinkStandbyCallback();
task->data[0]++;
break;
case 1:
@ -625,7 +625,7 @@ static void Task_ReturnToWorldFromLinkRoom(u8 taskId)
case 1:
if (!PaletteFadeActive() && BGMusicStopped())
{
sub_800AC34();
SetCloseLinkCallback();
data[0]++;
}
break;

View File

@ -3864,7 +3864,7 @@ static void Task_LinkRetireStatusWithBattleTowerPartner(u8 taskId)
case 7:
if (IsLinkTaskFinished() == 1)
{
sub_800ADF8();
SetLinkStandbyCallback();
gTasks[taskId].data[0]++;
}
break;
@ -3877,7 +3877,7 @@ static void Task_LinkRetireStatusWithBattleTowerPartner(u8 taskId)
case 9:
if (gWirelessCommType == 0)
{
sub_800AC34();
SetCloseLinkCallback();
}
gBattleTypeFlags = sBattleTowerMultiBattleTypeFlags;
EnableBothScriptContexts();

View File

@ -7,7 +7,7 @@
#include "battle_tower.h"
#include "field_specials.h"
#include "battle.h"
#include "script_pokemon_util_80F87D8.h"
#include "script_pokemon_util.h"
#include "main.h"
#include "window.h"
#include "menu.h"

View File

@ -461,12 +461,12 @@ const u32 gContestMiscGfx[] = INCBIN_U32("graphics/contest/misc.4bpp.lz");
const u32 gContestAudienceGfx[] = INCBIN_U32("graphics/contest/audience.4bpp.lz");
const u32 gUnknown_08C19168[] = INCBIN_U32("graphics/contest/faces.4bpp.lz");
const u32 gContestFaces_Gfx[] = INCBIN_U32("graphics/contest/faces.4bpp.lz");
const u32 gContestJudgeSymbolsGfx[] = INCBIN_U32("graphics/contest/judge_symbols.4bpp.lz");
const u32 gContest3Pal[] = INCBIN_U32("graphics/contest/judge_symbols.gbapal.lz");
const u8 gTiles_8C19450[] = INCBIN_U8("graphics/contest/heart.4bpp");
const u8 gContestSliderHeart_Gfx[] = INCBIN_U8("graphics/contest/slider_heart.4bpp");
const u32 gUnknownGfx_C19470[] = INCBIN_U32("graphics/unknown/unknown_C19470.4bpp.lz");
const u32 gUnknownPal_C19470[] = INCBIN_U32("graphics/unknown/unknown_C19470.gbapal.lz");

View File

@ -75,9 +75,9 @@ u16 gRecvCmds[MAX_RFU_PLAYERS][CMD_LENGTH];
u32 gLinkStatus;
bool8 gLinkDummy1; // Never read
bool8 gLinkDummy2; // Never read
bool8 gUnknown_030030EC[MAX_LINK_PLAYERS];
bool8 gUnknown_030030F0[MAX_LINK_PLAYERS];
u16 gUnknown_030030F4;
bool8 gReadyToExitStandby[MAX_LINK_PLAYERS];
bool8 gReadyToCloseLink[MAX_LINK_PLAYERS];
u16 gReadyCloseLinkType; // Never read
u8 gSuppressLinkErrorMessage;
bool8 gWirelessCommType;
bool8 gSavedLinkPlayerCount;
@ -114,7 +114,7 @@ EWRAM_DATA struct {
u8 lastSendQueueCount;
u8 unk_06;
} sLinkErrorBuffer = {};
static EWRAM_DATA u16 sUnknown_02022B08 = 0;
static EWRAM_DATA u16 sReadyCloseLinkAttempts = 0; // never read
static EWRAM_DATA void *sLinkErrorBgTilemapBuffer = NULL;
// Static ROM declarations
@ -135,12 +135,12 @@ static void LinkTest_prnthex(u32 pos, u8 a0, u8 a1, u8 a2);
static void LinkCB_RequestPlayerDataExchange(void);
static void Task_PrintTestData(u8 taskId);
static void sub_800AC80(void);
static void sub_800ACAC(void);
static void sub_800AD5C(void);
static void sub_800AD88(void);
static void sub_800AE30(void);
static void sub_800AE5C(void);
static void LinkCB_ReadyCloseLink(void);
static void LinkCB_WaitCloseLink(void);
static void LinkCB_ReadyCloseLinkWithJP(void);
static void LinkCB_WaitCloseLinkWithJP(void);
static void LinkCB_Standby(void);
static void LinkCB_StandbyForAll(void);
static void CheckErrorStatus(void);
static void CB2_PrintErrorMessage(void);
@ -379,7 +379,7 @@ void OpenLink(void)
sDummy1 = FALSE;
gLinkDummy2 = FALSE;
gLinkDummy1 = FALSE;
gUnknown_030030F4 = 0;
gReadyCloseLinkType = 0;
CreateTask(Task_TriggerHandshake, 2);
}
else
@ -390,8 +390,8 @@ void OpenLink(void)
for (i = 0; i < MAX_LINK_PLAYERS; i++)
{
gRemoteLinkPlayersNotReceived[i] = TRUE;
gUnknown_030030F0[i] = FALSE;
gUnknown_030030EC[i] = FALSE;
gReadyToCloseLink[i] = FALSE;
gReadyToExitStandby[i] = FALSE;
}
}
@ -467,7 +467,7 @@ static void LinkTestProcessKeyInput(void)
}
if (gMain.newKeys & SELECT_BUTTON)
{
sub_800AC34();
SetCloseLinkCallback();
}
if (gLinkTestDebugValuesEnabled)
{
@ -630,16 +630,16 @@ static void ProcessRecvCmds(u8 unused)
}
}
break;
case LINKCMD_0x5FFF:
gUnknown_030030F0[i] = TRUE;
case LINKCMD_READY_CLOSE_LINK:
gReadyToCloseLink[i] = TRUE;
break;
case LINKCMD_0x2FFE:
gUnknown_030030EC[i] = TRUE;
case LINKCMD_READY_EXIT_STANDBY:
gReadyToExitStandby[i] = TRUE;
break;
case LINKCMD_0xAAAA:
sub_800A418();
break;
case LINKCMD_0xCCCC:
case LINKCMD_SEND_BLOCK_REQ:
SendBlock(0, sBlockRequests[gRecvCmds[i][1]].address, sBlockRequests[gRecvCmds[i][1]].size);
break;
case LINKCMD_SEND_HELD_KEYS_2:
@ -657,8 +657,8 @@ static void BuildSendCmd(u16 command)
gSendCmd[0] = LINKCMD_SEND_LINK_TYPE;
gSendCmd[1] = gLinkType;
break;
case LINKCMD_0x2FFE:
gSendCmd[0] = LINKCMD_0x2FFE;
case LINKCMD_READY_EXIT_STANDBY:
gSendCmd[0] = LINKCMD_READY_EXIT_STANDBY;
break;
case LINKCMD_SEND_HELD_KEYS:
gSendCmd[0] = LINKCMD_SEND_HELD_KEYS;
@ -694,13 +694,13 @@ static void BuildSendCmd(u16 command)
gSendCmd[0] = LINKCMD_0xAAAB;
gSendCmd[1] = gSpecialVar_ItemId;
break;
case LINKCMD_0xCCCC:
gSendCmd[0] = LINKCMD_0xCCCC;
case LINKCMD_SEND_BLOCK_REQ:
gSendCmd[0] = LINKCMD_SEND_BLOCK_REQ;
gSendCmd[1] = gBlockRequestType;
break;
case LINKCMD_0x5FFF:
gSendCmd[0] = LINKCMD_0x5FFF;
gSendCmd[1] = gUnknown_030030F4;
case LINKCMD_READY_CLOSE_LINK:
gSendCmd[0] = LINKCMD_READY_CLOSE_LINK;
gSendCmd[1] = gReadyCloseLinkType;
break;
case LINKCMD_0x5566:
gSendCmd[0] = LINKCMD_0x5566;
@ -1065,16 +1065,16 @@ bool8 SendBlock(u8 unused, const void *src, u16 size)
return InitBlockSend(src, size);
}
bool8 sub_800A4D8(u8 a0)
bool8 SendBlockRequest(u8 blockReqType)
{
if (gWirelessCommType == TRUE)
{
return sub_8010100(a0);
return Rfu_SendBlockRequest(blockReqType);
}
if (gLinkCallback == NULL)
{
gBlockRequestType = a0;
BuildSendCmd(LINKCMD_0xCCCC);
gBlockRequestType = blockReqType;
BuildSendCmd(LINKCMD_SEND_BLOCK_REQ);
return TRUE;
}
return FALSE;
@ -1423,70 +1423,70 @@ static u8 GetDummy2(void)
return sDummy2;
}
void sub_800ABF4(u16 a0)
void SetCloseLinkCallbackAndType(u16 type)
{
if (gWirelessCommType == TRUE)
{
task_add_05_task_del_08FA224_when_no_RfuFunc();
Rfu_SetCloseLinkCallback();
}
else
{
if (gLinkCallback == NULL)
{
gLinkCallback = sub_800AC80;
gLinkCallback = LinkCB_ReadyCloseLink;
gLinkDummy1 = FALSE;
gUnknown_030030F4 = a0;
gReadyCloseLinkType = type;
}
}
}
void sub_800AC34(void)
void SetCloseLinkCallback(void)
{
if (gWirelessCommType == TRUE)
{
task_add_05_task_del_08FA224_when_no_RfuFunc();
Rfu_SetCloseLinkCallback();
}
else
{
if (gLinkCallback != NULL)
{
sUnknown_02022B08++;
sReadyCloseLinkAttempts++;
}
else
{
gLinkCallback = sub_800AC80;
gLinkCallback = LinkCB_ReadyCloseLink;
gLinkDummy1 = FALSE;
gUnknown_030030F4 = 0;
gReadyCloseLinkType = 0;
}
}
}
static void sub_800AC80(void)
static void LinkCB_ReadyCloseLink(void)
{
if (gLastRecvQueueCount == 0)
{
BuildSendCmd(LINKCMD_0x5FFF);
gLinkCallback = sub_800ACAC;
BuildSendCmd(LINKCMD_READY_CLOSE_LINK);
gLinkCallback = LinkCB_WaitCloseLink;
}
}
static void sub_800ACAC(void)
static void LinkCB_WaitCloseLink(void)
{
int i;
unsigned count;
u8 linkPlayerCount;
linkPlayerCount = GetLinkPlayerCount();
// Wait for all players to be ready
u8 linkPlayerCount = GetLinkPlayerCount();
count = 0;
for (i = 0; i < linkPlayerCount; i++)
{
if (gUnknown_030030F0[i])
{
if (gReadyToCloseLink[i])
count++;
}
}
if (count == linkPlayerCount)
{
// All ready, close link
gBattleTypeFlags &= ~BATTLE_TYPE_20;
gLinkVSyncDisabled = TRUE;
CloseLink();
@ -1495,37 +1495,38 @@ static void sub_800ACAC(void)
}
}
void sub_800AD10(void)
// Used instead of SetCloseLinkCallback when disconnecting from an attempt to link with a foreign game
void SetCloseLinkCallbackHandleJP(void)
{
if (gWirelessCommType == TRUE)
{
task_add_05_task_del_08FA224_when_no_RfuFunc();
Rfu_SetCloseLinkCallback();
}
else
{
if (gLinkCallback != NULL)
{
sUnknown_02022B08++;
sReadyCloseLinkAttempts++;
}
else
{
gLinkCallback = sub_800AD5C;
gLinkCallback = LinkCB_ReadyCloseLinkWithJP;
gLinkDummy1 = FALSE;
gUnknown_030030F4 = 0;
gReadyCloseLinkType = 0;
}
}
}
static void sub_800AD5C(void)
static void LinkCB_ReadyCloseLinkWithJP(void)
{
if (gLastRecvQueueCount == 0)
{
BuildSendCmd(LINKCMD_0x5FFF);
gLinkCallback = sub_800AD88;
BuildSendCmd(LINKCMD_READY_CLOSE_LINK);
gLinkCallback = LinkCB_WaitCloseLinkWithJP;
}
}
static void sub_800AD88(void)
static void LinkCB_WaitCloseLinkWithJP(void)
{
int i;
unsigned count;
@ -1533,19 +1534,21 @@ static void sub_800AD88(void)
linkPlayerCount = GetLinkPlayerCount();
count = 0;
// Wait for all non-foreign players to be ready
for (i = 0; i < linkPlayerCount; i++)
{
// Rather than communicate with the foreign game
// just assume they're ready to disconnect
if (gLinkPlayers[i].language == LANGUAGE_JAPANESE)
{
count++;
}
else if (gUnknown_030030F0[i])
{
else if (gReadyToCloseLink[i])
count++;
}
}
if (count == linkPlayerCount)
{
// All ready, close link
gBattleTypeFlags &= ~BATTLE_TYPE_20;
gLinkVSyncDisabled = TRUE;
CloseLink();
@ -1554,50 +1557,47 @@ static void sub_800AD88(void)
}
}
void sub_800ADF8(void)
void SetLinkStandbyCallback(void)
{
if (gWirelessCommType == TRUE)
{
sub_8010434();
Rfu_SetLinkStandbyCallback();
}
else
{
if (gLinkCallback == NULL)
{
gLinkCallback = sub_800AE30;
gLinkCallback = LinkCB_Standby;
}
gLinkDummy1 = FALSE;
}
}
static void sub_800AE30(void)
static void LinkCB_Standby(void)
{
if (gLastRecvQueueCount == 0)
{
BuildSendCmd(LINKCMD_0x2FFE);
gLinkCallback = sub_800AE5C;
BuildSendCmd(LINKCMD_READY_EXIT_STANDBY);
gLinkCallback = LinkCB_StandbyForAll;
}
}
static void sub_800AE5C(void)
static void LinkCB_StandbyForAll(void)
{
u8 i;
u8 linkPlayerCount;
linkPlayerCount = GetLinkPlayerCount();
u8 linkPlayerCount = GetLinkPlayerCount();
for (i = 0; i < linkPlayerCount; i++)
{
if (!gUnknown_030030EC[i])
{
if (!gReadyToExitStandby[i])
break;
}
}
// If true, all players ready to exit standby
if (i == linkPlayerCount)
{
for (i = 0; i < MAX_LINK_PLAYERS; i++)
{
gUnknown_030030EC[i] = FALSE;
}
gReadyToExitStandby[i] = FALSE;
gLinkCallback = NULL;
}
}

View File

@ -148,10 +148,7 @@ static const u8 sUnknown_082ED6A5[] = {
0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
};
static const struct {
u8 *buffer;
u32 size;
} sUnknown_082ED6B8[] = {
static const struct BlockRequest sBlockRequests[] = {
{ gBlockSendBuffer, 200 },
{ gBlockSendBuffer, 200 },
{ gBlockSendBuffer, 100 },
@ -1072,15 +1069,15 @@ static void RfuHandleReceiveCommand(u8 unused)
}
}
break;
case RFU_COMMAND_0xA100:
Rfu_InitBlockSend(sUnknown_082ED6B8[gRecvCmds[i][1]].buffer, (u16)sUnknown_082ED6B8[gRecvCmds[i][1]].size);
case RFU_COMMAND_SEND_BLOCK_REQ:
Rfu_InitBlockSend(sBlockRequests[gRecvCmds[i][1]].address, (u16)sBlockRequests[gRecvCmds[i][1]].size);
break;
case RFU_COMMAND_0x5F00:
Rfu.unk_e4[i] = 1;
case RFU_COMMAND_READY_CLOSE_LINK:
Rfu.readyCloseLink[i] = TRUE;
break;
case RFU_COMMAND_0x6600:
case RFU_COMMAND_READY_EXIT_STANDBY:
if (Rfu.unk_100 == gRecvCmds[i][1])
Rfu.unk_e9[i] = 1;
Rfu.readyExitStandby[i] = TRUE;
break;
case RFU_COMMAND_0xED00:
if (Rfu.parentChild == MODE_CHILD)
@ -1194,9 +1191,9 @@ static void RfuPrepareSendBuffer(u16 command)
gSendCmd[1] = Rfu.sendBlock.count;
gSendCmd[2] = Rfu.sendBlock.owner + 0x80;
break;
case RFU_COMMAND_0xA100:
case RFU_COMMAND_SEND_BLOCK_REQ:
if (AreNoPlayersReceiving())
gSendCmd[1] = Rfu.unk_5a;
gSendCmd[1] = Rfu.blockRequestType;
break;
case RFU_COMMAND_0x7700:
case RFU_COMMAND_0x7800:
@ -1207,8 +1204,8 @@ static void RfuPrepareSendBuffer(u16 command)
for (i = 0; i < RFU_CHILD_MAX; i++)
buff[i] = Rfu.linkPlayerIdx[i];
break;
case RFU_COMMAND_0x6600:
case RFU_COMMAND_0x5F00:
case RFU_COMMAND_READY_EXIT_STANDBY:
case RFU_COMMAND_READY_CLOSE_LINK:
gSendCmd[1] = Rfu.unk_100;
break;
case RFU_COMMAND_0x4400:
@ -1327,10 +1324,10 @@ static void SendLastBlock(void)
Rfu.callback = NULL;
}
bool8 sub_8010100(u8 blockRequestType)
bool8 Rfu_SendBlockRequest(u8 type)
{
Rfu.unk_5a = blockRequestType;
RfuPrepareSendBuffer(RFU_COMMAND_0xA100);
Rfu.blockRequestType = type;
RfuPrepareSendBuffer(RFU_COMMAND_SEND_BLOCK_REQ);
return TRUE;
}
@ -1343,14 +1340,14 @@ static void sub_801011C(void)
Rfu.callback = NULL;
}
static void sub_8010148(void)
static void DisconnectRfu(void)
{
rfu_REQ_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag);
rfu_waitREQComplete();
sub_801011C();
}
static void sub_8010168(void)
static void TryDisconnectRfu(void)
{
if (Rfu.parentChild == MODE_CHILD)
{
@ -1358,7 +1355,7 @@ static void sub_8010168(void)
Rfu.unk_ce4 = 2;
}
else
Rfu.callback = sub_8010148;
Rfu.callback = DisconnectRfu;
}
void LinkRfu_FatalError(void)
@ -1368,131 +1365,137 @@ void LinkRfu_FatalError(void)
Rfu.unk_ce3 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag;
}
static void sub_80101CC(void)
// RFU equivalent of LinkCB_WaitCloseLink
static void WaitAllReadyToCloseLink(void)
{
s32 i;
u8 playerCount = Rfu.playerCount;
s32 count = 0;
// Wait for all players to be ready
for (i = 0; i < MAX_RFU_PLAYERS; i++)
{
if (Rfu.unk_e4[i])
if (Rfu.readyCloseLink[i])
count++;
}
if (count == playerCount)
{
// All ready, close link
gBattleTypeFlags &= ~BATTLE_TYPE_20;
if (Rfu.parentChild == MODE_CHILD)
{
Rfu.errorState = 3;
sub_8010168();
TryDisconnectRfu();
}
else
Rfu.callback = sub_8010168;
Rfu.callback = TryDisconnectRfu;
}
}
static void sub_801022C(void)
static void SendReadyCloseLink(void)
{
if (gSendCmd[0] == 0 && Rfu.unk_ce8 == 0)
{
RfuPrepareSendBuffer(RFU_COMMAND_0x5F00);
Rfu.callback = sub_80101CC;
RfuPrepareSendBuffer(RFU_COMMAND_READY_CLOSE_LINK);
Rfu.callback = WaitAllReadyToCloseLink;
}
}
static void sub_8010264(u8 taskId)
static void Task_TryReadyCloseLink(u8 taskId)
{
if (Rfu.callback == NULL)
{
Rfu.unk_cd9 = 1;
Rfu.callback = sub_801022C;
Rfu.callback = SendReadyCloseLink;
DestroyTask(taskId);
}
}
void task_add_05_task_del_08FA224_when_no_RfuFunc(void)
void Rfu_SetCloseLinkCallback(void)
{
if (!FuncIsActiveTask(sub_8010264))
CreateTask(sub_8010264, 5);
if (!FuncIsActiveTask(Task_TryReadyCloseLink))
CreateTask(Task_TryReadyCloseLink, 5);
}
static void sub_80102B8(void)
static void SendReadyExitStandbyUntilAllReady(void)
{
u8 playerCount;
u8 i;
if (GetMultiplayerId() != 0)
{
if (Rfu.recvQueue.count == 0 && Rfu.unk_fe > 60)
if (Rfu.recvQueue.count == 0 && Rfu.resendExitStandbyTimer > 60)
{
RfuPrepareSendBuffer(RFU_COMMAND_0x6600);
Rfu.unk_fe = 0;
RfuPrepareSendBuffer(RFU_COMMAND_READY_EXIT_STANDBY);
Rfu.resendExitStandbyTimer = 0;
}
}
playerCount = GetLinkPlayerCount();
for (i = 0; i < playerCount; i++)
{
if (Rfu.unk_e9[i] == 0)
if (!Rfu.readyExitStandby[i])
break;
}
if (i == playerCount)
{
for (i = 0; i < MAX_RFU_PLAYERS; i++)
Rfu.unk_e9[i] = 0;
Rfu.readyExitStandby[i] = FALSE;
Rfu.unk_100++;
Rfu.callback = NULL;
}
Rfu.unk_fe++;
Rfu.resendExitStandbyTimer++;
}
static void sub_8010358(void)
static void LinkLeaderReadyToExitStandby(void)
{
if (Rfu.recvQueue.count == 0 && gSendCmd[0] == 0)
{
RfuPrepareSendBuffer(RFU_COMMAND_0x6600);
Rfu.callback = sub_80102B8;
RfuPrepareSendBuffer(RFU_COMMAND_READY_EXIT_STANDBY);
Rfu.callback = SendReadyExitStandbyUntilAllReady;
}
}
static void sub_8010390(void)
// RFU equivalent of LinkCB_Standby and LinkCB_StandbyForAll
static void Rfu_LinkStandby(void)
{
u8 i;
u8 playerCount;
if (GetMultiplayerId() != 0)
{
// Not link leader, send exit standby when ready
if (Rfu.recvQueue.count == 0 && gSendCmd[0] == 0)
{
RfuPrepareSendBuffer(RFU_COMMAND_0x6600);
Rfu.callback = sub_80102B8;
RfuPrepareSendBuffer(RFU_COMMAND_READY_EXIT_STANDBY);
Rfu.callback = SendReadyExitStandbyUntilAllReady;
}
}
else
{
// Link leader, wait for all members to send exit ready
playerCount = GetLinkPlayerCount();
for (i = 1; i < playerCount; i++)
{
if (Rfu.unk_e9[i] == 0)
if (!Rfu.readyExitStandby[i])
break;
}
if (i == playerCount)
{
if (Rfu.recvQueue.count == 0 && gSendCmd[0] == 0)
{
RfuPrepareSendBuffer(RFU_COMMAND_0x6600);
Rfu.callback = sub_8010358;
RfuPrepareSendBuffer(RFU_COMMAND_READY_EXIT_STANDBY);
Rfu.callback = LinkLeaderReadyToExitStandby;
}
}
}
}
void sub_8010434(void)
void Rfu_SetLinkStandbyCallback(void)
{
if (Rfu.callback == NULL)
{
Rfu.callback = sub_8010390;
Rfu.unk_fe = 0;
Rfu.callback = Rfu_LinkStandby;
Rfu.resendExitStandbyTimer = 0;
}
}
@ -1724,8 +1727,8 @@ static void sub_801084C(u8 taskId)
{
if (AreNoPlayersReceiving())
{
Rfu.unk_5a = 0;
RfuPrepareSendBuffer(RFU_COMMAND_0xA100);
Rfu.blockRequestType = 0;
RfuPrepareSendBuffer(RFU_COMMAND_SEND_BLOCK_REQ);
gTasks[taskId].data[0]++;
}
}

View File

@ -208,7 +208,7 @@ static void CB2_MysteryEventMenu(void)
{
if (GetLinkPlayerDataExchangeStatusTimed(2, 2) == EXCHANGE_DIFF_SELECTIONS)
{
sub_800AC34();
SetCloseLinkCallback();
GetEventLoadMessage(gStringVar4, 1);
PrintMysteryMenuText(0, gStringVar4, 1, 2, 1);
gMain.state = 13;
@ -249,7 +249,7 @@ static void CB2_MysteryEventMenu(void)
gMain.state++;
break;
case 10:
sub_800AC34();
SetCloseLinkCallback();
gMain.state++;
break;
case 11:

View File

@ -1284,7 +1284,7 @@ void task00_mystery_gift(u8 taskId)
switch (mevent_client_do_exec(&data->curPromptWindowId))
{
case 6:
task_add_05_task_del_08FA224_when_no_RfuFunc();
Rfu_SetCloseLinkCallback();
data->prevPromptWindowId = data->curPromptWindowId;
data->state = 13;
break;
@ -1647,7 +1647,7 @@ void task00_mystery_gift(u8 taskId)
}
break;
case 33:
task_add_05_task_del_08FA224_when_no_RfuFunc();
Rfu_SetCloseLinkCallback();
StringCopy(gStringVar1, gLinkPlayers[1].name);
data->state = 34;
break;

View File

@ -46,7 +46,7 @@
#include "save.h"
#include "save_location.h"
#include "script.h"
#include "script_pokemon_util_80F87D8.h"
#include "script_pokemon_util.h"
#include "secret_base.h"
#include "sound.h"
#include "start_menu.h"

View File

@ -4499,8 +4499,8 @@ void CreateSecretBaseEnemyParty(struct SecretBase *secretBaseRecord)
for (j = 0; j < MAX_MON_MOVES; j++)
{
SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, &gBattleResources->secretBase->party.moves[i * 4 + j]);
SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gBattleMoves[gBattleResources->secretBase->party.moves[i * 4 + j]].pp);
SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, &gBattleResources->secretBase->party.moves[i * MAX_MON_MOVES + j]);
SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gBattleMoves[gBattleResources->secretBase->party.moves[i * MAX_MON_MOVES + j]].pp);
}
}
}

View File

@ -1463,7 +1463,7 @@ static bool32 sub_802BC60(void)
case 4:
if (!gPaletteFade.active)
{
sub_800AC34();
SetCloseLinkCallback();
gUnknown_02022CFC->unkA++;
}
break;

View File

@ -5,7 +5,7 @@
#include "hall_of_fame.h"
#include "load_save.h"
#include "overworld.h"
#include "script_pokemon_util_80F87D8.h"
#include "script_pokemon_util.h"
#include "tv.h"
#include "constants/heal_locations.h"
#include "constants/tv.h"

View File

@ -501,7 +501,7 @@ static void Task_SendPacket(u8 taskId)
break;
case 1:
if (GetMultiplayerId() == 0)
sub_800A4D8(1);
SendBlockRequest(1);
task->data[0]++;
break;
case 2:
@ -973,7 +973,7 @@ static void Task_DoRecordMixing(u8 taskId)
case 4: // Wait 10 frames
if (++task->data[1] > 10)
{
sub_800AC34();
SetCloseLinkCallback();
task->data[0] ++;
}
break;
@ -1005,7 +1005,7 @@ static void Task_DoRecordMixing(u8 taskId)
}
break;
case 8:
sub_800ADF8();
SetLinkStandbyCallback();
task->data[0] ++;
break;
case 9:

View File

@ -912,7 +912,7 @@ void Task_LinkSave(u8 taskId)
tState = 1;
break;
case 1:
sub_800ADF8();
SetLinkStandbyCallback();
tState = 2;
break;
case 2:
@ -949,7 +949,7 @@ void Task_LinkSave(u8 taskId)
case 7:
if (!tPartialSave)
ClearContinueGameWarpStatus2();
sub_800ADF8();
SetLinkStandbyCallback();
tState = 8;
break;
case 8:
@ -960,7 +960,7 @@ void Task_LinkSave(u8 taskId)
}
break;
case 9:
sub_800ADF8();
SetLinkStandbyCallback();
tState = 10;
break;
case 10:

View File

@ -38,7 +38,7 @@
#include "script.h"
#include "script_menu.h"
#include "script_movement.h"
#include "script_pokemon_80F8.h"
#include "script_pokemon_util.h"
#include "shop.h"
#include "slot_machine.h"
#include "sound.h"
@ -1475,7 +1475,7 @@ bool8 ScrCmd_showcontestwinner(struct ScriptContext *ctx)
if (contestWinnerId != CONTEST_WINNER_ARTIST)
SetContestWinnerForPainting(contestWinnerId);
ShowContestWinner();
ShowContestWinnerPainting();
ScriptContext1_Stop();
return TRUE;
}

224
src/script_pokemon_util.c Executable file
View File

@ -0,0 +1,224 @@
#include "global.h"
#include "battle.h"
#include "battle_gfx_sfx_util.h"
#include "berry.h"
#include "data.h"
#include "daycare.h"
#include "decompress.h"
#include "event_data.h"
#include "international_string_util.h"
#include "link.h"
#include "link_rfu.h"
#include "main.h"
#include "menu.h"
#include "overworld.h"
#include "palette.h"
#include "party_menu.h"
#include "pokedex.h"
#include "pokemon.h"
#include "random.h"
#include "script.h"
#include "sprite.h"
#include "string_util.h"
#include "tv.h"
#include "constants/items.h"
#include "constants/species.h"
#include "constants/tv.h"
#include "constants/battle_frontier.h"
static void CB2_ReturnFromChooseHalfParty(void);
static void CB2_ReturnFromChooseBattleFrontierParty(void);
void HealPlayerParty(void)
{
u8 i, j;
u8 ppBonuses;
u8 arg[4];
// restore HP.
for(i = 0; i < gPlayerPartyCount; i++)
{
u16 maxHP = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP);
arg[0] = maxHP;
arg[1] = maxHP >> 8;
SetMonData(&gPlayerParty[i], MON_DATA_HP, arg);
ppBonuses = GetMonData(&gPlayerParty[i], MON_DATA_PP_BONUSES);
// restore PP.
for(j = 0; j < MAX_MON_MOVES; j++)
{
arg[0] = CalculatePPWithBonus(GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j), ppBonuses, j);
SetMonData(&gPlayerParty[i], MON_DATA_PP1 + j, arg);
}
// since status is u32, the four 0 assignments here are probably for safety to prevent undefined data from reaching SetMonData.
arg[0] = 0;
arg[1] = 0;
arg[2] = 0;
arg[3] = 0;
SetMonData(&gPlayerParty[i], MON_DATA_STATUS, arg);
}
}
u8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unused1, u32 unused2, u8 unused3)
{
u16 nationalDexNum;
int sentToPc;
u8 heldItem[2];
struct Pokemon mon;
CreateMon(&mon, species, level, 32, 0, 0, OT_ID_PLAYER_ID, 0);
heldItem[0] = item;
heldItem[1] = item >> 8;
SetMonData(&mon, MON_DATA_HELD_ITEM, heldItem);
sentToPc = GiveMonToPlayer(&mon);
nationalDexNum = SpeciesToNationalPokedexNum(species);
switch(sentToPc)
{
case 0:
case 1:
GetSetPokedexFlag(nationalDexNum, FLAG_SET_SEEN);
GetSetPokedexFlag(nationalDexNum, FLAG_SET_CAUGHT);
break;
}
return sentToPc;
}
u8 ScriptGiveEgg(u16 species)
{
struct Pokemon mon;
u8 isEgg;
CreateEgg(&mon, species, TRUE);
isEgg = TRUE;
SetMonData(&mon, MON_DATA_IS_EGG, &isEgg);
return GiveMonToPlayer(&mon);
}
void HasEnoughMonsForDoubleBattle(void)
{
switch (GetMonsStateToDoubles())
{
case PLAYER_HAS_TWO_USABLE_MONS:
gSpecialVar_Result = PLAYER_HAS_TWO_USABLE_MONS;
break;
case PLAYER_HAS_ONE_MON:
gSpecialVar_Result = PLAYER_HAS_ONE_MON;
break;
case PLAYER_HAS_ONE_USABLE_MON:
gSpecialVar_Result = PLAYER_HAS_ONE_USABLE_MON;
break;
}
}
static bool8 CheckPartyMonHasHeldItem(u16 item)
{
int i;
for(i = 0; i < PARTY_SIZE; i++)
{
u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
if (species != SPECIES_NONE && species != SPECIES_EGG && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) == item)
return TRUE;
}
return FALSE;
}
bool8 DoesPartyHaveEnigmaBerry(void)
{
bool8 hasItem = CheckPartyMonHasHeldItem(ITEM_ENIGMA_BERRY);
if (hasItem == TRUE)
GetBerryNameByBerryType(ItemIdToBerryType(ITEM_ENIGMA_BERRY), gStringVar1);
return hasItem;
}
void CreateScriptedWildMon(u16 species, u8 level, u16 item)
{
u8 heldItem[2];
ZeroEnemyPartyMons();
CreateMon(&gEnemyParty[0], species, level, 32, 0, 0, OT_ID_PLAYER_ID, 0);
if (item)
{
heldItem[0] = item;
heldItem[1] = item >> 8;
SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem);
}
}
void ScriptSetMonMoveSlot(u8 monIndex, u16 move, u8 slot)
{
if (monIndex > PARTY_SIZE)
monIndex = gPlayerPartyCount - 1;
SetMonMoveSlot(&gPlayerParty[monIndex], move, slot);
}
// Note: When control returns to the event script, gSpecialVar_Result will be
// TRUE if the party selection was successful.
void ChooseHalfPartyForBattle(void)
{
gMain.savedCallback = CB2_ReturnFromChooseHalfParty;
VarSet(VAR_FRONTIER_FACILITY, FACILITY_MULTI_OR_EREADER);
InitChooseHalfPartyForBattle(0);
}
static void CB2_ReturnFromChooseHalfParty(void)
{
switch (gSelectedOrderFromParty[0])
{
case 0:
gSpecialVar_Result = FALSE;
break;
default:
gSpecialVar_Result = TRUE;
break;
}
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
void ChoosePartyForBattleFrontier(void)
{
gMain.savedCallback = CB2_ReturnFromChooseBattleFrontierParty;
InitChooseHalfPartyForBattle(gSpecialVar_0x8004 + 1);
}
static void CB2_ReturnFromChooseBattleFrontierParty(void)
{
switch (gSelectedOrderFromParty[0])
{
case 0:
gSpecialVar_Result = FALSE;
break;
default:
gSpecialVar_Result = TRUE;
break;
}
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
void ReducePlayerPartyToSelectedMons(void)
{
struct Pokemon party[MAX_FRONTIER_PARTY_SIZE];
int i;
CpuFill32(0, party, sizeof party);
// copy the selected pokemon according to the order.
for (i = 0; i < MAX_FRONTIER_PARTY_SIZE; i++)
if (gSelectedOrderFromParty[i]) // as long as the order keeps going (did the player select 1 mon? 2? 3?), do not stop
party[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1]; // index is 0 based, not literal
CpuFill32(0, gPlayerParty, sizeof gPlayerParty);
// overwrite the first 4 with the order copied to.
for (i = 0; i < MAX_FRONTIER_PARTY_SIZE; i++)
gPlayerParty[i] = party[i];
CalculatePlayerPartyCount();
}

View File

@ -1,725 +0,0 @@
#include "global.h"
#include "battle.h"
#include "battle_gfx_sfx_util.h"
#include "berry.h"
#include "contest.h"
#include "contest_util.h"
#include "contest_painting.h"
#include "data.h"
#include "daycare.h"
#include "decompress.h"
#include "event_data.h"
#include "event_object_movement.h"
#include "international_string_util.h"
#include "link.h"
#include "link_rfu.h"
#include "main.h"
#include "menu.h"
#include "overworld.h"
#include "palette.h"
#include "party_menu.h"
#include "pokedex.h"
#include "pokemon.h"
#include "random.h"
#include "script.h"
#include "script_menu.h"
#include "sprite.h"
#include "string_util.h"
#include "tv.h"
#include "constants/event_objects.h"
#include "constants/items.h"
#include "constants/species.h"
#include "constants/tv.h"
#include "constants/battle_frontier.h"
extern const u16 gObjectEventPalette8[];
extern const u16 gObjectEventPalette17[];
extern const u16 gObjectEventPalette33[];
extern const u16 gObjectEventPalette34[];
static const u8 gUnknown_0858D8EC[] = { 3, 4, 5, 14 };
static void Task_ShowContestEntryMonPic(u8 taskId);
static void Task_LinkContestWaitForConnection(u8 taskId);
static void CB2_ReturnFromChooseHalfParty(void);
static void CB2_ReturnFromChooseBattleFrontierParty(void);
void SetContestTrainerGfxIds(void)
{
gSaveBlock1Ptr->vars[VAR_OBJ_GFX_ID_0 - VARS_START] = gContestMons[0].trainerGfxId;
gSaveBlock1Ptr->vars[VAR_OBJ_GFX_ID_1 - VARS_START] = gContestMons[1].trainerGfxId;
gSaveBlock1Ptr->vars[VAR_OBJ_GFX_ID_2 - VARS_START] = gContestMons[2].trainerGfxId;
}
// Unused
void sub_80F8814(void)
{
u16 var1;
u8 var0 = gSpecialVar_0x8005;
switch (var0)
{
case 0:
var1 = 3;
break;
case 1:
var1 = 4;
break;
case 2:
var1 = 5;
break;
default:
var1 = 100;
break;
}
gSpecialVar_0x8004 = var1;
}
void BufferContestTrainerAndMonNames(void)
{
BufferContestantTrainerName();
BufferContestantMonNickname();
BufferContestantMonSpecies();
}
// Unused
void DoesContestCategoryHaveWinner(void)
{
int contestWinner;
switch (gSpecialVar_ContestCategory)
{
case CONTEST_CATEGORY_COOL:
contestWinner = 8;
break;
case CONTEST_CATEGORY_BEAUTY:
contestWinner = 9;
break;
case CONTEST_CATEGORY_CUTE:
contestWinner = 10;
break;
case CONTEST_CATEGORY_SMART:
contestWinner = 11;
break;
case CONTEST_CATEGORY_TOUGH:
default:
contestWinner = 12;
break;
}
if (gSaveBlock1Ptr->contestWinners[contestWinner].species == SPECIES_NONE)
gSpecialVar_0x8004 = FALSE;
else
gSpecialVar_0x8004 = TRUE;
}
void SaveMuseumContestPainting(void)
{
sub_80DEDA8(0xFF);
}
void ShouldReadyContestArtist(void)
{
if (gContestFinalStandings[gContestPlayerMonIndex] == 0
&& gSpecialVar_ContestRank == CONTEST_RANK_MASTER
&& gContestMonTotalPoints[gContestPlayerMonIndex] >= 800)
{
gSpecialVar_0x8004 = TRUE;
}
else
{
gSpecialVar_0x8004 = FALSE;
}
}
u8 CountPlayerContestPaintings(void)
{
int i;
u8 count = 0;
for (i = 0; i < 5; i++)
{
if (gSaveBlock1Ptr->contestWinners[8 + i].species)
count++;
}
return count;
}
// Unused
void sub_80F8970(void)
{
s16 conditions[CONTESTANT_COUNT];
int i, j;
s16 condition;
s8 var0;
u8 var2;
u8 r8;
u8 r7;
for (i = 0; i < CONTESTANT_COUNT; i++)
conditions[i] = gContestMonConditions[i];
for (i = 0; i < CONTESTANT_COUNT - 1; i++)
{
for (j = CONTESTANT_COUNT - 1; j > i; j--)
{
if (conditions[j - 1] < conditions[j])
{
int temp;
SWAP(conditions[j], conditions[j - 1], temp)
}
}
}
condition = conditions[gSpecialVar_0x8006];
var0 = 0;
r8 = 0;
for (i = 0; i < CONTESTANT_COUNT; i++)
{
if (conditions[i] == condition)
{
var0++;
if (i == gSpecialVar_0x8006)
r8 = var0;
}
}
for (i = 0; i < CONTESTANT_COUNT; i++)
{
if (conditions[i] == condition)
break;
}
r7 = i;
var2 = r8;
for (i = 0; i < CONTESTANT_COUNT; i++)
{
if (condition == gContestMonConditions[i])
{
if (var2 == 1)
break;
var2--;
}
}
StringCopy(gStringVar1, gContestMons[i].nickname);
StringCopy(gStringVar2, gContestMons[i].trainerName);
sub_81DB5AC(gStringVar2);
if (var0 == 1)
gSpecialVar_0x8006 = r7;
else if (r8 == var0)
gSpecialVar_0x8006 = r7;
else
gSpecialVar_0x8006 = r7 + 4;
}
static void ShowContestWinnerCleanup(void)
{
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
void ShowContestWinner(void)
{
/*
if(gUnknown_0203856C)
{
sub_80AAF30();
gBattleStruct->unk15DDF = 1;
gBattleStruct->unk15DDE = sub_80B2C4C(254, 0);
Contest_SaveWinner(3);
gUnknown_0203856C = 0;
}
*/
SetMainCallback2(CB2_ContestPainting);
gMain.savedCallback = ShowContestWinnerCleanup;
}
void SetLinkContestPlayerGfx(void)
{
int i;
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK)
{
for (i = 0; i < gNumLinkContestPlayers; i++)
{
int version = (u8)gLinkPlayers[i].version;
if (version == VERSION_RUBY || version == VERSION_SAPPHIRE)
{
if (gLinkPlayers[i].gender == MALE)
gContestMons[i].trainerGfxId = OBJ_EVENT_GFX_LINK_RS_BRENDAN;
else
gContestMons[i].trainerGfxId = OBJ_EVENT_GFX_LINK_RS_MAY;
}
}
VarSet(VAR_OBJ_GFX_ID_0, gContestMons[0].trainerGfxId);
VarSet(VAR_OBJ_GFX_ID_1, gContestMons[1].trainerGfxId);
VarSet(VAR_OBJ_GFX_ID_2, gContestMons[2].trainerGfxId);
VarSet(VAR_OBJ_GFX_ID_3, gContestMons[3].trainerGfxId);
}
}
void LoadLinkContestPlayerPalettes(void)
{
int i;
u8 objectEventId;
int version;
struct Sprite *sprite;
gReservedSpritePaletteCount = 12;
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK)
{
for (i = 0; i < gNumLinkContestPlayers; i++)
{
objectEventId = GetObjectEventIdByLocalIdAndMap(gUnknown_0858D8EC[i], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
sprite = &gSprites[gObjectEvents[objectEventId].spriteId];
sprite->oam.paletteNum = 6 + i;
version = (u8)gLinkPlayers[i].version;
if (version == VERSION_RUBY || version == VERSION_SAPPHIRE)
{
if (gLinkPlayers[i].gender == MALE)
LoadPalette(gObjectEventPalette33, 0x160 + i * 0x10, 0x20);
else
LoadPalette(gObjectEventPalette34, 0x160 + i * 0x10, 0x20);
}
else
{
if (gLinkPlayers[i].gender == MALE)
LoadPalette(gObjectEventPalette8, 0x160 + i * 0x10, 0x20);
else
LoadPalette(gObjectEventPalette17, 0x160 + i * 0x10, 0x20);
}
}
}
}
u8 GiveMonArtistRibbon(void)
{
u8 hasArtistRibbon;
hasArtistRibbon = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_ARTIST_RIBBON);
if (!hasArtistRibbon
&& gContestFinalStandings[gContestPlayerMonIndex] == 0
&& gSpecialVar_ContestRank == CONTEST_RANK_MASTER
&& gContestMonTotalPoints[gContestPlayerMonIndex] >= 800)
{
hasArtistRibbon = 1;
SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_ARTIST_RIBBON, &hasArtistRibbon);
if (GetRibbonCount(&gPlayerParty[gContestMonPartyIndex]) > NUM_CUTIES_RIBBONS)
TryPutSpotTheCutiesOnAir(&gPlayerParty[gContestMonPartyIndex], MON_DATA_ARTIST_RIBBON);
return 1;
}
else
{
return 0;
}
}
bool8 IsContestDebugActive(void)
{
return FALSE; // gUnknown_0203856C in pokeruby
}
void ShowContestEntryMonPic(void)
{
const struct CompressedSpritePalette *palette;
u32 personality, otId;
u16 species;
u8 spriteId;
u8 taskId;
u8 left, top;
if (FindTaskIdByFunc(Task_ShowContestEntryMonPic) == 0xFF)
{
AllocateMonSpritesGfx();
left = 10;
top = 3;
species = gContestMons[gSpecialVar_0x8006].species;
personality = gContestMons[gSpecialVar_0x8006].personality;
otId = gContestMons[gSpecialVar_0x8006].otId;
taskId = CreateTask(Task_ShowContestEntryMonPic, 0x50);
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = species;
if (gSpecialVar_0x8006 == gContestPlayerMonIndex)
HandleLoadSpecialPokePic_2(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[1], species, personality);
else
HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[1], species, personality);
palette = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality);
LoadCompressedSpritePalette(palette);
SetMultiuseSpriteTemplateToPokemon(species, 1);
gMultiuseSpriteTemplate.paletteTag = palette->tag;
spriteId = CreateSprite(&gMultiuseSpriteTemplate, (left + 1) * 8 + 32, (top * 8) + 40, 0);
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK)
{
if (!(gLinkContestFlags & LINK_CONTEST_FLAG_HAS_RS_PLAYER))
DoMonFrontSpriteAnimation(&gSprites[spriteId], species, FALSE, 0);
}
else
{
DoMonFrontSpriteAnimation(&gSprites[spriteId], species, FALSE, 0);
}
gTasks[taskId].data[2] = spriteId;
gTasks[taskId].data[3] = left;
gTasks[taskId].data[4] = top;
gSprites[spriteId].callback = SpriteCallbackDummy;
gSprites[spriteId].oam.priority = 0;
}
}
void HideContestEntryMonPic(void)
{
u8 taskId = FindTaskIdByFunc(Task_ShowContestEntryMonPic);
if (taskId != 0xFF)
{
gTasks[taskId].data[0]++;
FreeMonSpritesGfx();
}
}
static void Task_ShowContestEntryMonPic(u8 taskId)
{
struct Task *task = &gTasks[taskId];
struct Sprite *sprite;
switch(task->data[0])
{
case 0:
task->data[0]++;
break;
case 1:
task->data[5] = CreateWindowFromRect(10, 3, 8, 8);
SetStandardWindowBorderStyle(task->data[5], 1);
task->data[0]++;
break;
case 2:
break;
case 3:
sprite = &gSprites[task->data[2]];
FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum));
if(sprite->oam.affineMode)
FreeOamMatrix(sprite->oam.matrixNum);
DestroySprite(sprite);
task->data[0]++;
break;
case 4:
ClearToTransparentAndRemoveWindow(gTasks[taskId].data[5]);
DestroyTask(taskId);
break;
}
}
void ScriptGetMultiplayerId(void)
{
if ((gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK)
&& gNumLinkContestPlayers == CONTESTANT_COUNT
&& !(gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS))
gSpecialVar_Result = GetMultiplayerId();
else
gSpecialVar_Result = MAX_LINK_PLAYERS;
}
void ScriptRandom(void)
{
u16 random;
u16 *scriptPtr;
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK)
{
gContestRngValue = ISO_RANDOMIZE1(gContestRngValue);
random = gContestRngValue >> 16;
scriptPtr = &gSpecialVar_Result;
}
else
{
scriptPtr = &gSpecialVar_Result;
random = Random();
}
*scriptPtr = random % *scriptPtr;
}
u16 GetContestRand(void)
{
gContestRngValue = ISO_RANDOMIZE1(gContestRngValue);
return gContestRngValue >> 16;
}
bool8 LinkContestWaitForConnection(void)
{
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS)
{
CreateTask(Task_LinkContestWaitForConnection, 5);
return TRUE;
}
else
{
return FALSE;
}
}
static void Task_LinkContestWaitForConnection(u8 taskId)
{
switch (gTasks[taskId].data[0])
{
case 0:
if (IsLinkTaskFinished())
{
sub_800ADF8();
gTasks[taskId].data[0]++;
}
break;
case 1:
gTasks[taskId].data[0]++;
break;
default:
if (IsLinkTaskFinished() == 1)
{
EnableBothScriptContexts();
DestroyTask(taskId);
}
break;
}
}
void LinkContestTryShowWirelessIndicator(void)
{
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS)
{
if (gReceivedRemoteLinkPlayers)
{
LoadWirelessStatusIndicatorSpriteGfx();
CreateWirelessStatusIndicatorSprite(8, 8);
}
}
}
void LinkContestTryHideWirelessIndicator(void)
{
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS)
{
if (gReceivedRemoteLinkPlayers)
DestroyWirelessStatusIndicatorSprite();
}
}
bool8 IsContestWithRSPlayer(void)
{
if (gLinkContestFlags & LINK_CONTEST_FLAG_HAS_RS_PLAYER)
return TRUE;
else
return FALSE;
}
void ClearLinkContestFlags(void)
{
gLinkContestFlags = 0;
}
bool8 IsWirelessContest(void)
{
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS)
return TRUE;
else
return FALSE;
}
void HealPlayerParty(void)
{
u8 i, j;
u8 ppBonuses;
u8 arg[4];
// restore HP.
for(i = 0; i < gPlayerPartyCount; i++)
{
u16 maxHP = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP);
arg[0] = maxHP;
arg[1] = maxHP >> 8;
SetMonData(&gPlayerParty[i], MON_DATA_HP, arg);
ppBonuses = GetMonData(&gPlayerParty[i], MON_DATA_PP_BONUSES);
// restore PP.
for(j = 0; j < MAX_MON_MOVES; j++)
{
arg[0] = CalculatePPWithBonus(GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j), ppBonuses, j);
SetMonData(&gPlayerParty[i], MON_DATA_PP1 + j, arg);
}
// since status is u32, the four 0 assignments here are probably for safety to prevent undefined data from reaching SetMonData.
arg[0] = 0;
arg[1] = 0;
arg[2] = 0;
arg[3] = 0;
SetMonData(&gPlayerParty[i], MON_DATA_STATUS, arg);
}
}
u8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unused1, u32 unused2, u8 unused3)
{
u16 nationalDexNum;
int sentToPc;
u8 heldItem[2];
struct Pokemon mon;
CreateMon(&mon, species, level, 32, 0, 0, OT_ID_PLAYER_ID, 0);
heldItem[0] = item;
heldItem[1] = item >> 8;
SetMonData(&mon, MON_DATA_HELD_ITEM, heldItem);
sentToPc = GiveMonToPlayer(&mon);
nationalDexNum = SpeciesToNationalPokedexNum(species);
switch(sentToPc)
{
case 0:
case 1:
GetSetPokedexFlag(nationalDexNum, FLAG_SET_SEEN);
GetSetPokedexFlag(nationalDexNum, FLAG_SET_CAUGHT);
break;
}
return sentToPc;
}
u8 ScriptGiveEgg(u16 species)
{
struct Pokemon mon;
u8 isEgg;
CreateEgg(&mon, species, TRUE);
isEgg = TRUE;
SetMonData(&mon, MON_DATA_IS_EGG, &isEgg);
return GiveMonToPlayer(&mon);
}
void HasEnoughMonsForDoubleBattle(void)
{
switch (GetMonsStateToDoubles())
{
case PLAYER_HAS_TWO_USABLE_MONS:
gSpecialVar_Result = PLAYER_HAS_TWO_USABLE_MONS;
break;
case PLAYER_HAS_ONE_MON:
gSpecialVar_Result = PLAYER_HAS_ONE_MON;
break;
case PLAYER_HAS_ONE_USABLE_MON:
gSpecialVar_Result = PLAYER_HAS_ONE_USABLE_MON;
break;
}
}
static bool8 CheckPartyMonHasHeldItem(u16 item)
{
int i;
for(i = 0; i < PARTY_SIZE; i++)
{
u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
if (species != SPECIES_NONE && species != SPECIES_EGG && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) == item)
return TRUE;
}
return FALSE;
}
bool8 DoesPartyHaveEnigmaBerry(void)
{
bool8 hasItem = CheckPartyMonHasHeldItem(ITEM_ENIGMA_BERRY);
if (hasItem == TRUE)
GetBerryNameByBerryType(ItemIdToBerryType(ITEM_ENIGMA_BERRY), gStringVar1);
return hasItem;
}
void CreateScriptedWildMon(u16 species, u8 level, u16 item)
{
u8 heldItem[2];
ZeroEnemyPartyMons();
CreateMon(&gEnemyParty[0], species, level, 32, 0, 0, OT_ID_PLAYER_ID, 0);
if (item)
{
heldItem[0] = item;
heldItem[1] = item >> 8;
SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem);
}
}
void ScriptSetMonMoveSlot(u8 monIndex, u16 move, u8 slot)
{
if (monIndex > PARTY_SIZE)
monIndex = gPlayerPartyCount - 1;
SetMonMoveSlot(&gPlayerParty[monIndex], move, slot);
}
// Note: When control returns to the event script, gSpecialVar_Result will be
// TRUE if the party selection was successful.
void ChooseHalfPartyForBattle(void)
{
gMain.savedCallback = CB2_ReturnFromChooseHalfParty;
VarSet(VAR_FRONTIER_FACILITY, FACILITY_MULTI_OR_EREADER);
InitChooseHalfPartyForBattle(0);
}
static void CB2_ReturnFromChooseHalfParty(void)
{
switch (gSelectedOrderFromParty[0])
{
case 0:
gSpecialVar_Result = FALSE;
break;
default:
gSpecialVar_Result = TRUE;
break;
}
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
void ChoosePartyForBattleFrontier(void)
{
gMain.savedCallback = CB2_ReturnFromChooseBattleFrontierParty;
InitChooseHalfPartyForBattle(gSpecialVar_0x8004 + 1);
}
static void CB2_ReturnFromChooseBattleFrontierParty(void)
{
switch (gSelectedOrderFromParty[0])
{
case 0:
gSpecialVar_Result = FALSE;
break;
default:
gSpecialVar_Result = TRUE;
break;
}
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
void ReducePlayerPartyToSelectedMons(void)
{
struct Pokemon party[MAX_FRONTIER_PARTY_SIZE];
int i;
CpuFill32(0, party, sizeof party);
// copy the selected pokemon according to the order.
for (i = 0; i < MAX_FRONTIER_PARTY_SIZE; i++)
if (gSelectedOrderFromParty[i]) // as long as the order keeps going (did the player select 1 mon? 2? 3?), do not stop
party[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1]; // index is 0 based, not literal
CpuFill32(0, gPlayerParty, sizeof gPlayerParty);
// overwrite the first 4 with the order copied to.
for (i = 0; i < MAX_FRONTIER_PARTY_SIZE; i++)
gPlayerParty[i] = party[i];
CalculatePlayerPartyCount();
}

View File

@ -246,9 +246,9 @@ static bool8 SendLinkData(const void *linkData, u32 size)
}
}
static void sub_80771AC(u8 a0)
static void RequestLinkData(u8 type)
{
sub_800A4D8(a0);
SendBlockRequest(type);
}
static bool32 sub_80771BC(void)
@ -295,9 +295,9 @@ static bool32 IsWirelessTrade(void)
return FALSE;
}
static void sub_8077288(u8 unused)
static void SetTradeLinkStandbyCallback(u8 unused)
{
sub_800ADF8();
SetLinkStandbyCallback();
}
static bool32 _IsLinkTaskFinished(void)
@ -445,7 +445,7 @@ static void CB2_CreateTradeMenu(void)
if (gWirelessCommType)
{
sub_801048C(TRUE);
sub_800ADF8();
SetLinkStandbyCallback();
}
}
break;
@ -825,7 +825,7 @@ static void LinkTradeWaitForFade(void)
}
else
{
sub_800ABF4(32);
SetCloseLinkCallbackAndType(32);
sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_START_LINK_TRADE;
}
}
@ -983,7 +983,7 @@ static bool8 BufferTradeParties(void)
case 3:
if (id == 0)
{
sub_80771AC(1);
RequestLinkData(1);
}
sTradeMenuData->bufferPartyState++;
break;
@ -1002,7 +1002,7 @@ static bool8 BufferTradeParties(void)
case 7:
if (id == 0)
{
sub_80771AC(1);
RequestLinkData(1);
}
sTradeMenuData->bufferPartyState++;
break;
@ -1021,7 +1021,7 @@ static bool8 BufferTradeParties(void)
case 11:
if (id == 0)
{
sub_80771AC(1);
RequestLinkData(1);
}
sTradeMenuData->bufferPartyState++;
break;
@ -1040,7 +1040,7 @@ static bool8 BufferTradeParties(void)
case 15:
if (id == 0)
{
sub_80771AC(3);
RequestLinkData(3);
}
sTradeMenuData->bufferPartyState++;
break;
@ -1059,7 +1059,7 @@ static bool8 BufferTradeParties(void)
case 19:
if (id == 0)
{
sub_80771AC(4);
RequestLinkData(4);
}
sTradeMenuData->bufferPartyState++;
break;
@ -1652,11 +1652,11 @@ static void CancelTrade_1(void)
{
if (gWirelessCommType)
{
sub_800ADF8();
SetLinkStandbyCallback();
}
else
{
sub_800ABF4(12);
SetCloseLinkCallbackAndType(12);
}
sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_CANCEL_TRADE_2;
@ -1692,7 +1692,7 @@ static void LinkTradeWaitForQueue(void)
{
if (!sub_801048C(FALSE) && GetNumQueuedActions() == 0)
{
sub_800ADF8();
SetLinkStandbyCallback();
sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_START_LINK_TRADE;
}
}
@ -4566,7 +4566,7 @@ static void CB2_SaveAndEndTrade(void)
DrawTextOnTradeWindow(0, gStringVar4, 0);
break;
case 1:
sub_8077288(0);
SetTradeLinkStandbyCallback(0);
gMain.state = 100;
sTradeData->timer = 0;
break;
@ -4644,7 +4644,7 @@ static void CB2_SaveAndEndTrade(void)
case 41:
if (sTradeData->timer == 0)
{
sub_8077288(1);
SetTradeLinkStandbyCallback(1);
gMain.state = 42;
}
else
@ -4663,7 +4663,7 @@ static void CB2_SaveAndEndTrade(void)
if (++sTradeData->timer > 60)
{
gMain.state++;
sub_8077288(2);
SetTradeLinkStandbyCallback(2);
}
break;
case 6:
@ -4685,11 +4685,11 @@ static void CB2_SaveAndEndTrade(void)
{
if (gWirelessCommType && gMain.savedCallback == CB2_StartCreateTradeMenu)
{
sub_8077288(3);
SetTradeLinkStandbyCallback(3);
}
else
{
sub_800AC34();
SetCloseLinkCallback();
}
gMain.state++;
}
@ -4902,7 +4902,7 @@ static void CB2_SaveAndEndWirelessTrade(void)
DrawTextOnTradeWindow(0, gStringVar4, 0);
break;
case 1:
sub_8077288(0);
SetTradeLinkStandbyCallback(0);
gMain.state = 2;
sTradeData->timer = 0;
break;
@ -4950,7 +4950,7 @@ static void CB2_SaveAndEndWirelessTrade(void)
case 7:
if (sTradeData->timer == 0)
{
sub_8077288(1);
SetTradeLinkStandbyCallback(1);
gMain.state = 8;
}
else
@ -4969,7 +4969,7 @@ static void CB2_SaveAndEndWirelessTrade(void)
if (++sTradeData->timer > 60)
{
gMain.state++;
sub_8077288(2);
SetTradeLinkStandbyCallback(2);
}
break;
case 10:
@ -4983,7 +4983,7 @@ static void CB2_SaveAndEndWirelessTrade(void)
case 11:
if (!gPaletteFade.active && IsBGMStopped() == TRUE)
{
sub_8077288(3);
SetTradeLinkStandbyCallback(3);
gMain.state = 12;
}
break;

View File

@ -25,7 +25,7 @@
#include "graphics.h"
#include "pokemon_icon.h"
#include "trainer_pokemon_sprites.h"
#include "script_pokemon_util_80F87D8.h"
#include "contest_util.h"
#include "constants/songs.h"
#include "constants/game_stat.h"
#include "constants/battle_frontier.h"
@ -497,7 +497,7 @@ static void Task_TrainerCard(u8 taskId)
}
break;
case STATE_WAIT_LINK_PARTNER:
sub_800AC34();
SetCloseLinkCallback();
DrawDialogueFrame(0, 1);
AddTextPrinterParameterized(0, 1, gText_WaitingTrainerFinishReading, 0, 1, 255, 0);
CopyWindowToVram(0, 3);

729
src/tv.c
View File

@ -387,39 +387,39 @@ static const u8 *const sTVBravoTrainerBattleTowerTextGroup[] = {
};
static const u8 *const sTVContestLiveUpdatesTextGroup[] = {
gTVContestLiveUpdatesText00,
gTVContestLiveUpdatesText01,
gTVContestLiveUpdatesText02,
gTVContestLiveUpdatesText03,
gTVContestLiveUpdatesText04,
gTVContestLiveUpdatesText05,
gTVContestLiveUpdatesText06,
gTVContestLiveUpdatesText07,
gTVContestLiveUpdatesText08,
gTVContestLiveUpdatesText09,
gTVContestLiveUpdatesText10,
gTVContestLiveUpdatesText11,
gTVContestLiveUpdatesText12,
gTVContestLiveUpdatesText13,
gTVContestLiveUpdatesText14,
gTVContestLiveUpdatesText15,
gTVContestLiveUpdatesText16,
gTVContestLiveUpdatesText17,
gTVContestLiveUpdatesText18,
gTVContestLiveUpdatesText19,
gTVContestLiveUpdatesText20,
gTVContestLiveUpdatesText21,
gTVContestLiveUpdatesText22,
gTVContestLiveUpdatesText23,
gTVContestLiveUpdatesText24,
gTVContestLiveUpdatesText25,
gTVContestLiveUpdatesText26,
gTVContestLiveUpdatesText27,
gTVContestLiveUpdatesText28,
gTVContestLiveUpdatesText29,
gTVContestLiveUpdatesText30,
gTVContestLiveUpdatesText31,
gTVContestLiveUpdatesText32
[CONTESTLIVE_STATE_INTRO] = ContestLiveUpdates_Text_Intro,
[CONTESTLIVE_STATE_WON_BOTH_ROUNDS] = ContestLiveUpdates_Text_WonBothRounds,
[CONTESTLIVE_STATE_BETTER_ROUND2] = ContestLiveUpdates_Text_BetterRound2,
[CONTESTLIVE_STATE_EQUAL_ROUNDS] = ContestLiveUpdates_Text_EqualRounds,
[CONTESTLIVE_STATE_BETTER_ROUND1] = ContestLiveUpdates_Text_BetterRound1,
[CONTESTLIVE_STATE_GOT_NERVOUS] = ContestLiveUpdates_Text_GotNervous,
[CONTESTLIVE_STATE_STARTLED_OTHER] = ContestLiveUpdates_Text_StartledFoes,
[CONTESTLIVE_STATE_USED_COMBO] = ContestLiveUpdates_Text_UsedCombo,
[CONTESTLIVE_STATE_EXCITING_APPEAL] = ContestLiveUpdates_Text_ExcitingAppeal,
[CONTESTLIVE_STATE_COOL] = ContestLiveUpdates_Text_WasCool,
[CONTESTLIVE_STATE_BEAUTIFUL] = ContestLiveUpdates_Text_WasBeautiful,
[CONTESTLIVE_STATE_CUTE] = ContestLiveUpdates_Text_WasCute,
[CONTESTLIVE_STATE_SMART] = ContestLiveUpdates_Text_WasSmart,
[CONTESTLIVE_STATE_TOUGH] = ContestLiveUpdates_Text_WasTough,
[CONTESTLIVE_STATE_VERY_EXCITING_APPEAL] = ContestLiveUpdates_Text_VeryExcitingAppeal,
[CONTESTLIVE_STATE_VERY_COOL] = ContestLiveUpdates_Text_VeryCool,
[CONTESTLIVE_STATE_VERY_BEAUTIFUL] = ContestLiveUpdates_Text_VeryBeautiful,
[CONTESTLIVE_STATE_VERY_CUTE] = ContestLiveUpdates_Text_VeryCute,
[CONTESTLIVE_STATE_VERY_SMART] = ContestLiveUpdates_Text_VerySmart,
[CONTESTLIVE_STATE_VERY_TOUGH] = ContestLiveUpdates_Text_VeryTough,
[CONTESTLIVE_STATE_TOOK_BREAK] = ContestLiveUpdates_Text_TookBreak,
[CONTESTLIVE_STATE_GOT_STARTLED] = ContestLiveUpdates_Text_GotStartled,
[CONTESTLIVE_STATE_USED_MOVE] = ContestLiveUpdates_Text_MoveWonderful,
[CONTESTLIVE_STATE_TALK_ABOUT_LOSER] = ContestLiveUpdates_Text_TalkAboutAnotherMon,
[CONTESTLIVE_STATE_NO_APPEALS] = ContestLiveUpdates_Text_FailedToAppeal,
[CONTESTLIVE_STATE_LAST_BOTH] = ContestLiveUpdates_Text_LastInBothRounds,
[CONTESTLIVE_STATE_NOT_EXCITING_ENOUGH] = ContestLiveUpdates_Text_NotExcitingEnough,
[CONTESTLIVE_STATE_LOST_AFTER_ROUND1_WIN] = ContestLiveUpdates_Text_LostAfterWinningRound1,
[CONTESTLIVE_STATE_NO_EXCITING_APPEALS] = ContestLiveUpdates_Text_NeverExciting,
[CONTESTLIVE_STATE_LOST_SMALL_MARGIN] = ContestLiveUpdates_Text_LostBySmallMargin,
[CONTESTLIVE_STATE_REPEATED_APPEALS] = ContestLiveUpdates_Text_RepeatedAppeals,
[CONTESTLIVE_STATE_LOST] = ContestLiveUpdates_Text_ValiantEffortButLost,
[CONTESTLIVE_STATE_OUTRO] = ContestLiveUpdates_Text_Outro
};
static const u8 *const sTVPokemonBattleUpdateTextGroup[] = {
@ -1268,19 +1268,19 @@ static void InterviewAfter_ContestLiveUpdates(void)
show2 = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show2->contestLiveUpdates.kind = TVSHOW_CONTEST_LIVE_UPDATES;
show2->contestLiveUpdates.active = TRUE;
StringCopy(show2->contestLiveUpdates.playerName, gSaveBlock2Ptr->playerName);
StringCopy(show2->contestLiveUpdates.winningTrainerName, gSaveBlock2Ptr->playerName); // Show only begins running if player won, so always load players name
show2->contestLiveUpdates.category = gSpecialVar_ContestCategory;
show2->contestLiveUpdates.species = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SPECIES, NULL);
show2->contestLiveUpdates.winningSpecies = show->contestLiveUpdates.winningSpecies;
show2->contestLiveUpdates.appealFlags2 = show->contestLiveUpdates.appealFlags2;
show2->contestLiveUpdates.round1Rank = show->contestLiveUpdates.round1Rank;
show2->contestLiveUpdates.round2Rank = show->contestLiveUpdates.round2Rank;
show2->contestLiveUpdates.winningSpecies = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SPECIES, NULL);
show2->contestLiveUpdates.losingSpecies = show->contestLiveUpdates.losingSpecies;
show2->contestLiveUpdates.loserAppealFlag = show->contestLiveUpdates.loserAppealFlag;
show2->contestLiveUpdates.round1Placing = show->contestLiveUpdates.round1Placing;
show2->contestLiveUpdates.round2Placing = show->contestLiveUpdates.round2Placing;
show2->contestLiveUpdates.move = show->contestLiveUpdates.move;
show2->contestLiveUpdates.appealFlags1 = show->contestLiveUpdates.appealFlags1;
StringCopy(show2->contestLiveUpdates.winningTrainerName, show->contestLiveUpdates.winningTrainerName);
show2->contestLiveUpdates.winnerAppealFlag = show->contestLiveUpdates.winnerAppealFlag;
StringCopy(show2->contestLiveUpdates.losingTrainerName, show->contestLiveUpdates.losingTrainerName);
tv_store_id_2x(show2);
show2->contestLiveUpdates.language = gGameLanguage;
show2->contestLiveUpdates.winningTrainerLanguage = show->contestLiveUpdates.winningTrainerLanguage;
show2->contestLiveUpdates.winningTrainerLanguage = gGameLanguage;
show2->contestLiveUpdates.losingTrainerLanguage = show->contestLiveUpdates.losingTrainerLanguage;
DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, LAST_TVSHOW_IDX);
}
}
@ -1399,7 +1399,7 @@ void PutFanClubSpecialOnTheAir(void)
}
}
void ContestLiveUpdates_BeforeInterview_1(u8 a0)
void ContestLiveUpdates_Init(u8 round1Placing)
{
TVShow *show;
@ -1408,12 +1408,12 @@ void ContestLiveUpdates_BeforeInterview_1(u8 a0)
if (sCurTVShowSlot != -1)
{
show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX];
show->contestLiveUpdates.round1Rank = a0;
show->contestLiveUpdates.round1Placing = round1Placing;
show->contestLiveUpdates.kind = TVSHOW_CONTEST_LIVE_UPDATES;
}
}
void ContestLiveUpdates_BeforeInterview_2(u8 a0)
void ContestLiveUpdates_SetRound2Placing(u8 round2Placing)
{
TVShow *show;
@ -1421,11 +1421,11 @@ void ContestLiveUpdates_BeforeInterview_2(u8 a0)
sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1)
{
show->contestLiveUpdates.round2Rank = a0;
show->contestLiveUpdates.round2Placing = round2Placing;
}
}
void ContestLiveUpdates_BeforeInterview_3(u8 a0)
void ContestLiveUpdates_SetWinnerAppealFlag(u8 flag)
{
TVShow *show;
@ -1433,11 +1433,11 @@ void ContestLiveUpdates_BeforeInterview_3(u8 a0)
sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1)
{
show->contestLiveUpdates.appealFlags1 = a0;
show->contestLiveUpdates.winnerAppealFlag = flag;
}
}
void ContestLiveUpdates_BeforeInterview_4(u16 a0)
void ContestLiveUpdates_SetWinnerMoveUsed(u16 move)
{
TVShow *show;
@ -1445,11 +1445,11 @@ void ContestLiveUpdates_BeforeInterview_4(u16 a0)
sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1)
{
show->contestLiveUpdates.move = a0;
show->contestLiveUpdates.move = move;
}
}
void ContestLiveUpdates_BeforeInterview_5(u8 a0, u8 a1)
void ContestLiveUpdates_SetLoserData(u8 flag, u8 loser)
{
TVShow *show;
@ -1457,21 +1457,21 @@ void ContestLiveUpdates_BeforeInterview_5(u8 a0, u8 a1)
sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1)
{
show->contestLiveUpdates.winningSpecies = gContestMons[a1].species;
StringCopy(show->contestLiveUpdates.winningTrainerName, gContestMons[a1].trainerName);
StripExtCtrlCodes(show->contestLiveUpdates.winningTrainerName);
show->contestLiveUpdates.appealFlags2 = a0;
if (a1 + 1 > gNumLinkContestPlayers)
show->contestLiveUpdates.losingSpecies = gContestMons[loser].species;
StringCopy(show->contestLiveUpdates.losingTrainerName, gContestMons[loser].trainerName);
StripExtCtrlCodes(show->contestLiveUpdates.losingTrainerName);
show->contestLiveUpdates.loserAppealFlag = flag;
if (loser + 1 > gNumLinkContestPlayers)
{
show->contestLiveUpdates.winningTrainerLanguage = gLinkPlayers[0].language;
show->contestLiveUpdates.losingTrainerLanguage = gLinkPlayers[0].language;
}
else if (gGameLanguage == LANGUAGE_JAPANESE || gLinkPlayers[a1].language == LANGUAGE_JAPANESE)
else if (gGameLanguage == LANGUAGE_JAPANESE || gLinkPlayers[loser].language == LANGUAGE_JAPANESE)
{
show->contestLiveUpdates.winningTrainerLanguage = LANGUAGE_JAPANESE;
show->contestLiveUpdates.losingTrainerLanguage = LANGUAGE_JAPANESE;
}
else
{
show->contestLiveUpdates.winningTrainerLanguage = gLinkPlayers[a1].language;
show->contestLiveUpdates.losingTrainerLanguage = gLinkPlayers[loser].language;
}
}
}
@ -3804,10 +3804,10 @@ static void sub_80F0708(void) // FIXME: register allocation shenanigans
switch (gSaveBlock1Ptr->tvShows[i].common.kind)
{
case TVSHOW_CONTEST_LIVE_UPDATES:
j = (&gSaveBlock1Ptr->tvShows[i])->contestLiveUpdates.species;
sub_80F0B24(j, i);
j = (&gSaveBlock1Ptr->tvShows[i])->contestLiveUpdates.winningSpecies;
sub_80F0B24(j, i);
j = (&gSaveBlock1Ptr->tvShows[i])->contestLiveUpdates.losingSpecies;
sub_80F0B24(j, i);
break;
case TVSHOW_3_CHEERS_FOR_POKEBLOCKS:
break;
@ -4301,8 +4301,8 @@ static void sub_80F12A4(TVShow *shows)
curShow->bravoTrainerTower.pokemonNameLanguage = TV_GetStringLanguage(curShow->bravoTrainerTower.pokemonName);
break;
case TVSHOW_CONTEST_LIVE_UPDATES:
curShow->contestLiveUpdates.language = TV_GetStringLanguage(curShow->contestLiveUpdates.playerName);
curShow->contestLiveUpdates.winningTrainerLanguage = TV_GetStringLanguage(curShow->contestLiveUpdates.winningTrainerName);
curShow->contestLiveUpdates.losingTrainerLanguage = TV_GetStringLanguage(curShow->contestLiveUpdates.losingTrainerName);
break;
case TVSHOW_3_CHEERS_FOR_POKEBLOCKS:
curShow->threeCheers.language = TV_GetStringLanguage(curShow->threeCheers.playerName);
@ -5167,6 +5167,12 @@ static void DoTVShowPokemonNewsMassOutbreak(void)
ShowFieldMessage(sTVMassOutbreakTextGroup[sTVShowState]);
}
// TV Show that plays after a Link Contest.
// First talks about the winner and something they did, then about a losing player and something they did
// The show is only generated when the player wins, but can be record mixed to other games
// Each state buffers any needed data for a message to print from sTVContestLiveUpdatesTextGroup
// Many cases in this function are identical, and its size can be reduced a good deal by collapsing them
// Can't get this to match while collapsing them though
static void DoTVShowPokemonContestLiveUpdates(void)
{
TVShow *show;
@ -5177,339 +5183,338 @@ static void DoTVShowPokemonContestLiveUpdates(void)
state = sTVShowState;
switch (state)
{
case 0:
BufferContestName(gStringVar1, show->contestLiveUpdates.category);
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
TVShowConvertInternationalString(gStringVar3, show->contestLiveUpdates.playerName, show->contestLiveUpdates.language);
if (show->contestLiveUpdates.round1Rank == show->contestLiveUpdates.round2Rank)
case CONTESTLIVE_STATE_INTRO:
BufferContestName(gStringVar1, show->contestLiveUpdates.category);
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
TVShowConvertInternationalString(gStringVar3, show->contestLiveUpdates.winningTrainerName, show->contestLiveUpdates.winningTrainerLanguage);
if (show->contestLiveUpdates.round1Placing == show->contestLiveUpdates.round2Placing)
{
if (show->contestLiveUpdates.round1Placing == 0)
{
if (show->contestLiveUpdates.round1Rank == 0)
{
sTVShowState = 1;
}
else
{
sTVShowState = 3;
}
}
else if (show->contestLiveUpdates.round1Rank > show->contestLiveUpdates.round2Rank)
{
sTVShowState = 2;
sTVShowState = CONTESTLIVE_STATE_WON_BOTH_ROUNDS;
}
else
{
sTVShowState = 4;
sTVShowState = CONTESTLIVE_STATE_EQUAL_ROUNDS;
}
}
else if (show->contestLiveUpdates.round1Placing > show->contestLiveUpdates.round2Placing)
{
sTVShowState = CONTESTLIVE_STATE_BETTER_ROUND2;
}
else
{
sTVShowState = CONTESTLIVE_STATE_BETTER_ROUND1;
}
break;
case CONTESTLIVE_STATE_WON_BOTH_ROUNDS:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
switch (show->contestLiveUpdates.winnerAppealFlag)
{
case CONTESTLIVE_FLAG_EXCITING_APPEAL:
sTVShowState = CONTESTLIVE_STATE_EXCITING_APPEAL;
break;
case 1:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
switch (show->contestLiveUpdates.appealFlags1)
{
case 0x01:
sTVShowState = 8;
break;
case 0x02:
sTVShowState = 5;
break;
case 0x04:
sTVShowState = 14;
break;
case 0x08:
sTVShowState = 7;
break;
case 0x10:
sTVShowState = 6;
break;
case 0x20:
sTVShowState = 20;
break;
case 0x40:
sTVShowState = 21;
break;
case 0x80:
sTVShowState = 22;
break;
}
case CONTESTLIVE_FLAG_GOT_NERVOUS:
sTVShowState = CONTESTLIVE_STATE_GOT_NERVOUS;
break;
case 2:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
switch (show->contestLiveUpdates.appealFlags1)
{
case 0x01:
sTVShowState = 8;
break;
case 0x02:
sTVShowState = 5;
break;
case 0x04:
sTVShowState = 14;
break;
case 0x08:
sTVShowState = 7;
break;
case 0x10:
sTVShowState = 6;
break;
case 0x20:
sTVShowState = 20;
break;
case 0x40:
sTVShowState = 21;
break;
case 0x80:
sTVShowState = 22;
break;
}
case CONTESTLIVE_FLAG_MAXED_EXCITEMENT:
sTVShowState = CONTESTLIVE_STATE_VERY_EXCITING_APPEAL;
break;
case 3:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
TVShowConvertInternationalString(gStringVar3, show->contestLiveUpdates.playerName, show->contestLiveUpdates.language);
switch (show->contestLiveUpdates.appealFlags1)
{
case 0x01:
sTVShowState = 8;
break;
case 0x02:
sTVShowState = 5;
break;
case 0x04:
sTVShowState = 14;
break;
case 0x08:
sTVShowState = 7;
break;
case 0x10:
sTVShowState = 6;
break;
case 0x20:
sTVShowState = 20;
break;
case 0x40:
sTVShowState = 21;
break;
case 0x80:
sTVShowState = 22;
break;
}
case CONTESTLIVE_FLAG_USED_COMBO:
sTVShowState = CONTESTLIVE_STATE_USED_COMBO;
break;
case 4:
switch (show->contestLiveUpdates.category)
{
case 0:
StringCopy(gStringVar1, gText_Cool);
break;
case 1:
StringCopy(gStringVar1, gText_Beauty);
break;
case 2:
StringCopy(gStringVar1, gText_Cute);
break;
case 3:
StringCopy(gStringVar1, gText_Smart);
break;
case 4:
StringCopy(gStringVar1, gText_Tough);
break;
}
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
switch (show->contestLiveUpdates.appealFlags1)
{
case 0x01:
sTVShowState = 8;
break;
case 0x02:
sTVShowState = 5;
break;
case 0x04:
sTVShowState = 14;
break;
case 0x08:
sTVShowState = 7;
break;
case 0x10:
sTVShowState = 6;
break;
case 0x20:
sTVShowState = 20;
break;
case 0x40:
sTVShowState = 21;
break;
case 0x80:
sTVShowState = 22;
break;
}
case CONTESTLIVE_FLAG_STARTLED_OTHER:
sTVShowState = CONTESTLIVE_STATE_STARTLED_OTHER;
break;
case 5:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
sTVShowState = 23;
case CONTESTLIVE_FLAG_SKIPPED_TURN:
sTVShowState = CONTESTLIVE_STATE_TOOK_BREAK;
break;
case 6:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
sTVShowState = 23;
case CONTESTLIVE_FLAG_GOT_STARTLED:
sTVShowState = CONTESTLIVE_STATE_GOT_STARTLED;
break;
case 7:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
sTVShowState = 23;
case CONTESTLIVE_FLAG_MADE_APPEAL:
sTVShowState = CONTESTLIVE_STATE_USED_MOVE;
break;
case 8:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
switch (show->contestLiveUpdates.category)
{
case 0:
sTVShowState = 9;
break;
case 1:
sTVShowState = 10;
break;
case 2:
sTVShowState = 11;
break;
case 3:
sTVShowState = 12;
break;
case 4:
sTVShowState = 13;
break;
}
}
break;
case CONTESTLIVE_STATE_BETTER_ROUND2:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
switch (show->contestLiveUpdates.winnerAppealFlag)
{
case CONTESTLIVE_FLAG_EXCITING_APPEAL:
sTVShowState = CONTESTLIVE_STATE_EXCITING_APPEAL;
break;
case 9:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
sTVShowState = 23;
case CONTESTLIVE_FLAG_GOT_NERVOUS:
sTVShowState = CONTESTLIVE_STATE_GOT_NERVOUS;
break;
case 10:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
sTVShowState = 23;
case CONTESTLIVE_FLAG_MAXED_EXCITEMENT:
sTVShowState = CONTESTLIVE_STATE_VERY_EXCITING_APPEAL;
break;
case 11:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
sTVShowState = 23;
case CONTESTLIVE_FLAG_USED_COMBO:
sTVShowState = CONTESTLIVE_STATE_USED_COMBO;
break;
case 12:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
sTVShowState = 23;
case CONTESTLIVE_FLAG_STARTLED_OTHER:
sTVShowState = CONTESTLIVE_STATE_STARTLED_OTHER;
break;
case 13:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
sTVShowState = 23;
case CONTESTLIVE_FLAG_SKIPPED_TURN:
sTVShowState = CONTESTLIVE_STATE_TOOK_BREAK;
break;
case 14:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
switch (show->contestLiveUpdates.category)
{
case 0:
sTVShowState = 15;
break;
case 1:
sTVShowState = 16;
break;
case 2:
sTVShowState = 17;
break;
case 3:
sTVShowState = 18;
break;
case 4:
sTVShowState = 19;
break;
}
case CONTESTLIVE_FLAG_GOT_STARTLED:
sTVShowState = CONTESTLIVE_STATE_GOT_STARTLED;
break;
case 15:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
sTVShowState = 23;
case CONTESTLIVE_FLAG_MADE_APPEAL:
sTVShowState = CONTESTLIVE_STATE_USED_MOVE;
break;
case 16:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
sTVShowState = 23;
}
break;
case CONTESTLIVE_STATE_EQUAL_ROUNDS:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
TVShowConvertInternationalString(gStringVar3, show->contestLiveUpdates.winningTrainerName, show->contestLiveUpdates.winningTrainerLanguage);
switch (show->contestLiveUpdates.winnerAppealFlag)
{
case CONTESTLIVE_FLAG_EXCITING_APPEAL:
sTVShowState = CONTESTLIVE_STATE_EXCITING_APPEAL;
break;
case 17:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
sTVShowState = 23;
case CONTESTLIVE_FLAG_GOT_NERVOUS:
sTVShowState = CONTESTLIVE_STATE_GOT_NERVOUS;
break;
case 18:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
sTVShowState = 23;
case CONTESTLIVE_FLAG_MAXED_EXCITEMENT:
sTVShowState = CONTESTLIVE_STATE_VERY_EXCITING_APPEAL;
break;
case 19:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
sTVShowState = 23;
case CONTESTLIVE_FLAG_USED_COMBO:
sTVShowState = CONTESTLIVE_STATE_USED_COMBO;
break;
case 20:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
sTVShowState = 23;
case CONTESTLIVE_FLAG_STARTLED_OTHER:
sTVShowState = CONTESTLIVE_STATE_STARTLED_OTHER;
break;
case 21:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
sTVShowState = 23;
case CONTESTLIVE_FLAG_SKIPPED_TURN:
sTVShowState = CONTESTLIVE_STATE_TOOK_BREAK;
break;
case 22:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
StringCopy(gStringVar3, gMoveNames[show->contestLiveUpdates.move]);
sTVShowState = 23;
case CONTESTLIVE_FLAG_GOT_STARTLED:
sTVShowState = CONTESTLIVE_STATE_GOT_STARTLED;
break;
case 23:
StringCopy(gStringVar1, gSpeciesNames[show->contestLiveUpdates.species]);
TVShowConvertInternationalString(gStringVar2, show->contestLiveUpdates.winningTrainerName, show->contestLiveUpdates.winningTrainerLanguage);
StringCopy(gStringVar3, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
switch (show->contestLiveUpdates.appealFlags2)
{
case 0x01:
sTVShowState = 31;
break;
case 0x02:
sTVShowState = 30;
break;
case 0x04:
sTVShowState = 29;
break;
case 0x08:
sTVShowState = 28;
break;
case 0x10:
sTVShowState = 27;
break;
case 0x20:
sTVShowState = 26;
break;
case 0x40:
sTVShowState = 25;
break;
case 0x80:
sTVShowState = 24;
break;
}
case CONTESTLIVE_FLAG_MADE_APPEAL:
sTVShowState = CONTESTLIVE_STATE_USED_MOVE;
break;
case 24:
StringCopy(gStringVar1, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
sTVShowState = 32;
}
break;
case CONTESTLIVE_STATE_BETTER_ROUND1:
switch (show->contestLiveUpdates.category)
{
case CONTEST_CATEGORY_COOL:
StringCopy(gStringVar1, gText_Cool);
break;
case 25:
TVShowConvertInternationalString(gStringVar1, show->contestLiveUpdates.winningTrainerName, show->contestLiveUpdates.winningTrainerLanguage);
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
sTVShowState = 32;
case CONTEST_CATEGORY_BEAUTY:
StringCopy(gStringVar1, gText_Beauty);
break;
case 28:
sTVShowState = 32;
case CONTEST_CATEGORY_CUTE:
StringCopy(gStringVar1, gText_Cute);
break;
case 29:
TVShowConvertInternationalString(gStringVar1, show->contestLiveUpdates.playerName, show->contestLiveUpdates.language);
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
TVShowConvertInternationalString(gStringVar3, show->contestLiveUpdates.winningTrainerName, show->contestLiveUpdates.winningTrainerLanguage);
sTVShowState = 32;
case CONTEST_CATEGORY_SMART:
StringCopy(gStringVar1, gText_Smart);
break;
case 26:
case 27:
case 30:
case 31:
TVShowConvertInternationalString(gStringVar1, show->contestLiveUpdates.winningTrainerName, show->contestLiveUpdates.winningTrainerLanguage);
sTVShowState = 32;
case CONTEST_CATEGORY_TOUGH:
StringCopy(gStringVar1, gText_Tough);
break;
case 32:
TVShowConvertInternationalString(gStringVar1, show->contestLiveUpdates.playerName, show->contestLiveUpdates.language);
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]);
TVShowDone();
}
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
switch (show->contestLiveUpdates.winnerAppealFlag)
{
case CONTESTLIVE_FLAG_EXCITING_APPEAL:
sTVShowState = CONTESTLIVE_STATE_EXCITING_APPEAL;
break;
case CONTESTLIVE_FLAG_GOT_NERVOUS:
sTVShowState = CONTESTLIVE_STATE_GOT_NERVOUS;
break;
case CONTESTLIVE_FLAG_MAXED_EXCITEMENT:
sTVShowState = CONTESTLIVE_STATE_VERY_EXCITING_APPEAL;
break;
case CONTESTLIVE_FLAG_USED_COMBO:
sTVShowState = CONTESTLIVE_STATE_USED_COMBO;
break;
case CONTESTLIVE_FLAG_STARTLED_OTHER:
sTVShowState = CONTESTLIVE_STATE_STARTLED_OTHER;
break;
case CONTESTLIVE_FLAG_SKIPPED_TURN:
sTVShowState = CONTESTLIVE_STATE_TOOK_BREAK;
break;
case CONTESTLIVE_FLAG_GOT_STARTLED:
sTVShowState = CONTESTLIVE_STATE_GOT_STARTLED;
break;
case CONTESTLIVE_FLAG_MADE_APPEAL:
sTVShowState = CONTESTLIVE_STATE_USED_MOVE;
break;
}
break;
case CONTESTLIVE_STATE_GOT_NERVOUS:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER;
break;
case CONTESTLIVE_STATE_STARTLED_OTHER:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER;
break;
case CONTESTLIVE_STATE_USED_COMBO:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER;
break;
case CONTESTLIVE_STATE_EXCITING_APPEAL:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
switch (show->contestLiveUpdates.category)
{
case CONTEST_CATEGORY_COOL:
sTVShowState = CONTESTLIVE_STATE_COOL;
break;
case CONTEST_CATEGORY_BEAUTY:
sTVShowState = CONTESTLIVE_STATE_BEAUTIFUL;
break;
case CONTEST_CATEGORY_CUTE:
sTVShowState = CONTESTLIVE_STATE_CUTE;
break;
case CONTEST_CATEGORY_SMART:
sTVShowState = CONTESTLIVE_STATE_SMART;
break;
case CONTEST_CATEGORY_TOUGH:
sTVShowState = CONTESTLIVE_STATE_TOUGH;
break;
}
break;
case CONTESTLIVE_STATE_COOL:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER;
break;
case CONTESTLIVE_STATE_BEAUTIFUL:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER;
break;
case CONTESTLIVE_STATE_CUTE:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER;
break;
case CONTESTLIVE_STATE_SMART:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER;
break;
case CONTESTLIVE_STATE_TOUGH:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER;
break;
case CONTESTLIVE_STATE_VERY_EXCITING_APPEAL:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
switch (show->contestLiveUpdates.category)
{
case CONTEST_CATEGORY_COOL:
sTVShowState = CONTESTLIVE_STATE_VERY_COOL;
break;
case CONTEST_CATEGORY_BEAUTY:
sTVShowState = CONTESTLIVE_STATE_VERY_BEAUTIFUL;
break;
case CONTEST_CATEGORY_CUTE:
sTVShowState = CONTESTLIVE_STATE_VERY_CUTE;
break;
case CONTEST_CATEGORY_SMART:
sTVShowState = CONTESTLIVE_STATE_VERY_SMART;
break;
case CONTEST_CATEGORY_TOUGH:
sTVShowState = CONTESTLIVE_STATE_VERY_TOUGH;
break;
}
break;
case CONTESTLIVE_STATE_VERY_COOL:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER;
break;
case CONTESTLIVE_STATE_VERY_BEAUTIFUL:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER;
break;
case CONTESTLIVE_STATE_VERY_CUTE:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER;
break;
case CONTESTLIVE_STATE_VERY_SMART:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER;
break;
case CONTESTLIVE_STATE_VERY_TOUGH:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER;
break;
case CONTESTLIVE_STATE_TOOK_BREAK:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER;
break;
case CONTESTLIVE_STATE_GOT_STARTLED:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER;
break;
case CONTESTLIVE_STATE_USED_MOVE:
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
StringCopy(gStringVar3, gMoveNames[show->contestLiveUpdates.move]);
sTVShowState = CONTESTLIVE_STATE_TALK_ABOUT_LOSER;
break;
case CONTESTLIVE_STATE_TALK_ABOUT_LOSER:
StringCopy(gStringVar1, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
TVShowConvertInternationalString(gStringVar2, show->contestLiveUpdates.losingTrainerName, show->contestLiveUpdates.losingTrainerLanguage);
StringCopy(gStringVar3, gSpeciesNames[show->contestLiveUpdates.losingSpecies]);
switch (show->contestLiveUpdates.loserAppealFlag)
{
case CONTESTLIVE_FLAG_LOST:
sTVShowState = CONTESTLIVE_STATE_LOST;
break;
case CONTESTLIVE_FLAG_REPEATED_MOVE:
sTVShowState = CONTESTLIVE_STATE_REPEATED_APPEALS;
break;
case CONTESTLIVE_FLAG_LOST_SMALL_MARGIN:
sTVShowState = CONTESTLIVE_STATE_LOST_SMALL_MARGIN;
break;
case CONTESTLIVE_FLAG_NO_EXCITEMENT:
sTVShowState = CONTESTLIVE_STATE_NO_EXCITING_APPEALS;
break;
case CONTESTLIVE_FLAG_BLEW_LEAD:
sTVShowState = CONTESTLIVE_STATE_LOST_AFTER_ROUND1_WIN;
break;
case CONTESTLIVE_FLAG_MISSED_EXCITEMENT:
sTVShowState = CONTESTLIVE_STATE_NOT_EXCITING_ENOUGH;
break;
case CONTESTLIVE_FLAG_LAST_BOTH_ROUNDS:
sTVShowState = CONTESTLIVE_STATE_LAST_BOTH;
break;
case CONTESTLIVE_FLAG_NO_APPEALS:
sTVShowState = CONTESTLIVE_STATE_NO_APPEALS;
break;
}
break;
case CONTESTLIVE_STATE_NO_APPEALS:
StringCopy(gStringVar1, gSpeciesNames[show->contestLiveUpdates.losingSpecies]);
sTVShowState = CONTESTLIVE_STATE_OUTRO;
break;
case CONTESTLIVE_STATE_LAST_BOTH:
TVShowConvertInternationalString(gStringVar1, show->contestLiveUpdates.losingTrainerName, show->contestLiveUpdates.losingTrainerLanguage);
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.losingSpecies]);
sTVShowState = CONTESTLIVE_STATE_OUTRO;
break;
case CONTESTLIVE_STATE_NO_EXCITING_APPEALS:
sTVShowState = CONTESTLIVE_STATE_OUTRO;
break;
case CONTESTLIVE_STATE_LOST_SMALL_MARGIN:
TVShowConvertInternationalString(gStringVar1, show->contestLiveUpdates.winningTrainerName, show->contestLiveUpdates.winningTrainerLanguage);
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
TVShowConvertInternationalString(gStringVar3, show->contestLiveUpdates.losingTrainerName, show->contestLiveUpdates.losingTrainerLanguage);
sTVShowState = CONTESTLIVE_STATE_OUTRO;
break;
case CONTESTLIVE_STATE_NOT_EXCITING_ENOUGH:
case CONTESTLIVE_STATE_LOST_AFTER_ROUND1_WIN:
case CONTESTLIVE_STATE_REPEATED_APPEALS:
case CONTESTLIVE_STATE_LOST:
TVShowConvertInternationalString(gStringVar1, show->contestLiveUpdates.losingTrainerName, show->contestLiveUpdates.losingTrainerLanguage);
sTVShowState = CONTESTLIVE_STATE_OUTRO;
break;
case CONTESTLIVE_STATE_OUTRO:
TVShowConvertInternationalString(gStringVar1, show->contestLiveUpdates.winningTrainerName, show->contestLiveUpdates.winningTrainerLanguage);
StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.winningSpecies]);
TVShowDone();
break;
}
ShowFieldMessage(sTVContestLiveUpdatesTextGroup[state]);
}

View File

@ -32,7 +32,7 @@
#include "random.h"
#include "save_location.h"
#include "script.h"
#include "script_pokemon_util_80F87D8.h"
#include "script_pokemon_util.h"
#include "sound.h"
#include "start_menu.h"
#include "string_util.h"
@ -1483,7 +1483,7 @@ static void Task_ExchangeCards(u8 taskId)
{
case 0:
if (GetMultiplayerId() == 0)
sub_800A4D8(2);
SendBlockRequest(2);
gTasks[taskId].data[0]++;
break;
case 1:
@ -1759,7 +1759,7 @@ static void Task_RunScriptAndFadeToActivity(u8 taskId)
}
else
{
sub_800ADF8();
SetLinkStandbyCallback();
data[0] = 3;
}
}
@ -1795,7 +1795,7 @@ static void Task_RunScriptAndFadeToActivity(u8 taskId)
DestroyTask(taskId);
break;
case 7:
sub_800AC34();
SetCloseLinkCallback();
data[0] = 8;
break;
case 8:
@ -2018,7 +2018,7 @@ static void Task_MEvent_Leader(u8 taskId)
Free(data->field_8);
Free(data->field_0);
Free(data->field_4);
sub_800ADF8();
SetLinkStandbyCallback();
data->state++;
break;
case 17:
@ -2188,7 +2188,7 @@ static void Task_CardOrNewsWithFriend(u8 taskId)
break;
case 11:
data->state++;
sub_800ADF8();
SetLinkStandbyCallback();
break;
case 12:
if (IsLinkTaskFinished())
@ -2367,7 +2367,7 @@ static void Task_CardOrNewsOverWireless(u8 taskId)
break;
case 13:
data->state++;
sub_800ADF8();
SetLinkStandbyCallback();
break;
case 14:
if (IsLinkTaskFinished())
@ -2714,7 +2714,7 @@ static void Task_RunUnionRoom(u8 taskId)
}
break;
case UR_STATE_REQUEST_DECLINED:
sub_800AC34();
SetCloseLinkCallback();
uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG;
break;
case UR_STATE_SEND_TRADE_REQUST:
@ -2763,7 +2763,7 @@ static void Task_RunUnionRoom(u8 taskId)
if (PrintOnTextbox(&uroom->textState, gStringVar4))
{
uroom->state = UR_STATE_WAIT_FINISH_READING_CARD;
sub_800ADF8();
SetLinkStandbyCallback();
uroom->partnerYesNoResponse = 0;
uroom->recvActivityRequest[0] = 0;
}
@ -2940,7 +2940,7 @@ static void Task_RunUnionRoom(u8 taskId)
}
break;
case UR_STATE_DECLINE_ACTIVITY_REQUEST:
sub_800AC34();
SetCloseLinkCallback();
uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG;
break;
case UR_STATE_CANCEL_REQUEST_PRINT_MSG:
@ -2962,7 +2962,7 @@ static void Task_RunUnionRoom(u8 taskId)
ScheduleFieldMessageWithFollowupState(UR_STATE_START_ACTIVITY_LINK, gStringVar4);
break;
case UR_STATE_START_ACTIVITY_LINK:
sub_800ADF8();
SetLinkStandbyCallback();
uroom->state = UR_STATE_START_ACTIVITY_WAIT_FOR_LINK;
break;
case UR_STATE_START_ACTIVITY_WAIT_FOR_LINK:
@ -3231,7 +3231,7 @@ static bool32 UnionRoom_HandleContactFromOtherPlayer(struct WirelessLink_URoom *
else if (id == 2) // No activity
{
uroom->state = UR_STATE_CANCEL_REQUEST_PRINT_MSG;
sub_800AC34();
SetCloseLinkCallback();
return FALSE;
}
}

View File

@ -174,7 +174,7 @@ void CB2_UnionRoomBattle(void)
}
else
{
sub_800AC34();
SetCloseLinkCallback();
if (gBlockRecvBuffer[GetMultiplayerId()][0] == (ACTIVITY_DECLINE | IN_UNION_ROOM))
{
gMain.state = 6;
@ -190,7 +190,7 @@ void CB2_UnionRoomBattle(void)
case 50:
if (!UpdatePaletteFade())
{
sub_800ADF8();
SetLinkStandbyCallback();
gMain.state++;
}
break;

View File

@ -1267,7 +1267,7 @@ static void Chat_Exit(void)
case 5:
if (IsLinkTaskFinished() && !sub_8011A9C())
{
sub_800AC34();
SetCloseLinkCallback();
sChat->exitDelayTimer = 0;
sChat->funcState++;
}
@ -1302,7 +1302,7 @@ static void Chat_Drop(void)
case 1:
if (!IsDisplaySubtaskActive(0) && IsLinkTaskFinished() && !sub_8011A9C())
{
sub_800AC34();
SetCloseLinkCallback();
sChat->exitDelayTimer = 0;
sChat->funcState++;
}
@ -1348,7 +1348,7 @@ static void Chat_Disbanded(void)
case 2:
if (IsDisplaySubtaskActive(0) != TRUE && IsLinkTaskFinished() && !sub_8011A9C())
{
sub_800AC34();
SetCloseLinkCallback();
sChat->exitDelayTimer = 0;
sChat->funcState++;
}