summaryrefslogtreecommitdiff
path: root/plugins/reveal.cpp
diff options
context:
space:
mode:
authorPetr Mrázek2011-06-20 04:29:38 +0200
committerPetr Mrázek2011-06-20 04:29:38 +0200
commitc6dc4900d2c3032ef282d5e8bc4219ece375e447 (patch)
treec50cd841d4a16e595e00d1f0f68a13fabc6082c6 /plugins/reveal.cpp
parentffd2ca328150bc6ae73310b65264426d8de24896 (diff)
downloaddfhack-c6dc4900d2c3032ef282d5e8bc4219ece375e447.tar.gz
dfhack-c6dc4900d2c3032ef282d5e8bc4219ece375e447.tar.bz2
dfhack-c6dc4900d2c3032ef282d5e8bc4219ece375e447.tar.xz
Very basic plugin system.
Diffstat (limited to 'plugins/reveal.cpp')
-rw-r--r--plugins/reveal.cpp95
1 files changed, 95 insertions, 0 deletions
diff --git a/plugins/reveal.cpp b/plugins/reveal.cpp
new file mode 100644
index 00000000..69e60fbe
--- /dev/null
+++ b/plugins/reveal.cpp
@@ -0,0 +1,95 @@
+#include <stdint.h>
+#include <iostream>
+#include <map>
+#include <vector>
+#include <dfhack/Core.h>
+#include <dfhack/Export.h>
+#include <dfhack/modules/Maps.h>
+#include <dfhack/modules/World.h>
+
+DFhackCExport const char * plugin_name ( void )
+{
+ return "reveal";
+}
+
+struct hideblock
+{
+ uint32_t x;
+ uint32_t y;
+ uint32_t z;
+ uint8_t hiddens [16][16];
+};
+
+DFhackCExport int plugin_run (DFHack::Core * c)
+{
+ c->Suspend();
+ DFHack::Maps *Maps =c->getMaps();
+ DFHack::World *World =c->getWorld();
+
+ // init the map
+ if(!Maps->Start())
+ {
+ std::cerr << "Can't init map." << std::endl;
+ c->Resume();
+ return 1;
+ }
+
+ std::cout << "Revealing, please wait..." << std::endl;
+
+ uint32_t x_max, y_max, z_max;
+ DFHack::designations40d designations;
+ Maps->getSize(x_max,y_max,z_max);
+ std::vector <hideblock> hidesaved;
+
+ for(uint32_t x = 0; x< x_max;x++)
+ {
+ for(uint32_t y = 0; y< y_max;y++)
+ {
+ for(uint32_t z = 0; z< z_max;z++)
+ {
+ if(Maps->isValidBlock(x,y,z))
+ {
+ hideblock hb;
+ hb.x = x;
+ hb.y = y;
+ hb.z = z;
+ // read block designations
+ Maps->ReadDesignations(x,y,z, &designations);
+ // change the hidden flag to 0
+ for (uint32_t i = 0; i < 16;i++) for (uint32_t j = 0; j < 16;j++)
+ {
+ hb.hiddens[i][j] = designations[i][j].bits.hidden;
+ designations[i][j].bits.hidden = 0;
+ }
+ hidesaved.push_back(hb);
+ // write the designations back
+ Maps->WriteDesignations(x,y,z, &designations);
+ }
+ }
+ }
+ }
+ World->SetPauseState(true);
+ c->Resume();
+ std::cout << "Map revealed. The game has been paused for you." << std::endl;
+ std::cout << "Unpausing can unleash the forces of hell!" << std::endl;
+ std::cout << "Saving will make this state permanent. Don't do it." << std::endl << std::endl;
+ std::cout << "Press any key to unreveal." << std::endl;
+ std::cin.ignore();
+ std::cout << "Unrevealing... please wait." << std::endl;
+ // FIXME: do some consistency checks here!
+ c->Suspend();
+ Maps = c->getMaps();
+ Maps->Start();
+ for(size_t i = 0; i < hidesaved.size();i++)
+ {
+ hideblock & hb = hidesaved[i];
+ Maps->ReadDesignations(hb.x,hb.y,hb.z, &designations);
+ for (uint32_t i = 0; i < 16;i++) for (uint32_t j = 0; j < 16;j++)
+ {
+ designations[i][j].bits.hidden = hb.hiddens[i][j];
+ }
+ Maps->WriteDesignations(hb.x,hb.y,hb.z, &designations);
+ }
+ c->Resume();
+ return 0;
+}