Conflicts:
	library/LuaTypes.cpp
	library/LuaWrapper.cpp
develop
Quietust 2012-03-28 11:51:49 -05:00
commit 95ec363a7f
10 changed files with 102 additions and 85 deletions

@ -50,10 +50,10 @@ endif()
# set up versioning. # set up versioning.
set(DF_VERSION_MAJOR "0") set(DF_VERSION_MAJOR "0")
set(DF_VERSION_MINOR "34") set(DF_VERSION_MINOR "34")
set(DF_VERSION_PATCH "05") set(DF_VERSION_PATCH "06")
set(DF_VERSION "${DF_VERSION_MAJOR}.${DF_VERSION_MINOR}.${DF_VERSION_PATCH}") set(DF_VERSION "${DF_VERSION_MAJOR}.${DF_VERSION_MINOR}.${DF_VERSION_PATCH}")
set(DFHACK_RELEASE "1f") set(DFHACK_RELEASE "1")
set(DFHACK_VERSION "${DF_VERSION_MAJOR}.${DF_VERSION_MINOR}.${DF_VERSION_PATCH}-r${DFHACK_RELEASE}") set(DFHACK_VERSION "${DF_VERSION_MAJOR}.${DF_VERSION_MINOR}.${DF_VERSION_PATCH}-r${DFHACK_RELEASE}")
add_definitions(-DDFHACK_VERSION="${DFHACK_VERSION}") add_definitions(-DDFHACK_VERSION="${DFHACK_VERSION}")

@ -110,9 +110,10 @@ tl;dr: You will end up with changing quite big areas in one go, especially if yo
Options Options
------- -------
:all_biomes: Change layer for all biomes on your map. :all_biomes: Change selected layer for all biomes on your map.
Result may be undesirable since the same layer can AND WILL be on different z-levels for different biomes. Use the tool 'probe' to get an idea how layers and biomes are distributed on your map. Result may be undesirable since the same layer can AND WILL be on different z-levels for different biomes. Use the tool 'probe' to get an idea how layers and biomes are distributed on your map.
:all-layers: Change all layers on your map. Candy mountain, anyone? Will make your map quite boring, but tidy. :all_layers: Change all layers on your map (only for the selected biome unless 'all_biomes' is added).
Candy mountain, anyone? Will make your map quite boring, but tidy.
:force: Allow changing stone to soil and vice versa. !!THIS CAN HAVE WEIRD EFFECTS, USE WITH CARE!! :force: Allow changing stone to soil and vice versa. !!THIS CAN HAVE WEIRD EFFECTS, USE WITH CARE!!
Note that soil will not be magically replaced with stone. You will, however, get a stone floor after digging so it will allow the floor to be engraved. Note that soil will not be magically replaced with stone. You will, however, get a stone floor after digging so it will allow the floor to be engraved.
Note that stone will not be magically replaced with soil. You will, however, get a soil floor after digging so it could be helpful for creating farm plots on maps with no soil. Note that stone will not be magically replaced with soil. You will, however, get a soil floor after digging so it could be helpful for creating farm plots on maps with no soil.
@ -121,23 +122,27 @@ Options
Examples: Examples:
--------- ---------
``changelayer GRANITE`` : Convert layer at cursor position into granite. ``changelayer GRANITE``
``changelayer SILTY_CLAY force`` : Convert layer at cursor position into clay even if it's stone. Convert layer at cursor position into granite.
``changelayer MARBLE all_biomes all_layers`` : Convert all layers of all biomes which are not soil into marble. ``changelayer SILTY_CLAY force``
Convert layer at cursor position into clay even if it's stone.
``changelayer MARBLE all_biomes all_layers``
Convert all layers of all biomes which are not soil into marble.
.. note:: .. Notes::
* If you use changelayer and nothing happens, try to pause/unpause the game for a while and try to move the cursor to another tile. * If you use changelayer and nothing happens, try to pause/unpause the game for a while and try to move the cursor to another tile. Then try again. If that doesn't help try temporarily changing some other layer, undo your changes and try again for the layer you want to change. Saving and reloading your map might also help.
* You should be fine if you only change single layers without the use of 'force'. Still it's advisable to save your game before messing with the map. * You should be fine if you only change single layers without the use of 'force'. Still it's advisable to save your game before messing with the map.
* When you force changelayer to convert soil to stone you might experience weird stuff (flashing tiles, tiles changed all over the map, ...). Try reverting the changes manually or even better use an older savegame. You did save your game, right? * When you force changelayer to convert soil to stone you might experience weird stuff (flashing tiles, tiles changed all over place etc). Try reverting the changes manually or even better use an older savegame. You did save your game, right?
changevein changevein
========== ==========
Changes material of the vein under cursor to the specified inorganic RAW material. Changes material of the vein under cursor to the specified inorganic RAW material.
Example: Example:
--------- --------
``changevein NATIVE_PLATINUM`` : Convert vein at cursor position into platinum ore. ``changevein NATIVE_PLATINUM``
Convert vein at cursor position into platinum ore.
cursecheck cursecheck
========== ==========
@ -157,14 +162,10 @@ Options
Examples: Examples:
--------- ---------
Check one single map tile if one of the creatures on it is cursed (in-game cursor required): ``cursecheck detail all``
* cursecheck Give detailed info about all cursed creatures including deceased ones (no in-game cursor).
Count all active cursed creatures who roam around on your map (no in-game cursor) without giving more details: ``cursecheck nick``
* cursecheck Give a nickname all living/active cursed creatures on the map(no in-game cursor).
Give detailed info about all cursed creatures including deceased ones (no in-game cursor):
* cursecheck detail all
Give a nickname all living/active cursed creatures on the map(no in-game cursor):
* cursecheck nick
.. note:: .. note::
@ -434,7 +435,7 @@ When multiple commands are bound to the same key combination, DFHack selects the
liquids liquids
======= =======
Allows adding magma, water and obsidian to the game. It replaces the normal dfhack command line and can't be used from a hotkey. Settings will be remembered as long as dfhack runs. Intended for use in combination with the command liquidsgo-here (which can be bound to a hotkey). Allows adding magma, water and obsidian to the game. It replaces the normal dfhack command line and can't be used from a hotkey. Settings will be remembered as long as dfhack runs. Intended for use in combination with the command liquids-here (which can be bound to a hotkey).
For more information, refer to the command's internal help. For more information, refer to the command's internal help.
.. note:: .. note::
@ -444,7 +445,7 @@ For more information, refer to the command's internal help.
liquids-here liquids-here
============ ============
Run the liquid spawner with the current/last settings made in liquidsgo (if no settings in liquidsgo were made it paints a point of 7/7 magma by default). Run the liquid spawner with the current/last settings made in liquids (if no settings in liquids were made it paints a point of 7/7 magma by default).
Intended to be used as keybinding. Requires an active in-game cursor. Intended to be used as keybinding. Requires an active in-game cursor.
mode mode

