diff -puN old/act.informative.c src/act.informative.c
--- old/act.informative.c	2002-11-23 10:52:14.000000000 +0100
+++ src/act.informative.c	2002-12-04 10:36:54.000000000 +0100
@@ -38,7 +38,7 @@ extern char *wizlist;
 extern char *immlist;
 extern char *policies;
 extern char *handbook;
-extern char *class_abbrevs[];
+extern char *class_abbrevs[];
 
 /* extern functions */
 ACMD(do_action);
@@ -419,9 +419,12 @@ void look_at_room(struct char_data *ch, 
   send_to_char(ch, "%s", CCCYN(ch, C_NRM));
   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));
-    send_to_char(ch, "[%5d] %s [ %s]", GET_ROOM_VNUM(IN_ROOM(ch)), world[IN_ROOM(ch)].name, buf);
+	sprintbit(ROOM_FLAGS(IN_ROOM(ch)), room_bits, buf, sizeof(buf));
+    
+	if (BRIDGE(IN_ROOM(ch)) > 0) {
+	  send_to_char(ch, "[%5d] %s [ %s] [ %s ]", GET_ROOM_VNUM(IN_ROOM(ch)), world[IN_ROOM(ch)].name, buf, bridges[BRIDGE(IN_ROOM(ch))]);
+    } else
+      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);
 
diff -puN old/act.movement.c src/act.movement.c
--- old/act.movement.c	2002-11-23 10:52:14.000000000 +0100
+++ src/act.movement.c	2002-12-04 17:25:26.000000000 +0100
@@ -34,7 +34,8 @@ int has_boat(struct char_data *ch);
 int find_door(struct char_data *ch, const char *type, char *dir, const char *cmdname);
 int has_key(struct char_data *ch, obj_vnum key);
 void do_doorcmd(struct char_data *ch, struct obj_data *obj, int door, int scmd);
-int ok_pick(struct char_data *ch, obj_vnum keynum, int pickproof, int scmd);
+int ok_pick(struct char_data *ch, obj_vnum keynum, int pickproof, int scmd);
+void bridge(struct char_data *ch);
 ACMD(do_gen_door);
 ACMD(do_enter);
 ACMD(do_leave);
