2017-10-03 04:02:22 +02:00
|
|
|
#include "global.h"
|
2019-09-09 03:07:54 +02:00
|
|
|
#include "malloc.h"
|
2018-02-12 02:12:40 +01:00
|
|
|
#include "random.h"
|
|
|
|
#include "constants/items.h"
|
2017-11-07 05:03:11 +01:00
|
|
|
#include "text.h"
|
2017-11-07 05:20:11 +01:00
|
|
|
#include "item.h"
|
2017-11-04 01:59:29 +01:00
|
|
|
#include "task.h"
|
2017-11-07 05:33:39 +01:00
|
|
|
#include "save.h"
|
|
|
|
#include "load_save.h"
|
2017-11-04 23:48:13 +01:00
|
|
|
#include "pokemon.h"
|
2017-11-04 01:59:29 +01:00
|
|
|
#include "cable_club.h"
|
2017-11-04 02:56:18 +01:00
|
|
|
#include "link.h"
|
2018-05-20 10:51:09 +02:00
|
|
|
#include "link_rfu.h"
|
2017-11-04 02:56:18 +01:00
|
|
|
#include "tv.h"
|
|
|
|
#include "battle_tower.h"
|
2017-11-04 15:15:58 +01:00
|
|
|
#include "window.h"
|
2017-11-04 02:56:18 +01:00
|
|
|
#include "mystery_event_script.h"
|
2017-11-04 03:07:36 +01:00
|
|
|
#include "secret_base.h"
|
|
|
|
#include "mauville_old_man.h"
|
2017-11-04 15:15:58 +01:00
|
|
|
#include "sound.h"
|
2018-02-12 02:12:40 +01:00
|
|
|
#include "constants/songs.h"
|
|
|
|
#include "menu.h"
|
2017-11-04 15:15:58 +01:00
|
|
|
#include "overworld.h"
|
2018-12-08 22:05:11 +01:00
|
|
|
#include "field_screen_effect.h"
|
2018-12-20 04:19:54 +01:00
|
|
|
#include "fldeff_misc.h"
|
2017-11-04 15:15:58 +01:00
|
|
|
#include "script.h"
|
|
|
|
#include "event_data.h"
|
2017-11-05 00:03:41 +01:00
|
|
|
#include "lilycove_lady.h"
|
2017-11-04 15:15:58 +01:00
|
|
|
#include "strings.h"
|
2017-11-04 15:55:39 +01:00
|
|
|
#include "string_util.h"
|
2017-11-04 01:59:29 +01:00
|
|
|
#include "record_mixing.h"
|
2018-05-19 14:30:41 +02:00
|
|
|
#include "new_game.h"
|
2018-05-25 21:00:41 +02:00
|
|
|
#include "daycare.h"
|
|
|
|
#include "international_string_util.h"
|
2018-10-28 21:11:53 +01:00
|
|
|
#include "constants/battle_frontier.h"
|
2019-03-02 09:18:08 +01:00
|
|
|
#include "dewford_trend.h"
|
2017-10-03 04:02:22 +02:00
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
|
2017-10-03 04:02:22 +02:00
|
|
|
// Static type declarations
|
|
|
|
|
2018-10-28 21:11:53 +01:00
|
|
|
struct RecordMixingHallRecords
|
2018-05-26 00:25:36 +02:00
|
|
|
{
|
2018-10-28 21:11:53 +01:00
|
|
|
struct RankingHall1P hallRecords1P[HALL_FACILITIES_COUNT][2][6];
|
|
|
|
struct RankingHall2P hallRecords2P[2][6];
|
2018-05-26 00:25:36 +02:00
|
|
|
};
|
|
|
|
|
2018-05-22 21:54:57 +02:00
|
|
|
struct PlayerRecordsRS
|
|
|
|
{
|
2019-04-05 23:11:24 +02:00
|
|
|
struct SecretBase secretBases[SECRET_BASES_COUNT];
|
2018-05-26 00:25:36 +02:00
|
|
|
TVShow tvShows[TV_SHOWS_COUNT];
|
|
|
|
PokeNews pokeNews[POKE_NEWS_COUNT];
|
2017-11-07 05:20:11 +01:00
|
|
|
OldMan oldMan;
|
2021-03-31 21:53:01 +02:00
|
|
|
struct DewfordTrend dewfordTrends[SAVED_TRENDS_COUNT];
|
2018-05-22 21:54:57 +02:00
|
|
|
struct RecordMixingDayCareMail dayCareMail;
|
2017-11-07 05:20:11 +01:00
|
|
|
struct RSBattleTowerRecord battleTowerRecord;
|
2018-10-22 19:22:57 +02:00
|
|
|
u16 giftItem;
|
2017-11-07 05:20:11 +01:00
|
|
|
u16 filler11C8[0x32];
|
|
|
|
};
|
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
struct PlayerRecordsEmerald
|
2018-05-22 21:54:57 +02:00
|
|
|
{
|
2019-04-05 23:11:24 +02:00
|
|
|
/* 0x0000 */ struct SecretBase secretBases[SECRET_BASES_COUNT];
|
2018-05-26 00:25:36 +02:00
|
|
|
/* 0x0c80 */ TVShow tvShows[TV_SHOWS_COUNT];
|
|
|
|
/* 0x1004 */ PokeNews pokeNews[POKE_NEWS_COUNT];
|
2017-11-04 14:39:41 +01:00
|
|
|
/* 0x1044 */ OldMan oldMan;
|
2021-03-31 21:53:01 +02:00
|
|
|
/* 0x1084 */ struct DewfordTrend dewfordTrends[SAVED_TRENDS_COUNT];
|
2018-05-22 21:54:57 +02:00
|
|
|
/* 0x10ac */ struct RecordMixingDayCareMail dayCareMail;
|
2018-05-26 00:25:36 +02:00
|
|
|
/* 0x1124 */ struct EmeraldBattleTowerRecord battleTowerRecord;
|
2018-10-22 19:22:57 +02:00
|
|
|
/* 0x1210 */ u16 giftItem;
|
2017-11-04 14:39:41 +01:00
|
|
|
/* 0x1214 */ LilycoveLady lilycoveLady;
|
2019-11-21 01:00:08 +01:00
|
|
|
/* 0x1254 */ struct Apprentice apprentices[2];
|
2018-10-28 21:11:53 +01:00
|
|
|
/* 0x12dc */ struct PlayerHallRecords hallRecords;
|
2018-05-25 21:00:41 +02:00
|
|
|
/* 0x1434 */ u8 field_1434[0x10];
|
2018-05-26 00:25:36 +02:00
|
|
|
}; // 0x1444
|
|
|
|
|
|
|
|
union PlayerRecords
|
|
|
|
{
|
|
|
|
struct PlayerRecordsRS ruby;
|
|
|
|
struct PlayerRecordsEmerald emerald;
|
|
|
|
};
|
2017-11-04 02:56:18 +01:00
|
|
|
|
2017-10-03 04:02:22 +02:00
|
|
|
// Static RAM declarations
|
|
|
|
|
2019-06-26 22:23:00 +02:00
|
|
|
static bool8 gUnknown_03001130;
|
|
|
|
static struct SecretBase *sSecretBasesSave;
|
|
|
|
static TVShow *sTvShowsSave;
|
|
|
|
static PokeNews *sPokeNewsSave;
|
|
|
|
static OldMan *sOldManSave;
|
2021-03-31 21:53:01 +02:00
|
|
|
static struct DewfordTrend *sDewfordTrendsSave;
|
2019-06-26 22:23:00 +02:00
|
|
|
static struct RecordMixingDayCareMail *gUnknown_03001148;
|
|
|
|
static void *sBattleTowerSave;
|
|
|
|
static LilycoveLady *sLilycoveLadySave;
|
|
|
|
static void *sApprenticesSave;
|
|
|
|
static void *sBattleTowerSave_Duplicate;
|
|
|
|
static u32 sRecordStructSize;
|
|
|
|
static u8 gUnknown_03001160;
|
|
|
|
static struct PlayerHallRecords *gUnknown_03001168[3];
|
2018-05-26 00:25:36 +02:00
|
|
|
|
|
|
|
static EWRAM_DATA struct RecordMixingDayCareMail gUnknown_02039F9C = {0};
|
|
|
|
static EWRAM_DATA union PlayerRecords *sReceivedRecords = NULL;
|
|
|
|
static EWRAM_DATA union PlayerRecords *sSentRecord = NULL;
|
2017-11-04 01:59:29 +01:00
|
|
|
|
2017-10-03 04:02:22 +02:00
|
|
|
// Static ROM declarations
|
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void Task_RecordMixing_Main(u8 taskId);
|
2019-02-11 02:42:50 +01:00
|
|
|
static void Task_MixingRecordsRecv(u8 taskId);
|
2018-05-26 00:25:36 +02:00
|
|
|
static void Task_SendPacket(u8 taskId);
|
|
|
|
static void Task_CopyReceiveBuffer(u8 taskId);
|
|
|
|
static void Task_SendPacket_SwitchToReceive(u8 taskId);
|
|
|
|
static void *LoadPtrFromTaskData(const u16 *asShort);
|
|
|
|
static void StorePtrInTaskData(void *records, u16 *a1);
|
|
|
|
static u8 GetMultiplayerId_(void);
|
|
|
|
static void *GetPlayerRecvBuffer(u8);
|
|
|
|
static void ReceiveOldManData(OldMan *, size_t, u8);
|
|
|
|
static void ReceiveBattleTowerData(void *battleTowerRecord, size_t, u8);
|
|
|
|
static void ReceiveLilycoveLadyData(LilycoveLady *, size_t, u8);
|
2017-11-07 05:03:11 +01:00
|
|
|
static void sub_80E7B2C(const u8 *);
|
2018-05-26 00:25:36 +02:00
|
|
|
static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *, size_t, u8, TVShow *);
|
2018-10-22 19:22:57 +02:00
|
|
|
static void ReceiveGiftItem(u16 *item, u8 which);
|
2019-02-11 02:42:50 +01:00
|
|
|
static void Task_DoRecordMixing(u8 taskId);
|
2019-11-21 01:00:08 +01:00
|
|
|
static void GetSavedApprentices(struct Apprentice *dst, struct Apprentice *src);
|
|
|
|
static void ReceiveApprenticeData(struct Apprentice *mixApprentice, size_t recordSize, u32 multiplayerId);
|
2018-10-28 21:11:53 +01:00
|
|
|
static void ReceiveRankingHallRecords(struct PlayerHallRecords *hallRecords, size_t arg1, u32 arg2);
|
2018-05-25 21:00:41 +02:00
|
|
|
static void sub_80E89F8(struct RecordMixingDayCareMail *dst);
|
2018-05-26 00:25:36 +02:00
|
|
|
static void SanitizeDayCareMailForRuby(struct RecordMixingDayCareMail *src);
|
|
|
|
static void SanitizeEmeraldBattleTowerRecord(struct EmeraldBattleTowerRecord *arg0);
|
|
|
|
static void SanitizeRubyBattleTowerRecord(struct RSBattleTowerRecord *src);
|
2017-11-04 01:59:29 +01:00
|
|
|
|
2017-10-03 04:02:22 +02:00
|
|
|
// .rodata
|
|
|
|
|
2018-05-25 21:00:41 +02:00
|
|
|
static const u8 gUnknown_0858CF8C[] = {1, 0};
|
|
|
|
|
|
|
|
static const u8 gUnknown_0858CF8E[][3] =
|
|
|
|
{
|
|
|
|
{1, 2, 0},
|
|
|
|
{2, 0, 1},
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 gUnknown_0858CF94[][4] =
|
|
|
|
{
|
|
|
|
{1, 0, 3, 2},
|
|
|
|
{3, 0, 1, 2},
|
|
|
|
{2, 0, 3, 1},
|
|
|
|
{1, 3, 0, 2},
|
|
|
|
{2, 3, 0, 1},
|
|
|
|
{3, 2, 0, 1},
|
|
|
|
{1, 2, 3, 0},
|
|
|
|
{2, 3, 1, 0},
|
|
|
|
{3, 2, 1, 0},
|
|
|
|
};
|
2017-11-04 17:03:50 +01:00
|
|
|
|
2018-05-25 21:00:41 +02:00
|
|
|
static const u8 gUnknown_0858CFB8[3][2] =
|
|
|
|
{
|
|
|
|
{0, 1},
|
|
|
|
{1, 2},
|
|
|
|
{2, 0},
|
|
|
|
};
|
|
|
|
|
|
|
|
static const u8 gUnknown_0858CFBE[3][4] =
|
|
|
|
{
|
|
|
|
{0, 1, 2, 3},
|
|
|
|
{0, 2, 1, 3},
|
|
|
|
{0, 3, 2, 1},
|
|
|
|
};
|
2017-11-07 05:03:11 +01:00
|
|
|
|
2017-10-03 04:02:22 +02:00
|
|
|
// .text
|
2017-11-04 01:59:29 +01:00
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
#define BUFFER_CHUNK_SIZE 200
|
|
|
|
|
2019-02-18 07:03:44 +01:00
|
|
|
void RecordMixingPlayerSpotTriggered(void)
|
2017-11-04 01:59:29 +01:00
|
|
|
{
|
2020-06-04 00:00:53 +02:00
|
|
|
CreateTask_EnterCableClubSeat(Task_RecordMixing_Main);
|
2017-11-04 01:59:29 +01:00
|
|
|
}
|
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
// these variables were const in R/S, but had to become changeable because of saveblocks changing RAM position
|
|
|
|
static void SetSrcLookupPointers(void)
|
2017-11-04 01:59:29 +01:00
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
sSecretBasesSave = gSaveBlock1Ptr->secretBases;
|
|
|
|
sTvShowsSave = gSaveBlock1Ptr->tvShows;
|
|
|
|
sPokeNewsSave = gSaveBlock1Ptr->pokeNews;
|
|
|
|
sOldManSave = &gSaveBlock1Ptr->oldMan;
|
2021-03-31 21:53:01 +02:00
|
|
|
sDewfordTrendsSave = gSaveBlock1Ptr->dewfordTrends;
|
2017-11-07 05:03:11 +01:00
|
|
|
gUnknown_03001148 = &gUnknown_02039F9C;
|
2018-10-21 20:13:12 +02:00
|
|
|
sBattleTowerSave = &gSaveBlock2Ptr->frontier.towerPlayer;
|
2018-05-26 00:25:36 +02:00
|
|
|
sLilycoveLadySave = &gSaveBlock1Ptr->lilycoveLady;
|
2018-10-28 21:11:53 +01:00
|
|
|
sApprenticesSave = gSaveBlock2Ptr->apprentices;
|
2018-10-21 20:13:12 +02:00
|
|
|
sBattleTowerSave_Duplicate = &gSaveBlock2Ptr->frontier.towerPlayer;
|
2017-11-04 01:59:29 +01:00
|
|
|
}
|
2017-11-04 02:56:18 +01:00
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void PrepareUnknownExchangePacket(struct PlayerRecordsRS *dest)
|
2017-11-04 02:56:18 +01:00
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
memcpy(dest->secretBases, sSecretBasesSave, sizeof(dest->secretBases));
|
|
|
|
memcpy(dest->tvShows, sTvShowsSave, sizeof(dest->tvShows));
|
2017-11-04 02:56:18 +01:00
|
|
|
sub_80F14F8(dest->tvShows);
|
2018-05-26 00:25:36 +02:00
|
|
|
memcpy(dest->pokeNews, sPokeNewsSave, sizeof(dest->pokeNews));
|
|
|
|
memcpy(&dest->oldMan, sOldManSave, sizeof(dest->oldMan));
|
2021-03-31 21:53:01 +02:00
|
|
|
memcpy(dest->dewfordTrends, sDewfordTrendsSave, sizeof(dest->dewfordTrends));
|
2017-11-07 05:20:11 +01:00
|
|
|
sub_80E89F8(&dest->dayCareMail);
|
2018-10-24 23:14:45 +02:00
|
|
|
EmeraldBattleTowerRecordToRuby(sBattleTowerSave, &dest->battleTowerRecord);
|
2018-05-26 00:25:36 +02:00
|
|
|
|
2017-11-04 02:56:18 +01:00
|
|
|
if (GetMultiplayerId() == 0)
|
2018-10-22 19:22:57 +02:00
|
|
|
dest->giftItem = GetRecordMixingGift();
|
2017-11-04 02:56:18 +01:00
|
|
|
}
|
2017-11-04 03:07:36 +01:00
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void PrepareExchangePacketForRubySapphire(struct PlayerRecordsRS *dest)
|
2017-11-04 03:07:36 +01:00
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
memcpy(dest->secretBases, sSecretBasesSave, sizeof(dest->secretBases));
|
2019-04-05 23:11:24 +02:00
|
|
|
ClearJapaneseSecretBases(dest->secretBases);
|
2018-05-26 00:25:36 +02:00
|
|
|
memcpy(dest->tvShows, sTvShowsSave, sizeof(dest->tvShows));
|
2017-11-04 03:07:36 +01:00
|
|
|
sub_80F1208(dest->tvShows);
|
2018-05-26 00:25:36 +02:00
|
|
|
memcpy(dest->pokeNews, sPokeNewsSave, sizeof(dest->pokeNews));
|
|
|
|
memcpy(&dest->oldMan, sOldManSave, sizeof(dest->oldMan));
|
2017-11-04 03:07:36 +01:00
|
|
|
sub_8120B70(&dest->oldMan);
|
2021-03-31 21:53:01 +02:00
|
|
|
memcpy(dest->dewfordTrends, sDewfordTrendsSave, sizeof(dest->dewfordTrends));
|
2017-11-07 05:20:11 +01:00
|
|
|
sub_80E89F8(&dest->dayCareMail);
|
2018-05-26 00:25:36 +02:00
|
|
|
SanitizeDayCareMailForRuby(&dest->dayCareMail);
|
2018-10-24 23:14:45 +02:00
|
|
|
EmeraldBattleTowerRecordToRuby(sBattleTowerSave, &dest->battleTowerRecord);
|
2018-05-26 00:25:36 +02:00
|
|
|
SanitizeRubyBattleTowerRecord(&dest->battleTowerRecord);
|
|
|
|
|
2017-11-04 03:07:36 +01:00
|
|
|
if (GetMultiplayerId() == 0)
|
2018-10-22 19:22:57 +02:00
|
|
|
dest->giftItem = GetRecordMixingGift();
|
2017-11-04 03:07:36 +01:00
|
|
|
}
|
2017-11-04 03:26:12 +01:00
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void PrepareExchangePacket(void)
|
2017-11-04 03:26:12 +01:00
|
|
|
{
|
2019-04-05 23:11:24 +02:00
|
|
|
SetPlayerSecretBaseParty();
|
2017-11-04 03:26:12 +01:00
|
|
|
sub_80F0BB8();
|
2018-05-26 00:25:36 +02:00
|
|
|
SetSrcLookupPointers();
|
|
|
|
|
2017-11-04 17:20:40 +01:00
|
|
|
if (Link_AnyPartnersPlayingRubyOrSapphire())
|
2017-11-04 03:26:12 +01:00
|
|
|
{
|
2020-06-08 06:45:06 +02:00
|
|
|
if (LinkDummy_Return2() == 0)
|
2018-05-26 00:25:36 +02:00
|
|
|
PrepareUnknownExchangePacket(&sSentRecord->ruby);
|
2017-11-04 03:26:12 +01:00
|
|
|
else
|
2018-05-26 00:25:36 +02:00
|
|
|
PrepareExchangePacketForRubySapphire(&sSentRecord->ruby);
|
2017-11-04 03:26:12 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
memcpy(sSentRecord->emerald.secretBases, sSecretBasesSave, sizeof(sSentRecord->emerald.secretBases));
|
|
|
|
memcpy(sSentRecord->emerald.tvShows, sTvShowsSave, sizeof(sSentRecord->emerald.tvShows));
|
|
|
|
memcpy(sSentRecord->emerald.pokeNews, sPokeNewsSave, sizeof(sSentRecord->emerald.pokeNews));
|
|
|
|
memcpy(&sSentRecord->emerald.oldMan, sOldManSave, sizeof(sSentRecord->emerald.oldMan));
|
|
|
|
memcpy(&sSentRecord->emerald.lilycoveLady, sLilycoveLadySave, sizeof(sSentRecord->emerald.lilycoveLady));
|
2021-03-31 21:53:01 +02:00
|
|
|
memcpy(sSentRecord->emerald.dewfordTrends, sDewfordTrendsSave, sizeof(sSentRecord->emerald.dewfordTrends));
|
2018-05-26 00:25:36 +02:00
|
|
|
sub_80E89F8(&sSentRecord->emerald.dayCareMail);
|
|
|
|
memcpy(&sSentRecord->emerald.battleTowerRecord, sBattleTowerSave, sizeof(sSentRecord->emerald.battleTowerRecord));
|
|
|
|
SanitizeEmeraldBattleTowerRecord(&sSentRecord->emerald.battleTowerRecord);
|
|
|
|
|
2017-11-04 03:26:12 +01:00
|
|
|
if (GetMultiplayerId() == 0)
|
2018-10-22 19:22:57 +02:00
|
|
|
sSentRecord->emerald.giftItem = GetRecordMixingGift();
|
2018-05-26 00:25:36 +02:00
|
|
|
|
2019-11-21 01:00:08 +01:00
|
|
|
GetSavedApprentices(sSentRecord->emerald.apprentices, sApprenticesSave);
|
2018-10-28 21:11:53 +01:00
|
|
|
GetPlayerHallRecords(&sSentRecord->emerald.hallRecords);
|
2017-11-04 03:26:12 +01:00
|
|
|
}
|
|
|
|
}
|
2017-11-04 14:39:41 +01:00
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void ReceiveExchangePacket(u32 which)
|
2017-11-04 14:39:41 +01:00
|
|
|
{
|
2017-11-04 17:20:40 +01:00
|
|
|
if (Link_AnyPartnersPlayingRubyOrSapphire())
|
2017-11-04 14:39:41 +01:00
|
|
|
{
|
|
|
|
// Ruby/Sapphire
|
2018-05-26 00:25:36 +02:00
|
|
|
sub_80E7B2C((void *)sReceivedRecords->ruby.tvShows);
|
|
|
|
ReceiveSecretBasesData(sReceivedRecords->ruby.secretBases, sizeof(struct PlayerRecordsRS), which);
|
|
|
|
ReceiveDaycareMailData(&sReceivedRecords->ruby.dayCareMail, sizeof(struct PlayerRecordsRS), which, sReceivedRecords->ruby.tvShows);
|
|
|
|
ReceiveBattleTowerData(&sReceivedRecords->ruby.battleTowerRecord, sizeof(struct PlayerRecordsRS), which);
|
|
|
|
ReceiveTvShowsData(sReceivedRecords->ruby.tvShows, sizeof(struct PlayerRecordsRS), which);
|
|
|
|
ReceivePokeNewsData(sReceivedRecords->ruby.pokeNews, sizeof(struct PlayerRecordsRS), which);
|
|
|
|
ReceiveOldManData(&sReceivedRecords->ruby.oldMan, sizeof(struct PlayerRecordsRS), which);
|
2021-03-31 21:53:01 +02:00
|
|
|
ReceiveDewfordTrendData(sReceivedRecords->ruby.dewfordTrends, sizeof(struct PlayerRecordsRS), which);
|
2018-10-22 19:22:57 +02:00
|
|
|
ReceiveGiftItem(&sReceivedRecords->ruby.giftItem, which);
|
2017-11-04 14:39:41 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Emerald
|
2018-05-26 00:25:36 +02:00
|
|
|
sub_80E7B2C((void *)sReceivedRecords->emerald.tvShows);
|
|
|
|
ReceiveSecretBasesData(sReceivedRecords->emerald.secretBases, sizeof(struct PlayerRecordsEmerald), which);
|
|
|
|
ReceiveTvShowsData(sReceivedRecords->emerald.tvShows, sizeof(struct PlayerRecordsEmerald), which);
|
|
|
|
ReceivePokeNewsData(sReceivedRecords->emerald.pokeNews, sizeof(struct PlayerRecordsEmerald), which);
|
|
|
|
ReceiveOldManData(&sReceivedRecords->emerald.oldMan, sizeof(struct PlayerRecordsEmerald), which);
|
2021-03-31 21:53:01 +02:00
|
|
|
ReceiveDewfordTrendData(sReceivedRecords->emerald.dewfordTrends, sizeof(struct PlayerRecordsEmerald), which);
|
2018-05-26 00:25:36 +02:00
|
|
|
ReceiveDaycareMailData(&sReceivedRecords->emerald.dayCareMail, sizeof(struct PlayerRecordsEmerald), which, sReceivedRecords->emerald.tvShows);
|
|
|
|
ReceiveBattleTowerData(&sReceivedRecords->emerald.battleTowerRecord, sizeof(struct PlayerRecordsEmerald), which);
|
2018-10-22 19:22:57 +02:00
|
|
|
ReceiveGiftItem(&sReceivedRecords->emerald.giftItem, which);
|
2018-05-26 00:25:36 +02:00
|
|
|
ReceiveLilycoveLadyData(&sReceivedRecords->emerald.lilycoveLady, sizeof(struct PlayerRecordsEmerald), which);
|
2019-11-21 01:00:08 +01:00
|
|
|
ReceiveApprenticeData(sReceivedRecords->emerald.apprentices, sizeof(struct PlayerRecordsEmerald), (u8) which);
|
2018-10-28 21:11:53 +01:00
|
|
|
ReceiveRankingHallRecords(&sReceivedRecords->emerald.hallRecords, sizeof(struct PlayerRecordsEmerald), (u8) which);
|
2017-11-04 14:39:41 +01:00
|
|
|
}
|
|
|
|
}
|
2017-11-04 15:15:58 +01:00
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void PrintTextOnRecordMixing(const u8 *src)
|
2017-11-04 15:15:58 +01:00
|
|
|
{
|
2019-02-22 07:40:11 +01:00
|
|
|
DrawDialogueFrame(0, 0);
|
2018-09-08 23:38:30 +02:00
|
|
|
AddTextPrinterParameterized(0, 1, src, 0, 1, 0, NULL);
|
2017-11-04 15:15:58 +01:00
|
|
|
CopyWindowToVram(0, 3);
|
|
|
|
}
|
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
#define tCounter data[0]
|
|
|
|
|
|
|
|
static void Task_RecordMixing_SoundEffect(u8 taskId)
|
2017-11-04 15:15:58 +01:00
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
if (++gTasks[taskId].tCounter == 50)
|
2017-11-04 15:15:58 +01:00
|
|
|
{
|
2020-08-21 00:02:00 +02:00
|
|
|
PlaySE(SE_M_ATTRACT);
|
2018-05-26 00:25:36 +02:00
|
|
|
gTasks[taskId].tCounter = 0;
|
2017-11-04 15:15:58 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
#undef tCounter
|
|
|
|
|
|
|
|
#define tState data[0]
|
|
|
|
#define tSndEffTaskId data[15]
|
|
|
|
|
2019-02-11 02:42:50 +01:00
|
|
|
// Note: Currently, special var 8005 contains the player's spot id.
|
2018-05-26 00:25:36 +02:00
|
|
|
static void Task_RecordMixing_Main(u8 taskId)
|
2017-11-04 15:15:58 +01:00
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
s16 *data = gTasks[taskId].data;
|
2017-11-04 15:15:58 +01:00
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
switch (tState)
|
2017-11-04 15:15:58 +01:00
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
case 0: // init
|
|
|
|
sSentRecord = malloc(sizeof(union PlayerRecords));
|
|
|
|
sReceivedRecords = malloc(sizeof(union PlayerRecords) * 4);
|
2019-03-01 07:18:58 +01:00
|
|
|
SetLocalLinkPlayerId(gSpecialVar_0x8005);
|
2018-05-26 00:25:36 +02:00
|
|
|
VarSet(VAR_TEMP_0, 1);
|
|
|
|
gUnknown_03001130 = FALSE;
|
|
|
|
PrepareExchangePacket();
|
2020-06-29 17:41:09 +02:00
|
|
|
CreateRecordMixingLights();
|
2018-05-26 00:25:36 +02:00
|
|
|
tState = 1;
|
2019-02-11 02:42:50 +01:00
|
|
|
data[10] = CreateTask(Task_MixingRecordsRecv, 80);
|
2018-05-26 00:25:36 +02:00
|
|
|
tSndEffTaskId = CreateTask(Task_RecordMixing_SoundEffect, 81);
|
|
|
|
break;
|
2019-02-11 02:42:50 +01:00
|
|
|
case 1: // wait for Task_MixingRecordsRecv
|
2018-05-26 00:25:36 +02:00
|
|
|
if (!gTasks[data[10]].isActive)
|
|
|
|
{
|
|
|
|
tState = 2;
|
|
|
|
FlagSet(FLAG_SYS_MIX_RECORD);
|
2020-06-29 17:41:09 +02:00
|
|
|
DestroyRecordMixingLights();
|
2018-05-26 00:25:36 +02:00
|
|
|
DestroyTask(tSndEffTaskId);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 2:
|
2019-02-11 02:42:50 +01:00
|
|
|
data[10] = CreateTask(Task_DoRecordMixing, 10);
|
2018-05-26 00:25:36 +02:00
|
|
|
tState = 3;
|
2020-08-21 00:02:00 +02:00
|
|
|
PlaySE(SE_M_BATON_PASS);
|
2018-05-26 00:25:36 +02:00
|
|
|
break;
|
2019-02-11 02:42:50 +01:00
|
|
|
case 3: // wait for Task_DoRecordMixing
|
2018-05-26 00:25:36 +02:00
|
|
|
if (!gTasks[data[10]].isActive)
|
|
|
|
{
|
|
|
|
tState = 4;
|
|
|
|
if (gWirelessCommType == 0)
|
2020-06-04 00:00:53 +02:00
|
|
|
data[10] = CreateTask_ReestablishCableClubLink();
|
2018-05-26 00:25:36 +02:00
|
|
|
|
|
|
|
PrintTextOnRecordMixing(gText_RecordMixingComplete);
|
|
|
|
data[8] = 0;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 4: // wait 60 frames
|
|
|
|
if (++data[8] > 60)
|
|
|
|
tState = 5;
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
if (!gTasks[data[10]].isActive)
|
|
|
|
{
|
|
|
|
free(sReceivedRecords);
|
|
|
|
free(sSentRecord);
|
|
|
|
sub_808729C();
|
|
|
|
if (gWirelessCommType != 0)
|
2017-11-04 15:15:58 +01:00
|
|
|
{
|
2019-12-17 09:24:44 +01:00
|
|
|
CreateTask(Task_ReturnToFieldRecordMixing, 10);
|
2017-11-04 15:15:58 +01:00
|
|
|
}
|
2019-02-22 07:40:11 +01:00
|
|
|
ClearDialogWindowAndFrame(0, 1);
|
2018-05-26 00:25:36 +02:00
|
|
|
DestroyTask(taskId);
|
|
|
|
EnableBothScriptContexts();
|
|
|
|
}
|
|
|
|
break;
|
2017-11-04 15:15:58 +01:00
|
|
|
}
|
|
|
|
}
|
2017-11-04 15:55:39 +01:00
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
#undef tState
|
|
|
|
#undef tSndEffTaskId
|
|
|
|
|
2019-02-11 02:42:50 +01:00
|
|
|
static void Task_MixingRecordsRecv(u8 taskId)
|
2017-11-04 15:55:39 +01:00
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
struct Task *task = &gTasks[taskId];
|
2017-11-04 15:55:39 +01:00
|
|
|
|
|
|
|
switch (task->data[0])
|
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
case 0:
|
|
|
|
PrintTextOnRecordMixing(gText_MixingRecords);
|
|
|
|
task->data[8] = 0x708;
|
|
|
|
task->data[0] = 400;
|
|
|
|
ClearLinkCallback_2();
|
|
|
|
break;
|
|
|
|
case 100: // wait 20 frames
|
|
|
|
if (++task->data[12] > 20)
|
|
|
|
{
|
|
|
|
task->data[12] = 0;
|
|
|
|
task->data[0] = 101;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 101:
|
|
|
|
{
|
|
|
|
u8 players = GetLinkPlayerCount_2();
|
2018-02-12 02:12:40 +01:00
|
|
|
if (IsLinkMaster() == TRUE)
|
2017-11-04 15:55:39 +01:00
|
|
|
{
|
2019-02-11 02:42:50 +01:00
|
|
|
if (players == GetSavedPlayerCount())
|
2017-11-04 15:55:39 +01:00
|
|
|
{
|
|
|
|
PlaySE(SE_PIN);
|
|
|
|
task->data[0] = 201;
|
|
|
|
task->data[12] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
PlaySE(SE_BOO);
|
|
|
|
task->data[0] = 301;
|
|
|
|
}
|
2018-05-26 00:25:36 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 201:
|
2019-02-11 02:42:50 +01:00
|
|
|
// We're the link master. Delay for 30 frames per connected player.
|
|
|
|
if (GetSavedPlayerCount() == GetLinkPlayerCount_2() && ++task->data[12] > (GetLinkPlayerCount_2() * 30))
|
2018-05-26 00:25:36 +02:00
|
|
|
{
|
2019-02-11 02:42:50 +01:00
|
|
|
CheckShouldAdvanceLinkState();
|
2018-05-26 00:25:36 +02:00
|
|
|
task->data[0] = 1;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 301:
|
2019-02-11 02:42:50 +01:00
|
|
|
if (GetSavedPlayerCount() == GetLinkPlayerCount_2())
|
2018-05-26 00:25:36 +02:00
|
|
|
task->data[0] = 1;
|
|
|
|
break;
|
|
|
|
case 400: // wait 20 frames
|
|
|
|
if (++task->data[12] > 20)
|
|
|
|
{
|
|
|
|
task->data[0] = 1;
|
|
|
|
task->data[12] = 0;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 1: // wait for handshake
|
|
|
|
if (gReceivedRemoteLinkPlayers != 0)
|
|
|
|
{
|
|
|
|
ConvertIntToDecimalStringN(gStringVar1, GetMultiplayerId_(), STR_CONV_MODE_LEADING_ZEROS, 2);
|
|
|
|
task->data[0] = 5;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
{
|
|
|
|
u8 subTaskId;
|
|
|
|
|
2018-02-12 02:12:40 +01:00
|
|
|
task->data[6] = GetLinkPlayerCount_2();
|
2017-11-04 15:55:39 +01:00
|
|
|
task->data[0] = 0;
|
2018-05-26 00:25:36 +02:00
|
|
|
task->data[5] = GetMultiplayerId_();
|
|
|
|
task->func = Task_SendPacket;
|
2017-11-04 17:20:40 +01:00
|
|
|
if (Link_AnyPartnersPlayingRubyOrSapphire())
|
2017-11-04 15:55:39 +01:00
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
StorePtrInTaskData(sSentRecord, (u16 *)&task->data[2]);
|
|
|
|
subTaskId = CreateTask(Task_CopyReceiveBuffer, 80);
|
|
|
|
task->data[10] = subTaskId;
|
|
|
|
gTasks[subTaskId].data[0] = taskId;
|
|
|
|
StorePtrInTaskData(sReceivedRecords, (u16 *)&gTasks[subTaskId].data[5]);
|
|
|
|
sRecordStructSize = sizeof(struct PlayerRecordsRS);
|
2017-11-04 15:55:39 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
StorePtrInTaskData(sSentRecord, (u16 *)&task->data[2]);
|
|
|
|
subTaskId = CreateTask(Task_CopyReceiveBuffer, 80);
|
|
|
|
task->data[10] = subTaskId;
|
|
|
|
gTasks[subTaskId].data[0] = taskId;
|
|
|
|
StorePtrInTaskData(sReceivedRecords, (u16 *)&gTasks[subTaskId].data[5]);
|
|
|
|
sRecordStructSize = sizeof(struct PlayerRecordsEmerald);
|
2017-11-04 15:55:39 +01:00
|
|
|
}
|
2019-02-11 02:42:50 +01:00
|
|
|
// Note: This task is destroyed by Task_CopyReceiveBuffer when it's done.
|
2018-05-26 00:25:36 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 5: // wait 60 frames
|
|
|
|
if (++task->data[10] > 60)
|
|
|
|
{
|
|
|
|
task->data[10] = 0;
|
|
|
|
task->data[0] = 2;
|
|
|
|
}
|
|
|
|
break;
|
2017-11-04 15:55:39 +01:00
|
|
|
}
|
|
|
|
}
|
2017-11-04 16:16:07 +01:00
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void Task_SendPacket(u8 taskId)
|
2017-11-04 16:16:07 +01:00
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
struct Task *task = &gTasks[taskId];
|
|
|
|
// does this send the data 24 times?
|
2017-11-04 16:16:07 +01:00
|
|
|
|
|
|
|
switch (task->data[0])
|
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
case 0: // Copy record data to send buffer
|
|
|
|
{
|
|
|
|
void *recordData = LoadPtrFromTaskData(&task->data[2]) + task->data[4] * BUFFER_CHUNK_SIZE;
|
|
|
|
|
|
|
|
memcpy(gBlockSendBuffer, recordData, BUFFER_CHUNK_SIZE);
|
|
|
|
task->data[0]++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
if (GetMultiplayerId() == 0)
|
2020-08-13 09:09:47 +02:00
|
|
|
SendBlockRequest(1);
|
2018-05-26 00:25:36 +02:00
|
|
|
task->data[0]++;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
task->data[4]++;
|
|
|
|
if (task->data[4] == sRecordStructSize / 200 + 1)
|
|
|
|
task->data[0]++;
|
|
|
|
else
|
|
|
|
task->data[0] = 0;
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
if (!gTasks[task->data[10]].isActive)
|
|
|
|
task->func = Task_SendPacket_SwitchToReceive;
|
|
|
|
break;
|
2017-11-04 16:16:07 +01:00
|
|
|
}
|
|
|
|
}
|
2017-11-04 16:39:23 +01:00
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void Task_CopyReceiveBuffer(u8 taskId)
|
2017-11-04 16:39:23 +01:00
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
struct Task *task = &gTasks[taskId];
|
|
|
|
u8 status = GetBlockReceivedStatus();
|
|
|
|
u8 handledPlayers = 0;
|
|
|
|
|
2020-06-08 06:45:06 +02:00
|
|
|
if (status == GetLinkPlayerCountAsBitFlags())
|
2017-11-04 16:39:23 +01:00
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
u8 i;
|
|
|
|
|
|
|
|
for (i = 0; i < GetLinkPlayerCount(); i++)
|
2017-11-04 16:39:23 +01:00
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
void *dest;
|
|
|
|
void *src;
|
|
|
|
|
|
|
|
if ((status >> i) & 1)
|
2017-11-04 16:39:23 +01:00
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
dest = LoadPtrFromTaskData((u16 *)&task->data[5]) + task->data[i + 1] * BUFFER_CHUNK_SIZE + sRecordStructSize * i;
|
|
|
|
src = GetPlayerRecvBuffer(i);
|
|
|
|
if ((task->data[i + 1] + 1) * BUFFER_CHUNK_SIZE > sRecordStructSize)
|
|
|
|
memcpy(dest, src, sRecordStructSize - task->data[i + 1] * BUFFER_CHUNK_SIZE);
|
2017-11-04 16:39:23 +01:00
|
|
|
else
|
2018-05-26 00:25:36 +02:00
|
|
|
memcpy(dest, src, BUFFER_CHUNK_SIZE);
|
2017-11-04 16:39:23 +01:00
|
|
|
ResetBlockReceivedFlag(i);
|
2018-05-26 00:25:36 +02:00
|
|
|
task->data[i + 1]++;
|
|
|
|
if (task->data[i + 1] == sRecordStructSize / BUFFER_CHUNK_SIZE + 1)
|
|
|
|
handledPlayers++;
|
2017-11-04 16:39:23 +01:00
|
|
|
}
|
|
|
|
}
|
2018-05-26 00:25:36 +02:00
|
|
|
gTasks[task->data[0]].data[0]++;
|
2017-11-04 16:39:23 +01:00
|
|
|
}
|
2018-05-26 00:25:36 +02:00
|
|
|
|
|
|
|
if (handledPlayers == GetLinkPlayerCount())
|
2017-11-04 16:39:23 +01:00
|
|
|
DestroyTask(taskId);
|
|
|
|
}
|
2017-11-04 16:49:28 +01:00
|
|
|
|
|
|
|
static void sub_80E776C(u8 taskId)
|
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
struct Task *task = &gTasks[taskId];
|
2017-11-04 16:49:28 +01:00
|
|
|
|
|
|
|
if (!gTasks[task->data[10]].isActive)
|
|
|
|
DestroyTask(taskId);
|
|
|
|
}
|
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void Task_ReceivePacket(u8 taskId)
|
2017-11-04 16:49:28 +01:00
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
struct Task *task = &gTasks[taskId];
|
2017-11-04 16:49:28 +01:00
|
|
|
|
|
|
|
task->func = sub_80E776C;
|
|
|
|
if (gUnknown_03001130 == TRUE)
|
2018-05-26 00:25:36 +02:00
|
|
|
ReceiveExchangePacket(task->data[5]);
|
2017-11-04 16:49:28 +01:00
|
|
|
}
|
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void Task_SendPacket_SwitchToReceive(u8 taskId)
|
2017-11-04 16:49:28 +01:00
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
gTasks[taskId].func = Task_ReceivePacket;
|
2017-11-04 16:49:28 +01:00
|
|
|
gUnknown_03001130 = TRUE;
|
|
|
|
}
|
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void *LoadPtrFromTaskData(const u16 *asShort)
|
2017-11-04 16:49:28 +01:00
|
|
|
{
|
|
|
|
return (void *)(asShort[0] | (asShort[1] << 16));
|
|
|
|
}
|
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void StorePtrInTaskData(void *records, u16 *asShort)
|
2017-11-04 16:49:28 +01:00
|
|
|
{
|
2017-11-04 23:48:13 +01:00
|
|
|
asShort[0] = (u32)records;
|
|
|
|
asShort[1] = ((u32)records >> 16);
|
2017-11-04 16:49:28 +01:00
|
|
|
}
|
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static u8 GetMultiplayerId_(void)
|
2017-11-04 16:49:28 +01:00
|
|
|
{
|
|
|
|
return GetMultiplayerId();
|
|
|
|
}
|
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void *GetPlayerRecvBuffer(u8 id)
|
2017-11-04 16:49:28 +01:00
|
|
|
{
|
|
|
|
return gBlockRecvBuffer[id];
|
|
|
|
}
|
2017-11-04 17:03:50 +01:00
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void ShufflePlayerIndices(u32 *data)
|
2017-11-04 17:03:50 +01:00
|
|
|
{
|
|
|
|
u32 i;
|
|
|
|
u32 linkTrainerId;
|
2018-05-26 00:25:36 +02:00
|
|
|
u32 players = GetLinkPlayerCount();
|
2017-11-04 17:03:50 +01:00
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
switch (players)
|
2017-11-04 17:03:50 +01:00
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
case 2:
|
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
data[i] = gUnknown_0858CF8C[i];
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
linkTrainerId = GetLinkPlayerTrainerId(0) % 2;
|
|
|
|
for (i = 0; i < 3; i++)
|
|
|
|
data[i] = gUnknown_0858CF8E[linkTrainerId][i];
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
linkTrainerId = GetLinkPlayerTrainerId(0) % 9;
|
|
|
|
for (i = 0; i < 4; i++)
|
|
|
|
data[i] = gUnknown_0858CF94[linkTrainerId][i];
|
|
|
|
break;
|
2017-11-04 17:03:50 +01:00
|
|
|
}
|
|
|
|
}
|
2017-11-04 17:20:40 +01:00
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void ReceiveOldManData(OldMan *oldMan, size_t recordSize, u8 which)
|
2017-11-04 17:20:40 +01:00
|
|
|
{
|
|
|
|
u8 version;
|
|
|
|
u16 language;
|
|
|
|
OldMan *dest;
|
2019-10-20 22:11:07 +02:00
|
|
|
u32 mixIndices[MAX_LINK_PLAYERS];
|
2017-11-04 17:20:40 +01:00
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
ShufflePlayerIndices(mixIndices);
|
2017-11-05 00:03:41 +01:00
|
|
|
dest = (void *)oldMan + recordSize * mixIndices[which];
|
2017-11-04 23:48:13 +01:00
|
|
|
version = gLinkPlayers[mixIndices[which]].version;
|
|
|
|
language = gLinkPlayers[mixIndices[which]].language;
|
2018-05-26 00:25:36 +02:00
|
|
|
|
2017-11-04 17:20:40 +01:00
|
|
|
if (Link_AnyPartnersPlayingRubyOrSapphire())
|
2018-05-26 00:25:36 +02:00
|
|
|
SanitizeReceivedRubyOldMan(dest, version, language);
|
2017-11-04 17:20:40 +01:00
|
|
|
else
|
2018-05-26 00:25:36 +02:00
|
|
|
SanitizeReceivedEmeraldOldMan(dest, version, language);
|
|
|
|
|
|
|
|
memcpy(sOldManSave, (void *)oldMan + recordSize * mixIndices[which], sizeof(OldMan));
|
2018-05-19 12:32:44 +02:00
|
|
|
ResetMauvilleOldManFlag();
|
2017-11-04 17:20:40 +01:00
|
|
|
}
|
2017-11-04 23:48:13 +01:00
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void ReceiveBattleTowerData(void *battleTowerRecord, size_t recordSize, u8 which)
|
2017-11-04 23:48:13 +01:00
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
struct EmeraldBattleTowerRecord *dest;
|
2018-12-10 21:49:33 +01:00
|
|
|
struct BattleTowerPokemon *btPokemon;
|
2019-11-21 01:00:08 +01:00
|
|
|
u32 mixIndices[MAX_LINK_PLAYERS];
|
2017-11-04 23:48:13 +01:00
|
|
|
s32 i;
|
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
ShufflePlayerIndices(mixIndices);
|
2017-11-04 23:48:13 +01:00
|
|
|
if (Link_AnyPartnersPlayingRubyOrSapphire())
|
|
|
|
{
|
2018-10-22 19:22:57 +02:00
|
|
|
if (RubyBattleTowerRecordToEmerald((void *)battleTowerRecord + recordSize * mixIndices[which], (void *)battleTowerRecord + recordSize * which) == TRUE)
|
2017-11-04 23:48:13 +01:00
|
|
|
{
|
2017-11-05 00:03:41 +01:00
|
|
|
dest = (void *)battleTowerRecord + recordSize * which;
|
2018-05-26 00:25:36 +02:00
|
|
|
dest->language = gLinkPlayers[mixIndices[which]].language;
|
|
|
|
CalcEmeraldBattleTowerChecksum(dest);
|
2017-11-04 23:48:13 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2018-10-22 19:22:57 +02:00
|
|
|
memcpy((void *)battleTowerRecord + recordSize * which, (void *)battleTowerRecord + recordSize * mixIndices[which], sizeof(struct EmeraldBattleTowerRecord));
|
2017-11-05 00:03:41 +01:00
|
|
|
dest = (void *)battleTowerRecord + recordSize * which;
|
2017-11-04 23:48:13 +01:00
|
|
|
for (i = 0; i < 4; i ++)
|
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
btPokemon = &dest->party[i];
|
2017-11-04 23:48:13 +01:00
|
|
|
if (btPokemon->species != SPECIES_NONE && IsStringJapanese(btPokemon->nickname))
|
|
|
|
ConvertInternationalString(btPokemon->nickname, LANGUAGE_JAPANESE);
|
|
|
|
}
|
2018-05-26 00:25:36 +02:00
|
|
|
CalcEmeraldBattleTowerChecksum(dest);
|
2017-11-05 00:03:41 +01:00
|
|
|
}
|
2018-10-21 00:06:42 +02:00
|
|
|
PutNewBattleTowerRecord((void *)battleTowerRecord + recordSize * which);
|
2017-11-05 00:03:41 +01:00
|
|
|
}
|
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void ReceiveLilycoveLadyData(LilycoveLady *lilycoveLady, size_t recordSize, u8 which)
|
2017-11-05 00:03:41 +01:00
|
|
|
{
|
|
|
|
LilycoveLady *dest;
|
2019-11-21 01:00:08 +01:00
|
|
|
u32 mixIndices[MAX_LINK_PLAYERS];
|
2017-11-05 00:03:41 +01:00
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
ShufflePlayerIndices(mixIndices);
|
|
|
|
memcpy((void *)lilycoveLady + recordSize * which, sLilycoveLadySave, sizeof(LilycoveLady));
|
|
|
|
|
2017-11-05 00:03:41 +01:00
|
|
|
if (GetLilycoveLadyId() == 0)
|
|
|
|
{
|
|
|
|
dest = malloc(sizeof(LilycoveLady));
|
|
|
|
if (dest == NULL)
|
|
|
|
return;
|
2018-05-26 00:25:36 +02:00
|
|
|
|
|
|
|
memcpy(dest, sLilycoveLadySave, sizeof(LilycoveLady));
|
2017-11-05 00:03:41 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
dest = NULL;
|
|
|
|
}
|
2018-05-26 00:25:36 +02:00
|
|
|
|
|
|
|
memcpy(sLilycoveLadySave, (void *)lilycoveLady + recordSize * mixIndices[which], sizeof(LilycoveLady));
|
2019-08-06 02:37:09 +02:00
|
|
|
ResetLilycoveLadyForRecordMix();
|
2017-11-05 00:03:41 +01:00
|
|
|
if (dest != NULL)
|
|
|
|
{
|
2019-08-06 02:37:09 +02:00
|
|
|
QuizLadyClearQuestionForRecordMix(dest);
|
2017-11-05 00:03:41 +01:00
|
|
|
free(dest);
|
2017-11-04 23:48:13 +01:00
|
|
|
}
|
|
|
|
}
|
2017-11-07 05:03:11 +01:00
|
|
|
|
2018-05-25 21:00:41 +02:00
|
|
|
static u8 sub_80E7A9C(struct DayCareMail *rmMail)
|
2017-11-07 05:03:11 +01:00
|
|
|
{
|
2018-05-25 21:00:41 +02:00
|
|
|
return rmMail->message.itemId;
|
2017-11-07 05:03:11 +01:00
|
|
|
}
|
|
|
|
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
static void sub_80E7AA4(struct RecordMixingDayCareMail *src, size_t recordSize, u8 (*idxs)[2], u8 which0, u8 which1)
|
2017-11-07 05:03:11 +01:00
|
|
|
{
|
2018-05-25 21:00:41 +02:00
|
|
|
struct DayCareMail buffer;
|
2018-05-22 21:54:57 +02:00
|
|
|
struct RecordMixingDayCareMail *mail1;
|
|
|
|
struct RecordMixingDayCareMail *mail2;
|
|
|
|
|
|
|
|
mail1 = (void *)src + recordSize * idxs[which0][0];
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
memcpy(&buffer, &mail1->mail[idxs[which0][1]], sizeof(struct DayCareMail));
|
2018-05-22 21:54:57 +02:00
|
|
|
mail2 = (void *)src + recordSize * idxs[which1][0];
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
memcpy(&mail1->mail[idxs[which0][1]], &mail2->mail[idxs[which1][1]], sizeof(struct DayCareMail));
|
|
|
|
memcpy(&mail2->mail[idxs[which1][1]], &buffer, sizeof(struct DayCareMail));
|
2017-11-07 05:03:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80E7B2C(const u8 *src)
|
|
|
|
{
|
|
|
|
u8 sum;
|
2018-05-26 00:25:36 +02:00
|
|
|
s32 i;
|
2017-11-07 05:03:11 +01:00
|
|
|
|
|
|
|
sum = 0;
|
|
|
|
for (i = 0; i < 256; i ++)
|
|
|
|
sum += src[i];
|
2018-05-26 00:25:36 +02:00
|
|
|
|
2017-11-07 05:03:11 +01:00
|
|
|
gUnknown_03001160 = sum;
|
|
|
|
}
|
|
|
|
|
|
|
|
static u8 sub_80E7B54(void)
|
|
|
|
{
|
|
|
|
return gUnknown_03001160;
|
|
|
|
}
|
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *src, size_t recordSize, u8 which, TVShow *shows)
|
2017-11-07 05:03:11 +01:00
|
|
|
{
|
2018-12-28 23:40:25 +01:00
|
|
|
u16 i, j;
|
2017-11-07 05:03:11 +01:00
|
|
|
u8 linkPlayerCount;
|
2018-12-28 23:40:25 +01:00
|
|
|
u8 tableId;
|
2018-05-22 21:54:57 +02:00
|
|
|
struct RecordMixingDayCareMail *_src;
|
2018-12-28 23:40:25 +01:00
|
|
|
u8 which0, which1;
|
|
|
|
void *ptr;
|
2017-11-07 05:03:11 +01:00
|
|
|
u8 sp04[4];
|
|
|
|
u8 sp08[4];
|
2018-12-28 23:40:25 +01:00
|
|
|
struct RecordMixingDayCareMail *sp0c[4];
|
|
|
|
u8 sp1c[4][2];
|
2017-11-07 05:03:11 +01:00
|
|
|
u8 sp24[4][2];
|
|
|
|
u8 sp34;
|
|
|
|
u16 oldSeed;
|
2018-12-28 23:40:25 +01:00
|
|
|
bool32 anyRS;
|
2017-11-07 05:03:11 +01:00
|
|
|
|
|
|
|
oldSeed = Random2();
|
|
|
|
SeedRng2(gLinkPlayers[0].trainerId);
|
|
|
|
linkPlayerCount = GetLinkPlayerCount();
|
2018-12-28 23:40:25 +01:00
|
|
|
for (i = 0; i < 4; i++)
|
2017-11-07 05:03:11 +01:00
|
|
|
{
|
|
|
|
sp04[i] = 0xFF;
|
|
|
|
sp08[i] = 0;
|
|
|
|
sp1c[i][0] = 0;
|
|
|
|
sp1c[i][1] = 0;
|
|
|
|
}
|
2018-12-28 23:40:25 +01:00
|
|
|
|
2017-11-07 05:03:11 +01:00
|
|
|
anyRS = Link_AnyPartnersPlayingRubyOrSapphire();
|
2018-12-28 23:40:25 +01:00
|
|
|
for (i = 0; i < GetLinkPlayerCount(); i++)
|
2017-11-07 05:03:11 +01:00
|
|
|
{
|
2018-12-28 23:40:25 +01:00
|
|
|
u32 language, version;
|
|
|
|
|
|
|
|
_src = (void *)src + i * recordSize;
|
|
|
|
language = gLinkPlayers[i].language;
|
|
|
|
version = gLinkPlayers[i].version & 0xFF;
|
|
|
|
for (j = 0; j < _src->numDaycareMons; j ++)
|
2017-11-07 05:03:11 +01:00
|
|
|
{
|
2018-12-28 23:40:25 +01:00
|
|
|
u16 otNameLanguage, nicknameLanguage;
|
|
|
|
struct DayCareMail *recordMixingMail = &_src->mail[j];
|
|
|
|
|
|
|
|
if (!recordMixingMail->message.itemId)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (anyRS)
|
2017-11-07 05:03:11 +01:00
|
|
|
{
|
2018-12-28 23:40:25 +01:00
|
|
|
if (StringLength(recordMixingMail->OT_name) <= 5)
|
|
|
|
{
|
|
|
|
otNameLanguage = LANGUAGE_JAPANESE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
StripExtCtrlCodes(recordMixingMail->OT_name);
|
|
|
|
otNameLanguage = language;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (recordMixingMail->monName[0] == EXT_CTRL_CODE_BEGIN && recordMixingMail->monName[1] == EXT_CTRL_CODE_JPN)
|
2017-11-07 05:03:11 +01:00
|
|
|
{
|
2018-12-28 23:40:25 +01:00
|
|
|
StripExtCtrlCodes(recordMixingMail->monName);
|
|
|
|
nicknameLanguage = LANGUAGE_JAPANESE;
|
2017-11-07 05:03:11 +01:00
|
|
|
}
|
2018-12-28 23:40:25 +01:00
|
|
|
else
|
2017-11-07 05:03:11 +01:00
|
|
|
{
|
2018-12-28 23:40:25 +01:00
|
|
|
nicknameLanguage = language;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (version == VERSION_RUBY || version == VERSION_SAPPHIRE)
|
|
|
|
{
|
|
|
|
recordMixingMail->gameLanguage = otNameLanguage;
|
|
|
|
recordMixingMail->monLanguage = nicknameLanguage;
|
2017-11-07 05:03:11 +01:00
|
|
|
}
|
|
|
|
}
|
2018-12-28 23:40:25 +01:00
|
|
|
else if (language == LANGUAGE_JAPANESE)
|
|
|
|
{
|
|
|
|
if (IsStringJapanese(recordMixingMail->OT_name))
|
|
|
|
recordMixingMail->gameLanguage = LANGUAGE_JAPANESE;
|
|
|
|
else
|
|
|
|
recordMixingMail->gameLanguage = GAME_LANGUAGE;
|
|
|
|
|
|
|
|
if (IsStringJapanese(recordMixingMail->monName))
|
|
|
|
recordMixingMail->monLanguage = LANGUAGE_JAPANESE;
|
|
|
|
else
|
|
|
|
recordMixingMail->monLanguage = GAME_LANGUAGE;
|
|
|
|
}
|
2017-11-07 05:03:11 +01:00
|
|
|
}
|
|
|
|
}
|
2018-12-28 23:40:25 +01:00
|
|
|
|
2017-11-07 05:03:11 +01:00
|
|
|
sp34 = 0;
|
2018-12-28 23:40:25 +01:00
|
|
|
for (i = 0; i < linkPlayerCount; i++)
|
2017-11-07 05:03:11 +01:00
|
|
|
{
|
2018-12-28 23:40:25 +01:00
|
|
|
_src = (void *)src + i * recordSize;
|
|
|
|
if (_src->numDaycareMons == 0)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
for (j = 0; j < _src->numDaycareMons; j ++)
|
2017-11-07 05:03:11 +01:00
|
|
|
{
|
2018-12-28 23:40:25 +01:00
|
|
|
if (!_src->holdsItem[j])
|
|
|
|
sp1c[i][j] = 1;
|
2017-11-07 05:03:11 +01:00
|
|
|
}
|
|
|
|
}
|
2018-12-28 23:40:25 +01:00
|
|
|
|
|
|
|
j = 0;
|
|
|
|
for (i = 0; i < linkPlayerCount; i++)
|
2017-11-07 05:03:11 +01:00
|
|
|
{
|
2018-12-28 23:40:25 +01:00
|
|
|
_src = (void *)src + i * recordSize;
|
|
|
|
if (sp1c[i][0] == TRUE || sp1c[i][1] == TRUE)
|
|
|
|
sp34++;
|
|
|
|
|
|
|
|
if (sp1c[i][0] == TRUE && sp1c[i][1] == FALSE)
|
2017-11-07 05:03:11 +01:00
|
|
|
{
|
2018-12-28 23:40:25 +01:00
|
|
|
sp24[j][0] = i;
|
|
|
|
sp24[j][1] = 0;
|
|
|
|
j++;
|
2017-11-07 05:03:11 +01:00
|
|
|
}
|
2018-12-28 23:40:25 +01:00
|
|
|
else if (sp1c[i][0] == FALSE && sp1c[i][1] == TRUE)
|
2017-11-07 05:03:11 +01:00
|
|
|
{
|
2018-12-28 23:40:25 +01:00
|
|
|
sp24[j][0] = i;
|
|
|
|
sp24[j][1] = 1;
|
|
|
|
j++;
|
2017-11-07 05:03:11 +01:00
|
|
|
}
|
2018-12-28 23:40:25 +01:00
|
|
|
else if (sp1c[i][0] == TRUE && sp1c[i][1] == TRUE)
|
2017-11-07 05:03:11 +01:00
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
u32 var1, var2;
|
2018-12-28 23:40:25 +01:00
|
|
|
|
|
|
|
sp24[j][0] = i;
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
var1 = sub_80E7A9C(&_src->mail[0]);
|
|
|
|
var2 = sub_80E7A9C(&_src->mail[1]);
|
2020-10-26 05:10:30 +01:00
|
|
|
if (!(var1 || var2) || (var1 && var2))
|
2017-11-07 05:03:11 +01:00
|
|
|
{
|
2020-10-26 05:10:30 +01:00
|
|
|
sp24[j][1] = Random2() % 2;
|
2017-11-07 05:03:11 +01:00
|
|
|
}
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
else if (var1 && !var2)
|
2017-11-07 05:03:11 +01:00
|
|
|
{
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
sp24[j][1] = 0;
|
2017-11-07 05:03:11 +01:00
|
|
|
}
|
2020-10-26 05:10:30 +01:00
|
|
|
else if (!var1 && var2)
|
|
|
|
{
|
|
|
|
sp24[j][1] = 1;
|
|
|
|
}
|
2018-12-28 23:40:25 +01:00
|
|
|
j++;
|
2017-11-07 05:03:11 +01:00
|
|
|
}
|
|
|
|
}
|
2018-12-28 23:40:25 +01:00
|
|
|
|
|
|
|
for (i = 0; i < 4; i++)
|
2017-11-07 05:03:11 +01:00
|
|
|
{
|
|
|
|
_src = &src[which * recordSize];
|
|
|
|
sp0c[i] = _src;
|
|
|
|
}
|
2018-12-28 23:40:25 +01:00
|
|
|
|
|
|
|
tableId = sub_80E7B54() % 3;
|
2017-11-07 05:03:11 +01:00
|
|
|
switch (sp34)
|
|
|
|
{
|
2018-12-28 23:40:25 +01:00
|
|
|
case 2:
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
sub_80E7AA4(src, recordSize, sp24, 0, 1);
|
2018-12-28 23:40:25 +01:00
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
which0 = gUnknown_0858CFB8[tableId][0];
|
|
|
|
which1 = gUnknown_0858CFB8[tableId][1];
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
sub_80E7AA4(src, recordSize, sp24, which0, which1);
|
2018-12-28 23:40:25 +01:00
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
ptr = sp24;
|
|
|
|
which0 = gUnknown_0858CFBE[tableId][0];
|
|
|
|
which1 = gUnknown_0858CFBE[tableId][1];
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
sub_80E7AA4(src, recordSize, ptr, which0, which1);
|
2018-12-28 23:40:25 +01:00
|
|
|
which0 = gUnknown_0858CFBE[tableId][2];
|
|
|
|
which1 = gUnknown_0858CFBE[tableId][3];
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
sub_80E7AA4(src, recordSize, ptr, which0, which1);
|
2018-12-28 23:40:25 +01:00
|
|
|
break;
|
2017-11-07 05:03:11 +01:00
|
|
|
}
|
2018-12-28 23:40:25 +01:00
|
|
|
|
2017-11-07 05:03:11 +01:00
|
|
|
_src = (void *)src + which * recordSize;
|
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
|
|
|
memcpy(&gSaveBlock1Ptr->daycare.mons[0].mail, &_src->mail[0], sizeof(struct DayCareMail));
|
|
|
|
memcpy(&gSaveBlock1Ptr->daycare.mons[1].mail, &_src->mail[1], sizeof(struct DayCareMail));
|
2017-11-07 05:03:11 +01:00
|
|
|
SeedRng(oldSeed);
|
|
|
|
}
|
2018-12-28 23:40:25 +01:00
|
|
|
|
2017-11-07 05:20:11 +01:00
|
|
|
|
2018-10-22 19:22:57 +02:00
|
|
|
static void ReceiveGiftItem(u16 *item, u8 which)
|
2017-11-07 05:20:11 +01:00
|
|
|
{
|
2018-05-19 12:32:44 +02:00
|
|
|
if (which != 0 && *item != ITEM_NONE && GetPocketByItemId(*item) == POCKET_KEY_ITEMS)
|
2017-11-07 05:20:11 +01:00
|
|
|
{
|
|
|
|
if (!CheckBagHasItem(*item, 1) && !CheckPCHasItem(*item, 1) && AddBagItem(*item, 1))
|
|
|
|
{
|
2018-05-20 12:21:39 +02:00
|
|
|
VarSet(VAR_TEMP_1, *item);
|
2017-11-07 05:20:11 +01:00
|
|
|
StringCopy(gStringVar1, gLinkPlayers[0].name);
|
|
|
|
if (*item == ITEM_EON_TICKET)
|
2020-03-03 07:36:20 +01:00
|
|
|
FlagSet(FLAG_ENABLE_SHIP_SOUTHERN_ISLAND);
|
2017-11-07 05:20:11 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2018-05-20 12:21:39 +02:00
|
|
|
VarSet(VAR_TEMP_1, ITEM_NONE);
|
2017-11-07 05:20:11 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-11-07 05:33:39 +01:00
|
|
|
|
2019-02-11 02:42:50 +01:00
|
|
|
static void Task_DoRecordMixing(u8 taskId)
|
2017-11-07 05:33:39 +01:00
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
struct Task *task = &gTasks[taskId];
|
2017-11-07 05:33:39 +01:00
|
|
|
|
|
|
|
switch (task->data[0])
|
|
|
|
{
|
2018-05-26 00:25:36 +02:00
|
|
|
case 0:
|
|
|
|
task->data[0]++;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
if (Link_AnyPartnersPlayingRubyOrSapphire())
|
|
|
|
task->data[0]++;
|
|
|
|
else
|
|
|
|
task->data[0] = 6;
|
|
|
|
break;
|
2019-02-11 02:42:50 +01:00
|
|
|
|
|
|
|
// Mixing Ruby/Sapphire records.
|
2018-05-26 00:25:36 +02:00
|
|
|
case 2:
|
2018-12-27 23:30:47 +01:00
|
|
|
SetContinueGameWarpStatusToDynamicWarp();
|
2019-02-11 02:42:50 +01:00
|
|
|
FullSaveGame();
|
2018-05-26 00:25:36 +02:00
|
|
|
task->data[0] ++;
|
|
|
|
break;
|
|
|
|
case 3:
|
2019-02-11 02:42:50 +01:00
|
|
|
if (CheckSaveFile())
|
2018-05-26 00:25:36 +02:00
|
|
|
{
|
2018-12-27 23:30:47 +01:00
|
|
|
ClearContinueGameWarpStatus2();
|
2018-05-26 00:25:36 +02:00
|
|
|
task->data[0] = 4;
|
|
|
|
task->data[1] = 0;
|
|
|
|
}
|
|
|
|
break;
|
2019-02-11 02:42:50 +01:00
|
|
|
case 4: // Wait 10 frames
|
2018-05-26 00:25:36 +02:00
|
|
|
if (++task->data[1] > 10)
|
|
|
|
{
|
2020-08-13 09:09:47 +02:00
|
|
|
SetCloseLinkCallback();
|
2017-11-07 05:33:39 +01:00
|
|
|
task->data[0] ++;
|
2018-05-26 00:25:36 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 5:
|
2019-02-11 02:42:50 +01:00
|
|
|
if (gReceivedRemoteLinkPlayers == FALSE)
|
2018-05-26 00:25:36 +02:00
|
|
|
DestroyTask(taskId);
|
|
|
|
break;
|
2019-02-11 02:42:50 +01:00
|
|
|
|
2019-02-18 07:03:44 +01:00
|
|
|
// Mixing Emerald records.
|
2018-05-26 00:25:36 +02:00
|
|
|
case 6:
|
2019-02-11 02:42:50 +01:00
|
|
|
if (!sub_801048C(FALSE))
|
2018-05-26 00:25:36 +02:00
|
|
|
{
|
2020-06-04 00:00:53 +02:00
|
|
|
CreateTask(Task_LinkSave, 5);
|
2018-05-26 00:25:36 +02:00
|
|
|
task->data[0] ++;
|
|
|
|
}
|
|
|
|
break;
|
2020-06-04 00:00:53 +02:00
|
|
|
case 7: // wait for Task_LinkSave to finish.
|
|
|
|
if (!FuncIsActiveTask(Task_LinkSave))
|
2018-05-26 00:25:36 +02:00
|
|
|
{
|
|
|
|
if (gWirelessCommType)
|
2017-11-07 05:33:39 +01:00
|
|
|
{
|
2019-02-11 02:42:50 +01:00
|
|
|
sub_801048C(TRUE);
|
2018-05-26 00:25:36 +02:00
|
|
|
task->data[0] = 8;
|
2017-11-07 05:33:39 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
task->data[0] = 4;
|
|
|
|
}
|
2018-05-26 00:25:36 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 8:
|
2020-08-13 09:09:47 +02:00
|
|
|
SetLinkStandbyCallback();
|
2018-05-26 00:25:36 +02:00
|
|
|
task->data[0] ++;
|
|
|
|
break;
|
|
|
|
case 9:
|
2018-12-31 09:22:21 +01:00
|
|
|
if (IsLinkTaskFinished())
|
2018-05-26 00:25:36 +02:00
|
|
|
DestroyTask(taskId);
|
|
|
|
break;
|
2017-11-07 05:33:39 +01:00
|
|
|
}
|
|
|
|
}
|
2018-05-19 14:30:41 +02:00
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
// New Emerald functions
|
|
|
|
|
2019-11-21 01:00:08 +01:00
|
|
|
static void GetSavedApprentices(struct Apprentice *dst, struct Apprentice *src)
|
2018-05-19 14:30:41 +02:00
|
|
|
{
|
|
|
|
s32 i, id;
|
2019-11-21 01:00:08 +01:00
|
|
|
s32 apprenticeSaveId, oldPlayerApprenticeSaveId;
|
|
|
|
s32 numOldPlayerApprentices, numMixApprentices;
|
2018-05-19 14:30:41 +02:00
|
|
|
|
2018-10-13 20:38:46 +02:00
|
|
|
dst[0].playerName[0] = EOS;
|
|
|
|
dst[1].playerName[0] = EOS;
|
2018-05-22 21:54:57 +02:00
|
|
|
|
|
|
|
dst[0] = src[0];
|
2018-05-19 14:30:41 +02:00
|
|
|
|
2019-11-21 01:00:08 +01:00
|
|
|
oldPlayerApprenticeSaveId = 0;
|
|
|
|
numOldPlayerApprentices = 0;
|
|
|
|
apprenticeSaveId = 0;
|
|
|
|
numMixApprentices = 0;
|
2018-05-19 14:30:41 +02:00
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
{
|
2019-11-23 16:11:05 +01:00
|
|
|
id = ((i + gSaveBlock2Ptr->playerApprentice.saveId) % (APPRENTICE_COUNT - 1)) + 1;
|
2018-10-13 20:38:46 +02:00
|
|
|
if (src[id].playerName[0] != EOS)
|
2018-05-19 14:30:41 +02:00
|
|
|
{
|
2018-11-01 21:31:10 +01:00
|
|
|
if (GetTrainerId(src[id].playerId) != GetTrainerId(gSaveBlock2Ptr->playerTrainerId))
|
2018-05-19 14:30:41 +02:00
|
|
|
{
|
2019-11-21 01:00:08 +01:00
|
|
|
numMixApprentices++;
|
|
|
|
apprenticeSaveId = id;
|
2018-05-19 14:30:41 +02:00
|
|
|
}
|
2018-11-01 21:31:10 +01:00
|
|
|
if (GetTrainerId(src[id].playerId) == GetTrainerId(gSaveBlock2Ptr->playerTrainerId))
|
2018-05-19 14:30:41 +02:00
|
|
|
{
|
2019-11-21 01:00:08 +01:00
|
|
|
numOldPlayerApprentices++;
|
|
|
|
oldPlayerApprenticeSaveId = id;
|
2018-05-19 14:30:41 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-11-21 01:00:08 +01:00
|
|
|
// Prefer passing on other mixed Apprentices rather than old player's Apprentices
|
|
|
|
if (numMixApprentices == 0 && numOldPlayerApprentices != 0)
|
2018-05-19 14:30:41 +02:00
|
|
|
{
|
2019-11-21 01:00:08 +01:00
|
|
|
numMixApprentices = numOldPlayerApprentices;
|
|
|
|
apprenticeSaveId = oldPlayerApprenticeSaveId;
|
2018-05-19 14:30:41 +02:00
|
|
|
}
|
|
|
|
|
2019-11-21 01:00:08 +01:00
|
|
|
switch (numMixApprentices)
|
2018-05-19 14:30:41 +02:00
|
|
|
{
|
|
|
|
case 1:
|
2019-11-21 01:00:08 +01:00
|
|
|
dst[1] = src[apprenticeSaveId];
|
2018-05-19 14:30:41 +02:00
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
if (Random2() > 0x3333)
|
2018-05-22 21:54:57 +02:00
|
|
|
{
|
2019-11-21 01:00:08 +01:00
|
|
|
dst[1] = src[gSaveBlock2Ptr->playerApprentice.saveId + 1];
|
2018-05-22 21:54:57 +02:00
|
|
|
}
|
2018-05-19 14:30:41 +02:00
|
|
|
else
|
2018-05-22 21:54:57 +02:00
|
|
|
{
|
2019-11-23 16:11:05 +01:00
|
|
|
dst[1] = src[((gSaveBlock2Ptr->playerApprentice.saveId + 1) % (APPRENTICE_COUNT - 1) + 1)];
|
2018-05-22 21:54:57 +02:00
|
|
|
}
|
2018-05-19 14:30:41 +02:00
|
|
|
break;
|
|
|
|
}
|
2018-05-22 21:54:57 +02:00
|
|
|
}
|
|
|
|
|
2018-10-28 21:11:53 +01:00
|
|
|
void GetPlayerHallRecords(struct PlayerHallRecords *dst)
|
2018-05-22 21:54:57 +02:00
|
|
|
{
|
|
|
|
s32 i, j;
|
|
|
|
|
2018-10-28 21:11:53 +01:00
|
|
|
for (i = 0; i < HALL_FACILITIES_COUNT; i++)
|
2018-05-22 21:54:57 +02:00
|
|
|
{
|
|
|
|
for (j = 0; j < 2; j++)
|
|
|
|
{
|
2018-11-01 21:31:10 +01:00
|
|
|
CopyTrainerId(dst->onePlayer[i][j].id, gSaveBlock2Ptr->playerTrainerId);
|
2018-10-28 21:11:53 +01:00
|
|
|
dst->onePlayer[i][j].language = GAME_LANGUAGE;
|
|
|
|
StringCopy(dst->onePlayer[i][j].name, gSaveBlock2Ptr->playerName);
|
2018-05-22 21:54:57 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (j = 0; j < 2; j++)
|
|
|
|
{
|
2018-10-28 21:11:53 +01:00
|
|
|
dst->twoPlayers[j].language = GAME_LANGUAGE;
|
2018-11-01 21:31:10 +01:00
|
|
|
CopyTrainerId(dst->twoPlayers[j].id1, gSaveBlock2Ptr->playerTrainerId);
|
2019-11-24 22:58:40 +01:00
|
|
|
CopyTrainerId(dst->twoPlayers[j].id2, gSaveBlock2Ptr->frontier.opponentTrainerIds[j]);
|
2018-10-28 21:11:53 +01:00
|
|
|
StringCopy(dst->twoPlayers[j].name1, gSaveBlock2Ptr->playerName);
|
2019-11-24 22:58:40 +01:00
|
|
|
StringCopy(dst->twoPlayers[j].name2, gSaveBlock2Ptr->frontier.opponentNames[j]);
|
2018-05-22 21:54:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
{
|
2018-10-28 21:11:53 +01:00
|
|
|
dst->onePlayer[0][i].winStreak = gSaveBlock2Ptr->frontier.towerRecordWinStreaks[FRONTIER_MODE_SINGLES][i];
|
|
|
|
dst->onePlayer[1][i].winStreak = gSaveBlock2Ptr->frontier.towerRecordWinStreaks[FRONTIER_MODE_DOUBLES][i];
|
|
|
|
dst->onePlayer[2][i].winStreak = gSaveBlock2Ptr->frontier.towerRecordWinStreaks[FRONTIER_MODE_MULTIS][i];
|
|
|
|
dst->onePlayer[3][i].winStreak = gSaveBlock2Ptr->frontier.domeRecordWinStreaks[FRONTIER_MODE_SINGLES][i];
|
|
|
|
dst->onePlayer[4][i].winStreak = gSaveBlock2Ptr->frontier.palaceRecordWinStreaks[FRONTIER_MODE_SINGLES][i];
|
|
|
|
dst->onePlayer[5][i].winStreak = gSaveBlock2Ptr->frontier.arenaRecordStreaks[i];
|
|
|
|
dst->onePlayer[6][i].winStreak = gSaveBlock2Ptr->frontier.factoryRecordWinStreaks[FRONTIER_MODE_SINGLES][i];
|
|
|
|
dst->onePlayer[7][i].winStreak = gSaveBlock2Ptr->frontier.pikeRecordStreaks[i];
|
|
|
|
dst->onePlayer[8][i].winStreak = gSaveBlock2Ptr->frontier.pyramidRecordStreaks[i];
|
|
|
|
|
|
|
|
dst->twoPlayers[i].winStreak = gSaveBlock2Ptr->frontier.towerRecordWinStreaks[FRONTIER_MODE_LINK_MULTIS][i];
|
2018-05-22 21:54:57 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-11-21 01:00:08 +01:00
|
|
|
static bool32 IsApprenticeAlreadySaved(struct Apprentice *mixApprentice, struct Apprentice *apprentices)
|
2018-05-22 21:54:57 +02:00
|
|
|
{
|
|
|
|
s32 i;
|
|
|
|
|
2019-11-15 00:56:18 +01:00
|
|
|
for (i = 0; i < APPRENTICE_COUNT; i++)
|
2018-05-22 21:54:57 +02:00
|
|
|
{
|
2019-11-15 00:56:18 +01:00
|
|
|
if (GetTrainerId(mixApprentice->playerId) == GetTrainerId(apprentices[i].playerId)
|
|
|
|
&& mixApprentice->number == apprentices[i].number)
|
2018-05-22 21:54:57 +02:00
|
|
|
{
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
2018-05-25 21:00:41 +02:00
|
|
|
|
2019-11-21 01:00:08 +01:00
|
|
|
static void ReceiveApprenticeData(struct Apprentice *mixApprentice, size_t recordSize, u32 multiplayerId)
|
2018-05-25 21:00:41 +02:00
|
|
|
{
|
2019-11-21 01:00:08 +01:00
|
|
|
s32 i, numApprentices, apprenticeId;
|
|
|
|
struct Apprentice *mixApprenticePtr;
|
|
|
|
u32 mixIndices[MAX_LINK_PLAYERS];
|
|
|
|
u32 apprenticeSaveId;
|
2018-05-25 21:00:41 +02:00
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
ShufflePlayerIndices(mixIndices);
|
2019-11-21 01:00:08 +01:00
|
|
|
mixApprenticePtr = (void*)(mixApprentice) + (recordSize * mixIndices[multiplayerId]);
|
|
|
|
numApprentices = 0;
|
|
|
|
apprenticeId = 0;
|
2018-05-25 21:00:41 +02:00
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
{
|
2019-11-21 01:00:08 +01:00
|
|
|
if (mixApprenticePtr[i].playerName[0] != EOS && !IsApprenticeAlreadySaved(&mixApprenticePtr[i], &gSaveBlock2Ptr->apprentices[0]))
|
2018-05-25 21:00:41 +02:00
|
|
|
{
|
2019-11-21 01:00:08 +01:00
|
|
|
numApprentices++;
|
|
|
|
apprenticeId = i;
|
2018-05-25 21:00:41 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-11-21 01:00:08 +01:00
|
|
|
switch (numApprentices)
|
2018-05-25 21:00:41 +02:00
|
|
|
{
|
|
|
|
case 1:
|
2019-11-21 01:00:08 +01:00
|
|
|
apprenticeSaveId = gSaveBlock2Ptr->playerApprentice.saveId + 1;
|
|
|
|
gSaveBlock2Ptr->apprentices[apprenticeSaveId] = mixApprenticePtr[apprenticeId];
|
2019-11-23 16:11:05 +01:00
|
|
|
gSaveBlock2Ptr->playerApprentice.saveId = (gSaveBlock2Ptr->playerApprentice.saveId + 1) % (APPRENTICE_COUNT - 1);
|
2018-05-25 21:00:41 +02:00
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
{
|
2019-11-23 16:11:05 +01:00
|
|
|
apprenticeSaveId = ((i ^ 1) + gSaveBlock2Ptr->playerApprentice.saveId) % (APPRENTICE_COUNT - 1) + 1;
|
2019-11-21 01:00:08 +01:00
|
|
|
gSaveBlock2Ptr->apprentices[apprenticeSaveId] = mixApprenticePtr[i];
|
2018-05-25 21:00:41 +02:00
|
|
|
}
|
2019-11-23 16:11:05 +01:00
|
|
|
gSaveBlock2Ptr->playerApprentice.saveId = (gSaveBlock2Ptr->playerApprentice.saveId + 2) % (APPRENTICE_COUNT - 1);
|
2018-05-25 21:00:41 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-03 18:21:33 +01:00
|
|
|
static void sub_80E8578(struct RecordMixingHallRecords *dst, void *hallRecords, size_t recordSize, u32 arg3, s32 linkPlayerCount)
|
2018-05-25 21:00:41 +02:00
|
|
|
{
|
2018-11-03 18:21:33 +01:00
|
|
|
s32 i, j, k, l;
|
|
|
|
s32 var_68;
|
|
|
|
|
|
|
|
k = 0;
|
|
|
|
i = 0;
|
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
if (i >= linkPlayerCount)
|
|
|
|
break;
|
|
|
|
if (i != arg3)
|
|
|
|
gUnknown_03001168[k++] = hallRecords;
|
|
|
|
|
|
|
|
if (k == 3)
|
|
|
|
break;
|
|
|
|
hallRecords += recordSize;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < HALL_FACILITIES_COUNT; i++)
|
|
|
|
{
|
|
|
|
for (j = 0; j < 2; j++)
|
|
|
|
{
|
|
|
|
for (k = 0; k < 3; k++)
|
|
|
|
dst->hallRecords1P[i][j][k] = gSaveBlock2Ptr->hallRecords1P[i][j][k];
|
|
|
|
|
|
|
|
for (k = 0; k < linkPlayerCount - 1; k++)
|
|
|
|
{
|
|
|
|
var_68 = 0;
|
|
|
|
for (l = 0; l < 3; l++)
|
|
|
|
{
|
|
|
|
if (GetTrainerId(dst->hallRecords1P[i][j][l].id) == GetTrainerId(gUnknown_03001168[k]->onePlayer[i][j].id))
|
|
|
|
{
|
|
|
|
var_68++;
|
|
|
|
if (dst->hallRecords1P[i][j][l].winStreak < gUnknown_03001168[k]->onePlayer[i][j].winStreak)
|
|
|
|
dst->hallRecords1P[i][j][l] = gUnknown_03001168[k]->onePlayer[i][j];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (var_68 == 0)
|
|
|
|
dst->hallRecords1P[i][j][k + 3] = gUnknown_03001168[k]->onePlayer[i][j];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (j = 0; j < 2; j++)
|
|
|
|
{
|
|
|
|
for (k = 0; k < 3; k++)
|
|
|
|
dst->hallRecords2P[j][k] = gSaveBlock2Ptr->hallRecords2P[j][k];
|
|
|
|
|
|
|
|
for (k = 0; k < linkPlayerCount - 1; k++)
|
|
|
|
{
|
|
|
|
var_68 = 0;
|
|
|
|
for (l = 0; l < 3; l++)
|
|
|
|
{
|
|
|
|
if (GetTrainerId(dst->hallRecords2P[j][l].id1) == GetTrainerId(gUnknown_03001168[k]->twoPlayers[j].id1)
|
|
|
|
&& GetTrainerId(dst->hallRecords2P[j][l].id2) == GetTrainerId(gUnknown_03001168[k]->twoPlayers[j].id2))
|
|
|
|
{
|
|
|
|
var_68++;
|
|
|
|
if (dst->hallRecords2P[j][l].winStreak < gUnknown_03001168[k]->twoPlayers[j].winStreak)
|
|
|
|
dst->hallRecords2P[j][l] = gUnknown_03001168[k]->twoPlayers[j];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (var_68 == 0)
|
|
|
|
dst->hallRecords2P[j][k + 3] = gUnknown_03001168[k]->twoPlayers[j];
|
|
|
|
}
|
|
|
|
}
|
2018-05-25 21:00:41 +02:00
|
|
|
}
|
|
|
|
|
2018-10-28 21:11:53 +01:00
|
|
|
static void sub_80E8880(struct RankingHall1P *arg0, struct RankingHall1P *arg1)
|
2018-05-25 21:00:41 +02:00
|
|
|
{
|
|
|
|
s32 i, j;
|
|
|
|
|
|
|
|
for (i = 0; i < 3; i++)
|
|
|
|
{
|
2018-10-28 21:11:53 +01:00
|
|
|
s32 highestWinStreak = 0;
|
|
|
|
s32 highestId = -1;
|
2018-05-25 21:00:41 +02:00
|
|
|
for (j = 0; j < 6; j++)
|
|
|
|
{
|
2018-10-28 21:11:53 +01:00
|
|
|
if (arg1[j].winStreak > highestWinStreak)
|
2018-05-25 21:00:41 +02:00
|
|
|
{
|
2018-10-28 21:11:53 +01:00
|
|
|
highestId = j;
|
|
|
|
highestWinStreak = arg1[j].winStreak;
|
2018-05-25 21:00:41 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-28 21:11:53 +01:00
|
|
|
if (highestId >= 0)
|
2018-05-25 21:00:41 +02:00
|
|
|
{
|
2018-10-28 21:11:53 +01:00
|
|
|
arg0[i] = arg1[highestId];
|
|
|
|
arg1[highestId].winStreak = 0;
|
2018-05-25 21:00:41 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-28 21:11:53 +01:00
|
|
|
static void sub_80E88CC(struct RankingHall2P *arg0, struct RankingHall2P *arg1)
|
2018-05-25 21:00:41 +02:00
|
|
|
{
|
|
|
|
s32 i, j;
|
|
|
|
|
|
|
|
for (i = 0; i < 3; i++)
|
|
|
|
{
|
2018-10-28 21:11:53 +01:00
|
|
|
s32 highestWinStreak = 0;
|
|
|
|
s32 highestId = -1;
|
2018-05-25 21:00:41 +02:00
|
|
|
for (j = 0; j < 6; j++)
|
|
|
|
{
|
2018-10-28 21:11:53 +01:00
|
|
|
if (arg1[j].winStreak > highestWinStreak)
|
2018-05-25 21:00:41 +02:00
|
|
|
{
|
2018-10-28 21:11:53 +01:00
|
|
|
highestId = j;
|
|
|
|
highestWinStreak = arg1[j].winStreak;
|
2018-05-25 21:00:41 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-28 21:11:53 +01:00
|
|
|
if (highestId >= 0)
|
2018-05-25 21:00:41 +02:00
|
|
|
{
|
2018-10-28 21:11:53 +01:00
|
|
|
arg0[i] = arg1[highestId];
|
|
|
|
arg1[highestId].winStreak = 0;
|
2018-05-25 21:00:41 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-28 21:11:53 +01:00
|
|
|
static void sub_80E8924(struct RecordMixingHallRecords *arg0)
|
2018-05-25 21:00:41 +02:00
|
|
|
{
|
2018-10-28 21:11:53 +01:00
|
|
|
s32 i, j;
|
|
|
|
|
|
|
|
for (i = 0; i < HALL_FACILITIES_COUNT; i++)
|
|
|
|
{
|
|
|
|
for (j = 0; j < 2; j++)
|
|
|
|
sub_80E8880(gSaveBlock2Ptr->hallRecords1P[i][j], arg0->hallRecords1P[i][j]);
|
|
|
|
}
|
|
|
|
for (j = 0; j < 2; j++)
|
|
|
|
sub_80E88CC(gSaveBlock2Ptr->hallRecords2P[j], arg0->hallRecords2P[j]);
|
2018-05-25 21:00:41 +02:00
|
|
|
}
|
|
|
|
|
2018-11-03 18:21:33 +01:00
|
|
|
static void ReceiveRankingHallRecords(struct PlayerHallRecords *hallRecords, size_t recordSize, u32 arg2)
|
2018-05-25 21:00:41 +02:00
|
|
|
{
|
|
|
|
u8 linkPlayerCount = GetLinkPlayerCount();
|
2018-10-28 21:11:53 +01:00
|
|
|
struct RecordMixingHallRecords *largeStructPtr = AllocZeroed(sizeof(struct RecordMixingHallRecords));
|
2018-05-25 21:00:41 +02:00
|
|
|
|
2018-11-03 18:21:33 +01:00
|
|
|
sub_80E8578(largeStructPtr, hallRecords, recordSize, arg2, linkPlayerCount);
|
2018-05-25 21:00:41 +02:00
|
|
|
sub_80E8924(largeStructPtr);
|
|
|
|
|
|
|
|
Free(largeStructPtr);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80E89F8(struct RecordMixingDayCareMail *dst)
|
|
|
|
{
|
|
|
|
gUnknown_02039F9C.mail[0] = gSaveBlock1Ptr->daycare.mons[0].mail;
|
|
|
|
gUnknown_02039F9C.mail[1] = gSaveBlock1Ptr->daycare.mons[1].mail;
|
|
|
|
InitDaycareMailRecordMixing(&gSaveBlock1Ptr->daycare, &gUnknown_02039F9C);
|
|
|
|
*dst = *gUnknown_03001148;
|
|
|
|
}
|
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void SanitizeDayCareMailForRuby(struct RecordMixingDayCareMail *src)
|
2018-05-25 21:00:41 +02:00
|
|
|
{
|
|
|
|
s32 i;
|
|
|
|
|
|
|
|
for (i = 0; i < src->numDaycareMons; i++)
|
|
|
|
{
|
|
|
|
struct DayCareMail *mail = &src->mail[i];
|
|
|
|
if (mail->message.itemId != 0)
|
|
|
|
{
|
|
|
|
if (mail->gameLanguage != LANGUAGE_JAPANESE)
|
2018-11-28 00:21:23 +01:00
|
|
|
PadNameString(mail->OT_name, EXT_CTRL_CODE_BEGIN);
|
2018-05-25 21:00:41 +02:00
|
|
|
|
|
|
|
ConvertInternationalString(mail->monName, mail->monLanguage);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void SanitizeRubyBattleTowerRecord(struct RSBattleTowerRecord *src)
|
2018-05-25 21:00:41 +02:00
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
static void SanitizeEmeraldBattleTowerRecord(struct EmeraldBattleTowerRecord *dst)
|
2018-05-25 21:00:41 +02:00
|
|
|
{
|
|
|
|
s32 i;
|
|
|
|
|
|
|
|
for (i = 0; i < 4; i++)
|
|
|
|
{
|
2018-12-10 21:49:33 +01:00
|
|
|
struct BattleTowerPokemon *towerMon = &dst->party[i];
|
2018-05-25 21:00:41 +02:00
|
|
|
if (towerMon->species != 0)
|
|
|
|
StripExtCtrlCodes(towerMon->nickname);
|
|
|
|
}
|
|
|
|
|
2018-05-26 00:25:36 +02:00
|
|
|
CalcEmeraldBattleTowerChecksum(dst);
|
2018-05-25 21:00:41 +02:00
|
|
|
}
|