diff options
Diffstat (limited to 'src/battle_tent.c')
-rw-r--r-- | src/battle_tent.c | 276 |
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 |