@@ -167,6 +168,29 @@ int do_simple_move(struct char_data *ch,
 
   if (ch->desc != NULL)
     look_at_room(ch, 0);
+
+  if (((BRIDGE(IN_ROOM(ch)) == BRIDGE_SMALL) && (GET_WEIGHT(ch) >= 100)) ||
+    ((BRIDGE(IN_ROOM(ch)) == BRIDGE_MEDIUM) && (GET_WEIGHT(ch) >= 150)) ||
+    ((BRIDGE(IN_ROOM(ch)) == BRIDGE_LARGE) && (GET_WEIGHT(ch) >= 200)) ||
+	((BRIDGE(IN_ROOM(ch)) == BRIDGE_INSTABLE))) {
+    int j = rand_number(1, 20);
+    
+	if (j > 18) { /* Guess the player was lucky */
+	  act("\r\nYou hear the boards under $n's feat squeek and creak loudly...", TRUE, ch, 0, 0, TO_CHAR);
+      act("You hear the boards under your feet squeeking and creaking loudly...", TRUE, ch, 0, 0, TO_ROOM);
+    } else if ((!IS_NPC(ch) && (GET_LEVEL(ch) < LVL_IMMORT)) || (IS_NPC(ch) && world[IN_ROOM(ch)].bridge[MOBILE_BRIDGE])) {  
+	  act("\r\nYou hear some boards breaking under your heavy weight, and topple of the bridge!", TRUE, ch, 0, 0, TO_CHAR);
+	  act("You hear some boards breaking, and when you look around you see $n topple of the bridge!", TRUE, ch, 0, 0, TO_ROOM);
+      bridge(ch);
+	} else if (!IS_NPC(ch)) {
+	  /*
+	   * Despite their possible overweight, we don't want immortals  
+	   * to fall down bridges, do we? 
+	   */
+	  act("\r\nYou hear some boards breaking under your weight, but being the cool immortal you are, you stay on the bridge.", TRUE, ch, 0, 0, TO_CHAR);
+      act("$n seemed to topple of the bridge, but being the cool immortal $e is, $e stays on the bridge.", TRUE, ch, 0, 0, TO_ROOM);
+	}
+  }
 
   if (ROOM_FLAGGED(IN_ROOM(ch), ROOM_DEATH) && GET_LEVEL(ch) < LVL_IMMORT) {
     log_death_trap(ch);
@@ -176,6 +200,46 @@ int do_simple_move(struct char_data *ch,
   }
   return (1);
 }
+
+void bridge(struct char_data *ch)
+{
+  int hit;
+
+  if(world[IN_ROOM(ch)].bridge[TARGET_ROOM] == 0 || (real_room(world[IN_ROOM(ch)].bridge[TARGET_ROOM]) == NOWHERE)) {
+    if (real_room(world[IN_ROOM(ch)].bridge[TARGET_ROOM]) == NOWHERE)
+	  mudlog(NRM, LVL_IMMORT, TRUE, "SYSERR: Bridge in room %d points to invalid vnum! (vnum = %d)", 
+	  GET_ROOM_VNUM(IN_ROOM(ch)), world[IN_ROOM(ch)].bridge[TARGET_ROOM]);
+  
+    /* This means the builder didn't set the target room, 
+	 * or entered a non-existing vnum so let the character 
+	 * climb back up. With some damage ofcourse.
+     */
+	act("In an desperate attempt, you manage to hang on to the bridge, and scramble back up!", TRUE, ch, 0, 0, TO_CHAR);
+	act("In an desparate attempt, $n manages to hang on to the bridge, and scrambles back up!", TRUE, ch, 0, 0, TO_ROOM);
+    hit = rand_number(1, (GET_HIT(ch) * 0.45));
+    GET_HIT(ch) -= hit;
+	GET_MOVE(ch) -= hit * 1.45;
+  } else {
+    char_to_room(ch, real_room(world[IN_ROOM(ch)].bridge[TARGET_ROOM]));
+    
+	if ((SECT(IN_ROOM(ch)) == SECT_WATER_NOSWIM) ||
+		(SECT(IN_ROOM(ch)) == SECT_WATER_SWIM)   ||
+		(SECT(IN_ROOM(ch)) == SECT_UNDERWATER))
+      act("$n falls down from above, and lands with a load splash in the water.", TRUE, ch, 0, 0, TO_ROOM);
+    else
+	  act("$n falls down from above, and crashes with a soft ""umph"" on the surface.", TRUE, ch, 0, 0, TO_ROOM);
+	
+	if (ch->desc != NULL)
+      look_at_room(ch, 0);
+
+    if (ROOM_FLAGGED(IN_ROOM(ch), ROOM_DEATH) && GET_LEVEL(ch) < LVL_IMMORT) {
+      log_death_trap(ch);
+      death_cry(ch);
+      extract_char(ch);
+	}
+  }
+}
+
 
 
 int perform_move(struct char_data *ch, int dir, int need_specials_check)
diff -puN old/constants.c src/constants.c
--- old/constants.c	2002-11-23 10:52:14.000000000 +0100
+++ src/constants.c	2002-11-30 13:10:00.000000000 +0100
@@ -35,8 +35,18 @@ const char *dirs[] =
   "down",
   "\n"
 };
