diff options
| author | Petr Mrázek | 2011-07-07 10:57:57 +0200 |
|---|---|---|
| committer | Petr Mrázek | 2011-07-07 10:57:57 +0200 |
| commit | 367d79bcfa633b0efcb238e5d7eefbb0148deccd (patch) | |
| tree | a2118dd0d0459808b23b5abb4a2b937de4ac3e9b /plugins/weather.cpp | |
| parent | 8b298f8d91ed97dd3651ffdb607ea43fbc19e88f (diff) | |
| download | dfhack-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.cpp | 131 |
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; +} |
