pokeplatinum/src/trainer_info.c
2026-01-30 14:37:51 -07:00

234 lines
4.3 KiB
C

#include "trainer_info.h"
#include <nitro.h>
#include <string.h>
#include "constants/charcode.h"
#include "charcode_util.h"
#include "heap.h"
#include "string_gf.h"
#define MONEY_MAX 999999
int TrainerInfo_Size(void)
{
return sizeof(TrainerInfo);
}
TrainerInfo *TrainerInfo_New(enum HeapID heapID)
{
TrainerInfo *info = Heap_Alloc(heapID, sizeof(TrainerInfo));
TrainerInfo_Init(info);
return info;
}
void TrainerInfo_Copy(const TrainerInfo *src, TrainerInfo *dst)
{
MI_CpuCopy8(src, dst, sizeof(TrainerInfo));
}
void TrainerInfo_Init(TrainerInfo *info)
{
memset(info, 0, sizeof(TrainerInfo));
info->language = GAME_LANGUAGE;
TrainerInfo_SetGameCode(info, GAME_VERSION);
}
BOOL TrainerInfo_HasNoName(const TrainerInfo *info)
{
for (int i = 0; i < TRAINER_NAME_LEN + 1; i++) {
if (info->name[i] != CHAR_NONE) {
return FALSE;
}
}
return TRUE;
}
void TrainerInfo_SetName(TrainerInfo *info, const charcode_t *name)
{
int len = CharCode_Length(name);
GF_ASSERT(len < TRAINER_NAME_LEN + 1);
CharCode_Copy(info->name, name);
}
void TrainerInfo_SetNameFromString(TrainerInfo *info, const String *name)
{
String_ToChars(name, info->name, TRAINER_NAME_LEN + 1);
}
const charcode_t *TrainerInfo_Name(const TrainerInfo *info)
{
return info->name;
}
void TrainerInfo_NameString(const TrainerInfo *info, String *name)
{
String_CopyChars(name, info->name);
}
String *TrainerInfo_NameNewString(const TrainerInfo *info, enum HeapID heapID)
{
String *name = String_Init(TRAINER_NAME_LEN + 1, heapID);
TrainerInfo_NameString(info, name);
return name;
}
void TrainerInfo_SetID(TrainerInfo *info, u32 id)
{
info->id = id;
}
u32 TrainerInfo_ID(const TrainerInfo *info)
{
return info->id;
}
u16 TrainerInfo_ID_LowHalf(const TrainerInfo *info)
{
return info->id & 0xFFFF;
}
void TrainerInfo_SetGender(TrainerInfo *info, int gender)
{
info->gender = gender;
}
u32 TrainerInfo_Gender(const TrainerInfo *info)
{
return info->gender;
}
BOOL TrainerInfo_HasBadge(const TrainerInfo *info, int badge)
{
if (info->badgeMask & (1 << badge)) {
return TRUE;
} else {
return FALSE;
}
}
void TrainerInfo_SetBadge(TrainerInfo *info, int badge)
{
info->badgeMask |= (1 << badge);
}
int TrainerInfo_BadgeCount(const TrainerInfo *info)
{
int count = 0;
for (u32 mask = info->badgeMask; mask != 0; mask >>= 1) {
if (mask & 1) {
count++;
}
}
return count;
}
u32 TrainerInfo_Money(const TrainerInfo *info)
{
return info->money;
}
u32 TrainerInfo_SetMoney(TrainerInfo *info, u32 money)
{
if (money > MONEY_MAX) {
money = MONEY_MAX;
}
info->money = money;
return info->money;
}
u8 TrainerInfo_Appearance(const TrainerInfo *info)
{
return info->appearance;
}
void TrainerInfo_SetAppearance(TrainerInfo *info, u8 appearance)
{
info->appearance = appearance;
}
u32 TrainerInfo_GiveMoney(TrainerInfo *info, u32 money)
{
if (money > MONEY_MAX) {
info->money = MONEY_MAX;
} else {
info->money += money;
}
if (info->money > MONEY_MAX) {
info->money = MONEY_MAX;
}
return info->money;
}
u32 TrainerInfo_TakeMoney(TrainerInfo *info, u32 money)
{
if (info->money < money) {
info->money = 0;
} else {
info->money -= money;
}
return info->money;
}
u8 TrainerInfo_GameCode(const TrainerInfo *info)
{
return info->gameCode;
}
void TrainerInfo_SetGameCode(TrainerInfo *info, u8 gameCode)
{
info->gameCode = gameCode;
}
u8 TrainerInfo_DPGameCode(void)
{
return 0;
}
u8 TrainerInfo_Language(const TrainerInfo *info)
{
return info->language;
}
void TrainerInfo_SetLanguage(TrainerInfo *info, u8 language)
{
info->language = language;
}
void TrainerInfo_SetMainStoryCleared(TrainerInfo *info)
{
info->isMainStoryCleared = TRUE;
}
BOOL TrainerInfo_IsMainStoryCleared(TrainerInfo *info)
{
return info->isMainStoryCleared;
}
void TrainerInfo_GiveNationalDex(TrainerInfo *info)
{
info->hasNationalDex = TRUE;
}
BOOL TrainerInfo_HasNationalDex(TrainerInfo *info)
{
return info->hasNationalDex;
}
BOOL TrainerInfo_Equals(const TrainerInfo *info1, const TrainerInfo *info2)
{
return CharCode_CompareNumChars(info1->name, info2->name, TRAINER_NAME_LEN) == 0
&& info1->id == info2->id;
}