@ -972,6 +972,7 @@ int Core::UnicodeAwareSym(const SDL::KeyboardEvent& ke)
{ {
// Assume keyboard layouts don't change the order of numbers: // Assume keyboard layouts don't change the order of numbers:
if( '0' <= ke.ksym.sym && ke.ksym.sym <= '9') return ke.ksym.sym; if( '0' <= ke.ksym.sym && ke.ksym.sym <= '9') return ke.ksym.sym;
if(SDL::K_F1 <= ke.ksym.sym && ke.ksym.sym <= SDL::K_F12) return ke.ksym.sym;
int unicode = ke.ksym.unicode; int unicode = ke.ksym.unicode;

@ -1,4 +1,4 @@
/* /*
https://github.com/peterix/dfhack https://github.com/peterix/dfhack
Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com) Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com)
@ -168,10 +168,16 @@ static void autovivify_ptr(lua_State *state, int fname_idx, void **pptr,
{ {
lua_getfield(state, val_index, "new"); lua_getfield(state, val_index, "new");
if (!lua_isnil(state, -1)) // false or nil => bail out
if (!lua_toboolean(state, -1))
field_error(state, fname_idx, "null and autovivify not requested", "write");
// not 'true' => call df.new()
if (!lua_isboolean(state, -1))
{ {
int top = lua_gettop(state); int top = lua_gettop(state);
// Verify new points to a reasonable type of object
type_identity *suggested = get_object_identity(state, top, "autovivify", true, true); type_identity *suggested = get_object_identity(state, top, "autovivify", true, true);
if (!is_type_compatible(state, target, 0, suggested, top+1, false)) if (!is_type_compatible(state, target, 0, suggested, top+1, false))
@ -179,17 +185,22 @@ static void autovivify_ptr(lua_State *state, int fname_idx, void **pptr,
lua_pop(state, 1); lua_pop(state, 1);
// Invoke df.new()
lua_getfield(state, LUA_REGISTRYINDEX, DFHACK_NEW_NAME); lua_getfield(state, LUA_REGISTRYINDEX, DFHACK_NEW_NAME);
lua_swap(state); lua_swap(state);
lua_call(state, 1, 1); lua_call(state, 1, 1);
// Retrieve the pointer
void *nval = get_object_internal(state, target, top, false); void *nval = get_object_internal(state, target, top, false);
// shouldn't happen: this means suggested type is compatible,
// but its new() result isn't for some reason.
if (!nval) if (!nval)
field_error(state, fname_idx, "inconsistent autovivify type", "write"); field_error(state, fname_idx, "inconsistent autovivify type", "write");
*pptr = nval; *pptr = nval;
} }
// otherwise use the target type
else else
{ {
if (!target) if (!target)

@ -1,4 +1,4 @@
/* /*
https://github.com/peterix/dfhack https://github.com/peterix/dfhack
Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com) Copyright (c) 2009-2011 Petr Mrázek (peterix@gmail.com)
@ -616,20 +616,32 @@ static void invoke_resize(lua_State *state, int table, lua_Integer size)
lua_call(state, 2, 0); lua_call(state, 2, 0);
} }
static void copy_table(lua_State *state, int dest, int src, int skipkey) static void copy_table(lua_State *state, int dest, int src, int skipbase)
{ {
// stack: (skipbase) skipkey skipkey |
int top = lua_gettop(state);
lua_pushnil(state); lua_pushnil(state);
while (lua_next(state, src)) while (lua_next(state, src))
{ {
if (lua_equal(state, -2, skipkey)) for (int i = skipbase+1; i <= top; i++)
lua_pop(state, 1); {
else if (lua_rawequal(state, -2, i))
{
lua_pop(state, 1);
goto next_outer;
}
}
{ {
lua_pushvalue(state, -2); lua_pushvalue(state, -2);
lua_swap(state); lua_swap(state);
lua_settable(state, dest); lua_settable(state, dest);
} }
next_outer:;
} }
} }
@ -655,18 +667,40 @@ static int meta_assign(lua_State *state)
{ {
type_identity *id = get_object_identity(state, 1, "df.assign()", false); type_identity *id = get_object_identity(state, 1, "df.assign()", false);
int base = lua_gettop(state);
// x:assign{ assign = foo } => x:assign(foo)
bool has_assign = false;
lua_pushstring(state, "assign");
lua_dup(state);
lua_rawget(state, 2);
if (!lua_isnil(state,-1))
{
has_assign = true;
lua_getfield(state, LUA_REGISTRYINDEX, DFHACK_ASSIGN_NAME);
lua_pushvalue(state, 1);
lua_pushvalue(state, base+2);
lua_call(state, 2, 0);
}
lua_pop(state, 1);
// new is used by autovivification and should be skipped
lua_pushstring(state, "new");
if (id->isContainer()) if (id->isContainer())
{ {
// check resize field
lua_pushstring(state, "resize"); lua_pushstring(state, "resize");
int resize_str = lua_gettop(state);
lua_dup(state); lua_dup(state);
lua_rawget(state, 2); lua_rawget(state, 2);
if (lua_isnil(state,-1)) if (lua_isnil(state,-1) && !has_assign)
{ {
/* /*
* nil or missing resize field => 1-based lua array * no assign && nil or missing resize field => 1-based lua array
*/ */
int size = lua_objlen(state, 2); int size = lua_objlen(state, 2);
@ -682,7 +716,7 @@ static int meta_assign(lua_State *state)
} }
else else
{ {
if (lua_isboolean(state, -1)) if (lua_isboolean(state, -1) || lua_isnil(state, -1))
{ {
// resize=false => just assign // resize=false => just assign
// resize=true => find the largest index // resize=true => find the largest index
@ -711,13 +745,13 @@ static int meta_assign(lua_State *state)
} }
lua_pop(state, 1); lua_pop(state, 1);
copy_table(state, 1, 2, resize_str); copy_table(state, 1, 2, base);
} }
} }
else else
{ {
lua_pushstring(state, "new");
copy_table(state, 1, 2, lua_gettop(state)); copy_table(state, 1, 2, base);
} }
} }

