diff -puN normal/act.informative.c src/act.informative.c
--- normal/act.informative.c	2002-11-06 14:37:12.000000000 +0100
+++ src/act.informative.c	2002-11-07 16:12:20.000000000 +0100
@@ -427,7 +427,7 @@ void look_at_room(struct char_data *ch, 
   if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_ROOMFLAGS)) {
     char buf[MAX_STRING_LENGTH];
 
-    sprintbit(ROOM_FLAGS(IN_ROOM(ch)), room_bits, buf, sizeof(buf));
+    sprintbitarray(ROOM_FLAGS(IN_ROOM(ch)), room_bits, RF_ARRAY_MAX, buf);
     send_to_char(ch, "[%5d] %s [ %s]", GET_ROOM_VNUM(IN_ROOM(ch)), world[IN_ROOM(ch)].name, buf);
   } else
     send_to_char(ch, "%s", world[IN_ROOM(ch)].name);
@@ -1558,8 +1558,10 @@ ACMD(do_color)
     send_to_char(ch, "Usage: color { Off | Sparse | Normal | Complete }\r\n");
     return;
   }
-  REMOVE_BIT(PRF_FLAGS(ch), PRF_COLOR_1 | PRF_COLOR_2);
-  SET_BIT(PRF_FLAGS(ch), (PRF_COLOR_1 * (tp & 1)) | (PRF_COLOR_2 * (tp & 2) >> 1));
+  REMOVE_BIT_AR(PRF_FLAGS(ch), PRF_COLOR_1);
+  REMOVE_BIT_AR(PRF_FLAGS(ch), PRF_COLOR_2);
+  SET_BIT_AR(PRF_FLAGS(ch), (PRF_COLOR_1 * (tp & 1)));
+  SET_BIT_AR(PRF_FLAGS(ch), (PRF_COLOR_2 * (tp & 2) >> 1));
 
   send_to_char(ch, "Your %scolor%s is now %s.\r\n", CCRED(ch, C_SPR), CCNRM(ch, C_OFF), ctypes[tp]);
 }
diff -puN normal/act.item.c src/act.item.c
--- normal/act.item.c	2002-11-06 14:33:20.000000000 +0100
+++ src/act.item.c	2002-11-06 14:39:02.000000000 +0100
@@ -85,7 +85,7 @@ void perform_put(struct char_data *ch, s
 
     /* Yes, I realize this is strange until we have auto-equip on rent. -gg */
     if (OBJ_FLAGGED(obj, ITEM_NODROP) && !OBJ_FLAGGED(cont, ITEM_NODROP)) {
-      SET_BIT(GET_OBJ_EXTRA(cont), ITEM_NODROP);
+      SET_BIT_AR(GET_OBJ_EXTRA(cont), ITEM_NODROP);
       act("You get a strange feeling as you put $p in $P.", FALSE,
                 ch, obj, cont, TO_CHAR);
     } else
diff -puN normal/act.movement.c src/act.movement.c
--- normal/act.movement.c	2002-11-06 14:33:20.000000000 +0100
+++ src/act.movement.c	2002-11-06 14:39:28.000000000 +0100
@@ -758,7 +758,7 @@ ACMD(do_follow)
       }
       if (ch->master)
 	stop_follower(ch);
-      REMOVE_BIT(AFF_FLAGS(ch), AFF_GROUP);
+      REMOVE_BIT_AR(AFF_FLAGS(ch), AFF_GROUP);
       add_follower(ch, leader);
     }
   }
diff -puN normal/act.other.c src/act.other.c
--- normal/act.other.c	2002-11-06 14:33:20.000000000 +0100
+++ src/act.other.c	2002-11-07 14:34:10.000000000 +0100
@@ -183,14 +183,14 @@ ACMD(do_hide)
   send_to_char(ch, "You attempt to hide yourself.\r\n");
 
   if (AFF_FLAGGED(ch, AFF_HIDE))
-    REMOVE_BIT(AFF_FLAGS(ch), AFF_HIDE);
+    REMOVE_BIT_AR(AFF_FLAGS(ch), AFF_HIDE);
 
   percent = rand_number(1, 101);	/* 101% is a complete failure */
 
   if (percent > GET_SKILL(ch, SKILL_HIDE) + dex_app_skill[GET_DEX(ch)].hide)
     return;
 
-  SET_BIT(AFF_FLAGS(ch), AFF_HIDE);
+  SET_BIT_AR(AFF_FLAGS(ch), AFF_HIDE);
 }
 
 
@@ -370,7 +370,7 @@ int perform_group(struct char_data *ch, 
   if (AFF_FLAGGED(vict, AFF_GROUP) || !CAN_SEE(ch, vict))
     return (0);
 
-  SET_BIT(AFF_FLAGS(vict), AFF_GROUP);
+  SET_BIT_AR(AFF_FLAGS(vict), AFF_GROUP);
   if (ch != vict)
     act("$N is now a member of your group.", FALSE, ch, 0, vict, TO_CHAR);
   act("You are now a member of $n's group.", FALSE, ch, 0, vict, TO_VICT);
@@ -454,7 +454,7 @@ ACMD(do_group)
 	act("$N is no longer a member of your group.", FALSE, ch, 0, vict, TO_CHAR);
       act("You have been kicked out of $n's group!", FALSE, ch, 0, vict, TO_VICT);
       act("$N has been kicked out of $n's group!", FALSE, ch, 0, vict, TO_NOTVICT);
-      REMOVE_BIT(AFF_FLAGS(vict), AFF_GROUP);
+      REMOVE_BIT_AR(AFF_FLAGS(vict), AFF_GROUP);
     }
   }
 }
@@ -478,14 +478,14 @@ ACMD(do_ungroup)
     for (f = ch->followers; f; f = next_fol) {
       next_fol = f->next;
       if (AFF_FLAGGED(f->follower, AFF_GROUP)) {
-	REMOVE_BIT(AFF_FLAGS(f->follower), AFF_GROUP);
+	REMOVE_BIT_AR(AFF_FLAGS(f->follower), AFF_GROUP);
         act("$N has disbanded the group.", TRUE, f->follower, NULL, ch, TO_CHAR);
         if (!AFF_FLAGGED(f->follower, AFF_CHARM))
 	  stop_follower(f->follower);
       }
     }
 
-    REMOVE_BIT(AFF_FLAGS(ch), AFF_GROUP);
+    REMOVE_BIT_AR(AFF_FLAGS(ch), AFF_GROUP);
     send_to_char(ch, "You disband the group.\r\n");
     return;
   }
@@ -503,7 +503,7 @@ ACMD(do_ungroup)
     return;
   }
 
-  REMOVE_BIT(AFF_FLAGS(tch), AFF_GROUP);
+  REMOVE_BIT_AR(AFF_FLAGS(tch), AFF_GROUP);
 
   act("$N is no longer a member of your group.", FALSE, ch, 0, tch, TO_CHAR);
   act("You have been kicked out of $n's group!", FALSE, ch, 0, tch, TO_VICT);
@@ -745,28 +745,34 @@ ACMD(do_display)
   }
 
   if (!str_cmp(argument, "auto")) {
-    TOGGLE_BIT(PRF_FLAGS(ch), PRF_DISPAUTO);
+    TOGGLE_BIT_AR(PRF_FLAGS(ch), PRF_DISPAUTO);
     send_to_char(ch, "Auto prompt %sabled.\r\n", PRF_FLAGGED(ch, PRF_DISPAUTO) ? "en" : "dis");
     return;
   }
 
