summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_util2.c105
-rw-r--r--src/trainer_tower.c6
2 files changed, 108 insertions, 3 deletions
diff --git a/src/battle_util2.c b/src/battle_util2.c
new file mode 100644
index 000000000..5254ab25b
--- /dev/null
+++ b/src/battle_util2.c
@@ -0,0 +1,105 @@
+#include "global.h"
+#include "bg.h"
+#include "battle.h"
+#include "pokemon.h"
+#include "malloc.h"
+#include "trainer_tower.h"
+#include "battle_util2.h"
+
+void AllocateBattleResources(void)
+{
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER)
+ InitTrainerTowerBattleStruct();
+ if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE)
+ {
+ void **ptr = gUnknown_3005EE0;
+ s32 i = 3;
+
+ do
+ *ptr++ = AllocZeroed(8);
+ while (--i >= 0);
+ }
+ // TODO: Figure out whether 0x200 is really the size of *gBattleResources.
+ // The following works in pokeem:
+ // gBattleStruct = AllocZeroed(sizeof(*gBattleStruct));
+ gBattleStruct = AllocZeroed(0x200);
+ gBattleResources = AllocZeroed(sizeof(*gBattleResources));
+ gBattleResources->secretBase = AllocZeroed(sizeof(*gBattleResources->secretBase));
+ gBattleResources->flags = AllocZeroed(sizeof(*gBattleResources->flags));
+ gBattleResources->battleScriptsStack = AllocZeroed(sizeof(*gBattleResources->battleScriptsStack));
+ gBattleResources->battleCallbackStack = AllocZeroed(sizeof(*gBattleResources->battleCallbackStack));
+ gBattleResources->beforeLvlUp = AllocZeroed(sizeof(*gBattleResources->beforeLvlUp));
+ gBattleResources->ai = AllocZeroed(sizeof(*gBattleResources->ai));
+ gBattleResources->battleHistory = AllocZeroed(sizeof(*gBattleResources->battleHistory));
+ gBattleResources->AI_ScriptsStack = AllocZeroed(sizeof(*gBattleResources->AI_ScriptsStack));
+ gLinkBattleSendBuffer = AllocZeroed(BATTLE_BUFFER_LINK_SIZE);
+ gLinkBattleRecvBuffer = AllocZeroed(BATTLE_BUFFER_LINK_SIZE);
+ gUnknown_2022BB8 = AllocZeroed(0x2000);
+ gUnknown_2022BBC = AllocZeroed(0x1000);
+ SetBgTilemapBuffer(1, gUnknown_2022BBC);
+ SetBgTilemapBuffer(2, gUnknown_2022BBC);
+}
+
+void FreeBattleResources(void)
+{
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER)
+ FreeTrainerTowerBattleStruct();
+ if (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE)
+ {
+ void **ptr = gUnknown_3005EE0;
+ void *nullPtr = NULL;
+ s32 i = 3;
+
+ do
+ {
+ Free(*ptr);
+ *ptr++ = nullPtr;
+ }
+ while (--i >= 0);
+ }
+ if (gBattleResources != NULL)
+ {
+ FREE_AND_SET_NULL(gBattleStruct);
+ FREE_AND_SET_NULL(gBattleResources->secretBase);
+ FREE_AND_SET_NULL(gBattleResources->flags);
+ FREE_AND_SET_NULL(gBattleResources->battleScriptsStack);
+ FREE_AND_SET_NULL(gBattleResources->battleCallbackStack);
+ FREE_AND_SET_NULL(gBattleResources->beforeLvlUp);
+ FREE_AND_SET_NULL(gBattleResources->ai);
+ FREE_AND_SET_NULL(gBattleResources->battleHistory);
+ FREE_AND_SET_NULL(gBattleResources->AI_ScriptsStack);
+ FREE_AND_SET_NULL(gBattleResources);
+ FREE_AND_SET_NULL(gLinkBattleSendBuffer);
+ FREE_AND_SET_NULL(gLinkBattleRecvBuffer);
+ FREE_AND_SET_NULL(gUnknown_2022BB8);
+ FREE_AND_SET_NULL(gUnknown_2022BBC);
+ }
+}
+
+void AdjustFriendshipOnBattleFaint(u8 battlerId)
+{
+ u8 opposingBattlerId, opposingBattlerId2;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ {
+ opposingBattlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
+ opposingBattlerId2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
+ if (gBattleMons[opposingBattlerId2].level > gBattleMons[opposingBattlerId].level)
+ opposingBattlerId = opposingBattlerId2;
+ }
+ else
+ {
+ opposingBattlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
+ }
+ if (gBattleMons[opposingBattlerId].level > gBattleMons[battlerId].level)
+ {
+ if (gBattleMons[opposingBattlerId].level - gBattleMons[battlerId].level > 29)
+ AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 9);
+ else
+ AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 7);
+ }
+ else
+ {
+ AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 7);
+ }
+}
diff --git a/src/trainer_tower.c b/src/trainer_tower.c
index d80be781d..0415990c6 100644
--- a/src/trainer_tower.c
+++ b/src/trainer_tower.c
@@ -631,7 +631,7 @@ u8 sub_815DA3C(void)
return gFacilityClassToPicIndex[gUnknown_203F45C->unk_3D];
}
-void sub_815DA54(void)
+void InitTrainerTowerBattleStruct(void)
{
u16 r10;
s32 r9;
@@ -660,7 +660,7 @@ void sub_815DA54(void)
sub_815DD2C();
}
-void sub_815DBDC(void)
+void FreeTrainerTowerBattleStruct(void)
{
Free(gUnknown_203F45C);
gUnknown_203F45C = NULL;
@@ -1122,7 +1122,7 @@ void sub_815E124(u8 taskId)
void sub_815E160(void)
{
- gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_FACTORY;
+ gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_TRAINER_TOWER;
if (gUnknown_203F458->unk_0004.trainers[gUnknown_203F458->unk_0000].unk_002 == 1)
gBattleTypeFlags |= BATTLE_TYPE_DOUBLE;
gTrainerBattleOpponent_A = 0;