@ -1 +1 @@
Subproject commit b41c666c6be6fe18906a98dababdc4ff681b8382 Subproject commit 1b1fe798e553cf0ed309606f32b8448bb96b30c8

@ -90,6 +90,7 @@ if (BUILD_SUPPORTED)
DFHACK_PLUGIN(fixpositions fixpositions.cpp) DFHACK_PLUGIN(fixpositions fixpositions.cpp)
DFHACK_PLUGIN(follow follow.cpp) DFHACK_PLUGIN(follow follow.cpp)
DFHACK_PLUGIN(changevein changevein.cpp) DFHACK_PLUGIN(changevein changevein.cpp)
DFHACK_PLUGIN(changelayer changelayer.cpp)
DFHACK_PLUGIN(advtools advtools.cpp) DFHACK_PLUGIN(advtools advtools.cpp)
DFHACK_PLUGIN(tweak tweak.cpp) DFHACK_PLUGIN(tweak tweak.cpp)
DFHACK_PLUGIN(feature feature.cpp) DFHACK_PLUGIN(feature feature.cpp)
@ -104,10 +105,3 @@ OPTION(BUILD_SKELETON "Build the skeleton plugin." OFF)
if(BUILD_SKELETON) if(BUILD_SKELETON)
add_subdirectory(skeleton) add_subdirectory(skeleton)
endif() endif()
# this is the changelayer plugin.
OPTION(BUILD_CHANGELAYER "Build the changelayer plugin." ON)
if(BUILD_CHANGELAYER)
add_subdirectory(changelayer)
endif()

