diff --git a/asm/macros/scrcmd.inc b/asm/macros/scrcmd.inc index d1ce1513d1..d20c8dd46b 100644 --- a/asm/macros/scrcmd.inc +++ b/asm/macros/scrcmd.inc @@ -1991,15 +1991,15 @@ .short 340 .endm - .macro ScrCmd_155 arg0, arg1 + .macro GetTrainerInfoTrainerClass variant, destVar .short 341 - .short \arg0 - .short \arg1 + .short \variant + .short \destVar .endm - .macro ScrCmd_156 arg0 + .macro SetTrainerInfoAppearance appearance .short 342 - .short \arg0 + .short \appearance .endm .macro CheckPokedexAcquired destVarID @@ -3981,10 +3981,10 @@ .short \arg3 .endm - .macro ScrCmd_29C arg0, arg1 + .macro CalculateTrainerInfoAppearance variant, destVar .short 668 - .short \arg0 - .short \arg1 + .short \variant + .short \destVar .endm .macro AddMenuEntry entryStringID, entryIndex diff --git a/generated/vars_flags.txt b/generated/vars_flags.txt index ab0c069cc3..0b9d4e3210 100644 --- a/generated/vars_flags.txt +++ b/generated/vars_flags.txt @@ -110,7 +110,7 @@ FLAG_GOT_POTION_FROM_ROUTE_201_CASHIER FLAG_UNK_0x006D FLAG_UNK_0x006E FLAG_UNK_0x006F -FLAG_CHOSE_TRAINER_CLASS +FLAG_CHOSE_UNION_ROOM_APPEARANCE FLAG_UNK_0x0071 FLAG_UNK_0x0072 FLAG_UNK_0x0073 diff --git a/include/appearance.h b/include/appearance.h new file mode 100644 index 0000000000..0b90a44e44 --- /dev/null +++ b/include/appearance.h @@ -0,0 +1,18 @@ +#ifndef POKEPLATINUM_APPEARENCE_H +#define POKEPLATINUM_APPEARENCE_H + +#include "string_template.h" + +enum AppearanceDataParam { + APPEARANCE_DATA_INDEX = 0, + APPEARANCE_DATA_TRAINER_CLASS_2, + APPEARANCE_DATA_TRAINER_CLASS_1, +}; + +void Appearance_LoadVariants(u32 trainerId, int trainerGender, StringTemplate *stringTemplate); +int Appearance_CalculateFromTrainerInfo(u32 trainerId, int trainerGender, u32 variant); +int Appearance_GetIndex(int gender, int appearance); +int Appearance_GetData(int gender, int appearance, enum AppearanceDataParam param); +u16 *sub_0205CA4C(enum HeapID heapID); + +#endif // POKEPLATINUM_APPEARENCE_H diff --git a/include/unk_0205C980.h b/include/unk_0205C980.h deleted file mode 100644 index 1afa5b5f32..0000000000 --- a/include/unk_0205C980.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef POKEPLATINUM_UNK_0205C980_H -#define POKEPLATINUM_UNK_0205C980_H - -#include "string_template.h" - -void TrainerInfo_LoadAppearanceVariants(u32 trainerId, int trainerGender, StringTemplate *stringTemplate); -int TrainerInfo_GetAppearanceIndex(u32 trainerId, int trainerGender, u32 variant); -int sub_0205CA0C(int param0, int param1); -int sub_0205CA14(int param0, int param1, int param2); -u16 *sub_0205CA4C(enum HeapID heapID); - -#endif // POKEPLATINUM_UNK_0205C980_H diff --git a/platinum.us/main.lsf b/platinum.us/main.lsf index e5b4f8d774..c85ba01e38 100644 --- a/platinum.us/main.lsf +++ b/platinum.us/main.lsf @@ -243,7 +243,7 @@ Static main Object main.nef.p/src_unk_0205A0D8.c.o Object main.nef.p/src_unk_0205B33C.c.o Object main.nef.p/src_unk_0205C22C.c.o - Object main.nef.p/src_unk_0205C980.c.o + Object main.nef.p/src_appearance.c.o Object main.nef.p/src_unk_0205CA94.c.o Object main.nef.p/src_field_message.c.o Object main.nef.p/src_map_tile_behavior.c.o diff --git a/res/field/scripts/scripts_oreburgh_city_pokecenter_1f.s b/res/field/scripts/scripts_oreburgh_city_pokecenter_1f.s index 11e9e9fdd5..4441ff3008 100644 --- a/res/field/scripts/scripts_oreburgh_city_pokecenter_1f.s +++ b/res/field/scripts/scripts_oreburgh_city_pokecenter_1f.s @@ -41,7 +41,7 @@ OreburghCityPokecenter1F_Psychic: PlayFanfare SEQ_SE_CONFIRM LockAll FacePlayer - GoToIfSet FLAG_CHOSE_TRAINER_CLASS, OreburghCityPokecenter1F_HowAboutTellingMeWhatKindOfTrainerYouLike + GoToIfSet FLAG_CHOSE_UNION_ROOM_APPEARANCE, OreburghCityPokecenter1F_HowAboutTellingMeWhatKindOfTrainerYouLike Message OreburghCityPokecenter1F_Text_WhatIsYourFavoriteKindOfTrainerCanYouTellMe GoTo OreburghCityPokecenter1F_WhichKindOfTrainerWouldYouLikeToBe @@ -64,7 +64,7 @@ OreburghCityPokecenter1F_WhichKindOfTrainerWouldYouLikeToBe: SetVar VAR_0x8008, VAR_RESULT GoToIfEq VAR_0x8008, 4, OreburghCityPokecenter1F_OKThenIllJustTalkToYouLater GoToIfEq VAR_0x8008, -2, OreburghCityPokecenter1F_OKThenIllJustTalkToYouLater - ScrCmd_155 VAR_0x8004, VAR_0x8005 + GetTrainerInfoTrainerClass VAR_0x8004, VAR_0x8005 BufferTrainerClassNameWithArticle 0, VAR_0x8005 CapitalizeFirstLetter 0 Message OreburghCityPokecenter1F_Text_AskThisIsTheKindOfTrainerYouWantToBe @@ -82,9 +82,9 @@ OreburghCityPokecenter1F_OKThenIllJustTalkToYouLater: OreburghCityPokecenter1F_SetTrainerClass: BufferTrainerClassNameWithArticle 0, VAR_0x8005 Message OreburghCityPokecenter1F_Text_ISeeSoThisIsTheKindOfTrainerYouLike - SetFlag FLAG_CHOSE_TRAINER_CLASS - ScrCmd_29C VAR_0x8004, VAR_0x8005 - ScrCmd_156 VAR_0x8005 + SetFlag FLAG_CHOSE_UNION_ROOM_APPEARANCE + CalculateTrainerInfoAppearance VAR_0x8004, VAR_0x8005 + SetTrainerInfoAppearance VAR_0x8005 GoTo OreburghCityPokecenter1F_OKThenIllJustTalkToYouLater OreburghCityPokecenter1F_Gentleman: diff --git a/src/appearance.c b/src/appearance.c new file mode 100644 index 0000000000..f05ef4830e --- /dev/null +++ b/src/appearance.c @@ -0,0 +1,124 @@ +#include "appearance.h" + +#include +#include + +#include "generated/trainer_classes.h" + +#include "graphics.h" +#include "heap.h" +#include "string_template.h" + +#define APPEARANCES_COUNT 8 +#define VARIANTS_COUNT 4 + +typedef struct Appearance { + int index; + int class1; + int class2; +} Appearance; + +static const Appearance sTrainerAppearances[APPEARANCES_COUNT * 2] = { + // male appearances + { 3, TRAINER_CLASS_SCHOOL_KID_MALE, TRAINER_CLASS_SCHOOL_KID_MALE }, + { 5, TRAINER_CLASS_BUG_CATCHER, TRAINER_CLASS_BUG_CATCHER }, + { 11, TRAINER_CLASS_ACE_TRAINER_MALE, TRAINER_CLASS_ACE_TRAINER_MALE }, + { 31, TRAINER_CLASS_ROUGHNECK, TRAINER_CLASS_ROUGHNECK }, + { 50, TRAINER_CLASS_RUIN_MANIAC, TRAINER_CLASS_RUIN_MANIAC }, + { 51, TRAINER_CLASS_BLACK_BELT, TRAINER_CLASS_BLACK_BELT }, + { 62, TRAINER_CLASS_RICH_BOY, TRAINER_CLASS_RICH_BOY }, + { 70, TRAINER_CLASS_PSYCHIC_MALE, TRAINER_CLASS_PSYCHIC_MALE }, + + // female appearances + { 6, TRAINER_CLASS_LASS, TRAINER_CLASS_LASS }, + { 7, TRAINER_CLASS_BATTLE_GIRL, TRAINER_CLASS_BATTLE_GIRL }, + { 13, TRAINER_CLASS_BEAUTY, TRAINER_CLASS_BEAUTY }, + { 14, TRAINER_CLASS_ACE_TRAINER_FEMALE, TRAINER_CLASS_ACE_TRAINER_FEMALE }, + { 35, TRAINER_CLASS_IDOL, TRAINER_CLASS_IDOL }, + { 37, TRAINER_CLASS_SOCIALITE, TRAINER_CLASS_SOCIALITE }, + { 42, TRAINER_CLASS_COWGIRL, TRAINER_CLASS_COWGIRL }, + { 63, TRAINER_CLASS_LADY, TRAINER_CLASS_LADY } +}; + +static const int sAppearanceShuffleTable[APPEARANCES_COUNT][VARIANTS_COUNT] = { + { 0, 1, 2, 3 }, + { 1, 6, 7, 0 }, + { 2, 3, 4, 5 }, + { 3, 0, 5, 6 }, + { 4, 1, 2, 7 }, + { 5, 2, 7, 0 }, + { 6, 3, 4, 1 }, + { 7, 4, 5, 6 } +}; + +void Appearance_LoadVariants(u32 trainerId, int trainerGender, StringTemplate *stringTemplate) +{ + int rnd = trainerId % APPEARANCES_COUNT; + int variant; + + for (variant = 0; variant < VARIANTS_COUNT; variant++) { + int appearanceIndex = sAppearanceShuffleTable[rnd][variant] + APPEARANCES_COUNT * trainerGender; + StringTemplate_SetTrainerClassName(stringTemplate, variant, sTrainerAppearances[appearanceIndex].class1); + } +} + +int Appearance_CalculateFromTrainerInfo(u32 trainerId, int trainerGender, u32 variant) +{ + int rnd = trainerId % APPEARANCES_COUNT; + int appearanceIndex = sAppearanceShuffleTable[rnd][variant] + APPEARANCES_COUNT * trainerGender; + + return sTrainerAppearances[appearanceIndex].index; +} + +static int GetAppearanceIndex(int gender, int appearance) +{ + for (int i = 0; i < APPEARANCES_COUNT; i++) { + if (sTrainerAppearances[i + gender * APPEARANCES_COUNT].index == appearance) { + return i + gender * APPEARANCES_COUNT; + } + } + + return 0; +} + +int Appearance_GetIndex(int gender, int appearance) +{ + return GetAppearanceIndex(gender, appearance); +} + +int Appearance_GetData(int gender, int appearance, enum AppearanceDataParam param) +{ + int appearanceIndex = GetAppearanceIndex(gender, appearance); + + switch (param) { + case APPEARANCE_DATA_INDEX: + return appearanceIndex; + case APPEARANCE_DATA_TRAINER_CLASS_1: + return sTrainerAppearances[appearanceIndex].class1; + case APPEARANCE_DATA_TRAINER_CLASS_2: + return sTrainerAppearances[appearanceIndex].class2; + default: + GF_ASSERT(FALSE); + return 0; + } +} + +u16 *sub_0205CA4C(enum HeapID heapID) +{ + u8 *v0, *v1; + NNSG2dPaletteData *v2, *v3; + u16 *v4, *v5; + int v6; + + v0 = Graphics_GetPlttData(NARC_INDEX_GRAPHIC__RECORD, 7, &v2, heapID); + v4 = Heap_Alloc(heapID, 16 * 18 * 2); + v5 = (u16 *)v2->pRawData; + + for (v6 = 0; v6 < 16 * 16; v6++) { + v4[v6] = v5[v6]; + } + + Heap_Free(v0); + + return v4; +} diff --git a/src/field_battle_data_transfer.c b/src/field_battle_data_transfer.c index 8d93fe1707..2f1426f214 100644 --- a/src/field_battle_data_transfer.c +++ b/src/field_battle_data_transfer.c @@ -22,6 +22,7 @@ #include "field/field_system.h" #include "savedata/save_table.h" +#include "appearance.h" #include "bag.h" #include "battle_regulation.h" #include "charcode_util.h" @@ -55,7 +56,6 @@ #include "unk_0203266C.h" #include "unk_020366A0.h" #include "unk_020559DC.h" -#include "unk_0205C980.h" #include "vars_flags.h" #include "res/text/bank/location_names.h" @@ -401,7 +401,7 @@ void FieldBattleDTO_InitWithPartyOrder(FieldBattleDTO *dto, const FieldSystem *f int unionAppearance = TrainerInfo_Appearance(trainerInfo); int unionGender = TrainerInfo_Gender(trainerInfo); - dto->trainer[BATTLER_PLAYER_1].header.trainerType = sub_0205CA14(unionGender, unionAppearance, 1); + dto->trainer[BATTLER_PLAYER_1].header.trainerType = Appearance_GetData(unionGender, unionAppearance, APPEARANCE_DATA_TRAINER_CLASS_2); CharCode_Copy(dto->trainer[BATTLER_PLAYER_1].name, TrainerInfo_Name(dto->trainerInfo[BATTLER_PLAYER_1])); dto->trainer[BATTLER_PLAYER_2] = dto->trainer[BATTLER_PLAYER_1]; } else { diff --git a/src/game_start.c b/src/game_start.c index 173f6df69a..9e56847809 100644 --- a/src/game_start.c +++ b/src/game_start.c @@ -3,6 +3,7 @@ #include "constants/game_options.h" #include "constants/heap.h" +#include "appearance.h" #include "berry_patches.h" #include "game_options.h" #include "heap.h" @@ -20,7 +21,6 @@ #include "system_data.h" #include "system_flags.h" #include "trainer_info.h" -#include "unk_0205C980.h" #include "unk_0206B9D8.h" #include "vars_flags.h" @@ -165,7 +165,7 @@ static void InitializeNewSave(enum HeapID heapID, SaveData *saveData, BOOL setTr TrainerInfo_SetID(trainerInfo, rnd); } - TrainerInfo_SetAppearance(trainerInfo, TrainerInfo_GetAppearanceIndex(rnd, TrainerInfo_Gender(trainerInfo), 0)); + TrainerInfo_SetAppearance(trainerInfo, Appearance_CalculateFromTrainerInfo(rnd, TrainerInfo_Gender(trainerInfo), 0)); berryPatches = MiscSaveBlock_GetBerryPatches(saveData); BerryPatches_Init(berryPatches, heapID, (const u16 *)sBerryInitTable, NELEMS(sBerryInitTable)); diff --git a/src/meson.build b/src/meson.build index c32c231822..ecea1fd170 100644 --- a/src/meson.build +++ b/src/meson.build @@ -230,7 +230,7 @@ pokeplatinum_c = files( 'unk_0205A0D8.c', 'unk_0205B33C.c', 'unk_0205C22C.c', - 'unk_0205C980.c', + 'appearance.c', 'unk_0205CA94.c', 'field_message.c', 'map_tile_behavior.c', diff --git a/src/overlay059/ov59_021D0D80.c b/src/overlay059/ov59_021D0D80.c index 7674696464..e6483421fa 100644 --- a/src/overlay059/ov59_021D0D80.c +++ b/src/overlay059/ov59_021D0D80.c @@ -13,6 +13,7 @@ #include "overlay059/ov59_021D2F88.h" #include "overlay059/struct_ov59_021D109C.h" +#include "appearance.h" #include "bg_window.h" #include "char_transfer.h" #include "communication_information.h" @@ -54,7 +55,6 @@ #include "unk_020393C8.h" #include "unk_0205B33C.h" #include "unk_0205C22C.h" -#include "unk_0205C980.h" #include "unk_020961E8.h" #include "vram_transfer.h" @@ -1655,7 +1655,7 @@ static void ov59_021D2860(NNSG2dCharacterData *param0[2], NNSG2dPaletteData *par int v0; u8 *v1, *v2; - v0 = sub_0205CA0C(param4, param3); + v0 = Appearance_GetIndex(param4, param3); v1 = (u8 *)param0[1]->pRawData; v2 = (u8 *)param1[1]->pRawData; diff --git a/src/overlay064/ov64_0222DCE0.c b/src/overlay064/ov64_0222DCE0.c index 736f488b11..f023c20589 100644 --- a/src/overlay064/ov64_0222DCE0.c +++ b/src/overlay064/ov64_0222DCE0.c @@ -18,6 +18,7 @@ #include "overlay063/struct_ov63_0222BB38_decl.h" #include "overlay064/struct_ov64_022302EC.h" +#include "appearance.h" #include "ascii_util.h" #include "bag.h" #include "bg_window.h" @@ -61,7 +62,6 @@ #include "unk_0202ACE0.h" #include "unk_0203061C.h" #include "unk_0203909C.h" -#include "unk_0205C980.h" #include "unk_020890F4.h" #include "vars_flags.h" #include "vram_transfer.h" @@ -3147,7 +3147,7 @@ static void ov64_02231164(UnkStruct_ov64_02230F98 *param0, UnkStruct_ov64_0222E0 UnkStruct_ov5_021DE5D0 v3; u32 v0 = sub_0202AD2C(wifiList, param1->unk_08.unk_04[param1->unk_07], 8); u32 v1 = sub_0202AD2C(wifiList, param1->unk_08.unk_04[param1->unk_07], 7); - sub_02076AAC(sub_0205CA14(v0, v1, 1), 2, &v3); + sub_02076AAC(Appearance_GetData(v0, v1, APPEARANCE_DATA_TRAINER_CLASS_2), 2, &v3); void *buffer = Heap_Alloc(heapID, 0xC80); CharacterSprite_LoadTiledData(v3.narcID, v3.unk_14, heapID, 0, 0, 10, 10, buffer); diff --git a/src/overlay094/ov94_02243EF8.c b/src/overlay094/ov94_02243EF8.c index d8fae6faeb..ba44c965a4 100644 --- a/src/overlay094/ov94_02243EF8.c +++ b/src/overlay094/ov94_02243EF8.c @@ -7,6 +7,7 @@ #include "overlay094/application.h" #include "overlay094/gts_application_state.h" +#include "appearance.h" #include "graphics.h" #include "heap.h" #include "sound_playback.h" @@ -14,7 +15,6 @@ #include "sys_task_manager.h" #include "touch_screen.h" #include "unk_0200679C.h" -#include "unk_0205C980.h" typedef struct AvatarAnimationData { int state; @@ -302,7 +302,7 @@ static void ov94_02244378(NNSG2dCharacterData *param0, NNSG2dPaletteData *param1 int v0; u8 *v1, *v2; - v0 = sub_0205CA0C(param4, param3); + v0 = Appearance_GetIndex(param4, param3); v1 = (u8 *)param0->pRawData; v2 = (u8 *)param1->pRawData; diff --git a/src/overlay109/ov109_021D3D50.c b/src/overlay109/ov109_021D3D50.c index 21b256a90b..531dea4ac8 100644 --- a/src/overlay109/ov109_021D3D50.c +++ b/src/overlay109/ov109_021D3D50.c @@ -13,6 +13,7 @@ #include "overlay109/struct_ov109_021D5140_sub1.h" #include "overlay109/struct_ov109_021D5140_sub2.h" +#include "appearance.h" #include "bg_window.h" #include "char_transfer.h" #include "communication_information.h" @@ -54,7 +55,6 @@ #include "unk_02038ED4.h" #include "unk_020393C8.h" #include "unk_0205B33C.h" -#include "unk_0205C980.h" #include "unk_0209BDF8.h" #include "vram_transfer.h" @@ -1659,7 +1659,7 @@ static void ov109_021D57E0(NNSG2dCharacterData *param0[2], NNSG2dPaletteData *pa int v0; u8 *v1, *v2; - v0 = sub_0205CA0C(param4, param3); + v0 = Appearance_GetIndex(param4, param3); v1 = (u8 *)param0[1]->pRawData; v2 = (u8 *)param1[1]->pRawData; diff --git a/src/scrcmd.c b/src/scrcmd.c index feabf30792..735f182148 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -94,6 +94,7 @@ #include "savedata/save_table.h" #include "underground/vendors.h" +#include "appearance.h" #include "bag.h" #include "bg_window.h" #include "camera.h" @@ -206,7 +207,6 @@ #include "unk_0205749C.h" #include "unk_0205B33C.h" #include "unk_0205C22C.h" -#include "unk_0205C980.h" #include "unk_0205DFC4.h" #include "unk_020655F4.h" #include "unk_02069BE0.h" @@ -483,9 +483,9 @@ static BOOL ScrCmd_145(ScriptContext *ctx); static BOOL sub_02043A4C(ScriptContext *ctx); static BOOL ScrCmd_153(ScriptContext *ctx); static BOOL ScrCmd_LoadTrainerAppearances(ScriptContext *ctx); -static BOOL ScrCmd_155(ScriptContext *ctx); -static BOOL ScrCmd_29C(ScriptContext *ctx); -static BOOL ScrCmd_156(ScriptContext *ctx); +static BOOL ScrCmd_GetTrainerInfoTrainerClass(ScriptContext *ctx); +static BOOL ScrCmd_CalculateTrainerInfoAppearance(ScriptContext *ctx); +static BOOL ScrCmd_SetTrainerInfoAppearance(ScriptContext *ctx); static BOOL ScrCmd_2BA(ScriptContext *ctx); static BOOL ScrCmd_BlackOutFromBattle2(ScriptContext *ctx); static BOOL ScrCmd_14C(ScriptContext *ctx); @@ -1108,8 +1108,8 @@ const ScrCmdFunc Unk_020EAC58[] = { ScrCmd_SetCommPlayerDir, ScrCmd_153, ScrCmd_LoadTrainerAppearances, - ScrCmd_155, - ScrCmd_156, + ScrCmd_GetTrainerInfoTrainerClass, + ScrCmd_SetTrainerInfoAppearance, ScrCmd_CheckPokedexAcquired, ScrCmd_GivePokedex, ScrCmd_CheckRunningShoesAcquired, @@ -1435,7 +1435,7 @@ const ScrCmdFunc Unk_020EAC58[] = { ScrCmd_299, ScrCmd_29A, ScrCmd_29B, - ScrCmd_29C, + ScrCmd_CalculateTrainerInfoAppearance, ScrCmd_AddMenuEntry, ScrCmd_29E, ScrCmd_29F, @@ -5287,42 +5287,42 @@ static BOOL ScrCmd_153(ScriptContext *ctx) static BOOL ScrCmd_LoadTrainerAppearances(ScriptContext *ctx) { - TrainerInfo *v0 = SaveData_GetTrainerInfo(FieldSystem_GetSaveData(ctx->fieldSystem)); - StringTemplate **v1 = FieldSystem_GetScriptMemberPtr(ctx->fieldSystem, SCRIPT_MANAGER_STR_TEMPLATE); + TrainerInfo *trainerInfo = SaveData_GetTrainerInfo(FieldSystem_GetSaveData(ctx->fieldSystem)); + StringTemplate **strTemplate = FieldSystem_GetScriptMemberPtr(ctx->fieldSystem, SCRIPT_MANAGER_STR_TEMPLATE); - TrainerInfo_LoadAppearanceVariants(TrainerInfo_ID(v0), TrainerInfo_Gender(v0), *v1); + Appearance_LoadVariants(TrainerInfo_ID(trainerInfo), TrainerInfo_Gender(trainerInfo), *strTemplate); return FALSE; } -static BOOL ScrCmd_155(ScriptContext *ctx) +static BOOL ScrCmd_GetTrainerInfoTrainerClass(ScriptContext *ctx) { - TrainerInfo *v0 = SaveData_GetTrainerInfo(FieldSystem_GetSaveData(ctx->fieldSystem)); - u16 v1 = ScriptContext_GetVar(ctx); - u16 *v2 = ScriptContext_GetVarPointer(ctx); + TrainerInfo *trainerInfo = SaveData_GetTrainerInfo(FieldSystem_GetSaveData(ctx->fieldSystem)); + u16 variant = ScriptContext_GetVar(ctx); + u16 *destVar = ScriptContext_GetVarPointer(ctx); - *v2 = TrainerInfo_GetAppearanceIndex(TrainerInfo_ID(v0), TrainerInfo_Gender(v0), v1); - *v2 = sub_0205CA14(TrainerInfo_Gender(v0), *v2, 2); + *destVar = Appearance_CalculateFromTrainerInfo(TrainerInfo_ID(trainerInfo), TrainerInfo_Gender(trainerInfo), variant); + *destVar = Appearance_GetData(TrainerInfo_Gender(trainerInfo), *destVar, APPEARANCE_DATA_TRAINER_CLASS_1); return FALSE; } -static BOOL ScrCmd_29C(ScriptContext *ctx) +static BOOL ScrCmd_CalculateTrainerInfoAppearance(ScriptContext *ctx) { - TrainerInfo *v0 = SaveData_GetTrainerInfo(FieldSystem_GetSaveData(ctx->fieldSystem)); - u16 v1 = ScriptContext_GetVar(ctx); - u16 *v2 = ScriptContext_GetVarPointer(ctx); + TrainerInfo *trainerInfo = SaveData_GetTrainerInfo(FieldSystem_GetSaveData(ctx->fieldSystem)); + u16 variant = ScriptContext_GetVar(ctx); + u16 *destVar = ScriptContext_GetVarPointer(ctx); - *v2 = TrainerInfo_GetAppearanceIndex(TrainerInfo_ID(v0), TrainerInfo_Gender(v0), v1); + *destVar = Appearance_CalculateFromTrainerInfo(TrainerInfo_ID(trainerInfo), TrainerInfo_Gender(trainerInfo), variant); return FALSE; } -static BOOL ScrCmd_156(ScriptContext *ctx) +static BOOL ScrCmd_SetTrainerInfoAppearance(ScriptContext *ctx) { - TrainerInfo *v0 = SaveData_GetTrainerInfo(FieldSystem_GetSaveData(ctx->fieldSystem)); - u16 v1 = ScriptContext_GetVar(ctx); + TrainerInfo *trainerInfo = SaveData_GetTrainerInfo(FieldSystem_GetSaveData(ctx->fieldSystem)); + u16 appearance = ScriptContext_GetVar(ctx); - TrainerInfo_SetAppearance(v0, v1); + TrainerInfo_SetAppearance(trainerInfo, appearance); return FALSE; } diff --git a/src/scrcmd_strings.c b/src/scrcmd_strings.c index 4212677a97..8c96f28af5 100644 --- a/src/scrcmd_strings.c +++ b/src/scrcmd_strings.c @@ -11,6 +11,7 @@ #include "field/field_system.h" #include "savedata/save_table.h" +#include "appearance.h" #include "berry_data.h" #include "field_script_context.h" #include "field_system.h" @@ -29,7 +30,6 @@ #include "string_template.h" #include "system_vars.h" #include "trainer_info.h" -#include "unk_0205C980.h" #include "unk_0205DFC4.h" #include "vars_flags.h" @@ -247,7 +247,7 @@ BOOL ScrCmd_BufferTrainerClassFromAppearance(ScriptContext *ctx) StringTemplate **strTemplate = FieldSystem_GetScriptMemberPtr(fieldSystem, SCRIPT_MANAGER_STR_TEMPLATE); u8 templateArg = ScriptContext_ReadByte(ctx); - int trainerClass = sub_0205CA14(TrainerInfo_Gender(trainerInfo), TrainerInfo_Appearance(trainerInfo), 2); + int trainerClass = Appearance_GetData(TrainerInfo_Gender(trainerInfo), TrainerInfo_Appearance(trainerInfo), APPEARANCE_DATA_TRAINER_CLASS_1); StringTemplate_SetTrainerClassNameWithArticle(*strTemplate, templateArg, trainerClass); return FALSE; diff --git a/src/unk_02030A80.c b/src/unk_02030A80.c index 784084454f..86563d0629 100644 --- a/src/unk_02030A80.c +++ b/src/unk_02030A80.c @@ -8,6 +8,7 @@ #include "struct_defs/struct_02030A80.h" #include "struct_defs/wi_fi_history.h" +#include "appearance.h" #include "charcode_util.h" #include "heap.h" #include "pokemon.h" @@ -20,7 +21,6 @@ #include "unk_02014A84.h" #include "unk_02014D38.h" #include "unk_0202C858.h" -#include "unk_0205C980.h" #include "unk_020996D0.h" UnkStruct_02030A80 *sub_02030A80(enum HeapID heapID) @@ -67,7 +67,7 @@ void sub_02030AA0(UnkStruct_02030A80 *param0, SaveData *saveData) MiscSaveBlock_IntroMsg(v3, ¶m0->unk_20_val1); param0->unk_15 = v8.birthday.month; - param0->unk_16 = sub_0205CA14(TrainerInfo_Gender(v0), TrainerInfo_Appearance(v0), 0); + param0->unk_16 = Appearance_GetData(TrainerInfo_Gender(v0), TrainerInfo_Appearance(v0), APPEARANCE_DATA_INDEX); param0->unk_19 = GAME_VERSION; param0->language = GAME_LANGUAGE; param0->unk_7C.unk_00 = SaveData_CalculateChecksum(saveData, param0, sizeof(UnkStruct_02030A80) - (sizeof(UnkStruct_0202F298_sub1))); diff --git a/src/unk_0205B33C.c b/src/unk_0205B33C.c index 7a923746aa..9ffb0f4128 100644 --- a/src/unk_0205B33C.c +++ b/src/unk_0205B33C.c @@ -12,6 +12,7 @@ #include "field/field_system.h" #include "global/pm_version.h" +#include "appearance.h" #include "communication_information.h" #include "communication_system.h" #include "field_system.h" @@ -32,7 +33,6 @@ #include "unk_02014D38.h" #include "unk_02033200.h" #include "unk_020366A0.h" -#include "unk_0205C980.h" #include "unk_02095E98.h" #include "unk_02099500.h" @@ -1216,7 +1216,7 @@ int sub_0205BF44(UnkStruct_0205B43C *param0, StringTemplate *param1) int v4 = TrainerInfo_Appearance(param0->unk_08); int v5 = TrainerInfo_Gender(param0->unk_08); - StringTemplate_SetTrainerClassName(param1, 0, sub_0205CA14(v5, v4, 2)); + StringTemplate_SetTrainerClassName(param1, 0, Appearance_GetData(v5, v4, APPEARANCE_DATA_TRAINER_CLASS_1)); return 168; } @@ -1373,7 +1373,7 @@ void *sub_0205C17C(UnkStruct_0205B43C *param0) param0->unk_188[0] = TrainerCard_New(HEAP_ID_SYSTEM); param0->unk_188[1] = TrainerCard_New(HEAP_ID_SYSTEM); - TrainerCard_Init(FALSE, FALSE, 0, sub_0205CA14(TrainerInfo_Gender(param0->unk_08), TrainerInfo_Appearance(param0->unk_08), 0), param0->fieldSystem, param0->unk_184); + TrainerCard_Init(FALSE, FALSE, 0, Appearance_GetData(TrainerInfo_Gender(param0->unk_08), TrainerInfo_Appearance(param0->unk_08), 0), param0->fieldSystem, param0->unk_184); return (void *)param0->unk_188[CommSys_CurNetId() ^ 1]; } diff --git a/src/unk_0205C980.c b/src/unk_0205C980.c deleted file mode 100644 index 69fff5f5ea..0000000000 --- a/src/unk_0205C980.c +++ /dev/null @@ -1,119 +0,0 @@ -#include "unk_0205C980.h" - -#include -#include - -#include "graphics.h" -#include "heap.h" -#include "string_template.h" - -static const int TRAINER_APPEARANCES[][3] = { - // male appearances - { 0x3, 0x3C, 0x3C }, // school kid - { 0x5, 0x6, 0x6 }, // bug catcher - { 0xB, 0x18, 0x18 }, // ace trainer (male) - { 0x1f, 0x39, 0x39 }, // roughneck - { 0x32, 0x30, 0x30 }, // ruin maniac - { 0x33, 0xE, 0xE }, // black belt - { 0x3E, 0x20, 0x20 }, // rich boy - { 0x46, 0x31, 0x31 }, // psychic - - // female appearances - { 0x6, 0x3, 0x3 }, // lass - { 0x7, 0xA, 0xA }, // battle girl - { 0xD, 0x24, 0x24 }, // beauty - { 0xE, 0x19, 0x19 }, // ace trainer (female) - { 0x23, 0x55, 0x55 }, // idol - { 0x25, 0x23, 0x23 }, // socialite - { 0x2A, 0x12, 0x12 }, // cowgirl - { 0x3f, 0x21, 0x21 } // lady -}; - -static const int APPEARANCE_SHUFFLE_TABLE[][4] = { - { 0x0, 0x1, 0x2, 0x3 }, - { 0x1, 0x6, 0x7, 0x0 }, - { 0x2, 0x3, 0x4, 0x5 }, - { 0x3, 0x0, 0x5, 0x6 }, - { 0x4, 0x1, 0x2, 0x7 }, - { 0x5, 0x2, 0x7, 0x0 }, - { 0x6, 0x3, 0x4, 0x1 }, - { 0x7, 0x4, 0x5, 0x6 } -}; - -void TrainerInfo_LoadAppearanceVariants(u32 trainerId, int trainerGender, StringTemplate *stringTemplate) -{ - int v0 = trainerId % 8; - int variant; - - for (variant = 0; variant < 4; variant++) { - int appearanceIndex = APPEARANCE_SHUFFLE_TABLE[v0][variant] + 8 * trainerGender; - StringTemplate_SetTrainerClassName(stringTemplate, variant, TRAINER_APPEARANCES[appearanceIndex][1]); - } -} - -int TrainerInfo_GetAppearanceIndex(u32 trainerId, int trainerGender, u32 variant) -{ - int v0 = trainerId % 8; - int v1 = APPEARANCE_SHUFFLE_TABLE[v0][variant] + 8 * trainerGender; - - return TRAINER_APPEARANCES[v1][0]; -} - -static int sub_0205C9E0(int gender, int param1) -{ - int v0; - - for (v0 = 0; v0 < 16 / 2; v0++) { - if (TRAINER_APPEARANCES[v0 + (gender * (16 / 2))][0] == param1) { - return v0 + (gender * (16 / 2)); - } - } - - return 0; -} - -int sub_0205CA0C(int gender, int param1) -{ - return sub_0205C9E0(gender, param1); -} - -int sub_0205CA14(int gender, int param1, int param2) -{ - int v0 = sub_0205C9E0(gender, param1); - - switch (param2) { - case 0: - return v0; - break; - case 2: - return TRAINER_APPEARANCES[v0][1]; - break; - case 1: - return TRAINER_APPEARANCES[v0][2]; - break; - default: - GF_ASSERT(0); - } - - return 0; -} - -u16 *sub_0205CA4C(enum HeapID heapID) -{ - u8 *v0, *v1; - NNSG2dPaletteData *v2, *v3; - u16 *v4, *v5; - int v6; - - v0 = Graphics_GetPlttData(NARC_INDEX_GRAPHIC__RECORD, 7, &v2, heapID); - v4 = Heap_Alloc(heapID, 16 * 18 * 2); - v5 = (u16 *)v2->pRawData; - - for (v6 = 0; v6 < 16 * 16; v6++) { - v4[v6] = v5[v6]; - } - - Heap_Free(v0); - - return v4; -} diff --git a/src/unk_02073700.c b/src/unk_02073700.c index fb4b11bcc1..953da6733a 100644 --- a/src/unk_02073700.c +++ b/src/unk_02073700.c @@ -7,12 +7,12 @@ #include "overlay096/struct_ov96_0223B450_sub1.h" +#include "appearance.h" #include "save_player.h" #include "savedata.h" #include "trainer_info.h" #include "unk_0202C858.h" #include "unk_0202D05C.h" -#include "unk_0205C980.h" void sub_02073700(SaveData *saveData, int param1, UnkStruct_ov96_0223B450_sub1 *param2) { @@ -30,7 +30,7 @@ void sub_02073700(SaveData *saveData, int param1, UnkStruct_ov96_0223B450_sub1 * param2->unk_BA = (u8)WiFiHistory_GetCountry(wiFiHistory); param2->unk_BB = (u8)WiFiHistory_GetRegion(wiFiHistory); param2->unk_C8_val1_1 = TrainerInfo_Gender(v1); - param2->unk_C9 = sub_0205CA14(param2->unk_C8_val1_1, TrainerInfo_Appearance(v1), 1); + param2->unk_C9 = Appearance_GetData(param2->unk_C8_val1_1, TrainerInfo_Appearance(v1), APPEARANCE_DATA_TRAINER_CLASS_2); for (v0 = 0; v0 < 3; v0++) { MI_CpuCopy8(sub_0202D498(saveData, 0 + v0), &(param2->unk_CA[8 * v0]), 8);