Merge git://github.com/quietust/dfhack

Gotta get the changes that prevent DFHack from crashing.
develop
Timothy Collett 2012-05-24 15:39:11 -04:00
commit 44c3afc306
9 changed files with 54 additions and 62 deletions

@ -200,7 +200,9 @@ google/protobuf/compiler/zip_writer.cc
LIST(APPEND LIBPROTOBUF_FULL_SRCS ${LIBPROTOBUF_LITE_SRCS}) LIST(APPEND LIBPROTOBUF_FULL_SRCS ${LIBPROTOBUF_LITE_SRCS})
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -Wno-sign-compare") IF(CMAKE_COMPILER_IS_GNUCC)
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -Wno-sign-compare")
ENDIF()
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
SET(PROTOBUF_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}) SET(PROTOBUF_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR})

@ -205,6 +205,8 @@ IF(UNIX)
SET_SOURCE_FILES_PROPERTIES(DataStatics.cpp DataStaticsCtor.cpp DataStaticsFields.cpp SET_SOURCE_FILES_PROPERTIES(DataStatics.cpp DataStaticsCtor.cpp DataStaticsFields.cpp
PROPERTIES COMPILE_FLAGS "-g0 -O1") PROPERTIES COMPILE_FLAGS "-g0 -O1")
ELSE(WIN32) ELSE(WIN32)
SET_SOURCE_FILES_PROPERTIES(DataStatics.cpp DataStaticsCtor.cpp DataStaticsFields.cpp
PROPERTIES COMPILE_FLAGS "/O1 /bigobj")
ENDIF() ENDIF()

