summaryrefslogtreecommitdiff
path: root/plugins/showmood.cpp
diff options
context:
space:
mode:
authorQuietust2012-01-23 16:03:29 -0600
committerQuietust2012-01-23 16:03:29 -0600
commite3f875b9a50bf3cacb4291bda49f73e07c5a19ea (patch)
treec5978c07268d2b481f45d4c3b24ff9bdb78d5c58 /plugins/showmood.cpp
parent7f23c322a231ed760d240a4ddf171ccb87f0fa2c (diff)
downloaddfhack-e3f875b9a50bf3cacb4291bda49f73e07c5a19ea.tar.gz
dfhack-e3f875b9a50bf3cacb4291bda49f73e07c5a19ea.tar.bz2
dfhack-e3f875b9a50bf3cacb4291bda49f73e07c5a19ea.tar.xz
Add "showmood" plugin, provides a detailed description of the currently
active mood (if any)
Diffstat (limited to 'plugins/showmood.cpp')
-rw-r--r--plugins/showmood.cpp263
1 files changed, 263 insertions, 0 deletions
diff --git a/plugins/showmood.cpp b/plugins/showmood.cpp
new file mode 100644
index 00000000..973869c9
--- /dev/null
+++ b/plugins/showmood.cpp
@@ -0,0 +1,263 @@
+// Show details of currently active strange mood, if any
+
+#include "Core.h"
+#include "Console.h"
+#include "Export.h"
+#include "PluginManager.h"
+#include "modules/Materials.h"
+#include "modules/Translation.h"
+
+#include "DataDefs.h"
+#include "df/world.h"
+#include "df/job.h"
+#include "df/job_item.h"
+#include "df/general_ref.h"
+#include "df/builtin_mats.h"
+#include "df/inorganic_raw.h"
+#include "df/matter_state.h"
+#include "df/unit.h"
+#include "df/building.h"
+
+using std::string;
+using std::vector;
+using namespace DFHack;
+using namespace df::enums;
+
+using df::global::world;
+
+DFhackCExport command_result df_showmood (Core * c, vector <string> & parameters)
+{
+ if (!parameters.empty())
+ return CR_WRONG_USAGE;
+
+ Translation *trans = c->getTranslation();
+ trans->Start();
+ CoreSuspender suspend(c);
+
+ bool found = false;
+ for (df::job_list_link *cur = world->job_list.next; cur != NULL; cur = cur->next)
+ {
+ df::job *job = cur->item;
+ if ((job->job_type < job_type::StrangeMoodCrafter) || (job->job_type > job_type::StrangeMoodMechanics))
+ continue;
+ found = true;
+ df::unit *unit = NULL;
+ df::building *building = NULL;
+ for (int i = 0; i < job->references.size(); i++)
+ {
+ df::general_ref *ref = job->references[i];
+ if (ref->getType() == general_ref_type::UNIT_WORKER)
+ unit = ref->getUnit();
+ if (ref->getType() == general_ref_type::BUILDING_HOLDER)
+ building = ref->getBuilding();
+ }
+ if (!unit)
+ {
+ c->con.printerr("Found strange mood not attached to any dwarf!\n");
+ continue;
+ }
+ if (unit->mood == mood_type::None)
+ {
+ c->con.printerr("Dwarf with strange mood does not have a mood type!\n");
+ continue;
+ }
+ c->con.print("%s %s is currently ", unit->name.first_name.c_str(), trans->TranslateName(&unit->name, false).c_str());
+ switch (unit->mood)
+ {
+ case mood_type::Macabre:
+ c->con.print("in a macabre mood");
+ if (job->job_type != job_type::StrangeMoodBrooding)
+ c->con.print(" (but isn't actually in a macabre mood?)");
+ break;
+
+ case mood_type::Fell:
+ c->con.print("in a fell mood");
+ if (job->job_type != job_type::StrangeMoodFell)
+ c->con.print(" (but isn't actually in a fell mood?)");
+ break;
+
+ case mood_type::Fey:
+ case mood_type::Secretive:
+ case mood_type::Possessed:
+ switch (unit->mood)
+ {
+ case mood_type::Fey:
+ c->con.print("in a fey mood");
+ break;
+ case mood_type::Secretive:
+ c->con.print("in a secretive mood");
+ break;
+ case mood_type::Possessed:
+ c->con.print("possessed");
+ break;
+ }
+ c->con.print(" with intent to ");
+ switch (job->job_type)
+ {
+ case job_type::StrangeMoodCrafter:
+ c->con.print("become a Craftsdwarf (or Engraver)");
+ break;
+ case job_type::StrangeMoodJeweller:
+ c->con.print("become a Jeweler");
+ break;
+ case job_type::StrangeMoodForge:
+ c->con.print("become a Metalworker");
+ break;
+ case job_type::StrangeMoodMagmaForge:
+ c->con.print("become a Metalworker using a Magma Forge");
+ break;
+ case job_type::StrangeMoodCarpenter:
+ c->con.print("become a Carpenter");
+ break;
+ case job_type::StrangeMoodMason:
+ c->con.print("become a Mason (or Miner)");
+ break;
+ case job_type::StrangeMoodBowyer:
+ c->con.print("become a Bowyer");
+ break;
+ case job_type::StrangeMoodTanner:
+ c->con.print("become a Leatherworker (or Tanner)");
+ break;
+ case job_type::StrangeMoodWeaver:
+ c->con.print("become a Clothier (or Weaver)");
+ break;
+ case job_type::StrangeMoodGlassmaker:
+ c->con.print("become a Glassmaker");
+ break;
+ case job_type::StrangeMoodMechanics:
+ c->con.print("become a Mechanic");
+ break;
+ case job_type::StrangeMoodBrooding:
+ c->con.print("enter a macabre mood?");
+ break;
+ case job_type::StrangeMoodFell:
+ c->con.print("enter a fell mood?");
+ break;
+ }
+ break;
+
+ default:
+ c->con.print("insane?");
+ break;
+ }
+ if (building)
+ {
+ string name;
+ building->getName(&name);
+ c->con.print(" and has claimed a %s\n", name.c_str());
+ }
+ else
+ c->con.print(" and has not yet claimed a workshop\n");
+
+ for (int i = 0; i < job->job_items.size(); i++)
+ {
+ df::job_item *item = job->job_items[i];
+ c->con.print("Item %i: ", i + 1);
+
+ MaterialInfo matinfo(item->mat_type, item->mat_index);
+
+ string mat_name = matinfo.toString();
+ if (mat_name == "NONE")
+ mat_name = "any";
+
+ switch (item->item_type)
+ {
+ case item_type::BOULDER:
+ c->con.print("%s boulder", mat_name.c_str());
+ break;
+ case item_type::BLOCKS:
+ c->con.print("%s blocks", mat_name.c_str());
+ break;
+ case item_type::WOOD:
+ c->con.print("%s logs", mat_name.c_str());
+ break;
+ case item_type::BAR:
+ if (mat_name == "rock")
+ mat_name = "metal";
+ if ((matinfo.mode == MaterialInfo::Inorganic) && (matinfo.inorganic->flags.is_set(inorganic_flags::WAFERS)))
+ c->con.print("%s wafers", mat_name.c_str());
+ else
+ c->con.print("%s bars", mat_name.c_str());
+ break;
+ case item_type::SMALLGEM:
+ c->con.print("%s cut gems", mat_name.c_str());
+ break;
+ case item_type::ROUGH:
+ if (item->mat_type == 0)
+ {
+ if (item->mat_index == -1)
+ mat_name = "any";
+ c->con.print("%s rough gems", mat_name.c_str());
+ }
+ else
+ c->con.print("raw %s", mat_name.c_str());
+ break;
+ case item_type::SKIN_TANNED:
+ c->con.print("%s leather", mat_name.c_str());
+ break;
+ case item_type::CLOTH:
+ if (mat_name == "any")
+ {
+ if (item->flags2.bits.plant)
+ mat_name = "any plant fiber";
+ else if (item->flags2.bits.silk)
+ mat_name = "any silk";
+ else if (item->flags2.bits.yarn)
+ mat_name = "any yarn";
+ }
+ c->con.print("%s cloth", mat_name.c_str());
+ break;
+ case item_type::NONE:
+ if (item->flags2.bits.body_part)
+ {
+ if (item->flags2.bits.bone)
+ c->con.print("%s bones", mat_name.c_str());
+ else if (item->flags2.bits.shell)
+ c->con.print("%s shells", mat_name.c_str());
+ else if (item->flags2.bits.horn)
+ c->con.print("%s horns", mat_name.c_str());
+ else if (item->flags2.bits.pearl)
+ c->con.print("%s pearls", mat_name.c_str());
+ else if (item->flags2.bits.ivory_tooth)
+ c->con.print("%s ivory/teeth", mat_name.c_str());
+ else
+ c->con.print("%s unknown body parts", mat_name.c_str());
+ }
+ else
+ c->con.print("indeterminate %s item", mat_name.c_str());
+ break;
+ default:
+ c->con.print("item %s:%s with flags %08x,%08x,%08x",
+ df::enums::item_type::get_key(item->item_type),
+ (item->item_subtype == -1) ? "NONE" : "???",
+ item->flags1.whole,
+ item->flags2.whole,
+ item->flags3.whole);
+ break;
+ }
+ c->con.print(", quantity %i\n", item->quantity);
+ }
+ }
+ trans->Finish();
+ if (!found)
+ c->con.print("No strange moods currently active.\n");
+
+ return CR_OK;
+}
+
+DFhackCExport const char *plugin_name ( void )
+{
+ return "showmood";
+}
+
+DFhackCExport command_result plugin_init (Core *c, std::vector<PluginCommand> &commands)
+{
+ commands.clear();
+ commands.push_back(PluginCommand("showmood", "Shows items needed for current strange mood.", df_showmood));
+ return CR_OK;
+}
+
+DFhackCExport command_result plugin_shutdown ( Core * c )
+{
+ return CR_OK;
+} \ No newline at end of file