summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_2.c321
1 files changed, 270 insertions, 51 deletions
diff --git a/src/battle_2.c b/src/battle_2.c
index d15e10f2f..17de219ce 100644
--- a/src/battle_2.c
+++ b/src/battle_2.c
@@ -8,6 +8,7 @@
#include "pokemon.h"
#include "species.h"
#include "link.h"
+#include "name_string_util.h"
struct UnknownStruct5
{
@@ -39,13 +40,31 @@ struct UnknownStruct8
u8 unk1A;
};
+struct UnknownPokemonStruct2
+{
+ /*0x00*/ u16 species;
+ /*0x02*/ u16 heldItem;
+ /*0x04*/ u8 nickname[11];
+ /*0x0F*/ u8 level;
+ /*0x10*/ u16 hp;
+ /*0x12*/ u16 maxhp;
+ /*0x14*/ u32 status;
+ /*0x18*/ u32 personality;
+ /*0x1C*/ u8 gender;
+ /*0x1D*/ u8 language;
+};
+
extern const struct UnknownStruct5 gUnknown_081F9674;
extern const u8 gUnknown_081F96C8[];
extern u8 ewram[];
#define ewram0 (*(struct UnknownStruct7 *)(ewram + 0x0))
#define ewram4 (*(struct UnknownStruct8 *)(ewram + 0x4))
-extern u8 gUnknown_02024D1E;
+#define ewram160CB (ewram[0x160CB])
+
+extern struct UnknownPokemonStruct2 gUnknown_02023A00[];
+extern u8 gUnknown_02024D1E[];
+extern u8 gUnknown_02024D1F[]; // I don't actually know what type this is.
extern u16 gUnknown_030041B0;
extern u16 gUnknown_030041B4;
extern u16 gUnknown_030041B8;
@@ -59,8 +78,9 @@ extern u16 gUnknown_030042A0;
extern u16 gUnknown_030042A4;
extern u16 gUnknown_030042C0;
extern u16 gUnknown_030042C4;
+extern MainCallback gUnknown_030042D0;
extern struct UnknownStruct6 gUnknown_03004DE0;
-//extern u16 gUnknown_03004DE0[][0xA0];
+//extern u16 gUnknown_03004DE0[][0xA0]; // possibly?
extern u16 gBattleTypeFlags;
extern u8 gBattleTerrain;
extern u8 gReservedSpritePaletteCount;
@@ -78,14 +98,19 @@ extern void sub_800E23C();
extern void setup_poochyena_battle();
extern void SetWildMonHeldItem(void);
extern void AdjustFriendship(struct Pokemon *, u8);
-
+extern void sub_800DE30(u8);
+extern void sub_800B950(void);
+extern u8 battle_load_something();
+extern void OpenPartyMenu();
void sub_800E7F8(void);
void sub_800EC9C(void);
void sub_800F104(void);
void sub_800F298(void);
+void sub_800F808(void);
void sub_800F8E8();
void sub_800FCFC(void);
+void sub_8010824(void);
void sub_800E7C4(void)
{
@@ -93,7 +118,7 @@ void sub_800E7C4(void)
{
sub_800B858();
SetMainCallback2(sub_800F104);
- gUnknown_02024D1E = 0;
+ gUnknown_02024D1E[0] = 0;
}
else
{
@@ -104,7 +129,7 @@ void sub_800E7C4(void)
void sub_800E7F8(void)
{
s32 i;
-
+
SetHBlankCallback(NULL);
SetVBlankCallback(NULL);
@@ -118,7 +143,7 @@ void sub_800E7F8(void)
gUnknown_030042C4 = 0xF0;
gUnknown_03004240 = 0x5051;
dp12_8087EA4();
-
+
for (i = 0; i < 80; i++)
{
gUnknown_03004DE0.unk0[i] = 0xF0;
@@ -128,7 +153,7 @@ void sub_800E7F8(void)
{
asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter
gUnknown_03004DE0.unk0[i] = 0xFF10;
- gUnknown_03004DE0.unk780[i] = 0xFF10;
+ gUnknown_03004DE0.unk780[i] = 0xFF10;
}
sub_80895F8(gUnknown_081F9674.unk0, gUnknown_081F9674.unk4, gUnknown_081F9674.unk8);
SetUpWindowConfig(&gWindowConfig_81E6C58);
@@ -166,7 +191,7 @@ void sub_800E7F8(void)
gMain.inBattle = TRUE;
for (i = 0; i < 6; i++)
AdjustFriendship(&gPlayerParty[i], 3);
- gUnknown_02024D1E = 0;
+ gUnknown_02024D1E[0] = 0;
}
void sub_800E9EC(void)
@@ -176,23 +201,23 @@ void sub_800E9EC(void)
u16 hp;
u32 status;
s32 i;
-
+
for (i = 0; i < 6; i++)
{
species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);
-
+
if (species == 0)
continue;
if (species != SPECIES_EGG && hp != 0 && status == 0)
r6 |= 1 << i * 2;
-
+
if (species == 0)
continue;
if (hp != 0 && (species == SPECIES_EGG || status != 0))
r6 |= 2 << i * 2;
-
+
if (species == 0)
continue;
if (species != SPECIES_EGG && hp == 0)
@@ -206,7 +231,7 @@ void sub_800EAAC(void)
{
s32 i;
struct UnknownStruct8 *_ewram4 = &ewram4;
-
+
for (i = 0; i < 7; i++)
_ewram4->unk0[i] = gSaveBlock1.enigmaBerry.berry.name[i];
for (i = 0; i < 18; i++)
@@ -219,7 +244,7 @@ void sub_800EB08(void)
{
s32 i;
s32 j;
-
+
if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))
{
for (i = 0; i < 7; i++)
@@ -242,7 +267,7 @@ void sub_800EB08(void)
s32 r8;
struct BattleEnigmaBerry *src;
u8 r4;
-
+
if (gBattleTypeFlags & BATTLE_TYPE_40)
r8 = 4;
else
@@ -251,7 +276,7 @@ void sub_800EB08(void)
{
src = (struct BattleEnigmaBerry *)(gBlockRecvBuffer[i] + 2);
r4 = gLinkPlayers[i].lp_field_18;
-
+
for (j = 0; j < 7; j++)
gEnigmaBerries[r4].name[j] = src->name[j];
for (j = 0; j < 18; j++)
@@ -266,7 +291,7 @@ void shedinja_something(struct Pokemon *pkmn)
{
u8 nickname[POKEMON_NAME_LENGTH + 1];
u8 language = 1;
-
+
if (GetMonData(pkmn, MON_DATA_SPECIES) == SPECIES_SHEDINJA
&& GetMonData(pkmn, MON_DATA_LANGUAGE) != language)
{
@@ -278,53 +303,247 @@ void shedinja_something(struct Pokemon *pkmn)
void sub_800EC9C(void)
{
- u8 r4;
- u8 r5;
-
+ u8 playerId;
+ u8 enemyId;
+
RunTasks();
AnimateSprites();
BuildOamBuffer();
- r4 = GetMultiplayerId();
- ewram[0x160CB] = r4;
- r5 = r4 ^ 1;
- switch (gUnknown_02024D1E)
+ playerId = GetMultiplayerId();
+ ewram160CB = playerId;
+ enemyId = playerId ^ 1;
+
+ switch (gUnknown_02024D1E[0])
{
- case 0:
- //_0800ED0C
- if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ case 0:
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC())
{
- if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC())
- {
- ewram0.unk0 = 1;
- ewram0.unk1 = 1;
- sub_800E9EC();
- sub_800EAAC();
- SendBlock(bitmask_all_link_players_but_self(), &ewram0, 32);
- gUnknown_02024D1E = 1;
- }
+ ewram0.unk0 = 1;
+ ewram0.unk1 = 1;
+ sub_800E9EC();
+ sub_800EAAC();
+ SendBlock(bitmask_all_link_players_but_self(), &ewram0, 32);
+ gUnknown_02024D1E[0] = 1;
}
- //_0800ED64
- else
+ }
+ else
+ {
+ gBattleTypeFlags |= BATTLE_TYPE_WILD;
+ gUnknown_02024D1E[0] = 8;
+ sub_800EB08();
+ }
+ break;
+ case 1:
+ if ((GetBlockReceivedStatus() & 3) == 3)
+ {
+ s32 r3;
+ u8 taskId;
+
+ ResetBlockReceivedFlags();
+ r3 = 0;
+ if (gBlockRecvBuffer[0][0] == 0x100)
{
- gBattleTypeFlags |= BATTLE_TYPE_WILD;
- gUnknown_02024D1E = 8;
- sub_800EB08();
+ if (playerId == 0)
+ gBattleTypeFlags |= 12;
+ else
+ gBattleTypeFlags |= 8;
+ r3++;
}
- break;
- case 1:
- //_0800ED7C
- if ((GetBlockReceivedStatus() & 3) == 3)
+ if (r3 == 0)
{
- ResetBlockReceivedFlags();
- if (gBlockRecvBuffer[0][0] == 0x100)
+ if (gBlockRecvBuffer[0][0] == gBlockRecvBuffer[1][0])
{
- if (r4 == 0)
+ if (playerId == 0)
+ gBattleTypeFlags |= 12;
+ else
+ gBattleTypeFlags |= 8;
+ r3++;
+ }
+ if (r3 == 0)
+ {
+ while (r3 < 2)
+ {
+ if (gBlockRecvBuffer[r3][0] > 0x0101 && r3 != playerId)
+ break;
+ r3++;
+ }
+ if (r3 == 2)
gBattleTypeFlags |= 12;
else
gBattleTypeFlags |= 8;
}
- //_0800EDBC
}
- break;
+ sub_800EB08();
+ taskId = CreateTask(sub_800DE30, 0);
+ gTasks[taskId].data[1] = 0x10E;
+ gTasks[taskId].data[2] = 0x5A;
+ gTasks[taskId].data[5] = 0;
+ gTasks[taskId].data[3] = ewram0.unk2 | (ewram0.unk3 << 8);
+ gTasks[taskId].data[4] = gBlockRecvBuffer[enemyId][1];
+ gUnknown_02024D1E[0]++;
+ }
+ break;
+ case 2:
+ if (sub_8007ECC())
+ {
+ SendBlock(bitmask_all_link_players_but_self(), gPlayerParty, sizeof(*gPlayerParty) * 2);
+ gUnknown_02024D1E[0]++;
+ }
+ break;
+ case 3:
+ if ((GetBlockReceivedStatus() & 3) == 3)
+ {
+ ResetBlockReceivedFlags();
+ memcpy(gEnemyParty, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2);
+ gUnknown_02024D1E[0]++;
+ }
+ break;
+ case 4:
+ if (sub_8007ECC())
+ {
+ SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 2, sizeof(*gPlayerParty) * 2);
+ gUnknown_02024D1E[0]++;
+ }
+ break;
+ case 5:
+ if ((GetBlockReceivedStatus() & 3) == 3)
+ {
+ ResetBlockReceivedFlags();
+ memcpy(gEnemyParty + 2, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2);
+ gUnknown_02024D1E[0]++;
+ }
+ break;
+ case 6:
+ if (sub_8007ECC())
+ {
+ SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 4, sizeof(*gPlayerParty) * 2);
+ gUnknown_02024D1E[0]++;
+ }
+ break;
+ case 7:
+ if ((GetBlockReceivedStatus() & 3) == 3)
+ {
+ ResetBlockReceivedFlags();
+ memcpy(gEnemyParty + 4, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2);
+ shedinja_something(&gEnemyParty[0]);
+ shedinja_something(&gEnemyParty[1]);
+ shedinja_something(&gEnemyParty[2]);
+ shedinja_something(&gEnemyParty[3]);
+ shedinja_something(&gEnemyParty[4]);
+ shedinja_something(&gEnemyParty[5]);
+ gUnknown_02024D1E[0]++;
+ }
+ break;
+ case 8:
+ sub_800B950();
+ gUnknown_02024D1E[0]++;
+ gUnknown_02024D1E[1] = 0;
+ gUnknown_02024D1E[2] = 0;
+ break;
+ case 9:
+ if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0)
+ {
+ gUnknown_030042D0 = gMain.callback1;
+ gMain.callback1 = sub_8010824;
+ SetMainCallback2(sub_800F808);
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ gTrainerBattleOpponent = 0x800;
+ gBattleTypeFlags |= BATTLE_TYPE_20;
+ }
+ }
+ break;
}
-} \ No newline at end of file
+}
+
+void sub_800F02C(void)
+{
+ s32 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ u8 *nickname = gUnknown_02023A00[i].nickname;
+
+ gUnknown_02023A00[i].species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES);
+ gUnknown_02023A00[i].heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
+ GetMonData(&gPlayerParty[i], MON_DATA_NICKNAME, nickname);
+ gUnknown_02023A00[i].level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);
+ gUnknown_02023A00[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
+ gUnknown_02023A00[i].maxhp = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP);
+ gUnknown_02023A00[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);
+ gUnknown_02023A00[i].personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY);
+ gUnknown_02023A00[i].gender = GetMonGender(&gPlayerParty[i]);
+ StripExtCtrlCodes(nickname);
+ gUnknown_02023A00[i].language = GetMonData(&gPlayerParty[i], MON_DATA_LANGUAGE);
+ if (gUnknown_02023A00[i].language != 1)
+ PadNameString(nickname, 0);
+ }
+ memcpy(ewram, gUnknown_02023A00, 0x60);
+}
+
+void sub_800F104(void)
+{
+ u8 playerId;
+ MainCallback *pSavedCallback;
+ u16 *pSavedBattleTypeFlags;
+
+ playerId = GetMultiplayerId();
+ ewram160CB = playerId;
+ // Seriously, Game Freak?
+ pSavedCallback = (MainCallback *)(ewram + 0x160C4);
+ pSavedBattleTypeFlags = (u16 *)(ewram + 0x160C2);
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+
+ switch (gUnknown_02024D1E[0])
+ {
+ case 0:
+ if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC())
+ {
+ sub_800F02C();
+ SendBlock(bitmask_all_link_players_but_self(), ewram, 0x60);
+ gUnknown_02024D1E[0]++;
+ }
+ break;
+ case 1:
+ if ((GetBlockReceivedStatus() & 0xF) == 0xF)
+ {
+ s32 i;
+
+ ResetBlockReceivedFlags();
+ for (i = 0; i < 4; i++)
+ {
+ if (i != playerId)
+ {
+ if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1))
+ || ((gLinkPlayers[i].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1)))
+ memcpy(gUnknown_02023A00, gBlockRecvBuffer[i], 0x60);
+ }
+ }
+ gUnknown_02024D1E[0]++;
+ *pSavedCallback = gMain.savedCallback;
+ *pSavedBattleTypeFlags = gBattleTypeFlags;
+ gMain.savedCallback = sub_800F104;
+ OpenPartyMenu(5, 0);
+ }
+ break;
+ case 2:
+ if (!gPaletteFade.active)
+ {
+ gUnknown_02024D1E[0] = 3;
+ sub_800832C();
+ }
+ break;
+ case 3:
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ gBattleTypeFlags = *pSavedBattleTypeFlags;
+ gMain.savedCallback = *pSavedCallback;
+ SetMainCallback2(sub_800E7F8);
+ }
+ break;
+ }
+}