diff --git a/depends/protobuf/CMakeLists.txt b/depends/protobuf/CMakeLists.txt index dddefb06b..570c77b18 100644 --- a/depends/protobuf/CMakeLists.txt +++ b/depends/protobuf/CMakeLists.txt @@ -200,7 +200,9 @@ google/protobuf/compiler/zip_writer.cc 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}) SET(PROTOBUF_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 16954727e..bcb453a99 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -205,6 +205,8 @@ IF(UNIX) SET_SOURCE_FILES_PROPERTIES(DataStatics.cpp DataStaticsCtor.cpp DataStaticsFields.cpp PROPERTIES COMPILE_FLAGS "-g0 -O1") ELSE(WIN32) + SET_SOURCE_FILES_PROPERTIES(DataStatics.cpp DataStaticsCtor.cpp DataStaticsFields.cpp + PROPERTIES COMPILE_FLAGS "/O1 /bigobj") ENDIF() diff --git a/library/include/modules/World.h b/library/include/modules/World.h index e7b17ce41..81ebfbd60 100644 --- a/library/include/modules/World.h +++ b/library/include/modules/World.h @@ -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 */ @@ -113,7 +103,6 @@ namespace DFHack class DFHACK_EXPORT World : public Module { public: - weather_map * wmap; World(); ~World(); bool Start(); diff --git a/library/modules/Gui.cpp b/library/modules/Gui.cpp index 27ac3ddd1..e18105229 100644 --- a/library/modules/Gui.cpp +++ b/library/modules/Gui.cpp @@ -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) { - x = gps->mouse_x; - y = gps->mouse_y; + if (gps) { + x = gps->mouse_x; + y = gps->mouse_y; + } + else { + x = -1; + y = -1; + } return (x == -1) ? false : true; } bool Gui::getWindowSize (int32_t &width, int32_t &height) { - width = gps->dimx; - height = gps->dimy; - return true; + if (gps) { + width = gps->dimx; + height = gps->dimy; + return true; + } + else { + width = 80; + height = 25; + return false; + } } bool Gui::getMenuWidth(uint8_t &menu_width, uint8_t &area_map_width) diff --git a/library/modules/Windows.cpp b/library/modules/Windows.cpp index e069d964e..218b6f7e0 100644 --- a/library/modules/Windows.cpp +++ b/library/modules/Windows.cpp @@ -34,10 +34,12 @@ distribution. #include "modules/Windows.h" using namespace DFHack; +using df::global::gps; 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) @@ -79,7 +81,7 @@ bool Windows::df_window::unlock (painter * painter) 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; } diff --git a/library/modules/World.cpp b/library/modules/World.cpp index 6f6a69a59..4b50b44ca 100644 --- a/library/modules/World.cpp +++ b/library/modules/World.cpp @@ -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 persistent_index; @@ -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; } @@ -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() @@ -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; @@ -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; @@ -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() diff --git a/plugins/autolabor.cpp b/plugins/autolabor.cpp index d89ddd7c6..de1a1aef6 100644 --- a/plugins/autolabor.cpp +++ b/plugins/autolabor.cpp @@ -706,7 +706,7 @@ DFhackCExport command_result plugin_onupdate ( color_ostream &out ) { static int step_count = 0; // 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' return CR_OK; diff --git a/plugins/fastdwarf.cpp b/plugins/fastdwarf.cpp index 643a097c4..5a2e2f206 100644 --- a/plugins/fastdwarf.cpp +++ b/plugins/fastdwarf.cpp @@ -28,7 +28,7 @@ static int enable_fastdwarf = false; DFhackCExport command_result plugin_onupdate ( color_ostream &out ) { // 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' return CR_OK; diff --git a/plugins/weather.cpp b/plugins/weather.cpp index 68eb078ad..33fa45fd3 100644 --- a/plugins/weather.cpp +++ b/plugins/weather.cpp @@ -5,10 +5,13 @@ #include #include #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]; @@ -82,7 +85,7 @@ command_result weather (color_ostream &con, vector & 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; @@ -95,19 +98,19 @@ command_result weather (color_ostream &con, vector & 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; } } @@ -120,17 +123,17 @@ command_result weather (color_ostream &con, vector & 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) {