Blob Blame History Raw
diff -N -p -r -u yadex-1.7.0-orig/src/editloop.cc yadex-1.7.0/src/editloop.cc
--- yadex-1.7.0-orig/src/editloop.cc	Tue Oct 19 20:53:55 2004
+++ yadex-1.7.0/src/editloop.cc	Wed Oct 20 00:54:28 2004
@@ -43,6 +43,7 @@ Place, Suite 330, Boston, MA 02111-1307,
 #include "entry.h"
 #include "entry2.h"
 #include "events.h"
+#include "game.h"
 #include "gfx.h"
 #include "gfx2.h"	// show_character_set() show_pcolours()
 #include "gfx3.h"
@@ -94,6 +95,7 @@ static int menubar_out_y1;	/* FIXME */
 
 /* prototypes of private functions */
 static int SortLevels (const void *item1, const void *item2);
+static char *GetBehaviorFileName (const char *levelname);
 
 /*
  *	SelectLevel
@@ -303,15 +305,28 @@ e.mb_menu[MBM_FILE] = new Menu (NULL,
    "~Quit",       'q',   0,
    NULL);
 
-e.mb_menu[MBM_EDIT] = new Menu (NULL,
-   "~Copy object(s)",          'o',    0,
-   "~Add object",              YK_INS, 0,
-   "~Delete object(s)",        YK_DEL, 0,
-   "~Exchange object numbers", 24,     0,
-   "~Preferences...",          YK_F5,  0,
-   "~Snap to grid",            'y',    MIF_VTICK, &e.grid_snap,		     0,
-   "~Lock grid step",          'z',    MIF_VTICK, &e.grid_step_locked,	     0,
-   NULL);
+
+if (yg_level_format == YGLF_HEXEN)
+   e.mb_menu[MBM_EDIT] = new Menu (NULL,
+     "~Copy object(s)",          'o',    0,
+      "~Add object",              YK_INS, 0,
+      "~Delete object(s)",        YK_DEL, 0,
+      "~Exchange object numbers", 24,     0,
+      "~Preferences...",          YK_F5,  0,
+      "~Snap to grid",            'y',    MIF_VTICK, &e.grid_snap,		     0,
+      "~Lock grid step",          'z',    MIF_VTICK, &e.grid_step_locked,	     0,
+      "Load ~BEHAVIOR lump",      'b',    0,
+      NULL);
+else
+   e.mb_menu[MBM_EDIT] = new Menu (NULL,
+      "~Copy object(s)",          'o',    0,
+      "~Add object",              YK_INS, 0,
+      "~Delete object(s)",        YK_DEL, 0,
+      "~Exchange object numbers", 24,     0,
+      "~Preferences...",          YK_F5,  0,
+      "~Snap to grid",            'y',    MIF_VTICK, &e.grid_snap,		     0,
+      "~Lock grid step",          'z',    MIF_VTICK, &e.grid_step_locked,	     0,
+      NULL);
 
 // If you change the order of modes here, don't forget
 // to modify the <modes> array.
@@ -2357,6 +2372,30 @@ cancel_save_as:
 	 RedrawMap = 1;
 	 }
 
+      // Load BEHAVIOR lump (JL)
+      else if (is.key == 'b')
+         {
+         char *acsfile;
+         const char *acsname;
+         if (levelname)
+            acsname = levelname;
+         else
+            acsname = "behavior";
+         acsfile = GetBehaviorFileName (acsname);
+         FILE* f = fopen(acsfile, "rb");
+         if (f)
+            {
+            FreeFarMemory(Behavior);
+            fseek(f, 0, SEEK_END);
+            BehaviorSize = ftell(f);
+            Behavior = (u8*)GetFarMemory(BehaviorSize);
+            fseek(f, 0, SEEK_SET);
+            fread(Behavior, BehaviorSize, 1, f);
+            fclose(f);
+            }
+         RedrawMap = 1;
+      }
+
       /* user likes music */
       else if (is.key)
 	 {
@@ -2504,6 +2543,34 @@ static int zoom_fit (edit_t& e)
     return 1;
   CenterMapAroundCoords ((MapMinX + MapMaxX) / 2, (MapMinY + MapMaxY) / 2);
   return 0;
+}
+
+/*
+   get the name of the BEHAVIOR lump file (returns NULL on Esc)
+*/
+
+static char *GetBehaviorFileName (const char *levelname)
+{
+#define BUFSZ 79
+  char *outfile = (char *) GetMemory (BUFSZ + 1);
+
+  /* get the file name */
+  // If no name, find a default one
+  if (! levelname)
+  {
+    levelname = "behavior";
+  }
+
+  al_scpslower (outfile, levelname, BUFSZ);
+  al_saps (outfile, ".o", BUFSZ);
+  InputFileName (-1, -1, "Name of the BEHAVIOR script file:", BUFSZ, outfile);
+  /* escape */
+  if (outfile[0] == '\0')
+  {
+    FreeMemory (outfile);
+    return 0;
+  }
+  return outfile;
 }
 
 
