Skip to content

Commit

Permalink
Refactor trainer classes (rh-hideout#3875)
Browse files Browse the repository at this point in the history
* Created TrainerClass struct

* Added money multiplier to TrainerClass struct

* Added Poke Balls to struct

* Condensed gTrainerClasses

* Simplified trainer Poke Balls

* Moved trainer classes into battle_main.c

* Removed complicated ball macro

---------

Co-authored-by: Bassoonian <iasperbassoonian@gmail.com>
Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com>
  • Loading branch information
3 people authored Jan 4, 2024
1 parent 6cb89ef commit 4d5c572
Show file tree
Hide file tree
Showing 12 changed files with 109 additions and 188 deletions.
7 changes: 0 additions & 7 deletions include/battle_main.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,6 @@
#include "pokemon.h"
#include "data.h"

struct TrainerMoney
{
u8 classId;
u8 value;
};

// For displaying a multi battle partner's Pokémon in the party menu
struct MultiPartnerMenuPokemon
{
Expand Down Expand Up @@ -83,7 +77,6 @@ extern const struct SpriteTemplate gUnusedBattleInitSprite;
extern const struct OamData gOamData_BattleSpriteOpponentSide;
extern const struct OamData gOamData_BattleSpritePlayerSide;
extern const u8 gTypeNames[NUMBER_OF_MON_TYPES][TYPE_NAME_LENGTH + 1];
extern const struct TrainerMoney gTrainerMoneyTable[];

extern const u8 gStatusConditionString_PoisonJpn[8];
extern const u8 gStatusConditionString_SleepJpn[8];
Expand Down
10 changes: 9 additions & 1 deletion include/data.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define GUARD_DATA_H

#include "constants/moves.h"
#include "constants/trainers.h"

#define SPECIES_SHINY_TAG 5000

Expand Down Expand Up @@ -86,6 +87,13 @@ struct Trainer
/*0x1F*/ u8 partySize;
};

struct TrainerClass
{
u8 name[13];
u8 money;
u16 ball;
};

#define TRAINER_ENCOUNTER_MUSIC(trainer)((gTrainers[trainer].encounterMusic_gender & 0x7F))

extern const u16 gMinigameDigits_Pal[];
Expand Down Expand Up @@ -117,7 +125,7 @@ extern const struct TrainerBacksprite gTrainerBacksprites[];
extern const struct Trainer gTrainers[];
extern const struct Trainer gBattlePartners[];

extern const u8 gTrainerClassNames[][13];
extern const struct TrainerClass gTrainerClasses[TRAINER_CLASS_COUNT];
extern const u8 gMoveNames[MOVES_COUNT_DYNAMAX][MOVE_NAME_LENGTH + 1];
extern const u8 *const gZMoveNames[];
extern const u8 *const gMaxMoveNames[];
Expand Down
4 changes: 2 additions & 2 deletions src/battle_dome.c
Original file line number Diff line number Diff line change
Expand Up @@ -4263,8 +4263,8 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTourneyId)
else
j = GetFrontierOpponentClass(trainerId);

for (;gTrainerClassNames[j][i] != EOS; i++)
gStringVar1[i] = gTrainerClassNames[j][i];
for (;gTrainerClasses[j].name[i] != EOS; i++)
gStringVar1[i] = gTrainerClasses[j].name[i];
gStringVar1[i] = CHAR_SPACE;
gStringVar1[i + 1] = EOS;

Expand Down
162 changes: 78 additions & 84 deletions src/battle_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -322,92 +322,86 @@ const u8 gTypeNames[NUMBER_OF_MON_TYPES][TYPE_NAME_LENGTH + 1] =
[TYPE_FAIRY] = _("Fairy"),
};

