diff --git a/CMakeLists.txt b/CMakeLists.txt index 41c38bd44..0165d9964 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -121,7 +121,7 @@ ADD_DEFINITIONS(-DPROTOBUF_USE_DLLS) ADD_DEFINITIONS(-DLUA_BUILD_AS_DLL) if(APPLE) - add_definitions(-D_DARWIN) + add_definitions(-D_DARWIN) elseif(UNIX) add_definitions(-D_LINUX) elseif(WIN32) @@ -181,11 +181,11 @@ endif() # Packaging with CPack! IF(UNIX) - if(APPLE) - SET(CPACK_GENERATOR "ZIP") - else() - SET(CPACK_GENERATOR "TGZ") - endif() + if(APPLE) + SET(CPACK_GENERATOR "ZIP") + else() + SET(CPACK_GENERATOR "TGZ") + endif() ELSEIF(WIN32) SET(CPACK_GENERATOR "ZIP") ENDIF() diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index b141e9fa5..f67b6fe44 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -167,7 +167,7 @@ IF(UNIX) IF(BUILD_EGGY) LIST(APPEND PROJECT_SOURCES ${MAIN_SOURCES_LINUX_EGGY}) ELSEIF(APPLE) - LIST(APPEND PROJECT_SOURCES ${MAIN_SOURCES_DARWIN}) + LIST(APPEND PROJECT_SOURCES ${MAIN_SOURCES_DARWIN}) ELSE() LIST(APPEND PROJECT_SOURCES ${MAIN_SOURCES_LINUX}) ENDIF() @@ -235,7 +235,7 @@ ENDIF() IF(UNIX) SET(PROJECT_LIBS rt dl dfhack-md5 dfhack-tinyxml dfhack-tinythread) IF(APPLE) - SET(PROJECT_LIBS dl dfhack-md5 dfhack-tinyxml dfhack-tinythread) + SET(PROJECT_LIBS dl dfhack-md5 dfhack-tinyxml dfhack-tinythread) ENDIF() ELSE(WIN32) #FIXME: do we really need psapi? @@ -273,14 +273,14 @@ ENDIF() SET_TARGET_PROPERTIES(dfhack PROPERTIES DEBUG_POSTFIX "-debug" ) IF(APPLE) - SET(SDL_LIBRARY ${CMAKE_INSTALL_PREFIX}/libs/SDL.framework) - SET(CXX_LIBRARY ${CMAKE_INSTALL_PREFIX}/libs/libstdc++.6.dylib) - SET(ZIP_LIBRARY /usr/lib/libz.dylib) - TARGET_LINK_LIBRARIES(dfhack ${SDL_LIBRARY}) - TARGET_LINK_LIBRARIES(dfhack ${CXX_LIBRARY}) - TARGET_LINK_LIBRARIES(dfhack ${ZIP_LIBRARY}) - SET_TARGET_PROPERTIES(dfhack PROPERTIES VERSION 1.0.0) - SET_TARGET_PROPERTIES(dfhack PROPERTIES SOVERSION 1.0.0) + SET(SDL_LIBRARY ${CMAKE_INSTALL_PREFIX}/libs/SDL.framework) + SET(CXX_LIBRARY ${CMAKE_INSTALL_PREFIX}/libs/libstdc++.6.dylib) + SET(ZIP_LIBRARY /usr/lib/libz.dylib) + TARGET_LINK_LIBRARIES(dfhack ${SDL_LIBRARY}) + TARGET_LINK_LIBRARIES(dfhack ${CXX_LIBRARY}) + TARGET_LINK_LIBRARIES(dfhack ${ZIP_LIBRARY}) + SET_TARGET_PROPERTIES(dfhack PROPERTIES VERSION 1.0.0) + SET_TARGET_PROPERTIES(dfhack PROPERTIES SOVERSION 1.0.0) ENDIF() TARGET_LINK_LIBRARIES(dfhack protobuf-lite clsocket lua ${PROJECT_LIBS}) @@ -290,20 +290,20 @@ TARGET_LINK_LIBRARIES(dfhack-client protobuf-lite clsocket) TARGET_LINK_LIBRARIES(dfhack-run dfhack-client) if(APPLE) - add_custom_command(TARGET dfhack-run COMMAND ${dfhack_SOURCE_DIR}/package/darwin/fix-libs.sh WORKING_DIRECTORY ../ COMMENT "Fixing library dependencies...") + add_custom_command(TARGET dfhack-run COMMAND ${dfhack_SOURCE_DIR}/package/darwin/fix-libs.sh WORKING_DIRECTORY ../ COMMENT "Fixing library dependencies...") endif() IF(UNIX) - if (APPLE) - install(PROGRAMS ${dfhack_SOURCE_DIR}/package/darwin/dfhack - DESTINATION .) - install(PROGRAMS ${dfhack_SOURCE_DIR}/package/darwin/dfhack-run - DESTINATION .) + if (APPLE) + install(PROGRAMS ${dfhack_SOURCE_DIR}/package/darwin/dfhack + DESTINATION .) + install(PROGRAMS ${dfhack_SOURCE_DIR}/package/darwin/dfhack-run + DESTINATION .) else() - # On linux, copy our version of the df launch script which sets LD_PRELOAD - install(PROGRAMS ${dfhack_SOURCE_DIR}/package/linux/dfhack + # On linux, copy our version of the df launch script which sets LD_PRELOAD + install(PROGRAMS ${dfhack_SOURCE_DIR}/package/linux/dfhack DESTINATION .) - install(PROGRAMS ${dfhack_SOURCE_DIR}/package/linux/dfhack-run + install(PROGRAMS ${dfhack_SOURCE_DIR}/package/linux/dfhack-run DESTINATION .) endif() ELSE() diff --git a/library/Core.cpp b/library/Core.cpp index 26c0acbb0..fd96d5601 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -375,7 +375,7 @@ command_result Core::runCommand(color_ostream &con, const std::string &first, ve " reload PLUGIN|all - Reload a plugin or all loaded plugins.\n" ); - con.print("\nDFHack version " DFHACK_VERSION ".\n"); + con.print("\nDFHack version " DFHACK_VERSION ".\n"); } else if (parts.size() == 1) { @@ -747,13 +747,13 @@ void fIOthread(void * iodata) else if(ret) { // a proper, non-empty command was entered - fprintf(stderr,"Adding command to history\n"); + fprintf(stderr,"Adding command to history\n"); main_history.add(command); - fprintf(stderr,"Saving history\n"); + fprintf(stderr,"Saving history\n"); main_history.save("dfhack.history"); } - fprintf(stderr,"Running command\n"); + fprintf(stderr,"Running command\n"); auto rv = core->runCommand(con, command); diff --git a/library/Hooks-windows.cpp b/library/Hooks-windows.cpp index 1e6679855..c8bd22dda 100644 --- a/library/Hooks-windows.cpp +++ b/library/Hooks-windows.cpp @@ -271,39 +271,39 @@ DFhackCExport vPtr SDL_SetVideoMode(int width, int height, int bpp, uint32_t fla static int (*_SDL_UpperBlit)(DFHack::DFSDL_Surface* src, DFHack::DFSDL_Rect* srcrect, DFHack::DFSDL_Surface* dst, DFHack::DFSDL_Rect* dstrect) = 0; DFhackCExport int SDL_UpperBlit(DFHack::DFSDL_Surface* src, DFHack::DFSDL_Rect* srcrect, DFHack::DFSDL_Surface* dst, DFHack::DFSDL_Rect* dstrect) { - if ( dstrect != NULL && dstrect->h != 0 && dstrect->w != 0 ) - { - DFHack::Core & c = DFHack::Core::getInstance(); - DFHack::Graphic* g = c.getGraphic(); - DFHack::DFTileSurface* ov = g->Call(dstrect->x/dstrect->w, dstrect->y/dstrect->h); - - if ( ov != NULL ) - { - if ( ov->paintOver ) - { - _SDL_UpperBlit(src, srcrect, dst, dstrect); - } - - DFHack::DFSDL_Rect* dstrect2 = new DFHack::DFSDL_Rect; - dstrect2->x = dstrect->x; - dstrect2->y = dstrect->y; - dstrect2->w = dstrect->w; - dstrect2->h = dstrect->h; - - if ( ov->dstResize != NULL ) - { - DFHack::DFSDL_Rect* r = (DFHack::DFSDL_Rect*)ov->dstResize; - dstrect2->x += r->x; - dstrect2->y += r->y; - dstrect2->w += r->w; - dstrect2->h += r->h; - } - - int result = _SDL_UpperBlit(ov->surface, ov->rect, dst, dstrect2); - delete dstrect2; - return result; - } - } + if ( dstrect != NULL && dstrect->h != 0 && dstrect->w != 0 ) + { + DFHack::Core & c = DFHack::Core::getInstance(); + DFHack::Graphic* g = c.getGraphic(); + DFHack::DFTileSurface* ov = g->Call(dstrect->x/dstrect->w, dstrect->y/dstrect->h); + + if ( ov != NULL ) + { + if ( ov->paintOver ) + { + _SDL_UpperBlit(src, srcrect, dst, dstrect); + } + + DFHack::DFSDL_Rect* dstrect2 = new DFHack::DFSDL_Rect; + dstrect2->x = dstrect->x; + dstrect2->y = dstrect->y; + dstrect2->w = dstrect->w; + dstrect2->h = dstrect->h; + + if ( ov->dstResize != NULL ) + { + DFHack::DFSDL_Rect* r = (DFHack::DFSDL_Rect*)ov->dstResize; + dstrect2->x += r->x; + dstrect2->y += r->y; + dstrect2->w += r->w; + dstrect2->h += r->h; + } + + int result = _SDL_UpperBlit(ov->surface, ov->rect, dst, dstrect2); + delete dstrect2; + return result; + } + } return _SDL_UpperBlit(src, srcrect, dst, dstrect); } diff --git a/library/MacPool.mm b/library/MacPool.mm index 2453aca29..8f26543e9 100644 --- a/library/MacPool.mm +++ b/library/MacPool.mm @@ -9,14 +9,14 @@ NSAutoreleasePool *thePool; int create_pool() { - fprintf(stderr,"Creating autorelease pool\n"); - thePool = [[NSAutoreleasePool alloc] init]; - return 1; + fprintf(stderr,"Creating autorelease pool\n"); + thePool = [[NSAutoreleasePool alloc] init]; + return 1; } int destroy_pool() { - fprintf(stderr,"Draining and releasing autorelease pool\n"); - [thePool drain]; - [thePool release]; - return 0; + fprintf(stderr,"Draining and releasing autorelease pool\n"); + [thePool drain]; + [thePool release]; + return 0; } \ No newline at end of file diff --git a/library/Process-darwin.cpp b/library/Process-darwin.cpp index 72311e83a..2e2be277b 100644 --- a/library/Process-darwin.cpp +++ b/library/Process-darwin.cpp @@ -50,13 +50,13 @@ using namespace DFHack; Process::Process(VersionInfoFactory * known_versions) { int target_result; - + char path[1024]; char *real_path; - uint32_t size = sizeof(path); - if (_NSGetExecutablePath(path, &size) == 0) { - real_path = realpath(path, NULL); - } + uint32_t size = sizeof(path); + if (_NSGetExecutablePath(path, &size) == 0) { + real_path = realpath(path, NULL); + } identified = false; my_descriptor = 0; @@ -166,29 +166,29 @@ void Process::getMemRanges( vector & ranges ) (vm_region_info_t)&info, &info_count, &object); if (kr == KERN_SUCCESS) { if (info.reserved==1) { - address += vmsize; - continue; + address += vmsize; + continue; } Dl_info dlinfo; int dlcheck; dlcheck = dladdr((const void*)address, &dlinfo); if (dlcheck==0) { - dlinfo.dli_fname = ""; + dlinfo.dli_fname = ""; } - + t_memrange temp; - strncpy( temp.name, dlinfo.dli_fname, 1023 ); - temp.name[1023] = 0; - temp.start = (void *) address; - temp.end = (void *) (address+vmsize); - temp.read = (info.protection & VM_PROT_READ); - temp.write = (info.protection & VM_PROT_WRITE); - temp.execute = (info.protection & VM_PROT_EXECUTE); - temp.shared = info.shared; - temp.valid = true; - ranges.push_back(temp); - - fprintf(stderr, + strncpy( temp.name, dlinfo.dli_fname, 1023 ); + temp.name[1023] = 0; + temp.start = (void *) address; + temp.end = (void *) (address+vmsize); + temp.read = (info.protection & VM_PROT_READ); + temp.write = (info.protection & VM_PROT_WRITE); + temp.execute = (info.protection & VM_PROT_EXECUTE); + temp.shared = info.shared; + temp.valid = true; + ranges.push_back(temp); + + fprintf(stderr, "%08x-%08x %8uK %c%c%c/%c%c%c %11s %6s %10s uwir=%hu sub=%u dlname: %s\n", address, (address + vmsize), (vmsize >> 10), (info.protection & VM_PROT_READ) ? 'r' : '-', @@ -203,7 +203,7 @@ void Process::getMemRanges( vector & ranges ) info.user_wired_count, info.reserved, dlinfo.dli_fname); - + address += vmsize; } else if (kr != KERN_INVALID_ADDRESS) { @@ -277,15 +277,15 @@ uint32_t Process::getTickCount() string Process::getPath() { - char path[1024]; + char path[1024]; char *real_path; - uint32_t size = sizeof(path); - if (_NSGetExecutablePath(path, &size) == 0) { - real_path = realpath(path, NULL); - } - std::string path_string(real_path); - int last_slash = path_string.find_last_of("/"); - std::string directory = path_string.substr(0,last_slash); + uint32_t size = sizeof(path); + if (_NSGetExecutablePath(path, &size) == 0) { + real_path = realpath(path, NULL); + } + std::string path_string(real_path); + int last_slash = path_string.find_last_of("/"); + std::string directory = path_string.substr(0,last_slash); return directory; } diff --git a/library/include/Console.h b/library/include/Console.h index 8d848135a..2f2f68cfa 100644 --- a/library/include/Console.h +++ b/library/include/Console.h @@ -65,20 +65,20 @@ namespace DFHack bool save (const char * filename) { std::ofstream outfile (filename); - //fprintf(stderr,"Save: Initialized stream\n"); + //fprintf(stderr,"Save: Initialized stream\n"); if(outfile.bad()) return false; - //fprintf(stderr,"Save: Iterating...\n"); + //fprintf(stderr,"Save: Iterating...\n"); for(auto iter = history.begin();iter < history.end(); iter++) { - //fprintf(stderr,"Save: Dumping %s\n",(*iter).c_str()); + //fprintf(stderr,"Save: Dumping %s\n",(*iter).c_str()); outfile << *iter << std::endl; - //fprintf(stderr,"Save: Flushing\n"); - outfile.flush(); + //fprintf(stderr,"Save: Flushing\n"); + outfile.flush(); } - //fprintf(stderr,"Save: Closing\n"); + //fprintf(stderr,"Save: Closing\n"); outfile.close(); - //fprintf(stderr,"Save: Done\n"); + //fprintf(stderr,"Save: Done\n"); return true; } /// add a command to the history diff --git a/library/include/DataDefs.h b/library/include/DataDefs.h index 32ffabc32..3591be045 100644 --- a/library/include/DataDefs.h +++ b/library/include/DataDefs.h @@ -35,7 +35,7 @@ distribution. // Stop some MS stupidity #ifdef interface - #undef interface + #undef interface #endif typedef struct lua_State lua_State; diff --git a/library/include/TileTypes.h b/library/include/TileTypes.h index 48c10146a..f46cf2f2c 100644 --- a/library/include/TileTypes.h +++ b/library/include/TileTypes.h @@ -41,7 +41,7 @@ namespace DFHack struct { //Maybe should add 'up' and 'down' for Z-levels? - unsigned char north,south,west,east; + unsigned char north,south,west,east; }; inline TileDirection() diff --git a/library/include/modules/Graphic.h b/library/include/modules/Graphic.h index a4b2dad10..8ee9c33b0 100644 --- a/library/include/modules/Graphic.h +++ b/library/include/modules/Graphic.h @@ -36,55 +36,55 @@ distribution. namespace DFHack { - // SDL stuff - typedef signed short SINT16; - typedef struct - { - int16_t x, y; - uint16_t w, h; - } DFSDL_Rect; - typedef struct - { - uint32_t flags; - void* format; // PixelFormat* - int w, h; - int pitch; - void* pixels; - void* userdata; // as far as i could see DF doesnt use this - int locked; - void* lock_data; - DFSDL_Rect clip_rect; - void* map; - int refcount; - } DFSDL_Surface; + // SDL stuff + typedef signed short SINT16; + typedef struct + { + int16_t x, y; + uint16_t w, h; + } DFSDL_Rect; + typedef struct + { + uint32_t flags; + void* format; // PixelFormat* + int w, h; + int pitch; + void* pixels; + void* userdata; // as far as i could see DF doesnt use this + int locked; + void* lock_data; + DFSDL_Rect clip_rect; + void* map; + int refcount; + } DFSDL_Surface; - // ========= - struct DFTileSurface - { - bool paintOver; // draw over original tile? - DFSDL_Surface* surface; // from where it should be drawn - DFSDL_Rect* rect; // from which coords (NULL to draw whole surface) - DFSDL_Rect* dstResize; // if not NULL dst rect will be resized (x/y/w/h will be added to original dst) - }; + // ========= + struct DFTileSurface + { + bool paintOver; // draw over original tile? + DFSDL_Surface* surface; // from where it should be drawn + DFSDL_Rect* rect; // from which coords (NULL to draw whole surface) + DFSDL_Rect* dstResize; // if not NULL dst rect will be resized (x/y/w/h will be added to original dst) + }; - class DFHACK_EXPORT Graphic : public Module - { - public: - Graphic(); - ~Graphic(); - bool Finish() - { - return true; - } - bool Register(DFTileSurface* (*func)(int,int)); - bool Unregister(DFTileSurface* (*func)(int,int)); - DFTileSurface* Call(int x, int y); + class DFHACK_EXPORT Graphic : public Module + { + public: + Graphic(); + ~Graphic(); + bool Finish() + { + return true; + } + bool Register(DFTileSurface* (*func)(int,int)); + bool Unregister(DFTileSurface* (*func)(int,int)); + DFTileSurface* Call(int x, int y); - private: - struct Private; - Private *d; - }; + private: + struct Private; + Private *d; + }; } diff --git a/library/modules/Graphic.cpp b/library/modules/Graphic.cpp index 4188df2b8..e965bc7e1 100644 --- a/library/modules/Graphic.cpp +++ b/library/modules/Graphic.cpp @@ -48,63 +48,63 @@ Module* DFHack::createGraphic() struct Graphic::Private { - bool Started; - vector funcs; + bool Started; + vector funcs; }; Graphic::Graphic() { - d = new Private; + d = new Private; - d->Started = true; + d->Started = true; } Graphic::~Graphic() { - delete d; + delete d; } bool Graphic::Register(DFTileSurface* (*func)(int,int)) { - d->funcs.push_back(func); - return true; + d->funcs.push_back(func); + return true; } bool Graphic::Unregister(DFTileSurface* (*func)(int,int)) { - if ( d->funcs.empty() ) return false; - - vector::iterator it = d->funcs.begin(); - while ( it != d->funcs.end() ) - { - if ( *it == func ) - { - d->funcs.erase(it); - return true; - } - it++; - } - - return false; + if ( d->funcs.empty() ) return false; + + vector::iterator it = d->funcs.begin(); + while ( it != d->funcs.end() ) + { + if ( *it == func ) + { + d->funcs.erase(it); + return true; + } + it++; + } + + return false; } // This will return first DFTileSurface it can get (or NULL if theres none) DFTileSurface* Graphic::Call(int x, int y) { - if ( d->funcs.empty() ) return NULL; - - DFTileSurface* temp = NULL; - - vector::iterator it = d->funcs.begin(); - while ( it != d->funcs.end() ) - { - temp = (*it)(x,y); - if ( temp != NULL ) - { - return temp; - } - it++; - } - - return NULL; + if ( d->funcs.empty() ) return NULL; + + DFTileSurface* temp = NULL; + + vector::iterator it = d->funcs.begin(); + while ( it != d->funcs.end() ) + { + temp = (*it)(x,y); + if ( temp != NULL ) + { + return temp; + } + it++; + } + + return NULL; } \ No newline at end of file diff --git a/plugins/cleanowned.cpp b/plugins/cleanowned.cpp index cd01fd616..28314d3f0 100644 --- a/plugins/cleanowned.cpp +++ b/plugins/cleanowned.cpp @@ -117,7 +117,7 @@ command_result df_cleanowned (color_ostream &out, vector & parameters) else if (item->flags.bits.on_ground) { df::item_type type = item->getType(); - if(type == item_type::MEAT || + if(type == item_type::MEAT || type == item_type::FISH || type == item_type::VERMIN || type == item_type::PET || diff --git a/plugins/devel/memview.cpp b/plugins/devel/memview.cpp index 29b8403f8..a43e6a7bf 100644 --- a/plugins/devel/memview.cpp +++ b/plugins/devel/memview.cpp @@ -17,16 +17,16 @@ static tthread::mutex* mymutex=0; struct memory_data { - void * addr; - size_t len; - size_t refresh; - int state; - uint8_t *buf,*lbuf; - vector ranges; + void * addr; + size_t len; + size_t refresh; + int state; + uint8_t *buf,*lbuf; + vector ranges; }memdata; enum HEXVIEW_STATES { - STATE_OFF,STATE_ON + STATE_OFF,STATE_ON }; command_result memview (color_ostream &out, vector & parameters); @@ -34,151 +34,151 @@ DFHACK_PLUGIN("memview"); DFhackCExport command_result plugin_init (color_ostream &out, std::vector &commands) { - commands.push_back(PluginCommand("memview","Shows memory in real time. Params: adrr length refresh_rate. If addr==0 then stop viewing",memview)); - memdata.state=STATE_OFF; - mymutex=new tthread::mutex; + commands.push_back(PluginCommand("memview","Shows memory in real time. Params: adrr length refresh_rate. If addr==0 then stop viewing",memview)); + memdata.state=STATE_OFF; + mymutex=new tthread::mutex; return CR_OK; } size_t convert(const std::string& p,bool ishex=false) { - size_t ret; - std::stringstream conv; - if(ishex) - conv<>ret; - return ret; + size_t ret; + std::stringstream conv; + if(ishex) + conv<>ret; + return ret; } bool isAddr(uint32_t *trg,vector & ranges) { - if(trg[0]%4==0) - for(size_t i=0;i & ranges) { const size_t page_size=16; - for(size_t i=0;i31)&&(buf[j+i]<128)) //only printable ascii - con.print("%c",buf[j+i]); - else - con.print("."); - //con.print("\n"); - } - con.print("\n"); + } + if(lbuf[j+i]!=buf[j+i]) + con.print("*%02X",buf[j+i]); //if modfied show a star + else + con.print(" %02X",buf[j+i]); + } + con.reset_color(); + con.print(" | "); + for(size_t j=0;(j31)&&(buf[j+i]<128)) //only printable ascii + con.print("%c",buf[j+i]); + else + con.print("."); + //con.print("\n"); + } + con.print("\n"); } void Deinit() { - if(memdata.state==STATE_ON) - { - memdata.state=STATE_OFF; - delete [] memdata.buf; - delete [] memdata.lbuf; - } + if(memdata.state==STATE_ON) + { + memdata.state=STATE_OFF; + delete [] memdata.buf; + delete [] memdata.lbuf; + } } DFhackCExport command_result plugin_onupdate (color_ostream &out) { - mymutex->lock(); - if(memdata.state==STATE_OFF) - { - mymutex->unlock(); - return CR_OK; - } - //Console &con=out; - uint64_t time2 = GetTimeMs64(); - uint64_t delta = time2-timeLast; + mymutex->lock(); + if(memdata.state==STATE_OFF) + { + mymutex->unlock(); + return CR_OK; + } + //Console &con=out; + uint64_t time2 = GetTimeMs64(); + uint64_t delta = time2-timeLast; - if(memdata.refresh!=0) - if(deltaunlock(); - return CR_OK; - } - timeLast = time2; + if(memdata.refresh!=0) + if(deltaunlock(); + return CR_OK; + } + timeLast = time2; - Core::getInstance().p->read(memdata.addr,memdata.len,memdata.buf); - outputHex(memdata.buf,memdata.lbuf,memdata.len,(size_t)memdata.addr,out,memdata.ranges); + Core::getInstance().p->read(memdata.addr,memdata.len,memdata.buf); + outputHex(memdata.buf,memdata.lbuf,memdata.len,(size_t)memdata.addr,out,memdata.ranges); memcpy(memdata.lbuf, memdata.buf, memdata.len); - if(memdata.refresh==0) - Deinit(); - mymutex->unlock(); - return CR_OK; + if(memdata.refresh==0) + Deinit(); + mymutex->unlock(); + return CR_OK; } command_result memview (color_ostream &out, vector & parameters) { - mymutex->lock(); - Core::getInstance().p->getMemRanges(memdata.ranges); - memdata.addr=(void *)convert(parameters[0],true); - if(memdata.addr==0) - { - Deinit(); - memdata.state=STATE_OFF; - mymutex->unlock(); - return CR_OK; - } - else - { - Deinit(); - bool isValid=false; - for(size_t i=0;iunlock(); - return CR_OK; - } - memdata.state=STATE_ON; - } - if(parameters.size()>1) - memdata.len=convert(parameters[1]); - else - memdata.len=20*16; + mymutex->lock(); + Core::getInstance().p->getMemRanges(memdata.ranges); + memdata.addr=(void *)convert(parameters[0],true); + if(memdata.addr==0) + { + Deinit(); + memdata.state=STATE_OFF; + mymutex->unlock(); + return CR_OK; + } + else + { + Deinit(); + bool isValid=false; + for(size_t i=0;iunlock(); + return CR_OK; + } + memdata.state=STATE_ON; + } + if(parameters.size()>1) + memdata.len=convert(parameters[1]); + else + memdata.len=20*16; - if(parameters.size()>2) - memdata.refresh=convert(parameters[2]); - else - memdata.refresh=0; + if(parameters.size()>2) + memdata.refresh=convert(parameters[2]); + else + memdata.refresh=0; - memdata.buf=new uint8_t[memdata.len]; - memdata.lbuf=new uint8_t[memdata.len]; - Core::getInstance().p->getMemRanges(memdata.ranges); - mymutex->unlock(); - return CR_OK; + memdata.buf=new uint8_t[memdata.len]; + memdata.lbuf=new uint8_t[memdata.len]; + Core::getInstance().p->getMemRanges(memdata.ranges); + mymutex->unlock(); + return CR_OK; } DFhackCExport command_result plugin_shutdown (color_ostream &out) { - mymutex->lock(); - Deinit(); - delete mymutex; - mymutex->unlock(); - return CR_OK; + mymutex->lock(); + Deinit(); + delete mymutex; + mymutex->unlock(); + return CR_OK; } diff --git a/plugins/devel/nestboxes.cpp b/plugins/devel/nestboxes.cpp index 42c3c0660..8c51b57ae 100644 --- a/plugins/devel/nestboxes.cpp +++ b/plugins/devel/nestboxes.cpp @@ -35,32 +35,32 @@ static bool enabled = false; static void eggscan(color_ostream &out) { - CoreSuspender suspend; - - for (int i = 0; i < world->buildings.all.size(); ++i) - { - df::building *build = world->buildings.all[i]; - auto type = build->getType(); - if (df::enums::building_type::NestBox == type) - { + CoreSuspender suspend; + + for (int i = 0; i < world->buildings.all.size(); ++i) + { + df::building *build = world->buildings.all[i]; + auto type = build->getType(); + if (df::enums::building_type::NestBox == type) + { bool fertile = false; - df::building_nest_boxst *nb = virtual_cast(build); - if (nb->claimed_by != -1) + df::building_nest_boxst *nb = virtual_cast(build); + if (nb->claimed_by != -1) { df::unit* u = df::unit::find(nb->claimed_by); - if (u && u->relations.pregnancy_timer > 0) + if (u && u->relations.pregnancy_timer > 0) fertile = true; } for (int j = 1; j < nb->contained_items.size(); j++) { df::item* item = nb->contained_items[j]->item; - if (item->flags.bits.forbid != fertile) - { - item->flags.bits.forbid = fertile; - out << item->getStackSize() << " eggs " << (fertile ? "forbidden" : "unforbidden.") << endl; - } + if (item->flags.bits.forbid != fertile) + { + item->flags.bits.forbid = fertile; + out << item->getStackSize() << " eggs " << (fertile ? "forbidden" : "unforbidden.") << endl; + } } - } + } } } @@ -68,12 +68,12 @@ static void eggscan(color_ostream &out) DFhackCExport command_result plugin_init (color_ostream &out, std::vector &commands) { if (world && ui) { - commands.push_back( - PluginCommand("nestboxes", "Derp.", - nestboxes, false, - "Derp.\n" - ) - ); + commands.push_back( + PluginCommand("nestboxes", "Derp.", + nestboxes, false, + "Derp.\n" + ) + ); } return CR_OK; } @@ -92,28 +92,28 @@ DFhackCExport command_result plugin_onupdate(color_ostream &out) if ((++cnt % 5) != 0) return CR_OK; - eggscan(out); + eggscan(out); return CR_OK; } static command_result nestboxes(color_ostream &out, vector & parameters) { - CoreSuspender suspend; - bool clean = false; + CoreSuspender suspend; + bool clean = false; int dump_count = 0; int good_egg = 0; - if (parameters.size() == 1) { - if (parameters[0] == "enable") - enabled = true; - else if (parameters[0] == "disable") - enabled = false; - else - return CR_WRONG_USAGE; - } else { - out << "Plugin " << (enabled ? "enabled" : "disabled") << "." << endl; - } - return CR_OK; + if (parameters.size() == 1) { + if (parameters[0] == "enable") + enabled = true; + else if (parameters[0] == "disable") + enabled = false; + else + return CR_WRONG_USAGE; + } else { + out << "Plugin " << (enabled ? "enabled" : "disabled") << "." << endl; + } + return CR_OK; } diff --git a/plugins/devel/rprobe.cpp b/plugins/devel/rprobe.cpp index 805489d5e..9591fa8f1 100644 --- a/plugins/devel/rprobe.cpp +++ b/plugins/devel/rprobe.cpp @@ -67,10 +67,10 @@ command_result rprobe (color_ostream &out, vector & parameters) // Embark screen active: estimate using world geology data VIRTUAL_CAST_VAR(screen, df::viewscreen_choose_start_sitest, Core::getTopViewscreen()); - - if (!screen) - return CR_WRONG_USAGE; - + + if (!screen) + return CR_WRONG_USAGE; + if (!world || !world->world_data) { out.printerr("World data is not available.\n"); @@ -78,9 +78,9 @@ command_result rprobe (color_ostream &out, vector & parameters) } - if (parameters.size() == 2) + if (parameters.size() == 2) { - if (parameters[0] == "rai") + if (parameters[0] == "rai") set_field = 0; else if (parameters[0] == "veg") set_field = 1; @@ -97,7 +97,7 @@ command_result rprobe (color_ostream &out, vector & parameters) else return CR_WRONG_USAGE; - if (screen->biome_highlighted) + if (screen->biome_highlighted) to_set = screen->biome_idx; else to_set = 0; @@ -110,7 +110,7 @@ command_result rprobe (color_ostream &out, vector & parameters) coord2d cur_region = screen->region_pos; // Compute biomes - for (int i = 0; i < screen->biome_rgn.size(); i++) + for (int i = 0; i < screen->biome_rgn.size(); i++) { coord2d rg = screen->biome_rgn[i]; @@ -140,7 +140,7 @@ command_result rprobe (color_ostream &out, vector & parameters) " geo_index: " << rd->geo_index << " landmass_id: " << rd->landmass_id << " flags: " << hex << rd->flags.as_int() << dec << endl; - out << + out << "rai: " << rd->rainfall << " " << "veg: " << rd->vegetation << " " << "tem: " << rd->temperature << " " << @@ -148,17 +148,17 @@ command_result rprobe (color_ostream &out, vector & parameters) "dra: " << rd->drainage << " " << "sav: " << rd->savagery << " " << "sal: " << rd->salinity; - + int32_t *p = (int32_t *)rd; int c = sizeof(*rd) / sizeof(int32_t); for (int j = 0; j < c; j++) { - if (j % 8 == 0) + if (j % 8 == 0) out << endl << setfill('0') << setw(8) << hex << (int)(rd+j) << ": "; out << " " << setfill('0') << setw(8) << hex << p[j]; } out << setfill(' ') << setw(0) << dec << endl; } - + return CR_OK; } diff --git a/plugins/devel/stockcheck.cpp b/plugins/devel/stockcheck.cpp index 57be4b126..666db0d79 100644 --- a/plugins/devel/stockcheck.cpp +++ b/plugins/devel/stockcheck.cpp @@ -38,12 +38,12 @@ DFHACK_PLUGIN("stockcheck"); DFhackCExport command_result plugin_init (color_ostream &out, std::vector &commands) { if (world && ui) { - commands.push_back( - PluginCommand("stockcheck", "Check for unprotected rottable items.", - stockcheck, false, - "Scan world for items that are susceptible to rot. Currently just lists the items.\n" - ) - ); + commands.push_back( + PluginCommand("stockcheck", "Check for unprotected rottable items.", + stockcheck, false, + "Scan world for items that are susceptible to rot. Currently just lists the items.\n" + ) + ); } return CR_OK; } @@ -54,90 +54,90 @@ DFhackCExport command_result plugin_shutdown ( color_ostream &out ) } struct StockpileInfo { - building_stockpilest* sp; - int size; - int free; - int x1, x2, y1, y2, z; + building_stockpilest* sp; + int size; + int free; + int x1, x2, y1, y2, z; public: - StockpileInfo(building_stockpilest *sp_) : sp(sp_) - { - MapExtras::MapCache mc; - - z = sp_->z; - x1 = sp_->room.x; - x2 = sp_->room.x + sp_->room.width; - y1 = sp_->room.y; - y2 = sp_->room.y + sp_->room.height; - int e = 0; - size = 0; - free = 0; - for (int y = y1; y < y2; y++) - for (int x = x1; x < x2; x++) - if (sp_->room.extents[e++] == 1) - { - size++; - DFCoord cursor (x,y,z); - uint32_t blockX = x / 16; - uint32_t tileX = x % 16; - uint32_t blockY = y / 16; - uint32_t tileY = y % 16; - MapExtras::Block * b = mc.BlockAt(cursor/16); - if(b && b->is_valid()) - { - auto &block = *b->getRaw(); - df::tile_occupancy &occ = block.occupancy[tileX][tileY]; - if (!occ.bits.item) - free++; - } - } - } - - bool isFull() { return free == 0; } - - bool canHold(df::item *i) - { - return false; - } - - bool inStockpile(df::item *i) - { - df::item *container = Items::getContainer(i); - if (container) - return inStockpile(container); - - if (i->pos.z != z) return false; - if (i->pos.x < x1 || i->pos.x >= x2 || - i->pos.y < y1 || i->pos.y >= y2) return false; - int e = (i->pos.x - x1) + (i->pos.y - y1) * sp->room.width; - return sp->room.extents[e] == 1; - } - - int getId() { return sp->id; } + StockpileInfo(building_stockpilest *sp_) : sp(sp_) + { + MapExtras::MapCache mc; + + z = sp_->z; + x1 = sp_->room.x; + x2 = sp_->room.x + sp_->room.width; + y1 = sp_->room.y; + y2 = sp_->room.y + sp_->room.height; + int e = 0; + size = 0; + free = 0; + for (int y = y1; y < y2; y++) + for (int x = x1; x < x2; x++) + if (sp_->room.extents[e++] == 1) + { + size++; + DFCoord cursor (x,y,z); + uint32_t blockX = x / 16; + uint32_t tileX = x % 16; + uint32_t blockY = y / 16; + uint32_t tileY = y % 16; + MapExtras::Block * b = mc.BlockAt(cursor/16); + if(b && b->is_valid()) + { + auto &block = *b->getRaw(); + df::tile_occupancy &occ = block.occupancy[tileX][tileY]; + if (!occ.bits.item) + free++; + } + } + } + + bool isFull() { return free == 0; } + + bool canHold(df::item *i) + { + return false; + } + + bool inStockpile(df::item *i) + { + df::item *container = Items::getContainer(i); + if (container) + return inStockpile(container); + + if (i->pos.z != z) return false; + if (i->pos.x < x1 || i->pos.x >= x2 || + i->pos.y < y1 || i->pos.y >= y2) return false; + int e = (i->pos.x - x1) + (i->pos.y - y1) * sp->room.width; + return sp->room.extents[e] == 1; + } + + int getId() { return sp->id; } }; static command_result stockcheck(color_ostream &out, vector & parameters) { - CoreSuspender suspend; - - std::vector stockpiles; - - for (int i = 0; i < world->buildings.all.size(); ++i) - { - df::building *build = world->buildings.all[i]; - auto type = build->getType(); - if (df::enums::building_type::Stockpile == type) - { - building_stockpilest *sp = virtual_cast(build); - StockpileInfo *spi = new StockpileInfo(sp); - stockpiles.push_back(spi); - } - - } - - std::vector &items = world->items.other[items_other_id::IN_PLAY]; - - // Precompute a bitmask with the bad flags + CoreSuspender suspend; + + std::vector stockpiles; + + for (int i = 0; i < world->buildings.all.size(); ++i) + { + df::building *build = world->buildings.all[i]; + auto type = build->getType(); + if (df::enums::building_type::Stockpile == type) + { + building_stockpilest *sp = virtual_cast(build); + StockpileInfo *spi = new StockpileInfo(sp); + stockpiles.push_back(spi); + } + + } + + std::vector &items = world->items.other[items_other_id::IN_PLAY]; + + // Precompute a bitmask with the bad flags df::item_flags bad_flags; bad_flags.whole = 0; @@ -145,30 +145,30 @@ static command_result stockcheck(color_ostream &out, vector & parameter F(dump); F(forbid); F(garbage_collect); F(hostile); F(on_fire); F(rotten); F(trader); F(in_building); F(construction); F(artifact1); - F(spider_web); F(owned); F(in_job); + F(spider_web); F(owned); F(in_job); #undef F for (size_t i = 0; i < items.size(); i++) { df::item *item = items[i]; - if (item->flags.whole & bad_flags.whole) + if (item->flags.whole & bad_flags.whole) continue; - // we really only care about MEAT, FISH, FISH_RAW, PLANT, CHEESE, FOOD, and EGG + // we really only care about MEAT, FISH, FISH_RAW, PLANT, CHEESE, FOOD, and EGG - df::item_type typ = item->getType(); - if (typ != df::enums::item_type::MEAT && - typ != df::enums::item_type::FISH && - typ != df::enums::item_type::FISH_RAW && - typ != df::enums::item_type::PLANT && - typ != df::enums::item_type::CHEESE && - typ != df::enums::item_type::FOOD && - typ != df::enums::item_type::EGG) - continue; + df::item_type typ = item->getType(); + if (typ != df::enums::item_type::MEAT && + typ != df::enums::item_type::FISH && + typ != df::enums::item_type::FISH_RAW && + typ != df::enums::item_type::PLANT && + typ != df::enums::item_type::CHEESE && + typ != df::enums::item_type::FOOD && + typ != df::enums::item_type::EGG) + continue; - df::item *container = 0; - df::unit *holder = 0; - df::building *building = 0; + df::item *container = 0; + df::unit *holder = 0; + df::building *building = 0; for (size_t i = 0; i < item->general_refs.size(); i++) { @@ -177,106 +177,106 @@ static command_result stockcheck(color_ostream &out, vector & parameter switch (ref->getType()) { case general_ref_type::CONTAINED_IN_ITEM: - container = ref->getItem(); + container = ref->getItem(); break; case general_ref_type::UNIT_HOLDER: - holder = ref->getUnit(); + holder = ref->getUnit(); break; case general_ref_type::BUILDING_HOLDER: - building = ref->getBuilding(); + building = ref->getBuilding(); break; default: break; - } - } + } + } - df::item *nextcontainer = container; - df::item *lastcontainer = 0; + df::item *nextcontainer = container; + df::item *lastcontainer = 0; - while(nextcontainer) { - df::item *thiscontainer = nextcontainer; - nextcontainer = 0; - for (size_t i = 0; i < thiscontainer->general_refs.size(); i++) - { - df::general_ref *ref = thiscontainer->general_refs[i]; + while(nextcontainer) { + df::item *thiscontainer = nextcontainer; + nextcontainer = 0; + for (size_t i = 0; i < thiscontainer->general_refs.size(); i++) + { + df::general_ref *ref = thiscontainer->general_refs[i]; - switch (ref->getType()) - { - case general_ref_type::CONTAINED_IN_ITEM: - lastcontainer = nextcontainer = ref->getItem(); - break; + switch (ref->getType()) + { + case general_ref_type::CONTAINED_IN_ITEM: + lastcontainer = nextcontainer = ref->getItem(); + break; - case general_ref_type::UNIT_HOLDER: - holder = ref->getUnit(); - break; + case general_ref_type::UNIT_HOLDER: + holder = ref->getUnit(); + break; - case general_ref_type::BUILDING_HOLDER: - building = ref->getBuilding(); - break; + case general_ref_type::BUILDING_HOLDER: + building = ref->getBuilding(); + break; default: break; - } - } - } - - if (holder) - continue; // carried items do not rot as far as i know - - if (building) { - df::building_type btype = building->getType(); - if (btype == df::enums::building_type::TradeDepot || - btype == df::enums::building_type::Wagon) - continue; // items in trade depot or the embark wagon do not rot - - if (typ == df::enums::item_type::EGG && btype ==df::enums::building_type::NestBox) - continue; // eggs in nest box do not rot - } - - int canHoldCount = 0; - StockpileInfo *current = 0; - - for (int idx = 0; idx < stockpiles.size(); idx++) - { - StockpileInfo *spi = stockpiles[idx]; - if (spi->canHold(item)) canHoldCount++; - if (spi->inStockpile(item)) current=spi; - } - - if (current) - continue; - - std::string description; - item->getItemDescription(&description, 0); - out << " * " << description; + } + } + } + + if (holder) + continue; // carried items do not rot as far as i know + + if (building) { + df::building_type btype = building->getType(); + if (btype == df::enums::building_type::TradeDepot || + btype == df::enums::building_type::Wagon) + continue; // items in trade depot or the embark wagon do not rot + + if (typ == df::enums::item_type::EGG && btype ==df::enums::building_type::NestBox) + continue; // eggs in nest box do not rot + } + + int canHoldCount = 0; + StockpileInfo *current = 0; + + for (int idx = 0; idx < stockpiles.size(); idx++) + { + StockpileInfo *spi = stockpiles[idx]; + if (spi->canHold(item)) canHoldCount++; + if (spi->inStockpile(item)) current=spi; + } + + if (current) + continue; + + std::string description; + item->getItemDescription(&description, 0); + out << " * " << description; if (container) { - std::string containerDescription; - container->getItemDescription(&containerDescription, 0); - out << ", in container " << containerDescription; - if (lastcontainer) { - std::string lastcontainerDescription; - lastcontainer->getItemDescription(&lastcontainerDescription, 0); - out << ", in container " << lastcontainerDescription; - } - } - - if (holder) { - out << ", carried"; - } - - if (building) { - out << ", in building " << building->id << " (type=" << building->getType() << ")"; - } - - out << ", flags=" << std::hex << item->flags.whole << std::dec; - out << endl; - - } - - return CR_OK; + std::string containerDescription; + container->getItemDescription(&containerDescription, 0); + out << ", in container " << containerDescription; + if (lastcontainer) { + std::string lastcontainerDescription; + lastcontainer->getItemDescription(&lastcontainerDescription, 0); + out << ", in container " << lastcontainerDescription; + } + } + + if (holder) { + out << ", carried"; + } + + if (building) { + out << ", in building " << building->id << " (type=" << building->getType() << ")"; + } + + out << ", flags=" << std::hex << item->flags.whole << std::dec; + out << endl; + + } + + return CR_OK; } diff --git a/plugins/devel/stripcaged.cpp b/plugins/devel/stripcaged.cpp index a7683a9bb..30d0b0d2b 100644 --- a/plugins/devel/stripcaged.cpp +++ b/plugins/devel/stripcaged.cpp @@ -61,11 +61,11 @@ bool isContainedInItem(df::unit* unit) DFhackCExport command_result plugin_init ( color_ostream &out, std::vector &commands) { - commands.push_back(PluginCommand( - "stripcaged", "strip caged units of all items", - df_stripcaged, false, - "Clears forbid and sets dump for the inventories of all caged units." - )); + commands.push_back(PluginCommand( + "stripcaged", "strip caged units of all items", + df_stripcaged, false, + "Clears forbid and sets dump for the inventories of all caged units." + )); return CR_OK; } @@ -77,39 +77,39 @@ DFhackCExport command_result plugin_shutdown ( color_ostream &out ) command_result df_stripcaged(color_ostream &out, vector & parameters) { CoreSuspender suspend; - bool keeparmor = true; + bool keeparmor = true; - if (parameters.size() == 1 && parameters[0] == "dumparmor") - { - out << "Dumping armor too" << endl; - keeparmor = false; - } + if (parameters.size() == 1 && parameters[0] == "dumparmor") + { + out << "Dumping armor too" << endl; + keeparmor = false; + } - size_t count = 0; + size_t count = 0; for (size_t i=0; i < world->units.all.size(); i++) { df::unit* unit = world->units.all[i]; - if (isContainedInItem(unit)) - { - for (size_t j=0; j < unit->inventory.size(); j++) - { - df::unit_inventory_item* uii = unit->inventory[j]; - if (uii->item) - { - if (keeparmor && (uii->item->isArmorNotClothing() || uii->item->isClothing())) - continue; - std::string desc; - uii->item->getItemDescription(&desc,0); - out << "Item " << desc << " dumped." << endl; - uii->item->flags.bits.forbid = 0; - uii->item->flags.bits.dump = 1; - count++; - } - } - } - } + if (isContainedInItem(unit)) + { + for (size_t j=0; j < unit->inventory.size(); j++) + { + df::unit_inventory_item* uii = unit->inventory[j]; + if (uii->item) + { + if (keeparmor && (uii->item->isArmorNotClothing() || uii->item->isClothing())) + continue; + std::string desc; + uii->item->getItemDescription(&desc,0); + out << "Item " << desc << " dumped." << endl; + uii->item->flags.bits.forbid = 0; + uii->item->flags.bits.dump = 1; + count++; + } + } + } + } - out << count << " items marked for dumping" << endl; + out << count << " items marked for dumping" << endl; return CR_OK; } diff --git a/plugins/dfstream.cpp b/plugins/dfstream.cpp index 1ed906881..19334abae 100644 --- a/plugins/dfstream.cpp +++ b/plugins/dfstream.cpp @@ -323,7 +323,7 @@ public: auto_renderer_decorator & operator=(renderer_decorator *p) { reset(); this->p = p; - return *this; + return *this; } renderer_decorator * get() { diff --git a/plugins/filltraffic.cpp b/plugins/filltraffic.cpp index 6e87fd854..eeacc8781 100644 --- a/plugins/filltraffic.cpp +++ b/plugins/filltraffic.cpp @@ -1,7 +1,7 @@ // Wide-area traffic designation utility. // Flood-fill from cursor or fill entire map. -#include //For toupper(). +#include //For toupper(). #include //for min(). #include #include diff --git a/plugins/forceequip.cpp b/plugins/forceequip.cpp index abf4a95db..54da374b5 100644 --- a/plugins/forceequip.cpp +++ b/plugins/forceequip.cpp @@ -57,161 +57,161 @@ command_result df_forceequip(color_ostream &out, vector & parameters); const string forceequip_help = "ForceEquip moves local items into a unit's inventory. It is typically\n" - "used to equip specific clothing/armor items onto a dwarf, but can also\n" - "be used to put armor onto a war animal or to add unusual items (such\n" - "as crowns) to any unit.\n" - "This plugin can process multiple items in a single call, but will only\n" - "work with a single unit (the first one it finds under the cursor).\n" - "In order to minimize confusion, it is recommended that you use\n" - "forceequip only when you have a unit standing alone atop a pile of\n" - "gear that you would like it to wear. Items which are stored in bins\n" - "or other containers (e.g. chests, armor racks) may also work, but\n" - "piling items on the floor (via a garbage dump activity zone, of the\n" - "DFHack autodump command) is the most reliable way to do it.\n" - "The plugin will ignore any items that are forbidden. Hence, you\n" - "can setup a large pile of surplus gear, walk a unit onto it (or\n" - "pasture an animal on it), unforbid a few items and run forceequip.\n" - "The (forbidden) majority of your gear will remain in-place, ready\n" - "for the next passerby." - "\n" - "As mentioned above, this plugin can be used to equip items onto\n" - "units (such as animals) which cannot normally equip gear. There's\n" - "an important caveat here - such creatures will automatically drop\n" - "inappropriate gear almost immediately (within 10 game ticks).\n" - "If you want them to retain their equipment, you must forbid it\n" - "AFTER using forceequip to get it into their inventory.\n" - "This technique can also be used to clothe dwarven infants, but\n" - "only if you're able to separate them from their mothers.\n" + "used to equip specific clothing/armor items onto a dwarf, but can also\n" + "be used to put armor onto a war animal or to add unusual items (such\n" + "as crowns) to any unit.\n" + "This plugin can process multiple items in a single call, but will only\n" + "work with a single unit (the first one it finds under the cursor).\n" + "In order to minimize confusion, it is recommended that you use\n" + "forceequip only when you have a unit standing alone atop a pile of\n" + "gear that you would like it to wear. Items which are stored in bins\n" + "or other containers (e.g. chests, armor racks) may also work, but\n" + "piling items on the floor (via a garbage dump activity zone, of the\n" + "DFHack autodump command) is the most reliable way to do it.\n" + "The plugin will ignore any items that are forbidden. Hence, you\n" + "can setup a large pile of surplus gear, walk a unit onto it (or\n" + "pasture an animal on it), unforbid a few items and run forceequip.\n" + "The (forbidden) majority of your gear will remain in-place, ready\n" + "for the next passerby." "\n" - "By default, the forceequip plugin will attempt to avoid\n" - "conflicts and outright cheating. For instance, it will skip\n" - "any item which is flagged for use in a job, and will not\n" - "equip more than one piece of clothing/armor onto any given\n" - "body part. These restrictions can be overridden via command\n" - "switches (see examples below) but doing so puts you at greater\n" - "risk of unexpected consequences. For instance, a dwarf who\n" - "is wearing three breastplates will not be able to move very\n" - "quickly.\n" - "\n" - "Items equipped by this plugin DO NOT become owned by the\n" - "recipient. Adult dwarves are free to adjust their own\n" - "wardrobe, and may promptly decide to doff your gear in\n" - "favour of their owned items. Animals, as described above,\n" - "will tend to discard ALL clothing immediately unless it is\n" - "manually forbidden. Armor items seem to be an exception;\n" - "an animal will tend to retain an equipped suit of mail\n" - "even if you neglect to Forbid it.\n" - "\n" - "Please note that armored animals are quite vulnerable to ranged\n" - "attacks. Unlike dwarves, animals cannot block, dodge, or deflect\n" - "arrows, and they are slowed by the weight of their armor.\n" - "\n" - "This plugin currently does not support weapons.\n" - "\n" - "Options:\n" - " here, h - process the unit and item(s) under the cursor.\n" - " - This option is enabled by default since the plugin\n" - " - does not currently support remote equpping.\n" + "As mentioned above, this plugin can be used to equip items onto\n" + "units (such as animals) which cannot normally equip gear. There's\n" + "an important caveat here - such creatures will automatically drop\n" + "inappropriate gear almost immediately (within 10 game ticks).\n" + "If you want them to retain their equipment, you must forbid it\n" + "AFTER using forceequip to get it into their inventory.\n" + "This technique can also be used to clothe dwarven infants, but\n" + "only if you're able to separate them from their mothers.\n" + "\n" + "By default, the forceequip plugin will attempt to avoid\n" + "conflicts and outright cheating. For instance, it will skip\n" + "any item which is flagged for use in a job, and will not\n" + "equip more than one piece of clothing/armor onto any given\n" + "body part. These restrictions can be overridden via command\n" + "switches (see examples below) but doing so puts you at greater\n" + "risk of unexpected consequences. For instance, a dwarf who\n" + "is wearing three breastplates will not be able to move very\n" + "quickly.\n" + "\n" + "Items equipped by this plugin DO NOT become owned by the\n" + "recipient. Adult dwarves are free to adjust their own\n" + "wardrobe, and may promptly decide to doff your gear in\n" + "favour of their owned items. Animals, as described above,\n" + "will tend to discard ALL clothing immediately unless it is\n" + "manually forbidden. Armor items seem to be an exception;\n" + "an animal will tend to retain an equipped suit of mail\n" + "even if you neglect to Forbid it.\n" + "\n" + "Please note that armored animals are quite vulnerable to ranged\n" + "attacks. Unlike dwarves, animals cannot block, dodge, or deflect\n" + "arrows, and they are slowed by the weight of their armor.\n" + "\n" + "This plugin currently does not support weapons.\n" + "\n" + "Options:\n" + " here, h - process the unit and item(s) under the cursor.\n" + " - This option is enabled by default since the plugin\n" + " - does not currently support remote equpping.\n" " ignore, i - bypasses the usual item eligibility checks (such as\n" - " - \"Never equip gear belonging to another dwarf\" and\n" - " - \"Nobody is allowed to equip a Hive\".)\n" - " multi, m - bypasses the 1-item-per-bodypart limit, allowing\n" - " - the unit to receive an unlimited amount of gear.\n" - " - Can be used legitimately (e.g. mitten + gauntlet)\n" - " - or for cheating (e.g. twelve breastplates).\n" - " m2, m3, m4 - alters the 1-item-per-bodypart limit, allowing\n" - " - each part to receive 2, 3, or 4 pieces of gear.\n" - " selected, s - rather than processing all items piled at a unit's\n" - " - feet, process only the one item currently selected.\n" - " bodypart, bp - must be followed by a bodypart code (e.g. LH).\n" - " - Instructs the plugin to equip all available items\n" - " - onto this body part only. Typically used in\n" - " - conjunction with the f switch (to over-armor\n" - " - a particular bodypart) or the i switch (to equip\n" - " - an unusual item onto a specific slot).\n" + " - \"Never equip gear belonging to another dwarf\" and\n" + " - \"Nobody is allowed to equip a Hive\".)\n" + " multi, m - bypasses the 1-item-per-bodypart limit, allowing\n" + " - the unit to receive an unlimited amount of gear.\n" + " - Can be used legitimately (e.g. mitten + gauntlet)\n" + " - or for cheating (e.g. twelve breastplates).\n" + " m2, m3, m4 - alters the 1-item-per-bodypart limit, allowing\n" + " - each part to receive 2, 3, or 4 pieces of gear.\n" + " selected, s - rather than processing all items piled at a unit's\n" + " - feet, process only the one item currently selected.\n" + " bodypart, bp - must be followed by a bodypart code (e.g. LH).\n" + " - Instructs the plugin to equip all available items\n" + " - onto this body part only. Typically used in\n" + " - conjunction with the f switch (to over-armor\n" + " - a particular bodypart) or the i switch (to equip\n" + " - an unusual item onto a specific slot).\n" " verbose, v - provides detailed narration and error messages.\n" - " - Can be helpful in resolving failures; not needed\n" - " - for casual use.\n" - "\n" + " - Can be helpful in resolving failures; not needed\n" + " - for casual use.\n" + "\n" "Examples:\n" - " forceequip\n" - " attempts to equip all of the items under the cursor onto the unit\n" - " under the cursor. Uses only clothing/armor items; ignores all\n" - " other types. Equips a maximum of 1 item onto each bodypart,\n" - " and equips only \"appropriate\" items in each slot (e.g. glove\n" - " --> hand). Bypasses any item which might cause a conflict,\n" - " such as a Boot belonging to a different dwarf.\n" - " forceequip bp LH\n" - " attempts to equip all local items onto the left hand of the local\n" - " unit. If the hand is already equipped then nothing will happen,\n" - " and if it is not equipped then only one appropriate item (e.g. \n" - " a single mitten or gauntlet) will be equipped. This command can\n" - " be useful if you don't want to selectively forbid individual items\n" - " and simply want the unit to equip, say, a Helmet while leaving\n" - " the rest of the pile alone.\n" - " forceequip m bp LH\n" - " as above, but will equip ALL appropriate items onto the unit's\n" - " left hand. After running this command, it might end up wearing\n" - " a dozen left-handed mittens. Use with caution, and remember\n" - " that dwarves will tend to drop supernumary items ASAP.\n" - " forceequip m\n" - " as above, but will equip ALL appropriate items onto any\n" - " appropriate bodypart. Tends to put several boots onto the right\n" - " foot while leaving the left foot bare.\n" - " forceequip m2\n" - " as above, but will equip up to two appropriate items onto each\n" - " bodypart. Helps to balance footwear, but doesn't ensure proper\n" - " placement (e.g. left foot gets two socks, right foot gets two\n" - " shoes). For best results, use \"selected bp LH\" and\n" - " \"selected bp RH\" instead.\n" - " forceequip i\n" - " performs the standard \"equip appropriate items onto appropriate\n" - " bodyparts\" logic, but also includes items that would normally\n" - " be considered ineligible (such as a sock which is owned by\n" - " a different dwarf).\n" - " forceequip bp NECK\n" - " attempts to equip any appropriate gear onto the Neck of the\n" - " local unit. Since the plugin believes that no items are actually\n" - " appropriate for the Neck slot, this command does nothing.\n" - " forceequip i bp NECK\n" - " attempts to equip items from the local pile onto the Neck\n" - " of the local unit. Ignores appropriateness restrictions.\n" - " If there's a millstone or an albatross carcass sitting on\n" - " the same square as the targeted unit, then there's a good\n" - " chance that it will end up around his neck. For precise\n" - " control, remember that you can selectively forbid some of\n" - " the items that are piled on the ground.\n" - " forceequip i m bp NECK\n" - " as above, but equips an unlimited number of items onto the\n" - " targeted bodypart. Effectively, all unforbidden items\n" - " (including helms, millstones, boulders, etc) will be\n" - " moved from the local pile and placed in the dwarf's\n" - " inventory (specifically, on his neck). When used with\n" - " a large pile of goods, this will leave the dwarf heavily\n" - " encumbered and very slow to move.\n" - " forceequip s\n" - " requires that a single item be selected using the k menu.\n" - " This item must occupy the same square as the target unit,\n" - " and must be unforbidden. Attempts to equip this single\n" - " item onto an appropriate slot in the unit's inventory.\n" - " Can serve as a quicker alternative to the selective-\n" - " unforbidding approach described above.\n" - " forceequip s m i bp HD\n" - " equips the selected item onto the unit's head. Ignores\n" - " all possible restrictions and conflicts. If you know\n" - " exactly what you want to equip, and exactly where you\n" - " want it to go, then this is the most straightforward\n" - " and reliable option.\n" - " forceequip v bp QQQ\n" - " guaranteed to fail (and accomplish nothing) because\n" - " there are no bodyparts called QQQ. However, since the\n" - " verbose switch is used, the resulting error messages\n" - " will list every bodypart that the unit DOES possess.\n" - " May be useful if you're unfamiliar with the BP codes\n" - " used by Dwarf Fortress, or if you're experimenting\n" - " with an exotic creature.\n" - "\n" - ; + " forceequip\n" + " attempts to equip all of the items under the cursor onto the unit\n" + " under the cursor. Uses only clothing/armor items; ignores all\n" + " other types. Equips a maximum of 1 item onto each bodypart,\n" + " and equips only \"appropriate\" items in each slot (e.g. glove\n" + " --> hand). Bypasses any item which might cause a conflict,\n" + " such as a Boot belonging to a different dwarf.\n" + " forceequip bp LH\n" + " attempts to equip all local items onto the left hand of the local\n" + " unit. If the hand is already equipped then nothing will happen,\n" + " and if it is not equipped then only one appropriate item (e.g. \n" + " a single mitten or gauntlet) will be equipped. This command can\n" + " be useful if you don't want to selectively forbid individual items\n" + " and simply want the unit to equip, say, a Helmet while leaving\n" + " the rest of the pile alone.\n" + " forceequip m bp LH\n" + " as above, but will equip ALL appropriate items onto the unit's\n" + " left hand. After running this command, it might end up wearing\n" + " a dozen left-handed mittens. Use with caution, and remember\n" + " that dwarves will tend to drop supernumary items ASAP.\n" + " forceequip m\n" + " as above, but will equip ALL appropriate items onto any\n" + " appropriate bodypart. Tends to put several boots onto the right\n" + " foot while leaving the left foot bare.\n" + " forceequip m2\n" + " as above, but will equip up to two appropriate items onto each\n" + " bodypart. Helps to balance footwear, but doesn't ensure proper\n" + " placement (e.g. left foot gets two socks, right foot gets two\n" + " shoes). For best results, use \"selected bp LH\" and\n" + " \"selected bp RH\" instead.\n" + " forceequip i\n" + " performs the standard \"equip appropriate items onto appropriate\n" + " bodyparts\" logic, but also includes items that would normally\n" + " be considered ineligible (such as a sock which is owned by\n" + " a different dwarf).\n" + " forceequip bp NECK\n" + " attempts to equip any appropriate gear onto the Neck of the\n" + " local unit. Since the plugin believes that no items are actually\n" + " appropriate for the Neck slot, this command does nothing.\n" + " forceequip i bp NECK\n" + " attempts to equip items from the local pile onto the Neck\n" + " of the local unit. Ignores appropriateness restrictions.\n" + " If there's a millstone or an albatross carcass sitting on\n" + " the same square as the targeted unit, then there's a good\n" + " chance that it will end up around his neck. For precise\n" + " control, remember that you can selectively forbid some of\n" + " the items that are piled on the ground.\n" + " forceequip i m bp NECK\n" + " as above, but equips an unlimited number of items onto the\n" + " targeted bodypart. Effectively, all unforbidden items\n" + " (including helms, millstones, boulders, etc) will be\n" + " moved from the local pile and placed in the dwarf's\n" + " inventory (specifically, on his neck). When used with\n" + " a large pile of goods, this will leave the dwarf heavily\n" + " encumbered and very slow to move.\n" + " forceequip s\n" + " requires that a single item be selected using the k menu.\n" + " This item must occupy the same square as the target unit,\n" + " and must be unforbidden. Attempts to equip this single\n" + " item onto an appropriate slot in the unit's inventory.\n" + " Can serve as a quicker alternative to the selective-\n" + " unforbidding approach described above.\n" + " forceequip s m i bp HD\n" + " equips the selected item onto the unit's head. Ignores\n" + " all possible restrictions and conflicts. If you know\n" + " exactly what you want to equip, and exactly where you\n" + " want it to go, then this is the most straightforward\n" + " and reliable option.\n" + " forceequip v bp QQQ\n" + " guaranteed to fail (and accomplish nothing) because\n" + " there are no bodyparts called QQQ. However, since the\n" + " verbose switch is used, the resulting error messages\n" + " will list every bodypart that the unit DOES possess.\n" + " May be useful if you're unfamiliar with the BP codes\n" + " used by Dwarf Fortress, or if you're experimenting\n" + " with an exotic creature.\n" + "\n" + ; DFhackCExport command_result plugin_init ( color_ostream &out, vector &commands) { @@ -233,7 +233,7 @@ static bool moveToInventory(MapExtras::MapCache &mc, df::item *item, df::unit *u { // Step 1: Check for anti-requisite conditions df::unit * itemOwner = Items::getOwner(item); - if (ignoreRestrictions) + if (ignoreRestrictions) { // If the ignoreRestrictions cmdline switch was specified, then skip all of the normal preventative rules if (verbose) { Core::print("Skipping integrity checks...\n"); } @@ -244,8 +244,8 @@ static bool moveToInventory(MapExtras::MapCache &mc, df::item *item, df::unit *u return false; } else if (item->getType() != df::enums::item_type::GLOVES && - item->getType() != df::enums::item_type::HELM && - item->getType() != df::enums::item_type::ARMOR && + item->getType() != df::enums::item_type::HELM && + item->getType() != df::enums::item_type::ARMOR && item->getType() != df::enums::item_type::PANTS && item->getType() != df::enums::item_type::SHOES && !targetBodyPart) @@ -295,7 +295,7 @@ static bool moveToInventory(MapExtras::MapCache &mc, df::item *item, df::unit *u if (verbose) { Core::printerr("Found bodypart %s; not a match; continuing search.\n", currPart->token.c_str()); } continue; } - else + else { // The specified body part has not been found, and we've reached the end of the list. Report failure. if (verbose) { Core::printerr("The specified body part (%s) does not belong to the chosen unit. Please double-check to ensure that your spelling is correct, and that you have not chosen a dismembered bodypart.\n"); } @@ -366,14 +366,14 @@ static bool moveToInventory(MapExtras::MapCache &mc, df::item *item, df::unit *u // Collision detected; have we reached the limit? if (++collisions >= multiEquipLimit) { - if (verbose) { Core::printerr(" but it already carries %d piece(s) of equipment. Either remove the existing equipment or use the Multi option.\n", multiEquipLimit); } + if (verbose) { Core::printerr(" but it already carries %d piece(s) of equipment. Either remove the existing equipment or use the Multi option.\n", multiEquipLimit); } confirmedBodyPart = NULL; break; } } } - if (confirmedBodyPart) + if (confirmedBodyPart) { // Match found; no need to examine any other BPs if (verbose) { Core::print(" eligibility confirmed..."); } @@ -412,31 +412,31 @@ static bool moveToInventory(MapExtras::MapCache &mc, df::item *item, df::unit *u command_result df_forceequip(color_ostream &out, vector & parameters) { - // The "here" option is hardcoded to true, because the plugin currently doesn't support - // equip-at-a-distance (e.g. grab items within 10 squares of the targeted unit) + // The "here" option is hardcoded to true, because the plugin currently doesn't support + // equip-at-a-distance (e.g. grab items within 10 squares of the targeted unit) bool here = true; - // For balance (anti-cheating) reasons, the plugin applies a limit on the number of - // item that can be equipped on any bodypart. This limit defaults to 1 but can be - // overridden with cmdline switches. + // For balance (anti-cheating) reasons, the plugin applies a limit on the number of + // item that can be equipped on any bodypart. This limit defaults to 1 but can be + // overridden with cmdline switches. int multiEquipLimit = 1; - // The plugin applies several pre-checks in order to reduce the risk of conflict - // and unintended side-effects. Most of these checks can be disabled via cmdline - bool ignore = false; - // By default, the plugin uses all gear piled on the selected square. Optionally, - // it can target only a single item (selected on the k menu) instead - bool selected = false; - // Most of the plugin's text output is suppressed by default. It can be enabled - // to provide insight into errors, and/or for debugging purposes. - bool verbose = false; - // By default, the plugin will mate each item to an appropriate bodypart. This - // behaviour can be skipped if the user specifies a particular BP in the cmdline input. + // The plugin applies several pre-checks in order to reduce the risk of conflict + // and unintended side-effects. Most of these checks can be disabled via cmdline + bool ignore = false; + // By default, the plugin uses all gear piled on the selected square. Optionally, + // it can target only a single item (selected on the k menu) instead + bool selected = false; + // Most of the plugin's text output is suppressed by default. It can be enabled + // to provide insight into errors, and/or for debugging purposes. + bool verbose = false; + // By default, the plugin will mate each item to an appropriate bodypart. This + // behaviour can be skipped if the user specifies a particular BP in the cmdline input. std::string targetBodyPartCode; - // Parse the input + // Parse the input for (size_t i = 0; i < parameters.size(); i++) { string & p = parameters[i]; - + if (p == "help" || p == "?" || p == "h" || p == "/?" || p == "info" || p == "man") { out << forceequip_help << endl; @@ -446,34 +446,34 @@ command_result df_forceequip(color_ostream &out, vector & parameters) { here = true; } - else if (p == "ignore" || p == "i") - { - ignore = true; - } + else if (p == "ignore" || p == "i") + { + ignore = true; + } else if (p == "multi" || p == "m") { - multiEquipLimit = INT_MAX; - } - else if (p == "m2") - { - multiEquipLimit = 2; - } - else if (p == "m3") - { - multiEquipLimit = 3; - } - else if (p == "m4") - { - multiEquipLimit = 4; - } - else if (p == "selected" || p == "s") - { - selected = true; - } - else if (p == "verbose" || p == "v") - { - verbose = true; - } + multiEquipLimit = INT_MAX; + } + else if (p == "m2") + { + multiEquipLimit = 2; + } + else if (p == "m3") + { + multiEquipLimit = 3; + } + else if (p == "m4") + { + multiEquipLimit = 4; + } + else if (p == "selected" || p == "s") + { + selected = true; + } + else if (p == "verbose" || p == "v") + { + verbose = true; + } else if (p == "bodypart" || p == "bp" ) { // must be followed by bodypart code (e.g. NECK) @@ -492,150 +492,150 @@ command_result df_forceequip(color_ostream &out, vector & parameters) } } - // Ensure that the map information is available (e.g. a game is actually in-progress) + // Ensure that the map information is available (e.g. a game is actually in-progress) if (!Maps::IsValid()) { out.printerr("Map is not available!\n"); return CR_FAILURE; } - // Lookup the cursor position - int cx, cy, cz; - DFCoord pos_cursor; - - // needs a cursor - if (!Gui::getCursorCoords(cx,cy,cz)) - { - out.printerr("Cursor position not found. Please enable the cursor.\n"); - return CR_FAILURE; - } - pos_cursor = DFCoord(cx,cy,cz); - - // Iterate over all units, process the first one whose pos == pos_cursor - df::unit * targetUnit; - size_t numUnits = world->units.all.size(); - for(size_t i=0; i< numUnits; i++) - { - targetUnit = world->units.all[i]; // tentatively assume that we have a match; then verify - DFCoord pos_unit(targetUnit->pos.x, targetUnit->pos.y, targetUnit->pos.z); - - if (pos_unit == pos_cursor) - break; - - if (i + 1 == numUnits) - { - out.printerr("No unit found at cursor!\n"); - return CR_FAILURE; - } - } - - // Assert: unit found. - - // If a specific bodypart was included in the command arguments, then search for it now - df::body_part_raw * targetBodyPart = NULL; - if (targetBodyPartCode.size() > 0) { - for (int bpIndex = 0; bpIndex < targetUnit->body.body_plan->body_parts.size(); bpIndex ++) - { - // Tentatively assume that the part is a match - targetBodyPart = targetUnit->body.body_plan->body_parts.at(bpIndex); - if (targetBodyPart->token.compare(targetBodyPartCode) == 0) - { - // It is indeed a match; exit the loop (while leaving the variable populated) - if (verbose) { out.print("Matching bodypart (%s) found.\n", targetBodyPart->token.c_str()); } - break; - } - else - { - // Not a match; nullify the variable (it will get re-populated on the next pass through the loop) - if (verbose) { out.printerr("Bodypart \"%s\" does not match \"%s\".\n", targetBodyPart->token.c_str(), targetBodyPartCode.c_str()); } - targetBodyPart = NULL; - } - } - - if (!targetBodyPart) - { - // Loop iteration is complete but no match was found. - out.printerr("The unit does not possess a bodypart of type \"%s\". Please check the spelling or choose a different unit.\n", targetBodyPartCode.c_str()); - return CR_FAILURE; - } - } - - // Search for item(s) - MapCache mc; - - // iterate over all items, process those where pos == pos_cursor - int itemsEquipped = 0; - int itemsFound = 0; - int numItems = world->items.all.size(); // Normally, we iterate through EVERY ITEM in the world. This is expensive, but currently necessary. - if (selected) { numItems = 1; } // If the user wants to process only the selected item, then the loop is trivialized (only one pass is needed). - for(int i=0; i< numItems; i++) - { - df::item * currentItem; - - // Search behaviour depends on whether the operation is driven by cursor location or UI selection - if (selected) - { - // The "search" is trivial - the selection must always cover either one or zero items - currentItem = Gui::getSelectedItem(out); - if (!currentItem) { return CR_FAILURE; } - } - else - { - // Lookup the current item in the world-space - currentItem = world->items.all[i]; - // Test the item's position - DFCoord pos_item(currentItem->pos.x, currentItem->pos.y, currentItem->pos.z); - if (pos_item != pos_cursor) - { - // The item is in the wrong place; skip it - // Note: we do not emit any notification, even with the "verbose" switch, because the search space is enormous and we'd invariably flood the UI with useless text - continue; - } - // Bypass any forbidden items - else if (currentItem->flags.bits.forbid == 1) - { - // The item is forbidden; skip it - if (verbose) { out.printerr("Forbidden item encountered; skipping to next item.\n"); } - } - - } - - // Test the item; check whether we have any grounds to disqualify/reject it - if (currentItem->flags.bits.in_inventory == 1) - { - // The item is in a unit's inventory; skip it - if (verbose) { out.printerr("Inventory item encountered; skipping to next item.\n"); } - } - else - { - itemsFound ++; // Track the number of items found under the cursor (for feedback purposes) - if (moveToInventory(mc, currentItem, targetUnit, targetBodyPart, ignore, multiEquipLimit, verbose)) - { -// // TODO TEMP EXPERIMENTAL - try to alter the item size in order to conform to its wearer -// currentItem->getRace(); -// out.print("Critter size: %d| %d | Armor size: %d", world->raws.creatures.all[targetUnit->race]->caste[targetUnit->caste]->body_size_1, world->raws.creatures.all[targetUnit->race]->caste[targetUnit->caste]->body_size_2, currentItem->getTotalDimension()); - - itemsEquipped++; // Track the number of items successfully processed (for feedback purposes) - } - } - } - - if (itemsFound == 0) { - out.printerr("No usable items found at the cursor position. Please choose a different location and try again.\n"); - return CR_OK; - } - - - if (itemsEquipped == 0 && !verbose) { out.printerr("Some items were found but no equipment changes could be made. Use the /verbose switch to display the reasons for failure.\n"); } - if (itemsEquipped > 0) { out.print("%d items equipped.\n", itemsEquipped); } - // At this point, some changes may have been made (such as detaching items from their original position), regardless of whether any equipment changes succeeded. - // Therefore, we must update the map. - mc.WriteAll(); - - // Note: we might expect to recalculate the unit's weight at this point, in order to account for the - // added items. In fact, this recalculation occurs automatically during each dwarf's "turn". - // The slight delay in recalculation is probably not worth worrying about. - - // Work complete; report success - return CR_OK; + // Lookup the cursor position + int cx, cy, cz; + DFCoord pos_cursor; + + // needs a cursor + if (!Gui::getCursorCoords(cx,cy,cz)) + { + out.printerr("Cursor position not found. Please enable the cursor.\n"); + return CR_FAILURE; + } + pos_cursor = DFCoord(cx,cy,cz); + + // Iterate over all units, process the first one whose pos == pos_cursor + df::unit * targetUnit; + size_t numUnits = world->units.all.size(); + for(size_t i=0; i< numUnits; i++) + { + targetUnit = world->units.all[i]; // tentatively assume that we have a match; then verify + DFCoord pos_unit(targetUnit->pos.x, targetUnit->pos.y, targetUnit->pos.z); + + if (pos_unit == pos_cursor) + break; + + if (i + 1 == numUnits) + { + out.printerr("No unit found at cursor!\n"); + return CR_FAILURE; + } + } + + // Assert: unit found. + + // If a specific bodypart was included in the command arguments, then search for it now + df::body_part_raw * targetBodyPart = NULL; + if (targetBodyPartCode.size() > 0) { + for (int bpIndex = 0; bpIndex < targetUnit->body.body_plan->body_parts.size(); bpIndex ++) + { + // Tentatively assume that the part is a match + targetBodyPart = targetUnit->body.body_plan->body_parts.at(bpIndex); + if (targetBodyPart->token.compare(targetBodyPartCode) == 0) + { + // It is indeed a match; exit the loop (while leaving the variable populated) + if (verbose) { out.print("Matching bodypart (%s) found.\n", targetBodyPart->token.c_str()); } + break; + } + else + { + // Not a match; nullify the variable (it will get re-populated on the next pass through the loop) + if (verbose) { out.printerr("Bodypart \"%s\" does not match \"%s\".\n", targetBodyPart->token.c_str(), targetBodyPartCode.c_str()); } + targetBodyPart = NULL; + } + } + + if (!targetBodyPart) + { + // Loop iteration is complete but no match was found. + out.printerr("The unit does not possess a bodypart of type \"%s\". Please check the spelling or choose a different unit.\n", targetBodyPartCode.c_str()); + return CR_FAILURE; + } + } + + // Search for item(s) + MapCache mc; + + // iterate over all items, process those where pos == pos_cursor + int itemsEquipped = 0; + int itemsFound = 0; + int numItems = world->items.all.size(); // Normally, we iterate through EVERY ITEM in the world. This is expensive, but currently necessary. + if (selected) { numItems = 1; } // If the user wants to process only the selected item, then the loop is trivialized (only one pass is needed). + for(int i=0; i< numItems; i++) + { + df::item * currentItem; + + // Search behaviour depends on whether the operation is driven by cursor location or UI selection + if (selected) + { + // The "search" is trivial - the selection must always cover either one or zero items + currentItem = Gui::getSelectedItem(out); + if (!currentItem) { return CR_FAILURE; } + } + else + { + // Lookup the current item in the world-space + currentItem = world->items.all[i]; + // Test the item's position + DFCoord pos_item(currentItem->pos.x, currentItem->pos.y, currentItem->pos.z); + if (pos_item != pos_cursor) + { + // The item is in the wrong place; skip it + // Note: we do not emit any notification, even with the "verbose" switch, because the search space is enormous and we'd invariably flood the UI with useless text + continue; + } + // Bypass any forbidden items + else if (currentItem->flags.bits.forbid == 1) + { + // The item is forbidden; skip it + if (verbose) { out.printerr("Forbidden item encountered; skipping to next item.\n"); } + } + + } + + // Test the item; check whether we have any grounds to disqualify/reject it + if (currentItem->flags.bits.in_inventory == 1) + { + // The item is in a unit's inventory; skip it + if (verbose) { out.printerr("Inventory item encountered; skipping to next item.\n"); } + } + else + { + itemsFound ++; // Track the number of items found under the cursor (for feedback purposes) + if (moveToInventory(mc, currentItem, targetUnit, targetBodyPart, ignore, multiEquipLimit, verbose)) + { +// // TODO TEMP EXPERIMENTAL - try to alter the item size in order to conform to its wearer +// currentItem->getRace(); +// out.print("Critter size: %d| %d | Armor size: %d", world->raws.creatures.all[targetUnit->race]->caste[targetUnit->caste]->body_size_1, world->raws.creatures.all[targetUnit->race]->caste[targetUnit->caste]->body_size_2, currentItem->getTotalDimension()); + + itemsEquipped++; // Track the number of items successfully processed (for feedback purposes) + } + } + } + + if (itemsFound == 0) { + out.printerr("No usable items found at the cursor position. Please choose a different location and try again.\n"); + return CR_OK; + } + + + if (itemsEquipped == 0 && !verbose) { out.printerr("Some items were found but no equipment changes could be made. Use the /verbose switch to display the reasons for failure.\n"); } + if (itemsEquipped > 0) { out.print("%d items equipped.\n", itemsEquipped); } + // At this point, some changes may have been made (such as detaching items from their original position), regardless of whether any equipment changes succeeded. + // Therefore, we must update the map. + mc.WriteAll(); + + // Note: we might expect to recalculate the unit's weight at this point, in order to account for the + // added items. In fact, this recalculation occurs automatically during each dwarf's "turn". + // The slight delay in recalculation is probably not worth worrying about. + + // Work complete; report success + return CR_OK; } diff --git a/plugins/reactionhooks.cpp b/plugins/reactionhooks.cpp index ba0f8742d..6327583d6 100644 --- a/plugins/reactionhooks.cpp +++ b/plugins/reactionhooks.cpp @@ -185,7 +185,7 @@ df::item* find_item( } static void handle_reaction_done(color_ostream &out,df::reaction*, df::unit *unit, std::vector *in_items,std::vector *in_reag - , std::vector *out_items,bool *call_native){}; + , std::vector *out_items,bool *call_native){}; DEFINE_LUA_EVENT_6(onReactionComplete, handle_reaction_done,df::reaction*, df::unit *, std::vector *,std::vector *,std::vector *,bool *); @@ -208,13 +208,13 @@ struct product_hook : item_product { ) { if (auto product = products[this]) { - df::reaction* this_reaction=product->react; - CoreSuspendClaimer suspend; - color_ostream_proxy out(Core::getInstance().getConsole()); - bool call_native=true; + df::reaction* this_reaction=product->react; + CoreSuspendClaimer suspend; + color_ostream_proxy out(Core::getInstance().getConsole()); + bool call_native=true; onReactionComplete(out,this_reaction,unit,in_items,in_reag,out_items,&call_native); - if(!call_native) - return; + if(!call_native) + return; } INTERPOSE_NEXT(produce)(unit, out_items, in_reag, in_items, quantity, skill, entity, site); @@ -233,12 +233,12 @@ IMPLEMENT_VMETHOD_INTERPOSE(product_hook, produce); static void parse_product( - color_ostream &out, ProductInfo &info, df::reaction *react, item_product *prod - ) { - info.react = react; - info.product = prod; - info.material.mat_type = prod->mat_type; - info.material.mat_index = prod->mat_index; + color_ostream &out, ProductInfo &info, df::reaction *react, item_product *prod + ) { + info.react = react; + info.product = prod; + info.material.mat_type = prod->mat_type; + info.material.mat_index = prod->mat_index; } static bool find_reactions(color_ostream &out) diff --git a/plugins/workflow.cpp b/plugins/workflow.cpp index 6ba45cfd3..35f99b301 100644 --- a/plugins/workflow.cpp +++ b/plugins/workflow.cpp @@ -1095,9 +1095,9 @@ static void map_job_items(color_ostream &out) bool is_invalid = false; - // don't count worn items - if (item->getWear() >= 1) - is_invalid = true; + // don't count worn items + if (item->getWear() >= 1) + is_invalid = true; // Special handling switch (itype) { diff --git a/plugins/zone.cpp b/plugins/zone.cpp index 15d310dc1..dff37be0f 100644 --- a/plugins/zone.cpp +++ b/plugins/zone.cpp @@ -1,12 +1,12 @@ // Intention: help with activity zone management (auto-pasture animals, auto-pit goblins, ...) -// +// // the following things would be nice: // - dump info about pastures, pastured animals, count non-pastured tame animals, print gender info // - help finding caged dwarves? (maybe even allow to build their cages for fast release) // - dump info about caged goblins, animals, ... // - count grass tiles on pastures, move grazers to new pasture if old pasture is empty // move hungry unpastured grazers to pasture with grass -// +// // What is working so far: // - print detailed info about activity zone and units under cursor (mostly for checking refs and stuff) // - mark a zone which is used for future assignment commands @@ -287,7 +287,7 @@ static PersistentDataItem config_autonestbox; DFhackCExport command_result plugin_onstatechange(color_ostream &out, state_change_event event) { - switch (event) + switch (event) { case DFHack::SC_MAP_LOADED: // initialize from the world just loaded @@ -320,7 +320,7 @@ DFhackCExport command_result plugin_onupdate ( color_ostream &out ) autoNestbox(out, false); } } - + if(enable_autobutcher) { if(++ticks_autobutcher >= sleep_autobutcher) @@ -630,7 +630,7 @@ bool isTamable(df::unit* unit) { df::caste_raw *caste = raw->caste[j]; if(caste->flags.is_set(caste_raw_flags::PET) || - caste->flags.is_set(caste_raw_flags::PET_EXOTIC)) + caste->flags.is_set(caste_raw_flags::PET_EXOTIC)) return true; } return false; @@ -652,8 +652,8 @@ bool isFemale(df::unit* unit) bool hasValidMapPos(df::unit* unit) { if( unit->pos.x >=0 && unit->pos.y >= 0 && unit->pos.z >= 0 - && unit->pos.x < world->map.x_count - && unit->pos.y < world->map.y_count + && unit->pos.x < world->map.x_count + && unit->pos.y < world->map.y_count && unit->pos.z < world->map.z_count) return true; else @@ -662,7 +662,7 @@ bool hasValidMapPos(df::unit* unit) bool isNaked(df::unit* unit) { - return (unit->inventory.empty()); + return (unit->inventory.empty()); } @@ -694,7 +694,7 @@ void unitInfo(color_ostream & out, df::unit* unit, bool verbose = false) out << " '" << unit->name.nickname << "'"; out << ", "; } - + if(isAdult(unit)) out << "adult"; else if(isBaby(unit)) @@ -702,7 +702,7 @@ void unitInfo(color_ostream & out, df::unit* unit, bool verbose = false) else if(isChild(unit)) out << "child"; out << " "; - // sometimes empty even in vanilla RAWS, sometimes contains full race name (e.g. baby alpaca) + // sometimes empty even in vanilla RAWS, sometimes contains full race name (e.g. baby alpaca) // all animals I looked at don't have babies anyways, their offspring starts as CHILD //out << getRaceBabyName(unit); //out << getRaceChildName(unit); @@ -725,7 +725,7 @@ void unitInfo(color_ostream & out, df::unit* unit, bool verbose = false) out << ", age: " << getUnitAge(unit); if(isTame(unit)) - out << ", tame"; + out << ", tame"; if(isOwnCiv(unit)) out << ", owned"; if(isWar(unit)) @@ -742,7 +742,7 @@ void unitInfo(color_ostream & out, df::unit* unit, bool verbose = false) out << ", grazer"; if(isMilkable(unit)) out << ", milkable"; - + if(verbose) { out << ". Pos: ("<pos.x << "/"<< unit->pos.y << "/" << unit->pos.z << ") " << endl; @@ -820,7 +820,7 @@ bool isPitPond(df::building * building) if(civ->zone_flags.bits.pit_pond) // && civ->pit_flags==0) return true; - else + else return false; } @@ -879,7 +879,7 @@ df::unit* findUnitById(int32_t id) int32_t findPenPitAtCursor() { int32_t foundID = -1; - + if(cursor->x == -30000) return -1; @@ -906,7 +906,7 @@ int32_t findPenPitAtCursor() int32_t findCageAtCursor() { int32_t foundID = -1; - + if(cursor->x == -30000) return -1; @@ -935,7 +935,7 @@ int32_t findCageAtCursor() int32_t findChainAtCursor() { int32_t foundID = -1; - + if(cursor->x == -30000) return -1; @@ -974,7 +974,7 @@ df::general_ref_building_civzone_assignedst * createCivzoneRef() // being called for the first time, need to initialize the vtable for(size_t i = 0; i < world->units.all.size(); i++) { - df::unit * creature = world->units.all[i]; + df::unit * creature = world->units.all[i]; for(size_t r = 0; rgeneral_refs.size(); r++) { df::general_ref* ref; @@ -984,7 +984,7 @@ df::general_ref_building_civzone_assignedst * createCivzoneRef() if (strict_virtual_cast(ref)) { // !! calling new() doesn't work, need _identity.instantiate() instead !! - newref = (df::general_ref_building_civzone_assignedst*) + newref = (df::general_ref_building_civzone_assignedst*) df::general_ref_building_civzone_assignedst::_identity.instantiate(); vt_initialized = true; break; @@ -1090,13 +1090,13 @@ bool isInBuiltCageRoom(df::unit* unit) for (size_t b=0; b < world->buildings.all.size(); b++) { df::building* building = world->buildings.all[b]; - + // !!! building->isRoom() returns true if the building can be made a room but currently isn't // !!! except for coffins/tombs which always return false // !!! using the bool is_room however gives the correct state/value if(!building->is_room) continue; - + if(building->getType() == building_type::Cage) { df::building_cagest* cage = (df::building_cagest*) building; @@ -1118,7 +1118,7 @@ bool isInBuiltCageRoom(df::unit* unit) // check a map position for a built cage // animals in cages are CONTAINED_IN_ITEM, no matter if they are on a stockpile or inside a built cage // if they are on animal stockpiles they should count as unassigned to allow pasturing them -// if they are inside built cages they should be ignored in case the cage is a zoo or linked to a lever or whatever +// if they are inside built cages they should be ignored in case the cage is a zoo or linked to a lever or whatever bool isBuiltCageAtPos(df::coord pos) { bool cage = false; @@ -1232,7 +1232,7 @@ bool isFreeEgglayer(df::unit * unit) { if( !isDead(unit) && !isUndead(unit) && isFemale(unit) - && isTame(unit) + && isTame(unit) && isOwnCiv(unit) && isEggLayer(unit) && !isAssigned(unit) @@ -1306,7 +1306,7 @@ bool unassignUnitFromBuilding(df::unit* unit) { // game does not erase the ref until creature gets removed from cage //unit->general_refs.erase(unit->general_refs.begin() + idx); - + // walk through buildings, check cages for inhabitants, compare ids for (size_t b=0; b < world->buildings.all.size(); b++) { @@ -1379,7 +1379,7 @@ command_result assignUnitToZone(color_ostream& out, df::unit* unit, df::building << "before using 'assign' for the first time." << endl; return CR_WRONG_USAGE; } - + // check if unit is already pastured, remove that ref from unit and old pasture // testing showed that removing the ref from the unit only seems to be necessary for pastured creatures // if they are in cages on stockpiles the game unassigns them automatically @@ -1401,8 +1401,8 @@ command_result assignUnitToZone(color_ostream& out, df::unit* unit, df::building df::building_civzonest * civz = (df::building_civzonest *) building; civz->assigned_creature.push_back(unit->id); - out << "Unit " << unit->id - << "(" << getRaceName(unit) << ")" + out << "Unit " << unit->id + << "(" << getRaceName(unit) << ")" << " assigned to zone " << building->id; if(isPitPond(building)) out << " (pit/pond)."; @@ -1425,7 +1425,7 @@ command_result assignUnitToCage(color_ostream& out, df::unit* unit, df::building // don't assign owned pets to a cage. the owner will release them, resulting into infinite hauling (df bug) if(unit->relations.pet_owner_id != -1) return CR_OK; - + // check if unit is already pastured or caged, remove refs where necessary bool cleared_old = unassignUnitFromBuilding(unit); if(verbose) @@ -1442,8 +1442,8 @@ command_result assignUnitToCage(color_ostream& out, df::unit* unit, df::building df::building_cagest* civz = (df::building_cagest*) building; civz->assigned_creature.push_back(unit->id); - out << "Unit " << unit->id - << "(" << getRaceName(unit) << ")" + out << "Unit " << unit->id + << "(" << getRaceName(unit) << ")" << " assigned to cage " << building->id; out << endl; @@ -1631,7 +1631,7 @@ void zoneInfo(color_ostream & out, df::building* building, bool verbose) out << " (pit flags:" << civ->pit_flags.whole << ")"; if(civ->pit_flags.bits.is_pond) out << ", pond"; - else + else out << ", pit"; } out << endl; @@ -1654,7 +1654,7 @@ void zoneInfo(color_ostream & out, df::building* building, bool verbose) df::unit * creature = world->units.all[i]; if(creature->id != cindex) continue; - + unitInfo(out, creature, verbose); } } @@ -1694,7 +1694,7 @@ void cageInfo(color_ostream & out, df::building* building, bool verbose) df::unit * creature = world->units.all[i]; if(creature->id != cindex) continue; - + unitInfo(out, creature, verbose); } } @@ -1737,7 +1737,7 @@ command_result df_zone (color_ostream &out, vector & parameters) bool zone_info = false; //bool cage_info = false; //bool chain_info = false; - + bool invert_filter = false; bool find_unassigned = false; bool find_caged = false; @@ -1763,17 +1763,17 @@ command_result df_zone (color_ostream &out, vector & parameters) bool find_female = false; bool find_not_female = false; bool find_egglayer = false; - bool find_not_egglayer = false; + bool find_not_egglayer = false; bool find_grazer = false; bool find_not_grazer = false; bool find_milkable = false; bool find_not_milkable = false; bool find_named = false; bool find_not_named = false; - bool find_naked = false; - bool find_not_naked = false; - bool find_tamable = false; - bool find_not_tamable = false; + bool find_naked = false; + bool find_not_naked = false; + bool find_tamable = false; + bool find_not_tamable = false; bool find_agemin = false; bool find_agemax = false; @@ -1801,7 +1801,7 @@ command_result df_zone (color_ostream &out, vector & parameters) for (size_t i = 0; i < parameters.size(); i++) { string & p = parameters[i]; - + if (p == "help" || p == "?") { out << zone_help << endl; @@ -2388,7 +2388,7 @@ command_result df_zone (color_ostream &out, vector & parameters) df::unit *unit = world->units.all[c]; // ignore dead and undead units - if (isDead(unit) || isUndead(unit)) + if (isDead(unit) || isUndead(unit)) continue; // ignore merchant units by default @@ -2432,7 +2432,7 @@ command_result df_zone (color_ostream &out, vector & parameters) || (find_grazer && !isGrazer(unit)) || (find_not_grazer && isGrazer(unit)) || (find_egglayer && !isEggLayer(unit)) - || (find_not_egglayer && isEggLayer(unit)) + || (find_not_egglayer && isEggLayer(unit)) || (find_milkable && !isMilkable(unit)) || (find_not_milkable && isMilkable(unit)) || (find_male && !isMale(unit)) @@ -2441,10 +2441,10 @@ command_result df_zone (color_ostream &out, vector & parameters) || (find_not_female && isFemale(unit)) || (find_named && !unit->name.has_name) || (find_not_named && unit->name.has_name) - || (find_naked && !isNaked(unit)) - || (find_not_naked && isNaked(unit)) - || (find_tamable && !isTamable(unit)) - || (find_not_tamable && isTamable(unit)) + || (find_naked && !isNaked(unit)) + || (find_not_naked && isNaked(unit)) + || (find_tamable && !isTamable(unit)) + || (find_not_tamable && isTamable(unit)) || (find_trainable_war && (isWar(unit) || isHunter(unit) || !isTrainableWar(unit))) || (find_not_trainable_war && isTrainableWar(unit)) // hm, is this check enough? || (find_trainable_hunting && (isWar(unit) || isHunter(unit) || !isTrainableHunting(unit))) @@ -2471,7 +2471,7 @@ command_result df_zone (color_ostream &out, vector & parameters) unitInfo(out, unit, verbose); continue; } - + if(nick_set) { Units::setNickname(unit, target_nick); @@ -2540,8 +2540,8 @@ command_result df_zone (color_ostream &out, vector & parameters) } // de-assign from pen or pit - // using the zone tool to free creatures from cages or chains - // is pointless imo since that is already quite easy using the ingame UI. + // using the zone tool to free creatures from cages or chains + // is pointless imo since that is already quite easy using the ingame UI. // but it's easy to implement so I might as well add it later if(building_unassign) { @@ -2555,7 +2555,7 @@ command_result df_zone (color_ostream &out, vector & parameters) out << "Unit unassigned." << endl; else out << "Unit is not assigned to an activity zone!" << endl; - + return CR_OK; } @@ -2574,7 +2574,7 @@ command_result df_autonestbox(color_ostream &out, vector & parameters) for (size_t i = 0; i < parameters.size(); i++) { string & p = parameters[i]; - + if (p == "help" || p == "?") { out << autonestbox_help << endl; @@ -2687,7 +2687,7 @@ command_result autoNestbox( color_ostream &out, bool verbose = false ) Gui::showAnnouncement(announce, 2, false); out << announce << endl; // can complain again - // (might lead to spamming the same message twice, but catches the case + // (might lead to spamming the same message twice, but catches the case // where for example 2 new egglayers hatched right after 2 zones were created and assigned) autonestbox_did_complain = false; } @@ -2699,7 +2699,7 @@ command_result autoNestbox( color_ostream &out, bool verbose = false ) // getUnitAge() returns 0 if born in current year, therefore the look at birth_time in that case // (assuming that the value from there indicates in which tick of the current year the unit was born) -bool compareUnitAgesYounger(df::unit* i, df::unit* j) +bool compareUnitAgesYounger(df::unit* i, df::unit* j) { int32_t age_i = getUnitAge(i); int32_t age_j = getUnitAge(j); @@ -2708,10 +2708,10 @@ bool compareUnitAgesYounger(df::unit* i, df::unit* j) age_i = i->relations.birth_time; age_j = j->relations.birth_time; } - return (age_i < age_j); + return (age_i < age_j); } -bool compareUnitAgesOlder(df::unit* i, df::unit* j) -{ +bool compareUnitAgesOlder(df::unit* i, df::unit* j) +{ int32_t age_i = getUnitAge(i); int32_t age_j = getUnitAge(j); if(age_i == 0 && age_j == 0) @@ -2719,7 +2719,7 @@ bool compareUnitAgesOlder(df::unit* i, df::unit* j) age_i = i->relations.birth_time; age_j = j->relations.birth_time; } - return (age_i > age_j); + return (age_i > age_j); } //enum WatchedRaceSubtypes @@ -2748,7 +2748,7 @@ public: vector mk_ptr; vector fa_ptr; vector ma_ptr; - + WatchedRace(bool watch, int id, int _fk, int _mk, int _fa, int _ma) { isWatched = watch; @@ -2786,8 +2786,8 @@ public: string keyname = "autobutcher/watchlist/" + getRaceName(raceId); out << "Something failed, could not find/create config key " << keyname << "!" << endl; } - } - + } + void RemoveConfig(color_ostream & out) { if(!rconfig.isValid()) @@ -2802,7 +2802,7 @@ public: sort(fa_ptr.begin(), fa_ptr.end(), compareUnitAgesYounger); sort(ma_ptr.begin(), ma_ptr.end(), compareUnitAgesYounger); } - + void PushUnit(df::unit * unit) { if(isFemale(unit)) @@ -2894,7 +2894,7 @@ public: } }; // vector of races handled by autobutcher -// the name is a bit misleading since entries can be set to 'unwatched' +// the name is a bit misleading since entries can be set to 'unwatched' // to ignore them for a while but still keep the target count settings std::vector watched_races; @@ -2933,7 +2933,7 @@ command_result df_autobutcher(color_ostream &out, vector & parameters) } // parse main command - string & p = parameters[0]; + string & p = parameters[0]; if (p == "help" || p == "?") { out << autobutcher_help << endl; @@ -3058,19 +3058,19 @@ command_result df_autobutcher(color_ostream &out, vector & parameters) if(list_watched) { out << "Autobutcher status: "; - + if(enable_autobutcher) out << "enabled,"; else out << "not enabled,"; - + if (enable_autobutcher_autowatch) out << " autowatch,"; else out << " noautowatch,"; - + out << " sleep: " << sleep_autobutcher << endl; - + out << "Default setting for new races:" << " fk=" << default_fk << " mk=" << default_mk @@ -3094,7 +3094,7 @@ command_result df_autobutcher(color_ostream &out, vector & parameters) out << "watched: "; else out << "not watched: "; - out << name + out << name << " fk=" << w->fk << " mk=" << w->mk << " fa=" << w->fa @@ -3114,7 +3114,7 @@ command_result df_autobutcher(color_ostream &out, vector & parameters) out << run << "start" << endl; if(!enable_autobutcher) - out << run << "stop" << endl; + out << run << "stop" << endl; if (enable_autobutcher_autowatch) out << run << "autowatch" << endl; @@ -3147,8 +3147,8 @@ command_result df_autobutcher(color_ostream &out, vector & parameters) } // parse rest of parameters for commands followed by a list of races - if( watch_race - || unwatch_race + if( watch_race + || unwatch_race || forget_race || change_target ) { @@ -3226,7 +3226,7 @@ command_result df_autobutcher(color_ostream &out, vector & parameters) else { // map race names from parameter list to ids - size_t num_races = df::global::world->raws.creatures.all.size(); + size_t num_races = df::global::world->raws.creatures.all.size(); while(target_racenames.size()) { bool found_race = false; @@ -3345,7 +3345,7 @@ command_result autoButcher( color_ostream &out, bool verbose = false ) || isHunter(unit) // ignore hunting dogs etc // ignore creatures in built cages which are defined as rooms to leave zoos alone // (TODO: better solution would be to allow some kind of slaughter cages which you can place near the butcher) - || (isContainedInItem(unit) && isInBuiltCageRoom(unit)) // !!! see comments in isBuiltCageRoom() + || (isContainedInItem(unit) && isInBuiltCageRoom(unit)) // !!! see comments in isBuiltCageRoom() || unit->name.has_name ) continue; @@ -3372,7 +3372,7 @@ command_result autoButcher( color_ostream &out, bool verbose = false ) string announce; announce = "New race added to autobutcher watchlist: " + getRaceName(w->raceId); Gui::showAnnouncement(announce, 2, false); - //out << announce << endl; + //out << announce << endl; } } @@ -3389,7 +3389,7 @@ command_result autoButcher( color_ostream &out, bool verbose = false ) string announce; announce = getRaceName(w->raceId) + " marked for slaughter: " + ss.str(); Gui::showAnnouncement(announce, 2, false); - //out << announce << endl; + //out << announce << endl; } } //out << slaughter_count << " units total marked for slaughter." << endl; @@ -3425,13 +3425,13 @@ command_result start_autobutcher(color_ostream &out) config_autobutcher.ival(0) = enable_autobutcher; out << "Starting autobutcher." << endl; - init_autobutcher(out); + init_autobutcher(out); return CR_OK; } command_result init_autobutcher(color_ostream &out) { - cleanup_autobutcher(out); + cleanup_autobutcher(out); config_autobutcher = World::GetPersistentData("autobutcher/config"); if(config_autobutcher.isValid()) @@ -3466,9 +3466,9 @@ command_result init_autobutcher(color_ostream &out) std::vector items; World::GetPersistentData(&items, "autobutcher/watchlist/", true); - for (auto p = items.begin(); p != items.end(); p++) - { - string key = p->key(); + for (auto p = items.begin(); p != items.end(); p++) + { + string key = p->key(); out << "Reading from save: " << key << endl; //out << " raceid: " << p->ival(0) << endl; //out << " watched: " << p->ival(1) << endl; @@ -3476,7 +3476,7 @@ command_result init_autobutcher(color_ostream &out) //out << " mk: " << p->ival(3) << endl; //out << " fa: " << p->ival(4) << endl; //out << " ma: " << p->ival(5) << endl; - + WatchedRace * w = new WatchedRace(p->ival(1), p->ival(0), p->ival(2), p->ival(3),p->ival(4),p->ival(5)); w->rconfig = *p; watched_races.push_back(w); @@ -3514,13 +3514,13 @@ command_result start_autonestbox(color_ostream &out) config_autonestbox.ival(0) = enable_autonestbox; out << "Starting autonestbox." << endl; - init_autonestbox(out); + init_autonestbox(out); return CR_OK; } command_result init_autonestbox(color_ostream &out) { - cleanup_autonestbox(out); + cleanup_autonestbox(out); config_autonestbox = World::GetPersistentData("autonestbox/config"); if(config_autonestbox.isValid())