summaryrefslogtreecommitdiff
path: root/plugins/weather.cpp
diff options
context:
space:
mode:
authorPetr Mrázek2011-07-07 10:57:57 +0200
committerPetr Mrázek2011-07-07 10:57:57 +0200
commit367d79bcfa633b0efcb238e5d7eefbb0148deccd (patch)
treea2118dd0d0459808b23b5abb4a2b937de4ac3e9b /plugins/weather.cpp
parent8b298f8d91ed97dd3651ffdb607ea43fbc19e88f (diff)
downloaddfhack-367d79bcfa633b0efcb238e5d7eefbb0148deccd.tar.gz
dfhack-367d79bcfa633b0efcb238e5d7eefbb0148deccd.tar.bz2
dfhack-367d79bcfa633b0efcb238e5d7eefbb0148deccd.tar.xz
Weather plugin to mirror the weather tool.
Diffstat (limited to 'plugins/weather.cpp')
-rw-r--r--plugins/weather.cpp131
1 files changed, 131 insertions, 0 deletions
diff --git a/plugins/weather.cpp b/plugins/weather.cpp
new file mode 100644
index 00000000..cf2833ab
--- /dev/null
+++ b/plugins/weather.cpp
@@ -0,0 +1,131 @@
+#include <dfhack/Core.h>
+#include <dfhack/Console.h>
+#include <dfhack/Export.h>
+#include <dfhack/PluginManager.h>
+#include <vector>
+#include <string>
+#include <dfhack/modules/World.h>
+
+using std::vector;
+using std::string;
+using namespace DFHack;
+
+bool locked = false;
+unsigned char locked_data[25];
+
+DFhackCExport command_result weather (Core * c, vector <string> & parameters);
+
+DFhackCExport const char * plugin_name ( void )
+{
+ return "weather";
+}
+
+DFhackCExport command_result plugin_init ( Core * c, std::vector <PluginCommand> &commands)
+{
+ commands.clear();
+ commands.push_back(PluginCommand("weather",
+ "Print the weather map or change weather.\
+\n Options: 'lock'/'unlock' = disallow game from changing weather\
+\n 'snow' = make it snow, 'rain' = make it rain.\
+\n 'clear' = clear the sky",weather));
+ return CR_OK;
+}
+
+DFhackCExport command_result plugin_shutdown ( Core * c )
+{
+ return CR_OK;
+}
+
+DFhackCExport command_result weather (Core * c, vector <string> & parameters)
+{
+ bool lock = false;
+ bool unlock = false;
+ bool snow = false;
+ bool rain = false;
+ bool clear = false;
+ for(int i = 0; i < parameters.size();i++)
+ {
+ if(parameters[i] == "rain")
+ rain = true;
+ else if(parameters[i] == "snow")
+ snow = true;
+ else if(parameters[i] == "clear")
+ clear = true;
+ else if(parameters[i] == "lock")
+ lock = true;
+ else if(parameters[i] == "unlock")
+ unlock = true;
+ }
+ if(lock && unlock)
+ {
+ dfout << "Lock or unlock? DECIDE!" << std::endl;
+ return CR_FAILURE;
+ }
+ int cnt = 0;
+ cnt += rain;
+ cnt += snow;
+ cnt += clear;
+ if(cnt > 1)
+ {
+ dfout << "Rain, snow or clear sky? DECIDE!" << std::endl;
+ return CR_FAILURE;
+ }
+ bool something = lock || unlock || rain || snow || clear;
+ c->Suspend();
+ DFHack::World * w = c->getWorld();
+ if(!w->wmap)
+ {
+ dfout << "Weather support seems broken :(" << std::endl;
+ c->Resume();
+ return CR_FAILURE;
+ }
+ if(!something)
+ {
+ // paint weather map
+ dfout << "Weather map (C = clear, R = rain, S = snow):" << std::endl;
+ for(int y = 0; y<5;y++)
+ {
+ for(int x = 0; x<5;x++)
+ {
+ switch((*w->wmap)[x][y])
+ {
+ case DFHack::CLEAR:
+ dfout << "C ";
+ break;
+ case DFHack::RAINING:
+ dfout << "R ";
+ break;
+ case DFHack::SNOWING:
+ dfout << "S ";
+ break;
+ default:
+ dfout << (int) (*w->wmap)[x][y] << " ";
+ break;
+ }
+ }
+ dfout << std::endl;
+ }
+ }
+ else
+ {
+ // weather changing action!
+ if(rain)
+ {
+ dfout << "Here comes the rain." << std::endl;
+ w->SetCurrentWeather(RAINING);
+ }
+ if(snow)
+ {
+ dfout << "Snow everywhere!" << std::endl;
+ w->SetCurrentWeather(SNOWING);
+ }
+ if(clear)
+ {
+ dfout << "Suddenly, sunny weather!" << std::endl;
+ w->SetCurrentWeather(CLEAR);
+ }
+ // FIXME: weather lock needs map ID to work reliably... needs to be implemented.
+ }
+ c->Resume();
+ return CR_OK;
+}