Weather plugin to mirror the weather tool.
parent
8b298f8d91
commit
367d79bcfa
@ -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;
|
||||
}
|
Loading…
Reference in New Issue