--- orig/rpggame/rpgobjset.h
+++ mod/rpggame/rpgobjset.h
@@ -53,6 +53,7 @@
         CCOMMAND(r_quest,       "ss",  (rpgobjset *self, char *s, char *a), { self->stack[0]->addaction(self->stringpool(s), self->stringpool(a), true); });
         CCOMMAND(r_action,      "ss",  (rpgobjset *self, char *s, char *a), { self->stack[0]->addaction(self->stringpool(s), self->stringpool(a), false); });
         CCOMMAND(r_action_use,  "s",   (rpgobjset *self, char *s), { self->stack[0]->action_use.script = self->stringpool(s); });
+        CCOMMAND(r_del_action,  "s",   (rpgobjset *self, char *s), { self->stack[0]->delaction(s); });
         CCOMMAND(r_take,        "sssi",(rpgobjset *self, char *name, char *ok, char *notok, int *silent), { self->takefromplayer(name, ok, notok, *silent); });
         CCOMMAND(r_give,        "si",  (rpgobjset *self, char *s, int *silent), { self->givetoplayer(s, *silent); });
         CCOMMAND(r_use,         "",    (rpgobjset *self), { self->stack[0]->selectuse(); });
--- orig/rpggame/rpgobj.h
+++ mod/rpggame/rpgobj.h
@@ -174,6 +174,25 @@
         if(startquest) os.addquest(actions, abovetext, name);
     }
 
+    void delaction(char *initiate)
+    {
+        rpgaction *prev = NULL, *a;
+
+        for(a = actions; a; a = a->next)
+        {
+            if(strcmp(a->initiate, initiate)==0) break;
+            prev = a;
+        }
+        if (!a) return;
+        if (prev) prev->next = a->next;
+        else actions = a->next;
+        // don't modify a->next since it's needed in guiaction
+
+        // only deactivate, don't really delete since it'd open a large can of worms
+        // stored objects are contained in string pool anyway, so it wouldn't make
+        // much of a difference
+    }
+
     void droploot()
     {
         loopinventorytype(IF_LOOT)
