Below is an example of how you can add/modify a mob flag. After initially creating a new NOKILL flag I changed my mind and instead renamed NOBASH to NOKILL and added checks to prevent attacking and spell casting. The only thing I left out was protection from triggers.
Code:
Index: fight.c
===================================================================
--- fight.c (revision 197)
+++ fight.c (working copy)
@@ -682,8 +682,9 @@
return (0);
}
- /* shopkeeper protection */
- if (!ok_damage_shopkeeper(ch, victim))
+ /* shopkeeper and MOB_NOKILL protection */
+ if (!ok_damage_shopkeeper(ch, victim) || MOB_FLAGGED(victim, MOB_NOKILL)) {
+ send_to_char(ch, "This mob is protected.\r\n");
return (0);
+ }
/* You can't damage an immortal! */
Index: structs.h
===================================================================
--- structs.h (revision 197)
+++ structs.h (working copy)
@@ -181,44 +181,44 @@
#define MOB_NOSUMMON 14 /**< Mob can't be summoned */
#define MOB_NOSLEEP 15 /**< Mob can't be slept */
-#define MOB_NOBASH 16 /**< Mob can't be bashed (e.g. trees) */
+#define MOB_NOKILL 16 /**< Mob can't be bashed (e.g. trees) */
#define MOB_NOBLIND 17 /**< Mob can't be blinded */
#define MOB_NOTDEADYET 18 /**< (R) Mob being extracted */
/** Total number of Mob Flags; it should be 1 less than MOB_NOT_DEADYET */
Index: constants.c
===================================================================
--- constants.c (revision 197)
+++ constants.c (working copy)
@@ -187,7 +187,7 @@
"NO_CHARM",
"NO_SUMMN",
"NO_SLEEP",
- "NO_BASH",
+ "NO_KILL",
"NO_BLIND",
"DEAD", /* You should never see this. */
"\n"
Index: spell_parser.c
===================================================================
--- spell_parser.c (revision 200)
+++ spell_parser.c (working copy)
@@ -212,6 +212,10 @@
act("White light from no particular source suddenly fills the room, then va
nishes.", FALSE, caster, 0, 0, TO_ROOM);
return (0);
}
+ if (cvict && MOB_FLAGGED(cvict, MOB_NOKILL)) {
+ send_to_char(caster, "This mob is protected.\r\n");
+ return (0);
+ }
/* determine the type of saving throw */
switch (casttype) {
case CAST_STAFF:
Index: act.offensive.c
===================================================================
--- act.offensive.c (revision 197)
+++ act.offensive.c (working copy)
@@ -294,12 +294,13 @@
send_to_char(ch, "Aren't we funny today...\r\n");
return;
}
+ if (MOB_FLAGGED(vict, MOB_NOKILL)) {
+ send_to_char(ch, "This mob is protected.\r\n");
+ return;
+ }
percent = rand_number(1, 101); /* 101% is a complete failure */
prob = GET_SKILL(ch, SKILL_BASH);
- if (MOB_FLAGGED(vict, MOB_NOBASH))
- percent = 101;
-
if (percent > prob) {
damage(ch, vict, 0, SKILL_BASH);
GET_POS(ch) = POS_SITTING;