diff options
| author | Petr Mrázek | 2012-02-05 20:41:12 +0100 |
|---|---|---|
| committer | Petr Mrázek | 2012-02-05 20:41:12 +0100 |
| commit | 6fe0867c46c823b791c6773657c570db7b01595f (patch) | |
| tree | 7f9e010c77714fc83ef04fbc60af797dc11a2a96 /plugins/dwarfexport | |
| parent | 2b22b0b33652537c1975d9d40c6be15068f8065a (diff) | |
| download | dfhack-6fe0867c46c823b791c6773657c570db7b01595f.tar.gz dfhack-6fe0867c46c823b791c6773657c570db7b01595f.tar.bz2 dfhack-6fe0867c46c823b791c6773657c570db7b01595f.tar.xz | |
Rename export to dwarfexport.
Diffstat (limited to 'plugins/dwarfexport')
| -rw-r--r-- | plugins/dwarfexport/CMakeLists.txt | 31 | ||||
| -rw-r--r-- | plugins/dwarfexport/dwarfexport.cpp | 183 | ||||
| -rw-r--r-- | plugins/dwarfexport/dwarfexport.h | 1 |
3 files changed, 215 insertions, 0 deletions
diff --git a/plugins/dwarfexport/CMakeLists.txt b/plugins/dwarfexport/CMakeLists.txt new file mode 100644 index 00000000..cd4a647b --- /dev/null +++ b/plugins/dwarfexport/CMakeLists.txt @@ -0,0 +1,31 @@ +PROJECT (export) +# A list of source files +SET(PROJECT_SRCS + dwarfexport.cpp +) +# A list of headers +SET(PROJECT_HDRS + dwarfexport.h +) +SET_SOURCE_FILES_PROPERTIES( ${PROJECT_HDRS} PROPERTIES HEADER_FILE_ONLY TRUE) + +# mash them together (headers are marked as headers and nothing will try to compile them) +LIST(APPEND PROJECT_SRCS ${PROJECT_HDRS}) + +#linux +IF(UNIX) + add_definitions(-DLINUX_BUILD) + SET(PROJECT_LIBS + # add any extra linux libs here + ${PROJECT_LIBS} + ) +# windows +ELSE(UNIX) + SET(PROJECT_LIBS + # add any extra linux libs here + ${PROJECT_LIBS} + $(NOINHERIT) + ) +ENDIF(UNIX) +# this makes sure all the stuff is put in proper places and linked to dfhack +DFHACK_PLUGIN(dwarfexport ${PROJECT_SRCS} LINK_LIBRARIES ${PROJECT_LIBS}) diff --git a/plugins/dwarfexport/dwarfexport.cpp b/plugins/dwarfexport/dwarfexport.cpp new file mode 100644 index 00000000..3dfd3f88 --- /dev/null +++ b/plugins/dwarfexport/dwarfexport.cpp @@ -0,0 +1,183 @@ +// some headers required for a plugin. Nothing special, just the basics. +#include <vector> +#include <string> +#include <fstream> +#include <iostream> +using namespace std; + +#define DFHACK_WANT_MISCUTILS +#include <Core.h> +#include <VersionInfo.h> +#include <Console.h> +#include <Export.h> +#include <PluginManager.h> +#include <modules/Units.h> +#include <modules/Translation.h> + +#include <df/ui.h> +#include <df/world.h> +#include <df/unit.h> +#include <df/unit_soul.h> + +using namespace DFHack; +using namespace DFHack::Simple; +using namespace DFHack::Simple; + +using df::global::ui; +using df::global::world; + +// our own, empty header. +#include "dwarfexport.h" + + +// Here go all the command declarations... +// mostly to allow having the mandatory stuff on top of the file and commands on the bottom +DFhackCExport command_result export_dwarves (Core * c, std::vector <std::string> & parameters); + +// A plugins must be able to return its name. This must correspond to the filename - export.plug.so or export.plug.dll +DFhackCExport const char * plugin_name ( void ) +{ + return "dwarfexport"; +} + +// Mandatory init function. If you have some global state, create it here. +DFhackCExport command_result plugin_init ( Core * c, std::vector <PluginCommand> &commands) +{ + // Fill the command list with your commands. + commands.clear(); + commands.push_back(PluginCommand("dwarfexport", + "Export dwarves to RuneSmith-compatible XML.", + export_dwarves /*, + true or false - true means that the command can't be used from non-interactive user interface'*/)); + return CR_OK; +} + +// This is called right before the plugin library is removed from memory. +DFhackCExport command_result plugin_shutdown ( Core * c ) +{ + return CR_OK; +} + +static const char* physicals[] = { + "Strength", + "Agility", + "Toughness", + "Endurance", + "Recuperation", + "DiseaseResistance", +}; + +static const char* mentals[] = { + "Willpower", + "Memory", + "Focus", + "Intuition", + "Patience", + "Empathy", + "SocialAwareness", + "Creatvity", //Speeling deliberate + "Musicality", + "AnalyticalAbility", + "LinguisticAbility", + "SpatialSense", + "KinaestheticSense", +}; + +static void element(const char* name, const char* content, ostream& out, const char* extra_indent="") { + out << extra_indent << " <" << name << ">" << content << "</" << name << ">" << endl; +} + +static void element(const char* name, const uint32_t content, ostream& out, const char* extra_indent="") { + out << extra_indent << " <" << name << ">" << content << "</" << name << ">" << endl; +} + +static void printAttributes(Core* c, df::unit* cre, ostream& out) { + out << " <Attributes>" << endl; + for (int i = 0; i < NUM_CREATURE_PHYSICAL_ATTRIBUTES; i++) { + element(physicals[i], cre->body.physical_attrs[i].unk1, out, " "); + } + + df::unit_soul * s = cre->status.current_soul; + if (s) { + for (int i = 0; i < NUM_CREATURE_MENTAL_ATTRIBUTES; i++) { + element(mentals[i], s->mental_attrs[i].unk1, out, " "); + } + } + out << " </Attributes>" << endl; +} + +static void printTraits(Core* c, df::unit* cre, ostream& out) { + out << " <Traits>" << endl; + df::unit_soul * s = cre->status.current_soul; + if (s) { + for (int i = 0; i < NUM_CREATURE_TRAITS; i++) { + out << " <Trait name='" << c->vinfo->getTraitName(i) << + "' value='" << s->traits[i] << "'>"; + string trait = c->vinfo->getTrait(i, s->traits[i]); + if (!trait.empty()) { + out << trait.c_str(); + } + out << "</Trait>" << endl; + } + } + out << " </Traits>" << endl; +} + +// GDC needs: +// Name +// Nickname +// Sex +// Attributes +// Traits +static void export_dwarf(Core* c, df::unit* cre, ostream& out) { + string info = cre->name.first_name; + info += " "; + info += Translation::TranslateName(&cre->name, false); + info[0] = toupper(info[0]); + c->con.print("Exporting %s\n", info.c_str()); + + out << " <Creature>" << endl; + element("Name", info.c_str(), out); + element("Nickname", cre->name.nickname.c_str(), out); + element("Sex", cre->sex == 0 ? "Female" : "Male", out); + printAttributes(c, cre, out); + printTraits(c, cre, out); + + out << " </Creature>" << endl; +} + +DFhackCExport command_result export_dwarves (Core * c, std::vector <std::string> & parameters) +{ + string filename; + if (parameters.size() == 1) { + filename = parameters[0]; + } else { + c->con.print("export <filename>\n"); + return CR_OK; + } + + ofstream outf(filename); + if (!outf) { + c->con.printerr("Failed to open file %s\n", filename.c_str()); + return CR_FAILURE; + } + + c->Suspend(); + + uint32_t race = ui->race_id; + uint32_t civ = ui->civ_id; + + outf << "<?xml version='1.0' encoding='ibm850'?>" << endl << "<Creatures>" << endl; + + for (int i = 0; i < world->units.all.size(); ++i) + { + df::unit* cre = world->units.all[i]; + if (cre->race == race && cre->civ_id == civ) { + export_dwarf(c, cre, outf); + } + } + outf << "</Creatures>" << endl; + + c->Resume(); + return CR_OK; +} diff --git a/plugins/dwarfexport/dwarfexport.h b/plugins/dwarfexport/dwarfexport.h new file mode 100644 index 00000000..7b9637ef --- /dev/null +++ b/plugins/dwarfexport/dwarfexport.h @@ -0,0 +1 @@ +#pragma once
\ No newline at end of file |
