summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2019-04-01 22:30:30 -0400
committerhuderlem <huderlem@gmail.com>2019-04-01 22:08:50 -0500
commit7571969a458fefcfa242acdd4a38dce134897977 (patch)
tree169592e670d596f4f295bf5f0f3c4b64b994050a /src
parent4be97b2dc691d5215ae402a345708b3e207ceb9f (diff)
Finish union room battle
Diffstat (limited to 'src')
-rw-r--r--src/mauville_old_man.c2
-rw-r--r--src/union_room.c2
-rw-r--r--src/union_room_battle.c359
3 files changed, 264 insertions, 99 deletions
diff --git a/src/mauville_old_man.c b/src/mauville_old_man.c
index ec5cb238b..ddd3f931e 100644
--- a/src/mauville_old_man.c
+++ b/src/mauville_old_man.c
@@ -914,7 +914,7 @@ struct Story
};
static const struct Story sStorytellerStories[] = {
- {GAME_STAT_50, 1, MauvilleCity_PokemonCenter_1F_Text_28E930, MauvilleCity_PokemonCenter_1F_Text_28E947, MauvilleCity_PokemonCenter_1F_Text_28E956},
+ {GAME_STAT_NUM_UNION_ROOM_BATTLES, 1, MauvilleCity_PokemonCenter_1F_Text_28E930, MauvilleCity_PokemonCenter_1F_Text_28E947, MauvilleCity_PokemonCenter_1F_Text_28E956},
{GAME_STAT_STARTED_TRENDS, 1, MauvilleCity_PokemonCenter_1F_Text_28E9D7, MauvilleCity_PokemonCenter_1F_Text_28E9EF, MauvilleCity_PokemonCenter_1F_Text_28E9FE},
{GAME_STAT_PLANTED_BERRIES, 1, MauvilleCity_PokemonCenter_1F_Text_28EA7D, MauvilleCity_PokemonCenter_1F_Text_28EA98, MauvilleCity_PokemonCenter_1F_Text_28EAA8},
{GAME_STAT_TRADED_BIKES, 1, MauvilleCity_PokemonCenter_1F_Text_28EB19, MauvilleCity_PokemonCenter_1F_Text_28EB31, MauvilleCity_PokemonCenter_1F_Text_28EB3E},
diff --git a/src/union_room.c b/src/union_room.c
index 88ac65baa..ea3658903 100644
--- a/src/union_room.c
+++ b/src/union_room.c
@@ -2332,7 +2332,7 @@ void sub_8013F90(u8 taskId)
if (GetBlockReceivedStatus() == 3)
{
gEnemyParty[0] = *(struct Pokemon*)(gBlockRecvBuffer[GetMultiplayerId() ^ 1]);
- IncrementGameStat(GAME_STAT_50);
+ IncrementGameStat(GAME_STAT_NUM_UNION_ROOM_BATTLES);
ResetBlockReceivedFlags();
gTasks[taskId].data[0]++;
}
diff --git a/src/union_room_battle.c b/src/union_room_battle.c
index b571e803a..9d9f9dcf3 100644
--- a/src/union_room_battle.c
+++ b/src/union_room_battle.c
@@ -9,6 +9,7 @@
#include "alloc.h"
#include "menu.h"
#include "window.h"
+#include "text_window.h"
#include "scanline_effect.h"
#include "m4a.h"
#include "dynamic_placeholder_text_util.h"
@@ -18,6 +19,9 @@
#include "international_string_util.h"
#include "sound.h"
#include "constants/songs.h"
+#include "party_menu.h"
+#include "battle_setup.h"
+#include "link.h"
#include "union_room.h"
#include "union_room_battle.h"
@@ -31,13 +35,20 @@ struct UnkStruct_3000DAC
/*0x62*/ u8 filler_62[10];
};
+struct UnkStruct_2022C6C
+{
+ s16 a0;
+};
+
IWRAM_DATA struct UnkStruct_3000DAC * gUnknown_03000DAC;
IWRAM_DATA bool32 gUnknown_03000DB0;
+EWRAM_DATA struct UnkStruct_2022C6C * gUnknown_02022C6C = NULL;
+
void sub_801A43C(void);
void sub_801A6C0(u8 taskId);
static void sub_801A8B0(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 mode);
-bool32 sub_801AA30(u32 * a0, u32 * a1, u32 * a2, u8 a3);
+bool32 sub_801AA30(u32 * a0, u32 * a1, u32 * a2, u8 taskId);
const u16 gWirelessInfoScreenPal[] = INCBIN_U16("graphics/interface/wireless_info_screen.gbapal");
const u32 gWirelessInfoScreenGfx[] = INCBIN_U32("graphics/interface/wireless_info_screen.4bpp.lz");
@@ -128,6 +139,29 @@ const u8 gUnknown_082F0D70[][3] = {
{0x0e, 0x01, 0x02}
};
+const struct BgTemplate gUnknown_082F0DD0[] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 31
+ }
+};
+
+const struct WindowTemplate gUnknown_082F0DD4[] = {
+ {
+ .bg = 0,
+ .tilemapLeft = 3,
+ .tilemapTop = 15,
+ .width = 24,
+ .height = 4,
+ .paletteNum = 0xE,
+ .baseBlock = 0x014
+ },
+ { 0xFF }
+};
+
+const u8 gUnknown_082F0DE4[] = { 1, 2, 3 };
+
void sub_801A3F4(void)
{
if (!IsDma3ManagerBusyWithBgCopy())
@@ -333,12 +367,10 @@ static void sub_801A8B0(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 m
AddTextPrinterParameterized4(windowId, fontId, x, y, 0, 0, color, -1, str);
}
-#ifdef NONMATCHING
-// register swap r2, r3
-u8 sub_801A960(struct UnkStruct_x20 * a0, u32 * a1)
+u32 sub_801A960(struct UnkStruct_x20 * a0, u32 * a1)
{
s32 i, j, r2;
- u8 result = a0->unk.field_0.unk_0a_0;
+ u32 result = a0->unk.field_0.unk_0a_0;
for (i = 0; i < (unsigned)ARRAY_COUNT(gUnknown_082F0D70); i++)
{
@@ -370,97 +402,230 @@ u8 sub_801A960(struct UnkStruct_x20 * a0, u32 * a1)
}
return result;
}
-#else
-NAKED
-u8 sub_801A960(struct UnkStruct_x20 * a0, u32 * a1)
+
+bool32 sub_801AA08(u32 * a0, u32 * a1)
+{
+ s32 i;
+ for (i = 0; i < 4; i++)
+ {
+ if (a0[i] != a1[i])
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+bool32 sub_801AA30(u32 * a0, u32 * a1, u32 * a2, u8 taskId)
+{
+ bool32 r8 = FALSE;
+ u32 sp0[4] = {0, 0, 0, 0};
+ struct UnkStruct_x20 ** data = (void *)gTasks[taskId].data;
+ s32 i;
+
+ for (i = 0; i < 16; i++)
+ {
+ u32 r1 = sub_801A960(&(*data)[i], sp0);
+ if (r1 != a2[i])
+ {
+ a2[i] = r1;
+ r8 = TRUE;
+ }
+ }
+ if (sub_801AA08(sp0, a1) == 0)
+ {
+ if (r8 != TRUE)
+ {
+ return FALSE;
+ }
+ }
+ else
+ {
+ memcpy(a0, sp0, sizeof(sp0));
+ memcpy(a1, sp0, sizeof(sp0));
+ a0[3] = a0[0] + a0[1] + a0[2] + a0[3];
+ }
+ return TRUE;
+}
+
+void sub_801AAD4(void)
+{
+ s32 i;
+ sub_8014210(10);
+ for (i = 0; i < 2; i++)
+ {
+ gEnemyParty[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1];
+ }
+ for (i = 0; i < 6; i++)
+ {
+ ZeroMonData(&gPlayerParty[i]);
+ }
+ for (i = 0; i < 2; i++)
+ {
+ gPlayerParty[i] = gEnemyParty[i];
+ }
+ IncrementGameStat(GAME_STAT_NUM_UNION_ROOM_BATTLES);
+ CalculatePlayerPartyCount();
+ gTrainerBattleOpponent_A = 0xC00;
+ SetMainCallback2(CB2_InitBattle);
+}
+
+void sub_801AB68(u8 windowId, const u8 * str, u8 x, u8 y, s32 speed)
+{
+ s32 letterSpacing = 0;
+ s32 lineSpacing = 1;
+ FillWindowPixelBuffer(windowId, (gUnknown_082F0DE4[0] << 4) | gUnknown_082F0DE4[0]);
+ AddTextPrinterParameterized4(windowId, 1, x, y, letterSpacing, lineSpacing, gUnknown_082F0DE4, speed, str);
+}
+
+bool32 sub_801ABDC(s16 * state, const u8 * str, s32 speed)
+{
+ switch (*state)
+ {
+ case 0:
+ DrawTextBorderOuter(0, 0x001, 0xD);
+ sub_801AB68(0, str, 0, 1, speed);
+ PutWindowTilemap(0);
+ CopyWindowToVram(0, 3);
+ (*state)++;
+ break;
+ case 1:
+ if (!IsTextPrinterActive(0))
+ {
+ *state = 0;
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+void sub_801AC40(void)
{
- asm_unified("\tpush {r4-r7,lr}\n"
- "\tmov r7, r10\n"
- "\tmov r6, r9\n"
- "\tmov r5, r8\n"
- "\tpush {r5-r7}\n"
- "\tsub sp, 0x4\n"
- "\tmov r12, r0\n"
- "\tadds r7, r1, 0\n"
- "\tldrb r0, [r0, 0xA]\n"
- "\tlsls r0, 25\n"
- "\tlsrs r0, 25\n"
- "\tmov r8, r0\n"
- "\tmovs r4, 0\n"
- "\tldr r0, =gUnknown_082F0D70\n"
- "\tmov r9, r0\n"
- "\tmovs r1, 0x1\n"
- "\tadd r1, r9\n"
- "\tmov r10, r1\n"
- "\tmov r3, r12\n"
- "\tadds r3, 0x4\n"
- "\tstr r3, [sp]\n"
- "_0801A98A:\n"
- "\tlsls r0, r4, 1\n"
- "\tadds r2, r0, r4\n"
- "\tmov r3, r9\n"
- "\tadds r1, r2, r3\n"
- "\tadds r5, r0, 0\n"
- "\tadds r6, r4, 0x1\n"
- "\tldrb r1, [r1]\n"
- "\tcmp r8, r1\n"
- "\tbne _0801A9EE\n"
- "\tmov r0, r12\n"
- "\tldrb r1, [r0, 0x1A]\n"
- "\tmovs r0, 0x3\n"
- "\tands r0, r1\n"
- "\tcmp r0, 0x1\n"
- "\tbne _0801A9EE\n"
- "\tmov r0, r9\n"
- "\tadds r0, 0x2\n"
- "\tadds r3, r2, r0\n"
- "\tldrb r0, [r3]\n"
- "\tcmp r0, 0\n"
- "\tbne _0801A9DC\n"
- "\tmovs r2, 0\n"
- "\tmovs r1, 0\n"
- "\tldr r3, [sp]\n"
- "_0801A9BA:\n"
- "\tadds r0, r3, r1\n"
- "\tldrb r0, [r0]\n"
- "\tcmp r0, 0\n"
- "\tbeq _0801A9C4\n"
- "\tadds r2, 0x1\n"
- "_0801A9C4:\n"
- "\tadds r1, 0x1\n"
- "\tcmp r1, 0x3\n"
- "\tble _0801A9BA\n"
- "\tadds r2, 0x1\n"
- "\tadds r0, r5, r4\n"
- "\tadd r0, r10\n"
- "\tldrb r1, [r0]\n"
- "\tlsls r1, 2\n"
- "\tadds r1, r7\n"
- "\tb _0801A9E8\n"
- "\t.pool\n"
- "_0801A9DC:\n"
- "\tmov r1, r10\n"
- "\tadds r0, r2, r1\n"
- "\tldrb r1, [r0]\n"
- "\tlsls r1, 2\n"
- "\tadds r1, r7\n"
- "\tldrb r2, [r3]\n"
- "_0801A9E8:\n"
- "\tldr r0, [r1]\n"
- "\tadds r0, r2\n"
- "\tstr r0, [r1]\n"
- "_0801A9EE:\n"
- "\tadds r4, r6, 0\n"
- "\tcmp r4, 0x1E\n"
- "\tbls _0801A98A\n"
- "\tmov r0, r8\n"
- "\tadd sp, 0x4\n"
- "\tpop {r3-r5}\n"
- "\tmov r8, r3\n"
- "\tmov r9, r4\n"
- "\tmov r10, r5\n"
- "\tpop {r4-r7}\n"
- "\tpop {r1}\n"
- "\tbx r1");
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void sub_801AC54(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SetGpuReg(REG_OFFSET_DISPCNT, 0x0000);
+ gUnknown_02022C6C = AllocZeroed(4);
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_082F0DD0, 1);
+ reset_temp_tile_data_buffers();
+ if (!InitWindows(gUnknown_082F0DD4))
+ {
+ return;
+ }
+ DeactivateAllTextPrinters();
+ ClearWindowTilemap(0);
+ FillWindowPixelBuffer(0, 0x00);
+ FillWindowPixelBuffer(0, 0x11);
+ FillBgTilemapBufferRect(0, 0, 0, 0, 30, 20, 0xF);
+ LoadUserWindowBorderGfx(0, 1, 0xD0);
+ LoadUserWindowBorderGfx_(0, 1, 0xD0);
+ sub_819789C();
+ SetVBlankCallback(sub_801AC40);
+ gMain.state++;
+ break;
+ case 1:
+ if (sub_801ABDC(&gUnknown_02022C6C->a0, gText_CommStandbyAwaitingOtherPlayer, 0))
+ {
+ gMain.state++;
+ }
+ break;
+ case 2:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ ShowBg(0);
+ gMain.state++;
+ break;
+ case 3:
+ if (!UpdatePaletteFade())
+ {
+ memset(gBlockSendBuffer, 0, 0x20);
+ if (gSelectedOrderFromParty[0] == -gSelectedOrderFromParty[1])
+ {
+ gBlockSendBuffer[0] = 0x52;
+ }
+ else
+ {
+ gBlockSendBuffer[0] = 0x51;
+ }
+ SendBlock(0, gBlockSendBuffer, 0x20);
+ gMain.state++;
+ }
+ break;
+ case 4:
+ if (GetBlockReceivedStatus() == 3)
+ {
+ if (gBlockRecvBuffer[0][0] == 0x51 && gBlockRecvBuffer[1][0] == 0x51)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gMain.state = 50;
+ }
+ else
+ {
+ sub_800AC34();
+ if (gBlockRecvBuffer[GetMultiplayerId()][0] == 0x52)
+ {
+ gMain.state = 6;
+ }
+ else
+ {
+ gMain.state = 8;
+ }
+ }
+ ResetBlockReceivedFlags();
+ }
+ break;
+ case 50:
+ if (!UpdatePaletteFade())
+ {
+ sub_800ADF8();
+ gMain.state++;
+ }
+ break;
+ case 51:
+ if (IsLinkTaskFinished())
+ {
+ SetMainCallback2(sub_801AAD4);
+ }
+ break;
+ case 6:
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ gMain.state++;
+ }
+ break;
+ case 7:
+ if (sub_801ABDC(&gUnknown_02022C6C->a0, gText_RefusedBattle, 1))
+ {
+ SetMainCallback2(CB2_ReturnToField);
+ }
+ break;
+ case 8:
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ gMain.state++;
+ }
+ break;
+ case 9:
+ if (sub_801ABDC(&gUnknown_02022C6C->a0, gText_BattleWasRefused, 1))
+ {
+ SetMainCallback2(CB2_ReturnToField);
+ }
+ break;
+ }
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
}
-#endif //NONMATCHING