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
76 changed files with 4369 additions and 4251 deletions
+4 -4
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;
+1 -1
View File
@@ -849,7 +849,7 @@ void AnimTask_MetallicShine(u8 taskId)
if (IsContest())
{
species = gContestResources->field_18->species;
species = gContestResources->moveAnim->species;
}
else
{
+9 -9
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;
+15 -15
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)
{
+3 -3
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];
+3 -3
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
{
+2 -2
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;
}
+1 -1
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"
+4 -4
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
{
+7 -7
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]++;
+1 -1
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"
+2 -2
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)
+8 -8
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;
+15 -15
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)
+15 -15
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;
}
+1799 -1546
View File
File diff suppressed because it is too large Load Diff
+66 -63
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;
+237 -237
View File
File diff suppressed because it is too large Load Diff
+172 -157
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;
}
+105 -92
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]++;
}
+555 -69
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;
}
-96
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
}
+4 -4
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;
+2 -2
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:
+3 -3
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;
+2 -2
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();
+1 -1
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"
+2 -2
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");
+78 -78
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;
}
}
+56 -53
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]++;
}
}
+2 -2
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:
+2 -2
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;
+1 -1
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"
+2 -2
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);
}
}
}
+1 -1
View File
@@ -1463,7 +1463,7 @@ static bool32 sub_802BC60(void)
case 4:
if (!gPaletteFade.active)
{
sub_800AC34();
SetCloseLinkCallback();
gUnknown_02022CFC->unkA++;
}
break;
+1 -1
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"
+3 -3
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:
+3 -3
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:
+2 -2
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
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();
}
-725
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();
}
+23 -23
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;
+2 -2
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);
+367 -362
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]);
}
+12 -12
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;
}
}
+2 -2
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;
+3 -3
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++;
}