@ -802,7 +802,6 @@ DFhackCExport command_result plugin_onupdate ( color_ostream &out )
} }
// Idle dwarves come first, then we sort from least-skilled to most-skilled. // Idle dwarves come first, then we sort from least-skilled to most-skilled.
std::sort(hauler_ids.begin(), hauler_ids.end(), [&dwarf_info] (int i, int j) -> bool std::sort(hauler_ids.begin(), hauler_ids.end(), [&dwarf_info] (int i, int j) -> bool
{ {
if (dwarf_info[i].state == IDLE && dwarf_info[j].state != IDLE) if (dwarf_info[i].state == IDLE && dwarf_info[j].state != IDLE)
@ -812,6 +811,11 @@ DFhackCExport command_result plugin_onupdate ( color_ostream &out )
return dwarf_info[i].mastery_penalty > dwarf_info[j].mastery_penalty; return dwarf_info[i].mastery_penalty > dwarf_info[j].mastery_penalty;
}); });
// don't set any haulers if everyone is off drinking or something
if (hauler_ids.size() == 0) {
num_haulers = 0;
}
FOR_ENUM_ITEMS(unit_labor, labor) FOR_ENUM_ITEMS(unit_labor, labor)
{ {
if (labor == df::enums::unit_labor::NONE) if (labor == df::enums::unit_labor::NONE)
@ -831,7 +835,6 @@ DFhackCExport command_result plugin_onupdate ( color_ostream &out )
assert(dwarf >= 0); assert(dwarf >= 0);
assert(dwarf < n_dwarfs); assert(dwarf < n_dwarfs);
dwarfs[dwarf]->status.labors[labor] = true; dwarfs[dwarf]->status.labors[labor] = true;
dwarf_info[dwarf].assigned_jobs++; dwarf_info[dwarf].assigned_jobs++;
} }
@ -848,7 +851,6 @@ DFhackCExport command_result plugin_onupdate ( color_ostream &out )
dwarfs[dwarf]->status.labors[labor] = false; dwarfs[dwarf]->status.labors[labor] = false;
} }
} }
return CR_OK; return CR_OK;
} }

