summaryrefslogtreecommitdiff
path: root/src/battle_tent.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/battle_tent.c')
-rw-r--r--src/battle_tent.c276
1 files changed, 268 insertions, 8 deletions
diff --git a/src/battle_tent.c b/src/battle_tent.c
index 68d7c5e83..516f3fc4d 100644
--- a/src/battle_tent.c
+++ b/src/battle_tent.c
@@ -11,7 +11,11 @@
#include "constants/items.h"
#include "constants/region_map_sections.h"
-// this file's functions
+extern const struct BattleFrontierTrainer gSlateportBattleTentTrainers[];
+extern const struct FacilityMon gSlateportBattleTentMons[];
+extern const u16 gBattleFrontierHeldItems[];
+
+// This file's functions.
void sub_81B99D4(void);
void sub_81B9A28(void);
void sub_81B9A44(void);
@@ -51,7 +55,7 @@ void (*const gUnknown_086160B4[])(void) =
sub_81B9B28
};
-const u16 gUnknown_086160D4[] = {ITEM_NEST_BALL, ITEM_NONE};
+static const u16 sVerdanturfTentRewards[] = {ITEM_NEST_BALL};
void (*const gUnknown_086160D8[])(void) =
{
@@ -64,7 +68,7 @@ void (*const gUnknown_086160D8[])(void) =
sub_81B9CF0
};
-const u16 gUnknown_086160F4[] = {ITEM_HYPER_POTION, ITEM_NONE};
+static const u16 sFallarborTentRewards[] = {ITEM_HYPER_POTION};
void (*const gUnknown_086160F8[])(void) =
{
@@ -80,7 +84,7 @@ void (*const gUnknown_086160F8[])(void) =
sub_81B9EC0
};
-const u16 gUnknown_08616120[] = {ITEM_FULL_HEAL, ITEM_NONE};
+static const u16 sSlateportTentRewards[] = {ITEM_FULL_HEAL};
// code
void sub_81B99B4(void)
@@ -115,7 +119,7 @@ void sub_81B9A60(void)
void sub_81B9A90(void)
{
if (gTrainerBattleOpponent_A < 300)
- ConvertBattleFrontierTrainerSpeechToString(gUnknown_0203BC88[gTrainerBattleOpponent_A].speechBefore);
+ ConvertBattleFrontierTrainerSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_A].speechBefore);
}
void sub_81B9ABC(void)
@@ -128,7 +132,7 @@ void sub_81B9ABC(void)
void sub_81B9B00(void)
{
- gSaveBlock2Ptr->frontier.field_E6A = gUnknown_086160D4[Random() % 1];
+ gSaveBlock2Ptr->frontier.field_E6A = sVerdanturfTentRewards[Random() % ARRAY_COUNT(sVerdanturfTentRewards)];
}
void sub_81B9B28(void)
@@ -178,7 +182,7 @@ void sub_81B9C2C(void)
void sub_81B9C70(void)
{
- gSaveBlock2Ptr->frontier.field_E6C = gUnknown_086160F4[Random() % 1];
+ gSaveBlock2Ptr->frontier.field_E6C = sFallarborTentRewards[Random() % ARRAY_COUNT(sFallarborTentRewards)];
}
void sub_81B9C98(void)
@@ -233,7 +237,7 @@ void sub_81B9DB4(void)
void sub_81B9DF8(void)
{
- gSaveBlock2Ptr->frontier.field_E6E = gUnknown_08616120[Random() % 1];
+ gSaveBlock2Ptr->frontier.field_E6E = sSlateportTentRewards[Random() % ARRAY_COUNT(sSlateportTentRewards)];
}
void sub_81B9E20(void)
@@ -266,3 +270,259 @@ bool8 sub_81B9E94(void)
return (gMapHeader.regionMapSectionId == MAPSEC_SLATEPORT_CITY
&& ((gMapHeader.mapLayoutId == 385) | (gMapHeader.mapLayoutId == 386)));
}
+
+// This function was written very...oddly.
+#ifdef NONMATCHING
+void sub_81B9EC0(void)
+{
+ s32 i, j;
+ u16 currMonId = 0, currSpecies = 0;
+ u16 species[PARTY_SIZE];
+ u16 monIds[PARTY_SIZE];
+ u16 heldItems[PARTY_SIZE];
+ s32 zero = 0;
+
+ gFacilityTrainers = gSlateportBattleTentTrainers;
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ species[i] = 0;
+ monIds[i] = 0;
+ heldItems[i] = 0;
+ }
+ gFacilityTrainerMons = gSlateportBattleTentMons;
+ currSpecies = 0;
+ for (i = 0; i != PARTY_SIZE;)
+ {
+ // Cannot have two pokemon of the same species.
+ currMonId = Random() % 70;
+ for (j = zero; j < i + zero; j++)
+ {
+ if (monIds[j] == currMonId)
+ break;
+ if (species[j] == gFacilityTrainerMons[currMonId].species)
+ {
+ if (currSpecies == 0)
+ currSpecies = gFacilityTrainerMons[currMonId].species;
+ else
+ break;
+ }
+ }
+ if (j != i + zero)
+ continue;
+
+ // Cannot have two same held items.
+ for (j = zero; j < i + zero; j++)
+ {
+ if (heldItems[j] == 0)
+ continue;
+ if (heldItems[j] == gBattleFrontierHeldItems[gFacilityTrainerMons[currMonId].itemTableId])
+ {
+ if (gFacilityTrainerMons[currMonId].species == currSpecies)
+ currSpecies = 0;
+ else
+ break;
+ }
+ }
+ if (j != i + zero)
+ continue;
+
+ gSaveBlock2Ptr->frontier.field_E70[i].monId = currMonId;
+ species[i] = gFacilityTrainerMons[currMonId].species;
+ heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[currMonId].itemTableId];
+ monIds[i] = currMonId;
+ i++;
+ }
+}
+#else
+NAKED
+void sub_81B9EC0(void)
+{
+ asm_unified("\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x3C\n\
+ ldr r1, =gFacilityTrainers\n\
+ ldr r0, =gSlateportBattleTentTrainers\n\
+ str r0, [r1]\n\
+ add r0, sp, 0xC\n\
+ mov r9, r0\n\
+ mov r1, sp\n\
+ adds r1, 0x18\n\
+ str r1, [sp, 0x2C]\n\
+ ldr r5, =gFacilityTrainerMons\n\
+ ldr r4, =gSlateportBattleTentMons\n\
+ movs r2, 0\n\
+ adds r3, r1, 0\n\
+ mov r1, r9\n\
+ mov r0, sp\n\
+ movs r6, 0x5\n\
+ mov r8, r6\n\
+_081B9EEC:\n\
+ strh r2, [r0]\n\
+ strh r2, [r1]\n\
+ strh r2, [r3]\n\
+ adds r3, 0x2\n\
+ adds r1, 0x2\n\
+ adds r0, 0x2\n\
+ movs r7, 0x1\n\
+ negs r7, r7\n\
+ add r8, r7\n\
+ mov r6, r8\n\
+ cmp r6, 0\n\
+ bge _081B9EEC\n\
+ str r4, [r5]\n\
+ movs r7, 0\n\
+ mov r10, r7\n\
+ movs r0, 0\n\
+ mov r8, r0\n\
+ ldr r1, [sp, 0x2C]\n\
+ str r1, [sp, 0x30]\n\
+ mov r2, sp\n\
+ str r2, [sp, 0x34]\n\
+ lsls r6, r0, 1\n\
+ str r6, [sp, 0x24]\n\
+ add r6, r9\n\
+ str r6, [sp, 0x28]\n\
+_081B9F1E:\n\
+ bl Random\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ movs r1, 0x46\n\
+ bl __umodsi3\n\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+ movs r2, 0\n\
+ mov r7, r8\n\
+ adds r6, r2, r7\n\
+ cmp r2, r6\n\
+ bge _081B9F7C\n\
+ ldr r1, [sp, 0x28]\n\
+ ldrh r0, [r1]\n\
+ cmp r0, r5\n\
+ beq _081B9F7C\n\
+ ldr r0, =gFacilityTrainerMons\n\
+ ldr r1, [r0]\n\
+ lsls r0, r5, 4\n\
+ adds r4, r0, r1\n\
+ ldrh r7, [r4]\n\
+ mov r12, r7\n\
+ lsls r3, r2, 1\n\
+ ldr r1, [sp, 0x24]\n\
+ add r1, sp\n\
+ str r6, [sp, 0x38]\n\
+_081B9F56:\n\
+ ldrh r0, [r1]\n\
+ cmp r0, r12\n\
+ bne _081B9F66\n\
+ mov r0, r10\n\
+ cmp r0, 0\n\
+ bne _081B9F7C\n\
+ ldrh r7, [r4]\n\
+ mov r10, r7\n\
+_081B9F66:\n\
+ adds r3, 0x2\n\
+ adds r1, 0x2\n\
+ adds r2, 0x1\n\
+ ldr r0, [sp, 0x38]\n\
+ cmp r2, r0\n\
+ bge _081B9F7C\n\
+ mov r7, r9\n\
+ adds r0, r7, r3\n\
+ ldrh r0, [r0]\n\
+ cmp r0, r5\n\
+ bne _081B9F56\n\
+_081B9F7C:\n\
+ cmp r2, r6\n\
+ bne _081BA01C\n\
+ movs r2, 0\n\
+ cmp r2, r6\n\
+ bge _081B9FD4\n\
+ ldr r0, =gBattleFrontierHeldItems\n\
+ mov r12, r0\n\
+ ldr r7, =gFacilityTrainerMons\n\
+ ldr r1, [sp, 0x24]\n\
+ ldr r0, [sp, 0x2C]\n\
+ adds r4, r1, r0\n\
+_081B9F92:\n\
+ ldrh r3, [r4]\n\
+ cmp r3, 0\n\
+ beq _081B9FCC\n\
+ ldr r1, [r7]\n\
+ lsls r0, r5, 4\n\
+ adds r1, r0, r1\n\
+ ldrb r0, [r1, 0xA]\n\
+ lsls r0, 1\n\
+ add r0, r12\n\
+ ldrh r0, [r0]\n\
+ cmp r3, r0\n\
+ bne _081B9FCC\n\
+ ldrh r0, [r1]\n\
+ cmp r0, r10\n\
+ bne _081B9FD4\n\
+ movs r1, 0\n\
+ mov r10, r1\n\
+ b _081B9FD4\n\
+ .pool\n\
+_081B9FCC:\n\
+ adds r4, 0x2\n\
+ adds r2, 0x1\n\
+ cmp r2, r6\n\
+ blt _081B9F92\n\
+_081B9FD4:\n\
+ cmp r2, r6\n\
+ bne _081BA01C\n\
+ ldr r0, =gSaveBlock2Ptr\n\
+ ldr r1, [r0]\n\
+ mov r2, r8\n\
+ lsls r3, r2, 1\n\
+ adds r0, r3, r2\n\
+ lsls r0, 2\n\
+ adds r1, r0\n\
+ movs r6, 0xE7\n\
+ lsls r6, 4\n\
+ adds r1, r6\n\
+ strh r5, [r1]\n\
+ ldr r0, =gFacilityTrainerMons\n\
+ ldr r0, [r0]\n\
+ lsls r1, r5, 4\n\
+ adds r1, r0\n\
+ ldrh r0, [r1]\n\
+ ldr r7, [sp, 0x34]\n\
+ strh r0, [r7]\n\
+ ldr r2, =gBattleFrontierHeldItems\n\
+ ldrb r0, [r1, 0xA]\n\
+ lsls r0, 1\n\
+ adds r0, r2\n\
+ ldrh r0, [r0]\n\
+ ldr r1, [sp, 0x30]\n\
+ strh r0, [r1]\n\
+ add r3, r9\n\
+ strh r5, [r3]\n\
+ adds r1, 0x2\n\
+ str r1, [sp, 0x30]\n\
+ adds r2, r7, 0\n\
+ adds r2, 0x2\n\
+ str r2, [sp, 0x34]\n\
+ movs r6, 0x1\n\
+ add r8, r6\n\
+_081BA01C:\n\
+ mov r7, r8\n\
+ cmp r7, 0x6\n\
+ beq _081BA024\n\
+ b _081B9F1E\n\
+_081BA024:\n\
+ add sp, 0x3C\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .pool\n\
+ ");
+}
+#endif // NONMATCHING