diff -BbuprN -x '*.0' srcbak/act.wizard.c src/act.wizard.c
--- srcbak/act.wizard.c	2004-09-27 15:02:36.000000000 -0400
+++ src/act.wizard.c	2004-09-27 15:06:06.000000000 -0400
@@ -64,6 +64,7 @@ struct char_data *find_char(int n);
 SPECIAL(shop_keeper);
 void Crash_rentsave(struct char_data * ch, int cost);
 void show_guild(struct char_data * ch, char *arg);
+struct spell_info_type spell_info[];
 
 /* local functions */
 int perform_set(struct char_data *ch, struct char_data *vict, int mode, char *val_arg);
@@ -528,6 +529,12 @@ void do_stat_room(struct char_data *ch)
   sprintbitarray(rm->room_flags, room_bits, RF_ARRAY_MAX, buf2);
   send_to_char(ch, "SpecProc: %s, Flags: %s\r\n", rm->func == NULL ? "None" : "Exists", buf2);
 
+  send_to_char(ch, "Room has these Anti-spell affects: [&G%-10.5s&n] [&G%-10.5s&n] [&G%-10.5s&n] [&G%-10.5s&n]\r\n",
+                    (rm->value[0] < 1) ? "none" : spell_info[rm->value[0]].name,
+                    (rm->value[1] < 1) ? "none" : spell_info[rm->value[1]].name,
+                    (rm->value[2] < 1) ? "none" : spell_info[rm->value[2]].name,
+                    (rm->value[3] < 1) ? "none" : spell_info[rm->value[3]].name);
+
   send_to_char(ch, "Description:\r\n%s", rm->description ? rm->description : "  None.\r\n");
 
   if (rm->ex_description) {
diff -BbuprN -x '*.0' srcbak/constants.c src/constants.c
--- srcbak/constants.c	2004-09-27 15:02:36.000000000 -0400
+++ src/constants.c	2004-09-27 15:35:49.000000000 -0400
@@ -119,6 +119,7 @@ const char *room_bits[] = {
   "UNDERGROUND",
   "CURRENT",
   "TIMED_DT",
+  "ANTI_SPELL",
   "\n"
 };
 
diff -BbuprN -x '*.0' srcbak/db.c src/db.c
--- srcbak/db.c	2004-09-27 15:02:36.000000000 -0400
+++ src/db.c	2004-09-27 15:18:33.000000000 -0400
@@ -1099,7 +1099,7 @@ void parse_room(FILE *fl, int virtual_nr
     exit(1);
   }
  
-  if (((retval = sscanf(line, " %d %s %s %s %s %d ", t, flags, flags2, flags3, flags4, t + 2)) == 3) && (bitwarning == TRUE)) {
+  if (((retval = sscanf(line, " %d %s %s %s %s %d %d %d %d %d ", t, flags, flags2, flags3, flags4, t + 2, t + 3, t + 4, t + 5, t + 6)) == 3) && (bitwarning == TRUE)) {
     log("WARNING: Conventional worldfiles detected. Please read 128bit.readme.");
     exit(1);
   } else if ((retval == 3) && (bitwarning == FALSE)) {
@@ -1138,6 +1138,26 @@ void parse_room(FILE *fl, int virtual_nr
   world[room_nr].room_flags[3] = asciiflag_conv(flags4);
 
   world[room_nr].sector_type = t[2];
+  world[room_nr].value[0]    = -1; 
+  world[room_nr].value[1]    = -1; 
+  world[room_nr].value[2]    = -1; 
+  world[room_nr].value[3]    = -1;
+  sprintf(flags, "object #%d", virtual_nr);	/* sprintf: OK (until 399-bit integers) */
+  for(taeller=0; taeller < AF_ARRAY_MAX; taeller++) 
+    check_bitvector_names(world[room_nr].room_flags[taeller], room_bits_count, flags, "room");
+ } else if (retval == 10) {
+    int taeller;
+
+  world[room_nr].room_flags[0] = asciiflag_conv(flags);
+  world[room_nr].room_flags[1] = asciiflag_conv(flags2);
+  world[room_nr].room_flags[2] = asciiflag_conv(flags3);
+  world[room_nr].room_flags[3] = asciiflag_conv(flags4);
+
+  world[room_nr].sector_type = t[2];
+  world[room_nr].value[0]    = t[7]; 
+  world[room_nr].value[1]    = t[8]; 
+  world[room_nr].value[2]    = t[9]; 
+  world[room_nr].value[3]    = t[10];
   sprintf(flags, "object #%d", virtual_nr);	/* sprintf: OK (until 399-bit integers) */
   for(taeller=0; taeller < AF_ARRAY_MAX; taeller++) 
     check_bitvector_names(world[room_nr].room_flags[taeller], room_bits_count, flags, "room");
diff -BbuprN -x '*.0' srcbak/genwld.c src/genwld.c
--- srcbak/genwld.c	2004-09-27 15:02:36.000000000 -0400
+++ src/genwld.c	2004-09-27 15:19:52.000000000 -0400
@@ -338,12 +338,14 @@ int save_rooms(zone_rnum rzone)
       fprintf(sf, 	"#%d\n"
 			"%s%c\n"
 			"%s%c\n"
-                        "%d %s %s %s %s %d\n",
+                        "%d %s %s %s %s %d %d %d %d %d\n",
 		room->number,
 		room->name ? room->name : "Untitled", STRING_TERMINATOR,
 		buf, STRING_TERMINATOR,
 		zone_table[room->zone].number, 
                 rbuf1, rbuf2, rbuf3, rbuf4, room->sector_type
+                room->value[0], room->value[1], room->value[2],
+                room->value[3], room->room_affections
       );
 
       /*
diff -BbuprN -x '*.0' srcbak/oasis.h src/oasis.h
--- srcbak/oasis.h	2004-09-27 15:02:36.000000000 -0400
+++ src/oasis.h	2004-09-27 15:27:35.000000000 -0400
@@ -277,6 +277,10 @@ extern const char *nrm, *grn, *cyn, *yel
 #define REDIT_EXTRADESC_KEY 		15
 #define REDIT_EXTRADESC_DESCRIPTION 	16
 #define REDIT_DELETE			17
+#define REDIT_VALUE_0                   18
+#define REDIT_VALUE_1                   19
+#define REDIT_VALUE_2                   20
+#define REDIT_VALUE_3                   21
 
 /*
  * Submodes of ZEDIT connectedness.
@@ -524,6 +528,11 @@ void redit_disp_sector_menu(struct descr
 void redit_disp_menu(struct descriptor_data *d);
 void redit_parse(struct descriptor_data *d, char *arg);
 void free_room(struct room_data *room);
+void redit_disp_spell_menu(struct descriptor_data *d);
+void redit_disp_value0(struct descriptor_data *d);
+void redit_disp_value1(struct descriptor_data *d);
+void redit_disp_value2(struct descriptor_data *d);
+void redit_disp_value3(struct descriptor_data *d);
 ACMD(do_oasis_redit);
 
 void sedit_setup_new(struct descriptor_data *d);
diff -BbuprN -x '*.0' srcbak/redit.c src/redit.c
--- srcbak/redit.c	2004-09-27 15:02:36.000000000 -0400
+++ src/redit.c	2004-09-27 15:25:45.000000000 -0400
@@ -21,6 +21,7 @@
 #include "improved-edit.h"
 #include "dg_olc.h"
 #include "constants.h"
+#include "spells.h"
 
 /*------------------------------------------------------------------------*/
 
@@ -35,6 +36,7 @@ extern const char *sector_types[];
 extern const char *exit_bits[];
 extern struct zone_data *zone_table;
 extern struct descriptor_data *descriptor_list;
+extern struct spell_info_type spell_info[];
 
 /*------------------------------------------------------------------------*/
 
@@ -416,6 +418,46 @@ void redit_disp_exit_flag_menu(struct de
   OLC_MODE(d) = REDIT_EXIT_DOORFLAGS;
 }
 
+void redit_disp_spell_menu(struct descriptor_data *d)
+{
+  int counter, columns = 0;
+
+  get_char_colors(d->character);
+  clear_screen(d);
+
+  for (counter = 1; counter < NUM_SPELLS; counter++) {
+    write_to_output(d, "%s%2d%s) %s%-20.20s %s", grn, counter, nrm, yel,
+		spell_info[counter].name, !(++columns % 3) ? "\r\n" : "");
+  }
+  write_to_output(d, "\r\n%sEnter spell choice (0 for none) : ", nrm);
+}
+
+
+void redit_disp_value0(struct descriptor_data *d)
+{
+  OLC_MODE(d) = REDIT_VALUE_0;
+  redit_disp_spell_menu(d);
+}
+
+void redit_disp_value1(struct descriptor_data *d)
+{
+  OLC_MODE(d) = REDIT_VALUE_1;
+  redit_disp_spell_menu(d);
+}
+
+void redit_disp_value2(struct descriptor_data *d)
+{
+  OLC_MODE(d) = REDIT_VALUE_2;
+  redit_disp_spell_menu(d);
+}
+
+void redit_disp_value3(struct descriptor_data *d)
+{
+  OLC_MODE(d) = REDIT_VALUE_3;
+  redit_disp_spell_menu(d);
+}
+
+
 /*
  * For room flags.
  */
@@ -482,7 +524,6 @@ void redit_disp_menu(struct descriptor_d
 	  "%sH%s) Extra descriptions menu\r\n"
 	  "%sX%s) Delete Room\r\n"
 	  "%sS%s) Script      : %s%s\r\n"
-	  "%sQ%s) Quit\r\n"
 	  "Enter choice : ",
 
 	  cyn, OLC_NUM(d), nrm,
@@ -530,6 +571,20 @@ void redit_disp_menu(struct descriptor_d
 	  grn, nrm,
           grn, nrm,
           grn, nrm, cyn, OLC_SCRIPT(d) ? "Set." : "Not Set.",
+	  );
+
+  write_to_output(d,
+          "%sV%s) Anti-spells value1: %-10.5s\r\n"
+          "               value2: %-10.5s\r\n"
+          "               value3: %-10.5s\r\n"
+          "               value4: %-10.5s\r\n"     
+	  "%sQ%s) Quit\r\n"
+	  "Enter choice : ",
+ 	  grn, nrm,
+ 	  room->value[0]  < 1 ? "None" : spell_info[room->value[0]].name,
+	  room->value[1]  < 1 ? "None" : spell_info[room->value[1]].name,
+	  room->value[2]  < 1 ? "None" : spell_info[room->value[2]].name,
+	  room->value[3]  < 1 ? "None" : spell_info[room->value[3]].name,
           grn, nrm
 	  );
 
@@ -686,6 +741,12 @@ void redit_parse(struct descriptor_data 
       OLC_SCRIPT_EDIT_MODE(d) = SCRIPT_MAIN_MENU;
       dg_script_menu(d);
       return;
+
+    case 'v':
+    case 'V':
+      redit_disp_value0(d);
+      break;
+
     default:
       write_to_output(d, "Invalid choice!");
       redit_disp_menu(d);
@@ -823,6 +884,61 @@ void redit_parse(struct descriptor_data 
     redit_disp_exit_menu(d);
     return;
 
+  case REDIT_VALUE_0:
+    number = atoi(arg);
+    if (number == 0){
+        redit_disp_menu(d); 
+        break;
+    } else if (number < 1 || number > NUM_SPELLS) {
+      write_to_output(d, "Thats not valid!\r\n");
+      redit_disp_spell_menu(d);
+    } else {
+        OLC_ROOM(d)->value[0] = number;
+        redit_disp_value1(d);
+      }        
+    return;
+
+  case REDIT_VALUE_1:
+    number = atoi(arg);
+    if (number == 0){
+        redit_disp_menu(d); 
+        break;
+    }else if (number < 1 || number > NUM_SPELLS) {
+      write_to_output(d, "Thats not valid!\r\n");
+      redit_disp_spell_menu(d);
+    } else {
+        OLC_ROOM(d)->value[1] = number;
+        redit_disp_value2(d);
+      }        
+    return;
+
+  case REDIT_VALUE_2:
+    number = atoi(arg);
+    if (number == 0){
+        redit_disp_menu(d); 
+        break;
+    }else if (number < 1 || number > NUM_SPELLS) {
+      write_to_output(d, "Thats not valid!\r\n");
+      redit_disp_spell_menu(d);
+    } else {
+        OLC_ROOM(d)->value[2] = number;
+        redit_disp_value3(d);
+      }        
+    return;
+
+  case REDIT_VALUE_3:
+    number = atoi(arg);
+    if (number == 0){
+        redit_disp_menu(d); 
+        break;
+    }else if (number < 1 || number > NUM_SPELLS) {
+      write_to_output(d, "Thats not valid!\r\n");
+      redit_disp_spell_menu(d);
+    } else 
+        OLC_ROOM(d)->value[3] = number;
+     return;
+
+
   case REDIT_EXIT_DOORFLAGS:
     number = atoi(arg);
     if (number < 0 || number > NUM_EXIT_FLAGS) {
diff -BbuprN -x '*.0' srcbak/spell_parser.c src/spell_parser.c
--- srcbak/spell_parser.c	2004-09-27 15:02:36.000000000 -0400
+++ src/spell_parser.c	2004-09-27 15:11:27.000000000 -0400
@@ -229,6 +229,13 @@ int call_magic(struct char_data *caster,
     act("White light from no particular source suddenly fills the room, then vanishes.", FALSE, caster, 0, 0, TO_ROOM);
     return (0);
   }
+  
+  if (ROOM_ANTISPELL(IN_ROOM(caster), 0) == spellnum || ROOM_ANTISPELL(IN_ROOM(caster), 1) == spellnum ||
+      ROOM_ANTISPELL(IN_ROOM(caster), 2) == spellnum || ROOM_ANTISPELL(IN_ROOM(caster), 3) == spellnum) {
+    send_to_char(caster, "The room seems to absorb your magic!\r\n");
+    act("The room absorbes $n's magic spell!", FALSE, caster, 0, 0, TO_ROOM);
+    return (0);
+  }      
   /* determine the type of saving throw */
   switch (casttype) {
   case CAST_STAFF:
diff -BbuprN -x '*.0' srcbak/spells.c src/spells.c
--- srcbak/spells.c	2004-09-27 15:02:36.000000000 -0400
+++ src/spells.c	2004-09-27 15:10:44.000000000 -0400
@@ -47,6 +47,13 @@ ASPELL(spell_create_water)
     return;
   /* level = MAX(MIN(level, LVL_IMPL), 1);	 - not used */
 
+  if (ROOM_ANTISPELL(IN_ROOM(victim), 0) == SPELL_CREATE_WATER || ROOM_ANTISPELL(IN_ROOM(victim), 1) == SPELL_CREATE_WATER ||
+      ROOM_ANTISPELL(IN_ROOM(victim), 2) == SPELL_CREATE_WATER || ROOM_ANTISPELL(IN_ROOM(victim), 3) == SPELL_CREATE_WATER) {
+    send_to_char(victim, "The room seems to absorb your magic!\r\n");
+    act("The room absorbes $n's magic spell!", FALSE, victim, 0, 0, TO_ROOM);
+    return;
+  }      
+
   if (GET_OBJ_TYPE(obj) == ITEM_DRINKCON) {
     if ((GET_OBJ_VAL(obj, 2) != LIQ_WATER) && (GET_OBJ_VAL(obj, 1) != 0)) {
       name_from_drinkcon(obj);
@@ -73,6 +80,13 @@ ASPELL(spell_recall)
   if (victim == NULL || IS_NPC(victim))
     return;
 
+  if (ROOM_ANTISPELL(IN_ROOM(victim), 0) == SPELL_WORD_OF_RECALL || ROOM_ANTISPELL(IN_ROOM(victim), 1) == SPELL_WORD_OF_RECALL ||
+      ROOM_ANTISPELL(IN_ROOM(victim), 2) == SPELL_WORD_OF_RECALL || ROOM_ANTISPELL(IN_ROOM(victim), 3) == SPELL_WORD_OF_RECALL) {
+    send_to_char(victim, "The room seems to absorb your magic!\r\n");
+    act("The room absorbes $n's magic spell!", FALSE, victim, 0, 0, TO_ROOM);
+    return;
+  }      
+
   act("$n disappears.", TRUE, victim, 0, 0, TO_ROOM);
   char_from_room(victim);
   char_to_room(victim, real_room(CONFIG_MORTAL_START));
@@ -91,6 +105,13 @@ ASPELL(spell_teleport)
   if (victim == NULL || IS_NPC(victim))
     return;
 
+  if (ROOM_ANTISPELL(IN_ROOM(ch), 0) == SPELL_TELEPORT || ROOM_ANTISPELL(IN_ROOM(ch), 1) == SPELL_TELEPORT ||
+      ROOM_ANTISPELL(IN_ROOM(ch), 2) == SPELL_TELEPORT || ROOM_ANTISPELL(IN_ROOM(ch), 3) == SPELL_TELEPORT) {
+    send_to_char(ch, "The room seems to absorb your magic!\r\n");
+    act("The room absorbes $n's magic spell!", FALSE, ch, 0, 0, TO_ROOM);
+    return;
+  }
+
   do {
     to_room = rand_number(0, top_of_world);
   } while (ROOM_FLAGGED(to_room, ROOM_PRIVATE | ROOM_DEATH | ROOM_GODROOM));
@@ -119,6 +140,13 @@ ASPELL(spell_summon)
     return;
   }
 
+  if (ROOM_ANTISPELL(IN_ROOM(ch), 0) == SPELL_SUMMON || ROOM_ANTISPELL(IN_ROOM(ch), 1) == SPELL_SUMMON ||
+      ROOM_ANTISPELL(IN_ROOM(ch), 2) == SPELL_SUMMON || ROOM_ANTISPELL(IN_ROOM(ch), 3) == SPELL_SUMMON) {
+    send_to_char(ch, "The room seems to absorb your magic!\r\n");
+    act("The room absorbes $n's magic spell!", FALSE, ch, 0, 0, TO_ROOM);
+    return;
+  }
+
   if (!CONFIG_PK_ALLOWED) {
     if (MOB_FLAGGED(victim, MOB_AGGRESSIVE)) {
       act("As the words escape your lips and $N travels\r\n"
@@ -180,6 +208,13 @@ ASPELL(spell_locate_object)
     return;
   }
   
+  if (ROOM_ANTISPELL(IN_ROOM(ch), 0) == SPELL_LOCATE_OBJECT || ROOM_ANTISPELL(IN_ROOM(ch), 1) == SPELL_LOCATE_OBJECT ||
+      ROOM_ANTISPELL(IN_ROOM(ch), 2) == SPELL_LOCATE_OBJECT || ROOM_ANTISPELL(IN_ROOM(ch), 3) == SPELL_LOCATE_OBJECT) {
+    send_to_char(ch, "The room seems to absorb your magic!\r\n");
+    act("The room absorbes $n's magic spell!", FALSE, ch, 0, 0, TO_ROOM);
+    return;
+  }
+  
   strlcpy(name, fname(obj->name), sizeof(name));
   j = level / 2;
 
@@ -216,6 +251,13 @@ ASPELL(spell_charm)
   if (victim == NULL || ch == NULL)
     return;
 
+  if (ROOM_ANTISPELL(IN_ROOM(ch), 0) == SPELL_CHARM || ROOM_ANTISPELL(IN_ROOM(ch), 1) == SPELL_CHARM ||
+      ROOM_ANTISPELL(IN_ROOM(ch), 2) == SPELL_CHARM || ROOM_ANTISPELL(IN_ROOM(ch), 3) == SPELL_CHARM){
+    send_to_char(ch, "The room seems to absorb your magic!\r\n");
+    act("The room absorbes $n's magic spell!", FALSE, ch, 0, 0, TO_ROOM);
+    return;
+  }
+
   if (victim == ch)
     send_to_char(ch, "You like yourself even better!\r\n");
   else if (!IS_NPC(victim) && !PRF_FLAGGED(victim, PRF_SUMMONABLE))
@@ -267,6 +309,13 @@ ASPELL(spell_identify)
   int i, found;
   size_t len;
 
+  if (ROOM_ANTISPELL(IN_ROOM(ch), 0) == SPELL_IDENTIFY || ROOM_ANTISPELL(IN_ROOM(ch), 1) == SPELL_IDENTIFY ||
+      ROOM_ANTISPELL(IN_ROOM(ch), 2) == SPELL_IDENTIFY || ROOM_ANTISPELL(IN_ROOM(ch), 3) == SPELL_IDENTIFY) {
+    send_to_char(ch, "The room seems to absorb your magic!\r\n");
+    act("The room absorbes $n's magic spell!", FALSE, ch, 0, 0, TO_ROOM);
+    return;
+  }
+
   if (obj) {
     char bitbuf[MAX_STRING_LENGTH];
 
@@ -362,6 +411,13 @@ ASPELL(spell_enchant_weapon)
   if (ch == NULL || obj == NULL)
     return;
 
+  if (ROOM_ANTISPELL(IN_ROOM(ch), 0) == SPELL_ENCHANT_WEAPON || ROOM_ANTISPELL(IN_ROOM(ch), 1) == SPELL_ENCHANT_WEAPON ||
+      ROOM_ANTISPELL(IN_ROOM(ch), 2) == SPELL_ENCHANT_WEAPON || ROOM_ANTISPELL(IN_ROOM(ch), 3) == SPELL_ENCHANT_WEAPON) {
+    send_to_char(ch, "The room seems to absorb your magic!\r\n");
+    act("The room absorbes $n's magic spell!", FALSE, ch, 0, 0, TO_ROOM);
+    return;
+  }
+
   /* Either already enchanted or not a weapon. */
   if (GET_OBJ_TYPE(obj) != ITEM_WEAPON || OBJ_FLAGGED(obj, ITEM_MAGIC))
     return;
@@ -402,6 +458,13 @@ ASPELL(spell_enchant_weapon)
 
 ASPELL(spell_detect_poison)
 {
+  if (ROOM_ANTISPELL(IN_ROOM(ch), 0) == SPELL_DETECT_POISON || ROOM_ANTISPELL(IN_ROOM(ch), 1) == SPELL_DETECT_POISON ||
+      ROOM_ANTISPELL(IN_ROOM(ch), 2) == SPELL_DETECT_POISON || ROOM_ANTISPELL(IN_ROOM(ch), 3) == SPELL_DETECT_POISON){
+    send_to_char(ch, "The room seems to absorb your magic!\r\n");
+    act("The room absorbes $n's magic spell!", FALSE, ch, 0, 0, TO_ROOM);
+    return;
+  }
+
   if (victim) {
     if (victim == ch) {
       if (AFF_FLAGGED(victim, AFF_POISON))
@@ -440,6 +503,13 @@ ASPELL(spell_portal)
   if (ch == NULL || victim == NULL)
     return;
 
+  if (ROOM_ANTISPELL(IN_ROOM(ch), 0) == SPELL_PORTAL || ROOM_ANTISPELL(IN_ROOM(ch), 1) == SPELL_PORTAL ||
+      ROOM_ANTISPELL(IN_ROOM(ch), 2) == SPELL_PORTAL || ROOM_ANTISPELL(IN_ROOM(ch), 3) == SPELL_PORTAL) {
+    send_to_char(ch, "The room seems to absorb your magic!\r\n");
+    act("The room absorbes $n's magic spell!", FALSE, ch, 0, 0, TO_ROOM);
+    return;
+  }
+
   /* create the portal */
   portal = read_object(portal_object, VIRTUAL);
   GET_OBJ_VAL(portal, 0) = GET_ROOM_VNUM(IN_ROOM(victim));
diff -BbuprN -x '*.0' srcbak/structs.h src/structs.h
--- srcbak/structs.h	2004-09-27 15:02:36.000000000 -0400
+++ src/structs.h	2004-09-27 15:04:17.000000000 -0400
@@ -103,6 +103,7 @@
 #define ROOM_UNDERGROUND 17  /* Room is below ground      */
 #define ROOM_CURRENT     18
 #define ROOM_TIMED_DT    19
+#define ROOM_ANTI_SPELL  20
 
 /* Exit info: used in room_data.dir_option.exit_info */
 #define EX_ISDOOR		(1 << 0)   /* Exit is a door		*/
@@ -877,6 +878,7 @@ struct room_data {
    struct extra_descr_data *ex_description; /* for examine/look       */
    struct room_direction_data *dir_option[NUM_OF_DIRS]; /* Directions */
    int room_flags[RF_ARRAY_MAX];   /* DEATH,DARK ... etc */
+   sh_int value[3];                 /* Anti room spells --Cunning        */
 
    struct trig_proto_list *proto_script; /* list of default triggers  */
    struct script_data *script;  /* script info for the object         */
diff -BbuprN -x '*.0' srcbak/utils.h src/utils.h
--- srcbak/utils.h	2004-09-27 15:02:36.000000000 -0400
+++ src/utils.h	2004-09-27 15:04:50.000000000 -0400
@@ -264,6 +264,7 @@ void	update_pos(struct char_data *victim
 	((room_vnum)(VALID_ROOM_RNUM(rnum) ? world[(rnum)].number : NOWHERE))
 #define GET_ROOM_SPEC(room) \
 	(VALID_ROOM_RNUM(room) ? world[(room)].func : NULL)
+#define ROOM_ANTISPELL(loc, val)  (world[(loc)].value[(val)])
 
 
 /* char utils ************************************************************/
