diff options
Diffstat (limited to 'library')
| -rw-r--r-- | library/LuaApi.cpp | 8 | ||||
| -rw-r--r-- | library/include/LuaTools.h | 5 | ||||
| -rw-r--r-- | library/include/modules/Items.h | 4 | ||||
| -rw-r--r-- | library/modules/Items.cpp | 45 | ||||
| -rw-r--r-- | library/modules/Maps.cpp | 2 | ||||
| -rw-r--r-- | library/modules/World.cpp | 6 | ||||
| m--------- | library/xml | 0 |
7 files changed, 68 insertions, 2 deletions
diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp index d39a945d..f69fa7a1 100644 --- a/library/LuaApi.cpp +++ b/library/LuaApi.cpp @@ -80,6 +80,7 @@ distribution. #include "df/region_map_entry.h" #include "df/flow_info.h" #include "df/unit_misc_trait.h" +#include "df/proj_itemst.h" #include <lua.h> #include <lauxlib.h> @@ -885,6 +886,12 @@ static bool items_moveToInventory return Items::moveToInventory(mc, item, unit, mode, body_part); } +static df::proj_itemst *items_makeProjectile(df::item *item) +{ + MapExtras::MapCache mc; + return Items::makeProjectile(mc, item); +} + static const LuaWrapper::FunctionReg dfhack_items_module[] = { WRAPM(Items, getGeneralRef), WRAPM(Items, getSpecificRef), @@ -896,6 +903,7 @@ static const LuaWrapper::FunctionReg dfhack_items_module[] = { WRAPN(moveToContainer, items_moveToContainer), WRAPN(moveToBuilding, items_moveToBuilding), WRAPN(moveToInventory, items_moveToInventory), + WRAPN(makeProjectile, items_makeProjectile), { NULL, NULL } }; diff --git a/library/include/LuaTools.h b/library/include/LuaTools.h index 6b1afb88..3330e23e 100644 --- a/library/include/LuaTools.h +++ b/library/include/LuaTools.h @@ -287,6 +287,11 @@ namespace DFHack {namespace Lua { PushDFObject(state, ptr); } + template<class T> inline void SetField(lua_State *L, T val, int idx, const char *name) { + if (idx < 0) idx = lua_absindex(L, idx); + Push(L, val); lua_setfield(L, idx, name); + } + template<class T> void PushVector(lua_State *state, const T &pvec, bool addn = false) { diff --git a/library/include/modules/Items.h b/library/include/modules/Items.h index 4236f068..7493d22f 100644 --- a/library/include/modules/Items.h +++ b/library/include/modules/Items.h @@ -44,6 +44,7 @@ distribution. namespace df { struct itemdef; + struct proj_itemst; } namespace MapExtras { @@ -155,5 +156,8 @@ DFHACK_EXPORT bool moveToContainer(MapExtras::MapCache &mc, df::item *item, df:: DFHACK_EXPORT bool moveToBuilding(MapExtras::MapCache &mc, df::item *item, df::building_actual *building,int16_t use_mode); DFHACK_EXPORT bool moveToInventory(MapExtras::MapCache &mc, df::item *item, df::unit *unit, df::unit_inventory_item::T_mode mode = df::unit_inventory_item::Carried, int body_part = -1); + +/// Detaches the items from its current location and turns it into a projectile +DFHACK_EXPORT df::proj_itemst *makeProjectile(MapExtras::MapCache &mc, df::item *item); } } diff --git a/library/modules/Items.cpp b/library/modules/Items.cpp index dc64143c..751797f0 100644 --- a/library/modules/Items.cpp +++ b/library/modules/Items.cpp @@ -72,8 +72,11 @@ using namespace std; #include "df/general_ref_contains_itemst.h" #include "df/general_ref_contained_in_itemst.h" #include "df/general_ref_building_holderst.h" +#include "df/general_ref_projectile.h" #include "df/viewscreen_itemst.h" #include "df/vermin.h" +#include "df/proj_itemst.h" +#include "df/proj_list_link.h" #include "df/unit_inventory_item.h" #include "df/body_part_raw.h" @@ -88,6 +91,7 @@ using namespace df::enums; using df::global::world; using df::global::ui; using df::global::ui_selected_unit; +using df::global::proj_next_id; #define ITEMDEF_VECTORS \ ITEM(WEAPON, weapons, itemdef_weaponst) \ @@ -866,3 +870,44 @@ bool DFHack::Items::moveToInventory( return true; } + +df::proj_itemst *Items::makeProjectile(MapExtras::MapCache &mc, df::item *item) +{ + CHECK_NULL_POINTER(item); + + if (!world || !proj_next_id) + return NULL; + + auto pos = getPosition(item); + if (!pos.isValid()) + return NULL; + + auto ref = df::allocate<df::general_ref_projectile>(); + if (!ref) + return NULL; + + if (!detachItem(mc, item)) + { + delete ref; + return NULL; + } + + item->pos = pos; + item->flags.bits.in_job = true; + + auto proj = new df::proj_itemst(); + proj->link = new df::proj_list_link(); + proj->link->item = proj; + proj->id = (*proj_next_id)++; + + proj->origin_pos = proj->target_pos = pos; + proj->cur_pos = proj->prev_pos = pos; + proj->item = item; + + ref->projectile_id = proj->id; + item->itemrefs.push_back(ref); + + linked_list_append(&world->proj_list, proj->link); + + return proj; +} diff --git a/library/modules/Maps.cpp b/library/modules/Maps.cpp index d0401164..f1f40f19 100644 --- a/library/modules/Maps.cpp +++ b/library/modules/Maps.cpp @@ -307,7 +307,7 @@ df::feature_init *Maps::getLocalInitFeature(df::coord2d rgn_pos, int32_t index) df::coord2d bigregion = rgn_pos / 16; // bigregion is 16x16 regions. for each bigregion in X dimension: - auto fptr = data->unk_204[bigregion.x][bigregion.y].features; + auto fptr = data->feature_map[bigregion.x][bigregion.y].features; if (!fptr) return NULL; diff --git a/library/modules/World.cpp b/library/modules/World.cpp index e14aa02a..67b8c123 100644 --- a/library/modules/World.cpp +++ b/library/modules/World.cpp @@ -300,6 +300,8 @@ PersistentDataItem World::GetPersistentData(const std::string &key, bool *added) void World::GetPersistentData(std::vector<PersistentDataItem> *vec, const std::string &key, bool prefix) { + vec->clear(); + if (!BuildPersistentCache()) return; @@ -343,8 +345,10 @@ bool World::DeletePersistentData(const PersistentDataItem &item) auto eqrange = d->persistent_index.equal_range(item.key_value); - for (auto it = eqrange.first; it != eqrange.second; ++it) + for (auto it2 = eqrange.first; it2 != eqrange.second; ) { + auto it = it2; ++it2; + if (it->second != -item.id) continue; diff --git a/library/xml b/library/xml -Subproject d55f1cf43dd71d3abee724bfa88a0a401b4ccaa +Subproject 2bc8fbdf71143398817d31e06e169a01cce37c5 |