-  if (!str_cmp(argument, "on") || !str_cmp(argument, "all"))
-    SET_BIT(PRF_FLAGS(ch), PRF_DISPHP | PRF_DISPMANA | PRF_DISPMOVE);
-  else if (!str_cmp(argument, "off") || !str_cmp(argument, "none"))
-    REMOVE_BIT(PRF_FLAGS(ch), PRF_DISPHP | PRF_DISPMANA | PRF_DISPMOVE);
-  else {
-    REMOVE_BIT(PRF_FLAGS(ch), PRF_DISPHP | PRF_DISPMANA | PRF_DISPMOVE);
-
+  if (!str_cmp(argument, "on") || !str_cmp(argument, "all")) {
+    SET_BIT_AR(PRF_FLAGS(ch), PRF_DISPHP);
+    SET_BIT_AR(PRF_FLAGS(ch), PRF_DISPMANA);
+	SET_BIT_AR(PRF_FLAGS(ch), PRF_DISPMOVE);
+  } else if (!str_cmp(argument, "off") || !str_cmp(argument, "none")) {
+    REMOVE_BIT_AR(PRF_FLAGS(ch), PRF_DISPHP);
+    REMOVE_BIT_AR(PRF_FLAGS(ch), PRF_DISPMANA);
+	REMOVE_BIT_AR(PRF_FLAGS(ch), PRF_DISPMOVE);
+  } else {
+    REMOVE_BIT_AR(PRF_FLAGS(ch), PRF_DISPHP);
+    REMOVE_BIT_AR(PRF_FLAGS(ch), PRF_DISPMANA);
+	REMOVE_BIT_AR(PRF_FLAGS(ch), PRF_DISPMOVE);
+  
     for (i = 0; i < strlen(argument); i++) {
       switch (LOWER(argument[i])) {
       case 'h':
-	SET_BIT(PRF_FLAGS(ch), PRF_DISPHP);
+	SET_BIT_AR(PRF_FLAGS(ch), PRF_DISPHP);
 	break;
       case 'm':
-	SET_BIT(PRF_FLAGS(ch), PRF_DISPMANA);
+	SET_BIT_AR(PRF_FLAGS(ch), PRF_DISPMANA);
 	break;
       case 'v':
-	SET_BIT(PRF_FLAGS(ch), PRF_DISPMOVE);
+	SET_BIT_AR(PRF_FLAGS(ch), PRF_DISPMOVE);
 	break;
       default:
 	send_to_char(ch, "Usage: prompt { { H | M | V } | all | auto | none }\r\n");
@@ -843,8 +849,6 @@ ACMD(do_gen_write)
 #define TOG_OFF 0
 #define TOG_ON  1
 
-#define PRF_TOG_CHK(ch,flag) ((TOGGLE_BIT(PRF_FLAGS(ch), (flag))) & (flag))
-
 ACMD(do_gen_tog)
 {
   long /* bitvector_t */ result;
diff -puN normal/act.wizard.c src/act.wizard.c
--- normal/act.wizard.c	2002-11-06 14:33:42.000000000 +0100
+++ src/act.wizard.c	2002-11-07 14:50:02.000000000 +0100
@@ -387,7 +387,7 @@ void do_stat_room(struct char_data *ch)
 	  zone_table[rm->zone].number, CCGRN(ch, C_NRM), rm->number,
 	  CCNRM(ch, C_NRM), IN_ROOM(ch), buf2);
 
-  sprintbit(rm->room_flags, room_bits, buf2, sizeof(buf2));
+  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, "Description:\r\n%s", rm->description ? rm->description : "  None.\r\n");
@@ -482,13 +482,13 @@ void do_stat_object(struct char_data *ch
     send_to_char(ch, "%s\r\n", CCNRM(ch, C_NRM));
   }
 
-  sprintbit(GET_OBJ_WEAR(j), wear_bits, buf, sizeof(buf));
+  sprintbitarray(GET_OBJ_WEAR(j), wear_bits, TW_ARRAY_MAX, buf);
   send_to_char(ch, "Can be worn on: %s\r\n", buf);
 
-  sprintbit(GET_OBJ_AFFECT(j), affected_bits, buf, sizeof(buf));
+  sprintbitarray(GET_OBJ_AFFECT(j), affected_bits, AF_ARRAY_MAX, buf);
   send_to_char(ch, "Set char bits : %s\r\n", buf);
 
-  sprintbit(GET_OBJ_EXTRA(j), extra_bits, buf, sizeof(buf));
+  sprintbitarray(GET_OBJ_EXTRA(j), extra_bits, EF_ARRAY_MAX, buf);
   send_to_char(ch, "Extra flags   : %s\r\n", buf);
 
   sprintf(buf, "Weight: %d, Value: %d, Cost/day: %d, Timer: %d, Min Level: %d\r\n",
@@ -685,15 +685,15 @@ void do_stat_character(struct char_data 
   if (IS_NPC(k)) {
     sprinttype(k->mob_specials.default_pos, position_types, buf, sizeof(buf));
     send_to_char(ch, ", Default position: %s\r\n", buf);
-    sprintbit(MOB_FLAGS(k), action_bits, buf, sizeof(buf));
+    sprintbitarray(MOB_FLAGS(k), action_bits, PM_ARRAY_MAX, buf);
     send_to_char(ch, "NPC flags: %s%s%s\r\n", CCCYN(ch, C_NRM), buf, CCNRM(ch, C_NRM));
   } else {
     send_to_char(ch, ", Idle Timer (in tics) [%d]\r\n", k->char_specials.timer);
 
-    sprintbit(PLR_FLAGS(k), player_bits, buf, sizeof(buf));
+    sprintbitarray(PLR_FLAGS(k), player_bits, PM_ARRAY_MAX, buf);
     send_to_char(ch, "PLR: %s%s%s\r\n", CCCYN(ch, C_NRM), buf, CCNRM(ch, C_NRM));
 
-    sprintbit(PRF_FLAGS(k), preference_bits, buf, sizeof(buf));
+    sprintbitarray(PRF_FLAGS(k), preference_bits, PR_ARRAY_MAX, buf);
     send_to_char(ch, "PRF: %s%s%s\r\n", CCGRN(ch, C_NRM), buf, CCNRM(ch, C_NRM));
   }
 
@@ -730,7 +730,7 @@ void do_stat_character(struct char_data 
   }
 
   /* Showing the bitvector */
-  sprintbit(AFF_FLAGS(k), affected_bits, buf, sizeof(buf));
+  sprintbitarray(AFF_FLAGS(k), affected_bits, AF_ARRAY_MAX, buf);
   send_to_char(ch, "AFF: %s%s%s\r\n", CCYEL(ch, C_NRM), buf, CCNRM(ch, C_NRM));
 
   /* Routine to show what spells a char is affected by */
@@ -745,7 +745,7 @@ void do_stat_character(struct char_data 
 	if (aff->modifier)
 	  send_to_char(ch, ", ");
 
-	sprintbit(aff->bitvector, affected_bits, buf, sizeof(buf));
+	strcpy(buf, affected_bits[aff->bitvector]);
         send_to_char(ch, "sets %s", buf);
       }
       send_to_char(ch, "\r\n");
@@ -1247,8 +1247,10 @@ ACMD(do_syslog)
     send_to_char(ch, "Usage: syslog { Off | Brief | Normal | Complete }\r\n");
     return;
   }
-  REMOVE_BIT(PRF_FLAGS(ch), PRF_LOG1 | PRF_LOG2);
-  SET_BIT(PRF_FLAGS(ch), (PRF_LOG1 * (tp & 1)) | (PRF_LOG2 * (tp & 2) >> 1));
+  REMOVE_BIT_AR(PRF_FLAGS(ch), PRF_LOG1);
+  REMOVE_BIT_AR(PRF_FLAGS(ch), PRF_LOG2);
+  if (tp & 1) SET_BIT_AR(PRF_FLAGS(ch), PRF_LOG1);
+  if (tp & 2) SET_BIT_AR(PRF_FLAGS(ch), PRF_LOG2);
 
   send_to_char(ch, "Your syslog is now %s.\r\n", logtypes[tp]);
 }
@@ -1330,9 +1332,11 @@ ACMD(do_advance)
     /* If they are no longer an immortal, let's remove some of the
      * nice immortal only flags, shall we?
      */
-    REMOVE_BIT(PRF_FLAGS(victim), PRF_LOG1 | PRF_LOG2);
-    REMOVE_BIT(PRF_FLAGS(victim), PRF_NOHASSLE | PRF_HOLYLIGHT);
-    run_autowiz();
+  REMOVE_BIT_AR(PRF_FLAGS(ch), PRF_LOG1);
+  REMOVE_BIT_AR(PRF_FLAGS(ch), PRF_LOG2);
+  REMOVE_BIT_AR(PRF_FLAGS(ch), PRF_NOHASSLE);
+  REMOVE_BIT_AR(PRF_FLAGS(ch), PRF_HOLYLIGHT);
+  run_autowiz();
   }
 
   gain_exp_regardless(victim,
@@ -1825,6 +1829,7 @@ ACMD(do_wizutil)
 {
   char arg[MAX_INPUT_LENGTH];
   struct char_data *vict;
+  int taeller;
   long result;
 
   one_argument(argument, arg);
@@ -1852,7 +1857,8 @@ ACMD(do_wizutil)
 	send_to_char(ch, "Your victim is not flagged.\r\n");
 	return;
       }
-      REMOVE_BIT(PLR_FLAGS(vict), PLR_THIEF | PLR_KILLER);
+      REMOVE_BIT_AR(PLR_FLAGS(vict), PLR_THIEF);
+      REMOVE_BIT_AR(PLR_FLAGS(vict), PLR_KILLER);
       send_to_char(ch, "Pardoned.\r\n");
       send_to_char(vict, "You have been pardoned by the Gods!\r\n");
       mudlog(BRF, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s pardoned by %s", GET_NAME(vict), GET_NAME(ch));
@@ -1878,7 +1884,7 @@ ACMD(do_wizutil)
 	send_to_char(ch, "Your victim is already pretty cold.\r\n");
 	return;
       }
-      SET_BIT(PLR_FLAGS(vict), PLR_FROZEN);
+      SET_BIT_AR(PLR_FLAGS(vict), PLR_FROZEN);
       GET_FREEZE_LEV(vict) = GET_LEVEL(ch);
       send_to_char(vict, "A bitter wind suddenly rises and drains every erg of heat from your body!\r\nYou feel frozen!\r\n");
       send_to_char(ch, "Frozen.\r\n");
@@ -1896,16 +1902,17 @@ ACMD(do_wizutil)
 	return;
       }
       mudlog(BRF, MAX(LVL_GOD, GET_INVIS_LEV(ch)), TRUE, "(GC) %s un-frozen by %s.", GET_NAME(vict), GET_NAME(ch));
-      REMOVE_BIT(PLR_FLAGS(vict), PLR_FROZEN);
+      REMOVE_BIT_AR(PLR_FLAGS(vict), PLR_FROZEN);
       send_to_char(vict, "A fireball suddenly explodes in front of you, melting the ice!\r\nYou feel thawed.\r\n");
       send_to_char(ch, "Thawed.\r\n");
       act("A sudden fireball conjured from nowhere thaws $n!", FALSE, vict, 0, 0, TO_ROOM);
       break;
     case SCMD_UNAFFECT:
-      if (vict->affected || AFF_FLAGS(vict)) {
+	  if (vict->affected || AFF_FLAGS(vict)) {
 	while (vict->affected)
 	  affect_remove(vict, vict->affected);
-	AFF_FLAGS(vict) = 0;
+    for(taeller=0; taeller < AF_ARRAY_MAX; taeller++)
+      AFF_FLAGS(ch)[taeller] = 0;
 	send_to_char(vict, "There is a brief flash of light!\r\nYou feel slightly different.\r\n");
 	send_to_char(ch, "All spells removed.\r\n");
       } else {
@@ -2180,8 +2187,8 @@ ACMD(do_show)
 #define NUMBER	2
 
 #define SET_OR_REMOVE(flagset, flags) { \
-	if (on) SET_BIT(flagset, flags); \
-	else if (off) REMOVE_BIT(flagset, flags); }
+	if (on) SET_BIT_AR(flagset, flags); \
+	else if (off) REMOVE_BIT_AR(flagset, flags); }
 
 #define RANGE(low, high) (value = MAX((low), MIN((high), (value))))
 
@@ -2501,11 +2508,11 @@ int perform_set(struct char_data *ch, st
     break;
   case 42:
     if (!str_cmp(val_arg, "off")) {
-      REMOVE_BIT(PLR_FLAGS(vict), PLR_LOADROOM);
+      REMOVE_BIT_AR(PLR_FLAGS(vict), PLR_LOADROOM);
     } else if (is_number(val_arg)) {
       rvnum = atoi(val_arg);
       if (real_room(rvnum) != NOWHERE) {
-        SET_BIT(PLR_FLAGS(vict), PLR_LOADROOM);
+        SET_BIT_AR(PLR_FLAGS(vict), PLR_LOADROOM);
 	GET_LOADROOM(vict) = rvnum;
 	send_to_char(ch, "%s will enter at room #%d.", GET_NAME(vict), GET_LOADROOM(vict));
       } else {
diff -puN normal/class.c src/class.c
--- normal/class.c	2002-04-30 23:00:34.000000000 +0200
+++ src/class.c	2002-11-06 14:50:16.000000000 +0100
@@ -1507,7 +1507,7 @@ void do_start(struct char_data *ch)
   GET_COND(ch, DRUNK) = 0;
 
   if (siteok_everyone)
-    SET_BIT(PLR_FLAGS(ch), PLR_SITEOK);
+    SET_BIT_AR(PLR_FLAGS(ch), PLR_SITEOK);
 }
 
 
@@ -1565,7 +1565,7 @@ void advance_level(struct char_data *ch)
   if (GET_LEVEL(ch) >= LVL_IMMORT) {
     for (i = 0; i < 3; i++)
       GET_COND(ch, i) = (char) -1;
-    SET_BIT(PRF_FLAGS(ch), PRF_HOLYLIGHT);
+    SET_BIT_AR(PRF_FLAGS(ch), PRF_HOLYLIGHT);
   }
 
   snoop_check(ch);
diff -puN normal/config.c src/config.c
--- normal/config.c	2002-11-06 14:33:42.000000000 +0100
+++ src/config.c	2002-11-08 13:41:12.000000000 +0100
@@ -235,6 +235,19 @@ room_vnum donation_room_3 = NOWHERE;	/* 
 
 
 /* GAME OPERATION OPTIONS */
+
+/*
+ * Please read 128bit.readme before setting this to true. Set this
+ * flag if you want the conversion to take place.
+ */
+int bitwarning = FALSE;
+
+/*
+ * If you want to look at normal worldfiles but DO NOT want to save
+ * to 128bit format, turn this to false. However, do not save through
+ * olc, or your worldfiles will be 128bit anyway.
+ */
+int bitsavetodisk = TRUE;
 
 /*
  * This is the default port on which the game should run if no port is
diff -puN normal/constants.c src/constants.c
--- normal/constants.c	2002-11-06 14:33:20.000000000 +0100
+++ src/constants.c	2002-11-06 14:51:22.000000000 +0100
@@ -203,7 +203,8 @@ const char *preference_bits[] = {
 
 /* AFF_x */
 const char *affected_bits[] =
-{
+{
+  "\0", /* DO NOT REMOVE!! */
   "BLIND",
   "INVIS",
   "DET-ALIGN",
diff -puN normal/db.c src/db.c
--- normal/db.c	2002-11-06 14:33:42.000000000 +0100
+++ src/db.c	2002-11-08 14:30:36.000000000 +0100
@@ -69,6 +69,7 @@ int circle_restrict = 0;	/* level of gam
 room_rnum r_mortal_start_room;	/* rnum of mortal start room	 */
 room_rnum r_immort_start_room;	/* rnum of immort start room	 */
 room_rnum r_frozen_start_room;	/* rnum of frozen start room	 */
+int converting = FALSE;
 
 char *credits = NULL;		/* game credits			 */
 char *news = NULL;		/* mud news			 */
@@ -157,10 +158,15 @@ void destroy_shops(void);
 void free_object_strings(struct obj_data *obj);
 void free_object_strings_proto(struct obj_data *obj);
 void boot_context_help(void);
-void free_context_help(void);
+void free_context_help(void);
+int add_to_save_list(zone_vnum, int type);
+int save_all(void);
+extern zone_rnum real_zone_by_thing(room_vnum vznum);
 /* external vars */
 extern int no_specials;
-extern int scheck;
+extern int scheck;
+extern int bitwarning;
+extern int bitsavetodisk;
 extern room_vnum mortal_start_room;
 extern room_vnum immort_start_room;
 extern room_vnum frozen_start_room;
@@ -295,6 +301,11 @@ void boot_world(void)
 
   log("Renumbering zone table.");
   renum_zone_table();
+
+  if(converting) {
+    log("Saving 128bit worldfiles to disk.");
+	save_all();
+  }
 
   if (!no_specials) {
     log("Loading shops.");
@@ -947,8 +958,9 @@ bitvector_t asciiflag_conv(char *flag)
 void parse_room(FILE *fl, int virtual_nr)
 {
   static int room_nr = 0, zone = 0;
-  int t[10], i;
-  char line[READ_SIZE], flags[128], buf2[MAX_STRING_LENGTH], buf[128];
+  int t[10], i, retval;
+  char line[READ_SIZE], flags[128], flags2[128], flags3[128]; 
+  char flags4[128], buf2[MAX_STRING_LENGTH], buf[128];
   struct extra_descr_data *new_descr;
   char letter;
 
@@ -974,17 +986,50 @@ void parse_room(FILE *fl, int virtual_nr
 	virtual_nr);
     exit(1);
   }
-
-  if (sscanf(line, " %d %s %d ", t, flags, t + 2) != 3) {
-    log("SYSERR: Format error in roomflags/sector type of room #%d",
-	virtual_nr);
-    exit(1);
-  }
-  /* t[0] is the zone number; ignored with the zone-file system */
-
-  world[room_nr].room_flags = asciiflag_conv(flags);
-  sprintf(flags, "object #%d", virtual_nr);	/* sprintf: OK (until 399-bit integers) */
-  check_bitvector_names(world[room_nr].room_flags, room_bits_count, flags, "room");
+ 
+  if (((retval = sscanf(line, " %d %s %s %s %s %d ", t, flags, flags2, flags3, flags4, t + 2)) == 3) &&
+	 (bitwarning == TRUE)) {
+    log("WARNING: Conventional worldfiles detected. Please read 128bit.readme.");
+    exit(1);
+  } else if ((retval == 3) && (bitwarning == FALSE)) {
+	/* 
+	 * Looks like the implementor is ready, so let's load the worldfiles. We load the extra 
+	 * three flags as 0, since they won't be anything anyway. We will save the entire world
+	 * later on, when every room, mobile, and object is converted.
+	 */
+
+	log("Converting room #%d to 128bits..", virtual_nr);
+    world[room_nr].room_flags[0] = asciiflag_conv(flags);
+	world[room_nr].room_flags[1] = 0;
+    world[room_nr].room_flags[2] = 0;
+    world[room_nr].room_flags[3] = 0;
+    
+    sprintf(flags, "room #%d", virtual_nr);	/* sprintf: OK (until 399-bit integers) */
+    
+	/* No need to scan the other three sections; they're 0 anyway */
+	check_bitvector_names(world[room_nr].room_flags[0], room_bits_count, flags, "room"); 
+	
+	if(bitsavetodisk) { /* Maybe the implementor just wants to look at the 128bit files */
+	  add_to_save_list(zone_table[real_zone_by_thing(virtual_nr)].number, 3);
+      converting = TRUE;
+	}
+
+	log("   done.");
+  } else if (retval == 6) {
+    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);
+
+    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 {
+    log("SYSERR: Format error in roomflags/sector type of room #%d", virtual_nr);
+    exit(1);
+  }
 
   world[room_nr].sector_type = t[2];
 
@@ -1381,9 +1426,11 @@ void parse_enhanced_mob(FILE *mob_f, int
 void parse_mobile(FILE *mob_f, int nr)
 {
   static int i = 0;
-  int j, t[10];
+  int j, t[10], retval;
   char line[READ_SIZE], *tmpptr, letter;
-  char f1[128], f2[128], buf2[128];
+  char f1[128], f2[128], f3[128], f4[128], f5[128], f6[128];
+  char f7[128], f8[128], buf2[128];
+ 
 
   mob_index[i].vnum = nr;
   mob_index[i].number = 0;
@@ -1416,29 +1463,83 @@ void parse_mobile(FILE *mob_f, int nr)
 	"...expecting line of form '# # # {S | E}', but file ended!", nr);
     exit(1);
   }
+ 
+  if (((retval = sscanf(line, "%s %s %s %s %s %s %s %s %d %c", f1, f2, f3, f4, f5, f6, f7, f8,
+	  t + 2, &letter)) == 10) && (bitwarning == TRUE)) {
+	/* Let's make the implementor read some, before converting his worldfiles */
+    log("WARNING: Conventional mobilefiles detected. Please read 128bit.readme.");
+    exit(1);
+  } else if ((retval == 4) && (bitwarning == FALSE)) {
+	    
+	log("Converting mobile #%d to 128bits..", nr);
+    MOB_FLAGS(mob_proto + i)[0] = asciiflag_conv(f1);
+    MOB_FLAGS(mob_proto + i)[1] = 0;
+    MOB_FLAGS(mob_proto + i)[2] = 0;
+    MOB_FLAGS(mob_proto + i)[3] = 0;
+    check_bitvector_names(MOB_FLAGS(mob_proto + i)[0], action_bits_count, buf2, "mobile");
+    
+	AFF_FLAGS(mob_proto + i)[0] = asciiflag_conv(f2);
+    AFF_FLAGS(mob_proto + i)[1] = 0;
+    AFF_FLAGS(mob_proto + i)[2] = 0;
+    AFF_FLAGS(mob_proto + i)[3] = 0;
+    
+	/* Make some basic checks. */
+    REMOVE_BIT_AR(AFF_FLAGS(mob_proto + i), AFF_CHARM); 
+	REMOVE_BIT_AR(AFF_FLAGS(mob_proto + i), AFF_POISON);
+	REMOVE_BIT_AR(AFF_FLAGS(mob_proto + i), AFF_GROUP);
+	REMOVE_BIT_AR(AFF_FLAGS(mob_proto + i), AFF_SLEEP);
+    if (MOB_FLAGGED(mob_proto + i, MOB_AGGRESSIVE) && MOB_FLAGGED(mob_proto + i, MOB_AGGR_GOOD)) 
+      REMOVE_BIT_AR(MOB_FLAGS(mob_proto + i), MOB_AGGR_GOOD);
+    if (MOB_FLAGGED(mob_proto + i, MOB_AGGRESSIVE) && MOB_FLAGGED(mob_proto + i, MOB_AGGR_NEUTRAL))
+	  REMOVE_BIT_AR(MOB_FLAGS(mob_proto + i), MOB_AGGR_NEUTRAL);
+    if (MOB_FLAGGED(mob_proto + i, MOB_AGGRESSIVE) && MOB_FLAGGED(mob_proto + i, MOB_AGGR_EVIL))
+      REMOVE_BIT_AR(MOB_FLAGS(mob_proto + i), MOB_AGGR_EVIL);
+
+	check_bitvector_names(AFF_FLAGS(mob_proto + i)[0], affected_bits_count, buf2, "mobile affect");
+
+	/* 
+	 * This is necessary, since if we have conventional worldfiles, &letter
+	 * is loaded into f4 instead of the letter characters. So what we do, is 
+	 * copy f4 into letter. Disadvantage is that &letter cannot be longer
+	 * then 128 characters, but this shouldn't occur anyway.
+	 */
+    letter = *f4;
+
+	if(bitsavetodisk) {
+	  add_to_save_list(zone_table[real_zone_by_thing(nr)].number, 0);
+      converting =TRUE;
+	}
+
+	log("   done.");
+  } else if (retval == 10) {
+    int taeller;
+
+    MOB_FLAGS(mob_proto + i)[0] = asciiflag_conv(f1);
+    MOB_FLAGS(mob_proto + i)[1] = asciiflag_conv(f2);
+    MOB_FLAGS(mob_proto + i)[2] = asciiflag_conv(f3);
+    MOB_FLAGS(mob_proto + i)[3] = asciiflag_conv(f4);
+    for(taeller=0; taeller < AF_ARRAY_MAX; taeller++) 
+      check_bitvector_names(MOB_FLAGS(mob_proto + i)[taeller], action_bits_count, buf2, "mobile");
+  
+    AFF_FLAGS(mob_proto + i)[0] = asciiflag_conv(f5);
+    AFF_FLAGS(mob_proto + i)[1] = asciiflag_conv(f6);
+    AFF_FLAGS(mob_proto + i)[2] = asciiflag_conv(f7);
+    AFF_FLAGS(mob_proto + i)[3] = asciiflag_conv(f8);
+    for(taeller=0; taeller < AF_ARRAY_MAX; taeller++) 
+      check_bitvector_names(AFF_FLAGS(mob_proto + i)[taeller], affected_bits_count, buf2, "mobile affect");
+  } else {
+    log("SYSERR: Format error after string section of mob #%d\n"
+	"...expecting line of form '# # # {S | E}'", nr);
+    exit(1);
+  }
 
-#ifdef CIRCLE_ACORN	/* Ugh. */
-  if (sscanf(line, "%s %s %d %s", f1, f2, t + 2, &letter) != 4) {
-#else
-  if (sscanf(line, "%s %s %d %c", f1, f2, t + 2, &letter) != 4) {
-#endif
-    log("SYSERR: Format error after string section of mob #%d\n"
-	"...expecting line of form '# # # {S | E}'", nr);
-    exit(1);
-  }
-
-  MOB_FLAGS(mob_proto + i) = asciiflag_conv(f1);
-  SET_BIT(MOB_FLAGS(mob_proto + i), MOB_ISNPC);
+  SET_BIT_AR(MOB_FLAGS(mob_proto + i), MOB_ISNPC);
   if (MOB_FLAGGED(mob_proto + i, MOB_NOTDEADYET)) {
     /* Rather bad to load mobiles with this bit already set. */
     log("SYSERR: Mob #%d has reserved bit MOB_NOTDEADYET set.", nr);
-    REMOVE_BIT(MOB_FLAGS(mob_proto + i), MOB_NOTDEADYET);
+    REMOVE_BIT_AR(MOB_FLAGS(mob_proto + i), MOB_NOTDEADYET);
   }
-  check_bitvector_names(MOB_FLAGS(mob_proto + i), action_bits_count, buf2, "mobile");
-
-  AFF_FLAGS(mob_proto + i) = asciiflag_conv(f2);
-  check_bitvector_names(AFF_FLAGS(mob_proto + i), affected_bits_count, buf2, "mobile affect");
-
+ 
   GET_ALIGNMENT(mob_proto + i) = t[2];
 
   /* AGGR_TO_ALIGN is ignored if the mob is AGGRESSIVE. */
@@ -1487,8 +1588,10 @@ char *parse_object(FILE *obj_f, int nr)
   static int i = 0;
   static char line[READ_SIZE];
   int t[10], j, retval;
-  char *tmpptr;
-  char f1[READ_SIZE], f2[READ_SIZE], buf2[128];
+  char *tmpptr, buf2[128];
+  char f1[READ_SIZE], f2[READ_SIZE], f3[READ_SIZE], f4[READ_SIZE];
+  char f5[READ_SIZE], f6[READ_SIZE], f7[READ_SIZE], f8[READ_SIZE];
+  char f9[READ_SIZE], f10[READ_SIZE], f11[READ_SIZE], f12[READ_SIZE];
   struct extra_descr_data *new_descr;
 
   obj_index[i].vnum = nr;
@@ -1520,22 +1623,61 @@ char *parse_object(FILE *obj_f, int nr)
   if (!get_line(obj_f, line)) {
     log("SYSERR: Expecting first numeric line of %s, but file ended!", buf2);
     exit(1);
-  }
-  if ((retval = sscanf(line, " %d %s %s %d", t, f1, f2, t + 3)) != 4) {
-    if (retval == 3)
-      t[3] = 0;
-    else {
-      log("SYSERR: Format error in first numeric line (expecting 4 args, got %d), %s", retval, buf2);
-    exit(1);
-  }
-  }
+  }
 
+  if (((retval = sscanf(line, " %d %s %s %s %s %s %s %s %s %s %s %s %s", t, f1, f2, f3, 
+	  f4, f5, f6, f7, f8, f9, f10, f11, f12)) == 4) && (bitwarning == TRUE)) {
+	/* Let's make the implementor read some, before converting his worldfiles */
+    log("WARNING: Conventional objectfiles detected. Please read 128bit.readme.");
+    exit(1);
+  } else if (((retval == 4) || (retval == 3)) && (bitwarning == FALSE)) {
+    
+	if (retval == 3)
+      t[3] = 0;
+	    
+	log("Converting object #%d to 128bits..", nr);
+    GET_OBJ_EXTRA(obj_proto + i)[0] = asciiflag_conv(f1);
+    GET_OBJ_EXTRA(obj_proto + i)[1] = 0;
+    GET_OBJ_EXTRA(obj_proto + i)[2] = 0;
+    GET_OBJ_EXTRA(obj_proto + i)[3] = 0;
+    GET_OBJ_WEAR(obj_proto + i)[0] = asciiflag_conv(f2);
+    GET_OBJ_WEAR(obj_proto + i)[1] = 0;
+    GET_OBJ_WEAR(obj_proto + i)[2] = 0;
+    GET_OBJ_WEAR(obj_proto + i)[3] = 0;
+    GET_OBJ_PERM(obj_proto + i)[0] = t[3];
+    GET_OBJ_PERM(obj_proto + i)[1] = 0;
+    GET_OBJ_PERM(obj_proto + i)[2] = 0;
+    GET_OBJ_PERM(obj_proto + i)[3] = 0;
+    
+	if(bitsavetodisk) { 
+	  add_to_save_list(zone_table[real_zone_by_thing(nr)].number, 1);
+	  converting = TRUE;
+	}
+	
+	log("   done.");
+  } else if (retval == 13) {
+ 
+    GET_OBJ_EXTRA(obj_proto + i)[0] = asciiflag_conv(f1);
+    GET_OBJ_EXTRA(obj_proto + i)[1] = asciiflag_conv(f2);
+    GET_OBJ_EXTRA(obj_proto + i)[2] = asciiflag_conv(f3);
+    GET_OBJ_EXTRA(obj_proto + i)[3] = asciiflag_conv(f4);
+    GET_OBJ_WEAR(obj_proto + i)[0] = asciiflag_conv(f5);
+    GET_OBJ_WEAR(obj_proto + i)[1] = asciiflag_conv(f6);
+    GET_OBJ_WEAR(obj_proto + i)[2] = asciiflag_conv(f7);
+    GET_OBJ_WEAR(obj_proto + i)[3] = asciiflag_conv(f8);
+    GET_OBJ_PERM(obj_proto + i)[0] = asciiflag_conv(f9);
+    GET_OBJ_PERM(obj_proto + i)[1] = asciiflag_conv(f10);
+    GET_OBJ_PERM(obj_proto + i)[2] = asciiflag_conv(f11);
+    GET_OBJ_PERM(obj_proto + i)[3] = asciiflag_conv(f12);
+
+  } else {
+    log("SYSERR: Format error in first numeric line (expecting 13 args, got %d), %s", retval, buf2);
+    exit(1);
+  }
+  
   /* Object flags checked in check_object(). */
   GET_OBJ_TYPE(obj_proto + i) = t[0];
-  GET_OBJ_EXTRA(obj_proto + i) = asciiflag_conv(f1);
-  GET_OBJ_WEAR(obj_proto + i) = asciiflag_conv(f2);
-  GET_OBJ_PERM(obj_proto + i) = t[3];
-
+  
   if (!get_line(obj_f, line)) {
     log("SYSERR: Expecting second numeric line of %s, but file ended!", buf2);
     exit(1);
@@ -2373,6 +2515,7 @@ int load_char(char *name, struct char_da
   FBFILE *fl;
   char filename[40];
   char buf[128], line[MAX_INPUT_LENGTH + 1], tag[6];
+  char f1[128], f2[128], f3[128], f4[128];
   struct affected_type af;
   if((id = get_ptable_by_name(name)) < 0)
     return (-1);
@@ -2394,8 +2537,6 @@ int load_char(char *name, struct char_da
     GET_HEIGHT(ch) = PFDEF_HEIGHT;
     GET_WEIGHT(ch) = PFDEF_WEIGHT;
     GET_ALIGNMENT(ch) = PFDEF_ALIGNMENT;
-    PLR_FLAGS(ch) = PFDEF_PLRFLAGS;
-    AFF_FLAGS(ch) = PFDEF_AFFFLAGS;
     for(i = 0; i < NUM_OF_SAVE_THROWS; i++) GET_SAVE(ch, i) = PFDEF_SAVETHROW;
     GET_LOADROOM(ch) = PFDEF_LOADROOM;
     GET_INVIS_LEV(ch) = PFDEF_INVISLEV;
@@ -2405,7 +2546,6 @@ int load_char(char *name, struct char_da
     GET_COND(ch, THIRST) = PFDEF_THIRST;
     GET_COND(ch, DRUNK) = PFDEF_DRUNK;
     GET_BAD_PWS(ch) = PFDEF_BADPWS;
-    PRF_FLAGS(ch) = PFDEF_PREFFLAGS;
     GET_PRACTICES(ch) = PFDEF_PRACTICES;
     GET_GOLD(ch) = PFDEF_GOLD;
     GET_BANK_GOLD(ch) = PFDEF_BANK;
@@ -2426,15 +2566,33 @@ int load_char(char *name, struct char_da
     GET_MAX_MANA(ch) = PFDEF_MAXMANA;
     GET_MOVE(ch) = PFDEF_MOVE;
     GET_MAX_MOVE(ch) = PFDEF_MAXMOVE;
+    
+	for (i = 0; i < AF_ARRAY_MAX; i++)
+      AFF_FLAGS(ch)[i] = PFDEF_AFFFLAGS;
+    for (i = 0; i < PM_ARRAY_MAX; i++)
+      PLR_FLAGS(ch)[i] = PFDEF_PLRFLAGS;
+    for (i = 0; i < PR_ARRAY_MAX; i++)
+     PRF_FLAGS(ch)[i] = PFDEF_PREFFLAGS;
+	
     while(fbgetline(fl, line)) {
       tag_argument(line, tag);
       num = atoi(line);
       switch (*tag) {
 	case 'A':
-	  if(!strcmp(tag, "Ac  ")) GET_AC(ch) = num;
-	  else if(!strcmp(tag, "Act ")) PLR_FLAGS(ch) = num;
-	  else if(!strcmp(tag, "Aff ")) AFF_FLAGS(ch) = asciiflag_conv(line);
-	  else if(!strcmp(tag, "Affs")) {
+	  if(!strcmp(tag, "Ac  ")) GET_AC(ch) = num;
+	  else if (!strcmp(tag, "Act ")) {
+         sscanf(line, "%s %s %s %s", f1, f2, f3, f4);
+           PLR_FLAGS(ch)[0] = asciiflag_conv(f1);
+           PLR_FLAGS(ch)[1] = asciiflag_conv(f2);
+           PLR_FLAGS(ch)[2] = asciiflag_conv(f3);
+           PLR_FLAGS(ch)[3] = asciiflag_conv(f4);
+	  } else if (!strcmp(tag, "Aff ")) {
+         sscanf(line, "%s %s %s %s", f1, f2, f3, f4);
+           AFF_FLAGS(ch)[0] = asciiflag_conv(f1);
+           AFF_FLAGS(ch)[1] = asciiflag_conv(f2);
+           AFF_FLAGS(ch)[2] = asciiflag_conv(f3);
+           AFF_FLAGS(ch)[3] = asciiflag_conv(f4);
+	  } else if (!strcmp(tag, "Affs")) {
 	    i = 0;
 	    do {
 	      fbgetline(fl, line);
@@ -2518,7 +2676,12 @@ int load_char(char *name, struct char_da
 	  else if(!strcmp(tag, "PfIn")) POOFIN(ch) = strdup(line);
 	  else if(!strcmp(tag, "PfOt")) POOFOUT(ch) = strdup(line);
 #endif
-	  else if(!strcmp(tag, "Pref")) PRF_FLAGS(ch) = asciiflag_conv(line);
+	  else if (!strcmp(tag, "Pref"))
+		sscanf(line, "%s %s %s %s", f1, f2, f3, f4);
+          PRF_FLAGS(ch)[0] = asciiflag_conv(f1);
+          PRF_FLAGS(ch)[1] = asciiflag_conv(f2);
+          PRF_FLAGS(ch)[2] = asciiflag_conv(f3);
+          PRF_FLAGS(ch)[3] = asciiflag_conv(f4);
 	  break;
 	case 'R':
 	  if(!strcmp(tag, "Room")) GET_LOADROOM(ch) = num;
@@ -2666,12 +2829,14 @@ void save_char(struct char_data * ch)
     if(GET_ALIGNMENT(ch) != PFDEF_ALIGNMENT)
       fbprintf(fl, "Alin: %d\n", GET_ALIGNMENT(ch));
     fbprintf(fl, "Id  : %d\n", GET_IDNUM(ch));
-    if(PLR_FLAGS(ch) != PFDEF_PLRFLAGS)
-      fbprintf(fl, "Act : %d\n", PLR_FLAGS(ch));
-    if(AFF_FLAGS(ch) != PFDEF_AFFFLAGS) {
-      sprintbits(AFF_FLAGS(ch), bits);
-      fbprintf(fl, "Aff : %s\n", bits);
-    }
+    if(PLR_FLAGS(ch) != PFDEF_PLRFLAGS) {
+      fbprintf(fl, "Act : %u %u %u %u\n", PLR_FLAGS(ch)[0], 
+		  PLR_FLAGS(ch)[1], PLR_FLAGS(ch)[2], PLR_FLAGS(ch)[3]);
+	}
+	if(AFF_FLAGS(ch) != PFDEF_AFFFLAGS) {
+      fbprintf(fl, "Aff : %u %u %u %u\n", AFF_FLAGS(ch)[0], 
+		  AFF_FLAGS(ch)[1], AFF_FLAGS(ch)[2], AFF_FLAGS(ch)[3]);
+    }
     if(GET_SAVE(ch, 0) != PFDEF_SAVETHROW)
       fbprintf(fl, "Thr1: %d\n", GET_SAVE(ch, 0));
     if(GET_SAVE(ch, 1) != PFDEF_SAVETHROW)
@@ -2696,10 +2861,10 @@ void save_char(struct char_data * ch)
       fbprintf(fl, "Invs: %d\n", GET_INVIS_LEV(ch));
     if(GET_LOADROOM(ch) != PFDEF_LOADROOM)
       fbprintf(fl, "Room: %d\n", GET_LOADROOM(ch));
-    if(PRF_FLAGS(ch) != PFDEF_PREFFLAGS) {
-      sprintbits(PRF_FLAGS(ch), bits);
-      fbprintf(fl, "Pref: %s\n", bits);
-    }
+    if(PRF_FLAGS(ch) != PFDEF_PREFFLAGS) {
+      fbprintf(fl, "Pref: %d %d %d %d\n", PRF_FLAGS(ch)[0], 
+		  PRF_FLAGS(ch)[1], PRF_FLAGS(ch)[2], PRF_FLAGS(ch)[3]);
+    }
     if(GET_BAD_PWS(ch) != PFDEF_BADPWS)
       fbprintf(fl, "Badp: %d\n", GET_BAD_PWS(ch));
     if(GET_COND(ch, FULL) != PFDEF_HUNGER && GET_LEVEL(ch) < LVL_IMMORT)
@@ -3143,7 +3308,8 @@ void init_char(struct char_data *ch)
       SET_SKILL(ch, i, 100);
   }
 
-  AFF_FLAGS(ch) = 0;
+  for (i = 0; i < AF_ARRAY_MAX; i++)
+    AFF_FLAGS(ch)[i] = 0;
 
   for (i = 0; i < 5; i++)
     GET_SAVE(ch, i) = 0;
@@ -3269,7 +3435,7 @@ zone_rnum real_zone(zone_vnum vnum)
 int check_object(struct obj_data *obj)
 {
   char objname[MAX_INPUT_LENGTH + 32];
-  int error = FALSE;
+  int error = FALSE, y;
 
   if (GET_OBJ_WEIGHT(obj) < 0 && (error = TRUE))
     log("SYSERR: Object #%d (%s) has negative weight (%d).",
@@ -3280,9 +3446,11 @@ int check_object(struct obj_data *obj)
 	GET_OBJ_VNUM(obj), obj->short_description, GET_OBJ_RENT(obj));
 
   snprintf(objname, sizeof(objname), "Object #%d (%s)", GET_OBJ_VNUM(obj), obj->short_description);
-  error |= check_bitvector_names(GET_OBJ_WEAR(obj), wear_bits_count, objname, "object wear");
-  error |= check_bitvector_names(GET_OBJ_EXTRA(obj), extra_bits_count, objname, "object extra");
-  error |= check_bitvector_names(GET_OBJ_AFFECT(obj), affected_bits_count, objname, "object affect");
+  for(y = 0; y < TW_ARRAY_MAX; y++) {
+    error |= check_bitvector_names(GET_OBJ_WEAR(obj)[y], wear_bits_count, objname, "object wear");
+    error |= check_bitvector_names(GET_OBJ_EXTRA(obj)[y], extra_bits_count, objname, "object extra");
+    error |= check_bitvector_names(GET_OBJ_AFFECT(obj)[y], affected_bits_count, objname, "object affect");
+  }
 
   switch (GET_OBJ_TYPE(obj)) {
   case ITEM_DRINKCON:
diff -puN normal/dg_scripts.c src/dg_scripts.c
--- normal/dg_scripts.c	2002-11-06 14:33:20.000000000 +0100
+++ src/dg_scripts.c	2002-11-07 14:48:18.000000000 +0100
@@ -1575,9 +1575,9 @@ void find_replacement(void *go, struct s
       else if (!str_cmp(field, "is_killer")) {
         if (subfield && *subfield) {
           if (!str_cmp("on", subfield))
-            SET_BIT(PLR_FLAGS(c), PLR_KILLER);
+            SET_BIT_AR(PLR_FLAGS(c), PLR_KILLER);
           else if (!str_cmp("off", subfield))
-            REMOVE_BIT(PLR_FLAGS(c), PLR_KILLER);
+            REMOVE_BIT_AR(PLR_FLAGS(c), PLR_KILLER);
         }
         if (PLR_FLAGGED(c, PLR_KILLER))
           strcpy(str, "1");
@@ -1588,9 +1588,9 @@ void find_replacement(void *go, struct s
       else if (!str_cmp(field, "is_thief")) {
         if (subfield && *subfield) {
           if (!str_cmp("on", subfield))
-            SET_BIT(PLR_FLAGS(c), PLR_THIEF);
+            SET_BIT_AR(PLR_FLAGS(c), PLR_THIEF);
           else if (!str_cmp("off", subfield))
-            REMOVE_BIT(PLR_FLAGS(c), PLR_THIEF);
+            REMOVE_BIT_AR(PLR_FLAGS(c), PLR_THIEF);
         }
         if (PLR_FLAGGED(c, PLR_THIEF))
           strcpy(str, "1");
Common subdirectories: normal/doc and src/doc
diff -puN normal/fight.c src/fight.c
--- normal/fight.c	2002-11-06 14:33:20.000000000 +0100
+++ src/fight.c	2002-11-07 15:12:40.000000000 +0100
@@ -90,7 +90,8 @@ void appear(struct char_data *ch)
   if (affected_by_spell(ch, SPELL_INVISIBLE))
     affect_from_char(ch, SPELL_INVISIBLE);
 
-  REMOVE_BIT(AFF_FLAGS(ch), AFF_INVISIBLE | AFF_HIDE);
+  REMOVE_BIT_AR(AFF_FLAGS(ch), AFF_INVISIBLE);
+  REMOVE_BIT_AR(AFF_FLAGS(ch), AFF_HIDE);
 
   if (GET_LEVEL(ch) < LVL_IMMORT)
     act("$n slowly fades into existence.", FALSE, ch, 0, 0, TO_ROOM);
@@ -220,7 +221,7 @@ void check_killer(struct char_data *ch, 
   if (PLR_FLAGGED(ch, PLR_KILLER) || IS_NPC(ch) || IS_NPC(vict) || ch == vict)
     return;
 
-  SET_BIT(PLR_FLAGS(ch), PLR_KILLER);
+  SET_BIT_AR(PLR_FLAGS(ch), PLR_KILLER);
   send_to_char(ch, "If you want to be a PLAYER KILLER, so be it...\r\n");
   mudlog(BRF, LVL_IMMORT, TRUE, "PC Killer bit set on %s for initiating attack on %s at %s.",
 	    GET_NAME(ch), GET_NAME(vict), world[IN_ROOM(vict)].name);
@@ -275,7 +276,7 @@ void make_corpse(struct char_data *ch)
   char buf2[MAX_NAME_LENGTH + 64];
   struct obj_data *corpse, *o;
   struct obj_data *money;
-  int i;
+  int i, x, y;
 
   corpse = create_obj();
 
@@ -290,8 +291,14 @@ void make_corpse(struct char_data *ch)
   corpse->short_description = strdup(buf2);
 
   GET_OBJ_TYPE(corpse) = ITEM_CONTAINER;
-  GET_OBJ_WEAR(corpse) = ITEM_WEAR_TAKE;
-  GET_OBJ_EXTRA(corpse) = ITEM_NODONATE;
+  for(x = y = 0; x < EF_ARRAY_MAX || y < TW_ARRAY_MAX; x++, y++) {
+    if (x < EF_ARRAY_MAX)
+      GET_OBJ_EXTRA_AR(corpse, x) = 0;
+    if (y < TW_ARRAY_MAX)
+      corpse->obj_flags.wear_flags[y] = 0;
+  }
+  SET_BIT_AR(GET_OBJ_WEAR(corpse), ITEM_WEAR_TAKE);
+  SET_BIT_AR(GET_OBJ_EXTRA(corpse), ITEM_NODONATE);
   GET_OBJ_VAL(corpse, 0) = 0;	/* You can't store stuff in a corpse */
   GET_OBJ_VAL(corpse, 3) = 1;	/* corpse identifier */
   GET_OBJ_WEIGHT(corpse) = GET_WEIGHT(ch) + IS_CARRYING_W(ch);
@@ -389,8 +396,10 @@ void raw_kill(struct char_data * ch, str
 void die(struct char_data * ch, struct char_data * killer)
 {
   gain_exp(ch, -(GET_EXP(ch) / 2));
-  if (!IS_NPC(ch))
-    REMOVE_BIT(PLR_FLAGS(ch), PLR_KILLER | PLR_THIEF);
+  if (!IS_NPC(ch)) {
+    REMOVE_BIT_AR(PLR_FLAGS(ch), PLR_KILLER);
+    REMOVE_BIT_AR(PLR_FLAGS(ch), PLR_THIEF);
+  }
   raw_kill(ch, killer);
 }
 
diff -puN normal/genmob.c src/genmob.c
--- normal/genmob.c	2002-11-06 14:33:20.000000000 +0100
+++ src/genmob.c	2002-11-07 15:31:20.000000000 +0100
@@ -365,10 +365,6 @@ int write_mobile_espec(mob_vnum mvnum, s
  */
 int write_mobile_record(mob_vnum mvnum, struct char_data *mob, FILE *fd)
 {
-
-char buf1[MAX_STRING_LENGTH];
-char buf2[MAX_STRING_LENGTH];
-
   char ldesc[MAX_STRING_LENGTH], ddesc[MAX_STRING_LENGTH];
 
   ldesc[MAX_STRING_LENGTH - 1] = '\0';
@@ -388,16 +384,17 @@ char buf2[MAX_STRING_LENGTH];
 	ddesc, STRING_TERMINATOR
   );
 
-  sprintascii(buf1, MOB_FLAGS(mob));
-  sprintascii(buf2, AFF_FLAGS(mob));
+  fprintf(fd, "%d %d %d %d %d %d %d %d %d E\n"
+		"%d %d %d %dd%d+%d %dd%d+%d\n",
+		MOB_FLAGS(mob)[0], MOB_FLAGS(mob)[1],
+		MOB_FLAGS(mob)[2], MOB_FLAGS(mob)[3],
+		AFF_FLAGS(mob)[0], AFF_FLAGS(mob)[1],
+		AFF_FLAGS(mob)[2], AFF_FLAGS(mob)[3],
+        GET_ALIGNMENT(mob),
+		GET_LEVEL(mob), 20 - GET_HITROLL(mob), GET_AC(mob) / 10, GET_HIT(mob),
+		GET_MANA(mob), GET_MOVE(mob), GET_NDD(mob), GET_SDD(mob),
+		GET_DAMROLL(mob));
 
-  fprintf(fd,	"%s %s %d E\n"
-		"%d %d %d %dd%d+%d %dd%d+%d\n",
-		buf1, buf2, GET_ALIGNMENT(mob),
-		GET_LEVEL(mob), 20 - GET_HITROLL(mob), GET_AC(mob) / 10, GET_HIT(mob),
-		GET_MANA(mob), GET_MOVE(mob), GET_NDD(mob), GET_SDD(mob),
-		GET_DAMROLL(mob)
-  );
   fprintf(fd, 	"%d %d\n"
 		"%d %d %d\n",
 		GET_GOLD(mob), GET_EXP(mob),
diff -puN normal/genobj.c src/genobj.c
--- normal/genobj.c	2002-11-06 14:33:20.000000000 +0100
+++ src/genobj.c	2002-11-08 13:36:00.000000000 +0100
@@ -256,17 +256,20 @@ char        buf2[MAX_STRING_LENGTH];
 	      (obj->description && *obj->description) ?	obj->description : "undefined",
 	      buf1);
 
-      sprintascii(buf1, GET_OBJ_EXTRA(obj));
-      sprintascii(buf2, GET_OBJ_WEAR(obj));
-
-      fprintf(fp,
-	      "%d %s %s %ld\n"
-	      "%d %d %d %d\n"
-	      "%d %d %d %d\n",
-
-	      GET_OBJ_TYPE(obj), buf1, buf2, GET_OBJ_PERM(obj),
-	      GET_OBJ_VAL(obj, 0), GET_OBJ_VAL(obj, 1), GET_OBJ_VAL(obj, 2), GET_OBJ_VAL(obj, 3),
-	      GET_OBJ_WEIGHT(obj), GET_OBJ_COST(obj), GET_OBJ_RENT(obj), GET_OBJ_LEVEL(obj)
+      fprintf(fp,
+	      "%d %d %d %d %d %d %d %d %d %d %d %d %d\n"
+	      "%d %d %d %d\n"
+	      "%d %d %d %d\n",
+
+	      GET_OBJ_TYPE(obj), 
+		  GET_OBJ_EXTRA(obj)[0], GET_OBJ_EXTRA(obj)[1],
+		  GET_OBJ_EXTRA(obj)[2], GET_OBJ_EXTRA(obj)[3],
+		  GET_OBJ_WEAR(obj)[0], GET_OBJ_WEAR(obj)[1],
+		  GET_OBJ_WEAR(obj)[2], GET_OBJ_WEAR(obj)[3],
+		  GET_OBJ_PERM(obj)[0], GET_OBJ_PERM(obj)[1],
+		  GET_OBJ_PERM(obj)[2], GET_OBJ_PERM(obj)[3],
+	      GET_OBJ_VAL(obj, 0), GET_OBJ_VAL(obj, 1), GET_OBJ_VAL(obj, 2), GET_OBJ_VAL(obj, 3),
+	      GET_OBJ_WEIGHT(obj), GET_OBJ_COST(obj), GET_OBJ_RENT(obj), GET_OBJ_LEVEL(obj)
       );
 
       /*
diff -puN normal/genolc.c src/genolc.c
--- normal/genolc.c	2002-11-06 14:33:20.000000000 +0100
+++ src/genolc.c	2002-11-07 16:33:56.000000000 +0100
@@ -499,7 +499,7 @@ void perform_rlist(struct char_data *ch,
       strncpy(temp, world[nr].name, 35);
       temp[35] = '\0';
       sprinttype(world[nr].sector_type, sector_types, temp2, sizeof(temp2));
-      sprintbit(world[nr].room_flags, room_bits, temp3, sizeof(temp3));
+      sprintbitarray(world[nr].room_flags, room_bits, RF_ARRAY_MAX, temp3);
       sprintf(buf, "[%5d] %-35s %-15s %s\r\n",
               GET_ROOM_VNUM(nr),
               temp,
diff -puN normal/genwld.c src/genwld.c
--- normal/genwld.c	2002-11-06 14:33:20.000000000 +0100
+++ src/genwld.c	2002-11-07 16:31:02.000000000 +0100
@@ -288,19 +288,19 @@ int save_rooms(zone_rnum rzone)
       strcpy(buf, room->description ? room->description : "Empty room.");
       strip_cr(buf);
 
-      /*
-       * Save the numeric and string section of the file.
-       */
-      sprintascii(buf2, room->room_flags);
-      fprintf(sf, 	"#%d\n"
-			"%s%c\n"
-			"%s%c\n"
-			"%d %s %d\n",
-		room->number,
-		room->name ? room->name : "Untitled", STRING_TERMINATOR,
-		buf, STRING_TERMINATOR,
-		zone_table[room->zone].number, buf2, room->sector_type
-      );
+      /*
+       * Save the numeric and string section of the file.
+       */
+      fprintf(sf, 	"#%d\n"
+			"%s%c\n"
+			"%s%c\n"
+			"%d %d %d %d %d %d\n",
+		room->number,
+		room->name ? room->name : "Untitled", STRING_TERMINATOR,
+		buf, STRING_TERMINATOR,
+		zone_table[room->zone].number, room->room_flags[0], room->room_flags[1], room->room_flags[2], 
+		  room->room_flags[3], room->sector_type 
+      );
 
       /*
        * Now you write out the exits for the room.
diff -puN normal/graph.c src/graph.c
--- normal/graph.c	2002-11-06 14:32:48.000000000 +0100
+++ src/graph.c	2002-11-07 14:48:18.000000000 +0100
@@ -46,8 +46,8 @@ struct bfs_queue_struct {
 static struct bfs_queue_struct *queue_head = 0, *queue_tail = 0;
 
 /* Utility macros */
-#define MARK(room)	(SET_BIT(ROOM_FLAGS(room), ROOM_BFS_MARK))
-#define UNMARK(room)	(REMOVE_BIT(ROOM_FLAGS(room), ROOM_BFS_MARK))
+#define MARK(room)	(SET_BIT_AR(ROOM_FLAGS(room), ROOM_BFS_MARK))
+#define UNMARK(room)	(REMOVE_BIT_AR(ROOM_FLAGS(room), ROOM_BFS_MARK))
 #define IS_MARKED(room)	(ROOM_FLAGGED(room, ROOM_BFS_MARK))
 #define TOROOM(x, y)	(world[(x)].dir_option[(y)]->to_room)
 #define IS_CLOSED(x, y)	(EXIT_FLAGGED(world[(x)].dir_option[(y)], EX_CLOSED))
diff -puN normal/handler.c src/handler.c
--- normal/handler.c	2002-11-06 14:33:20.000000000 +0100
+++ src/handler.c	2002-11-07 15:21:38.000000000 +0100
@@ -106,16 +106,8 @@ int is_name(const char *str, const char 
 
 
 
-void affect_modify(struct char_data *ch, byte loc, sbyte mod, 
-                   bitvector_t bitv, bool add)
+void aff_apply_modify(struct char_data *ch, byte loc, sbyte mod, char *msg)
 {
-  if (add)
-    SET_BIT(AFF_FLAGS(ch), bitv);
-  else {
-    REMOVE_BIT(AFF_FLAGS(ch), bitv);
-    mod = -mod;
-  }
-
   switch (loc) {
   case APPLY_NONE:
     break;
@@ -224,7 +216,40 @@ void affect_modify(struct char_data *ch,
   } /* switch */
 }
 
-
+
+void affect_modify(struct char_data * ch, byte loc, sbyte mod, long bitv, bool add)
+{
+  if (add) {
+    SET_BIT_AR(AFF_FLAGS(ch), bitv);
+  } else {
+    REMOVE_BIT_AR(AFF_FLAGS(ch), bitv);
+    mod = -mod;
+  }
+
+  aff_apply_modify(ch, loc, mod, "affect_modify");
+}
+
+
+void affect_modify_ar(struct char_data * ch, byte loc, sbyte mod, int bitv[], bool add)
+{
+  int i , j;
+
+  if (add) {
+    for(i = 0; i < AF_ARRAY_MAX; i++)
+      for(j = 0; j < 32; j++)
+        if(IS_SET_AR(bitv, (i*32)+j))
+          SET_BIT_AR(AFF_FLAGS(ch), (i*32)+j);
+  } else {
+    for(i = 0; i < AF_ARRAY_MAX; i++)
+      for(j = 0; j < 32; j++)
+        if(IS_SET_AR(bitv, (i*32)+j))
+          REMOVE_BIT_AR(AFF_FLAGS(ch), (i*32)+j);
+    mod = -mod;
+  }
+
+  aff_apply_modify(ch, loc, mod, "affect_modify_ar");
+}
+
 
 /* This updates a character by subtracting everything he is affected by */
 /* restoring original abilities, and then affecting all again           */
@@ -236,7 +261,7 @@ void affect_total(struct char_data *ch)
   for (i = 0; i < NUM_WEARS; i++) {
     if (GET_EQ(ch, i))
       for (j = 0; j < MAX_OBJ_AFFECT; j++)
-	affect_modify(ch, GET_EQ(ch, i)->affected[j].location,
+	affect_modify_ar(ch, GET_EQ(ch, i)->affected[j].location,
 		      GET_EQ(ch, i)->affected[j].modifier,
 		      GET_OBJ_AFFECT(GET_EQ(ch, i)), FALSE);
   }
@@ -250,7 +275,7 @@ void affect_total(struct char_data *ch)
   for (i = 0; i < NUM_WEARS; i++) {
     if (GET_EQ(ch, i))
       for (j = 0; j < MAX_OBJ_AFFECT; j++)
-	affect_modify(ch, GET_EQ(ch, i)->affected[j].location,
+	affect_modify_ar(ch, GET_EQ(ch, i)->affected[j].location,
 		      GET_EQ(ch, i)->affected[j].modifier,
 		      GET_OBJ_AFFECT(GET_EQ(ch, i)), TRUE);
   }
@@ -446,7 +471,7 @@ void obj_to_char(struct obj_data *object
 
     /* set flag for crash-save system, but not on mobs! */
     if (!IS_NPC(ch))
-      SET_BIT(PLR_FLAGS(ch), PLR_CRASH);
+      SET_BIT_AR(PLR_FLAGS(ch), PLR_CRASH);
   } else
     log("SYSERR: NULL obj (%p) or char (%p) passed to obj_to_char.", object, ch);
 }
@@ -465,7 +490,7 @@ void obj_from_char(struct obj_data *obje
 
   /* set flag for crash-save system, but not on mobs! */
   if (!IS_NPC(object->carried_by))
-    SET_BIT(PLR_FLAGS(object->carried_by), PLR_CRASH);
+    SET_BIT_AR(PLR_FLAGS(object->carried_by), PLR_CRASH);
 
   IS_CARRYING_W(object->carried_by) -= GET_OBJ_WEIGHT(object);
   IS_CARRYING_N(object->carried_by)--;
@@ -563,7 +588,7 @@ void equip_char(struct char_data *ch, st
     log("SYSERR: IN_ROOM(ch) = NOWHERE when equipping char %s.", GET_NAME(ch));
 
   for (j = 0; j < MAX_OBJ_AFFECT; j++)
-    affect_modify(ch, obj->affected[j].location,
+    affect_modify_ar(ch, obj->affected[j].location,
 		  obj->affected[j].modifier,
 		  GET_OBJ_AFFECT(obj), TRUE);
 
@@ -599,7 +624,7 @@ struct obj_data *unequip_char(struct cha
   GET_EQ(ch, pos) = NULL;
 
   for (j = 0; j < MAX_OBJ_AFFECT; j++)
-    affect_modify(ch, obj->affected[j].location,
+    affect_modify_ar(ch, obj->affected[j].location,
 		  obj->affected[j].modifier,
 		  GET_OBJ_AFFECT(obj), FALSE);
 
@@ -711,7 +736,7 @@ void obj_to_room(struct obj_data *object
     IN_ROOM(object) = room;
     object->carried_by = NULL;
     if (ROOM_FLAGGED(room, ROOM_HOUSE))
-      SET_BIT(ROOM_FLAGS(room), ROOM_HOUSE_CRASH);
+      SET_BIT_AR(ROOM_FLAGS(room), ROOM_HOUSE_CRASH);
   }
 }
 
@@ -730,7 +755,7 @@ void obj_from_room(struct obj_data *obje
   REMOVE_FROM_LIST(object, world[IN_ROOM(object)].contents, next_content);
 
   if (ROOM_FLAGGED(IN_ROOM(object), ROOM_HOUSE))
-    SET_BIT(ROOM_FLAGS(IN_ROOM(object)), ROOM_HOUSE_CRASH);
+    SET_BIT_AR(ROOM_FLAGS(IN_ROOM(object)), ROOM_HOUSE_CRASH);
   IN_ROOM(object) = NOWHERE;
   object->next_content = NULL;
 }
@@ -993,9 +1018,9 @@ void extract_char_final(struct char_data
 void extract_char(struct char_data *ch)
 {
   if (IS_NPC(ch))
-    SET_BIT(MOB_FLAGS(ch), MOB_NOTDEADYET);
+    SET_BIT_AR(MOB_FLAGS(ch), MOB_NOTDEADYET);
   else
-    SET_BIT(PLR_FLAGS(ch), PLR_NOTDEADYET);
+    SET_BIT_AR(PLR_FLAGS(ch), PLR_NOTDEADYET);
 
   extractions_pending++;
 }
@@ -1022,9 +1047,9 @@ void extract_pending_chars(void)
     next_vict = vict->next;
 
     if (MOB_FLAGGED(vict, MOB_NOTDEADYET))
-      REMOVE_BIT(MOB_FLAGS(vict), MOB_NOTDEADYET);
+      REMOVE_BIT_AR(MOB_FLAGS(vict), MOB_NOTDEADYET);
     else if (PLR_FLAGGED(vict, PLR_NOTDEADYET))
-      REMOVE_BIT(PLR_FLAGS(vict), PLR_NOTDEADYET);
+      REMOVE_BIT_AR(PLR_FLAGS(vict), PLR_NOTDEADYET);
     else {
       /* Last non-free'd character to continue chain from. */
       prev_vict = vict;
@@ -1292,6 +1317,7 @@ struct obj_data *create_money(int amount
   struct obj_data *obj;
   struct extra_descr_data *new_descr;
   char buf[200];
+  int y;
 
   if (amount <= 0) {
     log("SYSERR: Try to create negative or 0 money. (%d)", amount);
@@ -1331,7 +1357,9 @@ struct obj_data *create_money(int amount
   obj->ex_description = new_descr;
 
   GET_OBJ_TYPE(obj) = ITEM_MONEY;
-  GET_OBJ_WEAR(obj) = ITEM_WEAR_TAKE;
+  for(y = 0; y < TW_ARRAY_MAX; y++)
+    obj->obj_flags.wear_flags[y] = 0;
+  SET_BIT_AR(GET_OBJ_WEAR(obj), ITEM_WEAR_TAKE);
   GET_OBJ_VAL(obj, 0) = amount;
   GET_OBJ_COST(obj) = amount;
   obj->item_number = NOTHING;
diff -puN normal/handler.h src/handler.h
--- normal/handler.h	2002-06-22 01:23:52.000000000 +0200
+++ src/handler.h	2002-11-07 15:18:36.000000000 +0100
@@ -10,7 +10,7 @@
 
 /* handling the affected-structures */
 void	affect_total(struct char_data *ch);
-void	affect_modify(struct char_data *ch, byte loc, sbyte mod, bitvector_t bitv, bool add);
+void	affect_modify(struct char_data * ch, byte loc, sbyte mod, long bitv, bool add);
 void	affect_to_char(struct char_data *ch, struct affected_type *af);
 void	affect_remove(struct char_data *ch, struct affected_type *af);
 void	affect_from_char(struct char_data *ch, int type);
diff -puN normal/house.c src/house.c
--- normal/house.c	2002-05-02 05:13:34.000000000 +0200
+++ src/house.c	2002-11-07 15:21:56.000000000 +0100
@@ -143,7 +143,7 @@ void House_crashsave(room_vnum vnum)
   }
   fclose(fp);
   House_restore_weight(world[rnum].contents);
-  REMOVE_BIT(ROOM_FLAGS(rnum), ROOM_HOUSE_CRASH);
+  REMOVE_BIT_AR(ROOM_FLAGS(rnum), ROOM_HOUSE_CRASH);
 }
 
 
@@ -276,8 +276,9 @@ void House_boot(void)
 
     house_control[num_of_houses++] = temp_house;
 
-    SET_BIT(ROOM_FLAGS(real_house), ROOM_HOUSE | ROOM_PRIVATE);
-    SET_BIT(ROOM_FLAGS(real_atrium), ROOM_ATRIUM);
+    SET_BIT_AR(ROOM_FLAGS(real_house), ROOM_HOUSE); 
+	SET_BIT_AR(ROOM_FLAGS(real_house), ROOM_PRIVATE);
+    SET_BIT_AR(ROOM_FLAGS(real_atrium), ROOM_ATRIUM);
     House_load(temp_house.vnum);
   }
 
@@ -415,8 +416,9 @@ void hcontrol_build_house(struct char_da
 
   house_control[num_of_houses++] = temp_house;
 
-  SET_BIT(ROOM_FLAGS(real_house), ROOM_HOUSE | ROOM_PRIVATE);
-  SET_BIT(ROOM_FLAGS(real_atrium), ROOM_ATRIUM);
+  SET_BIT_AR(ROOM_FLAGS(real_house), ROOM_HOUSE);
+  SET_BIT_AR(ROOM_FLAGS(real_house), ROOM_PRIVATE);
+  SET_BIT_AR(ROOM_FLAGS(real_atrium), ROOM_ATRIUM);
   House_crashsave(virt_house);
 
   send_to_char(ch, "House built.  Mazel tov!\r\n");
@@ -441,13 +443,16 @@ void hcontrol_destroy_house(struct char_
   if ((real_atrium = real_room(house_control[i].atrium)) == NOWHERE)
     log("SYSERR: House %d had invalid atrium %d!", atoi(arg), house_control[i].atrium);
   else
-    REMOVE_BIT(ROOM_FLAGS(real_atrium), ROOM_ATRIUM);
+    REMOVE_BIT_AR(ROOM_FLAGS(real_atrium), ROOM_ATRIUM);
 
   if ((real_house = real_room(house_control[i].vnum)) == NOWHERE)
     log("SYSERR: House %d had invalid vnum %d!", atoi(arg), house_control[i].vnum);
-  else
-    REMOVE_BIT(ROOM_FLAGS(real_house), ROOM_HOUSE | ROOM_PRIVATE | ROOM_HOUSE_CRASH);
-
+  else {
+    REMOVE_BIT_AR(ROOM_FLAGS(real_house), ROOM_HOUSE); 
+    REMOVE_BIT_AR(ROOM_FLAGS(real_house), ROOM_PRIVATE); 
+    REMOVE_BIT_AR(ROOM_FLAGS(real_house), ROOM_HOUSE_CRASH); 
+  }
+  
   House_delete_file(house_control[i].vnum);
 
   for (j = i; j < num_of_houses - 1; j++)
@@ -465,7 +470,7 @@ void hcontrol_destroy_house(struct char_
    */
   for (i = 0; i < num_of_houses; i++)
     if ((real_atrium = real_room(house_control[i].atrium)) != NOWHERE)
-      SET_BIT(ROOM_FLAGS(real_atrium), ROOM_ATRIUM);
+      SET_BIT_AR(ROOM_FLAGS(real_atrium), ROOM_ATRIUM);
 }
 
 
diff -puN normal/interpreter.c src/interpreter.c
--- normal/interpreter.c	2002-11-06 14:33:42.000000000 +0100
+++ src/interpreter.c	2002-11-07 14:44:38.000000000 +0100
@@ -665,7 +665,7 @@ void command_interpreter(struct char_dat
   char *line;
   char arg[MAX_INPUT_LENGTH];
 
-  REMOVE_BIT(AFF_FLAGS(ch), AFF_HIDE);
+  REMOVE_BIT_AR(AFF_FLAGS(ch), AFF_HIDE);
 
   /* just drop to next line for hitting CR */
   skip_spaces(&argument);
@@ -1345,8 +1345,9 @@ int perform_dupe_check(struct descriptor
   d->character->desc = d;
   d->original = NULL;
   d->character->char_specials.timer = 0;
-  REMOVE_BIT(PLR_FLAGS(d->character), PLR_MAILING | PLR_WRITING);
-  REMOVE_BIT(AFF_FLAGS(d->character), AFF_GROUP);
+  REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_MAILING);
+  REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_WRITING);
+  REMOVE_BIT_AR(AFF_FLAGS(d->character), AFF_GROUP);
   STATE(d) = CON_PLAYING;
 
   switch (mode) {
@@ -1457,9 +1458,10 @@ void nanny(struct descriptor_data *d, ch
 	  STATE(d) = CON_NAME_CNFRM;
 	} else {
 	  /* undo it just in case they are set */
-	  REMOVE_BIT(PLR_FLAGS(d->character),
-		     PLR_WRITING | PLR_MAILING | PLR_CRYO);
-	  REMOVE_BIT(AFF_FLAGS(d->character), AFF_GROUP);
+	  REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_WRITING);
+	  REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_MAILING);
+	  REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_CRYO);
+	  REMOVE_BIT_AR(AFF_FLAGS(d->character), AFF_GROUP);
 	  write_to_output(d, "Password: ");
 	  echo_off(d);
 	  d->idle_tics = 0;
@@ -1814,7 +1816,7 @@ void nanny(struct descriptor_data *d, ch
 	return;
       }
       if (GET_LEVEL(d->character) < LVL_GRGOD)
-	SET_BIT(PLR_FLAGS(d->character), PLR_DELETED);
+	SET_BIT_AR(PLR_FLAGS(d->character), PLR_DELETED);
       save_char(d->character);
       Crash_delete_file(GET_NAME(d->character));
       delete_aliases(GET_NAME(d->character));
diff -puN normal/magic.c src/magic.c
--- normal/magic.c	2002-11-06 14:33:20.000000000 +0100
+++ src/magic.c	2002-11-07 14:48:18.000000000 +0100
@@ -773,7 +773,7 @@ void mag_summons(int level, struct char_
     char_to_room(mob, IN_ROOM(ch));
     IS_CARRYING_W(mob) = 0;
     IS_CARRYING_N(mob) = 0;
-    SET_BIT(AFF_FLAGS(mob), AFF_CHARM);
+    SET_BIT_AR(AFF_FLAGS(mob), AFF_CHARM);
     if (spellnum == SPELL_CLONE) {
       /* Don't mess up the prototype; use new string copies. */
       mob->player.name = strdup(GET_NAME(ch));
@@ -884,13 +884,13 @@ void mag_alter_objs(int level, struct ch
     case SPELL_BLESS:
       if (!OBJ_FLAGGED(obj, ITEM_BLESS) &&
 	  (GET_OBJ_WEIGHT(obj) <= 5 * GET_LEVEL(ch))) {
-	SET_BIT(GET_OBJ_EXTRA(obj), ITEM_BLESS);
+	SET_BIT_AR(GET_OBJ_EXTRA(obj), ITEM_BLESS);
 	to_char = "$p glows briefly.";
       }
       break;
     case SPELL_CURSE:
       if (!OBJ_FLAGGED(obj, ITEM_NODROP)) {
-	SET_BIT(GET_OBJ_EXTRA(obj), ITEM_NODROP);
+	SET_BIT_AR(GET_OBJ_EXTRA(obj), ITEM_NODROP);
 	if (GET_OBJ_TYPE(obj) == ITEM_WEAPON)
 	  GET_OBJ_VAL(obj, 2)--;
 	to_char = "$p briefly glows red.";
@@ -898,7 +898,7 @@ void mag_alter_objs(int level, struct ch
       break;
     case SPELL_INVISIBLE:
       if (!OBJ_FLAGGED(obj, ITEM_NOINVIS | ITEM_INVISIBLE)) {
-        SET_BIT(GET_OBJ_EXTRA(obj), ITEM_INVISIBLE);
+        SET_BIT_AR(GET_OBJ_EXTRA(obj), ITEM_INVISIBLE);
         to_char = "$p vanishes.";
       }
       break;
@@ -912,7 +912,7 @@ void mag_alter_objs(int level, struct ch
       break;
     case SPELL_REMOVE_CURSE:
       if (OBJ_FLAGGED(obj, ITEM_NODROP)) {
-        REMOVE_BIT(GET_OBJ_EXTRA(obj), ITEM_NODROP);
+        REMOVE_BIT_AR(GET_OBJ_EXTRA(obj), ITEM_NODROP);
         if (GET_OBJ_TYPE(obj) == ITEM_WEAPON)
           GET_OBJ_VAL(obj, 2)++;
         to_char = "$p briefly glows blue.";
diff -puN normal/mail.c src/mail.c
--- normal/mail.c	2002-11-06 14:33:42.000000000 +0100
+++ src/mail.c	2002-11-07 15:22:52.000000000 +0100
@@ -560,7 +560,7 @@ void postmaster_send_mail(struct char_da
 
   act(buf, FALSE, mailman, 0, ch, TO_VICT);
   GET_GOLD(ch) -= STAMP_PRICE;
-  SET_BIT(PLR_FLAGS(ch), PLR_MAILING);	/* string_write() sets writing. */
+  SET_BIT_AR(PLR_FLAGS(ch), PLR_MAILING);	/* string_write() sets writing. */
 
   /* Start writing! */
   CREATE(mailwrite, char *, 1);
@@ -583,6 +583,7 @@ void postmaster_receive_mail(struct char
 {
   char buf[256];
   struct obj_data *obj;
+  int y;
 
   if (!has_mail(GET_IDNUM(ch))) {
     snprintf(buf, sizeof(buf), "$n tells you, 'Sorry, you don't have any mail waiting.'");
@@ -597,7 +598,10 @@ void postmaster_receive_mail(struct char
     obj->description = strdup("Someone has left a piece of mail here.");
 
     GET_OBJ_TYPE(obj) = ITEM_NOTE;
-    GET_OBJ_WEAR(obj) = ITEM_WEAR_TAKE | ITEM_WEAR_HOLD;
+    for(y = 0; y < TW_ARRAY_MAX; y++)
+      obj->obj_flags.wear_flags[y] = 0;
+    SET_BIT_AR(GET_OBJ_WEAR(obj), ITEM_WEAR_TAKE);
+    SET_BIT_AR(GET_OBJ_WEAR(obj), ITEM_WEAR_HOLD);
     GET_OBJ_WEIGHT(obj) = 1;
     GET_OBJ_COST(obj) = 30;
     GET_OBJ_RENT(obj) = 10;
diff -puN normal/medit.c src/medit.c
--- normal/medit.c	2002-11-06 14:33:20.000000000 +0100
+++ src/medit.c	2002-11-08 14:19:42.000000000 +0100
@@ -166,7 +166,7 @@ void init_mobile(struct char_data *mob)
   mob->real_abils.dex = mob->real_abils.con = mob->real_abils.cha = 11;
   mob->aff_abils = mob->real_abils;
 
-  SET_BIT(MOB_FLAGS(mob), MOB_ISNPC);
+  SET_BIT_AR(MOB_FLAGS(mob), MOB_ISNPC);
   mob->player_specials = &dummy_mob;
 }
 
@@ -405,7 +405,7 @@ void medit_disp_mob_flags(struct descrip
     write_to_output(d, "%s%2d%s) %-20.20s  %s", grn, i + 1, nrm, action_bits[i],
 		!(++columns % 2) ? "\r\n" : "");
   }
-  sprintbit(MOB_FLAGS(OLC_MOB(d)), action_bits, bitbuf, sizeof(bitbuf));
+  sprintbitarray(MOB_FLAGS(OLC_MOB(d)), action_bits, AF_ARRAY_MAX, bitbuf);
   write_to_output(d, "\r\nCurrent flags : %s%s%s\r\nEnter mob flags (0 to quit) : ",
 		  cyn, bitbuf, nrm);
 }
@@ -423,10 +423,10 @@ void medit_disp_aff_flags(struct descrip
   get_char_colors(d->character);
   clear_screen(d);
   for (i = 0; i < NUM_AFF_FLAGS; i++) {
-    write_to_output(d, "%s%2d%s) %-20.20s  %s", grn, i + 1, nrm, affected_bits[i],
+    write_to_output(d, "%s%2d%s) %-20.20s  %s", grn, i + 1, nrm, affected_bits[i+1],
 			!(++columns % 2) ? "\r\n" : "");
   }
-  sprintbit(AFF_FLAGS(OLC_MOB(d)), affected_bits, bitbuf, sizeof(bitbuf));
+  sprintbitarray(AFF_FLAGS(OLC_MOB(d)), affected_bits, AF_ARRAY_MAX, bitbuf);
   write_to_output(d, "\r\nCurrent flags   : %s%s%s\r\nEnter aff flags (0 to quit) : ",
 			  cyn, bitbuf, nrm);
 }
@@ -477,8 +477,9 @@ void medit_disp_menu(struct descriptor_d
 	  grn, nrm, cyn, GET_GOLD(mob), nrm
 	  );
 
-  sprintbit(MOB_FLAGS(mob), action_bits, mbitbuf, sizeof(mbitbuf));
-  sprintbit(AFF_FLAGS(mob), affected_bits, abitbuf, sizeof(abitbuf));
+  sprintbitarray(MOB_FLAGS(mob), action_bits, AF_ARRAY_MAX, mbitbuf);
+  sprintbitarray(AFF_FLAGS(mob), affected_bits, AF_ARRAY_MAX, abitbuf);
+
   write_to_output(d,
 	  "%sI%s) Position  : %s%s\r\n"
 	  "%sJ%s) Default   : %s%s\r\n"
@@ -532,7 +533,7 @@ void medit_parse(struct descriptor_data 
     /*
      * Ensure mob has MOB_ISNPC set or things will go pear shaped.
      */
-    SET_BIT(MOB_FLAGS(OLC_MOB(d)), MOB_ISNPC);
+    SET_BIT_AR(MOB_FLAGS(OLC_MOB(d)), MOB_ISNPC);
     switch (*arg) {
     case 'y':
     case 'Y':
@@ -754,7 +755,7 @@ void medit_parse(struct descriptor_data 
     if ((i = atoi(arg)) <= 0)
       break;
     else if (i <= NUM_MOB_FLAGS)
-      TOGGLE_BIT(MOB_FLAGS(OLC_MOB(d)), 1 << (i - 1));
+      TOGGLE_BIT_AR(MOB_FLAGS(OLC_MOB(d)), i - 1);
     medit_disp_mob_flags(d);
     return;
 /*-------------------------------------------------------------------*/
@@ -762,11 +763,13 @@ void medit_parse(struct descriptor_data 
     if ((i = atoi(arg)) <= 0)
       break;
     else if (i <= NUM_AFF_FLAGS)
-      TOGGLE_BIT(AFF_FLAGS(OLC_MOB(d)), 1 << (i - 1));
+      TOGGLE_BIT_AR(AFF_FLAGS(OLC_MOB(d)), i);
 
     /* Remove unwanted bits right away. */
-    REMOVE_BIT(AFF_FLAGS(OLC_MOB(d)), 
-               AFF_CHARM | AFF_POISON | AFF_GROUP | AFF_SLEEP);
+    REMOVE_BIT_AR(AFF_FLAGS(OLC_MOB(d)), AFF_CHARM); 
+	REMOVE_BIT_AR(AFF_FLAGS(OLC_MOB(d)), AFF_POISON);
+	REMOVE_BIT_AR(AFF_FLAGS(OLC_MOB(d)), AFF_GROUP);
+	REMOVE_BIT_AR(AFF_FLAGS(OLC_MOB(d)), AFF_SLEEP);
     medit_disp_aff_flags(d);
     return;
 /*-------------------------------------------------------------------*/
diff -puN normal/mobact.c src/mobact.c
--- normal/mobact.c	2002-04-09 16:12:16.000000000 +0200
+++ src/mobact.c	2002-11-07 14:48:18.000000000 +0100
@@ -54,7 +54,7 @@ void mobile_activity(void)
       if (mob_index[GET_MOB_RNUM(ch)].func == NULL) {
 	log("SYSERR: %s (#%d): Attempting to call non-existing mob function.",
 		GET_NAME(ch), GET_MOB_VNUM(ch));
-	REMOVE_BIT(MOB_FLAGS(ch), MOB_SPEC);
+	REMOVE_BIT_AR(MOB_FLAGS(ch), MOB_SPEC);
       } else {
         char actbuf[MAX_INPUT_LENGTH] = "";
 	if ((mob_index[GET_MOB_RNUM(ch)].func) (ch, ch, 0, actbuf))
diff -puN normal/modify.c src/modify.c
--- normal/modify.c	2002-11-06 14:33:20.000000000 +0100
+++ src/modify.c	2002-11-07 14:46:08.000000000 +0100
@@ -99,7 +99,7 @@ void smash_tilde(char *str)
 void string_write(struct descriptor_data *d, char **writeto, size_t len, long mailto, void *data)
 {
   if (d->character && !IS_NPC(d->character))
-    SET_BIT(PLR_FLAGS(d->character), PLR_WRITING);
+    SET_BIT_AR(PLR_FLAGS(d->character), PLR_WRITING);
 
   if (using_improved_editor)
     d->backstr = (char *)data;
@@ -218,8 +218,10 @@ void string_add(struct descriptor_data *
     d->str = NULL;
       d->mail_to = 0;
     d->max_str = 0;
-    if (d->character && !IS_NPC(d->character))
-      REMOVE_BIT(PLR_FLAGS(d->character), PLR_MAILING | PLR_WRITING);
+    if (d->character && !IS_NPC(d->character)) {
+      REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_MAILING);
+	  REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_WRITING);
+	}
   } else if (action != STRINGADD_ACTION && strlen(*d->str) + 3 <= d->max_str) /* 3 = \r\n\0 */
      strcat(*d->str, "\r\n");
 }
diff -puN normal/oasis.c src/oasis.c
--- normal/oasis.c	2002-11-06 14:33:20.000000000 +0100
+++ src/oasis.c	2002-11-07 14:48:18.000000000 +0100
@@ -279,7 +279,7 @@ ACMD(do_oasis)
     break;
   }
   act("$n starts using OLC.", TRUE, d->character, 0, 0, TO_ROOM);
-  SET_BIT(PLR_FLAGS(ch), PLR_WRITING);
+  SET_BIT_AR(PLR_FLAGS(ch), PLR_WRITING);
   mudlog(BRF, LVL_IMMORT, TRUE, "OLC: %s starts editing zone %d allowed zone %d", GET_NAME(ch), zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(ch));
 }
 
@@ -379,7 +379,7 @@ void cleanup_olc(struct descriptor_data 
    * Restore descriptor playing status.
    */
   if (d->character) {
-    REMOVE_BIT(PLR_FLAGS(d->character), PLR_WRITING);
+    REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_WRITING);
     STATE(d) = CON_PLAYING;
     act("$n stops using OLC.", TRUE, d->character, NULL, NULL, TO_ROOM);
     mudlog(BRF, LVL_IMMORT, TRUE, "OLC: %s stops editing zone %d allowed zone %d", GET_NAME(d->character), zone_table[OLC_ZNUM(d)].number, GET_OLC_ZONE(d->character));
diff -puN normal/objsave.c src/objsave.c
--- normal/objsave.c	2002-05-02 05:12:42.000000000 +0200
+++ src/objsave.c	2002-11-07 15:26:16.000000000 +0100
@@ -69,7 +69,7 @@ struct obj_data *Obj_from_store(struct o
 {
   struct obj_data *obj;
   obj_rnum itemnum;
-  int j;
+  int j, taeller;
 
   *location = 0;
   if ((itemnum = real_object(object.item_number)) == NOTHING)
@@ -83,10 +83,12 @@ struct obj_data *Obj_from_store(struct o
   GET_OBJ_VAL(obj, 1) = object.value[1];
   GET_OBJ_VAL(obj, 2) = object.value[2];
   GET_OBJ_VAL(obj, 3) = object.value[3];
-  GET_OBJ_EXTRA(obj) = object.extra_flags;
+  for(taeller = 0; taeller < EF_ARRAY_MAX; taeller++)
+    GET_OBJ_EXTRA(obj)[taeller] = object.extra_flags[taeller];
   GET_OBJ_WEIGHT(obj) = object.weight;
   GET_OBJ_TIMER(obj) = object.timer;
-  GET_OBJ_AFFECT(obj) = object.bitvector;
+  for(taeller = 0; taeller < AF_ARRAY_MAX; taeller++)
+    GET_OBJ_AFFECT(obj)[taeller] = object.bitvector[taeller];
 
   for (j = 0; j < MAX_OBJ_AFFECT; j++)
     obj->affected[j] = object.affected[j];
@@ -98,7 +100,7 @@ struct obj_data *Obj_from_store(struct o
 
 int Obj_to_store(struct obj_data *obj, FILE *fl, int location)
 {
-  int j;
+  int j, taeller;
   struct obj_file_elem object;
 
   object.item_number = GET_OBJ_VNUM(obj);
@@ -109,10 +111,12 @@ int Obj_to_store(struct obj_data *obj, F
   object.value[1] = GET_OBJ_VAL(obj, 1);
   object.value[2] = GET_OBJ_VAL(obj, 2);
   object.value[3] = GET_OBJ_VAL(obj, 3);
-  object.extra_flags = GET_OBJ_EXTRA(obj);
+  for(taeller = 0; taeller < EF_ARRAY_MAX; taeller++)
+    object.extra_flags[taeller] = GET_OBJ_EXTRA(obj)[taeller];
   object.weight = GET_OBJ_WEIGHT(obj);
   object.timer = GET_OBJ_TIMER(obj);
-  object.bitvector = GET_OBJ_AFFECT(obj);
+  for(taeller = 0; taeller < AF_ARRAY_MAX; taeller++)
+    object.bitvector[taeller] = GET_OBJ_AFFECT(obj)[taeller];
   for (j = 0; j < MAX_OBJ_AFFECT; j++)
     object.affected[j] = obj->affected[j];
 
@@ -767,7 +771,7 @@ void Crash_crashsave(struct char_data *c
   Crash_restore_weight(ch->carrying);
 
   fclose(fp);
-  REMOVE_BIT(PLR_FLAGS(ch), PLR_CRASH);
+  REMOVE_BIT_AR(PLR_FLAGS(ch), PLR_CRASH);
 }
 
 
@@ -942,7 +946,7 @@ void Crash_cryosave(struct char_data *ch
   fclose(fp);
 
   Crash_extract_objs(ch->carrying);
-  SET_BIT(PLR_FLAGS(ch), PLR_CRYO);
+  SET_BIT_AR(PLR_FLAGS(ch), PLR_CRYO);
 }
 
 
@@ -1124,7 +1128,7 @@ int gen_receptionist(struct char_data *c
 	  FALSE, recep, 0, ch, TO_VICT);
       Crash_cryosave(ch, cost);
       mudlog(NRM, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE, "%s has cryo-rented.", GET_NAME(ch));
-      SET_BIT(PLR_FLAGS(ch), PLR_CRYO);
+      SET_BIT_AR(PLR_FLAGS(ch), PLR_CRYO);
     }
 
     act("$n helps $N into $S private chamber.", FALSE, recep, 0, ch, TO_NOTVICT);
@@ -1159,7 +1163,7 @@ void Crash_save_all(void)
       if (PLR_FLAGGED(d->character, PLR_CRASH)) {
 	Crash_crashsave(d->character);
 	save_char(d->character);
-	REMOVE_BIT(PLR_FLAGS(d->character), PLR_CRASH);
+	REMOVE_BIT_AR(PLR_FLAGS(d->character), PLR_CRASH);
       }
     }
   }
diff -puN normal/oedit.c src/oedit.c
--- normal/oedit.c	2002-11-06 14:33:20.000000000 +0100
+++ src/oedit.c	2002-11-08 14:08:40.000000000 +0100
@@ -60,7 +60,7 @@ void oedit_setup_new(struct descriptor_d
   OLC_OBJ(d)->name = strdup("unfinished object");
   OLC_OBJ(d)->description = strdup("An unfinished object is lying here.");
   OLC_OBJ(d)->short_description = strdup("an unfinished object");
-  GET_OBJ_WEAR(OLC_OBJ(d)) = ITEM_WEAR_TAKE;
+  SET_BIT_AR(GET_OBJ_WEAR(OLC_OBJ(d)), ITEM_WEAR_TAKE);
   OLC_VAL(d) = 0;
   OLC_ITEM_TYPE(d) = OBJ_TRIGGER;
   oedit_disp_menu(d);
@@ -499,7 +499,7 @@ void oedit_disp_extra_menu(struct descri
     write_to_output(d, "%s%2d%s) %-20.20s %s", grn, counter + 1, nrm,
 		extra_bits[counter], !(++columns % 2) ? "\r\n" : "");
   }
-  sprintbit(GET_OBJ_EXTRA(OLC_OBJ(d)), extra_bits, bitbuf, sizeof(bitbuf));
+  sprintbitarray(GET_OBJ_EXTRA(OLC_OBJ(d)), extra_bits, EF_ARRAY_MAX, bitbuf);
   write_to_output(d, "\r\nObject flags: %s%s%s\r\n"
 	  "Enter object extra flag (0 to quit) : ",
 	  cyn, bitbuf, nrm);
@@ -520,7 +520,7 @@ void oedit_disp_perm_menu(struct descrip
     write_to_output(d, "%s%2d%s) %-20.20s %s", grn, counter + 1, 
                        nrm, affected_bits[counter], !(++columns % 2) ? "\r\n" : "");
   }
-  sprintbit(GET_OBJ_PERM(OLC_OBJ(d)), affected_bits, bitbuf, sizeof(bitbuf));
+  sprintbitarray(GET_OBJ_PERM(OLC_OBJ(d)), affected_bits, EF_ARRAY_MAX, bitbuf);
   write_to_output(d, "\r\nObject permanent flags: %s%s%s\r\n"
           "Enter object perm flag (0 to quit) : ", cyn, bitbuf, nrm);
 }
@@ -540,7 +540,7 @@ void oedit_disp_wear_menu(struct descrip
     write_to_output(d, "%s%2d%s) %-20.20s %s", grn, counter + 1, nrm,
 		wear_bits[counter], !(++columns % 2) ? "\r\n" : "");
   }
-  sprintbit(GET_OBJ_WEAR(OLC_OBJ(d)), wear_bits, bitbuf, sizeof(bitbuf));
+  sprintbitarray(GET_OBJ_WEAR(OLC_OBJ(d)), wear_bits, TW_ARRAY_MAX, bitbuf);
   write_to_output(d, "\r\nWear flags: %s%s%s\r\n"
 	  "Enter wear flag, 0 to quit : ", cyn, bitbuf, nrm);
 }
@@ -557,8 +557,8 @@ void oedit_disp_menu(struct descriptor_d
   get_char_colors(d->character);
   clear_screen(d);
 
-  sprinttype(GET_OBJ_TYPE(obj), item_types, tbitbuf, sizeof(tbitbuf));
-  sprintbit(GET_OBJ_EXTRA(obj), extra_bits, ebitbuf, sizeof(ebitbuf));
+  sprinttype(GET_OBJ_TYPE(obj), item_types, tbitbuf, sizeof(tbitbuf));
+  sprintbitarray(GET_OBJ_EXTRA(obj), extra_bits, EF_ARRAY_MAX, ebitbuf);
 
   write_to_output(d,
 	  "-- Item number : [%s%d%s]\r\n"
@@ -577,8 +577,8 @@ void oedit_disp_menu(struct descriptor_d
 	  grn, nrm, cyn, tbitbuf,
 	  grn, nrm, cyn, ebitbuf
 	  );
-  sprintbit(GET_OBJ_WEAR(obj), wear_bits, tbitbuf, sizeof(tbitbuf));
-  sprintbit(GET_OBJ_PERM(obj), affected_bits, ebitbuf, sizeof(ebitbuf));
+  sprintbitarray(GET_OBJ_WEAR(OLC_OBJ(d)), wear_bits, EF_ARRAY_MAX, tbitbuf);
+  sprintbitarray(GET_OBJ_PERM(OLC_OBJ(d)), affected_bits, EF_ARRAY_MAX, ebitbuf);
 
   write_to_output(d,
 	  "%s7%s) Wear flags  : %s%s\r\n"
@@ -815,7 +815,7 @@ void oedit_parse(struct descriptor_data 
     } else if (number == 0)
       break;
     else {
-      TOGGLE_BIT(GET_OBJ_EXTRA(OLC_OBJ(d)), 1 << (number - 1));
+      TOGGLE_BIT_AR(GET_OBJ_EXTRA(OLC_OBJ(d)), number - 1);
       oedit_disp_extra_menu(d);
       return;
     }
@@ -829,7 +829,7 @@ void oedit_parse(struct descriptor_data 
     } else if (number == 0)	/* Quit. */
       break;
     else {
-      TOGGLE_BIT(GET_OBJ_WEAR(OLC_OBJ(d)), 1 << (number - 1));
+      TOGGLE_BIT_AR(GET_OBJ_EXTRA(OLC_OBJ(d)), number - 1);
       oedit_disp_wear_menu(d);
       return;
     }
@@ -858,7 +858,7 @@ void oedit_parse(struct descriptor_data 
     if ((number = atoi(arg)) == 0)
       break;
     if (number > 0 && number <= NUM_AFF_FLAGS)
-      TOGGLE_BIT(GET_OBJ_PERM(OLC_OBJ(d)), 1 << (number - 1));
+      TOGGLE_BIT_AR(GET_OBJ_PERM(OLC_OBJ(d)), number - 1);
     oedit_disp_perm_menu(d);
     return;
 
diff -puN normal/redit.c src/redit.c
--- normal/redit.c	2002-11-06 14:33:20.000000000 +0100
+++ src/redit.c	2002-11-07 15:41:40.000000000 +0100
@@ -52,7 +52,7 @@ extern zone_rnum real_zone_by_thing(room
 ACMD(do_room_copy)
 {
    room_data *room_src, *room_dst;
-   int room_num, j, buf_num;
+   int room_num, j, buf_num, taeller;
    zone_rnum dst_zone;
    struct descriptor_data *dsc;
    char buf[MAX_INPUT_LENGTH];
@@ -95,7 +95,8 @@ ACMD(do_room_copy)
    room_dst->description = str_udup(world[IN_ROOM(ch)].description);
    room_dst->description = str_udup(world[IN_ROOM(ch)].description);
    room_dst->number = buf_num;
-   room_dst->room_flags = ROOM_FLAGS(IN_ROOM(ch));
+   for(taeller=0; taeller < RF_ARRAY_MAX; taeller++)
+     room_dst->room_flags[taeller] = ROOM_FLAGS(IN_ROOM(ch))[taeller];
    
   /*
    * Extra descriptions, if necessary.
@@ -634,7 +635,7 @@ void redit_disp_flag_menu(struct descrip
     write_to_output(d, "%s%2d%s) %-20.20s %s", grn, counter + 1, nrm,
 		room_bits[counter], !(++columns % 2) ? "\r\n" : "");
   }
-  sprintbit(OLC_ROOM(d)->room_flags, room_bits, bitbuf, sizeof(bitbuf));
+  sprintbitarray(OLC_ROOM(d)->room_flags, room_bits, RF_ARRAY_MAX, bitbuf);
   write_to_output(d, "\r\nRoom flags: %s%s%s\r\n"
 	  "Enter room flags, 0 to quit : ", cyn, bitbuf, nrm);
   OLC_MODE(d) = REDIT_FLAGS;
@@ -667,8 +668,8 @@ void redit_disp_menu(struct descriptor_d
   get_char_colors(d->character);
   clear_screen(d);
   room = OLC_ROOM(d);
-
-  sprintbit((long)room->room_flags, room_bits, rbitbuf, sizeof(rbitbuf));
+
+  sprintbitarray(room->room_flags, room_bits, RF_ARRAY_MAX, rbitbuf);
   sprinttype(room->sector_type, sector_types, sbitbuf, sizeof(sbitbuf));
   write_to_output(d,
 	  "-- Room number : [%s%d%s]  	Room zone: [%s%d%s]\r\n"
@@ -872,7 +873,7 @@ void redit_parse(struct descriptor_data 
       /*
        * Toggle the bit.
        */
-      TOGGLE_BIT(OLC_ROOM(d)->room_flags, 1 << (number - 1));
+      TOGGLE_BIT_AR(OLC_ROOM(d)->room_flags, number - 1);
       redit_disp_flag_menu(d);
     }
     return;
diff -puN normal/spec_procs.c src/spec_procs.c
--- normal/spec_procs.c	2002-09-26 02:41:38.000000000 +0200
+++ src/spec_procs.c	2002-11-07 14:39:24.000000000 +0100
@@ -675,7 +675,7 @@ SPECIAL(pet_shops)
 
     pet = read_mobile(GET_MOB_RNUM(pet), REAL);
     GET_EXP(pet) = 0;
-    SET_BIT(AFF_FLAGS(pet), AFF_CHARM);
+    SET_BIT_AR(AFF_FLAGS(pet), AFF_CHARM);
 
     if (*pet_name) {
       snprintf(buf, sizeof(buf), "%s %s", pet->player.name, pet_name);
diff -puN normal/spells.c src/spells.c
--- normal/spells.c	2002-11-06 14:33:20.000000000 +0100
+++ src/spells.c	2002-11-07 15:28:16.000000000 +0100
@@ -249,7 +249,7 @@ ASPELL(spell_charm)
 
     act("Isn't $n just such a nice fellow?", FALSE, ch, 0, victim, TO_VICT);
     if (IS_NPC(victim))
-      REMOVE_BIT(MOB_FLAGS(victim), MOB_SPEC);
+      REMOVE_BIT_AR(MOB_FLAGS(victim), MOB_SPEC);
   }
 }
 
@@ -267,11 +267,11 @@ ASPELL(spell_identify)
     send_to_char(ch, "You feel informed:\r\nObject '%s', Item type: %s\r\n", obj->short_description, bitbuf);
 
     if (GET_OBJ_AFFECT(obj)) {
-      sprintbit(GET_OBJ_AFFECT(obj), affected_bits, bitbuf, sizeof(bitbuf));
+      sprintbitarray(GET_OBJ_AFFECT(obj), affected_bits, AF_ARRAY_MAX, bitbuf);
       send_to_char(ch, "Item will give you following abilities:  %s\r\n", bitbuf);
     }
 
-    sprintbit(GET_OBJ_EXTRA(obj), extra_bits, bitbuf, sizeof(bitbuf));
+    sprintbitarray(GET_OBJ_EXTRA(obj), affected_bits, AF_ARRAY_MAX, bitbuf);
     send_to_char(ch, "Item is: %s\r\n", bitbuf);
 
     send_to_char(ch, "Weight: %d, Value: %d, Rent: %d, Min Level: %d\r\n", GET_OBJ_WEIGHT(obj), GET_OBJ_COST(obj), GET_OBJ_RENT(obj), GET_OBJ_LEVEL(obj));
@@ -364,7 +364,7 @@ ASPELL(spell_enchant_weapon)
     if (obj->affected[i].location != APPLY_NONE)
       return;
 
-  SET_BIT(GET_OBJ_EXTRA(obj), ITEM_MAGIC);
+  SET_BIT_AR(GET_OBJ_EXTRA(obj), ITEM_MAGIC);
 
   obj->affected[0].location = APPLY_HITROLL;
   obj->affected[0].modifier = 1 + (level >= 18);
@@ -373,10 +373,10 @@ ASPELL(spell_enchant_weapon)
   obj->affected[1].modifier = 1 + (level >= 20);
 
   if (IS_GOOD(ch)) {
-    SET_BIT(GET_OBJ_EXTRA(obj), ITEM_ANTI_EVIL);
+    SET_BIT_AR(GET_OBJ_EXTRA(obj), ITEM_ANTI_EVIL);
     act("$p glows blue.", FALSE, ch, obj, 0, TO_CHAR);
   } else if (IS_EVIL(ch)) {
-    SET_BIT(GET_OBJ_EXTRA(obj), ITEM_ANTI_GOOD);
+    SET_BIT_AR(GET_OBJ_EXTRA(obj), ITEM_ANTI_GOOD);
     act("$p glows red.", FALSE, ch, obj, 0, TO_CHAR);
   } else
     act("$p glows yellow.", FALSE, ch, obj, 0, TO_CHAR);
diff -puN normal/structs.h src/structs.h
--- normal/structs.h	2002-11-06 14:33:42.000000000 +0100
+++ src/structs.h	2002-11-07 14:33:40.000000000 +0100
@@ -72,23 +72,23 @@
 
 /* Room flags: used in room_data.room_flags */
 /* WARNING: In the world files, NEVER set the bits marked "R" ("Reserved") */
-#define ROOM_DARK		(1 << 0)   /* Dark			*/
-#define ROOM_DEATH		(1 << 1)   /* Death trap		*/
-#define ROOM_NOMOB		(1 << 2)   /* MOBs not allowed		*/
-#define ROOM_INDOORS		(1 << 3)   /* Indoors			*/
-#define ROOM_PEACEFUL		(1 << 4)   /* Violence not allowed	*/
-#define ROOM_SOUNDPROOF		(1 << 5)   /* Shouts, gossip blocked	*/
-#define ROOM_NOTRACK		(1 << 6)   /* Track won't go through	*/
-#define ROOM_NOMAGIC		(1 << 7)   /* Magic not allowed		*/
-#define ROOM_TUNNEL		(1 << 8)   /* room for only 1 pers	*/
-#define ROOM_PRIVATE		(1 << 9)   /* Can't teleport in		*/
-#define ROOM_GODROOM		(1 << 10)  /* LVL_GOD+ only allowed	*/
-#define ROOM_HOUSE		(1 << 11)  /* (R) Room is a house	*/
-#define ROOM_HOUSE_CRASH	(1 << 12)  /* (R) House needs saving	*/
-#define ROOM_ATRIUM		(1 << 13)  /* (R) The door to a house	*/
-#define ROOM_OLC		(1 << 14)  /* (R) Modifyable/!compress	*/
-#define ROOM_BFS_MARK		(1 << 15)  /* (R) breath-first srch mrk	*/
-
+#define ROOM_DARK		0   /* Dark			*/
+#define ROOM_DEATH		1   /* Death trap		*/
+#define ROOM_NOMOB		2   /* MOBs not allowed		*/
+#define ROOM_INDOORS	3   /* Indoors			*/
+#define ROOM_PEACEFUL	4   /* Violence not allowed	*/
+#define ROOM_SOUNDPROOF	5   /* Shouts, gossip blocked	*/
+#define ROOM_NOTRACK	6   /* Track won't go through	*/
+#define ROOM_NOMAGIC	7   /* Magic not allowed		*/
+#define ROOM_TUNNEL		8   /* room for only 1 pers	*/
+#define ROOM_PRIVATE	9   /* Can't teleport in		*/
+#define ROOM_GODROOM	10  /* LVL_GOD+ only allowed	*/
+#define ROOM_HOUSE		11  /* (R) Room is a house	*/
+#define ROOM_HOUSE_CRASH 12  /* (R) House needs saving	*/
+#define ROOM_ATRIUM		13  /* (R) The door to a house	*/
+#define ROOM_OLC		14  /* (R) Modifyable/!compress	*/
+#define ROOM_BFS_MARK	15  /* (R) breath-first srch mrk	*/
+
 
 /* Exit info: used in room_data.dir_option.exit_info */
 #define EX_ISDOOR		(1 << 0)   /* Exit is a door		*/
@@ -150,99 +150,101 @@
 
 
 /* Player flags: used by char_data.char_specials.act */
-#define PLR_KILLER	(1 << 0)   /* Player is a player-killer		*/
-#define PLR_THIEF	(1 << 1)   /* Player is a player-thief		*/
-#define PLR_FROZEN	(1 << 2)   /* Player is frozen			*/
-#define PLR_DONTSET     (1 << 3)   /* Don't EVER set (ISNPC bit)	*/
-#define PLR_WRITING	(1 << 4)   /* Player writing (board/mail/olc)	*/
-#define PLR_MAILING	(1 << 5)   /* Player is writing mail		*/
-#define PLR_CRASH	(1 << 6)   /* Player needs to be crash-saved	*/
-#define PLR_SITEOK	(1 << 7)   /* Player has been site-cleared	*/
-#define PLR_NOSHOUT	(1 << 8)   /* Player not allowed to shout/goss	*/
-#define PLR_NOTITLE	(1 << 9)   /* Player not allowed to set title	*/
-#define PLR_DELETED	(1 << 10)  /* Player deleted - space reusable	*/
-#define PLR_LOADROOM	(1 << 11)  /* Player uses nonstandard loadroom	*/
-#define PLR_NOWIZLIST	(1 << 12)  /* Player shouldn't be on wizlist	*/
-#define PLR_NODELETE	(1 << 13)  /* Player shouldn't be deleted	*/
-#define PLR_INVSTART	(1 << 14)  /* Player should enter game wizinvis	*/
-#define PLR_CRYO	(1 << 15)  /* Player is cryo-saved (purge prog)	*/
-#define PLR_NOTDEADYET	(1 << 16)  /* (R) Player being extracted.	*/
+#define PLR_KILLER		0   /* Player is a player-killer		*/
+#define PLR_THIEF		1   /* Player is a player-thief		*/
+#define PLR_FROZEN		2   /* Player is frozen			*/
+#define PLR_DONTSET		3   /* Don't EVER set (ISNPC bit)	*/
+#define PLR_WRITING		4   /* Player writing (board/mail/olc)	*/
+#define PLR_MAILING		5   /* Player is writing mail		*/
+#define PLR_CRASH		6   /* Player needs to be crash-saved	*/
+#define PLR_SITEOK		7   /* Player has been site-cleared	*/
+#define PLR_NOSHOUT		8   /* Player not allowed to shout/goss	*/
+#define PLR_NOTITLE		9   /* Player not allowed to set title	*/
+#define PLR_DELETED		10  /* Player deleted - space reusable	*/
+#define PLR_LOADROOM	11  /* Player uses nonstandard loadroom	*/
+#define PLR_NOWIZLIST	12  /* Player shouldn't be on wizlist	*/
+#define PLR_NODELETE	13  /* Player shouldn't be deleted	*/
+#define PLR_INVSTART	14  /* Player should enter game wizinvis	*/
+#define PLR_CRYO		15  /* Player is cryo-saved (purge prog)	*/
+#define PLR_NOTDEADYET	16  /* (R) Player being extracted.	*/
 
 
 /* Mobile flags: used by char_data.char_specials.act */
-#define MOB_SPEC         (1 << 0)  /* Mob has a callable spec-proc	*/
-#define MOB_SENTINEL     (1 << 1)  /* Mob should not move		*/
-#define MOB_SCAVENGER    (1 << 2)  /* Mob picks up stuff on the ground	*/
-#define MOB_ISNPC        (1 << 3)  /* (R) Automatically set on all Mobs	*/
-#define MOB_AWARE	 (1 << 4)  /* Mob can't be backstabbed		*/
-#define MOB_AGGRESSIVE   (1 << 5)  /* Mob auto-attacks everybody nearby	*/
-#define MOB_STAY_ZONE    (1 << 6)  /* Mob shouldn't wander out of zone	*/
-#define MOB_WIMPY        (1 << 7)  /* Mob flees if severely injured	*/
-#define MOB_AGGR_EVIL	 (1 << 8)  /* Auto-attack any evil PC's		*/
-#define MOB_AGGR_GOOD	 (1 << 9)  /* Auto-attack any good PC's		*/
-#define MOB_AGGR_NEUTRAL (1 << 10) /* Auto-attack any neutral PC's	*/
-#define MOB_MEMORY	 (1 << 11) /* remember attackers if attacked	*/
-#define MOB_HELPER	 (1 << 12) /* attack PCs fighting other NPCs	*/
-#define MOB_NOCHARM	 (1 << 13) /* Mob can't be charmed		*/
-#define MOB_NOSUMMON	 (1 << 14) /* Mob can't be summoned		*/
-#define MOB_NOSLEEP	 (1 << 15) /* Mob can't be slept		*/
-#define MOB_NOBASH	 (1 << 16) /* Mob can't be bashed (e.g. trees)	*/
-#define MOB_NOBLIND	 (1 << 17) /* Mob can't be blinded		*/
-#define MOB_NOTDEADYET   (1 << 18) /* (R) Mob being extracted.		*/
+#define MOB_SPEC         0  /* Mob has a callable spec-proc	*/
+#define MOB_SENTINEL     1  /* Mob should not move		*/
+#define MOB_SCAVENGER    2  /* Mob picks up stuff on the ground	*/
+#define MOB_ISNPC        3  /* (R) Automatically set on all Mobs	*/
+#define MOB_AWARE	     4  /* Mob can't be backstabbed		*/
+#define MOB_AGGRESSIVE   5  /* Mob auto-attacks everybody nearby	*/
+#define MOB_STAY_ZONE    6  /* Mob shouldn't wander out of zone	*/
+#define MOB_WIMPY        7  /* Mob flees if severely injured	*/
+#define MOB_AGGR_EVIL	 8  /* Auto-attack any evil PC's		*/
+#define MOB_AGGR_GOOD	 9  /* Auto-attack any good PC's		*/
+#define MOB_AGGR_NEUTRAL 10 /* Auto-attack any neutral PC's	*/
+#define MOB_MEMORY	     11 /* remember attackers if attacked	*/
+#define MOB_HELPER	     12 /* attack PCs fighting other NPCs	*/
+#define MOB_NOCHARM	     13 /* Mob can't be charmed		*/
+#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_NOBLIND	     17 /* Mob can't be blinded		*/
+#define MOB_NOTDEADYET   18 /* (R) Mob being extracted.		*/
 
 
 /* Preference flags: used by char_data.player_specials.pref */
-#define PRF_BRIEF       (1 << 0)  /* Room descs won't normally be shown	*/
-#define PRF_COMPACT     (1 << 1)  /* No extra CRLF pair before prompts	*/
-#define PRF_DEAF	(1 << 2)  /* Can't hear shouts			*/
-#define PRF_NOTELL	(1 << 3)  /* Can't receive tells		*/
-#define PRF_DISPHP	(1 << 4)  /* Display hit points in prompt	*/
-#define PRF_DISPMANA	(1 << 5)  /* Display mana points in prompt	*/
-#define PRF_DISPMOVE	(1 << 6)  /* Display move points in prompt	*/
-#define PRF_AUTOEXIT	(1 << 7)  /* Display exits in a room		*/
-#define PRF_NOHASSLE	(1 << 8)  /* Aggr mobs won't attack		*/
-#define PRF_QUEST	(1 << 9)  /* On quest				*/
-#define PRF_SUMMONABLE	(1 << 10) /* Can be summoned			*/
-#define PRF_NOREPEAT	(1 << 11) /* No repetition of comm commands	*/
-#define PRF_HOLYLIGHT	(1 << 12) /* Can see in dark			*/
-#define PRF_COLOR_1	(1 << 13) /* Color (low bit)			*/
-#define PRF_COLOR_2	(1 << 14) /* Color (high bit)			*/
-#define PRF_NOWIZ	(1 << 15) /* Can't hear wizline			*/
-#define PRF_LOG1	(1 << 16) /* On-line System Log (low bit)	*/
-#define PRF_LOG2	(1 << 17) /* On-line System Log (high bit)	*/
-#define PRF_NOAUCT	(1 << 18) /* Can't hear auction channel		*/
-#define PRF_NOGOSS	(1 << 19) /* Can't hear gossip channel		*/
-#define PRF_NOGRATZ	(1 << 20) /* Can't hear grats channel		*/
-#define PRF_ROOMFLAGS	(1 << 21) /* Can see room flags (ROOM_x)	*/
-#define PRF_DISPAUTO	(1 << 22) /* Show prompt HP, MP, MV when < 30%.	*/
-#define PRF_CLS		(1 << 23) /* Clear screen in OasisOLC		*/
-#define PRF_BUILDWALK	(1 << 23) /* Build new rooms when walking	*/
-#define PRF_AFK		(1 << 24)
+#define PRF_BRIEF       0  /* Room descs won't normally be shown	*/
+#define PRF_COMPACT     1  /* No extra CRLF pair before prompts	*/
+#define PRF_DEAF	    2  /* Can't hear shouts			*/
+#define PRF_NOTELL	    3  /* Can't receive tells		*/
+#define PRF_DISPHP	    4  /* Display hit points in prompt	*/
+#define PRF_DISPMANA	5  /* Display mana points in prompt	*/
+#define PRF_DISPMOVE	6  /* Display move points in prompt	*/
+#define PRF_AUTOEXIT	7  /* Display exits in a room		*/
+#define PRF_NOHASSLE	8  /* Aggr mobs won't attack		*/
+#define PRF_QUEST	    9  /* On quest				*/
+#define PRF_SUMMONABLE	10 /* Can be summoned			*/
+#define PRF_NOREPEAT	11 /* No repetition of comm commands	*/
+#define PRF_HOLYLIGHT	12 /* Can see in dark			*/
+#define PRF_COLOR_1	    13 /* Color (low bit)			*/
+#define PRF_COLOR_2	    14 /* Color (high bit)			*/
+#define PRF_NOWIZ	    15 /* Can't hear wizline			*/
+#define PRF_LOG1	    16 /* On-line System Log (low bit)	*/
+#define PRF_LOG2	    17 /* On-line System Log (high bit)	*/
+#define PRF_NOAUCT	    18 /* Can't hear auction channel		*/
+#define PRF_NOGOSS      19 /* Can't hear gossip channel		*/
+#define PRF_NOGRATZ	    20 /* Can't hear grats channel		*/
+#define PRF_ROOMFLAGS	21 /* Can see room flags (ROOM_x)	*/
+#define PRF_DISPAUTO	22 /* Show prompt HP, MP, MV when < 30%.	*/
+#define PRF_CLS		    23 /* Clear screen in OasisOLC		*/
+#define PRF_BUILDWALK	24 /* Build new rooms when walking	*/
+#define PRF_AFK		    25
+
 
 /* Affect bits: used in char_data.char_specials.saved.affected_by */
 /* WARNING: In the world files, NEVER set the bits marked "R" ("Reserved") */
-#define AFF_BLIND             (1 << 0)	   /* (R) Char is blind		*/
-#define AFF_INVISIBLE         (1 << 1)	   /* Char is invisible		*/
-#define AFF_DETECT_ALIGN      (1 << 2)	   /* Char is sensitive to align*/
-#define AFF_DETECT_INVIS      (1 << 3)	   /* Char can see invis chars  */
-#define AFF_DETECT_MAGIC      (1 << 4)	   /* Char is sensitive to magic*/
-#define AFF_SENSE_LIFE        (1 << 5)	   /* Char can sense hidden life*/
-#define AFF_WATERWALK	      (1 << 6)	   /* Char can walk on water	*/
-#define AFF_SANCTUARY         (1 << 7)	   /* Char protected by sanct.	*/
-#define AFF_GROUP             (1 << 8)	   /* (R) Char is grouped	*/
-#define AFF_CURSE             (1 << 9)	   /* Char is cursed		*/
-#define AFF_INFRAVISION       (1 << 10)	   /* Char can see in dark	*/
-#define AFF_POISON            (1 << 11)	   /* (R) Char is poisoned	*/
-#define AFF_PROTECT_EVIL      (1 << 12)	   /* Char protected from evil  */
-#define AFF_PROTECT_GOOD      (1 << 13)	   /* Char protected from good  */
-#define AFF_SLEEP             (1 << 14)	   /* (R) Char magically asleep	*/
-#define AFF_NOTRACK	      (1 << 15)	   /* Char can't be tracked	*/
-#define AFF_UNUSED16	      (1 << 16)	   /* Room for future expansion	*/
-#define AFF_UNUSED17	      (1 << 17)	   /* Room for future expansion	*/
-#define AFF_SNEAK             (1 << 18)	   /* Char can move quietly	*/
-#define AFF_HIDE              (1 << 19)	   /* Char is hidden		*/
-#define AFF_UNUSED20	      (1 << 20)	   /* Room for future expansion	*/
-#define AFF_CHARM             (1 << 21)	   /* Char is charmed		*/
+#define AFF_DONTUSE           0    /* DON'T USE! */
+#define AFF_BLIND             1	   /* (R) Char is blind		*/
+#define AFF_INVISIBLE         2	   /* Char is invisible		*/
+#define AFF_DETECT_ALIGN      3	   /* Char is sensitive to align*/
+#define AFF_DETECT_INVIS      4	   /* Char can see invis chars  */
+#define AFF_DETECT_MAGIC      5	   /* Char is sensitive to magic*/
+#define AFF_SENSE_LIFE        6	   /* Char can sense hidden life*/
+#define AFF_WATERWALK	      7	   /* Char can walk on water	*/
+#define AFF_SANCTUARY         8	   /* Char protected by sanct.	*/
+#define AFF_GROUP             9	   /* (R) Char is grouped	*/
+#define AFF_CURSE             10	   /* Char is cursed		*/
+#define AFF_INFRAVISION       11	   /* Char can see in dark	*/
+#define AFF_POISON            12	   /* (R) Char is poisoned	*/
+#define AFF_PROTECT_EVIL      13	   /* Char protected from evil  */
+#define AFF_PROTECT_GOOD      14	   /* Char protected from good  */
+#define AFF_SLEEP             15	   /* (R) Char magically asleep	*/
+#define AFF_NOTRACK	          16	   /* Char can't be tracked	*/
+#define AFF_UNUSED16	      17	   /* Room for future expansion	*/
+#define AFF_UNUSED17	      18	   /* Room for future expansion	*/
+#define AFF_SNEAK             19	   /* Char can move quietly	*/
+#define AFF_HIDE              20	   /* Char is hidden		*/
+#define AFF_UNUSED20	      21	   /* Room for future expansion	*/
+#define AFF_CHARM             22   /* Char is charmed		*/
 
 
 /* Modes of connectedness: used by descriptor_data.state */
@@ -327,41 +329,41 @@
 
 
 /* Take/Wear flags: used by obj_data.obj_flags.wear_flags */
-#define ITEM_WEAR_TAKE		(1 << 0)  /* Item can be takes		*/
-#define ITEM_WEAR_FINGER	(1 << 1)  /* Can be worn on finger	*/
-#define ITEM_WEAR_NECK		(1 << 2)  /* Can be worn around neck 	*/
-#define ITEM_WEAR_BODY		(1 << 3)  /* Can be worn on body 	*/
-#define ITEM_WEAR_HEAD		(1 << 4)  /* Can be worn on head 	*/
-#define ITEM_WEAR_LEGS		(1 << 5)  /* Can be worn on legs	*/
-#define ITEM_WEAR_FEET		(1 << 6)  /* Can be worn on feet	*/
-#define ITEM_WEAR_HANDS		(1 << 7)  /* Can be worn on hands	*/
-#define ITEM_WEAR_ARMS		(1 << 8)  /* Can be worn on arms	*/
-#define ITEM_WEAR_SHIELD	(1 << 9)  /* Can be used as a shield	*/
-#define ITEM_WEAR_ABOUT		(1 << 10) /* Can be worn about body 	*/
-#define ITEM_WEAR_WAIST 	(1 << 11) /* Can be worn around waist 	*/
-#define ITEM_WEAR_WRIST		(1 << 12) /* Can be worn on wrist 	*/
-#define ITEM_WEAR_WIELD		(1 << 13) /* Can be wielded		*/
-#define ITEM_WEAR_HOLD		(1 << 14) /* Can be held		*/
+#define ITEM_WEAR_TAKE		0  /* Item can be takes		*/
+#define ITEM_WEAR_FINGER	1  /* Can be worn on finger	*/
+#define ITEM_WEAR_NECK		2  /* Can be worn around neck 	*/
+#define ITEM_WEAR_BODY		3  /* Can be worn on body 	*/
+#define ITEM_WEAR_HEAD		4  /* Can be worn on head 	*/
+#define ITEM_WEAR_LEGS		5  /* Can be worn on legs	*/
+#define ITEM_WEAR_FEET		6  /* Can be worn on feet	*/
+#define ITEM_WEAR_HANDS		7  /* Can be worn on hands	*/
+#define ITEM_WEAR_ARMS		8  /* Can be worn on arms	*/
+#define ITEM_WEAR_SHIELD	9  /* Can be used as a shield	*/
+#define ITEM_WEAR_ABOUT		10 /* Can be worn about body 	*/
+#define ITEM_WEAR_WAIST 	11 /* Can be worn around waist 	*/
+#define ITEM_WEAR_WRIST		12 /* Can be worn on wrist 	*/
+#define ITEM_WEAR_WIELD		13 /* Can be wielded		*/
+#define ITEM_WEAR_HOLD		14 /* Can be held		*/
 
 
 /* Extra object flags: used by obj_data.obj_flags.extra_flags */
-#define ITEM_GLOW          (1 << 0)	/* Item is glowing		*/
-#define ITEM_HUM           (1 << 1)	/* Item is humming		*/
-#define ITEM_NORENT        (1 << 2)	/* Item cannot be rented	*/
-#define ITEM_NODONATE      (1 << 3)	/* Item cannot be donated	*/
-#define ITEM_NOINVIS	   (1 << 4)	/* Item cannot be made invis	*/
-#define ITEM_INVISIBLE     (1 << 5)	/* Item is invisible		*/
-#define ITEM_MAGIC         (1 << 6)	/* Item is magical		*/
-#define ITEM_NODROP        (1 << 7)	/* Item is cursed: can't drop	*/
-#define ITEM_BLESS         (1 << 8)	/* Item is blessed		*/
-#define ITEM_ANTI_GOOD     (1 << 9)	/* Not usable by good people	*/
-#define ITEM_ANTI_EVIL     (1 << 10)	/* Not usable by evil people	*/
-#define ITEM_ANTI_NEUTRAL  (1 << 11)	/* Not usable by neutral people	*/
-#define ITEM_ANTI_MAGIC_USER (1 << 12)	/* Not usable by mages		*/
-#define ITEM_ANTI_CLERIC   (1 << 13)	/* Not usable by clerics	*/
-#define ITEM_ANTI_THIEF	   (1 << 14)	/* Not usable by thieves	*/
-#define ITEM_ANTI_WARRIOR  (1 << 15)	/* Not usable by warriors	*/
-#define ITEM_NOSELL	   (1 << 16)	/* Shopkeepers won't touch it	*/
+#define ITEM_GLOW          0	/* Item is glowing		*/
+#define ITEM_HUM           1	/* Item is humming		*/
+#define ITEM_NORENT        2	/* Item cannot be rented	*/
+#define ITEM_NODONATE      3	/* Item cannot be donated	*/
+#define ITEM_NOINVIS	   4	/* Item cannot be made invis	*/
+#define ITEM_INVISIBLE     5	/* Item is invisible		*/
+#define ITEM_MAGIC         6    /* Item is magical		*/
+#define ITEM_NODROP        7	/* Item is cursed: can't drop	*/
+#define ITEM_BLESS         8	/* Item is blessed		*/
+#define ITEM_ANTI_GOOD     9	/* Not usable by good people	*/
+#define ITEM_ANTI_EVIL     10	/* Not usable by evil people	*/
+#define ITEM_ANTI_NEUTRAL  11	/* Not usable by neutral people	*/
+#define ITEM_ANTI_MAGIC_USER 12	/* Not usable by mages		*/
+#define ITEM_ANTI_CLERIC   13	/* Not usable by clerics	*/
+#define ITEM_ANTI_THIEF	   14	/* Not usable by thieves	*/
+#define ITEM_ANTI_WARRIOR  15	/* Not usable by warriors	*/
+#define ITEM_NOSELL	       16	/* Shopkeepers won't touch it	*/
 
 
 /* Modifier constants used with obj affects ('A' fields) */
@@ -448,7 +450,16 @@
 #define RENT_CRYO       3
 #define RENT_FORCED     4
 #define RENT_TIMEDOUT   5
-
+
+
+/* for the 128bits */
+#define RF_ARRAY_MAX    4
+#define PM_ARRAY_MAX    4
+#define PR_ARRAY_MAX    4
+#define AF_ARRAY_MAX    4
+#define TW_ARRAY_MAX    4
+#define EF_ARRAY_MAX    4
+
 
 /* other #defined constants **********************************************/
 
@@ -591,13 +602,13 @@ struct obj_flag_data {
    int	value[NUM_OBJ_VAL_POSITIONS];	/* Values of the item (see list)    */
    byte type_flag;	/* Type of item			    */
    int level;		/* Minimum level of object.		*/
-   int /*bitvector_t*/	wear_flags;	/* Where you can wear it	    */
-   int /*bitvector_t*/	extra_flags;	/* If it hums, glows, etc.	    */
+   int  wear_flags[TW_ARRAY_MAX]; /* Where you can wear it	    */
+   int  extra_flags[EF_ARRAY_MAX]; /* If it hums, glows, etc.	    */
    int	weight;		/* Weigt what else                  */
    int	cost;		/* Value when sold (gp.)            */
    int	cost_per_day;	/* Cost to keep pr. real day        */
    int	timer;		/* Timer for object                 */
-   long /*bitvector_t*/	bitvector;	/* To set chars bits                */
+   int  bitvector[AF_ARRAY_MAX]; /* To set chars bits                */
 };
 
 
@@ -647,10 +658,10 @@ struct obj_file_elem {
    sh_int location;
 #endif
    int	value[NUM_OBJ_VAL_POSITIONS];
-   int /*bitvector_t*/	extra_flags;
+   int  extra_flags[EF_ARRAY_MAX];
    int	weight;
    int	timer;
-   long /*bitvector_t*/	bitvector;
+   int  bitvector[AF_ARRAY_MAX];
    struct obj_affected_type affected[MAX_OBJ_AFFECT];
 };
 
@@ -698,7 +709,7 @@ struct room_data {
    char	*description;           /* Shown when entered                 */
    struct extra_descr_data *ex_description; /* for examine/look       */
    struct room_direction_data *dir_option[NUM_OF_DIRS]; /* Directions */
-   int /*bitvector_t*/ room_flags;		/* DEATH,DARK ... etc */
+   int room_flags[RF_ARRAY_MAX];   /* DEATH,DARK ... etc */
 
    struct trig_proto_list *proto_script; /* list of default triggers  */
    struct script_data *script;  /* script info for the object         */
@@ -810,10 +821,9 @@ struct char_point_data {
 struct char_special_data_saved {
    int	alignment;		/* +-1000 for alignments                */
    long	idnum;			/* player's idnum; -1 for mobiles	*/
-   long /*bitvector_t*/ act;	/* act flag for NPC's; player flag for PC's */
+   int act[PM_ARRAY_MAX];	/* act flag for NPC's; player flag for PC's */
 
-   long /*bitvector_t*/	affected_by;
-				/* Bitvector for spells/skills affected by */
+   int affected_by[AF_ARRAY_MAX]; /* Bitvector for spells/skills affected by */
    sh_int apply_saving_throw[5]; /* Saving throw (Bonuses)		*/
 };
 
@@ -849,7 +859,7 @@ struct player_special_data_saved {
    byte freeze_level;		/* Level of god who froze char, if any	*/
    sh_int invis_level;		/* level of invisibility		*/
    room_vnum load_room;		/* Which room to place char in		*/
-   long /*bitvector_t*/	pref;	/* preference flags for PC's.		*/
+   int pref[PR_ARRAY_MAX]; /* preference flags for PC's.  */
    ubyte bad_pws;		/* number of bad password attemps	*/
    sbyte conditions[3];         /* Drunk, full, thirsty			*/
 
Common subdirectories: normal/util and src/util
diff -puN normal/utils.c src/utils.c
--- normal/utils.c	2002-11-06 14:33:20.000000000 +0100
+++ src/utils.c	2002-11-07 14:47:02.000000000 +0100
@@ -333,7 +333,37 @@ size_t sprinttype(int type, const char *
 
   return strlcpy(result, *names[nr] != '\n' ? names[nr] : "UNDEFINED", reslen);
 }
+
 
+void sprintbitarray(int bitvector[], const char *names[], int maxar, char *result)
+{
+  int nr, teller, found = FALSE;
+
+  *result = '\0';
+
+  for(teller = 0; teller < maxar && !found; teller++)
+    for (nr = 0; nr < 32 && !found; nr++) {
+	  if (IS_SET_AR(bitvector, (teller*32)+nr)) {
+        if (*names[(teller*32)+nr] != '\n') {
+          if (*names[(teller*32)+nr] != '\0') {
+
+    strcat(result, names[(teller*32)+nr]);
+
+    strcat(result, " ");
+          }
+		} else {
+
+  strcat(result, "UNDEFINED ");
+        }
+	  }
+      if (*names[(teller*32)+nr] == '\n')
+        found = TRUE;
+    }
+
+  if (!*result)
+    strcpy(result, "NOBITS ");
+}
+
 
 /* Calculate the REAL time passed over the last t2-t1 centuries (secs) */
 struct time_info_data *real_time_passed(time_t t2, time_t t1)
@@ -457,7 +487,8 @@ void stop_follower(struct char_data *ch)
   }
 
   ch->master = NULL;
-  REMOVE_BIT(AFF_FLAGS(ch), AFF_CHARM | AFF_GROUP);
+  REMOVE_BIT_AR(AFF_FLAGS(ch), AFF_CHARM);
+  REMOVE_BIT_AR(AFF_FLAGS(ch), AFF_GROUP);
 }
 
 
diff -puN normal/utils.h src/utils.h
--- normal/utils.h	2002-11-06 14:33:20.000000000 +0100
+++ src/utils.h	2002-11-07 14:23:16.000000000 +0100
@@ -28,6 +28,7 @@ int	rand_number(int from, int to);
 int	dice(int number, int size);
 size_t	sprintbit(bitvector_t vektor, const char *names[], char *result, size_t reslen);
 size_t	sprinttype(int type, const char *names[], char *result, size_t reslen);
+void sprintbitarray(int bitvector[], const char *names[], int maxar, char *result);
 int	get_line(FILE *fl, char *buf);
 int	get_filename(char *filename, size_t fbufsize, int mode, const char *orig_name);
 time_t	mud_time_to_secs(struct time_info_data *now);
@@ -180,8 +181,16 @@ void	update_pos(struct char_data *victim
 
 
 /* basic bitvector utils *************************************************/
-
-
+
+
+#define Q_FIELD(x)  ((int) (x) / 32)
+#define Q_BIT(x)    (1 << ((x) % 32))
+ 
+#define IS_SET_AR(var, bit)       ((var)[Q_FIELD(bit)] & Q_BIT(bit))
+#define SET_BIT_AR(var, bit)      ((var)[Q_FIELD(bit)] |= Q_BIT(bit))
+#define REMOVE_BIT_AR(var, bit)   ((var)[Q_FIELD(bit)] &= ~Q_BIT(bit))
+#define TOGGLE_BIT_AR(var, bit)   ((var)[Q_FIELD(bit)] = \
+                                   (var)[Q_FIELD(bit)] ^ Q_BIT(bit))
 #define IS_SET(flag,bit)  ((flag) & (bit))
 #define SET_BIT(var,bit)  ((var) |= (bit))
 #define REMOVE_BIT(var,bit)  ((var) &= ~(bit))
@@ -213,27 +222,27 @@ void	update_pos(struct char_data *victim
  * See http://www.circlemud.org/~greerga/todo/todo.009 to eliminate MOB_ISNPC.
  * IS_MOB() acts as a VALID_MOB_RNUM()-like function.
  */
-#define IS_NPC(ch)	(IS_SET(MOB_FLAGS(ch), MOB_ISNPC))
+#define IS_NPC(ch)	(IS_SET_AR(MOB_FLAGS(ch), MOB_ISNPC))
 #define IS_MOB(ch)	(IS_NPC(ch) && GET_MOB_RNUM(ch) <= top_of_mobt && \
 				GET_MOB_RNUM(ch) != NOBODY)
 
-#define MOB_FLAGGED(ch, flag) (IS_NPC(ch) && IS_SET(MOB_FLAGS(ch), (flag)))
-#define PLR_FLAGGED(ch, flag) (!IS_NPC(ch) && IS_SET(PLR_FLAGS(ch), (flag)))
-#define AFF_FLAGGED(ch, flag) (IS_SET(AFF_FLAGS(ch), (flag)))
-#define PRF_FLAGGED(ch, flag) (IS_SET(PRF_FLAGS(ch), (flag)))
-#define ROOM_FLAGGED(loc, flag) (IS_SET(ROOM_FLAGS(loc), (flag)))
+#define MOB_FLAGGED(ch, flag) (IS_NPC(ch) && IS_SET_AR(MOB_FLAGS(ch), (flag)))
+#define PLR_FLAGGED(ch, flag) (!IS_NPC(ch) && IS_SET_AR(PLR_FLAGS(ch), (flag)))
+#define AFF_FLAGGED(ch, flag) (IS_SET_AR(AFF_FLAGS(ch), (flag)))
+#define PRF_FLAGGED(ch, flag) (IS_SET_AR(PRF_FLAGS(ch), (flag)))
+#define ROOM_FLAGGED(loc, flag) (IS_SET_AR(ROOM_FLAGS(loc), (flag)))
 #define EXIT_FLAGGED(exit, flag) (IS_SET((exit)->exit_info, (flag)))
 #define OBJAFF_FLAGGED(obj, flag) (IS_SET(GET_OBJ_AFFECT(obj), (flag)))
 #define OBJVAL_FLAGGED(obj, flag) (IS_SET(GET_OBJ_VAL((obj), 1), (flag)))
-#define OBJWEAR_FLAGGED(obj, flag) (IS_SET(GET_OBJ_WEAR(obj), (flag)))
-#define OBJ_FLAGGED(obj, flag) (IS_SET(GET_OBJ_EXTRA(obj), (flag)))
+#define OBJWEAR_FLAGGED(obj, flag) (IS_SET_AR(GET_OBJ_WEAR(obj), (flag)))
+#define OBJ_FLAGGED(obj, flag) (IS_SET_AR(GET_OBJ_EXTRA(obj), (flag)))
 #define HAS_SPELL_ROUTINE(spl, flag) (IS_SET(SPELL_ROUTINES(spl), (flag)))
 
 /* IS_AFFECTED for backwards compatibility */
 #define IS_AFFECTED(ch, skill) (AFF_FLAGGED((ch), (skill)))
 
-#define PLR_TOG_CHK(ch,flag) ((TOGGLE_BIT(PLR_FLAGS(ch), (flag))) & (flag))
-#define PRF_TOG_CHK(ch,flag) ((TOGGLE_BIT(PRF_FLAGS(ch), (flag))) & (flag))
+#define PLR_TOG_CHK(ch,flag) ((TOGGLE_BIT_AR(PLR_FLAGS(ch), (flag))) & Q_BIT(flag))
+#define PRF_TOG_CHK(ch,flag) ((TOGGLE_BIT_AR(PRF_FLAGS(ch), (flag))) & Q_BIT(flag))
 
 
 /* room utils ************************************************************/
@@ -396,7 +405,8 @@ void	update_pos(struct char_data *victim
 #define GET_OBJ_COST(obj)	((obj)->obj_flags.cost)
 #define GET_OBJ_RENT(obj)	((obj)->obj_flags.cost_per_day)
 #define GET_OBJ_AFFECT(obj)	((obj)->obj_flags.bitvector)
-#define GET_OBJ_EXTRA(obj)	((obj)->obj_flags.extra_flags)
+#define GET_OBJ_EXTRA(obj)	((obj)->obj_flags.extra_flags)
+#define GET_OBJ_EXTRA_AR(obj, i)   ((obj)->obj_flags.extra_flags[(i)])
 #define GET_OBJ_WEAR(obj)	((obj)->obj_flags.wear_flags)
 #define GET_OBJ_VAL(obj, val)	((obj)->obj_flags.value[(val)])
 #define GET_OBJ_WEIGHT(obj)	((obj)->obj_flags.weight)

