diff options
| author | GriffinR <griffin.g.richards@gmail.com> | 2020-08-16 05:59:10 -0400 | 
|---|---|---|
| committer | GriffinR <griffin.g.richards@gmail.com> | 2020-08-16 05:59:10 -0400 | 
| commit | 65bd2faf9460d4e5986c30e54b283d7674d77c55 (patch) | |
| tree | 250c345d17b8d8f910d327d98f577afddfb3a64a /src/battle_factory.c | |
| parent | 2749948eebe65aa8b55738d820e4a0252dd45c1a (diff) | |
| parent | 25f45ffa8441b0f0a999355c9755782ccb4809dc (diff) | |
Merge branch 'master' of https://github.com/pret/pokeemerald into doc-contest
Diffstat (limited to 'src/battle_factory.c')
| -rw-r--r-- | src/battle_factory.c | 184 | 
1 files changed, 94 insertions, 90 deletions
| diff --git a/src/battle_factory.c b/src/battle_factory.c index 913b1b1a0..940e71f7d 100644 --- a/src/battle_factory.c +++ b/src/battle_factory.c @@ -39,7 +39,7 @@ static void GenerateInitialRentalMons(void);  static void GetOpponentMostCommonMonType(void);  static void GetOpponentBattleStyle(void);  static void RestorePlayerPartyHeldItems(void); -static u16 GetMonSetId(u8 lvlMode, u8 challengeNum, bool8 arg2); +static u16 GetFactoryMonId(u8 lvlMode, u8 challengeNum, bool8 arg2);  static u8 GetMoveBattleStyle(u16 move);  // Const rom data. @@ -159,24 +159,27 @@ static const u8 sFixedIVTable[][2] =      {31, 31},  }; -static const u16 sMonsToChooseFrom[][2] = -{ -    {0x006e, 0x00c7}, -    {0x00a2, 0x010a}, -    {0x010b, 0x0173}, -    {0x0174, 0x01d3}, -    {0x01d4, 0x0233}, -    {0x0234, 0x0293}, -    {0x0294, 0x02f3}, -    {0x0174, 0x0351}, -    {0x0174, 0x01d3}, -    {0x01d4, 0x0233}, -    {0x0234, 0x0293}, -    {0x0294, 0x02f3}, -    {0x0174, 0x0371}, -    {0x0174, 0x0371}, -    {0x0174, 0x0371}, -    {0x0174, 0x0371}, +static const u16 sInitialRentalMonRanges[][2] = +{ +    // Level 50 +    {FRONTIER_MON_GRIMER,     FRONTIER_MON_FURRET_1},   // 110 - 199 +    {FRONTIER_MON_DELCATTY_1, FRONTIER_MON_CLOYSTER_1}, // 162 - 266 +    {FRONTIER_MON_DELCATTY_2, FRONTIER_MON_CLOYSTER_2}, // 267 - 371 +    {FRONTIER_MON_DUGTRIO_1,  FRONTIER_MON_SLAKING_1},  // 372 - 467 +    {FRONTIER_MON_DUGTRIO_2,  FRONTIER_MON_SLAKING_2},  // 468 - 563 +    {FRONTIER_MON_DUGTRIO_3,  FRONTIER_MON_SLAKING_3},  // 564 - 659 +    {FRONTIER_MON_DUGTRIO_4,  FRONTIER_MON_SLAKING_4},  // 660 - 755 +    {FRONTIER_MON_DUGTRIO_1,  FRONTIER_MONS_HIGH_TIER}, // 372 - 849 + +    // Open level +    {FRONTIER_MON_DUGTRIO_1, FRONTIER_MON_SLAKING_1}, // 372 - 467 +    {FRONTIER_MON_DUGTRIO_2, FRONTIER_MON_SLAKING_2}, // 468 - 563 +    {FRONTIER_MON_DUGTRIO_3, FRONTIER_MON_SLAKING_3}, // 564 - 659 +    {FRONTIER_MON_DUGTRIO_4, FRONTIER_MON_SLAKING_4}, // 660 - 755 +    {FRONTIER_MON_DUGTRIO_1, NUM_FRONTIER_MONS - 1},  // 372 - 881 +    {FRONTIER_MON_DUGTRIO_1, NUM_FRONTIER_MONS - 1},  // 372 - 881 +    {FRONTIER_MON_DUGTRIO_1, NUM_FRONTIER_MONS - 1},  // 372 - 881 +    {FRONTIER_MON_DUGTRIO_1, NUM_FRONTIER_MONS - 1},  // 372 - 881  };  // code @@ -320,24 +323,24 @@ static void GenerateOpponentMons(void)      i = 0;      while (i != FRONTIER_PARTY_SIZE)      { -        u16 monSetId = GetMonSetId(lvlMode, challengeNum, FALSE); -        if (gFacilityTrainerMons[monSetId].species == SPECIES_UNOWN) +        u16 monId = GetFactoryMonId(lvlMode, challengeNum, FALSE); +        if (gFacilityTrainerMons[monId].species == SPECIES_UNOWN)              continue;          for (j = 0; j < 6; j++)          { -            if (gFacilityTrainerMons[monSetId].species == gFacilityTrainerMons[gSaveBlock2Ptr->frontier.rentalMons[j].monId].species) +            if (gFacilityTrainerMons[monId].species == gFacilityTrainerMons[gSaveBlock2Ptr->frontier.rentalMons[j].monId].species)                  break;          }          if (j != 6)              continue; -        if (lvlMode == FRONTIER_LVL_50 && monSetId > FRONTIER_MONS_HIGH_TIER) +        if (lvlMode == FRONTIER_LVL_50 && monId > FRONTIER_MONS_HIGH_TIER)              continue;          for (k = firstMonId; k < firstMonId + i; k++)          { -            if (species[k] == gFacilityTrainerMons[monSetId].species) +            if (species[k] == gFacilityTrainerMons[monId].species)                  break;          }          if (k != firstMonId + i) @@ -345,15 +348,15 @@ static void GenerateOpponentMons(void)          for (k = firstMonId; k < firstMonId + i; k++)          { -            if (heldItems[k] != 0 && heldItems[k] == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]) +            if (heldItems[k] != 0 && heldItems[k] == gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId])                  break;          }          if (k != firstMonId + i)              continue; -        species[i] = gFacilityTrainerMons[monSetId].species; -        heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]; -        gUnknown_03006298[i] = monSetId; +        species[i] = gFacilityTrainerMons[monId].species; +        heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]; +        gUnknown_03006298[i] = monId;          i++;      }  } @@ -388,7 +391,7 @@ static void SetPlayerAndOpponentParties(void)      int count = 0;      u8 bits = 0;      u8 monLevel; -    u16 monSetId; +    u16 monId;      u16 evs;      u8 ivs;      u8 friendship; @@ -412,17 +415,17 @@ static void SetPlayerAndOpponentParties(void)          ZeroPlayerPartyMons();          for (i = 0; i < FRONTIER_PARTY_SIZE; i++)          { -            monSetId = gSaveBlock2Ptr->frontier.rentalMons[i].monId; +            monId = gSaveBlock2Ptr->frontier.rentalMons[i].monId;              ivs = gSaveBlock2Ptr->frontier.rentalMons[i].ivs;              CreateMon(&gPlayerParty[i], -                      gFacilityTrainerMons[monSetId].species, +                      gFacilityTrainerMons[monId].species,                        monLevel,                        ivs,                        TRUE, gSaveBlock2Ptr->frontier.rentalMons[i].personality,                        OT_ID_PLAYER_ID, 0);              count = 0; -            bits = gFacilityTrainerMons[monSetId].evSpread; +            bits = gFacilityTrainerMons[monId].evSpread;              for (j = 0; j < NUM_STATS; bits >>= 1, j++)              {                  if (bits & 1) @@ -433,16 +436,16 @@ static void SetPlayerAndOpponentParties(void)              bits = 1;              for (j = 0; j < NUM_STATS; bits <<= 1, j++)              { -                if (gFacilityTrainerMons[monSetId].evSpread & bits) +                if (gFacilityTrainerMons[monId].evSpread & bits)                      SetMonData(&gPlayerParty[i], MON_DATA_HP_EV + j, &evs);              }              CalculateMonStats(&gPlayerParty[i]);              friendship = 0;              for (k = 0; k < MAX_MON_MOVES; k++) -                SetMonMoveAvoidReturn(&gPlayerParty[i], gFacilityTrainerMons[monSetId].moves[k], k); +                SetMonMoveAvoidReturn(&gPlayerParty[i], gFacilityTrainerMons[monId].moves[k], k);              SetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP, &friendship); -            SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]); +            SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]);              SetMonData(&gPlayerParty[i], MON_DATA_ABILITY_NUM, &gSaveBlock2Ptr->frontier.rentalMons[i].abilityNum);          }      } @@ -453,17 +456,17 @@ static void SetPlayerAndOpponentParties(void)      case 2:          for (i = 0; i < FRONTIER_PARTY_SIZE; i++)          { -            monSetId = gSaveBlock2Ptr->frontier.rentalMons[i + 3].monId; +            monId = gSaveBlock2Ptr->frontier.rentalMons[i + 3].monId;              ivs = gSaveBlock2Ptr->frontier.rentalMons[i + 3].ivs;              CreateMon(&gEnemyParty[i], -                      gFacilityTrainerMons[monSetId].species, +                      gFacilityTrainerMons[monId].species,                        monLevel,                        ivs,                        TRUE, gSaveBlock2Ptr->frontier.rentalMons[i + 3].personality,                        OT_ID_PLAYER_ID, 0);              count = 0; -            bits = gFacilityTrainerMons[monSetId].evSpread; +            bits = gFacilityTrainerMons[monId].evSpread;              for (j = 0; j < NUM_STATS; bits >>= 1, j++)              {                  if (bits & 1) @@ -474,14 +477,14 @@ static void SetPlayerAndOpponentParties(void)              bits = 1;              for (j = 0; j < NUM_STATS; bits <<= 1, j++)              { -                if (gFacilityTrainerMons[monSetId].evSpread & bits) +                if (gFacilityTrainerMons[monId].evSpread & bits)                      SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &evs);              }              CalculateMonStats(&gEnemyParty[i]);              for (k = 0; k < MAX_MON_MOVES; k++) -                SetMonMoveAvoidReturn(&gEnemyParty[i], gFacilityTrainerMons[monSetId].moves[k], k); -            SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]); +                SetMonMoveAvoidReturn(&gEnemyParty[i], gFacilityTrainerMons[monId].moves[k], k); +            SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]);              SetMonData(&gEnemyParty[i], MON_DATA_ABILITY_NUM, &gSaveBlock2Ptr->frontier.rentalMons[i + 3].abilityNum);          }          break; @@ -497,8 +500,8 @@ static void GenerateInitialRentalMons(void)      u8 challengeNum;      u8 factoryLvlMode;      u8 factoryBattleMode; -    u8 var_40; -    u16 monSetId; +    u8 rentalRank; +    u16 monId;      u16 currSpecies;      u16 species[PARTY_SIZE];      u16 monIds[PARTY_SIZE]; @@ -530,30 +533,30 @@ static void GenerateInitialRentalMons(void)          factoryLvlMode = FRONTIER_LVL_50;          firstMonId = 0;      } -    var_40 = GetNumPastRentalsRank(factoryBattleMode, factoryLvlMode); +    rentalRank = GetNumPastRentalsRank(factoryBattleMode, factoryLvlMode);      currSpecies = SPECIES_NONE;      i = 0;      while (i != PARTY_SIZE)      { -        if (i < var_40) -            monSetId = GetMonSetId(factoryLvlMode, challengeNum, TRUE); +        if (i < rentalRank) // The more times the player has rented, the more initial rentals are generated from a better set of pokemon +            monId = GetFactoryMonId(factoryLvlMode, challengeNum, TRUE);          else -            monSetId = GetMonSetId(factoryLvlMode, challengeNum, FALSE); +            monId = GetFactoryMonId(factoryLvlMode, challengeNum, FALSE); -        if (gFacilityTrainerMons[monSetId].species == SPECIES_UNOWN) +        if (gFacilityTrainerMons[monId].species == SPECIES_UNOWN)              continue;          // Cannot have two pokemon of the same species.          for (j = firstMonId; j < firstMonId + i; j++)          { -            u16 monId = monIds[j]; -            if (monId == monSetId) +            u16 existingMonId = monIds[j]; +            if (existingMonId == monId)                  break; -            if (species[j] == gFacilityTrainerMons[monSetId].species) +            if (species[j] == gFacilityTrainerMons[monId].species)              {                  if (currSpecies == SPECIES_NONE) -                    currSpecies = gFacilityTrainerMons[monSetId].species; +                    currSpecies = gFacilityTrainerMons[monId].species;                  else                      break;              } @@ -564,9 +567,9 @@ static void GenerateInitialRentalMons(void)          // Cannot have two same held items.          for (j = firstMonId; j < firstMonId + i; j++)          { -            if (heldItems[j] != 0 && heldItems[j] == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]) +            if (heldItems[j] != 0 && heldItems[j] == gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId])              { -                if (gFacilityTrainerMons[monSetId].species == currSpecies) +                if (gFacilityTrainerMons[monId].species == currSpecies)                      currSpecies = SPECIES_NONE;                  break;              } @@ -574,10 +577,10 @@ static void GenerateInitialRentalMons(void)          if (j != firstMonId + i)              continue; -        gSaveBlock2Ptr->frontier.rentalMons[i].monId = monSetId; -        species[i] = gFacilityTrainerMons[monSetId].species; -        heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]; -        monIds[i] = monSetId; +        gSaveBlock2Ptr->frontier.rentalMons[i].monId = monId; +        species[i] = gFacilityTrainerMons[monId].species; +        heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]; +        monIds[i] = monId;          i++;      }  } @@ -629,10 +632,10 @@ static void GetOpponentBattleStyle(void)      for (i = 0; i < FRONTIER_PARTY_SIZE; i++)      { -        u16 monSetId = gUnknown_03006298[i]; +        u16 monId = gUnknown_03006298[i];          for (j = 0; j < MAX_MON_MOVES; j++)          { -            u8 battleStyle = GetMoveBattleStyle(gFacilityTrainerMons[monSetId].moves[j]); +            u8 battleStyle = GetMoveBattleStyle(gFacilityTrainerMons[monId].moves[j]);              stylePoints[battleStyle]++;          }      } @@ -724,16 +727,16 @@ void FillFactoryBrainParty(void)      while (i != FRONTIER_PARTY_SIZE)      { -        u16 monSetId = GetMonSetId(lvlMode, challengeNum, FALSE); +        u16 monId = GetFactoryMonId(lvlMode, challengeNum, FALSE); -        if (gFacilityTrainerMons[monSetId].species == SPECIES_UNOWN) +        if (gFacilityTrainerMons[monId].species == SPECIES_UNOWN)              continue; -        if (monLevel == 50 && monSetId > FRONTIER_MONS_HIGH_TIER) +        if (monLevel == 50 && monId > FRONTIER_MONS_HIGH_TIER)              continue;          for (j = 0; j < 6; j++)          { -            if (monSetId == gSaveBlock2Ptr->frontier.rentalMons[j].monId) +            if (monId == gSaveBlock2Ptr->frontier.rentalMons[j].monId)                  break;          }          if (j != 6) @@ -741,7 +744,7 @@ void FillFactoryBrainParty(void)          for (k = 0; k < i; k++)          { -            if (species[k] == gFacilityTrainerMons[monSetId].species) +            if (species[k] == gFacilityTrainerMons[monId].species)                  break;          }          if (k != i) @@ -749,35 +752,35 @@ void FillFactoryBrainParty(void)          for (k = 0; k < i; k++)          { -            if (heldItems[k] != 0 && heldItems[k] == gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]) +            if (heldItems[k] != 0 && heldItems[k] == gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId])                  break;          }          if (k != i)              continue; -        species[i] = gFacilityTrainerMons[monSetId].species; -        heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]; +        species[i] = gFacilityTrainerMons[monId].species; +        heldItems[i] = gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId];          CreateMonWithEVSpreadNatureOTID(&gEnemyParty[i], -                                             gFacilityTrainerMons[monSetId].species, +                                             gFacilityTrainerMons[monId].species,                                               monLevel, -                                             gFacilityTrainerMons[monSetId].nature, +                                             gFacilityTrainerMons[monId].nature,                                               fixedIV, -                                             gFacilityTrainerMons[monSetId].evSpread, +                                             gFacilityTrainerMons[monId].evSpread,                                               otId);          friendship = 0;          for (k = 0; k < MAX_MON_MOVES; k++) -            SetMonMoveAvoidReturn(&gEnemyParty[i], gFacilityTrainerMons[monSetId].moves[k], k); +            SetMonMoveAvoidReturn(&gEnemyParty[i], gFacilityTrainerMons[monId].moves[k], k);          SetMonData(&gEnemyParty[i], MON_DATA_FRIENDSHIP, &friendship); -        SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monSetId].itemTableId]); +        SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]);          i++;      }  } -static u16 GetMonSetId(u8 lvlMode, u8 challengeNum, bool8 arg2) +static u16 GetFactoryMonId(u8 lvlMode, u8 challengeNum, bool8 useBetterRange)  { -    u16 range, monSetId; -    u16 adder; +    u16 numMons, monId; +    u16 adder; // Used to skip past early mons for open level      if (lvlMode == FRONTIER_LVL_50)          adder = 0; @@ -786,30 +789,31 @@ static u16 GetMonSetId(u8 lvlMode, u8 challengeNum, bool8 arg2)      if (challengeNum < 7)      { -        if (arg2) +        if (useBetterRange)          { -            range = (sMonsToChooseFrom[adder + challengeNum + 1][1] - sMonsToChooseFrom[adder + challengeNum + 1][0]) + 1; -            monSetId = Random() % range; -            monSetId += sMonsToChooseFrom[adder + challengeNum + 1][0]; +            numMons = (sInitialRentalMonRanges[adder + challengeNum + 1][1] - sInitialRentalMonRanges[adder + challengeNum + 1][0]) + 1; +            monId = Random() % numMons; +            monId += sInitialRentalMonRanges[adder + challengeNum + 1][0];          }          else          { -            range = (sMonsToChooseFrom[adder + challengeNum][1] - sMonsToChooseFrom[adder + challengeNum][0]) + 1; -            monSetId = Random() % range; -            monSetId += sMonsToChooseFrom[adder + challengeNum][0]; +            numMons = (sInitialRentalMonRanges[adder + challengeNum][1] - sInitialRentalMonRanges[adder + challengeNum][0]) + 1; +            monId = Random() % numMons; +            monId += sInitialRentalMonRanges[adder + challengeNum][0];          }      }      else      { -        u16 num = challengeNum; -        if (num != 7) -            num = 7; -        range = (sMonsToChooseFrom[adder + num][1] - sMonsToChooseFrom[adder + num][0]) + 1; -        monSetId = Random() % range; -        monSetId += sMonsToChooseFrom[adder + num][0]; +        u16 challenge = challengeNum; +        if (challenge != 7) +            challenge = 7; // why bother assigning it above at all + +        numMons = (sInitialRentalMonRanges[adder + challenge][1] - sInitialRentalMonRanges[adder + challenge][0]) + 1; +        monId = Random() % numMons; +        monId += sInitialRentalMonRanges[adder + challenge][0];      } -    return monSetId; +    return monId;  }  u8 GetNumPastRentalsRank(u8 battleMode, u8 lvlMode) | 
