generate trainer names text bank from trainer data (#700)

This commit is contained in:
scbroede 2025-08-23 20:21:45 -04:00 committed by GitHub
parent c17821ca55
commit feb3dd49c0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 83 additions and 3746 deletions

View File

@ -39,7 +39,8 @@ species_text_bank_names = [
]
trainer_text_bank_names = [
'npc_trainer_messages.json'
'npc_trainer_messages.json',
'npc_trainer_names.json'
]
# This list will be what's used hereafter when referring to any-and-all generated banks.
@ -106,7 +107,8 @@ trainer_text_banks = custom_target('trainer_text_banks',
command: [
'mv',
'@OUTDIR@/../trainers/npc_trainer_messages.json',
'@OUTDIR@/npc_trainer_messages.json',
'@OUTDIR@/../trainers/npc_trainer_names.json',
'@OUTDIR@',
],
env: trainer_env,
depends: [ datagen_trainer_out ],

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
{
"name": "-",
"name": " -",
"class": "TRAINER_CLASS_PLAYER_MALE",
"items": [],
"ai_flags": [],

View File

@ -24,7 +24,6 @@
#include "res/text/bank/journal_entries.h"
#include "res/text/bank/location_names.h"
#include "res/text/bank/npc_trainer_names.h"
#define ROW_HEIGHT 16
#define LOCATION_EVENT_Y_OFFSET ROW_HEIGHT
@ -341,7 +340,7 @@ static void JournalPrinter_PrintTrainerEvent(JournalManager *journalManager, Win
return;
}
Strbuf *name = MessageBank_GetNewStrbufFromNARC(NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_LOCATION_NAMES, MapHeader_GetMapLabelTextID(journalEntryTrainer.mapID), LocationNames_Text_Route227);
Strbuf *name = MessageBank_GetNewStrbufFromNARC(NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_LOCATION_NAMES, MapHeader_GetMapLabelTextID(journalEntryTrainer.mapID), HEAP_ID_JOURNAL);
strLength = Strbuf_Length(name);
Strbuf_Free(name);
@ -352,7 +351,7 @@ static void JournalPrinter_PrintTrainerEvent(JournalManager *journalManager, Win
strLength += Strbuf_Length(journalManager->strbuf);
Strbuf_Free(name);
} else {
name = MessageBank_GetNewStrbufFromNARC(NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_NPC_TRAINER_NAMES, journalEntryTrainer.trainerID, pl_msg_00000618_00042);
name = MessageBank_GetNewStrbufFromNARC(NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_NPC_TRAINER_NAMES, journalEntryTrainer.trainerID, HEAP_ID_JOURNAL);
strLength += Strbuf_Length(name);
Strbuf_Free(name);
StringTemplate_SetTrainerName(journalManager->template, 1, journalEntryTrainer.trainerID);

View File

@ -197,7 +197,7 @@ static void ParseAndPackParty(const rapidjson::Document &doc, TrainerDataType mo
narc_pack_file(trpokeVFS, partyBuf, bufSize);
}
static std::string ParseMessages(const rapidjson::Document &doc, int trainerID, std::string stem, rapidjson::Value *outMessages, rapidjson::Document *out)
static std::string ParseMessages(const rapidjson::Document &doc, int trainerID, std::string stem, rapidjson::Value *outMessages, rapidjson::Document *messagesTextBank)
{
rapidjson::Value trainerMessages(rapidjson::kArrayType);
std::string ret = "";
@ -208,12 +208,11 @@ static std::string ParseMessages(const rapidjson::Document &doc, int trainerID,
ret += (char)LookupConst(type, TrainerMessageType);
ret += (char)0;
rapidjson::Value message;
message.SetObject();
std::string id = stem + type;
rapidjson::Value message(rapidjson::kObjectType);
std::string id = "NPCTrainerMessages_Text_" + stem + "_" + type;
rapidjson::Value idValue(rapidjson::kStringType);
idValue.SetString(id.c_str(), static_cast<rapidjson::SizeType>(id.length()), out->GetAllocator());
message.AddMember("id", idValue, out->GetAllocator());
idValue.SetString(id.c_str(), static_cast<rapidjson::SizeType>(id.length()), messagesTextBank->GetAllocator());
message.AddMember("id", idValue, messagesTextBank->GetAllocator());
if (member.HasMember("en_US")) {
if (member["en_US"].IsArray()) {
@ -222,26 +221,54 @@ static std::string ParseMessages(const rapidjson::Document &doc, int trainerID,
for (const auto &member2 : member["en_US"].GetArray()) {
std::string str = member2.GetString();
rapidjson::Value string(rapidjson::kStringType);
string.SetString(str.c_str(), static_cast<rapidjson::SizeType>(str.length()), out->GetAllocator());
strings.PushBack(string, out->GetAllocator());
string.SetString(str.c_str(), static_cast<rapidjson::SizeType>(str.length()), messagesTextBank->GetAllocator());
strings.PushBack(string, messagesTextBank->GetAllocator());
}
message.AddMember("en_US", strings, out->GetAllocator());
message.AddMember("en_US", strings, messagesTextBank->GetAllocator());
} else {
std::string str = member["en_US"].GetString();
rapidjson::Value string(rapidjson::kStringType);
string.SetString(str.c_str(), static_cast<rapidjson::SizeType>(str.length()), out->GetAllocator());
message.AddMember("en_US", string, out->GetAllocator());
string.SetString(str.c_str(), static_cast<rapidjson::SizeType>(str.length()), messagesTextBank->GetAllocator());
message.AddMember("en_US", string, messagesTextBank->GetAllocator());
}
} else if (member.HasMember("garbage")) {
message.AddMember("garbage", member["garbage"].GetInt(), out->GetAllocator());
message.AddMember("garbage", member["garbage"].GetInt(), messagesTextBank->GetAllocator());
}
trainerMessages.PushBack(message, out->GetAllocator());
trainerMessages.PushBack(message, messagesTextBank->GetAllocator());
}
*outMessages = trainerMessages;
return ret;
}
static std::string ParseName(const rapidjson::Document &doc, int trainerID)
{
std::string name = doc["name"].GetString();
u8 trClass = LookupConst(doc["class"].GetString(), TrainerClass);
static constexpr std::array<u8, 6> noTrNameClasses = {
TRAINER_CLASS_RIVAL,
TRAINER_CLASS_TOWER_TYCOON,
TRAINER_CLASS_HALL_MATRON,
TRAINER_CLASS_FACTORY_HEAD,
TRAINER_CLASS_ARCADE_STAR,
TRAINER_CLASS_CASTLE_VALET
};
static constexpr std::array<int, 5> noTrNameIDs = {
861,
862,
863,
864,
865
};
if (std::find(std::begin(noTrNameClasses), std::end(noTrNameClasses), trClass) == std::end(noTrNameClasses) &&
std::find(std::begin(noTrNameIDs), std::end(noTrNameIDs), trainerID) == std::end(noTrNameIDs)) {
name = "{TRNAME}" + name;
}
return name;
}
int main(int argc, char **argv)
{
if (argc == 1) {
@ -265,11 +292,14 @@ int main(int argc, char **argv)
vfs_pack_ctx *trtblofsVFS = narc_pack_start();
rapidjson::Document doc;
rapidjson::Document out(rapidjson::kObjectType);
out.AddMember("key", 6120, out.GetAllocator());
rapidjson::Document messagesTextBank(rapidjson::kObjectType);
rapidjson::Document namesTextBank(rapidjson::kObjectType);
messagesTextBank.AddMember("key", 6120, messagesTextBank.GetAllocator());
namesTextBank.AddMember("key", 55533, namesTextBank.GetAllocator());
int trainerID = 0;
int newTrainerIndex = 0;
rapidjson::Value nameMessages(rapidjson::kArrayType);
for (auto &trainerStem : trainerRegistry) {
fs::path trainerDataPath = dataRoot / (trainerStem + ".json");
std::string json = ReadWholeFile(trainerDataPath);
@ -289,7 +319,21 @@ int main(int argc, char **argv)
}
rapidjson::Value trainerMessages;
std::string trMsg = ParseMessages(doc, trainerID, trainerStem, &trainerMessages, &out);
std::string trMsg = ParseMessages(doc, trainerID, trainerStem, &trainerMessages, &messagesTextBank);
std::string trName = ParseName(doc, trainerID);
rapidjson::Value nameMessage(rapidjson::kObjectType);
std::string id = "NPCTrainerNames_Text_" + trainerStem;
rapidjson::Value idValue(rapidjson::kStringType);
idValue.SetString(id.c_str(), static_cast<rapidjson::SizeType>(id.length()), namesTextBank.GetAllocator());
nameMessage.AddMember("id", idValue, namesTextBank.GetAllocator());
rapidjson::Value string(rapidjson::kStringType);
string.SetString(trName.c_str(), static_cast<rapidjson::SizeType>(trName.length()), namesTextBank.GetAllocator());
nameMessage.AddMember("en_US", string, namesTextBank.GetAllocator());
nameMessages.PushBack(nameMessage, namesTextBank.GetAllocator());
if (trMsg.length()) {
if (trainerID < VANILLA_TRAINER_COUNT && trtblIndices[trainerID] != -1) {
@ -308,6 +352,8 @@ int main(int argc, char **argv)
trainerID++;
}
namesTextBank.AddMember("messages", nameMessages, namesTextBank.GetAllocator());
std::string str = "";
int offset = 0;
@ -320,12 +366,12 @@ int main(int argc, char **argv)
offset += length;
for (const auto &member : messagesArr[i].GetArray()) {
rapidjson::Value tmp;
tmp.CopyFrom(member, out.GetAllocator());
messages.PushBack(tmp, out.GetAllocator());
tmp.CopyFrom(member, messagesTextBank.GetAllocator());
messages.PushBack(tmp, messagesTextBank.GetAllocator());
}
}
}
out.AddMember("messages", messages, out.GetAllocator());
messagesTextBank.AddMember("messages", messages, messagesTextBank.GetAllocator());
char *chars = const_cast<char *>(str.c_str());
narc_pack_file_copy(trtblVFS, reinterpret_cast<unsigned char *>(chars), offset);
@ -336,11 +382,18 @@ int main(int argc, char **argv)
PackNarc(trtblVFS, outputRoot / "trtbl.narc");
PackNarc(trtblofsVFS, outputRoot / "trtblofs.narc");
FILE *fp = fopen((outputRoot / "npc_trainer_messages.json").string().c_str(), "w");
char writeBuffer[65536];
rapidjson::FileWriteStream os(fp, writeBuffer, sizeof(writeBuffer));
rapidjson::Writer<rapidjson::FileWriteStream> writer(os);
out.Accept(writer);
FILE *fp = fopen((outputRoot / "npc_trainer_messages.json").string().c_str(), "w");
rapidjson::FileWriteStream messagesStream(fp, writeBuffer, sizeof(writeBuffer));
rapidjson::Writer<rapidjson::FileWriteStream> messagesWriter(messagesStream);
messagesTextBank.Accept(messagesWriter);
fclose(fp);
fp = fopen((outputRoot / "npc_trainer_names.json").string().c_str(), "w");
rapidjson::FileWriteStream namesStream(fp, writeBuffer, sizeof(writeBuffer));
rapidjson::Writer<rapidjson::FileWriteStream> namesWriter(namesStream);
namesTextBank.Accept(namesWriter);
fclose(fp);
delete[] trMsgs;