Merged branch develop into develop

develop
Japa 2016-10-31 17:39:02 +05:30
commit 8a66e22522
5 changed files with 121 additions and 11 deletions

@ -396,11 +396,7 @@ IF(UNIX)
execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
string(STRIP ${GCC_VERSION} GCC_VERSION) string(STRIP ${GCC_VERSION} GCC_VERSION)
SET(DFHACK_PACKAGE_SUFFIX "-gcc-${GCC_VERSION}") SET(DFHACK_PACKAGE_SUFFIX "-gcc-${GCC_VERSION}")
if(APPLE) SET(CPACK_GENERATOR "TBZ2")
SET(CPACK_GENERATOR "ZIP;TBZ2")
else()
SET(CPACK_GENERATOR "TBZ2")
endif()
ELSEIF(WIN32) ELSEIF(WIN32)
SET(CPACK_GENERATOR "ZIP") SET(CPACK_GENERATOR "ZIP")
ENDIF() ENDIF()
@ -410,7 +406,7 @@ IF(APPLE)
ELSE() ELSE()
set(DFHACK_PACKAGE_PLATFORM_NAME ${CMAKE_SYSTEM_NAME}) set(DFHACK_PACKAGE_PLATFORM_NAME ${CMAKE_SYSTEM_NAME})
ENDIF() ENDIF()
set(CPACK_PACKAGE_FILE_NAME "dfhack-${DFHACK_VERSION}-${DFHACK_PACKAGE_PLATFORM_NAME}${DFHACK_PACKAGE_SUFFIX}") set(CPACK_PACKAGE_FILE_NAME "dfhack-${DFHACK_VERSION}-${DFHACK_PACKAGE_PLATFORM_NAME}-${DFHACK_BUILD_ARCH}${DFHACK_PACKAGE_SUFFIX}")
INCLUDE(CPack) INCLUDE(CPack)
#INCLUDE(FindSphinx.cmake) #INCLUDE(FindSphinx.cmake)