@ -37,16 +37,6 @@ distribution.
namespace DFHack namespace DFHack
{ {
/**
* \ingroup grp_world
*/
enum WeatherType
{
CLEAR,
RAINING,
SNOWING
};
typedef unsigned char weather_map [5][5];
/** /**
* \ingroup grp_world * \ingroup grp_world
*/ */
@ -113,7 +103,6 @@ namespace DFHack
class DFHACK_EXPORT World : public Module class DFHACK_EXPORT World : public Module
{ {
public: public:
weather_map * wmap;
World(); World();
~World(); ~World();
bool Start(); bool Start();

@ -998,16 +998,29 @@ bool Gui::setDesignationCoords (const int32_t x, const int32_t y, const int32_t
bool Gui::getMousePos (int32_t & x, int32_t & y) bool Gui::getMousePos (int32_t & x, int32_t & y)
{ {
x = gps->mouse_x; if (gps) {
y = gps->mouse_y; x = gps->mouse_x;
y = gps->mouse_y;
}
else {
x = -1;
y = -1;
}
return (x == -1) ? false : true; return (x == -1) ? false : true;
} }
bool Gui::getWindowSize (int32_t &width, int32_t &height) bool Gui::getWindowSize (int32_t &width, int32_t &height)
{ {
width = gps->dimx; if (gps) {
height = gps->dimy; width = gps->dimx;
return true; height = gps->dimy;
return true;
}
else {
width = 80;
height = 25;
return false;
}
} }
bool Gui::getMenuWidth(uint8_t &menu_width, uint8_t &area_map_width) bool Gui::getMenuWidth(uint8_t &menu_width, uint8_t &area_map_width)

@ -34,10 +34,12 @@ distribution.
#include "modules/Windows.h" #include "modules/Windows.h"
using namespace DFHack; using namespace DFHack;
using df::global::gps;
Windows::df_screentile *Windows::getScreenBuffer() Windows::df_screentile *Windows::getScreenBuffer()
{ {
return (df_screentile *) df::global::gps->screen; if (!gps) return NULL;
return (df_screentile *) gps->screen;
} }
Windows::df_window::df_window(int x, int y, unsigned int width, unsigned int height) Windows::df_window::df_window(int x, int y, unsigned int width, unsigned int height)
@ -79,7 +81,7 @@ bool Windows::df_window::unlock (painter * painter)
return false; return false;
} }
Windows::top_level_window::top_level_window(): df_window(0,0,df::global::gps->dimx,df::global::gps->dimy) Windows::top_level_window::top_level_window() : df_window(0,0,gps ? gps->dimx : 80,gps ? gps->dimy : 25)
{ {
buffer = 0; buffer = 0;
} }

@ -63,15 +63,8 @@ struct World::Private
bool Inited; bool Inited;
bool PauseInited; bool PauseInited;
void * pause_state_offset;
bool StartedWeather; bool StartedWeather;
char * weather_offset;
bool StartedMode; bool StartedMode;
void * gamemode_offset;
void * controlmode_offset;
void * controlmodecopy_offset;
int next_persistent_id; int next_persistent_id;
std::multimap<std::string, int> persistent_index; std::multimap<std::string, int> persistent_index;
@ -86,21 +79,14 @@ World::World()
Core & c = Core::getInstance(); Core & c = Core::getInstance();
d = new Private; d = new Private;
d->owner = c.p; d->owner = c.p;
wmap = 0;
d->pause_state_offset = (void *) c.vinfo->getAddress ("pause_state"); if(df::global::pause_state)
if(d->pause_state_offset)
d->PauseInited = true; d->PauseInited = true;
d->weather_offset = (char *) c.vinfo->getAddress( "current_weather" ); if(df::global::current_weather)
if(d->weather_offset)
{
wmap = (weather_map *) d->weather_offset;
d->StartedWeather = true; d->StartedWeather = true;
} if (df::global::game_mode && df::global::control_mode)
d->gamemode_offset = (void *) c.vinfo->getAddress( "game_mode" ); d->StartedMode = true;
d->controlmode_offset = (void *) c.vinfo->getAddress( "control_mode" );
d->StartedMode = true;
d->Inited = true; d->Inited = true;
} }
@ -123,14 +109,13 @@ bool World::Finish()
bool World::ReadPauseState() bool World::ReadPauseState()
{ {
if(!d->PauseInited) return false; if(!d->PauseInited) return false;
uint8_t pauseState = d->owner->readByte (d->pause_state_offset); return *df::global::pause_state;
return pauseState & 1;
} }
void World::SetPauseState(bool paused) void World::SetPauseState(bool paused)
{ {
if(!d->PauseInited) return; if (d->PauseInited)
d->owner->writeByte (d->pause_state_offset, paused); *df::global::pause_state = paused;
} }
uint32_t World::ReadCurrentYear() uint32_t World::ReadCurrentYear()
@ -147,8 +132,8 @@ bool World::ReadGameMode(t_gamemodes& rd)
{ {
if(d->Inited && d->StartedMode) if(d->Inited && d->StartedMode)
{ {
rd.g_mode = (GameMode) d->owner->readDWord( d->controlmode_offset); rd.g_mode = (DFHack::GameMode)*df::global::control_mode;
rd.g_type = (GameType) d->owner->readDWord(d->gamemode_offset); rd.g_type = (DFHack::GameType)*df::global::game_mode;
return true; return true;
} }
return false; return false;
@ -157,8 +142,8 @@ bool World::WriteGameMode(const t_gamemodes & wr)
{ {
if(d->Inited && d->StartedMode) if(d->Inited && d->StartedMode)
{ {
d->owner->writeDWord(d->gamemode_offset,wr.g_type); *df::global::control_mode = wr.g_mode;
d->owner->writeDWord(d->controlmode_offset,wr.g_mode); *df::global::game_mode = wr.g_type;
return true; return true;
} }
return false; return false;
@ -199,18 +184,14 @@ uint32_t World::ReadCurrentDay()
uint8_t World::ReadCurrentWeather() uint8_t World::ReadCurrentWeather()
{ {
if (d->Inited && d->StartedWeather) if (d->Inited && d->StartedWeather)
return(d->owner->readByte(d->weather_offset + 12)); return (*df::global::current_weather)[2][2];
return 0; return 0;
} }
void World::SetCurrentWeather(uint8_t weather) void World::SetCurrentWeather(uint8_t weather)
{ {
if (d->Inited && d->StartedWeather) if (d->Inited && d->StartedWeather)
{ memset(df::global::current_weather, weather, 25);
uint8_t buf[25];
memset(&buf,weather, sizeof(buf));
d->owner->write(d->weather_offset,sizeof(buf),buf);
}
} }
string World::ReadWorldFolder() string World::ReadWorldFolder()

@ -706,7 +706,7 @@ DFhackCExport command_result plugin_onupdate ( color_ostream &out )
{ {
static int step_count = 0; static int step_count = 0;
// check run conditions // check run conditions
if(!world->map.block_index || !enable_autolabor) if(!world || !world->map.block_index || !enable_autolabor)
{ {
// give up if we shouldn't be running' // give up if we shouldn't be running'
return CR_OK; return CR_OK;

@ -28,7 +28,7 @@ static int enable_fastdwarf = false;
DFhackCExport command_result plugin_onupdate ( color_ostream &out ) DFhackCExport command_result plugin_onupdate ( color_ostream &out )
{ {
// check run conditions // check run conditions
if(!world->map.block_index || !enable_fastdwarf) if(!world || !world->map.block_index || !enable_fastdwarf)
{ {
// give up if we shouldn't be running' // give up if we shouldn't be running'
return CR_OK; return CR_OK;

@ -5,10 +5,13 @@
#include <vector> #include <vector>
#include <string> #include <string>
#include "modules/World.h" #include "modules/World.h"
#include "DataDefs.h"
#include "df/weather_type.h"
using std::vector; using std::vector;
using std::string; using std::string;
using namespace DFHack; using namespace DFHack;
using namespace df::enums;
bool locked = false; bool locked = false;
unsigned char locked_data[25]; unsigned char locked_data[25];
@ -82,7 +85,7 @@ command_result weather (color_ostream &con, vector <string> & parameters)
CoreSuspender suspend; CoreSuspender suspend;
DFHack::World * w = Core::getInstance().getWorld(); DFHack::World * w = Core::getInstance().getWorld();
if(!w->wmap) if(!df::global::current_weather)
{ {
con << "Weather support seems broken :(" << std::endl; con << "Weather support seems broken :(" << std::endl;
return CR_FAILURE; return CR_FAILURE;
@ -95,19 +98,19 @@ command_result weather (color_ostream &con, vector <string> & parameters)
{ {
for(int x = 0; x<5;x++) 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 "; con << "C ";
break; break;
case RAINING: case weather_type::Rain:
con << "R "; con << "R ";
break; break;
case SNOWING: case weather_type::Snow:
con << "S "; con << "S ";
break; break;
default: default:
con << (int) (*w->wmap)[x][y] << " "; con << (int) (*df::global::current_weather)[x][y] << " ";
break; break;
} }
} }
@ -120,17 +123,17 @@ command_result weather (color_ostream &con, vector <string> & parameters)
if(rain) if(rain)
{ {
con << "Here comes the rain." << std::endl; con << "Here comes the rain." << std::endl;
w->SetCurrentWeather(RAINING); w->SetCurrentWeather(weather_type::Rain);
} }
if(snow) if(snow)
{ {
con << "Snow everywhere!" << std::endl; con << "Snow everywhere!" << std::endl;
w->SetCurrentWeather(SNOWING); w->SetCurrentWeather(weather_type::Snow);
} }
if(clear) if(clear)
{ {
con << "Suddenly, sunny weather!" << std::endl; con << "Suddenly, sunny weather!" << std::endl;
w->SetCurrentWeather(CLEAR); w->SetCurrentWeather(weather_type::None);
} }
if(val_override != -1) if(val_override != -1)
{ {