Document union room appearances (#984)

This commit is contained in:
Viperio 2026-03-08 07:04:52 +01:00 committed by GitHub
parent 007a26cc66
commit 5156a26a83
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
20 changed files with 204 additions and 193 deletions

View File

@ -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

View File

@ -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

18
include/appearance.h Normal file
View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -29,7 +29,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
@ -52,7 +52,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
@ -70,9 +70,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:

124
src/appearance.c Normal file
View File

@ -0,0 +1,124 @@
#include "appearance.h"
#include <nitro.h>
#include <string.h>
#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;
}

View File

@ -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 {

View File

@ -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));

View File

@ -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',

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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;
}

View File

@ -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;

View File

@ -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, &param0->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)));

View File

@ -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];
}

View File

@ -1,119 +0,0 @@
#include "unk_0205C980.h"
#include <nitro.h>
#include <string.h>
#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;
}

View File

@ -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);