diff -N -p -r -u yadex-1.7.0-orig/src/l_prop.cc yadex-1.7.0/src/l_prop.cc
--- yadex-1.7.0-orig/src/l_prop.cc	Tue Oct 19 20:53:55 2004
+++ yadex-1.7.0/src/l_prop.cc	Tue Oct 19 23:16:01 2004
@@ -111,7 +111,7 @@ static const char *PrintLdtgroup (void *
 
 void LinedefProperties (int x0, int y0, SelPtr obj)
 {
-  char  *menustr[8];
+  char  *menustr[12];
   char   texname[WAD_TEX_NAME + 1];
   int    n, val;
   SelPtr cur, sdlist;
@@ -132,9 +132,9 @@ void LinedefProperties (int x0, int y0, 
   switch (val)
   {
     case 1:
-      for (n = 0; n < 8; n++)
+      for (n = 0; n < 12; n++)
 	menustr[n] = (char *) GetMemory (60);
-      sprintf (menustr[7], "Edit linedef #%d", obj->objnum);
+      sprintf (menustr[11], "Edit linedef #%d", obj->objnum);
       sprintf (menustr[0], "Change flags            (Current: %d)",
 	LineDefs[obj->objnum].flags);
       sprintf (menustr[1], "Change type             (Current: %d)",
@@ -149,7 +149,16 @@ void LinedefProperties (int x0, int y0, 
 	LineDefs[obj->objnum].sidedef1);
       sprintf (menustr[6], "Change 2nd sidedef ref. (Current: #%d)",
 	LineDefs[obj->objnum].sidedef2);
-      val = vDisplayMenu (x0 + 42, subwin_y0, menustr[7],
+      sprintf (menustr[7], "Change special arg2     (Current: %d)",
+	LineDefs[obj->objnum].arg2);
+      sprintf (menustr[8], "Change special arg3     (Current: %d)",
+	LineDefs[obj->objnum].arg3);
+      sprintf (menustr[9], "Change special arg4     (Current: %d)",
+	LineDefs[obj->objnum].arg4);
+      sprintf (menustr[10], "Change special arg5     (Current: %d)",
+	LineDefs[obj->objnum].arg5);
+      if (yg_level_format == YGLF_HEXEN)
+         val = vDisplayMenu (x0 + 42, subwin_y0, menustr[11],
 	menustr[0], YK_, 0,
 	menustr[1], YK_, 0,
 	menustr[2], YK_, 0,
@@ -157,8 +166,22 @@ void LinedefProperties (int x0, int y0, 
 	menustr[4], YK_, 0,
 	menustr[5], YK_, 0,
 	menustr[6], YK_, 0,
+	menustr[7], YK_, 0,
+	menustr[8], YK_, 0,
+	menustr[9], YK_, 0,
+	menustr[10], YK_, 0,
 	NULL);
-      for (n = 0; n < 8; n++)
+	  else
+         val = vDisplayMenu (x0 + 42, subwin_y0, menustr[11],
+	menustr[0], YK_, 0,
+	menustr[1], YK_, 0,
+	menustr[2], YK_, 0,
+	menustr[3], YK_, 0,
+	menustr[4], YK_, 0,
+	menustr[5], YK_, 0,
+	menustr[6], YK_, 0,
+	NULL);
+      for (n = 0; n < 12; n++)
 	FreeMemory (menustr[n]);
       subsubwin_y0 = subwin_y0 + BOX_BORDER + (2 + val) * FONTH;
       switch (val)
@@ -267,6 +290,50 @@ void LinedefProperties (int x0, int y0, 
 	      LineDefs[cur->objnum].sidedef2 = val;
 	    MadeChanges = 1;
 	    MadeMapChanges = 1;
+	  }
+	  break;
+
+	case 8:
+	  val = InputIntegerValue (x0 + 84, subsubwin_y0,
+	    0, 255, LineDefs[obj->objnum].arg2);
+	  if (val != IIV_CANCEL)  // Not [esc]
+	  {
+	    for (cur = obj; cur; cur = cur->next)
+	      LineDefs[cur->objnum].arg2 = val;
+	    MadeChanges = 1;
+	  }
+	  break;
+
+	case 9:
+	  val = InputIntegerValue (x0 + 84, subsubwin_y0,
+	    0, 255, LineDefs[obj->objnum].arg3);
+	  if (val != IIV_CANCEL)  // Not [esc]
+	  {
+	    for (cur = obj; cur; cur = cur->next)
+	      LineDefs[cur->objnum].arg3 = val;
+	    MadeChanges = 1;
+	  }
+	  break;
+
+	case 10:
+	  val = InputIntegerValue (x0 + 84, subsubwin_y0,
+	    0, 255, LineDefs[obj->objnum].arg4);
+	  if (val != IIV_CANCEL)  // Not [esc]
+	  {
+	    for (cur = obj; cur; cur = cur->next)
+	      LineDefs[cur->objnum].arg4 = val;
+	    MadeChanges = 1;
+	  }
+	  break;
+
+	case 11:
+	  val = InputIntegerValue (x0 + 84, subsubwin_y0,
+	    0, 255, LineDefs[obj->objnum].arg5);
+	  if (val != IIV_CANCEL)  // Not [esc]
+	  {
+	    for (cur = obj; cur; cur = cur->next)
+	      LineDefs[cur->objnum].arg5 = val;
+	    MadeChanges = 1;
 	  }
 	  break;
      }
diff -N -p -r -u yadex-1.7.0-orig/src/levels.cc yadex-1.7.0/src/levels.cc
--- yadex-1.7.0-orig/src/levels.cc	Tue Oct 19 20:53:55 2004
+++ yadex-1.7.0/src/levels.cc	Wed Oct 20 00:04:05 2004
@@ -58,6 +58,8 @@ int NumVertices;		/* number of vertexes 
 VPtr Vertices;			/* vertex data */
 int NumSectors;			/* number of sectors */
 SPtr Sectors;			/* sectors data */
+u8* Behavior;
+int BehaviorSize;
 
 // FIXME should be somewhere else
 int NumWTexture;		/* number of wall textures */
@@ -95,6 +97,10 @@ y_file_name_t Level_file_name_saved;  /*
 				   the Level has never been saved yet,
 				   an empty string. */
 
+static u8 DefaultBehavior[16] = {
+	'A', 'C', 'S', 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
 void EmptyLevelData (const char *levelname)
 {
 Things = 0;
@@ -109,6 +115,12 @@ Sectors = 0;
 NumSectors = 0;
 Vertices = 0;
 NumVertices = 0;
+if (yg_level_format == YGLF_HEXEN)
+   {
+      BehaviorSize = sizeof(DefaultBehavior);
+      Behavior = (u8*) GetFarMemory ((unsigned long) BehaviorSize );
+      memcpy(Behavior, DefaultBehavior, BehaviorSize);
+   }
 }
 
 
@@ -199,7 +211,7 @@ else
    {
    offset = dir->dir.start;
    length = dir->dir.size;
-   if (MainWad == Iwad4)  // Hexen mode
+   if (yg_level_format == YGLF_HEXEN)  // Hexen mode
       {
       NumThings = (int) (length / WAD_HEXEN_THING_BYTES);
       if ((i32) (NumThings * WAD_HEXEN_THING_BYTES) != length)
@@ -234,18 +246,23 @@ if (NumThings > 0)
       rc = 1;
       goto byebye;
       }
-   if (MainWad == Iwad4)		// Hexen mode
+   if (yg_level_format == YGLF_HEXEN)		// Hexen mode
       for (long n = 0; n < NumThings; n++)
 	 {
          u8 dummy2[6];
-	 wf->read_i16   ();					// Tid
+	 wf->read_i16   (&Things[n].tid  );
 	 wf->read_i16   (&Things[n].xpos );
 	 wf->read_i16   (&Things[n].ypos );
-	 wf->read_i16   ();					// Height
+	 wf->read_i16   (&Things[n].height);
 	 wf->read_i16   (&Things[n].angle);
 	 wf->read_i16   (&Things[n].type );
 	 wf->read_i16   (&Things[n].when );
-         wf->read_bytes (dummy2, sizeof dummy2);
+	 wf->read_u8    (Things[n].special);
+	 wf->read_u8    (Things[n].arg1  );
+	 wf->read_u8    (Things[n].arg2  );
+	 wf->read_u8    (Things[n].arg3  );
+	 wf->read_u8    (Things[n].arg4  );
+	 wf->read_u8    (Things[n].arg5  );
 	 if (wf->error ())
 	    {
 	    err ("%s: error reading thing #%ld", lump_name, n);
@@ -283,7 +300,7 @@ if (yg_level_format != YGLF_ALPHA)
       NumLineDefs = 0;
    else
       {
-      if (MainWad == Iwad4)  // Hexen mode
+      if (yg_level_format == YGLF_HEXEN)  // Hexen mode
 	 {
 	 NumLineDefs = (int) (dir->dir.size / WAD_HEXEN_LINEDEF_BYTES);
 	 if ((i32) (NumLineDefs * WAD_HEXEN_LINEDEF_BYTES) != dir->dir.size)
@@ -310,7 +327,7 @@ if (yg_level_format != YGLF_ALPHA)
 	 rc = 1;
 	 goto byebye;
 	 }
-      if (MainWad == Iwad4)  // Hexen mode
+      if (yg_level_format == YGLF_HEXEN)  // Hexen mode
 	 for (long n = 0; n < NumLineDefs; n++)
 	    {
 	    u8 dummy[6];
@@ -322,6 +339,10 @@ if (yg_level_format != YGLF_ALPHA)
 	    wf->read_i16   (&LineDefs[n].sidedef2);
 	    LineDefs[n].type = dummy[0];
 	    LineDefs[n].tag  = dummy[1];  // arg1 often contains a tag
+		LineDefs[n].arg2 = dummy[2];
+		LineDefs[n].arg3 = dummy[3];
+		LineDefs[n].arg4 = dummy[4];
+		LineDefs[n].arg5 = dummy[5];
 	    if (wf->error ())
 	       {
 	       err ("%s: error reading linedef #%ld", lump_name, n);
@@ -907,6 +928,37 @@ else  // Doom alpha--a wholly different 
    }
 }
 
+// Read BEHAVIOR
+if (yg_level_format == YGLF_HEXEN)
+{
+const char *lump_name = "BEHAVIOR";
+verbmsg (" behavior\n");
+dir = FindMasterDir (Level, lump_name);
+if (dir)
+   {
+   BehaviorSize = (int)dir->dir.size;
+   if (BehaviorSize > 0)
+      {
+      Behavior = (u8*) GetFarMemory ((unsigned long) BehaviorSize );
+      const Wad_file *wf = dir->wadfile;
+      wf->seek (dir->dir.start);
+      if (wf->error ())
+         {
+         err ("%s: seek error", lump_name);
+         rc = 1;
+         goto byebye;
+         }
+      wf->read_bytes (Behavior, BehaviorSize);
+      if (wf->error ())
+         {
+         err ("%s: error behavior lump", lump_name);
+         rc = 1;
+         goto byebye;
+         }
+      }
+   }
+}
+
 /* Sanity checking on sidedefs: the sector must exist. I don't
    make this a fatal error, though, because it's not exceptional
    to find wads with unused sidedefs with a sector# of -1. Well
@@ -1011,16 +1063,10 @@ int SaveLevelData (const char *outfile, 
 FILE   *file;
 MDirPtr dir;
 int     n;
-long	lump_offset[WAD_LL__];
-size_t	lump_size[WAD_LL__];
+long	lump_offset[WAD_LL__MAX];
+size_t	lump_size[WAD_LL__MAX];
 wad_level_lump_no_t l;
 
-if (yg_level_format == YGLF_HEXEN || ! strcmp (Game, "hexen"))
-   {
-   Notify (-1, -1, "I refuse to save. Hexen mode is still",
-                   "too badly broken. You would lose data.");
-   return 1;
-   }
 if (! level_name || ! levelname2levelno (level_name))
    {
    nf_bug ("SaveLevelData: bad level_name \"%s\", using \"E1M1\" instead.",
@@ -1047,9 +1093,15 @@ bool reuse_nodes = Level
   && ! MadeMapChanges
   && yg_level_format != YGLF_ALPHA;
 
+int NumLumps;
+if (yg_level_format == YGLF_HEXEN)
+   NumLumps = WAD_LL__HEXEN;
+else
+   NumLumps = WAD_LL__DOOM;
+
 // Write the pwad header
 WriteBytes (file, "PWAD", 4);		// Pwad file
-file_write_i32 (file, WAD_LL__);	// Number of entries = 11
+file_write_i32 (file, NumLumps);	// Number of entries = 11
 file_write_i32 (file, 0);		// Fix this up later
 if (Level)
    dir = Level->next;
@@ -1067,11 +1119,30 @@ lump_offset[l] = ftell (file);
 ObjectsNeeded (OBJ_THINGS, 0);
 for (n = 0; n < NumThings; n++)
    {
-   file_write_i16 (file, Things[n].xpos );
-   file_write_i16 (file, Things[n].ypos );
-   file_write_i16 (file, Things[n].angle);
-   file_write_i16 (file, Things[n].type );
-   file_write_i16 (file, Things[n].when );
+   if (yg_level_format == YGLF_HEXEN)
+      {
+      file_write_i16 (file, Things[n].tid  );
+      file_write_i16 (file, Things[n].xpos );
+      file_write_i16 (file, Things[n].ypos );
+      file_write_i16 (file, Things[n].height);
+      file_write_i16 (file, Things[n].angle);
+      file_write_i16 (file, Things[n].type );
+      file_write_i16 (file, Things[n].when );
+      WriteBytes     (file, &Things[n].special, 1);
+      WriteBytes     (file, &Things[n].arg1, 1 );
+      WriteBytes     (file, &Things[n].arg2, 1 );
+      WriteBytes     (file, &Things[n].arg3, 1 );
+      WriteBytes     (file, &Things[n].arg4, 1 );
+      WriteBytes     (file, &Things[n].arg5, 1 );
+	  }
+   else
+      {
+      file_write_i16 (file, Things[n].xpos );
+      file_write_i16 (file, Things[n].ypos );
+      file_write_i16 (file, Things[n].angle);
+      file_write_i16 (file, Things[n].type );
+      file_write_i16 (file, Things[n].when );
+      }
    }
 lump_size[l] = ftell (file) - lump_offset[l];
 if (Level)
@@ -1083,13 +1154,32 @@ lump_offset[WAD_LL_LINEDEFS] = ftell (fi
 ObjectsNeeded (OBJ_LINEDEFS, 0);
 for (n = 0; n < NumLineDefs; n++)
    {
-   file_write_i16 (file, LineDefs[n].start   );
-   file_write_i16 (file, LineDefs[n].end     );
-   file_write_i16 (file, LineDefs[n].flags   );
-   file_write_i16 (file, LineDefs[n].type    );
-   file_write_i16 (file, LineDefs[n].tag     );
-   file_write_i16 (file, LineDefs[n].sidedef1);
-   file_write_i16 (file, LineDefs[n].sidedef2);
+   if (yg_level_format == YGLF_HEXEN)
+      {
+      u8 dummy[6];
+      dummy[0] = LineDefs[n].type;
+      dummy[1] = LineDefs[n].tag;
+      dummy[2] = LineDefs[n].arg2;
+      dummy[3] = LineDefs[n].arg3;
+      dummy[4] = LineDefs[n].arg4;
+      dummy[5] = LineDefs[n].arg5;
+      file_write_i16 (file, LineDefs[n].start   );
+      file_write_i16 (file, LineDefs[n].end     );
+      file_write_i16 (file, LineDefs[n].flags   );
+      WriteBytes     (file, dummy, 6);
+      file_write_i16 (file, LineDefs[n].sidedef1);
+      file_write_i16 (file, LineDefs[n].sidedef2);
+	  }
+   else
+      {
+      file_write_i16 (file, LineDefs[n].start   );
+      file_write_i16 (file, LineDefs[n].end     );
+      file_write_i16 (file, LineDefs[n].flags   );
+      file_write_i16 (file, LineDefs[n].type    );
+      file_write_i16 (file, LineDefs[n].tag     );
+      file_write_i16 (file, LineDefs[n].sidedef1);
+      file_write_i16 (file, LineDefs[n].sidedef2);
+	  }
    }
 lump_size[l] = ftell (file) - lump_offset[l];
 if (Level)
@@ -1221,9 +1311,21 @@ lump_size[l] = ftell (file) - lump_offse
 if (Level)
    dir = dir->next;
 
+ 
+// Write the BEHAVIOR lump
+if (yg_level_format == YGLF_HEXEN)
+{
+   l = WAD_LL_BEHAVIOR;
+   lump_offset[l] = ftell (file);
+   WriteBytes(file, Behavior, BehaviorSize);
+   lump_size[l] = BehaviorSize;
+   if (Level)
+      dir = dir->next;
+}
+
 // Write the actual directory
 long dir_offset = ftell (file);
-for (int L = 0; L < (int) WAD_LL__; L++)
+for (int L = 0; L < (int) NumLumps; L++)
    {
    file_write_i32 (file, lump_offset[L]);
    file_write_i32 (file, lump_size[L]);
diff -N -p -r -u yadex-1.7.0-orig/src/levels.h yadex-1.7.0/src/levels.h
--- yadex-1.7.0-orig/src/levels.h	Tue Oct 19 20:53:55 2004
+++ yadex-1.7.0/src/levels.h	Tue Oct 19 22:22:49 2004
@@ -28,6 +28,8 @@ extern VPtr  Vertices;		/* vertices data
 extern int   NumSegs;		/* number of segments */
 extern int   NumSectors;	/* number of sectors */
 extern SPtr  Sectors;		/* sectors data */
+extern u8*   Behavior;
+extern int   BehaviorSize;
 
 // FIXME should be somewhere else
 extern int   NumWTexture;	/* number of wall textures */
diff -N -p -r -u yadex-1.7.0-orig/src/objects.cc yadex-1.7.0/src/objects.cc
--- yadex-1.7.0-orig/src/objects.cc	Tue Oct 19 20:53:55 2004
+++ yadex-1.7.0/src/objects.cc	Tue Oct 19 23:53:42 2004
@@ -465,12 +465,28 @@ switch (objtype)
 	 Things[last].type  = Things[copyfrom].type;
 	 Things[last].angle = Things[copyfrom].angle;
 	 Things[last].when  = Things[copyfrom].when;
+	 Things[last].tid   = Things[copyfrom].tid;
+	 Things[last].height = Things[copyfrom].height;
+	 Things[last].special = Things[copyfrom].special;
+	 Things[last].arg1  = Things[copyfrom].arg1;
+	 Things[last].arg2  = Things[copyfrom].arg2;
+	 Things[last].arg3  = Things[copyfrom].arg3;
+	 Things[last].arg4  = Things[copyfrom].arg4;
+	 Things[last].arg5  = Things[copyfrom].arg5;
 	 }
       else
 	 {
 	 Things[last].type = default_thing;
 	 Things[last].angle = 0;
 	 Things[last].when  = 0x07;
+	 Things[last].tid   = 0;
+	 Things[last].height = 0;
+	 Things[last].special = 0;
+	 Things[last].arg1  = 0;
+	 Things[last].arg2  = 0;
+	 Things[last].arg3  = 0;
+	 Things[last].arg4  = 0;
+	 Things[last].arg5  = 0;
 	 }
       break;
 
@@ -508,6 +524,10 @@ switch (objtype)
 	 LineDefs[last].flags = LineDefs[copyfrom].flags;
 	 LineDefs[last].type  = LineDefs[copyfrom].type;
 	 LineDefs[last].tag   = LineDefs[copyfrom].tag;
+	 LineDefs[last].arg2  = LineDefs[copyfrom].arg2;
+	 LineDefs[last].arg3  = LineDefs[copyfrom].arg3;
+	 LineDefs[last].arg4  = LineDefs[copyfrom].arg4;
+	 LineDefs[last].arg5  = LineDefs[copyfrom].arg5;
 	 }
       else
 	 {
@@ -516,6 +536,10 @@ switch (objtype)
 	 LineDefs[last].flags = 1;
 	 LineDefs[last].type  = 0;
 	 LineDefs[last].tag   = 0;
+	 LineDefs[last].arg2  = 0;
+	 LineDefs[last].arg3  = 0;
+	 LineDefs[last].arg4  = 0;
+	 LineDefs[last].arg5  = 0;
 	 }
       LineDefs[last].sidedef1 = OBJ_NO_NONE;
       LineDefs[last].sidedef2 = OBJ_NO_NONE;
diff -N -p -r -u yadex-1.7.0-orig/src/sanity.cc yadex-1.7.0/src/sanity.cc
--- yadex-1.7.0-orig/src/sanity.cc	Tue Oct 19 20:53:55 2004
+++ yadex-1.7.0/src/sanity.cc	Tue Oct 19 22:11:08 2004
@@ -67,10 +67,10 @@ void check_types ()
   assert_size (i16, 2);
   assert_size (u32, 4);
   assert_size (i32, 4);
-  assert_size (struct LineDef, 14);
+  assert_size (struct LineDef, 18);
   assert_size (struct Sector,  26);
   assert_size (struct SideDef, 30);
-  assert_size (struct Thing,   10);
+  assert_size (struct Thing,   20);
   assert_size (struct Vertex,   4);
   assert_wrap (u8,          255,           0);
   assert_wrap (i8,          127,        -128);
diff -N -p -r -u yadex-1.7.0-orig/src/t_prop.cc yadex-1.7.0/src/t_prop.cc
--- yadex-1.7.0-orig/src/t_prop.cc	Tue Oct 19 20:53:55 2004
+++ yadex-1.7.0/src/t_prop.cc	Tue Oct 19 23:43:46 2004
@@ -45,6 +45,7 @@ Place, Suite 330, Boston, MA 02111-1307,
 static const char *PrintThinggroup (void *ptr);
 static const char *PrintThingdef (void *ptr);
 int InputThingType (int x0, int y0, int *number);
+int InputLinedefType (int x0, int y0, int *number);
 
 
 /*
@@ -59,9 +60,9 @@ int    n, val;
 SelPtr cur;
 int    subwin_y0;
 
-for (n = 0; n < 6; n++)
+for (n = 0; n < 14; n++)
    menustr[n] = (char *) GetMemory (60);
-sprintf (menustr[5], "Edit thing #%d", obj->objnum);
+sprintf (menustr[13], "Edit thing #%d", obj->objnum);
 sprintf (menustr[0], "Change type          (Current: %s)",
          get_thing_name (Things[obj->objnum].type));
 sprintf (menustr[1], "Change angle         (Current: %s)",
@@ -72,14 +73,47 @@ sprintf (menustr[3], "Change X position 
          Things[obj->objnum].xpos);
 sprintf (menustr[4], "Change Y position    (Current: %d)",
          Things[obj->objnum].ypos);
-val = vDisplayMenu (x0, y0, menustr[5],
+sprintf (menustr[5], "Change Z position    (Current: %d)",
+         Things[obj->objnum].height);
+sprintf (menustr[6], "Change TID           (Current: %d)",
+         Things[obj->objnum].tid);
+sprintf (menustr[7], "Change special       (Current: %d)",
+         Things[obj->objnum].special);
+sprintf (menustr[8], "Change arg1          (Current: %d)",
+         Things[obj->objnum].arg1);
+sprintf (menustr[9], "Change arg2          (Current: %d)",
+         Things[obj->objnum].arg2);
+sprintf (menustr[10], "Change arg3          (Current: %d)",
+         Things[obj->objnum].arg3);
+sprintf (menustr[11], "Change arg4          (Current: %d)",
+         Things[obj->objnum].arg4);
+sprintf (menustr[12], "Change arg5          (Current: %d)",
+         Things[obj->objnum].arg5);
+if (yg_level_format == YGLF_HEXEN)		// Hexen mode
+val = vDisplayMenu (x0, y0, menustr[13],
    menustr[0], YK_, 0,
    menustr[1], YK_, 0,
    menustr[2], YK_, 0,
    menustr[3], YK_, 0,
    menustr[4], YK_, 0,
+   menustr[5], YK_, 0,
+   menustr[6], YK_, 0,
+   menustr[7], YK_, 0,
+   menustr[8], YK_, 0,
+   menustr[9], YK_, 0,
+   menustr[10], YK_, 0,
+   menustr[11], YK_, 0,
+   menustr[12], YK_, 0,
    NULL);
-for (n = 0; n < 6; n++)
+else
+val = vDisplayMenu (x0, y0, menustr[13],
+   menustr[0], YK_, 0,
+   menustr[1], YK_, 0,
+   menustr[2], YK_, 0,
+   menustr[3], YK_, 0,
+   menustr[4], YK_, 0,
+   NULL);
+for (n = 0; n < 14; n++)
    FreeMemory (menustr[n]);
 subwin_y0 = y0 + BOX_BORDER + (2 + val) * FONTH;
 switch (val)
@@ -237,6 +271,93 @@ switch (val)
 	n = val - Things[obj->objnum].ypos;
 	for (cur = obj; cur; cur = cur->next)
 	   Things[cur->objnum].ypos += n;
+	MadeChanges = 1;
+        }
+     break;
+
+  case 6:
+     val = InputIntegerValue (x0 + 42, subwin_y0, -32768, 32767,
+                              Things[obj->objnum].height);
+     if (val != IIV_CANCEL)
+        {
+	n = val - Things[obj->objnum].height;
+	for (cur = obj; cur; cur = cur->next)
+	   Things[cur->objnum].height += n;
+	MadeChanges = 1;
+        }
+     break;
+
+  case 7:
+     val = InputIntegerValue (x0 + 42, subwin_y0, -32768, 32767,
+                              Things[obj->objnum].tid);
+     if (val != IIV_CANCEL)
+        {
+	for (cur = obj; cur; cur = cur->next)
+	   Things[cur->objnum].tid = val;
+	MadeChanges = 1;
+        }
+     break;
+
+  case 8:
+     if (! InputLinedefType (x0 + 42, subwin_y0, &val))
+        {
+	for (cur = obj; cur; cur = cur->next)
+	   Things[cur->objnum].special = val;
+	MadeChanges = 1;
+        }
+     break;
+
+  case 9:
+     val = InputIntegerValue (x0 + 42, subwin_y0, 0, 255,
+                              Things[obj->objnum].arg1);
+     if (val != IIV_CANCEL)
+        {
+	for (cur = obj; cur; cur = cur->next)
+	   Things[cur->objnum].arg1 = val;
+	MadeChanges = 1;
+        }
+     break;
+
+  case 10:
+     val = InputIntegerValue (x0 + 42, subwin_y0, 0, 255,
+                              Things[obj->objnum].arg2);
+     if (val != IIV_CANCEL)
+        {
+	for (cur = obj; cur; cur = cur->next)
+	   Things[cur->objnum].arg2 = val;
+	MadeChanges = 1;
+        }
+     break;
+
+  case 11:
+     val = InputIntegerValue (x0 + 42, subwin_y0, 0, 255,
+                              Things[obj->objnum].arg3);
+     if (val != IIV_CANCEL)
+        {
+	for (cur = obj; cur; cur = cur->next)
+	   Things[cur->objnum].arg3 = val;
+	MadeChanges = 1;
+        }
+     break;
+
+  case 12:
+     val = InputIntegerValue (x0 + 42, subwin_y0, 0, 255,
+                              Things[obj->objnum].arg4);
+     if (val != IIV_CANCEL)
+        {
+	for (cur = obj; cur; cur = cur->next)
+	   Things[cur->objnum].arg4 = val;
+	MadeChanges = 1;
+        }
+     break;
+
+  case 13:
+     val = InputIntegerValue (x0 + 42, subwin_y0, 0, 255,
+                              Things[obj->objnum].arg5);
+     if (val != IIV_CANCEL)
+        {
+	for (cur = obj; cur; cur = cur->next)
+	   Things[cur->objnum].arg5 = val;
 	MadeChanges = 1;
         }
      break;
diff -N -p -r -u yadex-1.7.0-orig/src/wstructs.h yadex-1.7.0/src/wstructs.h
--- yadex-1.7.0-orig/src/wstructs.h	Tue Oct 19 20:53:55 2004
+++ yadex-1.7.0/src/wstructs.h	Tue Oct 19 22:45:16 2004
@@ -84,14 +84,30 @@ typedef i16 wad_tangle_t;
 typedef i16 wad_tflags_t;
 struct Thing
 {
+  i16              tid;
   wad_coord_t      xpos;		// FIXME rename to "x"
   wad_coord_t      ypos;		// FIXME rename to "y"
+  wad_z_t          height;
   wad_tangle_t     angle;
   wad_ttype_t      type;
   wad_tflags_t     when;		// FIXME rename to "flags"
+  u8               special;
+  u8               arg1;
+  u8               arg2;
+  u8               arg3;
+  u8               arg4;
+  u8               arg5;
 };
 typedef struct
 {
+  wad_coord_t      xpos;		// FIXME rename to "x"
+  wad_coord_t      ypos;		// FIXME rename to "y"
+  wad_tangle_t     angle;
+  wad_ttype_t      type;
+  wad_tflags_t     when;		// FIXME rename to "flags"
+} wad_doom_thing_t;
+typedef struct
+{
   i16              tid;
   wad_coord_t      x;
   wad_coord_t      y;
@@ -121,11 +137,25 @@ struct LineDef
   wad_ldflags_t flags;
   wad_ldtype_t  type;
   wad_tag_t     tag;
+  u8            arg2;
+  u8            arg3;
+  u8            arg4;
+  u8            arg5;
   wad_sdn_t     sidedef1;		// # of first (right) sidedef
   wad_sdn_t     sidedef2;		// # of second (left) sidedef or 0xffff
 };
 typedef struct
 {
+  wad_vn_t      start;			// # of start vertex
+  wad_vn_t      end;			// # of end vertex
+  wad_ldflags_t flags;
+  wad_ldtype_t  type;
+  wad_tag_t     tag;
+  wad_sdn_t     sidedef1;		// # of first (right) sidedef
+  wad_sdn_t     sidedef2;		// # of second (left) sidedef or 0xffff
+} wad_doom_linedef_t;
+typedef struct
+{
   wad_vn_t      start;
   wad_vn_t      end;
   wad_ldflags_t flags;
@@ -197,8 +227,11 @@ typedef enum
   WAD_LL_SECTORS,
   WAD_LL_REJECT,
   WAD_LL_BLOCKMAP,
-		      // Hexen has a BEHAVIOR lump here
-  WAD_LL__
+  WAD_LL_BEHAVIOR,
+
+  WAD_LL__MAX,
+  WAD_LL__HEXEN = WAD_LL__MAX,
+  WAD_LL__DOOM = WAD_LL_BEHAVIOR
 } wad_level_lump_no_t;
 
 typedef struct
@@ -207,7 +240,7 @@ typedef struct
   size_t item_size;
 } wad_level_lump_def_t;
 
-const wad_level_lump_def_t wad_level_lump[WAD_LL__] =
+const wad_level_lump_def_t wad_level_lump[WAD_LL__MAX] =
 {
   { 0,          0                 },  // Label -- no fixed name
   { "THINGS",   WAD_THING_BYTES   },
@@ -219,8 +252,8 @@ const wad_level_lump_def_t wad_level_lum
   { "NODES",    0                 },
   { "SECTORS",  WAD_SECTOR_BYTES  },
   { "REJECT",   0                 },
-  { "BLOCKMAP", 0                 }
-				      // Hexen has a BEHAVIOR lump here
+  { "BLOCKMAP", 0                 },
+  { "BEHAVIOR", 0                 }
 };
 
 
--- yadex-1.7.0-orig/ygd/hexen.ygd	Tue Oct 19 20:53:55 2004
+++ yadex-1.7.0/ygd/hexen.ygd	Wed Oct 20 23:55:14 2004
@@ -108,6 +108,7 @@ ldt 100 x "?? Scroll left"   "??  Scroll
 ldt 101 x "?? Scroll right"  "??  Scroll_Texture_Right"
 ldt 102 x "?? Scroll up"     "??  Scroll_Texture_Up"
 ldt 103 x "?? Scroll down"   "??  Scroll_Texture_Down"
+ldt 109 L "?? Force lightng" "??  Light_ForceLightning"
 ldt 110 L "?? Raise light"   "??  Light_RaiseByValue"
 ldt 111 L "?? Lower light"   "??  Light_LowerByValue"
 ldt 112 L "?? Set light"     "??  Light_ChangeToValue"
@@ -136,25 +137,12 @@ ldt 140 x "?? Change sound"  "??  Sector
 #
 
 st   0 "  Normal"       "Normal"
-st   1 "  Phased light" "light phased"           # FIXME
-st   2 "  Light start"  "lightsequencestart"     # FIXME
-st   3 "  Light specl1" "lightsequencespecial1"  # FIXME
-st   4 "  Light specl2" "lightsequencespecial2"  # FIXME
-st   9 "  Secret"       "Sector counts toward secret count"
+st   1 "  Phased light" "light phased"
+st   2 "  Light start"  "lightsequencestart"
+st   3 "  Light specl1" "lightsequencespecial1"
+st   4 "  Light specl2" "lightsequencespecial2"
 st  26 "  Stairs1"      "Stairs special 1"
 st  27 "  Stairs2"      "Stairs special 2"
-st  40 "  Wind east 1"  "Wind east force 1"
-st  41 "  Wind east 2"  "Wind east force 2"
-st  42 "  Wind east 3"  "Wind east force 3"
-st  43 "  Wind north 1" "Wind north force 1"
-st  44 "  Wind north 2" "Wind north force 2"
-st  45 "  Wind north 3" "Wind north force 3"
-st  46 "  Wind south 1" "Wind south force 1"
-st  47 "  Wind south 2" "Wind south force 2"
-st  48 "  Wind south 3" "Wind south force 3"
-st  49 "  Wind west 1"  "Wind west force 1"
-st  50 "  Wind west 2"  "Wind west force 2"
-st  51 "  Wind west 3"  "Wind west force 3"
 st 198 "  Lightning 64" "Indoor lightning, +64 units"
 st 199 "  Lightning 32" "Indoor lightning, +32 units"
 st 200 "  Sky2"         "Use MAPINFO sky2"
@@ -191,17 +179,21 @@ st 224 "  Scroll SW F"  "Scroll southwes
 thinggroup p rgb:4/f/4 "Player"
 thinggroup m rgb:f/0/0 "Monster"
 thinggroup w rgb:f/a/0 "Weapon"
-thinggroup a rgb:8/5/0 "Ammunition"
+thinggroup a rgb:8/5/0 "Mana"
 thinggroup h rgb:2/8/0 "Health & armour"
+thinggroup A rgb:2/8/0 "Artifacts"
+thinggroup q rgb:2/8/0 "Quest items"
 thinggroup b rgb:2/8/0 "Misc. bonus"
 thinggroup k rgb:f/0/f "Key"
 thinggroup P rgb:6/6/c "Plants"
+thinggroup t rgb:6/6/c "Stalagm. & stalact."
+thinggroup g rgb:6/6/c "Gargoyle statues"
+thinggroup T rgb:6/6/c "Table stuff"
+thinggroup D rgb:6/6/c "Dungeon stuff"
 thinggroup d rgb:6/6/c "Misc. decoration"
 thinggroup l rgb:6/6/c "Light source"
-#thinggroup g rgb:6/6/c "Gory decoration"
-#thinggroup c rgb:6/6/c "Corpse"
-thinggroup e rgb:0/b/d "Environment sound"
-thinggroup s rgb:0/b/d "Ambient sound"
+thinggroup s rgb:0/b/d "Sound"
+thinggroup S rgb:0/b/d "Special"
 
 #
 #	Definition of things
@@ -210,56 +202,268 @@ thinggroup s rgb:0/b/d "Ambient sound"
 #	<desc> must not exceed 19 characters.
 #
 
-thing     1 p -   16 "Player 1 start"		PLAY
-thing     2 p -   16 "Player 2 start"		PLAY
-thing     3 p -   16 "Player 3 start"		PLAY
-thing     4 p -   16 "Player 4 start"		PLAY
+thing     1 p -   16 "Player 1 start *"		PLAY
+thing     2 p -   16 "Player 2 start *"		PLAY
+thing     3 p -   16 "Player 3 start *"		PLAY
+thing     4 p -   16 "Player 4 start *"		PLAY
 thing    11 p -   16 "Deathmatch start"		PLAYF1
 thing    14 p -   16 "Teleport exit"		TELE
+thing  9100 p -   16 "Player 5 start *"		PLAY
+thing  9101 p -   16 "Player 6 start *"		PLAY
+thing  9102 p -   16 "Player 7 start *"		PLAY
+thing  9103 p -   16 "Player 8 start *"		PLAY
 
-thing    31 m -   32 "Demon"			DEMN
+thing    31 m -   32 "Chaos serpent"		DEMN
+thing    34 m -   40 "Reiver"			WRTH
 thing   107 m -   20 "Centaur"			CENT
+thing   114 m -   44 "Dark bishop"		BISH
 thing   115 m -   20 "Centaur leader"		CENTF
-thing   120 m -   17 "Serpent leader"		SSPTK	# Not too sure...
-thing   121 m -   17 "Serpent"			SSDV	# Not too sure...
-thing  8020 m -   22 "Ice guy"			ICEY
+thing   120 m -   17 "Stalker leader"		SSPTK
+thing   121 m -   17 "Stalker"			SSDV
+thing   254 m -   40 "Death wyvern *"		DRAG
+thing  8020 m -   22 "Wendigo"			ICEY
+thing  8080 m -   64 "Chaos serpent (gas)"	DEM2
+thing 10011 m -   40 "Reiver leader"		WRTH
 thing 10030 m -   25 "Ettin"			ETTN
-thing 10060 m -   20 "Fire demon"		FDMN
-
-thing    10 w -   17 "Serpent staff"		WCSS   # Cleric
-thing    53 w -   17 "Frost chards"		WMCS   # Mage
-thing  8010 w -   17 "Timon's axe"		WFAX   # Fighter
+thing 10060 m -   20 "Fire gargoyle"		FDMN
+thing 10080 m -   80 "Heresiarch"		SORC
+thing 10100 m -   32 "Zedek (fighter)"		PLAYA8
+thing 10101 m -   32 "Traductus (cleric)"	CLERA8
+thing 10102 m -   32 "Menelkir (mage)"		MAGEA8
+thing 10200 m -   20 "Korax"			KORX
+
+thing    10 w -   17 "Serpent staff"		WCSS
+thing    12 w -   20 "Quietus blade"		WFR1
+thing    13 w -   20 "Quietus guard"		WFR2
+thing    16 w -   20 "Quietus hilt"		WFR3
+thing    18 w -   20 "Wraithverge head"		WCH1
+thing    19 w -   20 "Wraithverge center"	WCH2
+thing    20 w -   20 "Wraithverge grip"		WCH3
+thing    21 w -   20 "Bloodscourge head"	WMS1
+thing    22 w -   20 "Bloodscourge center"	WMS2
+thing    23 w -   20 "Bloodscourge grip"	WMS3
+thing    53 w -   17 "Frost chards"		WMCS
+thing   123 w -   10 "Hammer of retributn"	WFHM
+thing  8009 w -   10 "Firestorm"		WCFM
+thing  8010 w -   17 "Timon's axe"		WFAX
+thing  8040 w -   20 "Arc of death"		WMLG
 
 thing   122 a -   17 "Blue manna"		MAN1
 thing   124 a -   17 "Green manna"		MAN2
 thing  8004 a -   17 "Combined manna"		MAN3
 
 thing    81 h -   17 "Crystal vial"		PTN1
-thing    82 h -   17 "Quartz flask"		PTN2
-thing  8000 h -   17 "Flechette"		PSBG
+thing  8005 h -   10 "Mesh armor"		ARM1
+thing  8006 h -   20 "Falcon shield"		ARM2
 thing  8007 h -   17 "Platinum helmet"		ARM3
+thing  8008 h -   20 "Amulet of warding"	ARM4
 
-thing   314 k -   17 "Stone (?) key"		KEY7
+thing    30 A -   20 "Porkalator"		ARTIPORK
+thing    32 A -   20 "Mystic urn"		ARTISPHL
+thing    33 A -   20 "Torch"			ARTITRCH
+thing    36 A -   20 "Chaos device"		ARTIATLP
+thing    82 A -   17 "Quartz flask"		PTN2
+thing    83 A -   20 "Wings of wrath"		SOAR
+thing    84 A -   20 "Icon of defender"		INVU
+thing    86 A -   15 "Dark servant"		ARTISUMN
+thing  8000 A -   17 "Flechette"		PSBG
+thing  8002 A -   20 "Boots of speed"		ARTISPED
+thing  8003 A -   20 "Krater of might"		ARTIBMAN
+thing  8041 A -   20 "Dragonskin bracers"	ARTIBRAC
+thing 10040 A -   20 "Banishment device"	ARTITELO
+thing 10110 A -   20 "Disc of repulsion"	ARTIBLST
+thing 10120 A -   20 "Mystic ambient inc"	ARTIHRAD
+
+thing  9002 q -   20 "Yorick's skull"		ARTISKLL
+thing  9003 q -   20 "Heart of D'Sparil"	ARTIBGEM
+thing  9004 q -   20 "Ruby planet"		ARTIGEMR
+thing  9005 q -   20 "Emerald planet 1"		ARTIGEMG
+thing  9006 q -   20 "Sapphire planet 1"	ARTIGEMB
+thing  9007 q -   20 "Daemon codex"		ABK1
+thing  9008 q -   20 "Liber oscura"		ABK2
+thing  9009 q -   20 "Emerald planet 2"		ARTIGMG2
+thing  9010 q -   20 "Sapphire planet 2"	ARTIGMB2
+thing  9014 q -   20 "Flame mask"		ARTISKL2
+thing  9015 q -   20 "Glaive seal"		ARTIFWEP
+thing  9016 q -   20 "Holy relic"		ARTICWEP
+thing  9017 q -   20 "Sigil of the Magus"	ARTIMWEP
+thing  9018 q -   20 "Clock gear 1"		ARTIGEAR
+thing  9019 q -   20 "Clock gear 2"		ARTIGER2
+thing  9020 q -   20 "Clock gear 3"		ARTIGER3
+thing  9021 q -   20 "Clock gear 4"		ARTIGER4
+
+thing  8030 k -   10 "Steel key"		KEY1
+thing  8031 k -   10 "Cave key"			KEY2
+thing  8032 k -   10 "Axe key"			KEY3
+thing  8033 k -   10 "Fire key"			KEY4
+thing  8034 k -   10 "Emerald key"		KEY5
+thing  8035 k -   10 "Dungeon key"		KEY6
+thing  8036 k -   10 "Silver key"		KEY7
+thing  8037 k -   10 "Rusted key"		KEY8
+thing  8038 k -   10 "Horn key"			KEY9
+thing  8039 k -   10 "Swamp key"		KEYA
+thing  8200 k -   10 "Castle key"		KEYB
 
+thing    24 P -   20 "Tree trunk (brown)"	TRE1
+thing    25 P -   20 "Tree trunk (brownD)"	TRE1
 thing    26 P -   17 "Swamp tree tall"		TRE2
 thing    27 P -   17 "Swamp tree short"		TRE3
+thing    28 P -   20 "Tree stump (splint)"	STM1
+thing    29 P -   20 "Tree stump"		STM2
+thing    39 P -   20 "Mushroom (large, L)"	MSH1
+thing    40 P -   20 "Mushroom (large, R)"	MSH2
+thing    41 P -   20 "Mushroom (med, L)"	MSH3
+thing    42 P -   20 "Mushroom (small, R)"	MSH4
+thing    44 P -   20 "Mushroom (small)"		MSH5
+thing    45 P -   20 "Mushroom (small, F)"	MSH6
+thing    46 P -   20 "Mushroom (small, B)"	MSH7
+thing    47 P -   20 "Mushroom (small, M)"	MSH8
+thing    60 P -   20 "Vine"			TRE3
 thing    78 P -   17 "Tree leaning right"	TRE4
 thing    79 P -   17 "Tree leaning left"	TRE5
 thing    80 P -   17 "Gnarled tree right"	TRE6
 thing    87 P -   17 "Gnarled tree left"	TRE7
+thing   113 P -   10 "Blowing leaves"		LEF1
 thing  8062 P -   17 "Dead tree"		TRDT
 thing  8068 P -   17 "Conic tree"		XMAS
-
-thing    48 d -   17 "Stalactite+gmite"		SGMP
-thing    72 d -   17 "Statue"			STT2
-thing    74 d -   17 "Short statue"		STT4
+thing  8101 P -   20 "Shrub (small)"		SHB1
+thing  8102 P -   20 "Shrub (large)"		SHB2
+thing  8103 P -   20 "Bucket (hanging)"		BCKT
+thing  8104 P -   20 "Mushroom (explodng)"	SHRM
+
+thing    48 t -   17 "Stalactite+gmite"		SGMP
+thing    49 t -   20 "Stalagmite (large)"	SGM1
+thing    50 t -   20 "Stalagmite (medium)"	SGM2
+thing    51 t -   20 "Stalagmite (small)"	SGM3
+thing    52 t -   20 "Stalactite (large)"	SLC1
+thing    56 t -   20 "Stalactite (medium)"	SLC2
+thing    57 t -   20 "Stalactite (small)"	SLC3
+thing    89 t -   20 "Ice stalactite(lrg)"	ICT1
+thing    90 t -   20 "Ice stalactite(med)"	ICT2
+thing    91 t -   20 "Ice stalactite(sml)"	ICT3
+thing    92 t -   20 "Ice stalactite(tny)"	ICT4
+thing    93 t -   20 "Ice stalagmite(lrg)"	ICM1
+thing    94 t -   20 "Ice stalagmite(med)"	ICM2
+thing    95 t -   20 "Ice stalagmite(sml)"	ICM3
+thing    96 t -   20 "Ice stalagmite(tny)"	ICM4
+
+thing     5 g -   20 "Gargoyle statue w/s"	STTW
+thing    72 g -   17 "Stone gargoyle tall"	STT2
+thing    73 g -   20 "Ice gargoyle tall"	STT3
+thing    74 g -   17 "Stone gargoyle shrt"	STT4
+thing    76 g -   20 "Ice gargoyle short"	STT5
+thing  8044 g -   20 "Wooden gargoyle tal"	GAR1
+thing  8045 g -   20 "Fire gargoyle tall"	GAR2
+thing  8046 g -   20 "Red gargoyle tall"	GAR3
+thing  8047 g -   20 "Wooden gargoyle tal"	GAR4
+thing  8048 g -   20 "Metal gargoyle tall"	GAR5
+thing  8049 g -   20 "Fire gargoyle short"	GAR6
+thing  8050 g -   20 "Red gargoyle short"	GAR7
+thing  8051 g -   20 "Wooden gargoyle srt"	GAR8
+thing  8052 g -   20 "Metal gargoyle shrt"	GAR9
+thing  9011 g -   20 "Gargoyle statue"		STWN
+
+thing  8500 T -   20 "Stein (tall)"		TST1
+thing  8501 T -   20 "Stein (short)"		TST2
+thing  8502 T -   20 "Candle w/spider web"	TST3
+thing  8503 T -   20 "Candle (short)"		TST4
+thing  8504 T -   20 "Candle (tall)"		TST5
+thing  8505 T -   20 "Goblet (spilled)"		TST6
+thing  8506 T -   20 "Goblet (tall)"		TST7
+thing  8507 T -   20 "Goblet (short)"		TST8
+thing  8508 T -   20 "Goblet w/silver bnd"	TST9
+thing  8509 T -   20 "Meat cleaver"		TST0
+
+thing    61 D -   20 "Corpse impaled"		CPS1
+thing    62 D -   20 "Corpse sleeping"		CPS2
+thing    71 D -   20 "Corpse hung legs"		CPS3
+thing   108 D -   20 "Corpse hung"		CPS4
+thing   109 D -   20 "Corpse bleeding"		CPS5
+thing   110 D -   20 "Corpse chained"		CPS6
+thing   111 D -   10 "Pool of blood"		BDPL
+thing  8067 D -   20 "Iron maiden"		IRON
+thing  8071 D -   20 "Chain (short)"		CHNS
+thing  8072 D -   20 "Chain (long)"		CHNSB0
+thing  8073 D -   20 "Chain heart on hook"	CHNSC0
+thing  8074 D -   20 "Chain w/large hook"	CHNSD0
+thing  8075 D -   20 "Chain w/small hook"	CHNSE0
+thing  8076 D -   20 "Chain w/spiked ball"	CHNSF0
+thing  8077 D -   20 "Chain skull on hook"	CHNSG0
+
+thing     6 d -   20 "Rock w/moss (tiny)"	RCK1
+thing     7 d -   20 "Rock w/moss (small)"	RCK2
+thing     9 d -   20 "Rock w/moss (medium)"	RCK3
+thing    15 d -   20 "Rock w/moss (large)"	RCK4
+thing    37 d -   20 "Stump w/moss (short)"	STM3
+thing    38 d -   20 "Stump w/moss (tall)"	STM4
+thing    58 d -   20 "Moss (three strands)"	MSS1
+thing    59 d -   20 "Moss (one strand)"	MSS2
+thing    63 d -   20 "Tombstone (R.I.P.)"	TMS1
+thing    64 d -   20 "Tombstone (Shane)"	TMS2
+thing    65 d -   20 "Tombstone (large cross)"	TMS3
+thing    66 d -   20 "Tombstone (Brian R.)"	TMS4
+thing    67 d -   20 "Tombstone (circular cross)"	TMS5
+thing    68 d -   20 "Tombstone (small cross on pedestal)"	TMS6
+thing    69 d -   20 "Tombstone (Brian P.)"	TMS7
 thing    77 d -   17 "Banner"			BNR1
-
-thing    54 l -   17 "Torch"			WLTR
-thing  8061 l -   17 "FIXME"			BRTR
-
-thing   314 e -   17 "Bogus sound"
-
-thing   314 s -   17 "Bogus sound"
-
-
+thing    88 d -   20 "Log"			LOGG
+thing    97 d -   20 "Rock formation (large, brown)"	RKBL
+thing    98 d -   20 "Rock formation (small, brown)"	RKBS
+thing    99 d -   20 "Rock formation (small, gray)"	RKBK
+thing   100 d -   20 "Rubble (large)"		RBL1
+thing   101 d -   20 "Rubble (small)"		RBL2
+thing   102 d -   20 "Rubble (medium)"		RBL3
+thing   103 d -   20 "Vase on pedestal"		VASE
+thing   104 d -   20 "Pot (tall, skinny) *"	POT1
+thing   105 d -   20 "Pot (medium, skinny) *"	POT2
+thing   106 d -   20 "Pot (short, chipped) *"	POT3
+thing   140 d -   20 "Sparkling red smoke"	TSMK
+thing  8064 d -   20 "Suit of armor *"		SUIT
+thing  8065 d -   40 "Bell"			BBLL
+thing  8100 d -   20 "Barrel"			BARL
+thing  9012 d -   20 "Pedestal"			GMPD
+thing 10001 d -   20 "Fog (small) *"		FOGS
+thing 10002 d -   20 "Fog (medium) *"		FOGM
+thing 10003 d -   20 "Fog (large) *"		FOGL
+thing 10090 d -   20 "Spike (down)"		TSPKC0
+thing 10091 d -   20 "Spike (up)"		TSPK
+
+thing    17 l -   20 "Chandelier w/flame"	CDLR
+thing    54 l -   17 "Wall torch w/flame"	WLTR
+thing    55 l -   20 "Wall torch"		WLTRI0
+thing   116 l -   10 "Brazier w/flame"		TWTR
+thing   117 l -   10 "Brazier"			TWTRI0
+thing   119 l -   20 "Candles"			CNDL
+thing  8042 l -   20 "Minotaur statue f"	FBUL
+thing  8043 l -   20 "Minotaur statue"		FBULH0
+thing  8060 l -   20 "Fire skull"		FSKL
+thing  8061 l -   17 "Brazier w/flame sm"	BRTR
+thing  8063 l -   20 "Chandelier"		CDLRD0
+thing  8066 l -   20 "Candle (blue)"		CAND
+thing  8069 l -   20 "Cauldron (w/flame)"	CDRNB0
+thing  8070 l -   20 "Cauldron"			CDRN
+thing 10500 l -   20 "Flame (small, t) *"	FFSM
+thing 10501 l -   20 "Flame (small, cnt)"	FFSMC0
+thing 10502 l -   20 "Flame (large, t) *"	FFLG
+thing 10503 l -   20 "Flame (large, cnt)"	FFLGF0
+
+thing  1400 s -   20 "Stone"			TELE
+thing  1401 s -   20 "Heavy"			TELE
+thing  1402 s -   20 "Metal"			TELE
+thing  1403 s -   20 "Creak"			TELE
+thing  1404 s -   20 "Silent"			TELE
+thing  1405 s -   20 "Lava"			TELE
+thing  1406 s -   20 "Water"			TELE
+thing  1407 s -   20 "Ice"			TELE
+thing  1408 s -   20 "Earth crack"		TELE
+thing  1409 s -   20 "Metal2"			TELE
+thing  1410 s -   20 "Wind blowing"		TELE
+
+thing   118 S -   10 "Magic step"		TLGL
+thing  3000 S -   20 "Polyobject anchor"	ICPRD0
+thing  3001 S -   20 "Start spot"		SBFXH0
+thing  3002 S -   20 "Start spot w/crush"	SBFXC0
+thing  9001 S -   10 "Map spot *"		TELEC0
+thing  9013 S -   10 "Map spot w/gravity"	TELED0
+thing 10000 S -   20 "Spawn fog *"		SPIRK0
+thing 10225 S -   20 "Spawn bat *"		ABATC3C7