Added a function to the creature renamer to save a graphics pack file to set graphics for all the generated creatures.

develop
Japa Illo 2017-02-07 15:57:35 +05:30
parent 10bbd3cb39
commit 873feaee2b
1 changed files with 121 additions and 56 deletions

@ -8,6 +8,7 @@
#include "df/creature_raw.h"
#include "df/caste_raw.h"
#include "modules/World.h"
#include "MemAccess.h"
//#include "df/world.h"
@ -25,17 +26,17 @@ DFhackCExport command_result plugin_init(color_ostream &out, std::vector <Plugin
{
commands.push_back(PluginCommand(
"list-generated",
"Prints a list of generated creature tokens. Use \"list-generated detailed\" to show descriptions.",
"Prints a list of generated creature tokens.",
list_creatures,
false, //allow non-interactive use
"Prints a list of generated creature tokens. Use \"list-generated detailed\" to show descriptions."
"Use \"list-generated detailed\" to show descriptions."
));
commands.push_back(PluginCommand(
"save-generated-raws",
"Saves a graphics raw file to use with the renamed generated creatures.",
save_generated_raw,
false, //allow non-interactive use
"Saves a graphics raw file to use with the renamed generated creatures."
"Creates graphics_procedural_creatures.txt, with a full set of creature graphics definitions for all possible generated beasts. Modify the resulting file to suit your needs."
)); return CR_OK;
}
@ -98,79 +99,85 @@ DFhackCExport command_result plugin_onstatechange(color_ostream &out, state_chan
{
if (!is_enabled)
return CR_OK;
switch (event)
if (event != DFHack::SC_WORLD_LOADED)
return CR_OK;
CoreSuspender suspend;
std::vector<int> descriptorCount = std::vector<int>(descriptors.size());
auto version = World::GetPersistentData("AlreadyRenamedCreatures");
if (version.isValid() && version.ival(1) >= RENAMER_VERSION)
{
case DFHack::SC_WORLD_LOADED:
CoreSuspender suspend;
return CR_OK;
}
std::vector<int> descriptorCount = std::vector<int>(descriptors.size());
int creatureCount = 0;
auto version = World::GetPersistentData("AlreadyRenamedCreatures");
if (version.isValid() && version.ival(1) >= RENAMER_VERSION)
{
return CR_OK;
}
for (int i = 0; i < world->raws.creatures.all.size(); i++)
{
auto creatureRaw = world->raws.creatures.all[i];
if (!creatureRaw->flags.is_set(df::enums::creature_raw_flags::GENERATED))
continue;
size_t minPos = std::string::npos;
size_t foundIndex = -1;
size_t prefixIndex = -1;
for (int i = 0; i < world->raws.creatures.all.size(); i++)
for (rsize_t j = 0; j < prefixes.size(); j++)
{
auto creatureRaw = world->raws.creatures.all[i];
if (!creatureRaw->flags.is_set(df::enums::creature_raw_flags::GENERATED))
continue;
size_t minPos = std::string::npos;
size_t foundIndex = -1;
size_t prefixIndex = -1;
for (rsize_t j = 0; j < prefixes.size(); j++)
if (creatureRaw->creature_id.compare(0, prefixes[j].length(), prefixes[j]) == 0)
{
if (creatureRaw->creature_id.compare(0, prefixes[j].length(), prefixes[j]) == 0)
{
prefixIndex = j;
}
prefixIndex = j;
}
}
if (prefixIndex < 0)
continue; //unrecognized generaed type.
if (prefixIndex < 0)
continue; //unrecognized generaed type.
for (size_t j = 0; j < descriptors.size(); j++)
for (size_t j = 0; j < descriptors.size(); j++)
{
size_t pos = creatureRaw->caste[0]->description.find(" " + descriptors[j]);
if (pos < minPos)
{
size_t pos = creatureRaw->caste[0]->description.find(" " + descriptors[j]);
if (pos < minPos)
{
minPos = pos;
foundIndex = j;
}
minPos = pos;
foundIndex = j;
}
}
if (foundIndex < 0)
continue; //can't find a match.
if (foundIndex < 0)
continue; //can't find a match.
auto descriptor = descriptors[foundIndex];
auto descriptor = descriptors[foundIndex];
for (int j = 0; j < descriptor.size(); j++)
{
if (descriptor[j] == ' ')
descriptor[j] = '_';
else
descriptor[j] = toupper(descriptor[j]);
}
for (int j = 0; j < descriptor.size(); j++)
{
if (descriptor[j] == ' ')
descriptor[j] = '_';
else
descriptor[j] = toupper(descriptor[j]);
}
auto prefix = prefixes[prefixIndex];
if (prefix[prefix.length() - 1] != '_')
prefix.append("_");
auto prefix = prefixes[prefixIndex];
if (prefix[prefix.length() - 1] != '_')
prefix.append("_");
creatureRaw->creature_id = prefixes[prefixIndex] + descriptor;
creatureRaw->creature_id = prefixes[prefixIndex] + descriptor;
if (descriptorCount[foundIndex] > 0)
{
creatureRaw->creature_id.append("_" + std::to_string(descriptorCount[foundIndex]));
}
descriptorCount[foundIndex]++;
if (descriptorCount[foundIndex] > 0)
{
creatureRaw->creature_id.append("_" + std::to_string(descriptorCount[foundIndex]));
}
version = World::AddPersistentData("AlreadyRenamedCreatures");
version.ival(1) = RENAMER_VERSION;
break;
descriptorCount[foundIndex]++;
creatureCount++;
}
version = World::AddPersistentData("AlreadyRenamedCreatures");
version.ival(1) = RENAMER_VERSION;
out << "Renamed " << creatureCount << " generated creatures to have sensible names." << endl;
return CR_OK;
}
@ -200,10 +207,68 @@ command_result list_creatures(color_ostream &out, std::vector <std::string> & pa
}
out.print("\n");
}
return CR_OK;
}
command_result save_generated_raw(color_ostream &out, std::vector <std::string> & parameters)
{
#ifdef LINUX_BUILD
std::string pathSep = "/";
#else
std::string pathSep = "\\";
#endif
int pageWidth = 16;
int pageHeight = (descriptors.size() / pageWidth) + ((descriptors.size() % pageWidth > 0) ? 1 : 0);
int tileWidth = 24;
int tileHeight = 24;
std::string fileName = "graphics_procedural_creatures";
std::string pageName = "PROCEDURAL_FRIENDLY";
int repeats = 128;
std::ofstream outputFile(fileName + ".txt", std::ios::out | std::ios::trunc);
outputFile << fileName << endl << endl;
outputFile << "[OBJECT:GRAPHICS]" << endl << endl;
outputFile << "[TILE_PAGE:" << pageName << "]" << endl;
outputFile << " [FILE:procedural_friendly.png]" << endl;
outputFile << " [TILE_DIM:" << tileWidth << ":" << tileHeight << "]" << endl;
outputFile << " [PAGE_DIM:" << pageWidth << ":" << pageHeight << "]" << endl << endl;
for (size_t descIndex = 0; descIndex < descriptors.size(); descIndex++)
{
for (size_t prefIndex = 0; prefIndex < prefixes.size(); prefIndex++)
{
for (size_t rep = 0; rep < repeats; rep++)
{
auto descriptor = descriptors[descIndex];
for (int j = 0; j < descriptor.size(); j++)
{
if (descriptor[j] == ' ')
descriptor[j] = '_';
else
descriptor[j] = toupper(descriptor[j]);
}
auto prefix = prefixes[prefIndex];
if (prefix[prefix.length() - 1] != '_')
prefix.append("_");
std::string token = prefix + descriptor;
if (rep > 0)
token.append("_" + std::to_string(rep));
outputFile << "[CREATURE_GRAPHICS:" << token << "]" << endl;
outputFile << " [DEFAULT:" << pageName << ":" << descIndex % pageWidth << ":" << descIndex / pageWidth << ":ADD_COLOR]" << endl;
}
outputFile << endl;
}
outputFile << endl;
}
outputFile.close();
return CR_OK;
}