summaryrefslogtreecommitdiff
path: root/plugins/dwarfexport
diff options
context:
space:
mode:
authorPetr Mrázek2012-02-05 20:41:12 +0100
committerPetr Mrázek2012-02-05 20:41:12 +0100
commit6fe0867c46c823b791c6773657c570db7b01595f (patch)
tree7f9e010c77714fc83ef04fbc60af797dc11a2a96 /plugins/dwarfexport
parent2b22b0b33652537c1975d9d40c6be15068f8065a (diff)
downloaddfhack-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.txt31
-rw-r--r--plugins/dwarfexport/dwarfexport.cpp183
-rw-r--r--plugins/dwarfexport/dwarfexport.h1
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