summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--library/include/DataDefs.h3
-rw-r--r--plugins/siege-engine.cpp5
2 files changed, 8 insertions, 0 deletions
diff --git a/library/include/DataDefs.h b/library/include/DataDefs.h
index 61d5dec4..0966c7f3 100644
--- a/library/include/DataDefs.h
+++ b/library/include/DataDefs.h
@@ -707,6 +707,9 @@ namespace DFHack {
// Global object pointers
#include "df/global_objects.h"
+#define DF_GLOBAL_VALUE(name,defval) (df::global::name ? *df::global::name : defval)
+#define DF_GLOBAL_FIELD(name,fname,defval) (df::global::name ? df::global::name->fname : defval)
+
// A couple of headers that have to be included at once
#include "df/coord2d.h"
#include "df/coord.h"
diff --git a/plugins/siege-engine.cpp b/plugins/siege-engine.cpp
index 2e362afe..7c880351 100644
--- a/plugins/siege-engine.cpp
+++ b/plugins/siege-engine.cpp
@@ -1573,6 +1573,8 @@ struct projectile_hook : df::proj_itemst {
if (next_pos.z == cur_pos.z && !isPassableTile(next_pos))
start_z = 49000;
+ bool forbid_ammo = DF_GLOBAL_VALUE(standing_orders_forbid_used_ammo, false);
+
MapExtras::MapCache mc;
std::vector<df::item*> contents;
Items::getContainedItems(item, &contents);
@@ -1581,6 +1583,9 @@ struct projectile_hook : df::proj_itemst {
{
auto child = contents[i];
+ if (forbid_ammo)
+ child->flags.bits.forbid = true;
+
// Liquids are vaporized so that they cover nearby units
if (child->isLiquid())
{