summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDizzyEggg <jajkodizzy@wp.pl>2018-06-03 22:39:10 +0200
committerDizzyEggg <jajkodizzy@wp.pl>2018-06-03 22:39:10 +0200
commite50f4b499928ac9010ecd96cff96de9f7bda2846 (patch)
treed893e796ee26fd59170c4c5b1b064d9c5463c38b /src
parente95b1156d22e2652b6d13ea1af123aed7ab5221c (diff)
still going
Diffstat (limited to 'src')
-rw-r--r--src/rom_8011DC0.c385
-rw-r--r--src/walda_phrase.c1
2 files changed, 383 insertions, 3 deletions
diff --git a/src/rom_8011DC0.c b/src/rom_8011DC0.c
index e73030e75..514fd49a7 100644
--- a/src/rom_8011DC0.c
+++ b/src/rom_8011DC0.c
@@ -14,6 +14,16 @@
#include "script.h"
#include "sound.h"
#include "constants/songs.h"
+#include "constants/game_stat.h"
+#include "trade.h"
+#include "trainer_card.h"
+#include "overworld.h"
+#include "battle.h"
+#include "load_save.h"
+#include "cable_club.h"
+#include "field_control_avatar.h"
+
+extern void HealPlayerParty(void);
struct UnkStruct_Shared
{
@@ -105,11 +115,30 @@ union UnkUnion_Main
struct UnkStruct_Group *group;
};
+struct TradeUnkStruct
+{
+ u16 field_0;
+ u16 field_2;
+ u32 field_4;
+ u32 field_8;
+ u16 field_A;
+ u16 field_C;
+ u16 field_E;
+ u16 field_10;
+ u16 field_12;
+ u32 field_14;
+};
+
+extern struct TradeUnkStruct gUnknown_02022C40;
+
extern union UnkUnion_Main gUnknown_02022C30;
extern u8 gUnknown_02022C2C;
extern u8 gUnknown_02022C2D;
+extern u8 gFieldLinkPlayerCount;
+extern u8 gUnknown_03005DB4;
+
// IWRAM vars
IWRAM_DATA struct UnkStruct_Leader *gUnknown_03000DA0;
IWRAM_DATA struct UnkStruct_Group *gUnknown_03000DA4;
@@ -122,6 +151,7 @@ void sub_80173E0(u8 windowId, u8 arg1, const u8 *str, u8 arg3, u8 arg4, u8 arg5)
u16 ReadAsU16(const u8 *ptr);
void sub_8012780(u8 taskId);
void sub_80134E8(u8 taskId);
+void sub_8013C7C(u8 taskId);
void sub_80175EC(struct UnkStruct_Main4 *arg0, u8 count);
void sub_8017580(struct UnkStruct_Main0 *arg0, u8 count);
u8 sub_8016FC0(struct UnkStruct_Main4 *arg0, u32 arg1);
@@ -135,11 +165,17 @@ void sub_80149C4(void);
u8 sub_80132D4(struct UnkStruct_Main0 *arg0);
void sub_80178A0(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 *arg3, u8 arg4, u8 id);
u32 sub_80176E4(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1);
-void sub_8017734(struct UnkStruct_x20 *arg0, struct UnkStruct_Shared *arg1, u8 arg2);
+u8 sub_8017734(struct UnkStruct_x20 *arg0, struct UnkStruct_Shared *arg1, u8 arg2);
u8 sub_8013E44(void);
u32 sub_8013B8C(struct UnkStruct_Group *arg0, s32 id);
void sub_8013BD8(struct UnkStruct_Group *arg0, s32 id);
void sub_80173D4(void);
+void sub_80177B8(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 *arg3, u8 arg4, u8 id);
+bool32 sub_8017678(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1);
+u32 sub_8018120(struct TradeUnkStruct *arg0, u8 multiplayerId);
+void sub_801807C(struct TradeUnkStruct *arg0);
+void sub_801B940(void);
+void sub_801B94C(u16);
// const rom data
extern const u8 *const gUnknown_082EDB60[][5];
@@ -914,7 +950,7 @@ void sub_80134E8(u8 taskId)
id = ListMenuHandleInputGetItemId(data->listTaskId);
if (gMain.newKeys & A_BUTTON && id != -1)
{
- // this unused variable is needed to match
+ // this unused variable along with the assignment is needed to match
u32 unusedVar;
unusedVar = data->field_0->arr[id].unk.field_0.unk_0a_0;
@@ -1114,3 +1150,348 @@ void sub_80134E8(u8 taskId)
break;
}
}
+
+u32 sub_8013B8C(struct UnkStruct_Group *arg0, s32 id)
+{
+ struct UnkStruct_x20 *structPtr = &arg0->field_0->arr[id];
+
+ if (gUnknown_02022C2C == 4 && structPtr->unk.field_0.unk_01_2 != 3)
+ {
+ if (!(gSaveBlock2Ptr->specialSaveWarp & 0x80))
+ return 1;
+ else if (structPtr->unk.field_0.unk_00_7)
+ return 0;
+ }
+ else
+ {
+ return 0;
+ }
+
+ return 2;
+}
+
+void sub_8013BD8(struct UnkStruct_Group *data, s32 id)
+{
+ data->field_F = id;
+ sub_800E0E8();
+ CreateWirelessStatusIndicatorSprite(0, 0);
+ sub_81AE70C(data->listTaskId);
+ sub_8018404(gStringVar1, &data->field_0->arr[data->field_F]);
+ sub_8011090(gUnknown_082F0530[gSpecialVar_0x8004], 0, 1);
+ sub_8011FC8(data->field_0->arr[data->field_F].unk.playerName, ReadAsU16(data->field_0->arr[data->field_F].unk.field_0.playerTrainerId));
+}
+
+u8 sub_8013C40(void)
+{
+ u8 taskId;
+ struct UnkStruct_Group *dataPtr;
+
+ taskId = CreateTask(sub_8013C7C, 0);
+ gUnknown_02022C30.group = dataPtr = (void*)(gTasks[taskId].data);
+
+ dataPtr->state = 0;
+ dataPtr->textState = 0;
+
+ gUnknown_03000DA4 = dataPtr;
+
+ return taskId;
+}
+
+void sub_8013C7C(u8 taskId)
+{
+ struct UnkStruct_Group *data = gUnknown_02022C30.group;
+
+ switch (data->state)
+ {
+ case 0:
+ sub_8010F84(0, 0, 0);
+ sub_800B488();
+ OpenLink();
+ sub_8011C5C();
+ sub_80111B0(TRUE);
+ data->field_4 = AllocZeroed(0x70);
+ data->field_0 = AllocZeroed(0x200);
+ data->state = 2;
+ break;
+ case 2:
+ sub_80175EC(data->field_4, 4);
+ sub_8017580(data->field_0, 16);
+ data->field_11 = sub_8016FC0(data->field_4, 0xFF);
+ data->field_F = 0;
+ data->state = 3;
+ break;
+ case 3:
+ if (sub_8013E44() == 1)
+ PlaySE(SE_PC_LOGIN);
+ if (gTasks[taskId].data[15] == 0xFF)
+ data->state = 10;
+ break;
+ case 10:
+ DestroyTask(data->field_11);
+ Free(data->field_0);
+ Free(data->field_4);
+ sub_800EDD4();
+ data->state++;
+ break;
+ case 11:
+ sub_800EDD4();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+extern const u8 *const gUnknown_082F04D8[22];
+
+bool32 sub_8013D88(u32 arg0, u32 id)
+{
+ if (id == 0xFF)
+ return TRUE;
+
+ if (id <= ARRAY_COUNT(gUnknown_082F04D8)) // UB: <= may access data outside the array
+ {
+ const u8 *bytes = gUnknown_082F04D8[id];
+
+ while ((*(bytes) != 0xFF))
+ {
+ if ((*bytes) == arg0)
+ return TRUE;
+ bytes++;
+ }
+ }
+
+ return FALSE;
+}
+
+u8 sub_8013DBC(struct UnkStruct_Group *data, u32 id)
+{
+ if (data->field_0->arr[id].field_1A_0 == 1)
+ {
+ if (data->field_0->arr[id].unk.field_0.unk_0a_7 != 0)
+ return 3;
+ else if (data->field_0->arr[id].field_1A_1 != 0)
+ return 1;
+ else if (data->field_0->arr[id].field_1B != 0)
+ return 2;
+ }
+
+ return 0;
+}
+
+void sub_8013DF4(u8 arg0, u32 id, u8 arg2)
+{
+ struct UnkStruct_Group *data = gUnknown_02022C30.group;
+ u8 var = sub_8013DBC(data, id);
+
+ sub_80177B8(arg0, 8, arg2, &data->field_0->arr[id], var, id);
+}
+
+u8 sub_8013E44(void)
+{
+ struct UnkStruct_Group *data = gUnknown_02022C30.group;
+ u8 ret = 0;
+ u8 i;
+ s32 id;
+
+ for (i = 0; i < 16; i++)
+ {
+ if (data->field_0->arr[i].field_1A_0 != 0)
+ {
+ id = sub_80176E4(&data->field_0->arr[i], data->field_4->arr);
+ if (id != 0xFF)
+ {
+ if (data->field_0->arr[i].field_1A_0 == 1)
+ {
+ if (sub_8017678(&data->field_0->arr[i], &data->field_4->arr[id]))
+ {
+ data->field_0->arr[i].unk = data->field_4->arr[id].unk0;
+ data->field_0->arr[i].field_1B = 0x40;
+ ret = 1;
+ }
+ else
+ {
+ if (data->field_0->arr[i].field_1B != 0)
+ {
+ data->field_0->arr[i].field_1B--;
+ if (data->field_0->arr[i].field_1B == 0)
+ ret = 2;
+ }
+ }
+ }
+ else
+ {
+ data->field_0->arr[i].field_1A_0 = 1;
+ data->field_0->arr[i].field_1B = 0x40;
+ ret = 1;
+ }
+
+ data->field_0->arr[i].field_18 = 0;
+ }
+ else
+ {
+ if (data->field_0->arr[i].field_1A_0 != 2)
+ {
+ data->field_0->arr[i].field_18++;
+ if (data->field_0->arr[i].field_18 >= 300)
+ {
+ data->field_0->arr[i].field_1A_0 = 2;
+ ret = 2;
+ }
+ }
+ }
+ }
+ }
+
+ for (id = 0; id < 4; id++)
+ {
+ if (sub_8017734(data->field_0->arr, &data->field_4->arr[id].unk0, 16) != 0xFF)
+ ret = 1;
+ }
+
+ return ret;
+}
+
+void sub_8013F60(u8 taskId)
+{
+ sub_80773AC();
+ DestroyTask(taskId);
+}
+
+u8 sub_8013F78(void)
+{
+ u8 taskId = CreateTask(sub_8013F60, 0);
+
+ return taskId;
+}
+
+extern struct MailStruct gUnknown_020321C0[PARTY_SIZE];
+extern u8 gUnknown_02032298[2];
+
+void sub_8013F90(u8 taskId)
+{
+ u32 monId = sub_8018120(&gUnknown_02022C40, GetMultiplayerId());
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ gTasks[taskId].data[0]++;
+ SendBlock(0, &gPlayerParty[monId], sizeof(struct Pokemon));
+ break;
+ case 1:
+ if (GetBlockReceivedStatus() == 3)
+ {
+ gEnemyParty[0] = *(struct Pokemon*)(gBlockRecvBuffer[GetMultiplayerId() ^ 1]);
+ IncrementGameStat(GAME_STAT_50);
+ ResetBlockReceivedFlags();
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 2:
+ memcpy(gBlockSendBuffer, gSaveBlock1Ptr->mail, sizeof(struct MailStruct) * PARTY_SIZE + 4);
+ if (SendBlock(0, gBlockSendBuffer, sizeof(struct MailStruct) * PARTY_SIZE + 4))
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ if (GetBlockReceivedStatus() == 3)
+ {
+ memcpy(gUnknown_020321C0, gBlockRecvBuffer[GetMultiplayerId() ^ 1], sizeof(struct MailStruct) * PARTY_SIZE);
+ ResetBlockReceivedFlags();
+ gUnknown_02032298[0] = monId;
+ gUnknown_02032298[1] = 6;
+ gMain.savedCallback = CB2_ReturnToField;
+ SetMainCallback2(sub_807AE50);
+ sub_801807C(&gUnknown_02022C40);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_80140E0(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (GetMultiplayerId() == 0)
+ sub_800A4D8(2);
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ if (GetBlockReceivedStatus() == sub_800A9D8())
+ {
+ s32 i;
+ u16 *recvBuff;
+
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ recvBuff = gBlockRecvBuffer[i];
+ sub_80C3120(&gTrainerCards[i], recvBuff, gLinkPlayers[i].version);
+ }
+
+ if (GetLinkPlayerCount() == 2)
+ {
+ recvBuff = gBlockRecvBuffer[GetMultiplayerId() ^ 1];
+ sub_801B94C(recvBuff[48]);
+ }
+ else
+ {
+ sub_801B940();
+ }
+
+ ResetBlockReceivedFlags();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_80141A4(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ CreateTask(sub_80140E0, 5);
+ gMain.state++;
+ break;
+ case 1:
+ if (!FuncIsActiveTask(sub_80140E0))
+ sub_80C4E74(GetMultiplayerId() ^ 1, CB2_ReturnToField);
+ break;
+ }
+
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+}
+
+void sub_8014210(u16 battleFlags)
+{
+ HealPlayerParty();
+ SavePlayerParty();
+ LoadPlayerBag();
+ gLinkPlayers[0].linkType = 0x2211;
+ gLinkPlayers[GetMultiplayerId()].lp_field_18 = GetMultiplayerId();
+ gLinkPlayers[GetMultiplayerId() ^ 1].lp_field_18 = GetMultiplayerId() ^ 1;
+ gMain.savedCallback = sub_80B360C;
+ gBattleTypeFlags = battleFlags;
+ PlayBattleBGM();
+}
+
+void sub_8014290(u16 arg0, u16 x, u16 y)
+{
+ VarSet(VAR_0x4087, arg0);
+ Overworld_SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y);
+ saved_warp2_set_2(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y);
+ warp_in();
+}
+
+void sub_8014304(s8 mapGroup, s8 mapNum, s32 x, s32 y, u16 arg4)
+{
+ gSpecialVar_0x8004 = arg4;
+ VarSet(VAR_0x4087, arg4);
+ gFieldLinkPlayerCount = GetLinkPlayerCount();
+ gUnknown_03005DB4 = GetMultiplayerId();
+ sub_809D2BC();
+ Overworld_SetWarpDestination(mapGroup, mapNum, -1, x, y);
+ warp_in();
+}
diff --git a/src/walda_phrase.c b/src/walda_phrase.c
index 0aa6f5aca..4a82be14f 100644
--- a/src/walda_phrase.c
+++ b/src/walda_phrase.c
@@ -13,7 +13,6 @@ extern const u8 gText_Peekaboo[];
extern u8 *GetWaldaPhrasePtr(void);
extern bool32 IsWaldaPhraseEmpty(void);
extern void sub_80AF168(void);
-extern void CB2_ReturnToField(void);
extern void SetWaldaPhrase(const u8 *src);
extern void SetWaldaWallpaperPatternId(u8 patternId);
extern void SetWaldaWallpaperIconId(u8 iconId);