@ -840,7 +840,108 @@ Examples:
labormanager labormanager
============ ============
A more advanced alternative to `autolabor`. Automatically manage dwarf labors to efficiently complete jobs.
Labormanager is derived from autolabor (above) but uses a completely
different approach to assigning jobs to dwarves. While autolabor tries
to keep as many dwarves busy as possible, labormanager instead strives
to get jobs done as quickly as possible.
Labormanager frequently scans the current job list, current list of
dwarfs, and the map to determine how many dwarves need to be assigned to
what labors in order to meet all current labor needs without starving
any particular type of job.
.. warning::
*As with autolabor, labormanager will override any manual changes you
make to labors while it is enabled, including through other tools such
as Dwarf Therapist*
Simple usage:
:enable labormanager: Enables the plugin with default settings.
(Persistent per fortress) :disable labormanager: Disables the plugin.
Anything beyond this is optional - autolabor works fairly well on the
default settings.
The default priorities for each labor vary (some labors are higher
priority by default than others). The way the plugin works is that, once
it determines how many of each labor is needed, it then sorts them by
adjusted priority. (Labors other than hauling have a bias added to them
based on how long it's been since they were last used, to prevent job
starvation.) The labor with the highest priority is selected, the "best
fit" dwarf for that labor is assigned to that labor, and then its
priority is *halved*. This process is repeated until either dwarfs or
labors run out.
Because there is no easy way to detect how many haulers are actually
needed at any moment, the plugin always ensures that at least one dwarf
is assigned to each of the hauling labors, even if no hauling jobs are
detected. At least one dwarf is always assigned to construction removing
and cleaning because these jobs also cannot be easily detected. Lever
pulling is always assigned to everyone. Any dwarfs for which there are
no jobs will be assigned hauling, lever pulling, and cleaning labors. If
you use animal trainers, note that labormanager will misbehave if you
assign specific trainers to specific animals; results are only guaranteed
if you use "any trainer", and animal trainers will probably be
overallocated in any case.
Labormanager also sometimes assigns extra labors to currently busy
dwarfs so that when they finish their current job, they will go off and
do something useful instead of standing around waiting for a job.
There is special handling to ensure that at least one dwarf is assigned
to haul food whenever food is detected left in a place where it will rot
if not stored. This will cause a dwarf to go idle if you have no
storepiles to haul food to.
Dwarfs who are unable to work (child, in the military, wounded,
handless, asleep, in a meeting) are entirely excluded from labor
assignment. Any dwarf explicitly assigned to a burrow will also be
completely ignored by labormanager.
The fitness algorithm for assigning jobs to dwarfs generally attempts to
favor dwarfs who are more skilled over those who are less skilled. It
also tries to avoid assigning female dwarfs with children to jobs that
are "outside", favors assigning "outside" jobs to dwarfs who are
carrying a tool that could be used as a weapon, and tries to minimize
how often dwarfs have to reequip.
Labormanager automatically determines medical needs and reserves health
care providers as needed. Note that this may cause idling if you have
injured dwarfs but no or inadequate hospital facilities.
Hunting is never assigned without a butchery, and fishing is never
assigned without a fishery, and neither of these labors is assigned
unless specifically enabled.
The method by which labormanager determines what labor is needed for a
particular job is complicated and, in places, incomplete. In some
situations, labormanager will detect that it cannot determine what labor
is required. It will, by default, pause and print an error message on
the dfhack console, followed by the message "LABORMANAGER: Game paused
so you can investigate the above message.". If this happens, please open
an issue on github, reporting the lines that immediately preceded this
message. You can tell labormanager to ignore this error and carry on by
typing "autolabor pause-on-error no", but be warned that some job may go
undone in this situation.
Advanced usage:
:labormanager enable: Turn plugin on.
:labormanager disable: Turn plugin off.
:labormanager priority <labor> <value>: Set the priority value (see above) for labor <labor> to <value>.
:labormanager reset <labor>: Reset the priority value of labor <labor> to its default.
:labormanager reset-all: Reset all priority values to their defaults.
:labormanager allow-fishing: Allow dwarfs to fish. *Warning* This tends to result in most of the fort going fishing.
:labormanager forbid-fishing: Forbid dwarfs from fishing. Default behavior.
:labormanager allow-hunting: Allow dwarfs to hunt. *Warning* This tends to result in as many dwarfs going hunting as you have crossbows.
:labormanager forbid-hunting: Forbid dwarfs from hunting. Default behavior.
:labormanager list: Show current priorities and current allocation stats.
:labormanager pause-on-error yes: Make labormanager pause if the labor inference engine fails. See above.
:labormanager pause-on-error no: Allow labormanager to continue past a labor inference engine failure.
.. _autohauler: .. _autohauler:

@ -1002,6 +1002,8 @@ private:
return df::unit_labor::WOOD_CRAFT; return df::unit_labor::WOOD_CRAFT;
case df::item_type::CLOTH: case df::item_type::CLOTH:
return df::unit_labor::CLOTHESMAKER; return df::unit_labor::CLOTHESMAKER;
case df::item_type::SKIN_TANNED:
return df::unit_labor::LEATHER;
default: default:
debug ("LABORMANAGER: Cannot deduce labor for make crafts job, item type %s\n", debug ("LABORMANAGER: Cannot deduce labor for make crafts job, item type %s\n",
ENUM_KEY_STR(item_type, jobitem).c_str()); ENUM_KEY_STR(item_type, jobitem).c_str());

