diff --git a/library/include/dfhack/modules/World.h b/library/include/dfhack/modules/World.h index d15a87d39..c33ffed6b 100644 --- a/library/include/dfhack/modules/World.h +++ b/library/include/dfhack/modules/World.h @@ -46,7 +46,7 @@ namespace DFHack RAINING, SNOWING }; - + typedef unsigned char weather_map [5][5]; /** * \ingroup grp_world */ @@ -88,7 +88,7 @@ namespace DFHack class DFHACK_EXPORT World : public Module { public: - + weather_map * wmap; World(); ~World(); bool Start(); diff --git a/library/modules/World.cpp b/library/modules/World.cpp index 5c23440fc..042864261 100644 --- a/library/modules/World.cpp +++ b/library/modules/World.cpp @@ -75,6 +75,7 @@ World::World() Core & c = Core::getInstance(); d = new Private; d->owner = c.p; + wmap = 0; OffsetGroup * OG_World = c.vinfo->getGroup("World"); try @@ -94,6 +95,7 @@ World::World() try { d->weather_offset = OG_World->getAddress( "current_weather" ); + wmap = (weather_map *) d->weather_offset; d->StartedWeather = true; } catch(Error::All &){}; diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 42f60d724..89c591ba4 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -28,3 +28,4 @@ DFHACK_PLUGIN(reveal reveal.cpp) DFHACK_PLUGIN(kittens kittens.cpp) DFHACK_PLUGIN(prospector prospector.cpp) DFHACK_PLUGIN(cleanmap cleanmap.cpp) +DFHACK_PLUGIN(weather weather.cpp) diff --git a/plugins/cleanmap.cpp b/plugins/cleanmap.cpp index 45c5f9af5..ce52d9e71 100644 --- a/plugins/cleanmap.cpp +++ b/plugins/cleanmap.cpp @@ -11,9 +11,6 @@ using std::vector; using std::string; using namespace DFHack; -const uint32_t water_idx = 6; -const uint32_t mud_idx = 12; - DFhackCExport command_result cleanmap (Core * c, vector & parameters); DFhackCExport const char * plugin_name ( void ) @@ -35,6 +32,9 @@ DFhackCExport command_result plugin_shutdown ( Core * c ) DFhackCExport command_result cleanmap (Core * c, vector & parameters) { + const uint32_t water_idx = 6; + const uint32_t mud_idx = 12; + bool snow = false; bool mud = false; for(int i = 0; i < parameters.size();i++) @@ -57,8 +57,6 @@ DFhackCExport command_result cleanmap (Core * c, vector & parameters) uint32_t x_max,y_max,z_max; Mapz->getSize(x_max,y_max,z_max); - uint8_t zeroes [16][16] = {{0}}; - DFHack::occupancies40d occ; // walk the map for(uint32_t x = 0; x< x_max;x++) { diff --git a/plugins/weather.cpp b/plugins/weather.cpp new file mode 100644 index 000000000..cf2833ab4 --- /dev/null +++ b/plugins/weather.cpp @@ -0,0 +1,131 @@ +#include +#include +#include +#include +#include +#include +#include + +using std::vector; +using std::string; +using namespace DFHack; + +bool locked = false; +unsigned char locked_data[25]; + +DFhackCExport command_result weather (Core * c, vector & parameters); + +DFhackCExport const char * plugin_name ( void ) +{ + return "weather"; +} + +DFhackCExport command_result plugin_init ( Core * c, std::vector &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 & 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; +}