// This is a factor in how much money you get for beating a trainer.
const struct TrainerMoney gTrainerMoneyTable[] =
{
{TRAINER_CLASS_TEAM_AQUA, 5},
{TRAINER_CLASS_AQUA_ADMIN, 10},
{TRAINER_CLASS_AQUA_LEADER, 20},
{TRAINER_CLASS_AROMA_LADY, 10},
{TRAINER_CLASS_RUIN_MANIAC, 15},
{TRAINER_CLASS_INTERVIEWER, 12},
{TRAINER_CLASS_TUBER_F, 1},
{TRAINER_CLASS_TUBER_M, 1},
{TRAINER_CLASS_SIS_AND_BRO, 3},
{TRAINER_CLASS_COOLTRAINER, 12},
{TRAINER_CLASS_HEX_MANIAC, 6},
{TRAINER_CLASS_LADY, 50},
{TRAINER_CLASS_BEAUTY, 20},
{TRAINER_CLASS_RICH_BOY, 50},
{TRAINER_CLASS_POKEMANIAC, 15},
{TRAINER_CLASS_SWIMMER_M, 2},
{TRAINER_CLASS_BLACK_BELT, 8},
{TRAINER_CLASS_GUITARIST, 8},
{TRAINER_CLASS_KINDLER, 8},
{TRAINER_CLASS_CAMPER, 4},
{TRAINER_CLASS_OLD_COUPLE, 10},
{TRAINER_CLASS_BUG_MANIAC, 15},
{TRAINER_CLASS_PSYCHIC, 6},
{TRAINER_CLASS_GENTLEMAN, 20},
{TRAINER_CLASS_ELITE_FOUR, 25},
{TRAINER_CLASS_LEADER, 25},
{TRAINER_CLASS_SCHOOL_KID, 5},
{TRAINER_CLASS_SR_AND_JR, 4},
{TRAINER_CLASS_POKEFAN, 20},
{TRAINER_CLASS_EXPERT, 10},
{TRAINER_CLASS_YOUNGSTER, 4},
{TRAINER_CLASS_CHAMPION, 50},
{TRAINER_CLASS_FISHERMAN, 10},
{TRAINER_CLASS_TRIATHLETE, 10},
{TRAINER_CLASS_DRAGON_TAMER, 12},
{TRAINER_CLASS_BIRD_KEEPER, 8},
{TRAINER_CLASS_NINJA_BOY, 3},
{TRAINER_CLASS_BATTLE_GIRL, 6},
{TRAINER_CLASS_PARASOL_LADY, 10},
{TRAINER_CLASS_SWIMMER_F, 2},
{TRAINER_CLASS_PICNICKER, 4},
{TRAINER_CLASS_TWINS, 3},
{TRAINER_CLASS_SAILOR, 8},
{TRAINER_CLASS_COLLECTOR, 15},
{TRAINER_CLASS_RIVAL, 15},
{TRAINER_CLASS_PKMN_BREEDER, 10},
{TRAINER_CLASS_PKMN_RANGER, 12},
{TRAINER_CLASS_TEAM_MAGMA, 5},
{TRAINER_CLASS_MAGMA_ADMIN, 10},
{TRAINER_CLASS_MAGMA_LEADER, 20},
{TRAINER_CLASS_LASS, 4},
{TRAINER_CLASS_BUG_CATCHER, 4},
{TRAINER_CLASS_HIKER, 10},
{TRAINER_CLASS_YOUNG_COUPLE, 8},
{TRAINER_CLASS_WINSTRATE, 10},
{0xFF, 5}, // Any trainer class not listed above uses this
};
#define DEFAULT_MONEY 5
#define DEFAULT_BALL ITEM_POKE_BALL