@ -2,7 +2,7 @@ IF (APPLE)
SET(RUBYLIB ${CMAKE_CURRENT_SOURCE_DIR}/osx${DFHACK_BUILD_ARCH}/libruby.dylib) SET(RUBYLIB ${CMAKE_CURRENT_SOURCE_DIR}/osx${DFHACK_BUILD_ARCH}/libruby.dylib)
SET(RUBYLIB_INSTALL_NAME "libruby.dylib") SET(RUBYLIB_INSTALL_NAME "libruby.dylib")
IF(${DFHACK_BUILD_ARCH} STREQUAL 64) IF(${DFHACK_BUILD_ARCH} STREQUAL 64)
MESSAGE("No ruby lib for 64-bit OS X yet") # MESSAGE("No ruby lib for 64-bit OS X yet")
ELSE() ELSE()
DOWNLOAD_FILE_UNZIP("https://github.com/DFHack/dfhack-bin/releases/download/0.43.05/osx32-libruby187.dylib.gz" DOWNLOAD_FILE_UNZIP("https://github.com/DFHack/dfhack-bin/releases/download/0.43.05/osx32-libruby187.dylib.gz"
"gz" "gz"
@ -33,7 +33,12 @@ ELSE()
SET(RUBYLIB ${CMAKE_CURRENT_SOURCE_DIR}/win${DFHACK_BUILD_ARCH}/libruby.dll) SET(RUBYLIB ${CMAKE_CURRENT_SOURCE_DIR}/win${DFHACK_BUILD_ARCH}/libruby.dll)
SET(RUBYLIB_INSTALL_NAME "libruby.dll") SET(RUBYLIB_INSTALL_NAME "libruby.dll")
IF(${DFHACK_BUILD_ARCH} STREQUAL 64) IF(${DFHACK_BUILD_ARCH} STREQUAL 64)
MESSAGE("No ruby lib for 64-bit Windows yet") DOWNLOAD_FILE_UNZIP("https://github.com/DFHack/dfhack-bin/releases/download/0.43.05/win64-libruby200.dll.gz"
"gz"
${RUBYLIB}.gz
"81db54a8b8b3090c94c6ae2147d30b8f"
${RUBYLIB}
"8a8564418aebddef3dfee1e96690e713")
ELSE() ELSE()
DOWNLOAD_FILE_UNZIP("https://github.com/DFHack/dfhack-bin/releases/download/0.43.05/win32-libruby187.dll.gz" DOWNLOAD_FILE_UNZIP("https://github.com/DFHack/dfhack-bin/releases/download/0.43.05/win32-libruby187.dll.gz"
"gz" "gz"
@ -68,7 +73,9 @@ ADD_DEPENDENCIES(ruby ruby-autogen-rb)
IF(EXISTS ${RUBYLIB}) IF(EXISTS ${RUBYLIB})
INSTALL(FILES ${RUBYLIB} DESTINATION ${DFHACK_LIBRARY_DESTINATION} RENAME ${RUBYLIB_INSTALL_NAME}) INSTALL(FILES ${RUBYLIB} DESTINATION ${DFHACK_LIBRARY_DESTINATION} RENAME ${RUBYLIB_INSTALL_NAME})
ELSE() ELSE()
MESSAGE(WARNING "Ruby library not found at ${RUBYLIB} - will not be installed") IF(NOT(APPLE AND ${DFHACK_BUILD_ARCH} STREQUAL 64))
MESSAGE(WARNING "Ruby library not found at ${RUBYLIB} - will not be installed")
ENDIF()
ENDIF() ENDIF()
INSTALL(DIRECTORY . INSTALL(DIRECTORY .

@ -308,7 +308,7 @@ VALUE (*rb_eval_string_protect)(const char*, int*);
VALUE (*rb_ary_shift)(VALUE); VALUE (*rb_ary_shift)(VALUE);
VALUE (*rb_float_new)(double); VALUE (*rb_float_new)(double);
double (*rb_num2dbl)(VALUE); double (*rb_num2dbl)(VALUE);
VALUE (*rb_int2inum)(intptr_t); // XXX check on win64 long vs intptr_t VALUE (*rb_int2inum)(intptr_t); // XXX check on win64 long vs intptr_t
VALUE (*rb_uint2inum)(uintptr_t); VALUE (*rb_uint2inum)(uintptr_t);
uintptr_t (*rb_num2ulong)(VALUE); uintptr_t (*rb_num2ulong)(VALUE);
// end of rip(ruby.h) // end of rip(ruby.h)
@ -322,7 +322,11 @@ static int df_loadruby(void)
#if defined(WIN32) #if defined(WIN32)
"./libruby.dll"; "./libruby.dll";
#elif defined(__APPLE__) #elif defined(__APPLE__)
#ifdef DFHACK64
"/System/Library/Frameworks/Ruby.framework/Ruby";
#else
"hack/libruby.dylib"; "hack/libruby.dylib";
#endif
#else #else
"hack/libruby.so"; "hack/libruby.so";
#endif #endif