summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2019-10-30 12:49:16 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2019-10-30 12:49:16 -0400
commit2c2c179eb9b92d0998922cc96a115d3d1671a64b (patch)
treeee2668e781351e73703b7e0ef3da21042546e675 /src
parent265f8b5b259221dfa1a5fc5537059f262036eb52 (diff)
Finish trade code
Diffstat (limited to 'src')
-rw-r--r--src/load_save.c4
-rw-r--r--src/save.c8
-rw-r--r--src/start_menu.c4
-rw-r--r--src/trade.c363
4 files changed, 367 insertions, 12 deletions
diff --git a/src/load_save.c b/src/load_save.c
index 0a7bbbfc5..583844d17 100644
--- a/src/load_save.c
+++ b/src/load_save.c
@@ -146,13 +146,13 @@ void sub_804C1AC(void)
gSaveBlock2Ptr->specialSaveWarpFlags |= CONTINUE_GAME_WARP;
}
-void sub_804C1C0(void)
+void SetContinueGameWarpStatusToDynamicWarp(void)
{
sub_8055778(0);
gSaveBlock2Ptr->specialSaveWarpFlags |= CONTINUE_GAME_WARP;
}
-void sav2_gender2_inplace_and_xFE(void)
+void ClearContinueGameWarpStatus2(void)
{
gSaveBlock2Ptr->specialSaveWarpFlags &= ~CONTINUE_GAME_WARP;
}
diff --git a/src/save.c b/src/save.c
index 45f5fc6f0..30d2c22a9 100644
--- a/src/save.c
+++ b/src/save.c
@@ -70,8 +70,8 @@ extern void DoSaveFailedScreen(u8 saveType); // save_failed_screen
extern void sub_800AB9C(void); // link
extern bool8 IsLinkTaskFinished(void); // link
extern void save_serialize_map(void); // fieldmap
-extern void sub_804C1C0(void); // load_save
-extern void sav2_gender2_inplace_and_xFE(void); // load_save
+extern void SetContinueGameWarpStatusToDynamicWarp(void); // load_save
+extern void ClearContinueGameWarpStatus2(void); // load_save
// Sector num to begin writing save data. Sectors are rotated each time the game is saved. (possibly to avoid wear on flash memory?)
u16 gFirstSaveSector;
@@ -872,7 +872,7 @@ void sub_80DA634(u8 taskId)
}
break;
case 3:
- sub_804C1C0();
+ SetContinueGameWarpStatusToDynamicWarp();
sub_80DA3AC();
gTasks[taskId].data[0] = 4;
break;
@@ -894,7 +894,7 @@ void sub_80DA634(u8 taskId)
gTasks[taskId].data[0] = 7;
break;
case 7:
- sav2_gender2_inplace_and_xFE();
+ ClearContinueGameWarpStatus2();
sub_800AB9C();
gTasks[taskId].data[0] = 8;
break;
diff --git a/src/start_menu.c b/src/start_menu.c
index dddb5f44e..4a4fe52e3 100644
--- a/src/start_menu.c
+++ b/src/start_menu.c
@@ -923,14 +923,14 @@ static void task50_after_link_battle_save(u8 taskId)
data[0] = 1;
break;
case 1:
- sub_804C1C0();
+ SetContinueGameWarpStatusToDynamicWarp();
sub_80DA45C();
data[0] = 2;
break;
case 2:
if (sub_80DA4A0())
{
- sav2_gender2_inplace_and_xFE();
+ ClearContinueGameWarpStatus2();
data[0] = 3;
}
break;
diff --git a/src/trade.c b/src/trade.c
index f33388eed..6f35c1880 100644
--- a/src/trade.c
+++ b/src/trade.c
@@ -15,6 +15,12 @@
#include "mail_data.h"
#include "graphics.h"
#include "link.h"
+#include "random.h"
+#include "save.h"
+#include "load_save.h"
+#include "quest_log.h"
+#include "field_fadetransition.h"
+#include "mevent.h"
#include "help_system.h"
#include "link_rfu.h"
#include "cable_club.h"
@@ -29,6 +35,7 @@
#include "party_menu.h"
#include "util.h"
#include "daycare.h"
+#include "script.h"
#include "event_data.h"
#include "battle_interface.h"
#include "pokemon_summary_screen.h"
@@ -137,9 +144,14 @@ struct TradeAnimationResources {
/*0xF6*/ u8 unk_F6;
/*0xF8*/ u16 monSpecies[2];
/*0xFC*/ u8 unk_FC[7];
- /*0x103*/ u8 filler_103[5];
+ /*0x103*/ u8 filler_103[1];
+ /*0x104*/ u8 textColor[3];
+ /*0x107*/ u8 filler_107[1];
/*0x108*/ u8 isCableTrade;
- /*0x109*/ u8 filler_109[7];
+ /*0x109*/ u8 win0left;
+ /*0x10A*/ u8 win0top;
+ /*0x10B*/ u8 win0right;
+ /*0x10C*/ u8 win0bottom;
};
enum TradeStatusMsg
@@ -210,13 +222,25 @@ static void GetInGameTradeMail(struct MailStruct * mail, const struct InGameTrad
void CB2_RunTradeAnim_LinkTrade(void);
void sub_8053E1C(void);
void sub_8053E8C(void);
-void LoadHeldItemIcons(void);
-void DrawTextOnTradeWindow(u8 windowId, const u8 *str, s8 speed);
+void sub_80543C4(void);
+void sub_8054470(u8 taskId);
void CheckPartnersMonForRibbons(void);
+void DrawTextOnTradeWindow(u8 windowId, const u8 *str, s8 speed);
void Task_AnimateWirelessSignal(u8 taskId);
void c3_0805465C(u8 taskId);
void sub_8054734(u8 taskId);
+static const size_t gUnknown_8260814[] = {
+ sizeof(struct SaveBlock2),
+ sizeof(struct SaveBlock1),
+ sizeof(struct MapData),
+ 0x530, // unk
+ 0x34, // unk
+ sizeof(struct MailStruct),
+ sizeof(struct Pokemon),
+ 0x528 // unk
+};
+
extern const u16 gUnknown_8260C30[];
extern const u16 gUnknown_8261430[];
extern const struct BgTemplate gUnknown_8261F1C[4];
@@ -251,6 +275,8 @@ extern const u16 gUnknown_8269A5C[];
extern const u32 gUnknown_3379A0Bin[];
extern const u16 gUnknown_826407C[];
extern const u16 gUnknown_826601C[];
+extern const u16 gUnknown_826BB5C[];
+extern const u16 gUnknown_826BD5C[];
extern const u16 gUnknown_826BF5C[];
extern const u16 gUnknown_826701C[];
extern const u16 gUnknown_826985C[];
@@ -273,6 +299,7 @@ extern const union AffineAnimCmd *const gUnknown_826CF88[];
extern const struct SpriteTemplate gUnknown_826CF48;
extern const s8 gUnknown_826D1E4[];
extern const u16 sInGameTradeMailMessages[][10];
+extern const u8 gUnknown_826D250[][2];
void sub_804C600(void)
{
@@ -6034,3 +6061,331 @@ void sub_8053E1C(void)
BuildOamBuffer();
UpdatePaletteFade();
}
+
+void sub_8053E8C(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ gMain.state++;
+ StringExpandPlaceholders(gStringVar4, gUnknown_841E325);
+ DrawTextOnTradeWindow(0, gStringVar4, 0);
+ break;
+ case 1:
+ sub_800AB9C();
+ gMain.state = 100;
+ sTradeData->timer = 0;
+ break;
+ case 100:
+ if (++sTradeData->timer > 180)
+ {
+ gMain.state = 101;
+ sTradeData->timer = 0;
+ }
+ if (IsLinkTaskFinished())
+ {
+ gMain.state = 2;
+ }
+ break;
+ case 101:
+ if (IsLinkTaskFinished())
+ {
+ gMain.state = 2;
+ }
+ break;
+ case 2:
+ gMain.state = 50;
+ StringExpandPlaceholders(gStringVar4, gText_SavingDontTurnOffThePower2);
+ DrawTextOnTradeWindow(0, gStringVar4, 0);
+ break;
+ case 50:
+ if (InUnionRoom())
+ {
+ sub_8113550(18, sTradeData->monSpecies);
+ }
+ else
+ {
+ sub_8113550(12, sTradeData->monSpecies);
+ IncrementGameStat(GAME_STAT_POKEMON_TRADES);
+ }
+ if (gWirelessCommType)
+ {
+ sub_8144714(2, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
+ }
+ SetContinueGameWarpStatusToDynamicWarp();
+ sub_80DA3AC();
+ gMain.state++;
+ sTradeData->timer = 0;
+ break;
+ case 51:
+ if (++sTradeData->timer == 5)
+ {
+ gMain.state++;
+ }
+ break;
+ case 52:
+ if (sub_80DA3D8())
+ {
+ ClearContinueGameWarpStatus2();
+ gMain.state = 4;
+ }
+ else
+ {
+ sTradeData->timer = 0;
+ gMain.state = 51;
+ }
+ break;
+ case 4:
+ sub_80DA40C();
+ gMain.state = 40;
+ sTradeData->timer = 0;
+ break;
+ case 40:
+ if (++sTradeData->timer > 50)
+ {
+ if (GetMultiplayerId() == 0)
+ {
+ sTradeData->timer = Random() % 30;
+ }
+ else
+ {
+ sTradeData->timer = 0;
+ }
+ gMain.state = 41;
+ }
+ break;
+ case 41:
+ if (sTradeData->timer == 0)
+ {
+ sub_800AB9C();
+ gMain.state = 42;
+ }
+ else
+ {
+ sTradeData->timer--;
+ }
+ break;
+ case 42:
+ if (IsLinkTaskFinished())
+ {
+ sub_80DA434();
+ gMain.state = 5;
+ }
+ break;
+ case 5:
+ if (++sTradeData->timer > 60)
+ {
+ gMain.state++;
+ sub_800AB9C();
+ }
+ break;
+ case 6:
+ if (IsLinkTaskFinished())
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gMain.state ++;
+ }
+ break;
+ case 7:
+ if (!gPaletteFade.active)
+ {
+ FadeOutBGM(3);
+ gMain.state++;
+ }
+ break;
+ case 8:
+ if (IsBGMStopped() == TRUE)
+ {
+ if (gWirelessCommType && gMain.savedCallback == sub_804C718)
+ {
+ sub_800AB9C();
+ }
+ else
+ {
+ sub_800AAC0();
+ }
+ gMain.state++;
+ }
+ break;
+ case 9:
+ if (gWirelessCommType && gMain.savedCallback == sub_804C718)
+ {
+ if (IsLinkRfuTaskFinished())
+ {
+ gSoftResetDisabled = FALSE;
+ SetMainCallback2(sub_80543C4);
+ }
+ }
+ else if (!gReceivedRemoteLinkPlayers)
+ {
+ gSoftResetDisabled = FALSE;
+ SetMainCallback2(sub_80543C4);
+ }
+ break;
+ }
+ if (!HasLinkErrorOccurred())
+ {
+ RunTasks();
+ }
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void sub_80543C4(void)
+{
+ if (!gPaletteFade.active)
+ {
+ FreeAllWindowBuffers();
+ Free(GetBgTilemapBuffer(3));
+ Free(GetBgTilemapBuffer(1));
+ Free(GetBgTilemapBuffer(0));
+ FreeMonSpritesGfx();
+ FREE_AND_SET_NULL(sTradeData);
+ if (gWirelessCommType != 0)
+ DestroyWirelessStatusIndicatorSprite();
+ SetMainCallback2(gMain.savedCallback);
+ }
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void DoInGameTradeScene(void)
+{
+ ScriptContext2_Enable();
+ CreateTask(sub_8054470, 10);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ HelpSystem_Disable();
+}
+
+void sub_8054470(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(CB2_InitTradeAnim_InGameTrade);
+ gFieldCallback = FieldCallback_ReturnToEventScript2;
+ DestroyTask(taskId);
+ }
+}
+
+void CheckPartnersMonForRibbons(void)
+{
+ u8 nRibbons = 0;
+ u8 i;
+ for (i = 0; i < 12; i++)
+ {
+ nRibbons += GetMonData(&gEnemyParty[gSelectedTradeMonPositions[1] % 6], MON_DATA_CHAMPION_RIBBON + i);
+ }
+ if (nRibbons != 0)
+ FlagSet(FLAG_SYS_RIBBON_GET);
+}
+
+void sub_80544FC(void)
+{
+ TradeAnimInit_LoadGfx();
+}
+
+void DrawTextOnTradeWindow(u8 windowId, const u8 *str, s8 speed)
+{
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(15));
+ sTradeData->textColor[0] = 15;
+ sTradeData->textColor[1] = 1;
+ sTradeData->textColor[2] = 6;
+ AddTextPrinterParameterized4(windowId, 2, 0, 2, 0, 2, sTradeData->textColor, speed, str);
+ CopyWindowToVram(windowId, 3);
+}
+
+void Task_AnimateWirelessSignal(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ u16 r2 = 16 * gUnknown_826D250[data[0]][0];
+ if (data[2] == 0)
+ {
+ if (r2 == 0x100)
+ LoadPalette(gUnknown_826BF5C, 0x30, 0x20);
+ else
+ LoadPalette(&gUnknown_826BB5C[r2], 0x30, 0x20);
+ }
+ else
+ {
+ if (r2 == 0x100)
+ LoadPalette(gUnknown_826BF5C, 0x30, 0x20);
+ else
+ LoadPalette(&gUnknown_826BD5C[r2], 0x30, 0x20);
+ }
+ if (gUnknown_826D250[data[0]][0] == 0 && data[1] == 0)
+ PlaySE(SE_W215);
+ if (data[1] == gUnknown_826D250[data[0]][1])
+ {
+ data[0]++;
+ data[1] = 0;
+ if (gUnknown_826D250[data[0]][1] == 0xFF)
+ DestroyTask(taskId);
+ }
+ else
+ data[1]++;
+}
+
+void c3_0805465C(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (data[0] == 0)
+ {
+ sTradeData->win0left = sTradeData->win0right = 120;
+ sTradeData->win0top = 0;
+ sTradeData->win0bottom = 160;
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_OBJ);
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 |
+ WININ_WIN0_BG1 |
+ WININ_WIN0_OBJ);
+ }
+
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE2(sTradeData->win0left, sTradeData->win0right));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE2(sTradeData->win0top, sTradeData->win0bottom));
+
+ data[0]++;
+ sTradeData->win0left -= 5;
+ sTradeData->win0right += 5;
+
+ if (sTradeData->win0left < 80)
+ {
+ DestroyTask(taskId);
+ }
+}
+
+void sub_8054734(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (data[0] == 0)
+ {
+ sTradeData->win0left = 80;
+ sTradeData->win0right = 160;
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_OBJ);
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 |
+ WININ_WIN0_BG1 |
+ WININ_WIN0_OBJ);
+ }
+
+ SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE2(sTradeData->win0left, sTradeData->win0right));
+ SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE2(sTradeData->win0top, sTradeData->win0bottom));
+
+ if (sTradeData->win0left != 120)
+ {
+ data[0]++;
+ sTradeData->win0left += 5;
+ sTradeData->win0right -= 5;
+
+ if (sTradeData->win0left >= 116)
+ BlendPalettes(0x8, 0, RGB_WHITEALPHA);
+ }
+ else
+ {
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON);
+ DestroyTask(taskId);
+ }
+}