#define TRAINER_CLASS(trainerClass, trainerName, trainerMoney, trainerBall) \
[TRAINER_CLASS_##trainerClass] = \
{ \
.name = _(trainerName), \
.money = trainerMoney, \
.ball = trainerBall, \
}

#if B_TRAINER_CLASS_POKE_BALLS >= GEN_7
static const u16 sTrainerBallTable[TRAINER_CLASS_COUNT] =
const struct TrainerClass gTrainerClasses[TRAINER_CLASS_COUNT] =
{
#if B_TRAINER_CLASS_POKE_BALLS == GEN_7
[TRAINER_CLASS_PKMN_BREEDER] = ITEM_FRIEND_BALL,
#elif B_TRAINER_CLASS_POKE_BALLS == GEN_8
[TRAINER_CLASS_PKMN_BREEDER] = ITEM_HEAL_BALL,
#endif
[TRAINER_CLASS_COOLTRAINER] = ITEM_ULTRA_BALL,
[TRAINER_CLASS_COLLECTOR] = ITEM_PREMIER_BALL,
[TRAINER_CLASS_SWIMMER_M] = ITEM_DIVE_BALL,
[TRAINER_CLASS_BLACK_BELT] = ITEM_ULTRA_BALL,
[TRAINER_CLASS_AQUA_LEADER] = ITEM_MASTER_BALL,
[TRAINER_CLASS_GENTLEMAN] = ITEM_LUXURY_BALL,
[TRAINER_CLASS_ELITE_FOUR] = ITEM_ULTRA_BALL,
#if B_TRAINER_CLASS_POKE_BALLS == GEN_7
[TRAINER_CLASS_FISHERMAN] = ITEM_LURE_BALL,
#elif B_TRAINER_CLASS_POKE_BALLS == GEN_8
[TRAINER_CLASS_FISHERMAN] = ITEM_DIVE_BALL,
#endif
[TRAINER_CLASS_SWIMMER_F] = ITEM_DIVE_BALL,
[TRAINER_CLASS_COOLTRAINER_2] = ITEM_ULTRA_BALL,
[TRAINER_CLASS_MAGMA_LEADER] = ITEM_MASTER_BALL,
TRAINER_CLASS(PKMN_TRAINER_1, "{PKMN} TRAINER", DEFAULT_MONEY, DEFAULT_BALL),
TRAINER_CLASS(PKMN_TRAINER_2, "{PKMN} TRAINER", DEFAULT_MONEY, DEFAULT_BALL),
TRAINER_CLASS(HIKER, "HIKER", 10, DEFAULT_BALL),
TRAINER_CLASS(TEAM_AQUA, "TEAM AQUA", 5, DEFAULT_BALL),
TRAINER_CLASS(PKMN_BREEDER, "{PKMN} BREEDER", 10, B_TRAINER_CLASS_POKE_BALLS >= GEN_8 ? ITEM_HEAL_BALL : ITEM_FRIEND_BALL),
TRAINER_CLASS(COOLTRAINER, "COOLTRAINER", 12, ITEM_ULTRA_BALL),
TRAINER_CLASS(BIRD_KEEPER, "BIRD KEEPER", 8, DEFAULT_BALL),
TRAINER_CLASS(COLLECTOR, "COLLECTOR", 15, ITEM_PREMIER_BALL),
TRAINER_CLASS(SWIMMER_M, "SWIMMER♂", 2, ITEM_DIVE_BALL),
TRAINER_CLASS(TEAM_MAGMA, "TEAM MAGMA", 5, DEFAULT_BALL),
TRAINER_CLASS(EXPERT, "EXPERT", 10, DEFAULT_BALL),
TRAINER_CLASS(AQUA_ADMIN, "AQUA ADMIN", 10, DEFAULT_BALL),
TRAINER_CLASS(BLACK_BELT, "BLACK BELT", 8, ITEM_ULTRA_BALL),
TRAINER_CLASS(AQUA_LEADER, "AQUA LEADER", 20, ITEM_MASTER_BALL),
TRAINER_CLASS(HEX_MANIAC, "HEX MANIAC", 6, DEFAULT_BALL),
TRAINER_CLASS(AROMA_LADY, "AROMA LADY", 10, DEFAULT_BALL),
TRAINER_CLASS(RUIN_MANIAC, "RUIN MANIAC", 15, DEFAULT_BALL),
TRAINER_CLASS(INTERVIEWER, "INTERVIEWER", 12, DEFAULT_BALL),
TRAINER_CLASS(TUBER_F, "TUBER", 1, DEFAULT_BALL),
TRAINER_CLASS(TUBER_M, "TUBER", 1, DEFAULT_BALL),
TRAINER_CLASS(LADY, "LADY", 50, DEFAULT_BALL),
TRAINER_CLASS(BEAUTY, "BEAUTY", 20, DEFAULT_BALL),
TRAINER_CLASS(RICH_BOY, "RICH BOY", 50, DEFAULT_BALL),
TRAINER_CLASS(POKEMANIAC, "POKéMANIAC", 15, DEFAULT_BALL),
TRAINER_CLASS(GUITARIST, "GUITARIST", 8, DEFAULT_BALL),
TRAINER_CLASS(KINDLER, "KINDLER", 8, DEFAULT_BALL),
TRAINER_CLASS(CAMPER, "CAMPER", 4, DEFAULT_BALL),
TRAINER_CLASS(PICNICKER, "PICNICKER", 4, DEFAULT_BALL),
TRAINER_CLASS(BUG_MANIAC, "BUG MANIAC", 15, DEFAULT_BALL),
TRAINER_CLASS(PSYCHIC, "PSYCHIC", 6, DEFAULT_BALL),
TRAINER_CLASS(GENTLEMAN, "GENTLEMAN", 20, ITEM_LUXURY_BALL),
TRAINER_CLASS(ELITE_FOUR, "ELITE FOUR", 25, ITEM_ULTRA_BALL),
TRAINER_CLASS(LEADER, "LEADER", 25, DEFAULT_BALL),
TRAINER_CLASS(SCHOOL_KID, "SCHOOL KID", 5, DEFAULT_BALL),
TRAINER_CLASS(SR_AND_JR, "SR. AND JR.", 4, DEFAULT_BALL),
TRAINER_CLASS(WINSTRATE, "WINSTRATE", 10, DEFAULT_BALL),
TRAINER_CLASS(POKEFAN, "POKéFAN", 20, DEFAULT_BALL),
TRAINER_CLASS(YOUNGSTER, "YOUNGSTER", 4, DEFAULT_BALL),
TRAINER_CLASS(CHAMPION, "CHAMPION", 50, DEFAULT_BALL),
TRAINER_CLASS(FISHERMAN, "FISHERMAN", 10, B_TRAINER_CLASS_POKE_BALLS >= GEN_8 ? ITEM_DIVE_BALL : ITEM_LURE_BALL),
TRAINER_CLASS(TRIATHLETE, "TRIATHLETE", 10, DEFAULT_BALL),
TRAINER_CLASS(DRAGON_TAMER, "DRAGON TAMER", 12, DEFAULT_BALL),
TRAINER_CLASS(NINJA_BOY, "NINJA BOY", 3, DEFAULT_BALL),
TRAINER_CLASS(BATTLE_GIRL, "BATTLE GIRL", 6, DEFAULT_BALL),
TRAINER_CLASS(PARASOL_LADY, "PARASOL LADY", 10, DEFAULT_BALL),
TRAINER_CLASS(SWIMMER_F, "SWIMMER♀", 2, ITEM_DIVE_BALL),
TRAINER_CLASS(TWINS, "TWINS", 3, DEFAULT_BALL),
TRAINER_CLASS(SAILOR, "SAILOR", 8, DEFAULT_BALL),
TRAINER_CLASS(COOLTRAINER_2, "COOLTRAINER", DEFAULT_MONEY, ITEM_ULTRA_BALL),
TRAINER_CLASS(MAGMA_ADMIN, "MAGMA ADMIN", 10, DEFAULT_BALL),
TRAINER_CLASS(RIVAL, "{PKMN} TRAINER", 15, DEFAULT_BALL),
TRAINER_CLASS(BUG_CATCHER, "BUG CATCHER", 4, DEFAULT_BALL),
TRAINER_CLASS(PKMN_RANGER, "{PKMN} RANGER", 12, DEFAULT_BALL),
TRAINER_CLASS(MAGMA_LEADER, "MAGMA LEADER", 20, ITEM_MASTER_BALL),
TRAINER_CLASS(LASS, "LASS", 4, DEFAULT_BALL),
TRAINER_CLASS(YOUNG_COUPLE, "YOUNG COUPLE", 8, DEFAULT_BALL),
TRAINER_CLASS(OLD_COUPLE, "OLD COUPLE", 10, DEFAULT_BALL),
TRAINER_CLASS(SIS_AND_BRO, "SIS AND BRO", 3, DEFAULT_BALL),
TRAINER_CLASS(SALON_MAIDEN, "SALON MAIDEN", DEFAULT_MONEY, DEFAULT_BALL),
TRAINER_CLASS(DOME_ACE, "DOME ACE", DEFAULT_MONEY, DEFAULT_BALL),
TRAINER_CLASS(PALACE_MAVEN, "PALACE MAVEN", DEFAULT_MONEY, DEFAULT_BALL),
TRAINER_CLASS(ARENA_TYCOON, "ARENA TYCOON", DEFAULT_MONEY, DEFAULT_BALL),
TRAINER_CLASS(FACTORY_HEAD, "FACTORY HEAD", DEFAULT_MONEY, DEFAULT_BALL),
TRAINER_CLASS(PIKE_QUEEN, "PIKE QUEEN", DEFAULT_MONEY, DEFAULT_BALL),
TRAINER_CLASS(PYRAMID_KING, "PYRAMID KING", DEFAULT_MONEY, DEFAULT_BALL),
TRAINER_CLASS(RS_PROTAG, "{PKMN} TRAINER", DEFAULT_MONEY, DEFAULT_BALL),
};
#endif

static void (* const sTurnActionsFuncsTable[])(void) =
{
Expand Down Expand Up @@ -2036,7 +2030,7 @@ u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer
#if B_TRAINER_CLASS_POKE_BALLS >= GEN_7
if (ball == -1)
{
ball = (sTrainerBallTable[trainer->trainerClass]) ? sTrainerBallTable[trainer->trainerClass] : ITEM_POKE_BALL;
ball = gTrainerClasses[trainer->trainerClass].ball ?: ITEM_POKE_BALL;
SetMonData(&party[i], MON_DATA_POKEBALL, &ball);
}
#endif
Expand Down
18 changes: 9 additions & 9 deletions src/battle_message.c
Original file line number Diff line number Diff line change
Expand Up @@ -3214,19 +3214,19 @@ static const u8 *BattleStringGetOpponentClassByTrainerId(u16 trainerId)
const u8 *toCpy;

if (gBattleTypeFlags & BATTLE_TYPE_SECRET_BASE)
toCpy = gTrainerClassNames[GetSecretBaseTrainerClass()];
toCpy = gTrainerClasses[GetSecretBaseTrainerClass()].name;
else if (trainerId == TRAINER_UNION_ROOM)
toCpy = gTrainerClassNames[GetUnionRoomTrainerClass()];
toCpy = gTrainerClasses[GetUnionRoomTrainerClass()].name;
else if (trainerId == TRAINER_FRONTIER_BRAIN)
toCpy = gTrainerClassNames[GetFrontierBrainTrainerClass()];
toCpy = gTrainerClasses[GetFrontierBrainTrainerClass()].name;
else if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
toCpy = gTrainerClassNames[GetFrontierOpponentClass(trainerId)];
toCpy = gTrainerClasses[GetFrontierOpponentClass(trainerId)].name;
else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL)
toCpy = gTrainerClassNames[GetTrainerHillOpponentClass(trainerId)];
toCpy = gTrainerClasses[GetTrainerHillOpponentClass(trainerId)].name;
else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER)
toCpy = gTrainerClassNames[GetEreaderTrainerClassId()];
toCpy = gTrainerClasses[GetEreaderTrainerClassId()].name;
else
toCpy = gTrainerClassNames[gTrainers[trainerId].trainerClass];
toCpy = gTrainerClasses[gTrainers[trainerId].trainerClass].name;

