Improve net traps
authorNicholas Feinberg <pleasingfung@gmail.com>
Wed, 25 Nov 2020 02:37:53 +0000 (18:37 -0800)
committerNicholas Feinberg <pleasingfung@gmail.com>
Wed, 25 Nov 2020 02:44:03 +0000 (18:44 -0800)
Prior to this commit, net traps would fire exactly once, launching a
net that the player could use. After this, they'd be destroyed. This
encouraged the player to intentionally and methodically step on net
traps to 'disarm' them and to get net traps for their own use. Not
particularly interesting or fun gameplay!

Instead, make net traps permanent, and make their nets always mulch.
This will make life a bit harder for players in some places (Zot,
Tomb), but we can always adjust trap frequency as appropriate.

crawl-ref/source/dat/descript/features.txt
crawl-ref/source/traps.cc

index 2f4f059..8f27730 100644 (file)
@@ -640,8 +640,8 @@ A mechanical contraption that shoots poisoned needles.
 %%%%
 A net trap
 
-A large concealed net hanging from the dungeon's ceiling, enchanted by the
-powers of Zot to land only on intruders.
+A large concealed net launcher hanging from the dungeon's ceiling, enchanted
+by the powers of Zot to land only on intruders.
 %%%%
 A pressure plate
 
index 72f15bf..c0c4d0e 100644 (file)
@@ -49,6 +49,8 @@
 #include "travel.h"
 #include "xom.h"
 
+static const string TRAP_PROJECTILE_KEY = "trap_projectile";
+
 bool trap_def::active() const
 {
     return type != TRAP_UNASSIGNED;
@@ -719,8 +721,6 @@ void trap_def::trigger(actor& triggerer)
                     _mark_net_trapping(you.pos());
                 }
             }
-
-            trap_destroyed = true;
         }
         }
         break;
@@ -1056,24 +1056,26 @@ void mons_clear_trapping_net(monster* mon)
 void free_stationary_net(int item_index)
 {
     item_def &item = env.item[item_index];
-    if (item.is_type(OBJ_MISSILES, MI_THROWING_NET))
-    {
-        const coord_def pos = item.pos;
-        // Probabilistically mulch net based on damage done, otherwise
-        // reset damage counter (ie: item.net_durability).
-        if (x_chance_in_y(-item.net_durability, 9))
-            destroy_item(item_index);
-        else
-        {
-            item.net_durability = 0;
-            item.net_placed = false;
-        }
+    if (!item.is_type(OBJ_MISSILES, MI_THROWING_NET))
+        return;
 
-        // Make sure we don't leave a bad trapping net in the stash
-        // FIXME: may leak info if a monster escapes an out-of-sight net.
-        StashTrack.update_stash(pos);
-        StashTrack.unmark_trapping_nets(pos);
+    const coord_def pos = item.pos;
+    // Probabilistically mulch net based on damage done, otherwise
+    // reset damage counter (ie: item.net_durability).
+    const bool mulch = item.props.exists(TRAP_PROJECTILE_KEY)
+                    || x_chance_in_y(-item.net_durability, 9);
+    if (mulch)
+        destroy_item(item_index);
+    else
+    {
+        item.net_durability = 0;
+        item.net_placed = false;
     }
+
+    // Make sure we don't leave a bad trapping net in the stash
+    // FIXME: may leak info if a monster escapes an out-of-sight net.
+    StashTrack.update_stash(pos);
+    StashTrack.unmark_trapping_nets(pos);
 }
 
 void clear_trapping_net()
@@ -1124,6 +1126,9 @@ item_def trap_def::generate_trap_item()
     else
         set_item_ego_type(item, base, SPWPN_NORMAL);
 
+    // Make nets from net traps always mulch.
+    item.props[TRAP_PROJECTILE_KEY] = true;
+
     item_colour(item);
     return item;
 }