Skip to content

Commit

Permalink
Cleanup World module to use df::global, and fix crashes when control_…
Browse files Browse the repository at this point in the history
…mode/game_mode are missing
  • Loading branch information
quietust committed May 23, 2012
1 parent 20794eb commit 9a73ea9
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 52 deletions.
11 changes: 0 additions & 11 deletions library/include/modules/World.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,16 +37,6 @@ distribution.

namespace DFHack
{
/**
* \ingroup grp_world
*/
enum WeatherType
{
CLEAR,
RAINING,
SNOWING
};
typedef unsigned char weather_map [5][5];
/**
* \ingroup grp_world
*/
Expand Down Expand Up @@ -113,7 +103,6 @@ namespace DFHack
class DFHACK_EXPORT World : public Module
{
public:
weather_map * wmap;
World();
~World();
bool Start();
Expand Down
45 changes: 13 additions & 32 deletions library/modules/World.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,15 +63,8 @@ struct World::Private
bool Inited;

bool PauseInited;
void * pause_state_offset;

bool StartedWeather;
char * weather_offset;

bool StartedMode;
void * gamemode_offset;
void * controlmode_offset;
void * controlmodecopy_offset;

int next_persistent_id;
std::multimap<std::string, int> persistent_index;
Expand All @@ -86,21 +79,14 @@ World::World()
Core & c = Core::getInstance();
d = new Private;
d->owner = c.p;
wmap = 0;

d->pause_state_offset = (void *) c.vinfo->getAddress ("pause_state");
if(d->pause_state_offset)
if(df::global::pause_state)
d->PauseInited = true;

d->weather_offset = (char *) c.vinfo->getAddress( "current_weather" );
if(d->weather_offset)
{
wmap = (weather_map *) d->weather_offset;
if(df::global::current_weather)
d->StartedWeather = true;
}
d->gamemode_offset = (void *) c.vinfo->getAddress( "game_mode" );
d->controlmode_offset = (void *) c.vinfo->getAddress( "control_mode" );
d->StartedMode = true;
if (df::global::game_mode && df::global::control_mode)
d->StartedMode = true;

d->Inited = true;
}
Expand All @@ -123,14 +109,13 @@ bool World::Finish()
bool World::ReadPauseState()
{
if(!d->PauseInited) return false;
uint8_t pauseState = d->owner->readByte (d->pause_state_offset);
return pauseState & 1;
return *df::global::pause_state;
}

void World::SetPauseState(bool paused)
{
if(!d->PauseInited) return;
d->owner->writeByte (d->pause_state_offset, paused);
if (d->PauseInited)
*df::global::pause_state = paused;
}

uint32_t World::ReadCurrentYear()
Expand All @@ -147,8 +132,8 @@ bool World::ReadGameMode(t_gamemodes& rd)
{
if(d->Inited && d->StartedMode)
{
rd.g_mode = (GameMode) d->owner->readDWord( d->controlmode_offset);
rd.g_type = (GameType) d->owner->readDWord(d->gamemode_offset);
rd.g_mode = (DFHack::GameMode)*df::global::control_mode;
rd.g_type = (DFHack::GameType)*df::global::game_mode;
return true;
}
return false;
Expand All @@ -157,8 +142,8 @@ bool World::WriteGameMode(const t_gamemodes & wr)
{
if(d->Inited && d->StartedMode)
{
d->owner->writeDWord(d->gamemode_offset,wr.g_type);
d->owner->writeDWord(d->controlmode_offset,wr.g_mode);
*df::global::control_mode = wr.g_mode;
*df::global::game_mode = wr.g_type;
return true;
}
return false;
Expand Down Expand Up @@ -199,18 +184,14 @@ uint32_t World::ReadCurrentDay()
uint8_t World::ReadCurrentWeather()
{
if (d->Inited && d->StartedWeather)
return(d->owner->readByte(d->weather_offset + 12));
return (*df::global::current_weather)[2][2];
return 0;
}

void World::SetCurrentWeather(uint8_t weather)
{
if (d->Inited && d->StartedWeather)
{
uint8_t buf[25];
memset(&buf,weather, sizeof(buf));
d->owner->write(d->weather_offset,sizeof(buf),buf);
}
memset(df::global::current_weather, weather, 25);
}

string World::ReadWorldFolder()
Expand Down
21 changes: 12 additions & 9 deletions plugins/weather.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,13 @@
#include <vector>
#include <string>
#include "modules/World.h"
#include "DataDefs.h"
#include "df/weather_type.h"

using std::vector;
using std::string;
using namespace DFHack;
using namespace df::enums;

bool locked = false;
unsigned char locked_data[25];
Expand Down Expand Up @@ -82,7 +85,7 @@ command_result weather (color_ostream &con, vector <string> & parameters)
CoreSuspender suspend;

DFHack::World * w = Core::getInstance().getWorld();
if(!w->wmap)
if(!df::global::current_weather)
{
con << "Weather support seems broken :(" << std::endl;
return CR_FAILURE;
Expand All @@ -95,19 +98,19 @@ command_result weather (color_ostream &con, vector <string> & parameters)
{
for(int x = 0; x<5;x++)
{
switch((*w->wmap)[x][y])
switch((*df::global::current_weather)[x][y])
{
case CLEAR:
case weather_type::None:
con << "C ";
break;
case RAINING:
case weather_type::Rain:
con << "R ";
break;
case SNOWING:
case weather_type::Snow:
con << "S ";
break;
default:
con << (int) (*w->wmap)[x][y] << " ";
con << (int) (*df::global::current_weather)[x][y] << " ";
break;
}
}
Expand All @@ -120,17 +123,17 @@ command_result weather (color_ostream &con, vector <string> & parameters)
if(rain)
{
con << "Here comes the rain." << std::endl;
w->SetCurrentWeather(RAINING);
w->SetCurrentWeather(weather_type::Rain);
}
if(snow)
{
con << "Snow everywhere!" << std::endl;
w->SetCurrentWeather(SNOWING);
w->SetCurrentWeather(weather_type::Snow);
}
if(clear)
{
con << "Suddenly, sunny weather!" << std::endl;
w->SetCurrentWeather(CLEAR);
w->SetCurrentWeather(weather_type::None);
}
if(val_override != -1)
{
Expand Down

0 comments on commit 9a73ea9

Please sign in to comment.