return toCpy;
}
Expand Down Expand Up @@ -3575,7 +3575,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)
}
break;
case B_TXT_PARTNER_CLASS:
toCpy = gTrainerClassNames[GetFrontierOpponentClass(gPartnerTrainerId)];
toCpy = gTrainerClasses[GetFrontierOpponentClass(gPartnerTrainerId)].name;
break;
case B_TXT_PARTNER_NAME:
toCpy = BattleStringGetPlayerName(text, GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT));
Expand All @@ -3588,7 +3588,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)
{
case B_POSITION_PLAYER_RIGHT:
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
toCpy = gTrainerClassNames[GetFrontierOpponentClass(gPartnerTrainerId)];
toCpy = gTrainerClasses[GetFrontierOpponentClass(gPartnerTrainerId)].name;
break;
case B_POSITION_OPPONENT_LEFT:
toCpy = BattleStringGetOpponentClassByTrainerId(gTrainerBattleOpponent_A);
Expand Down
15 changes: 5 additions & 10 deletions src/battle_script_commands.c
Original file line number Diff line number Diff line change
Expand Up @@ -7362,9 +7362,9 @@ static void Cmd_hitanimation(void)

static u32 GetTrainerMoneyToGive(u16 trainerId)
{
u32 i = 0;
u32 lastMonLevel = 0;
u32 moneyReward;
u8 trainerMoney;

if (trainerId == TRAINER_SECRET_BASE)
{
Expand All @@ -7374,19 +7374,14 @@ static u32 GetTrainerMoneyToGive(u16 trainerId)
{
const struct TrainerMon *party = gTrainers[trainerId].party;
lastMonLevel = party[gTrainers[trainerId].partySize - 1].lvl;

for (; gTrainerMoneyTable[i].classId != 0xFF; i++)
{
if (gTrainerMoneyTable[i].classId == gTrainers[trainerId].trainerClass)
break;
}
trainerMoney = gTrainerClasses[gTrainers[trainerId].trainerClass].money;

if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
moneyReward = 4 * lastMonLevel * gBattleStruct->moneyMultiplier * gTrainerMoneyTable[i].value;
moneyReward = 4 * lastMonLevel * gBattleStruct->moneyMultiplier * trainerMoney;
else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
moneyReward = 4 * lastMonLevel * gBattleStruct->moneyMultiplier * 2 * gTrainerMoneyTable[i].value;
moneyReward = 4 * lastMonLevel * gBattleStruct->moneyMultiplier * 2 * trainerMoney;
else
moneyReward = 4 * lastMonLevel * gBattleStruct->moneyMultiplier * gTrainerMoneyTable[i].value;
moneyReward = 4 * lastMonLevel * gBattleStruct->moneyMultiplier * trainerMoney;
}

return moneyReward;
Expand Down
1 change: 0 additions & 1 deletion src/data.c
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,5 @@ const union AnimCmd *const gAnims_MonPic[MAX_MON_PIC_FRAMES] =
};

#include "data/trainer_parties.h"
#include "data/text/trainer_class_names.h"
#include "data/trainers.h"
#include "data/text/move_names.h"
68 changes: 0 additions & 68 deletions src/data/text/trainer_class_names.h

This file was deleted.

Loading

0 comments on commit 4d5c572

Please sign in to comment.