@ -71,7 +71,9 @@ const string changelayer_help =
const string changelayer_trouble = const string changelayer_trouble =
"Known problems with changelayer:\n\n" "Known problems with changelayer:\n\n"
" Nothing happens, the material stays the old.\n" " Nothing happens, the material stays the old.\n"
" Try pausing/unpausing the game or moving the cursor a bit.\n\n" " Pause/unpause the game and/or move the cursor a bit. Then retry.\n"
" Try changing another layer, undo the changes and try again.\n"
" Try saving and loading the game.\n\n"
" Weird stuff happening after using the 'force' option.\n" " Weird stuff happening after using the 'force' option.\n"
" Change former stone layers back to stone, soil back to soil.\n" " Change former stone layers back to stone, soil back to soil.\n"
" If in doubt, use the 'probe' tool to find tiles with soil walls\n" " If in doubt, use the 'probe' tool to find tiles with soil walls\n"
@ -221,7 +223,7 @@ command_result changelayer (color_ostream &out, std::vector <std::string> & para
// 2) call ReadGeology here, modify the data in the vectors without having to do all that map stuff // 2) call ReadGeology here, modify the data in the vectors without having to do all that map stuff
// 3) write Maps::WriteGeology, pass the vectors, let it do it's work // 3) write Maps::WriteGeology, pass the vectors, let it do it's work
// Step 1) is optional, but it would make implementing 3) easier. // Step 1) is optional, but it would make implementing 3) easier.
// Otherwise that "check which geolayer is used by biome X" loop would need to be done again. // Otherwise that "check which geo_index is used by biome X" loop would need to be done again.
// no need to touch the same geology more than once // no need to touch the same geology more than once
// though it wouldn't matter much since there is not much data to be processed // though it wouldn't matter much since there is not much data to be processed
@ -291,7 +293,7 @@ command_result changelayer (color_ostream &out, std::vector <std::string> & para
vector <df::world_geo_layer*> &geolayers = geo_biome->layers; vector <df::world_geo_layer*> &geolayers = geo_biome->layers;
// complain if layer is out of range // complain if layer is out of range
// geology has up to 16 layers currently, but size can be < 15 sometimes! // geology has up to 16 layers currently, but can have less!
if(layer >= geolayers.size() || layer < 0) if(layer >= geolayers.size() || layer < 0)
{ {
if(verbose) if(verbose)
@ -379,7 +381,10 @@ bool conversionAllowed(color_ostream &out, MaterialInfo mat_new, MaterialInfo ma
{ {
if(force) if(force)
{ {
out << "You've been warned, good luck." << endl; if(!warned)
{
out << "You've been warned, good luck." << endl;
}
allowed = true; allowed = true;
} }
else else
@ -389,10 +394,11 @@ bool conversionAllowed(color_ostream &out, MaterialInfo mat_new, MaterialInfo ma
out << "Use the option 'force' if you REALLY want to do that." << endl out << "Use the option 'force' if you REALLY want to do that." << endl
<< "Weird things can happen with your map, so save your game before trying!" << endl << "Weird things can happen with your map, so save your game before trying!" << endl
<< "Example: 'changelayer GRANITE force'" << endl; << "Example: 'changelayer GRANITE force'" << endl;
warned = true;
} }
allowed = false; allowed = false;
} }
// avoid multiple warnings for the same stuff
warned = true;
} }
return allowed; return allowed;
} }

@ -1,32 +0,0 @@
PROJECT (changelayer)
# A list of source files
SET(PROJECT_SRCS
changelayer.cpp
)
# A list of headers
SET(PROJECT_HDRS
)
SET_SOURCE_FILES_PROPERTIES( ${PROJECT_HDRS} PROPERTIES HEADER_FILE_ONLY TRUE)
# mash them together (headers are marked as headers and nothing will try to compile them)
LIST(APPEND PROJECT_SRCS ${PROJECT_HDRS})
# option to use a thread for no particular reason
OPTION(CHANGELAYER_THREAD "Use threads in the changelayer plugin." ON)
#linux
IF(UNIX)
add_definitions(-DLINUX_BUILD)
SET(PROJECT_LIBS
# add any extra linux libs here
${PROJECT_LIBS}
)
# windows
ELSE(UNIX)
SET(PROJECT_LIBS
# add any extra linux libs here
${PROJECT_LIBS}
$(NOINHERIT)
)
ENDIF(UNIX)
# this makes sure all the stuff is put in proper places and linked to dfhack
DFHACK_PLUGIN(changelayer ${PROJECT_SRCS} LINK_LIBRARIES ${PROJECT_LIBS})