-
-
+
+/* BRIDGE_ */
+const char *bridges[] = {
+  "None",
+  "Small",
+  "Medium",
+  "Large",
+  "Instable",
+  "\n"
+};
+
+
 /* ROOM_x */
 const char *room_bits[] = {
   "DARK",
diff -puN old/constants.h src/constants.h
--- old/constants.h	2001-09-14 04:08:00.000000000 +0200
+++ src/constants.h	2002-11-30 11:15:00.000000000 +0100
@@ -23,7 +23,8 @@ extern const char *color_liquid[];
 extern const char *fullness[];
 extern const char *npc_class_types[];
 extern const char *weekdays[];
-extern const char *month_name[];
+extern const char *month_name[];
+extern const char *bridges[];
 extern const struct str_app_type str_app[];
 extern const struct dex_skill_type dex_app_skill[];
 extern const struct dex_app_type dex_app[];
diff -puN old/db.c src/db.c
--- old/db.c	2002-11-23 10:52:14.000000000 +0100
+++ src/db.c	2002-12-04 17:10:00.000000000 +0100
@@ -948,7 +948,7 @@ bitvector_t asciiflag_conv(char *flag)
 /* load the rooms */
 void parse_room(FILE *fl, int virtual_nr)
 {
-  static int room_nr = 0, zone = 0;
+  static int room_nr = 0, zone = 0, retval;
   int t[10], i;
   char line[READ_SIZE], flags[128], buf2[MAX_STRING_LENGTH], buf[128];
   struct extra_descr_data *new_descr;
@@ -975,20 +975,28 @@ 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);
-  }
+
+  if ((retval = sscanf(line, " %d %s %d %d %d %d", t, flags, t + 2, t + 3, t + 4, t + 5)) != 6) {
+	if (retval == 3) 
+      t[3] = t[4] = t[5] = 0;
+    else {
+      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");
 
-  world[room_nr].sector_type = t[2];
-
+  world[room_nr].sector_type = t[2];
+  if (retval == 6) {
+	world[room_nr].bridge[BRIDGE_SIZE]	 = t[3];
+	world[room_nr].bridge[TARGET_ROOM]	 = t[4];
+	world[room_nr].bridge[MOBILE_BRIDGE] = t[5];
+  }
   world[room_nr].func = NULL;
   world[room_nr].contents = NULL;
   world[room_nr].people = NULL;
Common subdirectories: old/doc and src/doc
diff -puN old/genwld.c src/genwld.c
--- old/genwld.c	2002-11-23 10:52:16.000000000 +0100
+++ src/genwld.c	2002-12-04 17:12:58.000000000 +0100
@@ -277,13 +277,15 @@ int save_rooms(zone_rnum rzone)
       fprintf(sf, 	"#%d\n"
 			"%s%c\n"
 			"%s%c\n"
-			"%d %s %d\n",
+			"%d %s %d %d %d %d\n",
 		room->number,
 		room->name ? room->name : "Untitled", STRING_TERMINATOR,
 		buf, STRING_TERMINATOR,
-		zone_table[room->zone].number, buf2, room->sector_type
+		zone_table[room->zone].number, buf2, room->sector_type,
+		room->bridge[BRIDGE_SIZE], room->bridge[TARGET_ROOM],
+		room->bridge[MOBILE_BRIDGE]    
       );
-
+
       /*
        * Now you write out the exits for the room.
        */
diff -puN old/oasis.h src/oasis.h
--- old/oasis.h	2002-11-23 10:52:16.000000000 +0100
+++ src/oasis.h	2002-11-30 13:19:02.000000000 +0100
@@ -32,6 +32,7 @@
  */
 #define NUM_ROOM_FLAGS 		16
 #define NUM_ROOM_SECTORS	10
+#define NUM_BRIDGES			5
 
 #define NUM_MOB_FLAGS		18
 #define NUM_AFF_FLAGS		22
@@ -313,6 +314,9 @@ extern char arg[MAX_STRING_LENGTH];
 #define REDIT_EXTRADESC_KEY 		15
 #define REDIT_EXTRADESC_DESCRIPTION 	16
 #define REDIT_DELETE			17
+#define REDIT_BRIDGE					18
+#define REDIT_BRIDGETYPE				19
+#define REDIT_BRIDGETARGET				20
 
 /*
  * Submodes of ZEDIT connectedness.
diff -puN old/redit.c src/redit.c
--- old/redit.c	2002-11-23 10:52:18.000000000 +0100
+++ src/redit.c	2002-12-04 16:39:28.000000000 +0100
@@ -12,7 +12,8 @@
 #include "utils.h"
 #include "comm.h"
 #include "interpreter.h"
-#include "db.h"
+#include "db.h"
+#include "constants.h"
 #include "boards.h"
 #include "genolc.h"
 #include "genwld.h"
@@ -35,7 +36,8 @@ extern struct zone_data *zone_table;
 extern struct descriptor_data *descriptor_list;
 
 /*------------------------------------------------------------------------*/
-
+
+#define TOGGLE_VAR(var)	if (var == 1) { var = 0; } else { var = 1; }
 
 /*------------------------------------------------------------------------*\
   Utils and exported functions.
@@ -404,6 +406,43 @@ void redit_disp_flag_menu(struct descrip
 	  "Enter room flags, 0 to quit : ", cyn, buf1, nrm);
   OLC_MODE(d) = REDIT_FLAGS;
 }
+
+/*
+ * For bridges.
+ */
+void redit_disp_bridgetype_menu(struct descriptor_data *d)
+{
+  int counter, columns = 0;
+  
+  get_char_colors(d->character);
+  clear_screen(d);
+  
+  for (counter = 0; counter < NUM_BRIDGES; counter++) {
+    write_to_output(d, "%s%2d%s) %-20.20s %s", grn, counter, nrm,
+                bridges[counter], !(++columns % 2) ? "\r\n" : "");
+ }
+  write_to_output(d, "\r\nEnter bridge type : ");
+  OLC_MODE(d) = REDIT_BRIDGETYPE;
+}
+
+void redit_disp_bridge_menu(struct descriptor_data *d)
+{
+  sprinttype(OLC_ROOM(d)->bridge[BRIDGE_SIZE], bridges, buf, sizeof(buf));
+
+  write_to_output(d, 
+	  "%s1%s) Bridge target room : %s%d\r\n"
+	  "%s2%s) Bridge type        : %s%s\r\n"
+	  "%s3%s) Mobile activation  : %s%s\r\n"
+	  "%sQ%s) Return to menu\r\n"
+	  "Enter choice : ",
+	  grn, nrm, yel, OLC_ROOM(d)->bridge[TARGET_ROOM],
+	  grn, nrm, yel, buf,
+	  grn, nrm, yel, OLC_ROOM(d)->bridge[MOBILE_BRIDGE] ? "TRUE" : "FALSE",
+	  grn, nrm);
+ 
+  OLC_MODE(d) = REDIT_BRIDGE;
+}
+
 
 /*
  * For sector type.
@@ -436,7 +475,7 @@ void redit_disp_menu(struct descriptor_d
   sprinttype(room->sector_type, sector_types, buf2, sizeof(buf2));
   write_to_output(d,
 	  "-- Room number : [%s%d%s]  	Room zone: [%s%d%s]\r\n"
-	  "%s1%s) Name        : %s%s\r\n"
+	  "%s1%s) Name        : %s%s\r\n"
 	  "%s2%s) Description :\r\n%s%s"
 	  "%s3%s) Room flags  : %s%s\r\n"
 	  "%s4%s) Sector type : %s%s\r\n"
@@ -445,8 +484,9 @@ void redit_disp_menu(struct descriptor_d
 	  "%s7%s) Exit south  : %s%d\r\n"
 	  "%s8%s) Exit west   : %s%d\r\n"
 	  "%s9%s) Exit up     : %s%d\r\n"
-	  "%sA%s) Exit down   : %s%d\r\n"
-	  "%sB%s) Extra descriptions menu\r\n"
+	  "%sA%s) Exit down   : %s%d\r\n"
+	  "%sB%s) Bridge menu : %s%s\r\n"
+	  "%sC%s) Extra descriptions menu\r\n"
 	  "%sD%s) Delete Room\r\n"
 	  "%sQ%s) Quit\r\n"
 	  "Enter choice : ",
@@ -474,7 +514,9 @@ void redit_disp_menu(struct descriptor_d
 	  world[room->dir_option[UP]->to_room].number : -1,
 	  grn, nrm, cyn,
 	  room->dir_option[DOWN] && room->dir_option[DOWN]->to_room != -1 ?
-	  world[room->dir_option[DOWN]->to_room].number : -1,
+	  world[room->dir_option[DOWN]->to_room].number : -1,
+	  grn, nrm, cyn,
+	  room->bridge[BRIDGE_SIZE] != 0 ? "<SET>" : "<NOT SET>",  
 	  grn, nrm,
           grn, nrm,
           grn, nrm
@@ -578,8 +620,13 @@ void redit_parse(struct descriptor_data 
       OLC_VAL(d) = DOWN;
       redit_disp_exit_menu(d);
       break;
-    case 'b':
-    case 'B':
+    case 'b':
+	case 'B':
+      OLC_MODE(d) = REDIT_BRIDGE;
+	  redit_disp_bridge_menu(d);
+      break;
+	case 'c':
+    case 'C':
       /*
        * If the extra description doesn't exist.
        */
@@ -693,6 +740,59 @@ void redit_parse(struct descriptor_data 
     }
     break;
 
+  case REDIT_BRIDGE:
+    switch(*arg) {
+	case '1':
+	  OLC_MODE(d) = REDIT_BRIDGETARGET;
+	  write_to_output(d, "Enter vnum of room player should go when bridge collapses (0 is no room): ");
+	  return;
+	case '2':
+	  redit_disp_bridgetype_menu(d);
+	  return;
+	case '3':
+      TOGGLE_VAR(OLC_ROOM(d)->bridge[MOBILE_BRIDGE]);
+      redit_disp_bridge_menu(d);
+      return;
+	case '0':
+	case 'Q':
+	case 'q':
+      break;
+	default:
+      write_to_output(d, "Invalid choice!\r\n");
+      redit_disp_bridge_menu(d);
+      return;
+	}
+    break;
+	  
+  case REDIT_BRIDGETARGET:
+	if (!isdigit(*arg)) {
+      write_to_output(d, "Must be a numeric value, try again : ");
+      return;
+    }
+    if (real_room(atoi(arg)) == NOWHERE) {
+	  write_to_output(d, "That doesn't seem to be a valid vnum. Try again: ");
+	  return;
+	}
+	OLC_ROOM(d)->bridge[TARGET_ROOM] = atoi(arg);
+	redit_disp_bridge_menu(d);
+	return;
+
+  case REDIT_BRIDGETYPE:
+    if (!isdigit(*arg)) {
+      write_to_output(d, "Invalid choice!\r\n");
+      redit_disp_bridgetype_menu(d);
+      return;
+    }
+	number = atoi(arg);
+    if (number < 0 || number >= NUM_BRIDGES) {
+      write_to_output(d, "Invalid choice!\r\n");
+      redit_disp_bridgetype_menu(d);
+      return;
+    } else
+      OLC_ROOM(d)->bridge[BRIDGE_SIZE] = number;
+	redit_disp_bridge_menu(d);
+    return;
+
   case REDIT_EXIT_NUMBER:
     if ((number = atoi(arg)) != -1)
       if ((number = real_room(number)) < 0) {
diff -puN old/structs.h src/structs.h
--- old/structs.h	2002-11-23 10:52:18.000000000 +0100
+++ src/structs.h	2002-12-04 17:28:00.000000000 +0100
@@ -109,6 +109,13 @@
 #define SECT_FLYING	     8		   /* Wheee!			*/
 #define SECT_UNDERWATER	     9		   /* Underwater		*/
 
+
+/* Bridge types: used in room_data.bridge */
+#define BRIDGE_NONE          0             /* Not a bridge              */
+#define BRIDGE_SMALL         1             /* Small bridge              */
+#define BRIDGE_MEDIUM        2             /* Medium bridge             */
+#define BRIDGE_LARGE         3             /* Large bridge              */
+#define BRIDGE_INSTABLE      4             /* Bridge always collapses   */
 
 /* char and mob-related defines *****************************************/
 
@@ -693,7 +700,8 @@ 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 /*bitvector_t*/ room_flags;		/* DEATH,DARK ... etc */
+   int  bridge[3];                 /* bridge type (small/medium/large)   */
 
    byte light;                  /* Number of lightsources in room     */
    SPECIAL(*func);
@@ -887,7 +895,7 @@ struct mob_special_data {
    byte	attack_type;        /* The Attack Type Bitvector for NPC's     */
    byte default_pos;        /* Default position for NPC                */
    byte damnodice;          /* The number of damage dice's	       */
-   byte damsizedice;        /* The size of the damage dice's           */
+   byte damsizedice;        /* The size of the damage dice's           */
 };
 
 
Common subdirectories: old/util and src/util
diff -puN old/utils.h src/utils.h
--- old/utils.h	2002-11-23 10:52:24.000000000 +0100
+++ src/utils.h	2002-12-03 15:57:24.000000000 +0100
@@ -176,7 +176,13 @@ void	update_pos(struct char_data *victim
       if (temp)				\
          temp->next = (item)->next;	\
    }					\
+
+/* Bridge utils **********************************************************/
 
+#define BRIDGE_SIZE		0
+#define TARGET_ROOM		1
+#define MOBILE_BRIDGE	2
+
 
 /* basic bitvector utils *************************************************/
 
@@ -240,7 +246,8 @@ void	update_pos(struct char_data *victim
 
 #define SECT(room)	(VALID_ROOM_RNUM(room) ? \
 				world[(room)].sector_type : SECT_INSIDE)
-
+#define BRIDGE(room)    (world[(room)].bridge[BRIDGE_SIZE])
+
 #define IS_DARK(room)	room_is_dark((room))
 #define IS_LIGHT(room)  (!IS_DARK(room))
 
