The DOOM sources as originally released on December 23, 1997
authorTravis Bradshaw <travis.bradshaw@idsoftware.com>
Tue, 31 Jan 2012 21:27:37 +0000 (15:27 -0600)
committerTravis Bradshaw <travis.bradshaw@idsoftware.com>
Tue, 31 Jan 2012 21:27:37 +0000 (15:27 -0600)
149 files changed:
README.TXT [new file with mode: 0644]
linuxdoom-1.10/CVS/Entries [new file with mode: 0644]
linuxdoom-1.10/CVS/Repository [new file with mode: 0644]
linuxdoom-1.10/CVS/Root [new file with mode: 0644]
linuxdoom-1.10/ChangeLog [new file with mode: 0644]
linuxdoom-1.10/DOOMLIC.TXT [new file with mode: 0644]
linuxdoom-1.10/FILES [new file with mode: 0644]
linuxdoom-1.10/FILES2 [new file with mode: 0644]
linuxdoom-1.10/Makefile [new file with mode: 0644]
linuxdoom-1.10/README.asm [new file with mode: 0644]
linuxdoom-1.10/README.b [new file with mode: 0644]
linuxdoom-1.10/README.book [new file with mode: 0644]
linuxdoom-1.10/README.gl [new file with mode: 0644]
linuxdoom-1.10/README.sound [new file with mode: 0644]
linuxdoom-1.10/TODO [new file with mode: 0644]
linuxdoom-1.10/am_map.c [new file with mode: 0644]
linuxdoom-1.10/am_map.h [new file with mode: 0644]
linuxdoom-1.10/d_englsh.h [new file with mode: 0644]
linuxdoom-1.10/d_event.h [new file with mode: 0644]
linuxdoom-1.10/d_french.h [new file with mode: 0644]
linuxdoom-1.10/d_items.c [new file with mode: 0644]
linuxdoom-1.10/d_items.h [new file with mode: 0644]
linuxdoom-1.10/d_main.c [new file with mode: 0644]
linuxdoom-1.10/d_main.h [new file with mode: 0644]
linuxdoom-1.10/d_net.c [new file with mode: 0644]
linuxdoom-1.10/d_net.h [new file with mode: 0644]
linuxdoom-1.10/d_player.h [new file with mode: 0644]
linuxdoom-1.10/d_textur.h [new file with mode: 0644]
linuxdoom-1.10/d_think.h [new file with mode: 0644]
linuxdoom-1.10/d_ticcmd.h [new file with mode: 0644]
linuxdoom-1.10/doomdata.h [new file with mode: 0644]
linuxdoom-1.10/doomdef.c [new file with mode: 0644]
linuxdoom-1.10/doomdef.h [new file with mode: 0644]
linuxdoom-1.10/doomstat.c [new file with mode: 0644]
linuxdoom-1.10/doomstat.h [new file with mode: 0644]
linuxdoom-1.10/doomtype.h [new file with mode: 0644]
linuxdoom-1.10/dstrings.c [new file with mode: 0644]
linuxdoom-1.10/dstrings.h [new file with mode: 0644]
linuxdoom-1.10/f_finale.c [new file with mode: 0644]
linuxdoom-1.10/f_finale.h [new file with mode: 0644]
linuxdoom-1.10/f_wipe.c [new file with mode: 0644]
linuxdoom-1.10/f_wipe.h [new file with mode: 0644]
linuxdoom-1.10/g_game.c [new file with mode: 0644]
linuxdoom-1.10/g_game.h [new file with mode: 0644]
linuxdoom-1.10/hu_lib.c [new file with mode: 0644]
linuxdoom-1.10/hu_lib.h [new file with mode: 0644]
linuxdoom-1.10/hu_stuff.c [new file with mode: 0644]
linuxdoom-1.10/hu_stuff.h [new file with mode: 0644]
linuxdoom-1.10/i_main.c [new file with mode: 0644]
linuxdoom-1.10/i_net.c [new file with mode: 0644]
linuxdoom-1.10/i_net.h [new file with mode: 0644]
linuxdoom-1.10/i_sound.c [new file with mode: 0644]
linuxdoom-1.10/i_sound.h [new file with mode: 0644]
linuxdoom-1.10/i_system.c [new file with mode: 0644]
linuxdoom-1.10/i_system.h [new file with mode: 0644]
linuxdoom-1.10/i_video.c [new file with mode: 0644]
linuxdoom-1.10/i_video.h [new file with mode: 0644]
linuxdoom-1.10/info.c [new file with mode: 0644]
linuxdoom-1.10/info.h [new file with mode: 0644]
linuxdoom-1.10/m_argv.c [new file with mode: 0644]
linuxdoom-1.10/m_argv.h [new file with mode: 0644]
linuxdoom-1.10/m_bbox.c [new file with mode: 0644]
linuxdoom-1.10/m_bbox.h [new file with mode: 0644]
linuxdoom-1.10/m_cheat.c [new file with mode: 0644]
linuxdoom-1.10/m_cheat.h [new file with mode: 0644]
linuxdoom-1.10/m_fixed.c [new file with mode: 0644]
linuxdoom-1.10/m_fixed.h [new file with mode: 0644]
linuxdoom-1.10/m_menu.c [new file with mode: 0644]
linuxdoom-1.10/m_menu.h [new file with mode: 0644]
linuxdoom-1.10/m_misc.c [new file with mode: 0644]
linuxdoom-1.10/m_misc.h [new file with mode: 0644]
linuxdoom-1.10/m_random.c [new file with mode: 0644]
linuxdoom-1.10/m_random.h [new file with mode: 0644]
linuxdoom-1.10/m_swap.c [new file with mode: 0644]
linuxdoom-1.10/m_swap.h [new file with mode: 0644]
linuxdoom-1.10/p_ceilng.c [new file with mode: 0644]
linuxdoom-1.10/p_doors.c [new file with mode: 0644]
linuxdoom-1.10/p_enemy.c [new file with mode: 0644]
linuxdoom-1.10/p_floor.c [new file with mode: 0644]
linuxdoom-1.10/p_inter.c [new file with mode: 0644]
linuxdoom-1.10/p_inter.h [new file with mode: 0644]
linuxdoom-1.10/p_lights.c [new file with mode: 0644]
linuxdoom-1.10/p_local.h [new file with mode: 0644]
linuxdoom-1.10/p_map.c [new file with mode: 0644]
linuxdoom-1.10/p_maputl.c [new file with mode: 0644]
linuxdoom-1.10/p_mobj.c [new file with mode: 0644]
linuxdoom-1.10/p_mobj.h [new file with mode: 0644]
linuxdoom-1.10/p_plats.c [new file with mode: 0644]
linuxdoom-1.10/p_pspr.c [new file with mode: 0644]
linuxdoom-1.10/p_pspr.h [new file with mode: 0644]
linuxdoom-1.10/p_saveg.c [new file with mode: 0644]
linuxdoom-1.10/p_saveg.h [new file with mode: 0644]
linuxdoom-1.10/p_setup.c [new file with mode: 0644]
linuxdoom-1.10/p_setup.h [new file with mode: 0644]
linuxdoom-1.10/p_sight.c [new file with mode: 0644]
linuxdoom-1.10/p_spec.c [new file with mode: 0644]
linuxdoom-1.10/p_spec.h [new file with mode: 0644]
linuxdoom-1.10/p_switch.c [new file with mode: 0644]
linuxdoom-1.10/p_telept.c [new file with mode: 0644]
linuxdoom-1.10/p_tick.c [new file with mode: 0644]
linuxdoom-1.10/p_tick.h [new file with mode: 0644]
linuxdoom-1.10/p_user.c [new file with mode: 0644]
linuxdoom-1.10/r_bsp.c [new file with mode: 0644]
linuxdoom-1.10/r_bsp.h [new file with mode: 0644]
linuxdoom-1.10/r_data.c [new file with mode: 0644]
linuxdoom-1.10/r_data.h [new file with mode: 0644]
linuxdoom-1.10/r_defs.h [new file with mode: 0644]
linuxdoom-1.10/r_draw.c [new file with mode: 0644]
linuxdoom-1.10/r_draw.h [new file with mode: 0644]
linuxdoom-1.10/r_local.h [new file with mode: 0644]
linuxdoom-1.10/r_main.c [new file with mode: 0644]
linuxdoom-1.10/r_main.h [new file with mode: 0644]
linuxdoom-1.10/r_plane.c [new file with mode: 0644]
linuxdoom-1.10/r_plane.h [new file with mode: 0644]
linuxdoom-1.10/r_segs.c [new file with mode: 0644]
linuxdoom-1.10/r_segs.h [new file with mode: 0644]
linuxdoom-1.10/r_sky.c [new file with mode: 0644]
linuxdoom-1.10/r_sky.h [new file with mode: 0644]
linuxdoom-1.10/r_state.h [new file with mode: 0644]
linuxdoom-1.10/r_things.c [new file with mode: 0644]
linuxdoom-1.10/r_things.h [new file with mode: 0644]
linuxdoom-1.10/s_sound.c [new file with mode: 0644]
linuxdoom-1.10/s_sound.h [new file with mode: 0644]
linuxdoom-1.10/sounds.c [new file with mode: 0644]
linuxdoom-1.10/sounds.h [new file with mode: 0644]
linuxdoom-1.10/st_lib.c [new file with mode: 0644]
linuxdoom-1.10/st_lib.h [new file with mode: 0644]
linuxdoom-1.10/st_stuff.c [new file with mode: 0644]
linuxdoom-1.10/st_stuff.h [new file with mode: 0644]
linuxdoom-1.10/tables.c [new file with mode: 0644]
linuxdoom-1.10/tables.h [new file with mode: 0644]
linuxdoom-1.10/v_video.c [new file with mode: 0644]
linuxdoom-1.10/v_video.h [new file with mode: 0644]
linuxdoom-1.10/w_wad.c [new file with mode: 0644]
linuxdoom-1.10/w_wad.h [new file with mode: 0644]
linuxdoom-1.10/wi_stuff.c [new file with mode: 0644]
linuxdoom-1.10/wi_stuff.h [new file with mode: 0644]
linuxdoom-1.10/z_zone.c [new file with mode: 0644]
linuxdoom-1.10/z_zone.h [new file with mode: 0644]
sndserv/Makefile [new file with mode: 0644]
sndserv/README.sndserv [new file with mode: 0644]
sndserv/linux.c [new file with mode: 0644]
sndserv/sounds.c [new file with mode: 0644]
sndserv/sounds.h [new file with mode: 0644]
sndserv/soundsrv.c [new file with mode: 0644]
sndserv/soundsrv.h [new file with mode: 0644]
sndserv/soundst.h [new file with mode: 0644]
sndserv/wadread.c [new file with mode: 0644]
sndserv/wadread.h [new file with mode: 0644]

diff --git a/README.TXT b/README.TXT
new file mode 100644 (file)
index 0000000..c67f7b7
--- /dev/null
@@ -0,0 +1,78 @@
+
+Here it is, at long last.  The DOOM source code is released for your
+non-profit use.  You still need real DOOM data to work with this code.
+If you don't actually own a real copy of one of the DOOMs, you should
+still be able to find them at software stores.
+
+Many thanks to Bernd Kreimeier for taking the time to clean up the
+project and make sure that it actually works.  Projects tends to rot if
+you leave it alone for a few years, and it takes effort for someone to
+deal with it again.
+
+The bad news:  this code only compiles and runs on linux.  We couldn't
+release the dos code because of a copyrighted sound library we used
+(wow, was that a mistake -- I write my own sound code now), and I
+honestly don't even know what happened to the port that microsoft did
+to windows.
+
+Still, the code is quite portable, and it should be straightforward to
+bring it up on just about any platform.
+
+I wrote this code a long, long time ago, and there are plenty of things
+that seem downright silly in retrospect (using polar coordinates for
+clipping comes to mind), but overall it should still be a usefull base
+to experiment and build on.
+
+The basic rendering concept -- horizontal and vertical lines of constant
+Z with fixed light shading per band was dead-on, but the implementation
+could be improved dramatically from the original code if it were
+revisited.  The way the rendering proceded from walls to floors to
+sprites could be collapsed into a single front-to-back walk of the bsp
+tree to collect information, then draw all the contents of a subsector
+on the way back up the tree.  It requires treating floors and ceilings
+as polygons, rather than just the gaps between walls, and it requires
+clipping sprite billboards into subsector fragments, but it would be
+The Right Thing.
+
+The movement and line of sight checking against the lines is one of the
+bigger misses that I look back on.  It is messy code that had some
+failure cases, and there was a vastly simpler (and faster) solution
+sitting in front of my face.  I used the BSP tree for rendering things,
+but I didn't realize at the time that it could also be used for
+environment testing.  Replacing the line of sight test with a bsp line
+clip would be pretty easy.  Sweeping volumes for movement gets a bit
+tougher, and touches on many of the challenges faced in quake / quake2
+with edge bevels on polyhedrons.
+
+Some project ideas:
+
+Port it to your favorite operating system.
+
+Add some rendering features -- transparency, look up / down, slopes,
+etc.
+
+Add some game features -- weapons, jumping, ducking, flying, etc.
+
+Create a packet server based internet game.
+
+Create a client / server based internet game.
+
+Do a 3D accelerated version.  On modern hardware (fast pentium + 3DFX)
+you probably wouldn't even need to be clever -- you could just draw the
+entire level and get reasonable speed.  With a touch of effort, it should
+easily lock at 60 fps (well, there are some issues with DOOM's 35 hz
+timebase...).  The biggest issues would probably be the non-power of two
+texture sizes and the walls composed of multiple textures.
+
+
+I don't have a real good guess at how many people are going to be
+playing with this, but if significant projects are undertaken, it would
+be cool to see a level of community cooperation.  I know that most early
+projects are going to be rough hacks done in isolation, but I would be
+very pleased to see a coordinated 'net release of an improved, backwards
+compatable version of DOOM on multiple platforms next year.
+
+Have fun.
+
+John Carmack
+12-23-97
diff --git a/linuxdoom-1.10/CVS/Entries b/linuxdoom-1.10/CVS/Entries
new file mode 100644 (file)
index 0000000..f1f4112
--- /dev/null
@@ -0,0 +1,109 @@
+/ChangeLog/1.14/Mon Feb  3 22:45:08 1997//
+/DOOMLIC.TXT/1.3/Sun Jan 26 07:44:56 1997//
+/FILES/1.1/Sun Jan 19 17:22:41 1997//
+/FILES2/1.1/Sun Jan 19 17:22:42 1997//
+/Makefile/1.6/Mon Feb  3 22:45:08 1997//
+/am_data.h/1.2/Tue Jan 21 18:59:56 1997//
+/am_map.c/1.4/Mon Feb  3 21:24:33 1997//
+/am_map.h/1.2/Tue Jan 21 18:59:56 1997//
+/d_englsh.h/1.1/Mon Feb  3 21:48:03 1997//
+/d_event.h/1.2/Mon Feb  3 22:01:47 1997//
+/d_french.h/1.3/Mon Feb  3 21:48:03 1997//
+/d_main.c/1.8/Mon Feb  3 22:45:09 1997//
+/d_net.c/1.3/Mon Feb  3 22:01:47 1997//
+/d_textur.h/1.1/Mon Feb  3 16:47:51 1997//
+/doomdata.h/1.5/Mon Feb  3 22:45:09 1997//
+/doomdef.h/1.9/Mon Feb  3 22:45:09 1997//
+/doomtype.h/1.2/Mon Feb  3 22:45:09 1997//
+/dstrings.h/1.4/Mon Feb  3 21:48:03 1997//
+/dutils.c/1.5/Mon Feb  3 17:11:23 1997//
+/dutils.h/1.4/Mon Feb  3 17:11:23 1997//
+/f_finale.c/1.5/Mon Feb  3 21:26:34 1997//
+/f_finale.h/1.1/Mon Feb  3 21:26:34 1997//
+/f_wipe.c/1.2/Mon Feb  3 22:45:09 1997//
+/f_wipe.h/1.1/Mon Feb  3 17:11:23 1997//
+/fpfunc.S/1.1/Sun Jan 19 17:22:43 1997//
+/g_game.c/1.8/Mon Feb  3 22:45:09 1997//
+/g_game.h/1.1/Mon Feb  3 21:34:47 1997//
+/hu_lib.c/1.3/Sun Jan 26 07:44:58 1997//
+/hu_lib.h/1.4/Mon Feb  3 16:47:52 1997//
+/hu_stuff.c/1.4/Mon Feb  3 16:47:52 1997//
+/hu_stuff.h/1.3/Sun Jan 26 07:44:58 1997//
+/i_dga.c/1.3/Sun Jan 26 07:44:58 1997//
+/i_ibm.c/1.3/Sun Jan 26 07:44:58 1997//
+/i_main.c/1.4/Mon Feb  3 22:45:10 1997//
+/i_pcnet.c/1.3/Sun Jan 26 07:44:59 1997//
+/i_sound.c/1.3/Sun Jan 26 07:44:59 1997//
+/i_sound.h/1.3/Sun Jan 26 07:44:59 1997//
+/i_svga.c/1.3/Sun Jan 26 07:44:59 1997//
+/i_unix.c/1.5/Mon Feb  3 22:45:10 1997//
+/i_x.c/1.6/Mon Feb  3 22:45:10 1997//
+/info.c/1.3/Sun Jan 26 07:45:00 1997//
+/info.h/1.3/Sun Jan 26 07:45:00 1997//
+/irix.c/1.3/Sun Jan 26 07:45:00 1997//
+/irix.h/1.3/Sun Jan 26 07:45:01 1997//
+/linux.c/1.3/Sun Jan 26 07:45:01 1997//
+/m_argv.c/1.1/Mon Feb  3 22:45:10 1997//
+/m_argv.h/1.1/Mon Feb  3 22:45:10 1997//
+/m_bbox.c/1.1/Mon Feb  3 22:45:10 1997//
+/m_bbox.h/1.1/Mon Feb  3 22:45:10 1997//
+/m_cheat.c/1.1/Mon Feb  3 21:24:34 1997//
+/m_cheat.h/1.1/Mon Feb  3 21:24:34 1997//
+/m_menu.c/1.7/Mon Feb  3 22:45:10 1997//
+/m_menu.h/1.1/Mon Feb  3 22:01:49 1997//
+/m_misc.c/1.6/Mon Feb  3 22:45:10 1997//
+/m_misc.h/1.1/Mon Feb  3 22:45:11 1997//
+/m_random.c/1.1/Mon Feb  3 22:45:11 1997//
+/m_random.h/1.1/Mon Feb  3 22:45:11 1997//
+/p_ceilng.c/1.4/Mon Feb  3 16:47:53 1997//
+/p_doors.c/1.4/Mon Feb  3 16:47:53 1997//
+/p_enemy.c/1.5/Mon Feb  3 22:45:11 1997//
+/p_floor.c/1.4/Mon Feb  3 16:47:54 1997//
+/p_inter.c/1.4/Mon Feb  3 22:45:11 1997//
+/p_lights.c/1.5/Mon Feb  3 22:45:11 1997//
+/p_local.h/1.3/Tue Jan 28 22:08:27 1997//
+/p_map.c/1.5/Mon Feb  3 22:45:11 1997//
+/p_maputl.c/1.5/Mon Feb  3 22:45:11 1997//
+/p_mobj.c/1.5/Mon Feb  3 22:45:12 1997//
+/p_plats.c/1.5/Mon Feb  3 22:45:12 1997//
+/p_pspr.c/1.5/Mon Feb  3 22:45:12 1997//
+/p_setup.c/1.5/Mon Feb  3 22:45:12 1997//
+/p_sight.c/1.3/Tue Jan 28 22:08:28 1997//
+/p_spec.c/1.6/Mon Feb  3 22:45:12 1997//
+/p_spec.h/1.3/Tue Jan 28 22:08:29 1997//
+/p_switch.c/1.3/Tue Jan 28 22:08:29 1997//
+/p_telept.c/1.3/Tue Jan 28 22:08:29 1997//
+/p_tick.c/1.4/Mon Feb  3 16:47:55 1997//
+/p_user.c/1.3/Tue Jan 28 22:08:29 1997//
+/r_bsp.c/1.4/Mon Feb  3 22:45:12 1997//
+/r_data.c/1.4/Mon Feb  3 16:47:55 1997//
+/r_draw.c/1.4/Mon Feb  3 16:47:55 1997//
+/r_local.h/1.4/Mon Feb  3 21:26:34 1997//
+/r_main.c/1.5/Mon Feb  3 22:45:12 1997//
+/r_plane.c/1.4/Mon Feb  3 16:47:55 1997//
+/r_segs.c/1.3/Wed Jan 29 20:10:19 1997//
+/r_things.c/1.5/Mon Feb  3 16:47:56 1997//
+/s_sound.c/1.6/Mon Feb  3 22:45:12 1997//
+/sounds.c/1.3/Wed Jan 29 22:40:44 1997//
+/sounds.h/1.3/Wed Jan 29 22:40:44 1997//
+/soundsrv.c/1.3/Wed Jan 29 22:40:44 1997//
+/soundsrv.h/1.3/Wed Jan 29 22:40:44 1997//
+/soundst.h/1.3/Wed Jan 29 22:40:45 1997//
+/st_lib.c/1.4/Mon Feb  3 16:47:56 1997//
+/st_lib.h/1.4/Mon Feb  3 16:47:56 1997//
+/st_stuff.c/1.6/Mon Feb  3 22:45:13 1997//
+/st_stuff.h/1.3/Thu Jan 30 19:54:22 1997//
+/sun.c/1.3/Thu Jan 30 19:54:22 1997//
+/tables.c/1.4/Mon Feb  3 16:47:57 1997//
+/tables.h/1.1/Mon Feb  3 16:47:57 1997//
+/tmap.S/1.1/Sun Jan 19 17:22:51 1997//
+/v_video.c/1.5/Mon Feb  3 22:45:13 1997//
+/v_video.h/1.2/Mon Feb  3 17:11:59 1997//
+/w_wad.c/1.5/Mon Feb  3 16:47:57 1997//
+/wadread.c/1.3/Thu Jan 30 19:54:23 1997//
+/wadread.h/1.3/Thu Jan 30 19:54:23 1997//
+/wi_data.h/1.3/Thu Jan 30 19:54:23 1997//
+/wi_stuff.c/1.7/Mon Feb  3 22:45:13 1997//
+/wi_stuff.h/1.4/Mon Feb  3 16:47:58 1997//
+/z_zone.c/1.4/Mon Feb  3 16:47:58 1997//
+/z_zone.h/1.1/Mon Feb  3 16:47:58 1997//
diff --git a/linuxdoom-1.10/CVS/Repository b/linuxdoom-1.10/CVS/Repository
new file mode 100644 (file)
index 0000000..fa03d7f
--- /dev/null
@@ -0,0 +1 @@
+/info/cvsroot/id/id_doom
diff --git a/linuxdoom-1.10/CVS/Root b/linuxdoom-1.10/CVS/Root
new file mode 100644 (file)
index 0000000..41613f0
--- /dev/null
@@ -0,0 +1 @@
+/info/cvsroot/
diff --git a/linuxdoom-1.10/ChangeLog b/linuxdoom-1.10/ChangeLog
new file mode 100644 (file)
index 0000000..717db2e
--- /dev/null
@@ -0,0 +1,922 @@
+
+
+
+       * TODO: see below, and in the "TODO" file. Enjoy!
+
+Mon Dec 22 20:29:16 1997    <bk@gamers.org>
+
+       * CVS logs and other obsolete stuff removed. Anybody
+         who wants to keep some revision control now has a
+         clean slate to start with.
+
+Mon Dec 22 19:53:34 1997    <bk@gamers.org>
+
+       
+       * i_sound.c: enabled SNDSERV, as SNDINTR for
+         some reason just gives ghastly results e.g.
+         on E4M2. Frankly, I am at a loss. SNDSERV is
+         now default, until the internal sound driver
+         is a bit more reliable.
+         Note that the current redundancy means that
+         changes like the one below will have to 
+         be propagated manually to the soundserver
+         sources.
+
+       * m_menu.c: the 4th episode is now removed with
+         the original doom.wad. You need to rename the
+         Ultimate DOOM/Special Edition retail IWAD to
+         doomu.wad now, or you won't see the 4th episode
+         in the menu. The compile time SPECIAL define
+         is thus gone.
+
+Mon Dec 22 17:08:33 1997    <bk@gamers.org>
+
+       * v_video.c (V_DrawPatch): another last minute hack.
+         While shareware, retail, commercial, and plutonia
+         (being a full DOOM2 IWAD) seem to work okay now,
+         TNT gives an error on finishing the first mission:
+          "Patch at -35, -5 exceeds LFB".
+         I changed the error abort into a simple return,
+         thus the patch is ignored. The intermission screen
+         seems to come up okay.
+       * TODO: check which patch, and whether it is an IWAD
+         problem.
+
+       * i_sound.c: the sound table is hardwired in
+         sounds.h/sounds.c. As our current crude
+         sound handling simply loads *all* sounds at
+         startup, we are going to miss some with DOOM1
+         WAD files. I could skip them, but decided to
+         load a placeholder instead (dspistol). It might
+         be good to use a distinct default sound for
+         WAD debug purposes. A zero length sound lump
+         would work, but would not be noticeable.
+         Anyway, shareware and retail work now.
+       * TODO: implement proper handling for missing
+         lumps, sound and otherwise.
+         Perhaps move sound table into WAD?
+
+       * g_game.c (G_DoPlayDemo): finally removed the
+         annoying "Demo is from a different game version"
+         abort. It now simply declines to playback the
+         demo, and waits for user input on some
+         do_nothing screen.
+
+       * doomdef.h&Cie.: Lesson of the day - do not
+         replace a bunch of booleans with an enum and
+         use the same identifiers. Point in case:
+          "if ( commercial )" will not give an error,
+         and will always be true as long as the enum
+         value is greater than zero.
+         I found that the DOOM2 vs. DOOM differences
+         are everywhere (weapons, monsters, doors).
+         Number of episodes varies from shareware/commercial
+         to registered to retail, while commercial has
+         a unique set (two of them, counting the german
+         edition) of maps in one episode. Plus, TNT and
+         Plutonia add some TITLE strings to the mixture.
+         
+         Well, Plutonia and TNT are treated as DOOM2 for
+         now, so you will miss the startup message.
+
+       * wi_stuff.h (NUMEPISODES): removed SPECIAL switch.
+         It is no 4 times 9 for wi_stuff.c internal
+         static arrays - doesn't matter.
+       * TODO: unified handling with DOOM 2 - dynamic
+         allocation of arrays.
+
+       * i_sound.c (I_UpdateSound): okay, I separated
+         the mixing, now done synchonously, along with
+         a flag signalling the timer that the mixing buffer
+         has been updated. The handler is now very short,
+         and I tried several intervals down to 50usecs,
+         w/o complaints. Now the man page says:
+          "system timer resolution currently 10ms". Odd.
+         Anyway, while the double shotgun/plasma rapid
+         fire problem seems to be a bit less disturbing
+         at higher refresh, it's still there. I set the
+         interval to 500usec, which is sufficient for
+         avoiding any buffer update misses.
+         Conclusion after just two days of experimentation:
+         yep, sound driver code isn't fun at all.
+
+         As for the bug - well, Dave Taylor suggested
+         close distance getting into a divide-by-near-zero
+         situation, screwing up the volume. I can't figure
+         why latency of an external sound driver or screen
+         size affect this, but I am running out of ideas.
+       
+       * i_sound.c: 
+         Some more experimentation with the timer driven
+         sound. It doesn't work well using an intervall
+         of less then 30 msecs - there will be artifacts
+         with say 50 msecs. This is pretty obvious with
+         a target frame rate of at least 30fps, methinks.
+         Using the REAL/SIGALRM timer with 30msec gets
+         rid of the artifacts, it seems - at the expense
+         of slowing down things on a P133 to a noticeable
+         jerkiness. Bah.
+
+Mon Dec 22 00:36:54 1997    <bk@gamers.org>
+
+       * info.c: and i_video.c and i_sound.c - don't ask
+         me why some Linux header files are different with
+         gcc vs. g++, or what the complaint about the g++
+         complaint info.c state table is all about:
+         "initializer element for `states[..].action.acp1' 
+          is not constant"
+         Undid some changes, compiled with gcc, playtested,
+         seems okay. Done for today... yesterday.
+
+       * i_net.c (ntohl): okay, htons/htonl, ntohs,ntohl 
+         are back to haunt me. Copied the macros that
+         on my box aren't used for whatever reason directly
+         into the source. Got rid of all other multiple and
+         undefined references. CC=g++ now compiles (still
+         many warnings) and links, but the binary dumps a
+         core after Init PlayLoop. So be it.
+
+Sun Dec 21 12:38:08 1997    <bk@gamers.org>
+
+       * p_enemy.c (P_NewChaseDir): changed tdir to int,
+         removed the LUTs - spurious locks were due to
+         endless loops created by boneheaded predecessor
+         map. Has to be a better way to do enum dirtype_t
+         anyway. Problem seems to be fixed.
+
+       * CC=gcc again, this time loads of #includes to
+         fix "implicit declarations, and one or two
+         unused variables. DOOM now compiles without
+         any -Wall warnings left, as C.
+
+       * Bug: compiled the reworked code with gcc. Within a
+         solid while of testing and blasting away, it
+         locked once. Got a core, which gdb doesn't grok.
+         Bah.
+
+       * TODO: okay, linkage of g++ build modules give loads
+         of errors, because we have many implicits, plus
+         missing #pragma implementation causing multiple
+         definitions. Yet, this is the very first time DOOM
+         was compiled as C++ without a parsing error. So there.
+       
+       * sounds.c: included doomtype.h and removed yet another
+                   enum { false, true } definition.
+
+       * p_saveg.c  (misc): several. 
+       * p_mobj.c   (P_SpawnMobj): (actionf_p1)P_MobjThinker
+       * p_spec.c   (EV_DoDonut): (action_p1) T_MoveFloor (twice).
+       * p_plats.c  (EV_DoPlat): (actionf_p1) T_PlatRaise.
+       * p_plats.c  (EV_StopPlat): (actionf_v)NULL.
+       * p_plats.c  (P_ActivateInStasis): same
+       * p_lights.c (P_SpawnGlowingLight): (actionf_p1) T_Glow.
+       * p_lights.c (P_SpawnStrobeFlash): (actionf_p1) T_StrobeFlash.
+       * p_lights.c (P_SpawnLightFlash): (actionf_p1) T_LightFlash.
+       * p_lights.c (P_SpawnFireFlicker): (actionf_p1) T_FireFlicker.
+       * p_floor.c  (EV_DoFloor): (actionf_p1) T_MoveFloor.
+       * p_floor.c  (EV_BuildStairs): same (twice).
+       * p_doors.c  (EV_VerticalDoor): (actionf_p1)T_VerticalDoor.
+       * p_doors.c  (P_SpawnDoorCloseIn30): same
+       * p_doors.c  (P_SpawnDoorRaiseIn5Mins): same
+       * p_doors.c  (EV_DoDoor): same
+       * p_ceilng.c (EV_CeilingCrushStop): (actionf_v)NULL.
+       * p_ceilng.c (EV_DoCeiling): (actionf_p1)T_MoveCeiling.
+       * p_ceilng.c (P_ActivateInStasisCeiling): same.
+         These gave g++ errors, but  have been ignored by gcc.
+
+       * r_data.c (R_PrecacheLevel): (actionf_p1)P_MobjThinker.
+
+       * p_saveg.c:  conversions (actionf_p1)T_Whatever.
+
+       * p_tick.c: cast (actionf_v)(-1).
+
+       * p_telept.c: yet another (actionf_p1)P_MobjThinker.
+       
+       * p_mobj.c (P_MobjThinker): cast (actionf_v)(-1).
+       * TODO:  decent NOP/NULL/Nil function pointer.
+         I'd introduce a global A_NOP() function that
+         chokes up an error message. 
+         Why -1 instead of NULL?
+
+       * p_enemy.c: conversions (actionf_p1)P_MobjThinker.
+
+       * d_think.h/info.h:  think_t is essentially
+         the same action function pointer stuff.
+         I moved the definitions from info.h to
+         d_think.h, and aliased them with a typedef.
+         Now more changes needed.
+
+       * p_enemy.c (successor, predecessor): new LUT,
+         to provide increments/decrements for enum
+         dirtype_t, as g++ complaints:
+         "no post-increment/decrement operator for type"
+
+       * Makefile (CC): okay, tried "g++" once more.
+         A few errors (above). Plus shitloads of warnings
+         (obviously, better "unused" checking with C++,
+          lots of the usual int2enum suspects, implicit
+          declarations, the works).
+        
+
+       * p_mobj.c: action.acp1 used accordingly.
+       * p_pspr.c: action.acp2 used accordingly.
+       * TODO: info.c:144 warning
+         "missing braces around initializer for `states[0].action'"
+       
+       * info.h/info.c: some experimental stuff on
+         action function pointers.
+         
+       * TODO: still some sound glitches at startup.
+       * i_sound.c: few more cleanups. Made mixing use
+         channel loop instead of unroll, set mixbuffer
+         to zero ot start.
+         Removed some more DOS leftovers (8bit),
+         kept some as comment.
+
+       * hu_stuff.c (HU_Start):
+         More gamemode changes. As in d_main.c, I
+         decided to use DOOM2 as default whenever
+         one needed - it was sold most, and had the
+         superset of items, enemies and monsters.
+
+       * TODO: the handling of WAD specific messages
+         like HU_TITLE, HU_TITLE2, HU_TITLEP etc.
+         should definitely be removed.
+
+       * d_main.c (CheckBetaTest): 
+         Removed outdated, DOS specific BETATEST stuff.
+         d_main.c (IdentifyVersion):
+         Numerous changes to gamemode handling. 
+
+       * TODO: currently, french language is enabled by
+         detecting an doom2f.wad - yet it needs FRENCH
+         define at compile time. I removed most language
+         stuff, and propose handling that at runtime,
+         using a switch in the config file. Well,
+         mission specific texts won't work outside the
+         WAD anyway.
+
+       * TODO: along the same lines: I suggest removing
+         the misc. devparm switches as well - lots of
+         redundancy not needed anymore.
+
+       * Makefile: finally added a doomstat.c for all
+         the global state variables listing internal
+         engine configuration. Right now, these are
+         scattered everywhere. Declaration to be found
+         in doomstat.h header.
+
+       * f_finale.c (F_StartFinale): 
+         Reworked the entire finale handling based on
+         game mode enum.
+
+       * doomstat.h:
+         Global variables for game mode and language.
+         Removed old booleans.
+
+       * doomdef.h: GameMode_t and Language_t enum added.
+          Boolean for language was kinda limiting to 2
+         alternatives (french, english), and five boolean
+         plus #define SPECIAL for game version is just ugly.
+       
+       * wi_stuff.h: SPECIAL switch compiles two
+         different EXE's, one for 3 episodes of 9 maps
+         each (DOOM 1 registered), one for 4 episodes
+         of 9 maps each (DOOM 1 retail/FinalDOOM).
+         Implicitely, the DOOM2 config (one episode,
+         34 missions) is handled. How is the german
+         edition (32 missions only) done?
+         Frankly, this is a mess. The problem is that
+         intermission (animated as in DOOM 1, simple
+         backdrop as in DOOM2) as well as certain
+         items (double shotgun) as well as certain
+         rendering stuff (sky texture) depend on this.
+
+         Plus, it ties into runtime flags as "commercial"
+         as well. Yuck.
+       
+         Each change will change the game. Postponed.
+
+       * d_net.c,m_misc.c: removed last two NeXT remains.
+
+       * d_englsh.h,d_french.h,d_main.c,m_misc.c,r_draw.c,v_video.c:
+         more WATCOM remains removed. Kept some stuff that
+         handeld the blocky mode/detailshift in DOS, which
+         is n.a. in Linux - but probably not worth fixing.
+
+Sat Dec 20 15:16:51 1997    <bk@gamers.org>
+
+       * Bug: core dump when using doom.wad or doom1.wad
+         without a "-file UNUSED/doom2.wad". Version
+         dependend handling of stuff (double shotgun)
+         comes to mind.
+
+       * doomdef.h: 
+         SNDSERV enables external sound server
+         support. SNDINTR enables internal sound
+         output with timer (asynchronous). Default
+         is internal, synchronous.
+
+       * i_sound.c (I_HandleSoundTimer): 
+         Okay, the plasma/double shotgun sound bug
+         (crapyy sund when firing nose-to-wall) is
+         obviously a problem with blocking at
+         refresh - smaller screen size makes it go
+         away.
+         I won't do threads w/o a proper gdb, and
+         I can't do whatever Dave Taylor did with
+         LinuxQuake w/o the sources, thus I broke
+         down and implemented a timer based solution.
+         Seems to work fine, given the fact that
+         this is the first time ever I implemented
+         sound handling.
+
+Fri Dec 19 10:02:48 1997    <bk@gamers.org>
+
+       * m_menu.c/i_sound.c/s_sound.c:
+         Removed a few more inconsistencies due to
+         old internal sound handling (DOS),
+         external (Linux sndserver), and
+         new internal (the unfinished merge of
+         both the former).
+         The Options/Sound/Music volume menu is
+         accessible now. It was due to an internal
+         scaling of the menu (effective range 0-15),
+         up to 0..120, by multiply with 8 scattered
+         all over the place, that we got a
+          v_video.c: I_Error ("Bad V_DrawPatch")
+         Now I am using the menu resolution
+         everywhere, and scaling should only be done
+         in the actual mixing/output.
+       
+       * OK, obviously this hasn't been updated in months.
+         This is because: a) most of the time nothing
+         happened, and b) when something got done, it was
+         too much to keep track of it by CVS and/or ChangeLog.
+
+         Basically, what happened in the meantime is that
+         I did not find a publisher who believed that the book
+         sales would be worth doing it. Within the limited
+         amount of time that I could dedicate to a project
+         that will not generate any revenue whatsoever,
+         I spent some time on cleaning up the Linux code
+         base which works, essentially. I might or might not
+         be able to participate in a Mesa+Voodoo+Glide based
+         GLDOOM port for Linux. I won't waste a minute on
+         Win32 without getting paid for it.
+  
+         Because of the legal issues involved with the
+         DMX sound library id licensed for DOS DOOM, Linuxdoom
+         is the only code base that has sound support at all.
+         Other UNIX ports (SGI, Sun) could probably be revived
+         and integrated w/o too many problems. There is no
+         Win32 port - I never had access to WinDOOM or
+         Jim Dose's GLDOOM sources. There is no Linux
+         OpenGL (read: Mesa) support yet - that'd involve
+         internal changes which will best be done after a
+         public source release.
+
+         John Carmack opted for a release of the Linux code.
+         I have removed all DMX references I could get a
+         hold of, but preserved some of the original
+         sound handling within DOOM that interfaced
+         with DMX. Linuxdoom (like previous UNIX ports)
+         used a separate sound server binary. I did some
+         work on putting the sound server module back into
+         the engine. It works, but shutdown (pending sounds),
+         and sound output parallel to refresh (blocking)
+         is crappy, and there is a problem with double
+         shotgun and plasma at close distance (as well as
+         with lots of other noises going on). As the
+         mixing code is identical to the separate
+         soundserver, and as it doesn't seem to be a
+         blocking issue, I am currently at a loss - I
+         wonder whether the IPC communication with the
+         soundserver process introduced a delay that
+         changed behaviour, or whether I simply overlooked
+         a bug. I am currently lacking the time to track
+         this down, so I am keeping both internal and
+         soundserver source.
+
+         I did remove DOS and Watcom specifics. I did also
+         remove the texture mapping and fixed point assembly.
+         From my experience, it isn't worth the trouble
+         to ue GCC inline assembler, as performance of 
+         the same loop written in C is perfectly sufficient.
+         On demand I will put both assembly modules into some
+         documentation, as they are probably of historic
+         interest.
+
+         There is no Sun DGA, Irix, or other non-Linux stuff
+         in this code base (at least, not intentionally). 
+         They will be back when ports to other UNIX 
+         environments will be merged back (I can't do 
+         testing, and the modules were separate and not
+         consistent, so I refrained from wasting time on
+         this prior to a public release).
+
+         While I made only minor changes to the actual code
+         (some fixes, some cleaning up of SHM and audio),
+         I did a huge amount of shuffling around. I
+         introduced many more header files and modules,
+         some of them laughably small (doing these changes
+         is bound to screw up CVS, so no CVS record anymore
+         for the time being). I would introduce even more
+         separation if I had the time. Splitting the
+         animation/AI/behaviour code that defines 
+         "DOOM - The Game" into a separate game.so (like
+          Quake2 does) should definitely be done. Separating
+         a ref_soft.so aka "DOOM - The Engine", and defining
+         a clean interface prior to introducing a ref_gl.so
+         is recommended as well.
+
+         I am going to purge some more leftovers, remove 
+         the obsolete CVS history except for comments,
+         and try to clean up the last "implicit declaration"
+         and "unused variable" warnings. Except for enabling
+         cheats in nightmare (to have more fun while testing),
+         I did not change the game mechanics at all. I would
+         strongly advise against doing so w/o the proper
+         separations suggested above. I will not waste time
+         on fixing detail and blocky mode, lack of resize,
+         or other stuff that it better addressed by a proper
+         GLDOOM port.
+
+       
+Sat Aug 16 08:07:16 1997    <bk@hal.gamers.org>
+
+       * p_pspr.c:
+         Moved the sprite animation stuff from doomdef.h here.
+
+       * info.h:
+         Added #ifndef __INFO__ for multiple inclusion. I am
+         not going to deal with multigen, or changing the
+         original DOOM monster animation anyway.
+
+       * p_spec.h/c:
+         Moved anim_t etc., locally used only. There is
+         another anim_t in wi_stuff.h/c, now local as well,
+         so collisions on header inclusion should not occur.
+          #include "doomdef.h"
+          #include "doomstat.h"
+         these should now be topmost includes.
+       
+       * doomstat.h, doomdef.h, wi_stuff.h, d_player.h:
+         I moved wbstartstruct_t to d_player.h, and wminfo
+         to doomstat.h. Basically, I will try to move all
+         global state related stuff into doomstat.h, and
+         all data structures defined for state variables
+         into doomdef.h - this will be kinda greek tragedy,
+         and never finished, but a body can try.
+
+       * wi_stuff.h/c, wi_data.h: 
+          Removed wi_data.h, put all local stuff blah... see
+         below.
+          I have found several unused global variables,
+         started outcommenting them with //U, will remove
+         them later. It might be Watcom/PC stuff, or
+         somebody put the actual numbers into the implementation
+         instead of using STARDIST, ANIMPERIOD & Cie.
+       
+       * st_stuff.h/c: from doomdef.h, local stuff moved
+         into st_stuff.c, etc.
+         In the current revisions, I am tolerating warnings
+         of the "implicit declaration" kind - the linker
+         resolves the stuff, and it will be handy in 
+         unmangling the modules once the headers contain
+         only the globally visible stuff.
+
+       * am_map.h/c, am_data.h:
+         Removed am_data.h, put all local stuff into
+         am_map.c, moved globally needed headers from
+         doomdef.h into am_map.h.
+
+       * p_saveg.h, p_setup.h, p_tick.h:
+         created, stuff from doomde.h moved there
+
+       * d_main.c, d_net.c, doomdef.h: 
+         Decided to dump mprintf, as only needed for
+         Watcom support which is not going to happen.
+
+       * doomdef.h: 
+         Moved function prototypes to appropriate headers:
+         d_main.h, d_net.h.
+
+Fri Aug 15 16:38:53 1997    <bk@hal.gamers.org>
+
+       * doomstat.h:
+         added a few more comments, regrouped some of the
+         state variables.
+
+       * doomdata.h: added a few more comments.
+
+Thu Aug 14 10:38:37 1997    <bk@hal.gamers.org>
+
+       * g_game.c (G_DoLoadLevel): 
+         copied the skyflatnum determination here, from
+         the R_InitSkyMap - once should be sufficient.
+
+       * Makefile, r_sky.h/c: 
+         added r_sky module. The sky handling was scattered
+         over r_bsp, r_main, r_plane, doomstat.h...
+
+       * r_bsp.c, r_main.c, r_segs.c:
+         Removed RD_* calls from R_debug.m, NeXT switches.
+
+       * r_local.h:
+         Removed the R_debug.m NeXT specific debugging
+         code headers. Removed "drawbsp" flag from
+         here, and r_main.c, too.
+
+       * r_data.c: 
+         Started to remove NORMALUNIX switches, using
+         LINUX instead. Basically, different UNIX
+         platforms using the same code should simply
+         be ANDed in the #ifdef switches.
+
+       * r_draw.c:
+         Removed some more, but not all WATCOMC support.
+         There is an unresolved problem with the fuzzy
+         blitting in the lowres (blocky) modes - either
+         the "detailshift" flag triggered lowres mode
+         will be removed, or the bug has to be fixed.
+
+       * r_bsp.h, r_draw.h, r_things.h, r_data.h,
+         r_segs.h, r_main.h, r_plane.h: 
+          Created from r_local.h. 
+       
+       * Back to work.
+         Till March 22nd, a lot of source shuffling and addition
+         of new header files, separating stuff, and creating
+         new, smaller modules. Some Watcom/PC/DMX/NeXT etc.
+         related stuff got removed, but not all (yet). None of
+         this ended up in the Log (sorry) or the revision control
+         (CVS is not well suited while number of files and
+         respective names change a lot, especially if stuff gets
+         deleted and/or re-introduced).
+         Major change: part of the sound code got copied from the
+         separate Linux sndserver sources to the linuxdoom source.
+         Re-integration and removal of sndserver pending.
+         Nothing of importance happend since then (priorities).
+
+Mon Feb  3 16:41:05 1997    <bk@gamers.org ()>
+
+        * m_misc.c:
+          Created m_argv, m_random and m_bbox, kept remains in m_misc
+          for the time being. Misc. files changed to include only
+          necessary modules. Moved bbox definitions from doomdata.h. 
+
+        * m_menu.h:
+          Created from doomdef.h. Misc. changes in dependend modules.
+          I am not going to list every affected file from now on.
+          See Log entries within each file. 
+
+        * dstrings.h:
+          Now handles multi-language support and switches.
+          So far, only english (default) and french are available. 
+
+        * d_englsh.h: 
+          Created from dstrings.h. 
+
+        * g_game.h:
+          Created, from doomdef.h. 
+
+        * am_map.c, st_stuff.c, wi_stuff.c: 
+        * Makefile: 
+          Added m_cheat, removed dutils. Doubly linked list stuff unused.
+
+        * m_cheat.h, m_cheat.c:
+          Created, basci cheat string scrambling and check, from dutils.h
+          and dutils.c. 
+
+        * doomdef.h
+          Moved screen declaration to v_video.h.
+
+        * dutils.h, dutils.c
+          Remode code for f_wipe.h and f_wipe.c.
+
+        * Makefile
+        * d_main.c,
+          Added f_wipe files.
+
+        * f_wipe.h, f_wipe.c: 
+          Created, screen wipe/melt at mission begin, from dutils.h
+          and dutils.c.
+
+        * d_textur.h:
+          Created from doomdata.h. Separates all the patch/texture
+          defintions. Needed for v_video module. 
+
+        * r_local.h, wi_stuff.h, st_lib.h, hu_lib.h: 
+        * i_x.c, d_main.c, m_menu.c, m_misc.c: 
+          Added v_video.h.
+
+        * v_video.h:
+          Created. Using headers from doomdef.h. Forward of patch_t.
+          Moved bool and byte to doomtype.h.
+
+Thu Jan 30 20:50:16 1997    <bk@gamers.org ()>
+
+        * doomtype.h:
+          Created, for fixed_t. Should add angle_t here, too.
+
+        * tables.c: 
+          Added SlopeDiv from r_main.c, added all defines and typedefs
+          related to basic trig table use here, removed it.
+          Currently "tables.h" is included in doomdef.h and
+          r_local.h, too. This is not too cleanly separated, but
+          we have to start somewhere, right?
+
+        * tables.h:
+          Created from doomdef.h.
+          Note that tables.c had fixed size tables, while doomdef.h
+          calculated from the value of FINEANGLES. In addition,
+         entries were given as either "int" or "fixed_t". Bad boys.  
+
+        * z_zone.c: 
+        * s_sound.c: 
+        * hu_stuff.c: 
+        * st_lib.c, st_stuff.c: 
+        * wi_stuff.c: 
+        * w_wad.c: 
+        * r_things.c, r_plane.c, r_draw.c, r_data.c: 
+        * p_tick.c, p_mobj.c, p_spec.c, p_setup.c, p_lights.c, 
+          p_plats.c, p_floor.c, p_doors.c, p_ceilng.c: 
+        * am_map.c: 
+        * m_misc.c, m_menu.c: 
+        * g_game.c: 
+        * d_main.c: 
+        * f_finale.c:
+          Added #include "z_zone.h". 
+
+        * z_zone.h: 
+          Created, from stuff in doomdef.h
+
+        * CVS checkin. Reformatting run, last one.
+          Took a week to go through all the sources, w/o even
+          looking to closely.
+
+        * st_stuff.c (ST_Responder): 
+          Removed a first tiny bit of redundancy (NO_CLIP checks).
+         Should remove idspispod completely, later.
+
+Wed Jan 29 19:53:43 1997    <bk@gamers.org ()>
+
+        * Another one, while we are on it. All S (Sound) files.
+
+        * CVS checkin. Reformatting run, all R (Refresh) files.
+
+        * r_draw.c (R_DrawSpanLow): 
+          The non-Watcom, non-asm lowres mode was just a copy
+         of the default mode. As detailshift was used to scale
+         the image down, lowres mode just filled the left half
+         of the buffer.
+        * r_draw.c (R_DrawColumnLow): 
+          Tried the same hack for walls, horribly broken.
+         Postponed. 
+
+Tue Jan 28 19:32:48 1997    <bk@gamers.org ()>
+
+        * CVS checkin. Another reformatting run. Did all P files.
+
+        * p_spec.c: P_FindNextHighestFloor
+          The number of adjoining sectors is limited to 20, because
+         of a temporary LUT needed for determining lowest height
+         in adjacent sectors. No overflow checking is done.
+
+Sun Jan 26 08:41:21 1997    <bk@gamers.org ()>
+
+        * Another CVS checkin of a formatting run.
+          D,F,G,HU,I,M have been changed.
+
+        * Note: in initial and current release,
+           linuxxdoom -3 -file plutonia.wad, idclev 12
+          produces a Segmentation fault.
+
+Wed Jan 22 14:03:00 1997    <bk@gamers.org ()>
+
+        * m_menu.c:
+           initializer-string for array of chars is too long (skullName)
+           warning: unused parameter `int choice' (a couple of times)
+
+        * Attempt to compile as C++. Loads of warnings, a couple of errors.
+          p_enemy.c (P_Move):
+          r_things.c (R_ProjectSprite)
+           `catch', `throw', and `try' are all C++ reserved words,
+           thus changed "try" to "try_ok". Fixed.
+          p_pspr.c: In function `void P_SetPsprite(struct player_s *, ... )':
+           too many arguments to function
+           No convenient fix - state->action is declared void action(),
+           but called w/o, with one, or with two parameters.
+           There are more like this. Going to be a tough one.
+          Union of pointers?
+          Postponed.
+
+       r_plane.c: In function `void R_DrawPlanes()':
+          s_sound.c: In function `int S_AdjustSoundParams(struct mobj_s *, .. )':
+          p_map.c: In function `bool PIT_StompThing(struct mobj_s *)':
+          p_maputl.c: In function `int P_AproxDistance(int, int)':
+          r_main.c: In function `int R_PointToDist(int, int)':
+          p_enemy.c: In function `void P_NewChaseDir(struct mobj_s *)':
+           warning: implicit declaration of function `int abs(...)'  <stdlib.h>
+
+Wed Jan 22 12:15:00 1997    <bk@gamers.org ()>
+
+        * CVS checkin of purification run. Sources now compile
+          without any "-Wall" warnings.
+
+        * Note: with -file "tnt.wad", we get an "Error: Bad V_DrawPatch"
+          abort each time we enter an exit. Invalid or missing
+          intermission screen?
+
+        * Makefile (CFLAGS): added -Wall, first purification run.
+
+          d_main.c: In function `D_DoomMain':
+           warning: implicit declaration of function `mkdir'   <fcntl.h>
+
+          i_unix.c: In function `I_StartSound':
+           warning: control reaches end of non-void function
+          i_unix.c: In function `I_InitNetwork':
+           warning: implicit declaration of function `inet_addr' <arpa/inet.h>
+          i_unix.c: At top level:
+           warning: `endianness' defined but not used
+
+          i_x.c: In function `I_Error':
+           warning: unused variable `string'
+          i_x.c: In function `I_GetEvent':
+           warning: suggest parentheses around arithmetic in operand of |
+          i_x.c: In function `I_FinishUpdate':
+           warning: unused variable `bigscreen'
+          i_x.c: In function `grabsharedmemory':
+           warning: implicit declaration of function `getuid'  <unistd.h>
+           warning: unused variable `done'
+          i_x.c: In function `I_InitGraphics':
+           warning: suggest parentheses around assignment used as truth value
+           warning: char format, different type arg (arg 3)
+           warning: char format, different type arg (arg 5)
+           warning: implicit declaration of function `XShmGetEventBase'
+          i_x.c: In function `InitExpand2':
+           warning: unused variable `jexp'
+           warning: unused variable `iexp'
+
+          m_menu.c: In function `M_ReadSaveStrings':
+           warning: implicit declaration of function `read'    <sys/types.h>
+           warning: implicit declaration of function `close'   <unistd.h>
+
+       m_misc.c: In function `M_WriteFile':
+           warning: implicit declaration of function `write'
+           warning: implicit declaration of function `close'
+          m_misc.c: In function `M_ReadFile':
+           warning: implicit declaration of function `read'
+          m_misc.c: In function `M_ScreenShot':
+           warning: implicit declaration of function `access'  <unistd.h>
+
+       p_pspr.c: In function `P_MovePsprites': 
+        suggest parentheses around assignment used as truth value
+
+          p_spec.c: In function `P_SpawnSpecials':
+           warning: implicit declaration of function `atoi'    <stdlib.h>
+
+       w_wad.c: In function `strupr':
+           warning: implicit declaration of function `toupper' <ctype.h>
+          w_wad.c: In function `W_AddFile':
+           warning: implicit declaration of function `read'    <sys/types.h>
+           warning: implicit declaration of function `lseek'
+           warning: implicit declaration of function `close'   <unistd.h>
+
+          wi_stuff.c: In function `WI_loadData':
+           warning: unused variable `pic'
+          wi_stuff.c: At top level:
+           warning: `background' defined but not used
+
+Tue Jan 21 22:00:00 1997    <bk@gamers.org ()>
+
+        * doomdata.h (__BYTEBOOL__):
+          Use builtin ANSI C++ bool.
+
+        * d_main.c (IdentifyVersion): 
+          Bug fix: insufficient malloc created errors in malloc/realloc
+         calls later on. Welcome to the risks of Copy'n'paste. 
+
+Tue Jan 21 13:20:05 1997    <bk@gamers.org ()>
+
+        * First formatting checkin.
+          A word of explanation: prior to making any changes to the
+         source, a couple of formatting runs will be made, followed
+         by some purification runs.
+         For this run, the Emacs mode selection line has been changed
+         to use C++ style indenting (cc-mode.el).  Each file has
+         been automatically reformatted using Emacs indent-region.
+         A few files have been changed manually already (i.e.,
+         comments, use of tabs).
+         Warning: using "diff" to compare files of different states
+         during the reformatting will not give useful results.
+
+        * hu_stuff.c: 
+          fixed "assignment discard const", the last remaining error
+          message with default compilation.
+                      
+
+Sun Jan 19 14:27:06 1997    <bk@gamers.org ()>
+
+        * Makefile:
+          Minor fix for sndserver target, removed linuxsdoom target
+          for the time being, added CVS header (kind of).
+
+        * Initial CVS checkin. 
+
+        * soundsrv/irix/linux/sun.c: 
+          Changed includes (irix.h removed, soundsrv.h included).
+
+        * i_svga.c: 
+          Changed to DOS 8+3.
+
+        * soundsrv.h/c:
+          Changed to DOS 8+3, included irix.h in soundsrv.h.
+
+        * r_local.h:
+          Same for PI, include math.h with Linux.
+
+        * doomdef.h: 
+          Got rid of multiply defined warnings for Linux, 
+          included values.h.
+
+        * FILES2:
+          created a commented list of all files, removed a few
+          more files (sndserver test, NeXT leftovers, DMX header).
+          Identified the following main modules (see FILES2):
+          AM, HU, M, P, R, S, ST, W, WI. Some stuff is separate
+          (Z, F), some not clearly separable (G, D). System specific
+          interfaces are in I. Some of the latter replace i_main.c
+          (i.e. the void/int main(argc,argv) call), e.g. SVGA,
+          others (X11, SHM, DGA) don't. There is a certain amount
+          of overlap, and the largest module (with possibly most
+          overlap) is P - playing, i.e. all the games state and
+          animation handling.
+          Dithering is currently not used.
+
+Sat Jan 18 15:14:41 1997    <bk@gamers.org ()>
+
+        * r_draw.c: 
+          fixed !defined(USEASM) lines for R_DrawColumn/Span.
+          Removed fpfunc.o/S from Makefile, now compiling
+          X11 w/o any assembler.
+          Got a running linuxxdoom again. We are in business.
+          This source is going to be used for the initial CVS
+          check in.
+
+        * Tried a quick hack compiling it as COFF a.out instead
+          of ELF, with "gcc -b i486-linuxaout". Same linker
+          errors. 
+          Tried removing -DUSE_ASM. Still using fpfunc.S.
+
+
+        * Tried linuxxdoom.
+          Compile run: some warnings (redefinition of MAX/MIN
+           SHORT/INT/LONG) in doomdef.h and (PI redefined)
+           r_local.h.
+          Link run: crashed, undefined references in 
+            d_main.c: undefined reference to  `FixedDiv2'
+            am_map.c:  undefined reference to `FixedMul'
+            r_main.c:  undefined reference to `R_DrawColumn'
+            r_main.c:  undefined reference to `R_DrawSpan'
+            r_plane.c: undefined reference to `FixedMul'
+            
+          This stuff is defined in fpfunc.S (Fixed point) and
+          in r_draw.c (assembler in tmap.S not used).
+          However, "nm," shows that r_draw.o does not include
+          the drawing functions (see below - USE_ASM).
+          Furthermore, the global symbols in fpfunc.S begin
+          with an underscore, "_FixedMul" and "_FixedDiv2".
+          More problems within fpfunc.o: undefined references to 
+
+             `_dc_yl'      `_dc_yh'
+             `_ylookup'
+             `_centery'
+             `_dc_x'
+             `_columnofs'
+             `_dc_iscale'
+             `_dc_texturemid'
+             `_dc_source'
+             `_dc_colormap'
+
+             `_ds_y'       `_ds_x1'      `_ds_x2'
+             `_ds_xfrac'   `_ds_yfrac'
+             `_ds_xstep'   `_ds_ystep'
+             `_ds_colormap'
+             `_ds_source'
+
+          Again, underscore problem.
+          Note: tmap.S currently obsolete, as somebody pasted all
+          the texture mapping assembly into fpfunc.S. Gotta clean
+          that up.
+
+        * Created initial release from CD sources, created ChangeLog.
+          Let the games begin.
+
+
+        **************************************************************
+       DOOM source code ChangeLog file
+       **************************************************************
+
diff --git a/linuxdoom-1.10/DOOMLIC.TXT b/linuxdoom-1.10/DOOMLIC.TXT
new file mode 100644 (file)
index 0000000..2b2252e
--- /dev/null
@@ -0,0 +1,112 @@
+
+
+      LIMITED USE SOFTWARE LICENSE AGREEMENT
+
+        This Limited Use Software License Agreement (the "Agreement")
+is a legal agreement between you, the end-user, and Id Software, Inc.
+("ID").  By downloading or purchasing the software material, which
+includes source code (the "Source Code"), artwork data, music and
+software tools (collectively, the "Software"), you are agreeing to
+be bound by the terms of this Agreement.  If you do not agree to the
+terms of this Agreement, promptly destroy the Software you may have
+downloaded or copied.
+
+ID SOFTWARE LICENSE
+
+1.      Grant of License.  ID grants to you the right to use the
+Software.  You have no ownership or proprietary rights in or to the 
+Software, or the Trademark. For purposes of this section, "use" means 
+loading the Software into RAM, as well as installation on a hard disk
+or other storage device. The Software, together with any archive copy
+thereof, shall be destroyed when no longer used in accordance with 
+this Agreement, or when the right to use the Software is terminated.  
+You agree that the Software will not be shipped, transferred or 
+exported into any country in violation of the U.S. Export 
+Administration Act (or any other law governing such matters) and that 
+you will not utilize, in any other manner, the Software in violation 
+of any applicable law.
+
+2.      Permitted Uses.  For educational purposes only, you, the
+end-user, may use portions of the Source Code, such as particular
+routines, to develop your own software, but may not duplicate the
+Source Code, except as noted in paragraph 4.  The limited right
+referenced in the preceding sentence is hereinafter referred to as
+"Educational Use."  By so exercising the Educational Use right you
+shall not obtain any ownership, copyright, proprietary or other
+interest in or to the Source Code, or any portion of the Source
+Code.  You may dispose of your own software in your sole discretion.
+With the exception of the Educational Use right, you may not
+otherwise use the Software, or an portion of the Software, which
+includes the Source Code, for commercial gain.
+
+3.      Prohibited Uses:  Under no circumstances shall you, the
+end-user, be permitted, allowed or authorized to commercially exploit
+the Software. Neither you nor anyone at your direction shall do any
+of the following acts with regard to the Software, or any portion
+thereof:
+
+        Rent;
+
+        Sell;
+
+        Lease;
+
+        Offer on a pay-per-play basis;
+
+        Distribute for money or any other consideration; or
+
+        In any other manner and through any medium whatsoever
+commercially exploit or use for any commercial purpose.
+
+Notwithstanding the foregoing prohibitions, you may commercially
+exploit the software you develop by exercising the Educational Use 
+right, referenced in paragraph 2. hereinabove.
+
+4.      Copyright.  The Software and all copyrights related thereto 
+(including all characters and other images generated by the Software
+or depicted in the Software) are owned by ID and is protected by
+United States  copyright laws and international treaty provisions.  
+Id shall retain exclusive ownership and copyright in and to the
+Software and all portions of the Software and you shall have no 
+ownership or other proprietary interest in such materials. You must
+treat the Software like any other copyrighted material. You may not
+otherwise reproduce, copy or disclose to others, in whole or in any
+part, the Software.  You may not copy the written materials
+accompanying the Software.  You agree to use your best efforts to
+see that any user of the Software licensed hereunder complies with
+this Agreement.
+
+5.      NO WARRANTIES.  ID DISCLAIMS ALL WARRANTIES, BOTH EXPRESS
+IMPLIED, INCLUDING BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE WITH RESPECT
+TO THE SOFTWARE.  THIS LIMITED WARRANTY GIVES YOU SPECIFIC LEGAL
+RIGHTS.  YOU MAY HAVE OTHER RIGHTS WHICH VARY FROM JURISDICTION TO
+JURISDICTION.  ID DOES NOT WARRANT THAT THE OPERATION OF THE SOFTWARE
+WILL BE UNINTERRUPTED, ERROR FREE OR MEET YOUR SPECIFIC REQUIREMENTS.
+THE WARRANTY SET FORTH ABOVE IS IN LIEU OF ALL OTHER EXPRESS
+WARRANTIES WHETHER ORAL OR WRITTEN.  THE AGENTS, EMPLOYEES, 
+DISTRIBUTORS, AND DEALERS OF ID ARE NOT AUTHORIZED TO MAKE 
+MODIFICATIONS TO THIS WARRANTY, OR ADDITIONAL WARRANTIES ON BEHALF
+OF ID. 
+
+        Exclusive Remedies.  The Software is being offered to you
+free of any charge.  You agree that you have no remedy against ID, its
+affiliates, contractors, suppliers, and agents for loss or damage 
+caused by any defect or failure in the Software regardless of the form
+of action, whether in contract, tort, includinegligence, strict
+liability or otherwise, with regard to the Software.  This Agreement
+shall be construed in accordance with and governed by the laws of the
+State of Texas.  Copyright and other proprietary matters will be
+governed by United States laws and international treaties.  IN ANY 
+CASE, ID SHALL NOT BE LIABLE FOR LOSS OF DATA, LOSS OF PROFITS, LOST
+SAVINGS, SPECIAL, INCIDENTAL, CONSEQUENTIAL, INDIRECT OR OTHER
+SIMILAR DAMAGES ARISING FROM BREACH OF WARRANTY, BREACH OF CONTRACT,
+NEGLIGENCE, OR OTHER LEGAL THEORY EVEN IF ID OR ITS AGENT HAS BEEN
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR ANY CLAIM BY ANY
+OTHER PARTY. Some jurisdictions do not allow the exclusion or
+limitation of incidental or consequential damages, so the above
+limitation or exclusion may not apply to you.
+
+
+
+
diff --git a/linuxdoom-1.10/FILES b/linuxdoom-1.10/FILES
new file mode 100644 (file)
index 0000000..33af95d
--- /dev/null
@@ -0,0 +1,98 @@
+total 1258
+-rw-r--r--   1 b1       prog            0 Jan 18 15:08 FILES
+-rw-r--r--   1 b1       prog         5799 Jan 18 15:07 Makefile
+-rw-r--r--   1 b1       prog         1943 Jan 18 15:07 am_data.h
+-rw-r--r--   1 b1       prog        20263 Jan 18 15:07 am_map.c
+-rw-r--r--   1 b1       prog         2494 Jan 18 15:07 am_map.h
+-rw-r--r--   1 b1       prog         1499 Jan 18 15:07 am_oids.c
+-rw-r--r--   1 b1       prog          338 Jan 18 15:07 am_oids.h
+-rw-r--r--   1 b1       prog        14005 Jan 18 15:07 d_french.h
+-rw-r--r--   1 b1       prog        25287 Jan 18 15:07 d_main.c
+-rw-r--r--   1 b1       prog        15586 Jan 18 15:07 d_net.c
+-rw-r--r--   1 b1       prog          744 Jan 18 15:07 defs.inc
+-rw-r--r--   1 b1       prog         3569 Jan 18 15:07 dither.c
+-rw-r--r--   1 b1       prog          355 Jan 18 15:07 dither.h
+-rw-r--r--   1 b1       prog         4234 Jan 18 15:07 doomdata.h
+-rw-r--r--   1 b1       prog        32779 Jan 18 15:07 doomdef.h
+-rw-r--r--   1 b1       prog          192 Jan 18 15:07 drcoord.h
+-rw-r--r--   1 b1       prog        22377 Jan 18 15:07 dstrings.h
+-rw-r--r--   1 b1       prog         6582 Jan 18 15:07 dutils.c
+-rw-r--r--   1 b1       prog         1821 Jan 18 15:07 dutils.h
+-rw-r--r--   1 b1       prog        14072 Jan 18 15:07 f_finale.c
+-rw-r--r--   1 b1       prog         7357 Jan 18 15:07 fpfunc.S
+-rw-r--r--   1 b1       prog        34770 Jan 18 15:07 g_game.c
+-rw-r--r--   1 b1       prog         5394 Jan 18 15:07 hu_lib.c
+-rw-r--r--   1 b1       prog         2878 Jan 18 15:07 hu_lib.h
+-rw-r--r--   1 b1       prog        12040 Jan 18 15:07 hu_stuff.c
+-rw-r--r--   1 b1       prog          934 Jan 18 15:07 hu_stuff.h
+-rw-r--r--   1 b1       prog         6238 Jan 18 15:07 i_cyber.c
+-rw-r--r--   1 b1       prog        18324 Jan 18 15:07 i_dga.c
+-rw-r--r--   1 b1       prog         2499 Jan 18 15:07 i_header.h
+-rw-r--r--   1 b1       prog        32815 Jan 18 15:07 i_ibm.c
+-rw-r--r--   1 b1       prog         1867 Jan 18 15:07 i_ibm_a.asm
+-rw-r--r--   1 b1       prog          121 Jan 18 15:07 i_main.c
+-rw-r--r--   1 b1       prog         8251 Jan 18 15:07 i_pcnet.c
+-rw-r--r--   1 b1       prog         8561 Jan 18 15:07 i_sound.c
+-rw-r--r--   1 b1       prog          439 Jan 18 15:07 i_sound.h
+-rw-r--r--   1 b1       prog         9537 Jan 18 15:07 i_svgalib.c
+-rw-r--r--   1 b1       prog        10886 Jan 18 15:07 i_unix.c
+-rw-r--r--   1 b1       prog        20891 Jan 18 15:07 i_x.c
+-rw-r--r--   1 b1       prog       128797 Jan 18 15:07 info.c
+-rw-r--r--   1 b1       prog        15840 Jan 18 15:07 info.h
+-rw-r--r--   1 b1       prog         3477 Jan 18 15:07 irix.c
+-rw-r--r--   1 b1       prog          240 Jan 18 15:07 irix.h
+-rw-r--r--   1 b1       prog         1363 Jan 18 15:07 linux.c
+-rw-r--r--   1 b1       prog        34628 Jan 18 15:07 m_menu.c
+-rw-r--r--   1 b1       prog        13741 Jan 18 15:07 m_misc.c
+-rw-r--r--   1 b1       prog         6117 Jan 18 15:07 p_ceilng.c
+-rw-r--r--   1 b1       prog        15062 Jan 18 15:07 p_doors.c
+-rw-r--r--   1 b1       prog        33758 Jan 18 15:07 p_enemy.c
+-rw-r--r--   1 b1       prog        11409 Jan 18 15:07 p_floor.c
+-rw-r--r--   1 b1       prog        16265 Jan 18 15:07 p_inter.c
+-rw-r--r--   1 b1       prog         7592 Jan 18 15:07 p_lights.c
+-rw-r--r--   1 b1       prog         6447 Jan 18 15:07 p_local.h
+-rw-r--r--   1 b1       prog        30138 Jan 18 15:07 p_map.c
+-rw-r--r--   1 b1       prog        14672 Jan 18 15:07 p_maputl.c
+-rw-r--r--   1 b1       prog        17276 Jan 18 15:07 p_mobj.c
+-rw-r--r--   1 b1       prog         5940 Jan 18 15:07 p_plats.c
+-rw-r--r--   1 b1       prog        17084 Jan 18 15:07 p_pspr.c
+-rw-r--r--   1 b1       prog        12828 Jan 18 15:07 p_setup.c
+-rw-r--r--   1 b1       prog         5962 Jan 18 15:07 p_sight.c
+-rw-r--r--   1 b1       prog        23846 Jan 18 15:07 p_spec.c
+-rw-r--r--   1 b1       prog        11140 Jan 18 15:07 p_spec.h
+-rw-r--r--   1 b1       prog        14229 Jan 18 15:07 p_switch.c
+-rw-r--r--   1 b1       prog         1910 Jan 18 15:07 p_telept.c
+-rw-r--r--   1 b1       prog        14075 Jan 18 15:07 p_tick.c
+-rw-r--r--   1 b1       prog         7044 Jan 18 15:07 p_user.c
+-rw-r--r--   1 b1       prog        13013 Jan 18 15:07 planar.asm
+-rw-r--r--   1 b1       prog         9811 Jan 18 15:07 r_bsp.c
+-rw-r--r--   1 b1       prog        14619 Jan 18 15:07 r_data.c
+-rw-r--r--   1 b1       prog        13591 Jan 18 15:07 r_draw.c
+-rw-r--r--   1 b1       prog        11378 Jan 18 15:07 r_local.h
+-rw-r--r--   1 b1       prog        14868 Jan 18 15:07 r_main.c
+-rw-r--r--   1 b1       prog         7108 Jan 18 15:07 r_plane.c
+-rw-r--r--   1 b1       prog        15420 Jan 18 15:07 r_segs.c
+-rw-r--r--   1 b1       prog        18969 Jan 18 15:07 r_things.c
+-rw-r--r--   1 b1       prog        12274 Jan 18 15:07 s_sound.c
+-rw-r--r--   1 b1       prog        12812 Jan 18 15:07 sndserver.c
+-rw-r--r--   1 b1       prog          141 Jan 18 15:07 sndserver.h
+-rw-r--r--   1 b1       prog         5811 Jan 18 15:07 sounds.c
+-rw-r--r--   1 b1       prog         2674 Jan 18 15:07 sounds.h
+-rw-r--r--   1 b1       prog         3975 Jan 18 15:07 soundst.h
+-rw-r--r--   1 b1       prog         3461 Jan 18 15:07 st_lib.c
+-rw-r--r--   1 b1       prog         2254 Jan 18 15:07 st_lib.h
+-rw-r--r--   1 b1       prog        22769 Jan 18 15:07 st_stuff.c
+-rw-r--r--   1 b1       prog         4685 Jan 18 15:07 st_stuff.h
+-rw-r--r--   1 b1       prog         1725 Jan 18 15:07 sun.c
+-rw-r--r--   1 b1       prog           75 Jan 18 15:07 t.c
+-rw-r--r--   1 b1       prog       114621 Jan 18 15:07 tables.c
+-rw-r--r--   1 b1       prog         5485 Jan 18 15:07 tmap.S
+-rw-r--r--   1 b1       prog        10904 Jan 18 15:07 v_video.c
+-rw-r--r--   1 b1       prog          268 Jan 18 15:07 vgaview.h
+-rw-r--r--   1 b1       prog         9920 Jan 18 15:07 w_wad.c
+-rw-r--r--   1 b1       prog         3629 Jan 18 15:07 wadread.c
+-rw-r--r--   1 b1       prog          551 Jan 18 15:07 wadread.h
+-rw-r--r--   1 b1       prog         3583 Jan 18 15:07 wi_data.h
+-rw-r--r--   1 b1       prog        25608 Jan 18 15:07 wi_stuff.c
+-rw-r--r--   1 b1       prog         1544 Jan 18 15:07 wi_stuff.h
+-rw-r--r--   1 b1       prog         8501 Jan 18 15:07 z_zone.c
diff --git a/linuxdoom-1.10/FILES2 b/linuxdoom-1.10/FILES2
new file mode 100644 (file)
index 0000000..066a4ef
--- /dev/null
@@ -0,0 +1,221 @@
+ChangeLog
+FILES
+FILES2
+Makefile
+
+-----------------------------------------------------------------------
+Global and misc. stuff
+-----------------------------------------------------------------------
+doomdata.h   -  external data definitions (WAD file structure)
+doomdef.h    -  internal data definitions (game structs)
+dstrings.h   -  printed strings for translation, english 
+d_french.h   -  printed strings for translation
+
+info.h
+info.c      -  LUT's for Thing TAB, Frame TAB,
+                generated by multigen utility
+dutils.h
+dutils.c     - Dave's utilities
+                 including doubly-linked lists & simple state machines.
+                 Used in WI, ST, AM, and d_main.c
+
+------------------------------------------------------------------------
+DOOM game loop and top level stuff
+------------------------------------------------------------------------
+g_game.c    -  Game loop functions, event handling etc.
+
+                boolean  G_CheckDemoStatus (void); 
+                void     G_ReadDemoTiccmd (ticcmd_t *cmd); 
+                void     G_WriteDemoTiccmd (ticcmd_t *cmd); 
+                void     G_PlayerReborn (int player); 
+                void     G_InitNew (skill_t skill, int episode, int map); 
+                void     G_DoReborn (int playernum); 
+                void     G_DoLoadLevel (void); 
+                void     G_DoNewGame (void); 
+                void     G_DoLoadGame (void); 
+                void     G_DoPlayDemo (void); 
+                void     G_DoCompleted (void); 
+                void     G_DoVictory (void); 
+                void     G_DoWorldDone (void); 
+                void     G_DoSaveGame (void); 
+
+d_main.c    -  event handling, D_DoomMain() and other functions
+                 NOT int main()
+
+d_net.c     -  high level networking protocol code
+
+------------------------------------------------------------------
+I         Interfaces, system specifics
+------------------------------------------------------------------    
+i_main.c    -  main(), calls D_DoomMain().
+i_svgalib.c -  Linux SVGAlib code, including main(),
+                 replaces i_main.c
+
+i_x.c       -  X11 with SHM code, use with i_main.c
+i_dga.c     -  X11 DGA code, use with i_main.c
+i_unix.c    -  fixed point, networking, and display stuff for UNIX
+
+i_ibm.c     -  IBM DOS VGA graphics and key/mouse/joystick,
+                 use with i_main.c
+i_pcnet.c   -  IPX networking, DOS 
+
+fpfunc.S     - fixed point assembly and (currently) duplicate of
+tmap.S       - texture mapping assembly (currently unused)
+
+------------------------------------------------------------------
+AM        AutoMap
+------------------------------------------------------------------
+am_data.h    -  vector graphics for the automap
+
+am_map.h
+am_map.c     -  automap code
+
+------------------------------------------------------------------
+HU         Heads Up
+------------------------------------------------------------------
+hu_lib.h
+hu_lib.c    -  heads-up text and input code
+
+hu_stuff.h
+hu_stuff.c  -  Heads-up displays
+
+
+-------------------------------------------------------------------
+M          Menu
+-------------------------------------------------------------------
+m_menu.c    -  DOOM options code and leaving messages
+
+m_misc.c    -  misc. HUD text display, input checks, and
+                random table, file I/O
+
+
+-------------------------------------------------------------------
+P          Play???
+-------------------------------------------------------------------
+p_local.h   -  header for all play modules
+
+p_spec.h    -  specials, lighting, doors, plats, texture animation
+p_spec.c    -  specials, texture animation
+
+p_doors.c   -  door code
+p_plats.c   -  platform raising/lowering code
+p_ceilng.c  -  active (e.g. crushing) ceilings
+p_floor.c   -  active (e.g. raising) floors
+p_lights.c  -  dynamic (e.g. flickering) lighting
+p_switch.c  -  button switches and animation
+
+p_enemy.c   -  enemy AI and animation
+p_inter.c   -  object/object interaction?
+p_map.c     -  movement objects, handling of collisions
+p_maputl.c  -  distance, position etc. utilities for movement
+p_mobj.c    -  mobile objects handling, spawn etc.
+p_user.c    -  more movement, bobbing etc.
+
+p_telept.c  -  teleportation code
+
+p_sight.c   -  LOS checks, REJECT
+
+
+p_pspr.c    -  weapon overlays, bobbing, raising, sprite tables,
+               firing, ammo bookkeeping
+
+p_setup.c   -  load map from WAF file, setup code
+
+
+p_tick.c    -  savegame function (archive/unarchive),
+                thinker list handling, allocation,
+                game tick execution (updates)
+
+
+-------------------------------------------------------------------
+R          Rendering    
+-------------------------------------------------------------------
+r_local.h   - header for all rendering modules,
+                internal map data structure definitions
+
+r_bsp.c     - BSP seg's clipping
+
+r_data.c    - texture column caching, patch assembly, 
+                 flats, colormaps, sprites,
+                 lookup by name
+
+r_draw.c    - access to framebuffer API, drawing C functions
+
+
+r_main.c    - geometry functions, trigonometry lookups, 
+                 R_RenderPlayerView
+
+r_plane.c   - floor/ceiling visplanes, sky
+
+r_segs.c    - drawing segs, marking hslices for floors/ceilings
+
+r_things.c  - sprite and sprite frame/rotation handling, drawing
+
+
+tables.c    - trigonometry lookup tables, static
+
+v_video.c   - gamma correction lookup, patch drawing to rectangle
+
+-------------------------------------------------------------------
+S          Sound
+-------------------------------------------------------------------
+s_sound.c   - more sound and music handling
+
+soundst.h   - sound and music data structures
+sounds.h
+sounds.c    - sound and music lump LUT's (manually maintained)
+
+sndserver.h
+sndserver.c -  (Irix) sndserver code
+
+irix.h
+irix.c      -  SGI Irix sound/sndserver support code
+
+linux.c     -  Linux voxware sound/sndserver support code,
+                 replaces irix.c, uses irix.h
+sun.c       -  SUN replacement for irix.c
+
+
+i_sound.h
+i_sound.c   -  DOS DMX music and sound interface 
+
+-------------------------------------------------------------------
+ST         STatus bar
+-------------------------------------------------------------------
+st_lib.h
+st_lib.c    -  status bar widget code
+
+st_stuff.c
+st_stuff.h  -  status bar code
+
+
+-------------------------------------------------------------------
+W          Wad file I/O
+-------------------------------------------------------------------
+w_wad.c     -  lump based functions
+wadread.h
+wadread.c   -  lump I/O, get SFX
+
+-------------------------------------------------------------------
+WI         WIn / level end screens
+-------------------------------------------------------------------
+wi_data.h   -  lookups for intermission screens, patch positions
+
+wi_stuff.h  
+wi_stuff.c  -  intermission animation patchwork
+
+-------------------------------------------------------------------
+Z          Zone memory allocation
+-------------------------------------------------------------------
+z_zone.c
+
+-------------------------------------------------------------------
+F          Final screen animation
+-------------------------------------------------------------------
+f_finale.c   - DOOM mission end screens? (bunny)
+
+
+
+-------------------------------------------------------------------
diff --git a/linuxdoom-1.10/Makefile b/linuxdoom-1.10/Makefile
new file mode 100644 (file)
index 0000000..8c69794
--- /dev/null
@@ -0,0 +1,95 @@
+################################################################
+#
+# $Id:$
+#
+# $Log:$
+#
+CC=  gcc  # gcc or g++
+
+CFLAGS=-g -Wall -DNORMALUNIX -DLINUX # -DUSEASM 
+LDFLAGS=-L/usr/X11R6/lib
+LIBS=-lXext -lX11 -lnsl -lm
+
+# subdirectory for objects
+O=linux
+
+# not too sophisticated dependency
+OBJS=                          \
+               $(O)/doomdef.o          \
+               $(O)/doomstat.o         \
+               $(O)/dstrings.o         \
+               $(O)/i_system.o         \
+               $(O)/i_sound.o          \
+               $(O)/i_video.o          \
+               $(O)/i_net.o                    \
+               $(O)/tables.o                   \
+               $(O)/f_finale.o         \
+               $(O)/f_wipe.o           \
+               $(O)/d_main.o                   \
+               $(O)/d_net.o                    \
+               $(O)/d_items.o          \
+               $(O)/g_game.o                   \
+               $(O)/m_menu.o                   \
+               $(O)/m_misc.o                   \
+               $(O)/m_argv.o           \
+               $(O)/m_bbox.o                   \
+               $(O)/m_fixed.o          \
+               $(O)/m_swap.o                   \
+               $(O)/m_cheat.o          \
+               $(O)/m_random.o         \
+               $(O)/am_map.o                   \
+               $(O)/p_ceilng.o         \
+               $(O)/p_doors.o          \
+               $(O)/p_enemy.o          \
+               $(O)/p_floor.o          \
+               $(O)/p_inter.o          \
+               $(O)/p_lights.o         \
+               $(O)/p_map.o                    \
+               $(O)/p_maputl.o         \
+               $(O)/p_plats.o          \
+               $(O)/p_pspr.o                   \
+               $(O)/p_setup.o          \
+               $(O)/p_sight.o          \
+               $(O)/p_spec.o                   \
+               $(O)/p_switch.o         \
+               $(O)/p_mobj.o                   \
+               $(O)/p_telept.o         \
+               $(O)/p_tick.o                   \
+               $(O)/p_saveg.o          \
+               $(O)/p_user.o                   \
+               $(O)/r_bsp.o                    \
+               $(O)/r_data.o                   \
+               $(O)/r_draw.o                   \
+               $(O)/r_main.o                   \
+               $(O)/r_plane.o          \
+               $(O)/r_segs.o                   \
+               $(O)/r_sky.o                    \
+               $(O)/r_things.o         \
+               $(O)/w_wad.o                    \
+               $(O)/wi_stuff.o         \
+               $(O)/v_video.o          \
+               $(O)/st_lib.o                   \
+               $(O)/st_stuff.o         \
+               $(O)/hu_stuff.o         \
+               $(O)/hu_lib.o                   \
+               $(O)/s_sound.o          \
+               $(O)/z_zone.o                   \
+               $(O)/info.o                             \
+               $(O)/sounds.o
+
+all:    $(O)/linuxxdoom
+
+clean:
+       rm -f *.o *~ *.flc
+       rm -f linux/*
+
+$(O)/linuxxdoom:       $(OBJS) $(O)/i_main.o
+       $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) $(O)/i_main.o \
+       -o $(O)/linuxxdoom $(LIBS)
+
+$(O)/%.o:      %.c
+       $(CC) $(CFLAGS) -c $< -o $@
+
+#############################################################
+#
+#############################################################
\ No newline at end of file
diff --git a/linuxdoom-1.10/README.asm b/linuxdoom-1.10/README.asm
new file mode 100644 (file)
index 0000000..8962976
--- /dev/null
@@ -0,0 +1,283 @@
+
+README - DOOM assembly code
+
+Okay, I add the DOS assembly module for the historically
+inclined here (may rec.games.programmer suffer). If anyone
+feels the urge to port these to GNU GCC; either inline or
+as separate modules including Makefile support, be my guest.
+
+Module tmap.S includes the inner loops for texture mapping,
+the interesting one being the floor/ceiling span rendering.
+
+There was another module in the source dump, fpfunc.S, that
+had both texture mapping and fixed point functions. It
+contained implementations both for i386 and M68k. For
+brevity, I include only the i386 fixed point stuff below.
+
+//====================================================
+// tmap.S  as of January 10th, 1997
+
+//================
+//
+// R_DrawColumn
+//
+//================
+
+       .data
+loopcount      .long   0
+pixelcount     .long   0
+
+       .text
+
+       .align 16
+.globl _R_DrawColumn
+_R_DrawColumn:
+
+       pushad
+
+       movl            ebp,[_dc_yl]
+       movl            ebx,ebp
+       movl     edi,[_ylookup+ebx*4]
+       movl            ebx,[_dc_x]
+       addl     edi,[_columnofs + ebx*4]
+
+       movl            eax,[_dc_yh]
+       incl            eax
+       subl     eax,ebp                        // pixel count
+       movl            [pixelcount],eax                        // save for final pixel
+       js              done                                            // nothing to scale
+       shrl            eax,1                                           // double pixel count
+       movl            [loopcount],eax
+       
+       movl     ecx,[_dc_iscale]
+
+       movl            eax,[_centery]
+       subl            eax,ebp
+       imull   ecx
+       movl            ebp,[_dc_texturemid]
+       subl            ebp,eax
+       shll            ebp,9                                                   // 7 significant bits, 25 frac
+
+       movl     esi,[_dc_source]
+       
+
+       movl            ebx,[_dc_iscale]
+       shll            ebx,9
+       movl            eax,OFFSET patch1+2             // convice tasm to modify code...
+       movl            [eax],ebx
+       movl            eax,OFFSET patch2+2             // convice tasm to modify code...
+       movl            [eax],ebx
+       
+// eax         aligned colormap
+// ebx         aligned colormap
+// ecx,edx     scratch
+// esi         virtual source
+// edi         moving destination pointer
+// ebp         frac
+       
+       movl    ecx,ebp                                 // begin calculating first pixel
+       addl    ebp,ebx                                 // advance frac pointer
+       shrl ecx,25                                     // finish calculation for first pixel
+       movl    edx,ebp                                 // begin calculating second pixel
+       addl    ebp,ebx                                 // advance frac pointer
+       shrl edx,25                                     // finish calculation for second pixel
+       movl eax,[_dc_colormap]
+       movl ebx,eax
+       movb    al,[esi+ecx]                    // get first pixel
+       movb    bl,[esi+edx]                    // get second pixel
+       movb    al,[eax]                                // color translate first pixel
+       movb    bl,[ebx]                                // color translate second pixel
+       
+       testl   [pixelcount],0fffffffeh
+       jnz     doubleloop                              // at least two pixels to map
+       jmp     checklast
+       
+       .align  16
+doubleloop:
+       movl    ecx,ebp                                 // begin calculating third pixel
+patch1:
+       addl    ebp,12345678h                   // advance frac pointer
+       movb    [edi],al                                // write first pixel
+       shrl ecx,25                                     // finish calculation for third pixel
+       movl    edx,ebp                                 // begin calculating fourth pixel
+patch2:
+       addl    ebp,12345678h                   // advance frac pointer
+       movl    [edi+SCREENWIDTH],bl    // write second pixel
+       shrl edx,25                                     // finish calculation for fourth pixel
+       movb    al,[esi+ecx]                    // get third pixel
+       addl    edi,SCREENWIDTH*2               // advance to third pixel destination
+       movb    bl,[esi+edx]                    // get fourth pixel
+       decl    [loopcount]                             // done with loop?
+       movb    al,[eax]                                // color translate third pixel
+       movb    bl,[ebx]                                // color translate fourth pixel
+       jnz     doubleloop
+       
+// check for final pixel
+checklast:
+       testl   [pixelcount],1
+       jz      done
+       movb    [edi],al                                // write final pixel
+       
+done:
+       popad
+       ret
+       
+
+
+//================
+//
+// R_DrawSpan
+//
+// Horizontal texture mapping
+//
+//================
+
+
+       .align  16
+.globl _R_DrawSpan
+_R_DrawSpan:
+       pushad
+
+//
+// find loop count
+//     
+       movl            eax,[_ds_x2]
+       incl            eax
+       subl     eax,[_ds_x1]                   // pixel count
+       movl            [pixelcount],eax                        // save for final pixel
+       js              hdone                                           // nothing to scale
+       shrl            eax,1                                           // double pixel count
+       movl            [loopcount],eax
+
+//
+// build composite position
+//
+       movl    ebp,[_ds_xfrac]
+       shll    ebp,10
+       andl    ebp,0ffff0000h
+       movl    eax,[_ds_yfrac]
+       shrl    eax,6
+       andl    eax,0ffffh
+       orl     ebp,eax
+
+       movl    esi,[_ds_source]
+
+//
+// calculate screen dest
+//
+       movl    edi,[_ds_y]
+       movl    edi,[_ylookup+edi*4]
+       movl    eax,[_ds_x1]
+       addl edi,[_columnofs+eax*4]
+
+//
+// build composite step
+//
+       movl    ebx,[_ds_xstep]
+       shll    ebx,10
+       andl    ebx,0ffff0000h
+       movl    eax,[_ds_ystep]
+       shrl    eax,6
+       andl    eax,0ffffh
+       orl     ebx,eax
+
+       movl            eax,OFFSET hpatch1+2            // convice tasm to modify code...
+       movl            [eax],ebx
+       movl            eax,OFFSET hpatch2+2            // convice tasm to modify code...
+       movl            [eax],ebx
+       
+// eax         aligned colormap
+// ebx         aligned colormap
+// ecx,edx     scratch
+// esi         virtual source
+// edi         moving destination pointer
+// ebp         frac
+       
+       shldl ecx,ebp,22                                // begin calculating third pixel (y units)
+       shldl ecx,ebp,6                         // begin calculating third pixel (x units)
+       addl    ebp,ebx                                 // advance frac pointer
+       andl ecx,4095                           // finish calculation for third pixel
+       shldl edx,ebp,22                                // begin calculating fourth pixel (y units)
+       shldl edx,ebp,6                         // begin calculating fourth pixel (x units)
+       addl    ebp,ebx                                 // advance frac pointer
+       andl edx,4095                           // finish calculation for fourth pixel
+       movl eax,[_ds_colormap]
+       movl ebx,eax
+       movb    al,[esi+ecx]                    // get first pixel
+       movb    bl,[esi+edx]                    // get second pixel
+       movb    al,[eax]                                // color translate first pixel
+       movb    bl,[ebx]                                // color translate second pixel
+       
+       testl   [pixelcount],0fffffffeh
+       jnz     hdoubleloop                             // at least two pixels to map
+       jmp     hchecklast
+       
+
+       .align  16
+hdoubleloop:
+       shldl ecx,ebp,22                                // begin calculating third pixel (y units)
+       shldl ecx,ebp,6                         // begin calculating third pixel (x units)
+hpatch1:
+       addl    ebp,12345678h                   // advance frac pointer
+       movb    [edi],al                                // write first pixel
+       andl ecx,4095                           // finish calculation for third pixel
+       shldl edx,ebp,22                                // begin calculating fourth pixel (y units)
+       shldl edx,ebp,6                         // begin calculating fourth pixel (x units)
+hpatch2:
+       addl    ebp,12345678h                   // advance frac pointer
+       movb    [edi+1],bl                              // write second pixel
+       andl edx,4095                           // finish calculation for fourth pixel
+       movb    al,[esi+ecx]                    // get third pixel
+       addl    edi,2                                   // advance to third pixel destination
+       movb    bl,[esi+edx]                    // get fourth pixel
+       decl    [loopcount]                             // done with loop?
+       movb    al,[eax]                                // color translate third pixel
+       movb    bl,[ebx]                                // color translate fourth pixel
+       jnz     hdoubleloop
+
+// check for final pixel
+hchecklast:
+       testl   [pixelcount],1
+       jz      hdone
+       movb    [edi],al                                // write final pixel
+       
+hdone:
+       popad
+       ret
+
+
+
+
+//====================================================
+// fpfunc.S  as of January 10th, 1997 (parts)
+
+#ifdef i386
+
+.text
+       .align 4
+.globl _FixedMul
+_FixedMul:     
+       pushl %ebp
+       movl %esp,%ebp
+       movl 8(%ebp),%eax
+       imull 12(%ebp)
+       shrdl $16,%edx,%eax
+       popl %ebp
+       ret
+
+
+       .align 4
+.globl _FixedDiv2
+_FixedDiv2:
+       pushl %ebp
+       movl %esp,%ebp
+       movl 8(%ebp),%eax
+       cdq
+       shldl $16,%eax,%edx
+       sall    $16,%eax
+       idivl   12(%ebp)
+       popl %ebp
+       ret
+
+#endif
+
diff --git a/linuxdoom-1.10/README.b b/linuxdoom-1.10/README.b
new file mode 100644 (file)
index 0000000..3d2fa2f
--- /dev/null
@@ -0,0 +1,140 @@
+
+README for Linux DOOM Source distribution
+=========================================
+
+
+DISCLAIMER
+----------
+This is not "The DOOM Source Code" dump for a bunch
+of reasons. It is based on a DOOM development directory
+snapshot as of January 10th, but has been stripped and
+changed. Thus it is the DOOM source, but there are many
+minor differences to the source as last used by id
+Software.
+
+Note that thus neither John Carmack nor Dave Taylor nor
+anybody else at id is responsible for the contents of
+this archive, or the changes introduced to the original
+source.
+
+If there are any questions, contact me at bk@gamers.org,
+or preferably post to the mailing list at
+
+                doom-editing@gamers.org
+
+(send mail to majordomo@gamers.org, content just
+a single "info doom-editing"). I will post any updates
+or notifcation of corrections there. I will probably
+put some stuff at 
+
+          http://www.gamers.org/dEngine/doom/
+
+as well. Look there for the "Unofficial DOOM Specs" as
+minimal recommended documentation.
+
+
+
+REMARKS
+-------
+I made a few minor bug fixes, added some experimental sound
+code, and, and changed the handling of IWAD dependend game
+modes. Most of the changes though have been shuffling
+around sources in a sometimes futile attempt to separate
+modules more cleanly, and make certain parts easier
+to locate and modify. There is still much left to do, but
+I hope that the current source is a good base to start
+with, especially with a cooperative effort in mind. Those
+so inclined will find the source prepared for CVS.  
+
+There is a list of changes and fixes I did not get around
+to in TODO, and an incomplete worklog in ChangeLog, that
+also includes some minor ToDo statements scattered throughout
+the log. 
+
+
+a) Linux SVGA
+There is no SVGA support. For development and debug
+purposes, the X11 version seems to be more handy.
+
+b) Sound - see README.sound,
+    and the sndserver.tgz archive.
+
+c) GLDOOM - see README.gl
+
+d) Win32
+There was no Win32 support in the original dump.
+
+e) DOS
+Original DOS support (including the texture
+mapping and fixed point assembler) has been
+removed, mainly because of the lack of sound
+support.
+
+f) DoomEd
+The NeXTStep DoomEd sources in the dump were
+garbled (filenames - prolly an issue of ISO9660
+with or w/o extensions). Somehow  Bear never got
+around to send me a list of the correct filenames,
+and I won't bother guessing without a NeXT box
+at hand.
+
+There is a plethora of useful editors
+for DOOM. I suggest using DEU for X11.
+
+g) BSP Tools
+The BSP builder and other tools have
+been released by John Carmack long ago,
+and since improved/replaced by others.
+Again, I recommend taking a pick among
+the tools available for Linux.  
+
+h) DOOM game tools
+There are a number of tools that have
+not been released, namely those which
+compiled the Things and State Tables,
+the frame animation LUT's, sound tables
+etc. Basically, they compile similarly
+complex LUT's to generate C files. The
+tools are omitted from this distribution.
+
+There are some files in the
+distribution (info.h/c, sounds.h/c)
+that are essentially the output of these
+tools. This is the data that defines
+DOOM (as a game) for all practical
+purposes.
+
+I recommend keeping them, as they are
+part of the source. In the long run,
+handling them as well as the action/
+animation functions as a separate game.so
+library (as with Quake2) seems to be a
+good idea.
+
+i) Artwork
+Neither the original artwork nor the
+misc. WAD files are included in this
+archive. You will at least need the
+shareware WAD file to run the executable,
+but it shouldn't be to difficult to get
+a hold of that.
+
+Note that the mechanism to detect the
+presence of a registered or commercial
+version is still in the source, and
+homebrew maps are still disabled. This
+is easily removed now, but as FinalDOOM,
+Ultimate DOOM and DOOM 2 are still in
+the shops, it is probably polite not
+to distribute a source or binary without
+that mechanism.
+
+This version of Linuxdoom supports Plutonia
+and TNT WAD from FinalDOOM as well. No
+guarantees, though.
+
+
+Enjoy!
+
+                          b. 97/12/22
diff --git a/linuxdoom-1.10/README.book b/linuxdoom-1.10/README.book
new file mode 100644 (file)
index 0000000..0fe5949
--- /dev/null
@@ -0,0 +1,57 @@
+
+The DOOM Book
+
+Shortly after the Wolfenstein 3D source release,
+I sent a mail to Jay Wilbur suggesting a book
+about the DOOM engine. I anticipated a similar
+release of the DOOM sources within a year or
+two, and the obvious problems with the Wolfenstein
+sources (lack of accompanying artwork, a code 
+base not maintained for quite some time) seemed
+to demand a better approach. I talked to some
+publishing company reps at the Book Fair in 1995,
+and while they were cautiously interested, id was
+not.
+
+In the last weeks of 1996, following a visit at
+id Software two months earlier, and after the
+departure of Jay Wilbur, John Carmack asked me
+whether I was still interested in doing the book.
+I was, Bear sent me a code dump, and  Todd
+Hollenshead set out to address the legal concerns
+(of which were many).
+
+Unfortunately, what might have worked in 1995
+turned out to be a doomed attempt in 1997. I won't
+go into the details - let's just say that my
+leaving university and going back to full time
+writing for a living repeatedly forced me to
+change priorities on what looked more and more
+like a project unlikely to generate any revenue.
+
+By mid of the year, when the legal issues had
+finally been settled, it didn't look like I was
+going to find a publisher at all. Following the
+Book Fair in 1997 and some more discussions
+(with about a dozen publishers, total), I gritted
+my teeth and decided to abandon the project.
+
+Note that the book project as such wasn't supposed
+to hold up the source release to the public.
+However, given the legal concerns relating to
+the third party sound code in DOS DOOM, and the
+lack of Win32 support as well as the advantages of
+an OpenGL based release, the idea was to put
+together a consistent, stable code base prior to
+public release - most of which was supposed to be
+an offspring of my reformatting and modifying the
+code for the book.
+
+None of this worked out as intended. However, I
+hope that, at long last, this distribution
+will finally provide a good point to start for
+any cooperative effort to extend the already
+impressive lifespan of DOOM into the age of
+multiplayer servers and hardware-accelerated
+clients.
+
diff --git a/linuxdoom-1.10/README.gl b/linuxdoom-1.10/README.gl
new file mode 100644 (file)
index 0000000..df443a9
--- /dev/null
@@ -0,0 +1,149 @@
+
+README: glDOOM
+
+I never got around to do anything with respect to
+a Linux glDOOM port except for assembling a Linux3Dfx
+HOWTO (which, at that time, was a prerequisite
+to get permission to publicly distribute the
+already finished LinuxGlide port by Daryll Strauss).
+
+Linux q2test (and soon LinuxQuake2) demonstrate that
+Mesa with the MesaVoodoo driver is quite up to the
+requirements for a glDOOM port. If anybody wants to
+get into Linux glDOOM, please drop me a line.
+
+There is a Win32 GLDOOM port in the works, by Jim Dose.
+Quoting a recent posting by him:
+
+"I haven't had as much time lately to really work on
+the conversion. I currently have the renderer drawing
+the walls and floors as texture spans as the are in
+the software renderer. There's lighting on the walls,
+but not the floors, and sprites are being drawn, but
+not with the right texture. I figure that this is one
+nights work to get the game looking "normal". I haven't
+tested the game on less than a p200, so I'm not sure
+how it will perform under the average machine, but I
+don't expect it to be blindingly fast because of the
+number of spans that have to be drawn each frame.
+Rendering as polys is definitely the way to go.
+
+The reason I chose to do spans first was because it
+left the base renderer intact and I could concentrate
+on ironing out any Windows compatibility problems.
+Actually, the first version I had running was simply
+a blit of the 320x200 game screen through Open GL.
+Surprisingly, this actually was very playable, but
+certainly wasn't taking any advantage of 3D acceleration.
+Once the game was running, I started converting all
+the span routines over."
+
+Comment: for merging Linuxdoom with Win32, this is
+probably the best source for getting the Win32
+environment done - before more significant changes
+occur.
+
+"One problem with drawing spans is that the engine
+doesn't calculate the texture coordinates with
+fractional accuracy, so the bilinear filtering works
+vertically, but not horizontally on the walls. I may
+try to fix this, but since I plan to use polys for
+the final version, it's not really high priority.
+Also, spans don't really allow for looking up and
+down."
+
+Comment: true looking up/down vs. Heretic-style
+y-shearing seems to require either a strange kind
+of transofrmation matrix (he probably does not use
+the OpenGL transformation at all), or rendering
+all the spans as textured rectangular slices
+instead of using glDrawBitmap. No, polys are the
+way to go.
+   
+"When I tackle the conversion to polys, one big problem
+I'll encounter is drawing floors. Since the world is
+stored in a 2D bsp tree, there is no information on
+the shape of the floors. In fact the floors can be
+concave and may include holes (typically, most renderers
+break concave polys down into a collection of convex
+polys or triangles). In software, the floors are actually
+drawn using an algorithm that's similar to a flood fill
+(except that a list of open spans is kept instead of a
+buffer of pixels).  This makes drawing the floors as
+polys fairly difficult."
+
+A polygon based approach will require significant changes
+to the data structures used in the refresh module. I
+recommend either separating a libref_soft.so first (a
+Quake2 like approach), and creating libref_gl afterwards,
+or abandoning the software rendering entirely.
+
+John Carmack wrote once upon a time:
+"... the U64 DOOM engine is much more what I would consider
+The Right Thing now -- it turns the subsector boundaries
+into polygons for the floors and ceilings ahead of time,
+then for rendering it walks the BSP front to back, doing
+visibility determination of subsectors by the one dimensional
+occlusion buffer and clipping sprites into subsectors, then
+it goes backwards through the visible subsectors, drawing
+floors, ceilings, walls, then sorted internal sprite fragments.
+It's a ton simpler and a ton faster, although it does suffer
+some overdraw when a high subsector overlooks a low one (but
+that is more than made up for by the simplicity of everything
+else)."
+
+Well, IMO compiling a separate list of floor/ceiling polygons
+after having read the WAD file, and thus introducing this as
+a completely separate data structure to the current code base
+might be the easiest thing to do. Jim Dose writes:
+
+"One method I may use to draw the floors as polys was suggested
+by Billy Zelsnack of Rebel Boat Rocker when we were working
+at 3D Realms together a few years ago. Basically, Billy was
+designing an engine that dealt with the world in a 2D portal
+format similar to the one that Build used, except that it had
+true looking up and down (no shearing). Since floors were
+basically implicit and could be concave, Billy drew them as
+if the walls extended downwards to infinity, but fixed the
+texture coordinates to appear that they were on the plane of
+the floor. The effect was that you could look up and down and
+there were no gaps or overdraw. It's a fairly clever method
+and allows you to store the world in a simpler data format.
+Had perspective texture mapping been fast enough back then,
+both Build and Doom could have done this in software."
+
+Perhaps the above is sufficient to get you started.
+Other Issues:
+
+1. Occlusion
+DOOM uses a per-column lookup (top/bottom index) to do HLHSR.
+This works fine with span based rendering (well, getting
+horizontal spans of floors/ceilings into the picture is a
+separate story). It isn't really mindboggling with polygon
+based rendering. GLDOOM should abandon that.
+
+2. Precalculated Visibility
+DOOM has the data used by Quake's PVS - in REJECT.
+During Quake development, lots of replacements for the
+occlusion buffer were tried, and PVS turned out to be best.
+I suggest usind the REJECT as PVS.
+
+There have been special effects using a utility named RMB.
+REJECT is a lump meant for enemy AI LoS calculation - a
+nonstandard REJECT will not work as a PVS, and introduce
+rendering errors. I suggest looking for a PVS lump in the
+WAD, and using REJECT if none is found. That way, it might
+be feasible to eat the cake and keep it.
+
+3. Mipmaps
+DOOM does not have mipmapping. As we have 8bit palettized
+textures, OpenGL mipmapping might not give the desired
+results. Plus, composing textures from patches at runtime
+would require runtime mipmapping. Precalculated mipmaps
+in the WAD?
+
+4. Sprites
+Partly transparent textures and sprites impose another
+problem related to mipmapping. Without alpha channel,
+this could give strange results. Precalculated, valid
+sprite mipmaps (w/o alpha)?
diff --git a/linuxdoom-1.10/README.sound b/linuxdoom-1.10/README.sound
new file mode 100644 (file)
index 0000000..79541b4
--- /dev/null
@@ -0,0 +1,110 @@
+
+README: sound in DOOM
+
+
+1) DOS/Win32 sound
+
+id licensed a third party sound library called
+DMX for DOS DOOM. The situation exhibited
+many symptons of serious NIH "Not Invented Here"),
+and one of the consequences is that the original
+DOOM sound code does not work without DMX. As
+DMX is not publicly available, the original DOOM
+sound support is removed.
+
+Win32 was not supported in the source dump I got.
+I have no knowledge how the WinDOOM port did the
+sound handling. A Win32 port should probaly rely on
+DirectSound. So far, the Win32 glDOOM port Jim Dose
+is working on has no sound support.
+
+In consequence, the only target with a working sound
+code is UNIX, which I could only verify with Linux
+on Intel586.
+
+2) Linux sound
+
+DOOM for Linux used a separate process, sndserver.
+
+Quoting Dave Taylor:
+
+"Sound drivers should be an asychronous model, either
+a seperate thread or a seperate process.  This is
+because sound should always be fed to the card without
+interruption or else you get pops and with low latency
+or else you get angry players.
+
+Now it turns out that this kind of code isn't too fun
+to write. In the days of Linux Doom, threads were not a
+happnin thing in Linux. In fact, they still largely
+aren't. You can use them these days if you have gnu's
+libc installed, but you still can't debug them because
+gdb doesn't support them properly yet. I believe the
+original seperate process had a bad latency delay
+because of the time it took for commands to be flushed
+through the pipe used to communicate with the seperate
+process.  I should have looked into this more thoroughly.
+
+In Quake, I discovered that I could feed multiple
+acknowledgements to a SoundBlaster or compatible without
+any side-effects such as pops or other malfunctions. 
+This discovery led me to switch to a completely synchronous
+model, much much easier to debug and understand, so I
+think this was fairly intelligent.  Although we had to
+populate the game with calls in the right places to keep
+the sound buffers fed, and although it wasn't gauranteed to
+be always fed, well over 99% of the time, it was fed, and
+your the latency was never worse than the frequency of your
+refills (several times per frame) plus a small lead time
+(40th of a second?)."
+
+The separate sndserver code base introduced some redundancy
+(WAD access for sound lumps) for each UNIX target (Sun, SGI,
+Linux) and more differences between DOS and UNIX version.
+However, I kept the IPC based parts in the source, and
+separated the sndserver target in another directory to avoid
+further redundancy. There seem to be a few bug-like things
+going on in the sndserver that do not receive penalty as
+the program has to do only a simple task. One example would
+be a libc realloc mixed with zone memory allocation. 
+
+Ungraceful and untimely demise of Linuxdoom (core instead
+of I_Error) will leave idle sndserver processes in your
+system, blocking /dev/bsp. Kill them manually.
+
+I put the non-redundant parts of the sndserver program
+into the i_sound module of doom, and with the SND_SERV
+compiler switch you can choose to use the internal sound
+support. However, there is a problem with e.g. the
+double shotgun and the plasma gun - walk up to a wall,
+face it straight, and fire. The sound output is crappy.
+This vanishes with decreasing screen size. A similar
+problem occurs with trimer driven asynchronous output
+enabled by SNDINTR.
+
+I agree with Dave that threads would be preferable.
+With respect to Linux ports of John Carmack's next
+Trinity engine, this one will rely on Win32
+multithreading e.g. for input sampling. So the Linux
+community will have to sort out threads anyway :-).
+
+To improve the current sound server, other means of
+IPC should take care of the latency. The mixing
+buffer/command buffer as shared memory comes to mind.
+
+
+
+3) Music support
+
+There is, and was, no music support in Linuxdoom. Fine with
+me - I wouldn't give a bat's tail feathers for DOOM music.
+Your mileage may vary. There are a few leftovers of the DOS
+music support also interfacing DMX, so there is a place
+to start. However, in the age of CDROM based music, I
+recommend getting e.g. Workman to cooperate with DOOM
+(currently, DOOM accessing the soundcard SpekerOut
+interferes with Workman controlling the CD drives
+SpeakerOut), so musci could be chosen and run completely
+independend of the game. You could try Linuxdoom with
+Q2 music that way.
+
diff --git a/linuxdoom-1.10/TODO b/linuxdoom-1.10/TODO
new file mode 100644 (file)
index 0000000..89529c9
--- /dev/null
@@ -0,0 +1,123 @@
+
+- create Web repository for sources, patches,
+  news, and pointer to doom-editing mailing
+  list.
+
+- get DOOM Public License from id
+
+-----------------------------------------------
+
+- remove m_fixed, switch to floating point
+  More stable, and prolly even faster.
+
+- make SCREENWIDTH/HEIGHT work at startup?
+  Well, the HUD/STBar stuff is tied to the
+  scales implied by the graphics. Rather do
+  GLDOOM and use texture mapping.
+
+- fix aspect ratio?
+  320x200 is nothing viable nowadays.
+  A 320x240 base (4:3) would be a lot better.
+  See above on width/height.
+- limited look up/down by y-shearing?
+  Prolly not worth it, rather switch to GLDOOM.
+
+- switch to C++?
+  The action function pointers have varying
+  argument lists (no parameter, one, etc.).
+  C++ doesn't like that much. A major rewrite.
+
+- switch to doommain.c plus libdoom? Have 
+  libref, libgame etc.?
+  Another major rewrite.
+
+- use XFree86 DGA, prolly not that much faster
+  than MIT SHM, but allows for directly sampled
+  mouse (and even freelook). Recommended for
+  GLDOOM.
+
+- put together an accompanying developer toolkit
+  source distribution: DEU, RMB, BSP for Linux/X.
+
+- move info.h, info.c, sounds.h, sounds.c and
+  other data to a separate lump in the WAD,
+  or into a libgame.so, to separate the 
+  generic stuff (refresh, I/O) from the
+  DOOM specifics.
+
+- decide whether precaching all sounds is
+  better than retrieving and releasing
+  every so often. DOOM seems to do that
+  frequently (8bit stuff, originally for
+  DOS), and the Linux sound is 16bit
+  (conversion in the mixing, requires
+  some padding) - we prolly got the memory
+  to spare.
+
+- 16bpp CLUT. The lightmaps and the
+  framebuffer could be changed to switch
+  to 64K colors. Prolly better to do
+  GLDOOM right away.
+
+- remove checks for commercial etc., in
+   non-essential issues (enabling PWAD's).
+
+- change (simplify) determination of
+   sky texture (done by game version).
+   Explicit?
+
+- remove all game version checks
+
+- different handling of Demo - don't
+   exit on "different game version"
+
+- how about shareware/retail "You are here"
+   intermission animation? Wasn't in
+   commercial (DOOM 2).
+
+- double shotgun in DOOM1, all weapons with
+   shareware
+
+- checks for required lumps. We need fallbacks
+   for lumps that are not present, that is,
+   default sounds etc. to be used instead,
+   or removing THINGS w/o sprites etc.
+
+- client/server? I'd suggest ripping off some stuff
+   from the abandoned IBM WebView project
+
+- Blockmap
+   The BLOCKMAP lump might be (partly) redundant,
+   as the BSP allows for clipping (except certain
+   LineDefs that will not spawn Segs).
+
+- LOS
+   REJECT and intersection based LOS checking could be
+   done using the BSP. In case of REJECT, certain
+   monster AI special effects would be lost, though.
+
+- correct handling of height in collision. This is
+   not done, and the checks are scattered around in
+   many places. It does require handling of "player
+   on top of monster" situations, too - we have to 
+   make sure the players falls off far enough to
+   avoid getting "stuck in monster".
+
+- remove obsolete menus (Detail. Music Volume?)
+
+- clip explosion range damage (and sprites) using
+   REJECT? That is, if one Sector/SSector not
+   visible from the other, do not apply damage,
+   not render sprite if player in other sector.
+   Hmmm - explosion behind small pillar might not be
+   visible at all, but do we care?
+
+
+- Ungraceful and untimely demise of Linuxdoom (core
+   instead of I_Error) will leave idle sndserver
+   processes in your system, blocking /dev/bsp.
+  A timeout on lack of input for "sndserver"?
+
+- threaded sndserver? SHM mixing buffer?
+   Or internal, timer-based?
diff --git a/linuxdoom-1.10/am_map.c b/linuxdoom-1.10/am_map.c
new file mode 100644 (file)
index 0000000..999e455
--- /dev/null
@@ -0,0 +1,1349 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+//
+// $Log:$
+//
+// DESCRIPTION:  the automap code
+//
+//-----------------------------------------------------------------------------
+
+static const char rcsid[] = "$Id: am_map.c,v 1.4 1997/02/03 21:24:33 b1 Exp $";
+
+#include <stdio.h>
+
+
+#include "z_zone.h"
+#include "doomdef.h"
+#include "st_stuff.h"
+#include "p_local.h"
+#include "w_wad.h"
+
+#include "m_cheat.h"
+#include "i_system.h"
+
+// Needs access to LFB.
+#include "v_video.h"
+
+// State.
+#include "doomstat.h"
+#include "r_state.h"
+
+// Data.
+#include "dstrings.h"
+
+#include "am_map.h"
+
+
+// For use if I do walls with outsides/insides
+#define REDS           (256-5*16)
+#define REDRANGE       16
+#define BLUES          (256-4*16+8)
+#define BLUERANGE      8
+#define GREENS         (7*16)
+#define GREENRANGE     16
+#define GRAYS          (6*16)
+#define GRAYSRANGE     16
+#define BROWNS         (4*16)
+#define BROWNRANGE     16
+#define YELLOWS                (256-32+7)
+#define YELLOWRANGE    1
+#define BLACK          0
+#define WHITE          (256-47)
+
+// Automap colors
+#define BACKGROUND     BLACK
+#define YOURCOLORS     WHITE
+#define YOURRANGE      0
+#define WALLCOLORS     REDS
+#define WALLRANGE      REDRANGE
+#define TSWALLCOLORS   GRAYS
+#define TSWALLRANGE    GRAYSRANGE
+#define FDWALLCOLORS   BROWNS
+#define FDWALLRANGE    BROWNRANGE
+#define CDWALLCOLORS   YELLOWS
+#define CDWALLRANGE    YELLOWRANGE
+#define THINGCOLORS    GREENS
+#define THINGRANGE     GREENRANGE
+#define SECRETWALLCOLORS WALLCOLORS
+#define SECRETWALLRANGE WALLRANGE
+#define GRIDCOLORS     (GRAYS + GRAYSRANGE/2)
+#define GRIDRANGE      0
+#define XHAIRCOLORS    GRAYS
+
+// drawing stuff
+#define        FB              0
+
+#define AM_PANDOWNKEY  KEY_DOWNARROW
+#define AM_PANUPKEY    KEY_UPARROW
+#define AM_PANRIGHTKEY KEY_RIGHTARROW
+#define AM_PANLEFTKEY  KEY_LEFTARROW
+#define AM_ZOOMINKEY   '='
+#define AM_ZOOMOUTKEY  '-'
+#define AM_STARTKEY    KEY_TAB
+#define AM_ENDKEY      KEY_TAB
+#define AM_GOBIGKEY    '0'
+#define AM_FOLLOWKEY   'f'
+#define AM_GRIDKEY     'g'
+#define AM_MARKKEY     'm'
+#define AM_CLEARMARKKEY        'c'
+
+#define AM_NUMMARKPOINTS 10
+
+// scale on entry
+#define INITSCALEMTOF (.2*FRACUNIT)
+// how much the automap moves window per tic in frame-buffer coordinates
+// moves 140 pixels in 1 second
+#define F_PANINC       4
+// how much zoom-in per tic
+// goes to 2x in 1 second
+#define M_ZOOMIN        ((int) (1.02*FRACUNIT))
+// how much zoom-out per tic
+// pulls out to 0.5x in 1 second
+#define M_ZOOMOUT       ((int) (FRACUNIT/1.02))
+
+// translates between frame-buffer and map distances
+#define FTOM(x) FixedMul(((x)<<16),scale_ftom)
+#define MTOF(x) (FixedMul((x),scale_mtof)>>16)
+// translates between frame-buffer and map coordinates
+#define CXMTOF(x)  (f_x + MTOF((x)-m_x))
+#define CYMTOF(y)  (f_y + (f_h - MTOF((y)-m_y)))
+
+// the following is crap
+#define LINE_NEVERSEE ML_DONTDRAW
+
+typedef struct
+{
+    int x, y;
+} fpoint_t;
+
+typedef struct
+{
+    fpoint_t a, b;
+} fline_t;
+
+typedef struct
+{
+    fixed_t            x,y;
+} mpoint_t;
+
+typedef struct
+{
+    mpoint_t a, b;
+} mline_t;
+
+typedef struct
+{
+    fixed_t slp, islp;
+} islope_t;
+
+
+
+//
+// The vector graphics for the automap.
+//  A line drawing of the player pointing right,
+//   starting from the middle.
+//
+#define R ((8*PLAYERRADIUS)/7)
+mline_t player_arrow[] = {
+    { { -R+R/8, 0 }, { R, 0 } }, // -----
+    { { R, 0 }, { R-R/2, R/4 } },  // ----->
+    { { R, 0 }, { R-R/2, -R/4 } },
+    { { -R+R/8, 0 }, { -R-R/8, R/4 } }, // >---->
+    { { -R+R/8, 0 }, { -R-R/8, -R/4 } },
+    { { -R+3*R/8, 0 }, { -R+R/8, R/4 } }, // >>--->
+    { { -R+3*R/8, 0 }, { -R+R/8, -R/4 } }
+};
+#undef R
+#define NUMPLYRLINES (sizeof(player_arrow)/sizeof(mline_t))
+
+#define R ((8*PLAYERRADIUS)/7)
+mline_t cheat_player_arrow[] = {
+    { { -R+R/8, 0 }, { R, 0 } }, // -----
+    { { R, 0 }, { R-R/2, R/6 } },  // ----->
+    { { R, 0 }, { R-R/2, -R/6 } },
+    { { -R+R/8, 0 }, { -R-R/8, R/6 } }, // >----->
+    { { -R+R/8, 0 }, { -R-R/8, -R/6 } },
+    { { -R+3*R/8, 0 }, { -R+R/8, R/6 } }, // >>----->
+    { { -R+3*R/8, 0 }, { -R+R/8, -R/6 } },
+    { { -R/2, 0 }, { -R/2, -R/6 } }, // >>-d--->
+    { { -R/2, -R/6 }, { -R/2+R/6, -R/6 } },
+    { { -R/2+R/6, -R/6 }, { -R/2+R/6, R/4 } },
+    { { -R/6, 0 }, { -R/6, -R/6 } }, // >>-dd-->
+    { { -R/6, -R/6 }, { 0, -R/6 } },
+    { { 0, -R/6 }, { 0, R/4 } },
+    { { R/6, R/4 }, { R/6, -R/7 } }, // >>-ddt->
+    { { R/6, -R/7 }, { R/6+R/32, -R/7-R/32 } },
+    { { R/6+R/32, -R/7-R/32 }, { R/6+R/10, -R/7 } }
+};
+#undef R
+#define NUMCHEATPLYRLINES (sizeof(cheat_player_arrow)/sizeof(mline_t))
+
+#define R (FRACUNIT)
+mline_t triangle_guy[] = {
+    { { -.867*R, -.5*R }, { .867*R, -.5*R } },
+    { { .867*R, -.5*R } , { 0, R } },
+    { { 0, R }, { -.867*R, -.5*R } }
+};
+#undef R
+#define NUMTRIANGLEGUYLINES (sizeof(triangle_guy)/sizeof(mline_t))
+
+#define R (FRACUNIT)
+mline_t thintriangle_guy[] = {
+    { { -.5*R, -.7*R }, { R, 0 } },
+    { { R, 0 }, { -.5*R, .7*R } },
+    { { -.5*R, .7*R }, { -.5*R, -.7*R } }
+};
+#undef R
+#define NUMTHINTRIANGLEGUYLINES (sizeof(thintriangle_guy)/sizeof(mline_t))
+
+
+
+
+static int     cheating = 0;
+static int     grid = 0;
+
+static int     leveljuststarted = 1;   // kluge until AM_LevelInit() is called
+
+boolean        automapactive = false;
+static int     finit_width = SCREENWIDTH;
+static int     finit_height = SCREENHEIGHT - 32;
+
+// location of window on screen
+static int     f_x;
+static int     f_y;
+
+// size of window on screen
+static int     f_w;
+static int     f_h;
+
+static int     lightlev;               // used for funky strobing effect
+static byte*   fb;                     // pseudo-frame buffer
+static int     amclock;
+
+static mpoint_t m_paninc; // how far the window pans each tic (map coords)
+static fixed_t         mtof_zoommul; // how far the window zooms in each tic (map coords)
+static fixed_t         ftom_zoommul; // how far the window zooms in each tic (fb coords)
+
+static fixed_t         m_x, m_y;   // LL x,y where the window is on the map (map coords)
+static fixed_t         m_x2, m_y2; // UR x,y where the window is on the map (map coords)
+
+//
+// width/height of window on map (map coords)
+//
+static fixed_t         m_w;
+static fixed_t m_h;
+
+// based on level size
+static fixed_t         min_x;
+static fixed_t min_y; 
+static fixed_t         max_x;
+static fixed_t  max_y;
+
+static fixed_t         max_w; // max_x-min_x,
+static fixed_t  max_h; // max_y-min_y
+
+// based on player size
+static fixed_t         min_w;
+static fixed_t  min_h;
+
+
+static fixed_t         min_scale_mtof; // used to tell when to stop zooming out
+static fixed_t         max_scale_mtof; // used to tell when to stop zooming in
+
+// old stuff for recovery later
+static fixed_t old_m_w, old_m_h;
+static fixed_t old_m_x, old_m_y;
+
+// old location used by the Follower routine
+static mpoint_t f_oldloc;
+
+// used by MTOF to scale from map-to-frame-buffer coords
+static fixed_t scale_mtof = INITSCALEMTOF;
+// used by FTOM to scale from frame-buffer-to-map coords (=1/scale_mtof)
+static fixed_t scale_ftom;
+
+static player_t *plr; // the player represented by an arrow
+
+static patch_t *marknums[10]; // numbers used for marking by the automap
+static mpoint_t markpoints[AM_NUMMARKPOINTS]; // where the points are
+static int markpointnum = 0; // next point to be assigned
+
+static int followplayer = 1; // specifies whether to follow the player around
+
+static unsigned char cheat_amap_seq[] = { 0xb2, 0x26, 0x26, 0x2e, 0xff };
+static cheatseq_t cheat_amap = { cheat_amap_seq, 0 };
+
+static boolean stopped = true;
+
+extern boolean viewactive;
+//extern byte screens[][SCREENWIDTH*SCREENHEIGHT];
+
+
+
+void
+V_MarkRect
+( int  x,
+  int  y,
+  int  width,
+  int  height );
+
+// Calculates the slope and slope according to the x-axis of a line
+// segment in map coordinates (with the upright y-axis n' all) so
+// that it can be used with the brain-dead drawing stuff.
+
+void
+AM_getIslope
+( mline_t*     ml,
+  islope_t*    is )
+{
+    int dx, dy;
+
+    dy = ml->a.y - ml->b.y;
+    dx = ml->b.x - ml->a.x;
+    if (!dy) is->islp = (dx<0?-MAXINT:MAXINT);
+    else is->islp = FixedDiv(dx, dy);
+    if (!dx) is->slp = (dy<0?-MAXINT:MAXINT);
+    else is->slp = FixedDiv(dy, dx);
+
+}
+
+//
+//
+//
+void AM_activateNewScale(void)
+{
+    m_x += m_w/2;
+    m_y += m_h/2;
+    m_w = FTOM(f_w);
+    m_h = FTOM(f_h);
+    m_x -= m_w/2;
+    m_y -= m_h/2;
+    m_x2 = m_x + m_w;
+    m_y2 = m_y + m_h;
+}
+
+//
+//
+//
+void AM_saveScaleAndLoc(void)
+{
+    old_m_x = m_x;
+    old_m_y = m_y;
+    old_m_w = m_w;
+    old_m_h = m_h;
+}
+
+//
+//
+//
+void AM_restoreScaleAndLoc(void)
+{
+
+    m_w = old_m_w;
+    m_h = old_m_h;
+    if (!followplayer)
+    {
+       m_x = old_m_x;
+       m_y = old_m_y;
+    } else {
+       m_x = plr->mo->x - m_w/2;
+       m_y = plr->mo->y - m_h/2;
+    }
+    m_x2 = m_x + m_w;
+    m_y2 = m_y + m_h;
+
+    // Change the scaling multipliers
+    scale_mtof = FixedDiv(f_w<<FRACBITS, m_w);
+    scale_ftom = FixedDiv(FRACUNIT, scale_mtof);
+}
+
+//
+// adds a marker at the current location
+//
+void AM_addMark(void)
+{
+    markpoints[markpointnum].x = m_x + m_w/2;
+    markpoints[markpointnum].y = m_y + m_h/2;
+    markpointnum = (markpointnum + 1) % AM_NUMMARKPOINTS;
+
+}
+
+//
+// Determines bounding box of all vertices,
+// sets global variables controlling zoom range.
+//
+void AM_findMinMaxBoundaries(void)
+{
+    int i;
+    fixed_t a;
+    fixed_t b;
+
+    min_x = min_y =  MAXINT;
+    max_x = max_y = -MAXINT;
+  
+    for (i=0;i<numvertexes;i++)
+    {
+       if (vertexes[i].x < min_x)
+           min_x = vertexes[i].x;
+       else if (vertexes[i].x > max_x)
+           max_x = vertexes[i].x;
+    
+       if (vertexes[i].y < min_y)
+           min_y = vertexes[i].y;
+       else if (vertexes[i].y > max_y)
+           max_y = vertexes[i].y;
+    }
+  
+    max_w = max_x - min_x;
+    max_h = max_y - min_y;
+
+    min_w = 2*PLAYERRADIUS; // const? never changed?
+    min_h = 2*PLAYERRADIUS;
+
+    a = FixedDiv(f_w<<FRACBITS, max_w);
+    b = FixedDiv(f_h<<FRACBITS, max_h);
+  
+    min_scale_mtof = a < b ? a : b;
+    max_scale_mtof = FixedDiv(f_h<<FRACBITS, 2*PLAYERRADIUS);
+
+}
+
+
+//
+//
+//
+void AM_changeWindowLoc(void)
+{
+    if (m_paninc.x || m_paninc.y)
+    {
+       followplayer = 0;
+       f_oldloc.x = MAXINT;
+    }
+
+    m_x += m_paninc.x;
+    m_y += m_paninc.y;
+
+    if (m_x + m_w/2 > max_x)
+       m_x = max_x - m_w/2;
+    else if (m_x + m_w/2 < min_x)
+       m_x = min_x - m_w/2;
+  
+    if (m_y + m_h/2 > max_y)
+       m_y = max_y - m_h/2;
+    else if (m_y + m_h/2 < min_y)
+       m_y = min_y - m_h/2;
+
+    m_x2 = m_x + m_w;
+    m_y2 = m_y + m_h;
+}
+
+
+//
+//
+//
+void AM_initVariables(void)
+{
+    int pnum;
+    static event_t st_notify = { ev_keyup, AM_MSGENTERED };
+
+    automapactive = true;
+    fb = screens[0];
+
+    f_oldloc.x = MAXINT;
+    amclock = 0;
+    lightlev = 0;
+
+    m_paninc.x = m_paninc.y = 0;
+    ftom_zoommul = FRACUNIT;
+    mtof_zoommul = FRACUNIT;
+
+    m_w = FTOM(f_w);
+    m_h = FTOM(f_h);
+
+    // find player to center on initially
+    if (!playeringame[pnum = consoleplayer])
+       for (pnum=0;pnum<MAXPLAYERS;pnum++)
+           if (playeringame[pnum])
+               break;
+  
+    plr = &players[pnum];
+    m_x = plr->mo->x - m_w/2;
+    m_y = plr->mo->y - m_h/2;
+    AM_changeWindowLoc();
+
+    // for saving & restoring
+    old_m_x = m_x;
+    old_m_y = m_y;
+    old_m_w = m_w;
+    old_m_h = m_h;
+
+    // inform the status bar of the change
+    ST_Responder(&st_notify);
+
+}
+
+//
+// 
+//
+void AM_loadPics(void)
+{
+    int i;
+    char namebuf[9];
+  
+    for (i=0;i<10;i++)
+    {
+       sprintf(namebuf, "AMMNUM%d", i);
+       marknums[i] = W_CacheLumpName(namebuf, PU_STATIC);
+    }
+
+}
+
+void AM_unloadPics(void)
+{
+    int i;
+  
+    for (i=0;i<10;i++)
+       Z_ChangeTag(marknums[i], PU_CACHE);
+
+}
+
+void AM_clearMarks(void)
+{
+    int i;
+
+    for (i=0;i<AM_NUMMARKPOINTS;i++)
+       markpoints[i].x = -1; // means empty
+    markpointnum = 0;
+}
+
+//
+// should be called at the start of every level
+// right now, i figure it out myself
+//
+void AM_LevelInit(void)
+{
+    leveljuststarted = 0;
+
+    f_x = f_y = 0;
+    f_w = finit_width;
+    f_h = finit_height;
+
+    AM_clearMarks();
+
+    AM_findMinMaxBoundaries();
+    scale_mtof = FixedDiv(min_scale_mtof, (int) (0.7*FRACUNIT));
+    if (scale_mtof > max_scale_mtof)
+       scale_mtof = min_scale_mtof;
+    scale_ftom = FixedDiv(FRACUNIT, scale_mtof);
+}
+
+
+
+
+//
+//
+//
+void AM_Stop (void)
+{
+    static event_t st_notify = { 0, ev_keyup, AM_MSGEXITED };
+
+    AM_unloadPics();
+    automapactive = false;
+    ST_Responder(&st_notify);
+    stopped = true;
+}
+
+//
+//
+//
+void AM_Start (void)
+{
+    static int lastlevel = -1, lastepisode = -1;
+
+    if (!stopped) AM_Stop();
+    stopped = false;
+    if (lastlevel != gamemap || lastepisode != gameepisode)
+    {
+       AM_LevelInit();
+       lastlevel = gamemap;
+       lastepisode = gameepisode;
+    }
+    AM_initVariables();
+    AM_loadPics();
+}
+
+//
+// set the window scale to the maximum size
+//
+void AM_minOutWindowScale(void)
+{
+    scale_mtof = min_scale_mtof;
+    scale_ftom = FixedDiv(FRACUNIT, scale_mtof);
+    AM_activateNewScale();
+}
+
+//
+// set the window scale to the minimum size
+//
+void AM_maxOutWindowScale(void)
+{
+    scale_mtof = max_scale_mtof;
+    scale_ftom = FixedDiv(FRACUNIT, scale_mtof);
+    AM_activateNewScale();
+}
+
+
+//
+// Handle events (user inputs) in automap mode
+//
+boolean
+AM_Responder
+( event_t*     ev )
+{
+
+    int rc;
+    static int cheatstate=0;
+    static int bigstate=0;
+    static char buffer[20];
+
+    rc = false;
+
+    if (!automapactive)
+    {
+       if (ev->type == ev_keydown && ev->data1 == AM_STARTKEY)
+       {
+           AM_Start ();
+           viewactive = false;
+           rc = true;
+       }
+    }
+
+    else if (ev->type == ev_keydown)
+    {
+
+       rc = true;
+       switch(ev->data1)
+       {
+         case AM_PANRIGHTKEY: // pan right
+           if (!followplayer) m_paninc.x = FTOM(F_PANINC);
+           else rc = false;
+           break;
+         case AM_PANLEFTKEY: // pan left
+           if (!followplayer) m_paninc.x = -FTOM(F_PANINC);
+           else rc = false;
+           break;
+         case AM_PANUPKEY: // pan up
+           if (!followplayer) m_paninc.y = FTOM(F_PANINC);
+           else rc = false;
+           break;
+         case AM_PANDOWNKEY: // pan down
+           if (!followplayer) m_paninc.y = -FTOM(F_PANINC);
+           else rc = false;
+           break;
+         case AM_ZOOMOUTKEY: // zoom out
+           mtof_zoommul = M_ZOOMOUT;
+           ftom_zoommul = M_ZOOMIN;
+           break;
+         case AM_ZOOMINKEY: // zoom in
+           mtof_zoommul = M_ZOOMIN;
+           ftom_zoommul = M_ZOOMOUT;
+           break;
+         case AM_ENDKEY:
+           bigstate = 0;
+           viewactive = true;
+           AM_Stop ();
+           break;
+         case AM_GOBIGKEY:
+           bigstate = !bigstate;
+           if (bigstate)
+           {
+               AM_saveScaleAndLoc();
+               AM_minOutWindowScale();
+           }
+           else AM_restoreScaleAndLoc();
+           break;
+         case AM_FOLLOWKEY:
+           followplayer = !followplayer;
+           f_oldloc.x = MAXINT;
+           plr->message = followplayer ? AMSTR_FOLLOWON : AMSTR_FOLLOWOFF;
+           break;
+         case AM_GRIDKEY:
+           grid = !grid;
+           plr->message = grid ? AMSTR_GRIDON : AMSTR_GRIDOFF;
+           break;
+         case AM_MARKKEY:
+           sprintf(buffer, "%s %d", AMSTR_MARKEDSPOT, markpointnum);
+           plr->message = buffer;
+           AM_addMark();
+           break;
+         case AM_CLEARMARKKEY:
+           AM_clearMarks();
+           plr->message = AMSTR_MARKSCLEARED;
+           break;
+         default:
+           cheatstate=0;
+           rc = false;
+       }
+       if (!deathmatch && cht_CheckCheat(&cheat_amap, ev->data1))
+       {
+           rc = false;
+           cheating = (cheating+1) % 3;
+       }
+    }
+
+    else if (ev->type == ev_keyup)
+    {
+       rc = false;
+       switch (ev->data1)
+       {
+         case AM_PANRIGHTKEY:
+           if (!followplayer) m_paninc.x = 0;
+           break;
+         case AM_PANLEFTKEY:
+           if (!followplayer) m_paninc.x = 0;
+           break;
+         case AM_PANUPKEY:
+           if (!followplayer) m_paninc.y = 0;
+           break;
+         case AM_PANDOWNKEY:
+           if (!followplayer) m_paninc.y = 0;
+           break;
+         case AM_ZOOMOUTKEY:
+         case AM_ZOOMINKEY:
+           mtof_zoommul = FRACUNIT;
+           ftom_zoommul = FRACUNIT;
+           break;
+       }
+    }
+
+    return rc;
+
+}
+
+
+//
+// Zooming
+//
+void AM_changeWindowScale(void)
+{
+
+    // Change the scaling multipliers
+    scale_mtof = FixedMul(scale_mtof, mtof_zoommul);
+    scale_ftom = FixedDiv(FRACUNIT, scale_mtof);
+
+    if (scale_mtof < min_scale_mtof)
+       AM_minOutWindowScale();
+    else if (scale_mtof > max_scale_mtof)
+       AM_maxOutWindowScale();
+    else
+       AM_activateNewScale();
+}
+
+
+//
+//
+//
+void AM_doFollowPlayer(void)
+{
+
+    if (f_oldloc.x != plr->mo->x || f_oldloc.y != plr->mo->y)
+    {
+       m_x = FTOM(MTOF(plr->mo->x)) - m_w/2;
+       m_y = FTOM(MTOF(plr->mo->y)) - m_h/2;
+       m_x2 = m_x + m_w;
+       m_y2 = m_y + m_h;
+       f_oldloc.x = plr->mo->x;
+       f_oldloc.y = plr->mo->y;
+
+       //  m_x = FTOM(MTOF(plr->mo->x - m_w/2));
+       //  m_y = FTOM(MTOF(plr->mo->y - m_h/2));
+       //  m_x = plr->mo->x - m_w/2;
+       //  m_y = plr->mo->y - m_h/2;
+
+    }
+
+}
+
+//
+//
+//
+void AM_updateLightLev(void)
+{
+    static nexttic = 0;
+    //static int litelevels[] = { 0, 3, 5, 6, 6, 7, 7, 7 };
+    static int litelevels[] = { 0, 4, 7, 10, 12, 14, 15, 15 };
+    static int litelevelscnt = 0;
+   
+    // Change light level
+    if (amclock>nexttic)
+    {
+       lightlev = litelevels[litelevelscnt++];
+       if (litelevelscnt == sizeof(litelevels)/sizeof(int)) litelevelscnt = 0;
+       nexttic = amclock + 6 - (amclock % 6);
+    }
+
+}
+
+
+//
+// Updates on Game Tick
+//
+void AM_Ticker (void)
+{
+
+    if (!automapactive)
+       return;
+
+    amclock++;
+
+    if (followplayer)
+       AM_doFollowPlayer();
+
+    // Change the zoom if necessary
+    if (ftom_zoommul != FRACUNIT)
+       AM_changeWindowScale();
+
+    // Change x,y location
+    if (m_paninc.x || m_paninc.y)
+       AM_changeWindowLoc();
+
+    // Update light level
+    // AM_updateLightLev();
+
+}
+
+
+//
+// Clear automap frame buffer.
+//
+void AM_clearFB(int color)
+{
+    memset(fb, color, f_w*f_h);
+}
+
+
+//
+// Automap clipping of lines.
+//
+// Based on Cohen-Sutherland clipping algorithm but with a slightly
+// faster reject and precalculated slopes.  If the speed is needed,
+// use a hash algorithm to handle  the common cases.
+//
+boolean
+AM_clipMline
+( mline_t*     ml,
+  fline_t*     fl )
+{
+    enum
+    {
+       LEFT    =1,
+       RIGHT   =2,
+       BOTTOM  =4,
+       TOP     =8
+    };
+    
+    register   outcode1 = 0;
+    register   outcode2 = 0;
+    register   outside;
+    
+    fpoint_t   tmp;
+    int                dx;
+    int                dy;
+
+    
+#define DOOUTCODE(oc, mx, my) \
+    (oc) = 0; \
+    if ((my) < 0) (oc) |= TOP; \
+    else if ((my) >= f_h) (oc) |= BOTTOM; \
+    if ((mx) < 0) (oc) |= LEFT; \
+    else if ((mx) >= f_w) (oc) |= RIGHT;
+
+    
+    // do trivial rejects and outcodes
+    if (ml->a.y > m_y2)
+       outcode1 = TOP;
+    else if (ml->a.y < m_y)
+       outcode1 = BOTTOM;
+
+    if (ml->b.y > m_y2)
+       outcode2 = TOP;
+    else if (ml->b.y < m_y)
+       outcode2 = BOTTOM;
+    
+    if (outcode1 & outcode2)
+       return false; // trivially outside
+
+    if (ml->a.x < m_x)
+       outcode1 |= LEFT;
+    else if (ml->a.x > m_x2)
+       outcode1 |= RIGHT;
+    
+    if (ml->b.x < m_x)
+       outcode2 |= LEFT;
+    else if (ml->b.x > m_x2)
+       outcode2 |= RIGHT;
+    
+    if (outcode1 & outcode2)
+       return false; // trivially outside
+
+    // transform to frame-buffer coordinates.
+    fl->a.x = CXMTOF(ml->a.x);
+    fl->a.y = CYMTOF(ml->a.y);
+    fl->b.x = CXMTOF(ml->b.x);
+    fl->b.y = CYMTOF(ml->b.y);
+
+    DOOUTCODE(outcode1, fl->a.x, fl->a.y);
+    DOOUTCODE(outcode2, fl->b.x, fl->b.y);
+
+    if (outcode1 & outcode2)
+       return false;
+
+    while (outcode1 | outcode2)
+    {
+       // may be partially inside box
+       // find an outside point
+       if (outcode1)
+           outside = outcode1;
+       else
+           outside = outcode2;
+       
+       // clip to each side
+       if (outside & TOP)
+       {
+           dy = fl->a.y - fl->b.y;
+           dx = fl->b.x - fl->a.x;
+           tmp.x = fl->a.x + (dx*(fl->a.y))/dy;
+           tmp.y = 0;
+       }
+       else if (outside & BOTTOM)
+       {
+           dy = fl->a.y - fl->b.y;
+           dx = fl->b.x - fl->a.x;
+           tmp.x = fl->a.x + (dx*(fl->a.y-f_h))/dy;
+           tmp.y = f_h-1;
+       }
+       else if (outside & RIGHT)
+       {
+           dy = fl->b.y - fl->a.y;
+           dx = fl->b.x - fl->a.x;
+           tmp.y = fl->a.y + (dy*(f_w-1 - fl->a.x))/dx;
+           tmp.x = f_w-1;
+       }
+       else if (outside & LEFT)
+       {
+           dy = fl->b.y - fl->a.y;
+           dx = fl->b.x - fl->a.x;
+           tmp.y = fl->a.y + (dy*(-fl->a.x))/dx;
+           tmp.x = 0;
+       }
+
+       if (outside == outcode1)
+       {
+           fl->a = tmp;
+           DOOUTCODE(outcode1, fl->a.x, fl->a.y);
+       }
+       else
+       {
+           fl->b = tmp;
+           DOOUTCODE(outcode2, fl->b.x, fl->b.y);
+       }
+       
+       if (outcode1 & outcode2)
+           return false; // trivially outside
+    }
+
+    return true;
+}
+#undef DOOUTCODE
+
+
+//
+// Classic Bresenham w/ whatever optimizations needed for speed
+//
+void
+AM_drawFline
+( fline_t*     fl,
+  int          color )
+{
+    register int x;
+    register int y;
+    register int dx;
+    register int dy;
+    register int sx;
+    register int sy;
+    register int ax;
+    register int ay;
+    register int d;
+    
+    static fuck = 0;
+
+    // For debugging only
+    if (      fl->a.x < 0 || fl->a.x >= f_w
+          || fl->a.y < 0 || fl->a.y >= f_h
+          || fl->b.x < 0 || fl->b.x >= f_w
+          || fl->b.y < 0 || fl->b.y >= f_h)
+    {
+       fprintf(stderr, "fuck %d \r", fuck++);
+       return;
+    }
+
+#define PUTDOT(xx,yy,cc) fb[(yy)*f_w+(xx)]=(cc)
+
+    dx = fl->b.x - fl->a.x;
+    ax = 2 * (dx<0 ? -dx : dx);
+    sx = dx<0 ? -1 : 1;
+
+    dy = fl->b.y - fl->a.y;
+    ay = 2 * (dy<0 ? -dy : dy);
+    sy = dy<0 ? -1 : 1;
+
+    x = fl->a.x;
+    y = fl->a.y;
+
+    if (ax > ay)
+    {
+       d = ay - ax/2;
+       while (1)
+       {
+           PUTDOT(x,y,color);
+           if (x == fl->b.x) return;
+           if (d>=0)
+           {
+               y += sy;
+               d -= ax;
+           }
+           x += sx;
+           d += ay;
+       }
+    }
+    else
+    {
+       d = ax - ay/2;
+       while (1)
+       {
+           PUTDOT(x, y, color);
+           if (y == fl->b.y) return;
+           if (d >= 0)
+           {
+               x += sx;
+               d -= ay;
+           }
+           y += sy;
+           d += ax;
+       }
+    }
+}
+
+
+//
+// Clip lines, draw visible part sof lines.
+//
+void
+AM_drawMline
+( mline_t*     ml,
+  int          color )
+{
+    static fline_t fl;
+
+    if (AM_clipMline(ml, &fl))
+       AM_drawFline(&fl, color); // draws it on frame buffer using fb coords
+}
+
+
+
+//
+// Draws flat (floor/ceiling tile) aligned grid lines.
+//
+void AM_drawGrid(int color)
+{
+    fixed_t x, y;
+    fixed_t start, end;
+    mline_t ml;
+
+    // Figure out start of vertical gridlines
+    start = m_x;
+    if ((start-bmaporgx)%(MAPBLOCKUNITS<<FRACBITS))
+       start += (MAPBLOCKUNITS<<FRACBITS)
+           - ((start-bmaporgx)%(MAPBLOCKUNITS<<FRACBITS));
+    end = m_x + m_w;
+
+    // draw vertical gridlines
+    ml.a.y = m_y;
+    ml.b.y = m_y+m_h;
+    for (x=start; x<end; x+=(MAPBLOCKUNITS<<FRACBITS))
+    {
+       ml.a.x = x;
+       ml.b.x = x;
+       AM_drawMline(&ml, color);
+    }
+
+    // Figure out start of horizontal gridlines
+    start = m_y;
+    if ((start-bmaporgy)%(MAPBLOCKUNITS<<FRACBITS))
+       start += (MAPBLOCKUNITS<<FRACBITS)
+           - ((start-bmaporgy)%(MAPBLOCKUNITS<<FRACBITS));
+    end = m_y + m_h;
+
+    // draw horizontal gridlines
+    ml.a.x = m_x;
+    ml.b.x = m_x + m_w;
+    for (y=start; y<end; y+=(MAPBLOCKUNITS<<FRACBITS))
+    {
+       ml.a.y = y;
+       ml.b.y = y;
+       AM_drawMline(&ml, color);
+    }
+
+}
+
+//
+// Determines visible lines, draws them.
+// This is LineDef based, not LineSeg based.
+//
+void AM_drawWalls(void)
+{
+    int i;
+    static mline_t l;
+
+    for (i=0;i<numlines;i++)
+    {
+       l.a.x = lines[i].v1->x;
+       l.a.y = lines[i].v1->y;
+       l.b.x = lines[i].v2->x;
+       l.b.y = lines[i].v2->y;
+       if (cheating || (lines[i].flags & ML_MAPPED))
+       {
+           if ((lines[i].flags & LINE_NEVERSEE) && !cheating)
+               continue;
+           if (!lines[i].backsector)
+           {
+               AM_drawMline(&l, WALLCOLORS+lightlev);
+           }
+           else
+           {
+               if (lines[i].special == 39)
+               { // teleporters
+                   AM_drawMline(&l, WALLCOLORS+WALLRANGE/2);
+               }
+               else if (lines[i].flags & ML_SECRET) // secret door
+               {
+                   if (cheating) AM_drawMline(&l, SECRETWALLCOLORS + lightlev);
+                   else AM_drawMline(&l, WALLCOLORS+lightlev);
+               }
+               else if (lines[i].backsector->floorheight
+                          != lines[i].frontsector->floorheight) {
+                   AM_drawMline(&l, FDWALLCOLORS + lightlev); // floor level change
+               }
+               else if (lines[i].backsector->ceilingheight
+                          != lines[i].frontsector->ceilingheight) {
+                   AM_drawMline(&l, CDWALLCOLORS+lightlev); // ceiling level change
+               }
+               else if (cheating) {
+                   AM_drawMline(&l, TSWALLCOLORS+lightlev);
+               }
+           }
+       }
+       else if (plr->powers[pw_allmap])
+       {
+           if (!(lines[i].flags & LINE_NEVERSEE)) AM_drawMline(&l, GRAYS+3);
+       }
+    }
+}
+
+
+//
+// Rotation in 2D.
+// Used to rotate player arrow line character.
+//
+void
+AM_rotate
+( fixed_t*     x,
+  fixed_t*     y,
+  angle_t      a )
+{
+    fixed_t tmpx;
+
+    tmpx =
+       FixedMul(*x,finecosine[a>>ANGLETOFINESHIFT])
+       - FixedMul(*y,finesine[a>>ANGLETOFINESHIFT]);
+    
+    *y   =
+       FixedMul(*x,finesine[a>>ANGLETOFINESHIFT])
+       + FixedMul(*y,finecosine[a>>ANGLETOFINESHIFT]);
+
+    *x = tmpx;
+}
+
+void
+AM_drawLineCharacter
+( mline_t*     lineguy,
+  int          lineguylines,
+  fixed_t      scale,
+  angle_t      angle,
+  int          color,
+  fixed_t      x,
+  fixed_t      y )
+{
+    int                i;
+    mline_t    l;
+
+    for (i=0;i<lineguylines;i++)
+    {
+       l.a.x = lineguy[i].a.x;
+       l.a.y = lineguy[i].a.y;
+
+       if (scale)
+       {
+           l.a.x = FixedMul(scale, l.a.x);
+           l.a.y = FixedMul(scale, l.a.y);
+       }
+
+       if (angle)
+           AM_rotate(&l.a.x, &l.a.y, angle);
+
+       l.a.x += x;
+       l.a.y += y;
+
+       l.b.x = lineguy[i].b.x;
+       l.b.y = lineguy[i].b.y;
+
+       if (scale)
+       {
+           l.b.x = FixedMul(scale, l.b.x);
+           l.b.y = FixedMul(scale, l.b.y);
+       }
+
+       if (angle)
+           AM_rotate(&l.b.x, &l.b.y, angle);
+       
+       l.b.x += x;
+       l.b.y += y;
+
+       AM_drawMline(&l, color);
+    }
+}
+
+void AM_drawPlayers(void)
+{
+    int                i;
+    player_t*  p;
+    static int         their_colors[] = { GREENS, GRAYS, BROWNS, REDS };
+    int                their_color = -1;
+    int                color;
+
+    if (!netgame)
+    {
+       if (cheating)
+           AM_drawLineCharacter
+               (cheat_player_arrow, NUMCHEATPLYRLINES, 0,
+                plr->mo->angle, WHITE, plr->mo->x, plr->mo->y);
+       else
+           AM_drawLineCharacter
+               (player_arrow, NUMPLYRLINES, 0, plr->mo->angle,
+                WHITE, plr->mo->x, plr->mo->y);
+       return;
+    }
+
+    for (i=0;i<MAXPLAYERS;i++)
+    {
+       their_color++;
+       p = &players[i];
+
+       if ( (deathmatch && !singledemo) && p != plr)
+           continue;
+
+       if (!playeringame[i])
+           continue;
+
+       if (p->powers[pw_invisibility])
+           color = 246; // *close* to black
+       else
+           color = their_colors[their_color];
+       
+       AM_drawLineCharacter
+           (player_arrow, NUMPLYRLINES, 0, p->mo->angle,
+            color, p->mo->x, p->mo->y);
+    }
+
+}
+
+void
+AM_drawThings
+( int  colors,
+  int  colorrange)
+{
+    int                i;
+    mobj_t*    t;
+
+    for (i=0;i<numsectors;i++)
+    {
+       t = sectors[i].thinglist;
+       while (t)
+       {
+           AM_drawLineCharacter
+               (thintriangle_guy, NUMTHINTRIANGLEGUYLINES,
+                16<<FRACBITS, t->angle, colors+lightlev, t->x, t->y);
+           t = t->snext;
+       }
+    }
+}
+
+void AM_drawMarks(void)
+{
+    int i, fx, fy, w, h;
+
+    for (i=0;i<AM_NUMMARKPOINTS;i++)
+    {
+       if (markpoints[i].x != -1)
+       {
+           //      w = SHORT(marknums[i]->width);
+           //      h = SHORT(marknums[i]->height);
+           w = 5; // because something's wrong with the wad, i guess
+           h = 6; // because something's wrong with the wad, i guess
+           fx = CXMTOF(markpoints[i].x);
+           fy = CYMTOF(markpoints[i].y);
+           if (fx >= f_x && fx <= f_w - w && fy >= f_y && fy <= f_h - h)
+               V_DrawPatch(fx, fy, FB, marknums[i]);
+       }
+    }
+
+}
+
+void AM_drawCrosshair(int color)
+{
+    fb[(f_w*(f_h+1))/2] = color; // single point for now
+
+}
+
+void AM_Drawer (void)
+{
+    if (!automapactive) return;
+
+    AM_clearFB(BACKGROUND);
+    if (grid)
+       AM_drawGrid(GRIDCOLORS);
+    AM_drawWalls();
+    AM_drawPlayers();
+    if (cheating==2)
+       AM_drawThings(THINGCOLORS, THINGRANGE);
+    AM_drawCrosshair(XHAIRCOLORS);
+
+    AM_drawMarks();
+
+    V_MarkRect(f_x, f_y, f_w, f_h);
+
+}
diff --git a/linuxdoom-1.10/am_map.h b/linuxdoom-1.10/am_map.h
new file mode 100644 (file)
index 0000000..ff2e0b4
--- /dev/null
@@ -0,0 +1,52 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// DESCRIPTION:
+//  AutoMap module.
+//
+//-----------------------------------------------------------------------------
+
+#ifndef __AMMAP_H__
+#define __AMMAP_H__
+
+// Used by ST StatusBar stuff.
+#define AM_MSGHEADER (('a'<<24)+('m'<<16))
+#define AM_MSGENTERED (AM_MSGHEADER | ('e'<<8))
+#define AM_MSGEXITED (AM_MSGHEADER | ('x'<<8))
+
+
+// Called by main loop.
+boolean AM_Responder (event_t* ev);
+
+// Called by main loop.
+void AM_Ticker (void);
+
+// Called by main loop,
+// called instead of view drawer if automap active.
+void AM_Drawer (void);
+
+// Called to force the automap to quit
+// if the level is completed while it is up.
+void AM_Stop (void);
+
+
+
+#endif
+//-----------------------------------------------------------------------------
+//
+// $Log:$
+//
+//-----------------------------------------------------------------------------
diff --git a/linuxdoom-1.10/d_englsh.h b/linuxdoom-1.10/d_englsh.h
new file mode 100644 (file)
index 0000000..c0b0786
--- /dev/null
@@ -0,0 +1,701 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// DESCRIPTION:
+//     Printed strings for translation.
+//     English language support (default).
+//
+//-----------------------------------------------------------------------------
+
+#ifndef __D_ENGLSH__
+#define __D_ENGLSH__
+
+//
+//     Printed strings for translation
+//
+
+//
+// D_Main.C
+//
+#define D_DEVSTR       "Development mode ON.\n"
+#define D_CDROM        "CD-ROM Version: default.cfg from c:\\doomdata\n"
+
+//
+//     M_Menu.C
+//
+#define PRESSKEY       "press a key."
+#define PRESSYN        "press y or n."
+#define QUITMSG        "are you sure you want to\nquit this great game?"
+#define LOADNET        "you can't do load while in a net game!\n\n"PRESSKEY
+#define QLOADNET       "you can't quickload during a netgame!\n\n"PRESSKEY
+#define QSAVESPOT      "you haven't picked a quicksave slot yet!\n\n"PRESSKEY
+#define SAVEDEAD       "you can't save if you aren't playing!\n\n"PRESSKEY
+#define QSPROMPT       "quicksave over your game named\n\n'%s'?\n\n"PRESSYN
+#define QLPROMPT       "do you want to quickload the game named\n\n'%s'?\n\n"PRESSYN
+
+#define NEWGAME        \
+"you can't start a new game\n"\
+"while in a network game.\n\n"PRESSKEY
+
+#define NIGHTMARE      \
+"are you sure? this skill level\n"\
+"isn't even remotely fair.\n\n"PRESSYN
+
+#define SWSTRING       \
+"this is the shareware version of doom.\n\n"\
+"you need to order the entire trilogy.\n\n"PRESSKEY
+
+#define MSGOFF "Messages OFF"
+#define MSGON          "Messages ON"
+#define NETEND "you can't end a netgame!\n\n"PRESSKEY
+#define ENDGAME        "are you sure you want to end the game?\n\n"PRESSYN
+
+#define DOSY           "(press y to quit)"
+
+#define DETAILHI       "High detail"
+#define DETAILLO       "Low detail"
+#define GAMMALVL0      "Gamma correction OFF"
+#define GAMMALVL1      "Gamma correction level 1"
+#define GAMMALVL2      "Gamma correction level 2"
+#define GAMMALVL3      "Gamma correction level 3"
+#define GAMMALVL4      "Gamma correction level 4"
+#define EMPTYSTRING    "empty slot"
+
+//
+//     P_inter.C
+//
+#define GOTARMOR       "Picked up the armor."
+#define GOTMEGA        "Picked up the MegaArmor!"
+#define GOTHTHBONUS    "Picked up a health bonus."
+#define GOTARMBONUS    "Picked up an armor bonus."
+#define GOTSTIM        "Picked up a stimpack."
+#define GOTMEDINEED    "Picked up a medikit that you REALLY need!"
+#define GOTMEDIKIT     "Picked up a medikit."
+#define GOTSUPER       "Supercharge!"
+
+#define GOTBLUECARD    "Picked up a blue keycard."
+#define GOTYELWCARD    "Picked up a yellow keycard."
+#define GOTREDCARD     "Picked up a red keycard."
+#define GOTBLUESKUL    "Picked up a blue skull key."
+#define GOTYELWSKUL    "Picked up a yellow skull key."
+#define GOTREDSKULL    "Picked up a red skull key."
+
+#define GOTINVUL       "Invulnerability!"
+#define GOTBERSERK     "Berserk!"
+#define GOTINVIS       "Partial Invisibility"
+#define GOTSUIT        "Radiation Shielding Suit"
+#define GOTMAP "Computer Area Map"
+#define GOTVISOR       "Light Amplification Visor"
+#define GOTMSPHERE     "MegaSphere!"
+
+#define GOTCLIP        "Picked up a clip."
+#define GOTCLIPBOX     "Picked up a box of bullets."
+#define GOTROCKET      "Picked up a rocket."
+#define GOTROCKBOX     "Picked up a box of rockets."
+#define GOTCELL        "Picked up an energy cell."
+#define GOTCELLBOX     "Picked up an energy cell pack."
+#define GOTSHELLS      "Picked up 4 shotgun shells."
+#define GOTSHELLBOX    "Picked up a box of shotgun shells."
+#define GOTBACKPACK    "Picked up a backpack full of ammo!"
+
+#define GOTBFG9000     "You got the BFG9000!  Oh, yes."
+#define GOTCHAINGUN    "You got the chaingun!"
+#define GOTCHAINSAW    "A chainsaw!  Find some meat!"
+#define GOTLAUNCHER    "You got the rocket launcher!"
+#define GOTPLASMA      "You got the plasma gun!"
+#define GOTSHOTGUN     "You got the shotgun!"
+#define GOTSHOTGUN2    "You got the super shotgun!"
+
+//
+// P_Doors.C
+//
+#define PD_BLUEO       "You need a blue key to activate this object"
+#define PD_REDO        "You need a red key to activate this object"
+#define PD_YELLOWO     "You need a yellow key to activate this object"
+#define PD_BLUEK       "You need a blue key to open this door"
+#define PD_REDK        "You need a red key to open this door"
+#define PD_YELLOWK     "You need a yellow key to open this door"
+
+//
+//     G_game.C
+//
+#define GGSAVED        "game saved."
+
+//
+//     HU_stuff.C
+//
+#define HUSTR_MSGU     "[Message unsent]"
+
+#define HUSTR_E1M1     "E1M1: Hangar"
+#define HUSTR_E1M2     "E1M2: Nuclear Plant"
+#define HUSTR_E1M3     "E1M3: Toxin Refinery"
+#define HUSTR_E1M4     "E1M4: Command Control"
+#define HUSTR_E1M5     "E1M5: Phobos Lab"
+#define HUSTR_E1M6     "E1M6: Central Processing"
+#define HUSTR_E1M7     "E1M7: Computer Station"
+#define HUSTR_E1M8     "E1M8: Phobos Anomaly"
+#define HUSTR_E1M9     "E1M9: Military Base"
+
+#define HUSTR_E2M1     "E2M1: Deimos Anomaly"
+#define HUSTR_E2M2     "E2M2: Containment Area"
+#define HUSTR_E2M3     "E2M3: Refinery"
+#define HUSTR_E2M4     "E2M4: Deimos Lab"
+#define HUSTR_E2M5     "E2M5: Command Center"
+#define HUSTR_E2M6     "E2M6: Halls of the Damned"
+#define HUSTR_E2M7     "E2M7: Spawning Vats"
+#define HUSTR_E2M8     "E2M8: Tower of Babel"
+#define HUSTR_E2M9     "E2M9: Fortress of Mystery"
+
+#define HUSTR_E3M1     "E3M1: Hell Keep"
+#define HUSTR_E3M2     "E3M2: Slough of Despair"
+#define HUSTR_E3M3     "E3M3: Pandemonium"
+#define HUSTR_E3M4     "E3M4: House of Pain"
+#define HUSTR_E3M5     "E3M5: Unholy Cathedral"
+#define HUSTR_E3M6     "E3M6: Mt. Erebus"
+#define HUSTR_E3M7     "E3M7: Limbo"
+#define HUSTR_E3M8     "E3M8: Dis"
+#define HUSTR_E3M9     "E3M9: Warrens"
+
+#define HUSTR_E4M1     "E4M1: Hell Beneath"
+#define HUSTR_E4M2     "E4M2: Perfect Hatred"
+#define HUSTR_E4M3     "E4M3: Sever The Wicked"
+#define HUSTR_E4M4     "E4M4: Unruly Evil"
+#define HUSTR_E4M5     "E4M5: They Will Repent"
+#define HUSTR_E4M6     "E4M6: Against Thee Wickedly"
+#define HUSTR_E4M7     "E4M7: And Hell Followed"
+#define HUSTR_E4M8     "E4M8: Unto The Cruel"
+#define HUSTR_E4M9     "E4M9: Fear"
+
+#define HUSTR_1        "level 1: entryway"
+#define HUSTR_2        "level 2: underhalls"
+#define HUSTR_3        "level 3: the gantlet"
+#define HUSTR_4        "level 4: the focus"
+#define HUSTR_5        "level 5: the waste tunnels"
+#define HUSTR_6        "level 6: the crusher"
+#define HUSTR_7        "level 7: dead simple"
+#define HUSTR_8        "level 8: tricks and traps"
+#define HUSTR_9        "level 9: the pit"
+#define HUSTR_10       "level 10: refueling base"
+#define HUSTR_11       "level 11: 'o' of destruction!"
+
+#define HUSTR_12       "level 12: the factory"
+#define HUSTR_13       "level 13: downtown"
+#define HUSTR_14       "level 14: the inmost dens"
+#define HUSTR_15       "level 15: industrial zone"
+#define HUSTR_16       "level 16: suburbs"
+#define HUSTR_17       "level 17: tenements"
+#define HUSTR_18       "level 18: the courtyard"
+#define HUSTR_19       "level 19: the citadel"
+#define HUSTR_20       "level 20: gotcha!"
+
+#define HUSTR_21       "level 21: nirvana"
+#define HUSTR_22       "level 22: the catacombs"
+#define HUSTR_23       "level 23: barrels o' fun"
+#define HUSTR_24       "level 24: the chasm"
+#define HUSTR_25       "level 25: bloodfalls"
+#define HUSTR_26       "level 26: the abandoned mines"
+#define HUSTR_27       "level 27: monster condo"
+#define HUSTR_28       "level 28: the spirit world"
+#define HUSTR_29       "level 29: the living end"
+#define HUSTR_30       "level 30: icon of sin"
+
+#define HUSTR_31       "level 31: wolfenstein"
+#define HUSTR_32       "level 32: grosse"
+
+#define PHUSTR_1       "level 1: congo"
+#define PHUSTR_2       "level 2: well of souls"
+#define PHUSTR_3       "level 3: aztec"
+#define PHUSTR_4       "level 4: caged"
+#define PHUSTR_5       "level 5: ghost town"
+#define PHUSTR_6       "level 6: baron's lair"
+#define PHUSTR_7       "level 7: caughtyard"
+#define PHUSTR_8       "level 8: realm"
+#define PHUSTR_9       "level 9: abattoire"
+#define PHUSTR_10      "level 10: onslaught"
+#define PHUSTR_11      "level 11: hunted"
+
+#define PHUSTR_12      "level 12: speed"
+#define PHUSTR_13      "level 13: the crypt"
+#define PHUSTR_14      "level 14: genesis"
+#define PHUSTR_15      "level 15: the twilight"
+#define PHUSTR_16      "level 16: the omen"
+#define PHUSTR_17      "level 17: compound"
+#define PHUSTR_18      "level 18: neurosphere"
+#define PHUSTR_19      "level 19: nme"
+#define PHUSTR_20      "level 20: the death domain"
+
+#define PHUSTR_21      "level 21: slayer"
+#define PHUSTR_22      "level 22: impossible mission"
+#define PHUSTR_23      "level 23: tombstone"
+#define PHUSTR_24      "level 24: the final frontier"
+#define PHUSTR_25      "level 25: the temple of darkness"
+#define PHUSTR_26      "level 26: bunker"
+#define PHUSTR_27      "level 27: anti-christ"
+#define PHUSTR_28      "level 28: the sewers"
+#define PHUSTR_29      "level 29: odyssey of noises"
+#define PHUSTR_30      "level 30: the gateway of hell"
+
+#define PHUSTR_31      "level 31: cyberden"
+#define PHUSTR_32      "level 32: go 2 it"
+
+#define THUSTR_1       "level 1: system control"
+#define THUSTR_2       "level 2: human bbq"
+#define THUSTR_3       "level 3: power control"
+#define THUSTR_4       "level 4: wormhole"
+#define THUSTR_5       "level 5: hanger"
+#define THUSTR_6       "level 6: open season"
+#define THUSTR_7       "level 7: prison"
+#define THUSTR_8       "level 8: metal"
+#define THUSTR_9       "level 9: stronghold"
+#define THUSTR_10      "level 10: redemption"
+#define THUSTR_11      "level 11: storage facility"
+
+#define THUSTR_12      "level 12: crater"
+#define THUSTR_13      "level 13: nukage processing"
+#define THUSTR_14      "level 14: steel works"
+#define THUSTR_15      "level 15: dead zone"
+#define THUSTR_16      "level 16: deepest reaches"
+#define THUSTR_17      "level 17: processing area"
+#define THUSTR_18      "level 18: mill"
+#define THUSTR_19      "level 19: shipping/respawning"
+#define THUSTR_20      "level 20: central processing"
+
+#define THUSTR_21      "level 21: administration center"
+#define THUSTR_22      "level 22: habitat"
+#define THUSTR_23      "level 23: lunar mining project"
+#define THUSTR_24      "level 24: quarry"
+#define THUSTR_25      "level 25: baron's den"
+#define THUSTR_26      "level 26: ballistyx"
+#define THUSTR_27      "level 27: mount pain"
+#define THUSTR_28      "level 28: heck"
+#define THUSTR_29      "level 29: river styx"
+#define THUSTR_30      "level 30: last call"
+
+#define THUSTR_31      "level 31: pharaoh"
+#define THUSTR_32      "level 32: caribbean"
+
+#define HUSTR_CHATMACRO1       "I'm ready to kick butt!"
+#define HUSTR_CHATMACRO2       "I'm OK."
+#define HUSTR_CHATMACRO3       "I'm not looking too good!"
+#define HUSTR_CHATMACRO4       "Help!"
+#define HUSTR_CHATMACRO5       "You suck!"
+#define HUSTR_CHATMACRO6       "Next time, scumbag..."
+#define HUSTR_CHATMACRO7       "Come here!"
+#define HUSTR_CHATMACRO8       "I'll take care of it."
+#define HUSTR_CHATMACRO9       "Yes"
+#define HUSTR_CHATMACRO0       "No"
+
+#define HUSTR_TALKTOSELF1      "You mumble to yourself"
+#define HUSTR_TALKTOSELF2      "Who's there?"
+#define HUSTR_TALKTOSELF3      "You scare yourself"
+#define HUSTR_TALKTOSELF4      "You start to rave"
+#define HUSTR_TALKTOSELF5      "You've lost it..."
+
+#define HUSTR_MESSAGESENT      "[Message Sent]"
+
+// The following should NOT be changed unless it seems
+// just AWFULLY necessary
+
+#define HUSTR_PLRGREEN "Green: "
+#define HUSTR_PLRINDIGO        "Indigo: "
+#define HUSTR_PLRBROWN "Brown: "
+#define HUSTR_PLRRED           "Red: "
+
+#define HUSTR_KEYGREEN 'g'
+#define HUSTR_KEYINDIGO        'i'
+#define HUSTR_KEYBROWN 'b'
+#define HUSTR_KEYRED   'r'
+
+//
+//     AM_map.C
+//
+
+#define AMSTR_FOLLOWON "Follow Mode ON"
+#define AMSTR_FOLLOWOFF        "Follow Mode OFF"
+
+#define AMSTR_GRIDON   "Grid ON"
+#define AMSTR_GRIDOFF  "Grid OFF"
+
+#define AMSTR_MARKEDSPOT       "Marked Spot"
+#define AMSTR_MARKSCLEARED     "All Marks Cleared"
+
+//
+//     ST_stuff.C
+//
+
+#define STSTR_MUS              "Music Change"
+#define STSTR_NOMUS            "IMPOSSIBLE SELECTION"
+#define STSTR_DQDON            "Degreelessness Mode On"
+#define STSTR_DQDOFF   "Degreelessness Mode Off"
+
+#define STSTR_KFAADDED "Very Happy Ammo Added"
+#define STSTR_FAADDED  "Ammo (no keys) Added"
+
+#define STSTR_NCON             "No Clipping Mode ON"
+#define STSTR_NCOFF            "No Clipping Mode OFF"
+
+#define STSTR_BEHOLD   "inVuln, Str, Inviso, Rad, Allmap, or Lite-amp"
+#define STSTR_BEHOLDX  "Power-up Toggled"
+
+#define STSTR_CHOPPERS "... doesn't suck - GM"
+#define STSTR_CLEV             "Changing Level..."
+
+//
+//     F_Finale.C
+//
+#define E1TEXT \
+"Once you beat the big badasses and\n"\
+"clean out the moon base you're supposed\n"\
+"to win, aren't you? Aren't you? Where's\n"\
+"your fat reward and ticket home? What\n"\
+"the hell is this? It's not supposed to\n"\
+"end this way!\n"\
+"\n" \
+"It stinks like rotten meat, but looks\n"\
+"like the lost Deimos base.  Looks like\n"\
+"you're stuck on The Shores of Hell.\n"\
+"The only way out is through.\n"\
+"\n"\
+"To continue the DOOM experience, play\n"\
+"The Shores of Hell and its amazing\n"\
+"sequel, Inferno!\n"
+
+
+#define E2TEXT \
+"You've done it! The hideous cyber-\n"\
+"demon lord that ruled the lost Deimos\n"\
+"moon base has been slain and you\n"\
+"are triumphant! But ... where are\n"\
+"you? You clamber to the edge of the\n"\
+"moon and look down to see the awful\n"\
+"truth.\n" \
+"\n"\
+"Deimos floats above Hell itself!\n"\
+"You've never heard of anyone escaping\n"\
+"from Hell, but you'll make the bastards\n"\
+"sorry they ever heard of you! Quickly,\n"\
+"you rappel down to  the surface of\n"\
+"Hell.\n"\
+"\n" \
+"Now, it's on to the final chapter of\n"\
+"DOOM! -- Inferno."
+
+
+#define E3TEXT \
+"The loathsome spiderdemon that\n"\
+"masterminded the invasion of the moon\n"\
+"bases and caused so much death has had\n"\
+"its ass kicked for all time.\n"\
+"\n"\
+"A hidden doorway opens and you enter.\n"\
+"You've proven too tough for Hell to\n"\
+"contain, and now Hell at last plays\n"\
+"fair -- for you emerge from the door\n"\
+"to see the green fields of Earth!\n"\
+"Home at last.\n" \
+"\n"\
+"You wonder what's been happening on\n"\
+"Earth while you were battling evil\n"\
+"unleashed. It's good that no Hell-\n"\
+"spawn could have come through that\n"\
+"door with you ..."
+
+
+#define E4TEXT \
+"the spider mastermind must have sent forth\n"\
+"its legions of hellspawn before your\n"\
+"final confrontation with that terrible\n"\
+"beast from hell.  but you stepped forward\n"\
+"and brought forth eternal damnation and\n"\
+"suffering upon the horde as a true hero\n"\
+"would in the face of something so evil.\n"\
+"\n"\
+"besides, someone was gonna pay for what\n"\
+"happened to daisy, your pet rabbit.\n"\
+"\n"\
+"but now, you see spread before you more\n"\
+"potential pain and gibbitude as a nation\n"\
+"of demons run amok among our cities.\n"\
+"\n"\
+"next stop, hell on earth!"
+
+
+// after level 6, put this:
+
+#define C1TEXT \
+"YOU HAVE ENTERED DEEPLY INTO THE INFESTED\n" \
+"STARPORT. BUT SOMETHING IS WRONG. THE\n" \
+"MONSTERS HAVE BROUGHT THEIR OWN REALITY\n" \
+"WITH THEM, AND THE STARPORT'S TECHNOLOGY\n" \
+"IS BEING SUBVERTED BY THEIR PRESENCE.\n" \
+"\n"\
+"AHEAD, YOU SEE AN OUTPOST OF HELL, A\n" \
+"FORTIFIED ZONE. IF YOU CAN GET PAST IT,\n" \
+"YOU CAN PENETRATE INTO THE HAUNTED HEART\n" \
+"OF THE STARBASE AND FIND THE CONTROLLING\n" \
+"SWITCH WHICH HOLDS EARTH'S POPULATION\n" \
+"HOSTAGE."
+
+// After level 11, put this:
+
+#define C2TEXT \
+"YOU HAVE WON! YOUR VICTORY HAS ENABLED\n" \
+"HUMANKIND TO EVACUATE EARTH AND ESCAPE\n"\
+"THE NIGHTMARE.  NOW YOU ARE THE ONLY\n"\
+"HUMAN LEFT ON THE FACE OF THE PLANET.\n"\
+"CANNIBAL MUTATIONS, CARNIVOROUS ALIENS,\n"\
+"AND EVIL SPIRITS ARE YOUR ONLY NEIGHBORS.\n"\
+"YOU SIT BACK AND WAIT FOR DEATH, CONTENT\n"\
+"THAT YOU HAVE SAVED YOUR SPECIES.\n"\
+"\n"\
+"BUT THEN, EARTH CONTROL BEAMS DOWN A\n"\
+"MESSAGE FROM SPACE: \"SENSORS HAVE LOCATED\n"\
+"THE SOURCE OF THE ALIEN INVASION. IF YOU\n"\
+"GO THERE, YOU MAY BE ABLE TO BLOCK THEIR\n"\
+"ENTRY.  THE ALIEN BASE IS IN THE HEART OF\n"\
+"YOUR OWN HOME CITY, NOT FAR FROM THE\n"\
+"STARPORT.\" SLOWLY AND PAINFULLY YOU GET\n"\
+"UP AND RETURN TO THE FRAY."
+
+
+// After level 20, put this:
+
+#define C3TEXT \
+"YOU ARE AT THE CORRUPT HEART OF THE CITY,\n"\
+"SURROUNDED BY THE CORPSES OF YOUR ENEMIES.\n"\
+"YOU SEE NO WAY TO DESTROY THE CREATURES'\n"\
+"ENTRYWAY ON THIS SIDE, SO YOU CLENCH YOUR\n"\
+"TEETH AND PLUNGE THROUGH IT.\n"\
+"\n"\
+"THERE MUST BE A WAY TO CLOSE IT ON THE\n"\
+"OTHER SIDE. WHAT DO YOU CARE IF YOU'VE\n"\
+"GOT TO GO THROUGH HELL TO GET TO IT?"
+
+
+// After level 29, put this:
+
+#define C4TEXT \
+"THE HORRENDOUS VISAGE OF THE BIGGEST\n"\
+"DEMON YOU'VE EVER SEEN CRUMBLES BEFORE\n"\
+"YOU, AFTER YOU PUMP YOUR ROCKETS INTO\n"\
+"HIS EXPOSED BRAIN. THE MONSTER SHRIVELS\n"\
+"UP AND DIES, ITS THRASHING LIMBS\n"\
+"DEVASTATING UNTOLD MILES OF HELL'S\n"\
+"SURFACE.\n"\
+"\n"\
+"YOU'VE DONE IT. THE INVASION IS OVER.\n"\
+"EARTH IS SAVED. HELL IS A WRECK. YOU\n"\
+"WONDER WHERE BAD FOLKS WILL GO WHEN THEY\n"\
+"DIE, NOW. WIPING THE SWEAT FROM YOUR\n"\
+"FOREHEAD YOU BEGIN THE LONG TREK BACK\n"\
+"HOME. REBUILDING EARTH OUGHT TO BE A\n"\
+"LOT MORE FUN THAN RUINING IT WAS.\n"
+
+
+
+// Before level 31, put this:
+
+#define C5TEXT \
+"CONGRATULATIONS, YOU'VE FOUND THE SECRET\n"\
+"LEVEL! LOOKS LIKE IT'S BEEN BUILT BY\n"\
+"HUMANS, RATHER THAN DEMONS. YOU WONDER\n"\
+"WHO THE INMATES OF THIS CORNER OF HELL\n"\
+"WILL BE."
+
+
+// Before level 32, put this:
+
+#define C6TEXT \
+"CONGRATULATIONS, YOU'VE FOUND THE\n"\
+"SUPER SECRET LEVEL!  YOU'D BETTER\n"\
+"BLAZE THROUGH THIS ONE!\n"
+
+
+// after map 06        
+
+#define P1TEXT  \
+"You gloat over the steaming carcass of the\n"\
+"Guardian.  With its death, you've wrested\n"\
+"the Accelerator from the stinking claws\n"\
+"of Hell.  You relax and glance around the\n"\
+"room.  Damn!  There was supposed to be at\n"\
+"least one working prototype, but you can't\n"\
+"see it. The demons must have taken it.\n"\
+"\n"\
+"You must find the prototype, or all your\n"\
+"struggles will have been wasted. Keep\n"\
+"moving, keep fighting, keep killing.\n"\
+"Oh yes, keep living, too."
+
+
+// after map 11
+
+#define P2TEXT \
+"Even the deadly Arch-Vile labyrinth could\n"\
+"not stop you, and you've gotten to the\n"\
+"prototype Accelerator which is soon\n"\
+"efficiently and permanently deactivated.\n"\
+"\n"\
+"You're good at that kind of thing."
+
+
+// after map 20
+
+#define P3TEXT \
+"You've bashed and battered your way into\n"\
+"the heart of the devil-hive.  Time for a\n"\
+"Search-and-Destroy mission, aimed at the\n"\
+"Gatekeeper, whose foul offspring is\n"\
+"cascading to Earth.  Yeah, he's bad. But\n"\
+"you know who's worse!\n"\
+"\n"\
+"Grinning evilly, you check your gear, and\n"\
+"get ready to give the bastard a little Hell\n"\
+"of your own making!"
+
+// after map 30
+
+#define P4TEXT \
+"The Gatekeeper's evil face is splattered\n"\
+"all over the place.  As its tattered corpse\n"\
+"collapses, an inverted Gate forms and\n"\
+"sucks down the shards of the last\n"\
+"prototype Accelerator, not to mention the\n"\
+"few remaining demons.  You're done. Hell\n"\
+"has gone back to pounding bad dead folks \n"\
+"instead of good live ones.  Remember to\n"\
+"tell your grandkids to put a rocket\n"\
+"launcher in your coffin. If you go to Hell\n"\
+"when you die, you'll need it for some\n"\
+"final cleaning-up ..."
+
+// before map 31
+
+#define P5TEXT \
+"You've found the second-hardest level we\n"\
+"got. Hope you have a saved game a level or\n"\
+"two previous.  If not, be prepared to die\n"\
+"aplenty. For master marines only."
+
+// before map 32
+
+#define P6TEXT \
+"Betcha wondered just what WAS the hardest\n"\
+"level we had ready for ya?  Now you know.\n"\
+"No one gets out alive."
+
+
+#define T1TEXT \
+"You've fought your way out of the infested\n"\
+"experimental labs.   It seems that UAC has\n"\
+"once again gulped it down.  With their\n"\
+"high turnover, it must be hard for poor\n"\
+"old UAC to buy corporate health insurance\n"\
+"nowadays..\n"\
+"\n"\
+"Ahead lies the military complex, now\n"\
+"swarming with diseased horrors hot to get\n"\
+"their teeth into you. With luck, the\n"\
+"complex still has some warlike ordnance\n"\
+"laying around."
+
+
+#define T2TEXT \
+"You hear the grinding of heavy machinery\n"\
+"ahead.  You sure hope they're not stamping\n"\
+"out new hellspawn, but you're ready to\n"\
+"ream out a whole herd if you have to.\n"\
+"They might be planning a blood feast, but\n"\
+"you feel about as mean as two thousand\n"\
+"maniacs packed into one mad killer.\n"\
+"\n"\
+"You don't plan to go down easy."
+
+
+#define T3TEXT \
+"The vista opening ahead looks real damn\n"\
+"familiar. Smells familiar, too -- like\n"\
+"fried excrement. You didn't like this\n"\
+"place before, and you sure as hell ain't\n"\
+"planning to like it now. The more you\n"\
+"brood on it, the madder you get.\n"\
+"Hefting your gun, an evil grin trickles\n"\
+"onto your face. Time to take some names."
+
+#define T4TEXT \
+"Suddenly, all is silent, from one horizon\n"\
+"to the other. The agonizing echo of Hell\n"\
+"fades away, the nightmare sky turns to\n"\
+"blue, the heaps of monster corpses start \n"\
+"to evaporate along with the evil stench \n"\
+"that filled the air. Jeeze, maybe you've\n"\
+"done it. Have you really won?\n"\
+"\n"\
+"Something rumbles in the distance.\n"\
+"A blue light begins to glow inside the\n"\
+"ruined skull of the demon-spitter."
+
+
+#define T5TEXT \
+"What now? Looks totally different. Kind\n"\
+"of like King Tut's condo. Well,\n"\
+"whatever's here can't be any worse\n"\
+"than usual. Can it?  Or maybe it's best\n"\
+"to let sleeping gods lie.."
+
+
+#define T6TEXT \
+"Time for a vacation. You've burst the\n"\
+"bowels of hell and by golly you're ready\n"\
+"for a break. You mutter to yourself,\n"\
+"Maybe someone else can kick Hell's ass\n"\
+"next time around. Ahead lies a quiet town,\n"\
+"with peaceful flowing water, quaint\n"\
+"buildings, and presumably no Hellspawn.\n"\
+"\n"\
+"As you step off the transport, you hear\n"\
+"the stomp of a cyberdemon's iron shoe."
+
+
+
+//
+// Character cast strings F_FINALE.C
+//
+#define CC_ZOMBIE      "ZOMBIEMAN"
+#define CC_SHOTGUN     "SHOTGUN GUY"
+#define CC_HEAVY       "HEAVY WEAPON DUDE"
+#define CC_IMP "IMP"
+#define CC_DEMON       "DEMON"
+#define CC_LOST        "LOST SOUL"
+#define CC_CACO        "CACODEMON"
+#define CC_HELL        "HELL KNIGHT"
+#define CC_BARON       "BARON OF HELL"
+#define CC_ARACH       "ARACHNOTRON"
+#define CC_PAIN        "PAIN ELEMENTAL"
+#define CC_REVEN       "REVENANT"
+#define CC_MANCU       "MANCUBUS"
+#define CC_ARCH        "ARCH-VILE"
+#define CC_SPIDER      "THE SPIDER MASTERMIND"
+#define CC_CYBER       "THE CYBERDEMON"
+#define CC_HERO        "OUR HERO"
+
+
+#endif
+//-----------------------------------------------------------------------------
+//
+// $Log:$
+//
+//-----------------------------------------------------------------------------
diff --git a/linuxdoom-1.10/d_event.h b/linuxdoom-1.10/d_event.h
new file mode 100644 (file)
index 0000000..feb5783
--- /dev/null
@@ -0,0 +1,122 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// DESCRIPTION:
+//
+//    
+//-----------------------------------------------------------------------------
+
+
+#ifndef __D_EVENT__
+#define __D_EVENT__
+
+
+#include "doomtype.h"
+
+
+//
+// Event handling.
+//
+
+// Input event types.
+typedef enum
+{
+    ev_keydown,
+    ev_keyup,
+    ev_mouse,
+    ev_joystick
+} evtype_t;
+
+// Event structure.
+typedef struct
+{
+    evtype_t   type;
+    int                data1;          // keys / mouse/joystick buttons
+    int                data2;          // mouse/joystick x move
+    int                data3;          // mouse/joystick y move
+} event_t;
+
+typedef enum
+{
+    ga_nothing,
+    ga_loadlevel,
+    ga_newgame,
+    ga_loadgame,
+    ga_savegame,
+    ga_playdemo,
+    ga_completed,
+    ga_victory,
+    ga_worlddone,
+    ga_screenshot
+} gameaction_t;
+
+
+
+//
+// Button/action code definitions.
+//
+typedef enum
+{
+    // Press "Fire".
+    BT_ATTACK          = 1,
+    // Use button, to open doors, activate switches.
+    BT_USE             = 2,
+
+    // Flag: game events, not really buttons.
+    BT_SPECIAL         = 128,
+    BT_SPECIALMASK     = 3,
+    
+    // Flag, weapon change pending.
+    // If true, the next 3 bits hold weapon num.
+    BT_CHANGE          = 4,
+    // The 3bit weapon mask and shift, convenience.
+    BT_WEAPONMASK      = (8+16+32),
+    BT_WEAPONSHIFT     = 3,
+
+    // Pause the game.
+    BTS_PAUSE          = 1,
+    // Save the game at each console.
+    BTS_SAVEGAME       = 2,
+
+    // Savegame slot numbers
+    //  occupy the second byte of buttons.    
+    BTS_SAVEMASK       = (4+8+16),
+    BTS_SAVESHIFT      = 2,
+  
+} buttoncode_t;
+
+
+
+
+//
+// GLOBAL VARIABLES
+//
+#define MAXEVENTS              64
+
+extern  event_t                events[MAXEVENTS];
+extern  int             eventhead;
+extern int             eventtail;
+
+extern  gameaction_t    gameaction;
+
+
+#endif
+//-----------------------------------------------------------------------------
+//
+// $Log:$
+//
+//-----------------------------------------------------------------------------
diff --git a/linuxdoom-1.10/d_french.h b/linuxdoom-1.10/d_french.h
new file mode 100644 (file)
index 0000000..d4807ab
--- /dev/null
@@ -0,0 +1,433 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// DESCRIPTION:
+//     Printed strings, french translation.
+//
+//-----------------------------------------------------------------------------
+
+
+#ifndef __D_FRENCH__
+#define __D_FRENCH__
+
+//
+// D_Main.C
+//
+#define D_DEVSTR       "MODE DEVELOPPEMENT ON.\n"
+#define D_CDROM                "VERSION CD-ROM: DEFAULT.CFG DANS C:\\DOOMDATA\n"
+
+//
+//     M_Menu.C
+//
+#define PRESSKEY       "APPUYEZ SUR UNE TOUCHE."
+#define PRESSYN        "APPUYEZ SUR Y OU N"
+#define QUITMSG                "VOUS VOULEZ VRAIMENT\nQUITTER CE SUPER JEU?"
+#define LOADNET        "VOUS NE POUVEZ PAS CHARGER\nUN JEU EN RESEAU!\n\n"PRESSKEY
+#define QLOADNET       "CHARGEMENT RAPIDE INTERDIT EN RESEAU!\n\n"PRESSKEY
+#define QSAVESPOT      "VOUS N'AVEZ PAS CHOISI UN EMPLACEMENT!\n\n"PRESSKEY
+#define SAVEDEAD       "VOUS NE POUVEZ PAS SAUVER SI VOUS NE JOUEZ "\
+"PAS!\n\n"PRESSKEY
+#define QSPROMPT       "SAUVEGARDE RAPIDE DANS LE FICHIER \n\n'%s'?\n\n"PRESSYN
+#define QLPROMPT       "VOULEZ-VOUS CHARGER LA SAUVEGARDE"\
+"\n\n'%s'?\n\n"PRESSYN
+#define NEWGAME                "VOUS NE POUVEZ PAS LANCER\n"\
+"UN NOUVEAU JEU SUR RESEAU.\n\n"PRESSKEY
+#define NIGHTMARE      "VOUS CONFIRMEZ? CE NIVEAU EST\n"\
+"VRAIMENT IMPITOYABLE!n"PRESSYN
+#define SWSTRING       "CECI EST UNE VERSION SHAREWARE DE DOOM.\n\n"\
+"VOUS DEVRIEZ COMMANDER LA TRILOGIE COMPLETE.\n\n"PRESSKEY
+#define MSGOFF         "MESSAGES OFF"
+#define MSGON          "MESSAGES ON"
+#define NETEND         "VOUS NE POUVEZ PAS METTRE FIN A UN JEU SUR "\
+"RESEAU!\n\n"PRESSKEY
+#define ENDGAME                "VOUS VOULEZ VRAIMENT METTRE FIN AU JEU?\n\n"PRESSYN
+
+#define DOSY           "(APPUYEZ SUR Y POUR REVENIR AU OS.)"
+
+#define DETAILHI       "GRAPHISMES MAXIMUM "
+#define DETAILLO       "GRAPHISMES MINIMUM "
+#define GAMMALVL0      "CORRECTION GAMMA OFF"
+#define GAMMALVL1      "CORRECTION GAMMA NIVEAU 1"
+#define GAMMALVL2      "CORRECTION GAMMA NIVEAU 2"
+#define GAMMALVL3      "CORRECTION GAMMA NIVEAU 3"
+#define GAMMALVL4      "CORRECTION GAMMA NIVEAU 4"
+#define EMPTYSTRING    "EMPLACEMENT VIDE"
+
+//
+//     P_inter.C
+//
+#define GOTARMOR       "ARMURE RECUPEREE."
+#define GOTMEGA                "MEGA-ARMURE RECUPEREE!"
+#define GOTHTHBONUS    "BONUS DE SANTE RECUPERE."
+#define GOTARMBONUS    "BONUS D'ARMURE RECUPERE."
+#define GOTSTIM                "STIMPACK RECUPERE."
+#define GOTMEDINEED    "MEDIKIT RECUPERE. VOUS EN AVEZ VRAIMENT BESOIN!"
+#define GOTMEDIKIT     "MEDIKIT RECUPERE."
+#define GOTSUPER       "SUPERCHARGE!"
+
+#define GOTBLUECARD    "CARTE MAGNETIQUE BLEUE RECUPEREE."
+#define GOTYELWCARD    "CARTE MAGNETIQUE JAUNE RECUPEREE."
+#define GOTREDCARD     "CARTE MAGNETIQUE ROUGE RECUPEREE."
+#define GOTBLUESKUL    "CLEF CRANE BLEUE RECUPEREE."
+#define GOTYELWSKUL    "CLEF CRANE JAUNE RECUPEREE."
+#define GOTREDSKULL    "CLEF CRANE ROUGE RECUPEREE."
+
+#define GOTINVUL       "INVULNERABILITE!"
+#define GOTBERSERK     "BERSERK!"
+#define GOTINVIS       "INVISIBILITE PARTIELLE "
+#define GOTSUIT                "COMBINAISON ANTI-RADIATIONS "
+#define GOTMAP         "CARTE INFORMATIQUE "
+#define GOTVISOR       "VISEUR A AMPLIFICATION DE LUMIERE "
+#define GOTMSPHERE     "MEGASPHERE!"
+
+#define GOTCLIP                "CHARGEUR RECUPERE."
+#define GOTCLIPBOX     "BOITE DE BALLES RECUPEREE."
+#define GOTROCKET      "ROQUETTE RECUPEREE."
+#define GOTROCKBOX     "CAISSE DE ROQUETTES RECUPEREE."
+#define GOTCELL                "CELLULE D'ENERGIE RECUPEREE."
+#define GOTCELLBOX     "PACK DE CELLULES D'ENERGIE RECUPERE."
+#define GOTSHELLS      "4 CARTOUCHES RECUPEREES."
+#define GOTSHELLBOX    "BOITE DE CARTOUCHES RECUPEREE."
+#define GOTBACKPACK    "SAC PLEIN DE MUNITIONS RECUPERE!"
+
+#define GOTBFG9000     "VOUS AVEZ UN BFG9000!  OH, OUI!"
+#define GOTCHAINGUN    "VOUS AVEZ LA MITRAILLEUSE!"
+#define GOTCHAINSAW    "UNE TRONCONNEUSE!"
+#define GOTLAUNCHER    "VOUS AVEZ UN LANCE-ROQUETTES!"
+#define GOTPLASMA      "VOUS AVEZ UN FUSIL A PLASMA!"
+#define GOTSHOTGUN     "VOUS AVEZ UN FUSIL!"
+#define GOTSHOTGUN2    "VOUS AVEZ UN SUPER FUSIL!"
+
+//
+// P_Doors.C
+//
+#define PD_BLUEO       "IL VOUS FAUT UNE CLEF BLEUE"
+#define PD_REDO                "IL VOUS FAUT UNE CLEF ROUGE"
+#define PD_YELLOWO     "IL VOUS FAUT UNE CLEF JAUNE"
+#define PD_BLUEK       PD_BLUEO
+#define PD_REDK                PD_REDO
+#define PD_YELLOWK     PD_YELLOWO
+
+//
+//     G_game.C
+//
+#define GGSAVED                "JEU SAUVEGARDE."
+
+//
+//     HU_stuff.C
+//
+#define HUSTR_MSGU     "[MESSAGE NON ENVOYE]"
+
+#define HUSTR_E1M1     "E1M1: HANGAR"
+#define HUSTR_E1M2     "E1M2: USINE NUCLEAIRE "
+#define HUSTR_E1M3     "E1M3: RAFFINERIE DE TOXINES "
+#define HUSTR_E1M4     "E1M4: CENTRE DE CONTROLE "
+#define HUSTR_E1M5     "E1M5: LABORATOIRE PHOBOS "
+#define HUSTR_E1M6     "E1M6: TRAITEMENT CENTRAL "
+#define HUSTR_E1M7     "E1M7: CENTRE INFORMATIQUE "
+#define HUSTR_E1M8     "E1M8: ANOMALIE PHOBOS "
+#define HUSTR_E1M9     "E1M9: BASE MILITAIRE "
+
+#define HUSTR_E2M1     "E2M1: ANOMALIE DEIMOS "
+#define HUSTR_E2M2     "E2M2: ZONE DE CONFINEMENT "
+#define HUSTR_E2M3     "E2M3: RAFFINERIE"
+#define HUSTR_E2M4     "E2M4: LABORATOIRE DEIMOS "
+#define HUSTR_E2M5     "E2M5: CENTRE DE CONTROLE "
+#define HUSTR_E2M6     "E2M6: HALLS DES DAMNES "
+#define HUSTR_E2M7     "E2M7: CUVES DE REPRODUCTION "
+#define HUSTR_E2M8     "E2M8: TOUR DE BABEL "
+#define HUSTR_E2M9     "E2M9: FORTERESSE DU MYSTERE "
+
+#define HUSTR_E3M1     "E3M1: DONJON DE L'ENFER "
+#define HUSTR_E3M2     "E3M2: BOURBIER DU DESESPOIR "
+#define HUSTR_E3M3     "E3M3: PANDEMONIUM"
+#define HUSTR_E3M4     "E3M4: MAISON DE LA DOULEUR "
+#define HUSTR_E3M5     "E3M5: CATHEDRALE PROFANE "
+#define HUSTR_E3M6     "E3M6: MONT EREBUS"
+#define HUSTR_E3M7     "E3M7: LIMBES"
+#define HUSTR_E3M8     "E3M8: DIS"
+#define HUSTR_E3M9     "E3M9: CLAPIERS"
+
+#define HUSTR_1                "NIVEAU 1: ENTREE "
+#define HUSTR_2                "NIVEAU 2: HALLS SOUTERRAINS "
+#define HUSTR_3                "NIVEAU 3: LE FEU NOURRI "
+#define HUSTR_4                "NIVEAU 4: LE FOYER "
+#define HUSTR_5                "NIVEAU 5: LES EGOUTS "
+#define HUSTR_6                "NIVEAU 6: LE BROYEUR "
+#define HUSTR_7                "NIVEAU 7: L'HERBE DE LA MORT"
+#define HUSTR_8                "NIVEAU 8: RUSES ET PIEGES "
+#define HUSTR_9                "NIVEAU 9: LE PUITS "
+#define HUSTR_10       "NIVEAU 10: BASE DE RAVITAILLEMENT "
+#define HUSTR_11       "NIVEAU 11: LE CERCLE DE LA MORT!"
+
+#define HUSTR_12       "NIVEAU 12: L'USINE "
+#define HUSTR_13       "NIVEAU 13: LE CENTRE VILLE"
+#define HUSTR_14       "NIVEAU 14: LES ANTRES PROFONDES "
+#define HUSTR_15       "NIVEAU 15: LA ZONE INDUSTRIELLE "
+#define HUSTR_16       "NIVEAU 16: LA BANLIEUE"
+#define HUSTR_17       "NIVEAU 17: LES IMMEUBLES"
+#define HUSTR_18       "NIVEAU 18: LA COUR "
+#define HUSTR_19       "NIVEAU 19: LA CITADELLE "
+#define HUSTR_20       "NIVEAU 20: JE T'AI EU!"
+
+#define HUSTR_21       "NIVEAU 21: LE NIRVANA"
+#define HUSTR_22       "NIVEAU 22: LES CATACOMBES "
+#define HUSTR_23       "NIVEAU 23: LA GRANDE FETE "
+#define HUSTR_24       "NIVEAU 24: LE GOUFFRE "
+#define HUSTR_25       "NIVEAU 25: LES CHUTES DE SANG"
+#define HUSTR_26       "NIVEAU 26: LES MINES ABANDONNEES "
+#define HUSTR_27       "NIVEAU 27: CHEZ LES MONSTRES "
+#define HUSTR_28       "NIVEAU 28: LE MONDE DE L'ESPRIT "
+#define HUSTR_29       "NIVEAU 29: LA LIMITE "
+#define HUSTR_30       "NIVEAU 30: L'ICONE DU PECHE "
+
+#define HUSTR_31       "NIVEAU 31: WOLFENSTEIN"
+#define HUSTR_32       "NIVEAU 32: LE MASSACRE"
+
+
+#define HUSTR_CHATMACRO1       "JE SUIS PRET A LEUR EN FAIRE BAVER!"
+#define HUSTR_CHATMACRO2       "JE VAIS BIEN."
+#define HUSTR_CHATMACRO3       "JE N'AI PAS L'AIR EN FORME!"
+#define HUSTR_CHATMACRO4       "AU SECOURS!"
+#define HUSTR_CHATMACRO5       "TU CRAINS!"
+#define HUSTR_CHATMACRO6       "LA PROCHAINE FOIS, MINABLE..."
+#define HUSTR_CHATMACRO7       "VIENS ICI!"
+#define HUSTR_CHATMACRO8       "JE VAIS M'EN OCCUPER."
+#define HUSTR_CHATMACRO9       "OUI"
+#define HUSTR_CHATMACRO0       "NON"
+
+#define HUSTR_TALKTOSELF1      "VOUS PARLEZ TOUT SEUL "
+#define HUSTR_TALKTOSELF2      "QUI EST LA?"
+#define HUSTR_TALKTOSELF3      "VOUS VOUS FAITES PEUR "
+#define HUSTR_TALKTOSELF4      "VOUS COMMENCEZ A DELIRER "
+#define HUSTR_TALKTOSELF5      "VOUS ETES LARGUE..."
+
+#define HUSTR_MESSAGESENT      "[MESSAGE ENVOYE]"
+
+// The following should NOT be changed unless it seems
+// just AWFULLY necessary
+
+#define HUSTR_PLRGREEN "VERT: "
+#define HUSTR_PLRINDIGO        "INDIGO: "
+#define HUSTR_PLRBROWN "BRUN: "
+#define HUSTR_PLRRED           "ROUGE: "
+
+#define HUSTR_KEYGREEN 'g'     // french key should be "V"
+#define HUSTR_KEYINDIGO        'i'     
+#define HUSTR_KEYBROWN 'b'     
+#define HUSTR_KEYRED           'r'
+
+//
+//     AM_map.C
+//
+
+#define AMSTR_FOLLOWON         "MODE POURSUITE ON"
+#define AMSTR_FOLLOWOFF                "MODE POURSUITE OFF"
+
+#define AMSTR_GRIDON           "GRILLE ON"
+#define AMSTR_GRIDOFF          "GRILLE OFF"
+
+#define AMSTR_MARKEDSPOT       "REPERE MARQUE "
+#define AMSTR_MARKSCLEARED     "REPERES EFFACES "
+
+//
+//     ST_stuff.C
+//
+
+#define STSTR_MUS              "CHANGEMENT DE MUSIQUE "
+#define STSTR_NOMUS            "IMPOSSIBLE SELECTION"
+#define STSTR_DQDON            "INVULNERABILITE ON "
+#define STSTR_DQDOFF           "INVULNERABILITE OFF"
+
+#define STSTR_KFAADDED         "ARMEMENT MAXIMUM! "
+#define STSTR_FAADDED          "ARMES (SAUF CLEFS) AJOUTEES"
+
+#define STSTR_NCON             "BARRIERES ON"
+#define STSTR_NCOFF            "BARRIERES OFF"
+
+#define STSTR_BEHOLD           " inVuln, Str, Inviso, Rad, Allmap, or Lite-amp"
+#define STSTR_BEHOLDX          "AMELIORATION ACTIVEE"
+
+#define STSTR_CHOPPERS         "... DOESN'T SUCK - GM"
+#define STSTR_CLEV             "CHANGEMENT DE NIVEAU..."
+
+//
+//     F_Finale.C
+//
+#define E1TEXT "APRES AVOIR VAINCU LES GROS MECHANTS\n"\
+"ET NETTOYE LA BASE LUNAIRE, VOUS AVEZ\n"\
+"GAGNE, NON? PAS VRAI? OU EST DONC VOTRE\n"\
+" RECOMPENSE ET VOTRE BILLET DE\n"\
+"RETOUR? QU'EST-QUE CA VEUT DIRE?CE"\
+"N'EST PAS LA FIN ESPEREE!\n"\
+"\n" \
+"CA SENT LA VIANDE PUTREFIEE, MAIS\n"\
+"ON DIRAIT LA BASE DEIMOS. VOUS ETES\n"\
+"APPAREMMENT BLOQUE AUX PORTES DE L'ENFER.\n"\
+"LA SEULE ISSUE EST DE L'AUTRE COTE.\n"\
+"\n"\
+"POUR VIVRE LA SUITE DE DOOM, JOUEZ\n"\
+"A 'AUX PORTES DE L'ENFER' ET A\n"\
+"L'EPISODE SUIVANT, 'L'ENFER'!\n"
+                               
+#define E2TEXT "VOUS AVEZ REUSSI. L'INFAME DEMON\n"\
+"QUI CONTROLAIT LA BASE LUNAIRE DE\n"\
+"DEIMOS EST MORT, ET VOUS AVEZ\n"\
+"TRIOMPHE! MAIS... OU ETES-VOUS?\n"\
+"VOUS GRIMPEZ JUSQU'AU BORD DE LA\n"\
+"LUNE ET VOUS DECOUVREZ L'ATROCE\n"\
+"VERITE.\n" \
+"\n"\
+"DEIMOS EST AU-DESSUS DE L'ENFER!\n"\
+"VOUS SAVEZ QUE PERSONNE NE S'EN\n"\
+"EST JAMAIS ECHAPPE, MAIS CES FUMIERS\n"\
+"VONT REGRETTER DE VOUS AVOIR CONNU!\n"\
+"VOUS REDESCENDEZ RAPIDEMENT VERS\n"\
+"LA SURFACE DE L'ENFER.\n"\
+"\n" \
+"VOICI MAINTENANT LE CHAPITRE FINAL DE\n"\
+"DOOM! -- L'ENFER."
+
+#define E3TEXT "LE DEMON ARACHNEEN ET REPUGNANT\n"\
+"QUI A DIRIGE L'INVASION DES BASES\n"\
+"LUNAIRES ET SEME LA MORT VIENT DE SE\n"\
+"FAIRE PULVERISER UNE FOIS POUR TOUTES.\n"\
+"\n"\
+"UNE PORTE SECRETE S'OUVRE. VOUS ENTREZ.\n"\
+"VOUS AVEZ PROUVE QUE VOUS POUVIEZ\n"\
+"RESISTER AUX HORREURS DE L'ENFER.\n"\
+"IL SAIT ETRE BEAU JOUEUR, ET LORSQUE\n"\
+"VOUS SORTEZ, VOUS REVOYEZ LES VERTES\n"\
+"PRAIRIES DE LA TERRE, VOTRE PLANETE.\n"\
+"\n"\
+"VOUS VOUS DEMANDEZ CE QUI S'EST PASSE\n"\
+"SUR TERRE PENDANT QUE VOUS AVEZ\n"\
+"COMBATTU LE DEMON. HEUREUSEMENT,\n"\
+"AUCUN GERME DU MAL N'A FRANCHI\n"\
+"CETTE PORTE AVEC VOUS..."
+
+
+
+// after level 6, put this:
+
+#define C1TEXT "VOUS ETES AU PLUS PROFOND DE L'ASTROPORT\n" \
+"INFESTE DE MONSTRES, MAIS QUELQUE CHOSE\n" \
+"NE VA PAS. ILS ONT APPORTE LEUR PROPRE\n" \
+"REALITE, ET LA TECHNOLOGIE DE L'ASTROPORT\n" \
+"EST AFFECTEE PAR LEUR PRESENCE.\n" \
+"\n"\
+"DEVANT VOUS, VOUS VOYEZ UN POSTE AVANCE\n" \
+"DE L'ENFER, UNE ZONE FORTIFIEE. SI VOUS\n" \
+"POUVEZ PASSER, VOUS POURREZ PENETRER AU\n" \
+"COEUR DE LA BASE HANTEE ET TROUVER \n" \
+"L'INTERRUPTEUR DE CONTROLE QUI GARDE LA \n" \
+"POPULATION DE LA TERRE EN OTAGE."
+
+// After level 11, put this:
+
+#define C2TEXT "VOUS AVEZ GAGNE! VOTRE VICTOIRE A PERMIS\n" \
+"A L'HUMANITE D'EVACUER LA TERRE ET \n"\
+"D'ECHAPPER AU CAUCHEMAR. VOUS ETES \n"\
+"MAINTENANT LE DERNIER HUMAIN A LA SURFACE \n"\
+"DE LA PLANETE. VOUS ETES ENTOURE DE \n"\
+"MUTANTS CANNIBALES, D'EXTRATERRESTRES \n"\
+"CARNIVORES ET D'ESPRITS DU MAL. VOUS \n"\
+"ATTENDEZ CALMEMENT LA MORT, HEUREUX \n"\
+"D'AVOIR PU SAUVER VOTRE RACE.\n"\
+"MAIS UN MESSAGE VOUS PARVIENT SOUDAIN\n"\
+"DE L'ESPACE: \"NOS CAPTEURS ONT LOCALISE\n"\
+"LA SOURCE DE L'INVASION EXTRATERRESTRE.\n"\
+"SI VOUS Y ALLEZ, VOUS POURREZ PEUT-ETRE\n"\
+"LES ARRETER. LEUR BASE EST SITUEE AU COEUR\n"\
+"DE VOTRE VILLE NATALE, PRES DE L'ASTROPORT.\n"\
+"VOUS VOUS RELEVEZ LENTEMENT ET PENIBLEMENT\n"\
+"ET VOUS REPARTEZ POUR LE FRONT."
+
+// After level 20, put this:
+
+#define C3TEXT "VOUS ETES AU COEUR DE LA CITE CORROMPUE,\n"\
+"ENTOURE PAR LES CADAVRES DE VOS ENNEMIS.\n"\
+"VOUS NE VOYEZ PAS COMMENT DETRUIRE LA PORTE\n"\
+"DES CREATURES DE CE COTE. VOUS SERREZ\n"\
+"LES DENTS ET PLONGEZ DANS L'OUVERTURE.\n"\
+"\n"\
+"IL DOIT Y AVOIR UN MOYEN DE LA FERMER\n"\
+"DE L'AUTRE COTE. VOUS ACCEPTEZ DE\n"\
+"TRAVERSER L'ENFER POUR LE FAIRE?"
+
+// After level 29, put this:
+
+#define C4TEXT "LE VISAGE HORRIBLE D'UN DEMON D'UNE\n"\
+"TAILLE INCROYABLE S'EFFONDRE DEVANT\n"\
+"VOUS LORSQUE VOUS TIREZ UNE SALVE DE\n"\
+"ROQUETTES DANS SON CERVEAU. LE MONSTRE\n"\
+"SE RATATINE, SES MEMBRES DECHIQUETES\n"\
+"SE REPANDANT SUR DES CENTAINES DE\n"\
+"KILOMETRES A LA SURFACE DE L'ENFER.\n"\
+"\n"\
+"VOUS AVEZ REUSSI. L'INVASION N'AURA.\n"\
+"PAS LIEU. LA TERRE EST SAUVEE. L'ENFER\n"\
+"EST ANEANTI. EN VOUS DEMANDANT OU IRONT\n"\
+"MAINTENANT LES DAMNES, VOUS ESSUYEZ\n"\
+"VOTRE FRONT COUVERT DE SUEUR ET REPARTEZ\n"\
+"VERS LA TERRE. SA RECONSTRUCTION SERA\n"\
+"BEAUCOUP PLUS DROLE QUE SA DESTRUCTION.\n"
+
+// Before level 31, put this:
+
+#define C5TEXT "FELICITATIONS! VOUS AVEZ TROUVE LE\n"\
+"NIVEAU SECRET! IL SEMBLE AVOIR ETE\n"\
+"CONSTRUIT PAR LES HUMAINS. VOUS VOUS\n"\
+"DEMANDEZ QUELS PEUVENT ETRE LES\n"\
+"HABITANTS DE CE COIN PERDU DE L'ENFER."
+
+// Before level 32, put this:
+
+#define C6TEXT "FELICITATIONS! VOUS AVEZ DECOUVERT\n"\
+"LE NIVEAU SUPER SECRET! VOUS FERIEZ\n"\
+"MIEUX DE FONCER DANS CELUI-LA!\n"
+
+//
+// Character cast strings F_FINALE.C
+//
+#define CC_ZOMBIE      "ZOMBIE"
+#define CC_SHOTGUN     "TYPE AU FUSIL"
+#define CC_HEAVY       "MEC SUPER-ARME"
+#define CC_IMP         "DIABLOTIN"
+#define CC_DEMON       "DEMON"
+#define CC_LOST                "AME PERDUE"
+#define CC_CACO                "CACODEMON"
+#define CC_HELL                "CHEVALIER DE L'ENFER"
+#define CC_BARON       "BARON DE L'ENFER"
+#define CC_ARACH       "ARACHNOTRON"
+#define CC_PAIN                "ELEMENTAIRE DE LA DOULEUR"
+#define CC_REVEN       "REVENANT"
+#define CC_MANCU       "MANCUBUS"
+#define CC_ARCH                "ARCHI-INFAME"
+#define CC_SPIDER      "L'ARAIGNEE CERVEAU"
+#define CC_CYBER       "LE CYBERDEMON"
+#define CC_HERO                "NOTRE HEROS"
+
+
+
+#endif
+//-----------------------------------------------------------------------------
+//
+// $Log:$
+//
+//-----------------------------------------------------------------------------
+
+
diff --git a/linuxdoom-1.10/d_items.c b/linuxdoom-1.10/d_items.c
new file mode 100644 (file)
index 0000000..2267da4
--- /dev/null
@@ -0,0 +1,138 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// $Log:$
+//
+// DESCRIPTION:
+//
+//-----------------------------------------------------------------------------
+
+static const char
+rcsid[] = "$Id:$";
+
+// We are referring to sprite numbers.
+#include "info.h"
+
+#ifdef __GNUG__
+#pragma implementation "d_items.h"
+#endif
+#include "d_items.h"
+
+
+//
+// PSPRITE ACTIONS for waepons.
+// This struct controls the weapon animations.
+//
+// Each entry is:
+//   ammo/amunition type
+//  upstate
+//  downstate
+// readystate
+// atkstate, i.e. attack/fire/hit frame
+// flashstate, muzzle flash
+//
+weaponinfo_t   weaponinfo[NUMWEAPONS] =
+{
+    {
+       // fist
+       am_noammo,
+       S_PUNCHUP,
+       S_PUNCHDOWN,
+       S_PUNCH,
+       S_PUNCH1,
+       S_NULL
+    }, 
+    {
+       // pistol
+       am_clip,
+       S_PISTOLUP,
+       S_PISTOLDOWN,
+       S_PISTOL,
+       S_PISTOL1,
+       S_PISTOLFLASH
+    }, 
+    {
+       // shotgun
+       am_shell,
+       S_SGUNUP,
+       S_SGUNDOWN,
+       S_SGUN,
+       S_SGUN1,
+       S_SGUNFLASH1
+    },
+    {
+       // chaingun
+       am_clip,
+       S_CHAINUP,
+       S_CHAINDOWN,
+       S_CHAIN,
+       S_CHAIN1,
+       S_CHAINFLASH1
+    },
+    {
+       // missile launcher
+       am_misl,
+       S_MISSILEUP,
+       S_MISSILEDOWN,
+       S_MISSILE,
+       S_MISSILE1,
+       S_MISSILEFLASH1
+    },
+    {
+       // plasma rifle
+       am_cell,
+       S_PLASMAUP,
+       S_PLASMADOWN,
+       S_PLASMA,
+       S_PLASMA1,
+       S_PLASMAFLASH1
+    },
+    {
+       // bfg 9000
+       am_cell,
+       S_BFGUP,
+       S_BFGDOWN,
+       S_BFG,
+       S_BFG1,
+       S_BFGFLASH1
+    },
+    {
+       // chainsaw
+       am_noammo,
+       S_SAWUP,
+       S_SAWDOWN,
+       S_SAW,
+       S_SAW1,
+       S_NULL
+    },
+    {
+       // super shotgun
+       am_shell,
+       S_DSGUNUP,
+       S_DSGUNDOWN,
+       S_DSGUN,
+       S_DSGUN1,
+       S_DSGUNFLASH1
+    }, 
+};
+
+
+
+
+
+
+
+
diff --git a/linuxdoom-1.10/d_items.h b/linuxdoom-1.10/d_items.h
new file mode 100644 (file)
index 0000000..01b6411
--- /dev/null
@@ -0,0 +1,52 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// DESCRIPTION:
+//     Items: key cards, artifacts, weapon, ammunition.
+//
+//-----------------------------------------------------------------------------
+
+
+#ifndef __D_ITEMS__
+#define __D_ITEMS__
+
+#include "doomdef.h"
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+
+// Weapon info: sprite frames, ammunition use.
+typedef struct
+{
+    ammotype_t ammo;
+    int                upstate;
+    int                downstate;
+    int                readystate;
+    int                atkstate;
+    int                flashstate;
+
+} weaponinfo_t;
+
+extern  weaponinfo_t    weaponinfo[NUMWEAPONS];
+
+#endif
+//-----------------------------------------------------------------------------
+//
+// $Log:$
+//
+//-----------------------------------------------------------------------------
diff --git a/linuxdoom-1.10/d_main.c b/linuxdoom-1.10/d_main.c
new file mode 100644 (file)
index 0000000..23427e8
--- /dev/null
@@ -0,0 +1,1171 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// $Log:$
+//
+// DESCRIPTION:
+//     DOOM main program (D_DoomMain) and game loop (D_DoomLoop),
+//     plus functions to determine game mode (shareware, registered),
+//     parse command line parameters, configure game parameters (turbo),
+//     and call the startup functions.
+//
+//-----------------------------------------------------------------------------
+
+
+static const char rcsid[] = "$Id: d_main.c,v 1.8 1997/02/03 22:45:09 b1 Exp $";
+
+#define        BGCOLOR         7
+#define        FGCOLOR         8
+
+
+#ifdef NORMALUNIX
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#endif
+
+
+#include "doomdef.h"
+#include "doomstat.h"
+
+#include "dstrings.h"
+#include "sounds.h"
+
+
+#include "z_zone.h"
+#include "w_wad.h"
+#include "s_sound.h"
+#include "v_video.h"
+
+#include "f_finale.h"
+#include "f_wipe.h"
+
+#include "m_argv.h"
+#include "m_misc.h"
+#include "m_menu.h"
+
+#include "i_system.h"
+#include "i_sound.h"
+#include "i_video.h"
+
+#include "g_game.h"
+
+#include "hu_stuff.h"
+#include "wi_stuff.h"
+#include "st_stuff.h"
+#include "am_map.h"
+
+#include "p_setup.h"
+#include "r_local.h"
+
+
+#include "d_main.h"
+
+//
+// D-DoomLoop()
+// Not a globally visible function,
+//  just included for source reference,
+//  called by D_DoomMain, never exits.
+// Manages timing and IO,
+//  calls all ?_Responder, ?_Ticker, and ?_Drawer,
+//  calls I_GetTime, I_StartFrame, and I_StartTic
+//
+void D_DoomLoop (void);
+
+
+char*          wadfiles[MAXWADFILES];
+
+
+boolean                devparm;        // started game with -devparm
+boolean         nomonsters;    // checkparm of -nomonsters
+boolean         respawnparm;   // checkparm of -respawn
+boolean         fastparm;      // checkparm of -fast
+
+boolean         drone;
+
+boolean                singletics = false; // debug flag to cancel adaptiveness
+
+
+
+//extern int soundVolume;
+//extern  int  sfxVolume;
+//extern  int  musicVolume;
+
+extern  boolean        inhelpscreens;
+
+skill_t                startskill;
+int             startepisode;
+int            startmap;
+boolean                autostart;
+
+FILE*          debugfile;
+
+boolean                advancedemo;
+
+
+
+
+char           wadfile[1024];          // primary wad file
+char           mapdir[1024];           // directory of development maps
+char           basedefault[1024];      // default file
+
+
+void D_CheckNetGame (void);
+void D_ProcessEvents (void);
+void G_BuildTiccmd (ticcmd_t* cmd);
+void D_DoAdvanceDemo (void);
+
+
+//
+// EVENT HANDLING
+//
+// Events are asynchronous inputs generally generated by the game user.
+// Events can be discarded if no responder claims them
+//
+event_t         events[MAXEVENTS];
+int             eventhead;
+int            eventtail;
+
+
+//
+// D_PostEvent
+// Called by the I/O functions when input is detected
+//
+void D_PostEvent (event_t* ev)
+{
+    events[eventhead] = *ev;
+    eventhead = (++eventhead)&(MAXEVENTS-1);
+}
+
+
+//
+// D_ProcessEvents
+// Send all the events of the given timestamp down the responder chain
+//
+void D_ProcessEvents (void)
+{
+    event_t*   ev;
+       
+    // IF STORE DEMO, DO NOT ACCEPT INPUT
+    if ( ( gamemode == commercial )
+        && (W_CheckNumForName("map01")<0) )
+      return;
+       
+    for ( ; eventtail != eventhead ; eventtail = (++eventtail)&(MAXEVENTS-1) )
+    {
+       ev = &events[eventtail];
+       if (M_Responder (ev))
+           continue;               // menu ate the event
+       G_Responder (ev);
+    }
+}
+
+
+
+
+//
+// D_Display
+//  draw current display, possibly wiping it from the previous
+//
+
+// wipegamestate can be set to -1 to force a wipe on the next draw
+gamestate_t     wipegamestate = GS_DEMOSCREEN;
+extern  boolean setsizeneeded;
+extern  int             showMessages;
+void R_ExecuteSetViewSize (void);
+
+void D_Display (void)
+{
+    static  boolean            viewactivestate = false;
+    static  boolean            menuactivestate = false;
+    static  boolean            inhelpscreensstate = false;
+    static  boolean            fullscreen = false;
+    static  gamestate_t                oldgamestate = -1;
+    static  int                        borderdrawcount;
+    int                                nowtime;
+    int                                tics;
+    int                                wipestart;
+    int                                y;
+    boolean                    done;
+    boolean                    wipe;
+    boolean                    redrawsbar;
+
+    if (nodrawers)
+       return;                    // for comparative timing / profiling
+               
+    redrawsbar = false;
+    
+    // change the view size if needed
+    if (setsizeneeded)
+    {
+       R_ExecuteSetViewSize ();
+       oldgamestate = -1;                      // force background redraw
+       borderdrawcount = 3;
+    }
+
+    // save the current screen if about to wipe
+    if (gamestate != wipegamestate)
+    {
+       wipe = true;
+       wipe_StartScreen(0, 0, SCREENWIDTH, SCREENHEIGHT);
+    }
+    else
+       wipe = false;
+
+    if (gamestate == GS_LEVEL && gametic)
+       HU_Erase();
+    
+    // do buffered drawing
+    switch (gamestate)
+    {
+      case GS_LEVEL:
+       if (!gametic)
+           break;
+       if (automapactive)
+           AM_Drawer ();
+       if (wipe || (viewheight != 200 && fullscreen) )
+           redrawsbar = true;
+       if (inhelpscreensstate && !inhelpscreens)
+           redrawsbar = true;              // just put away the help screen
+       ST_Drawer (viewheight == 200, redrawsbar );
+       fullscreen = viewheight == 200;
+       break;
+
+      case GS_INTERMISSION:
+       WI_Drawer ();
+       break;
+
+      case GS_FINALE:
+       F_Drawer ();
+       break;
+
+      case GS_DEMOSCREEN:
+       D_PageDrawer ();
+       break;
+    }
+    
+    // draw buffered stuff to screen
+    I_UpdateNoBlit ();
+    
+    // draw the view directly
+    if (gamestate == GS_LEVEL && !automapactive && gametic)
+       R_RenderPlayerView (&players[displayplayer]);
+
+    if (gamestate == GS_LEVEL && gametic)
+       HU_Drawer ();
+    
+    // clean up border stuff
+    if (gamestate != oldgamestate && gamestate != GS_LEVEL)
+       I_SetPalette (W_CacheLumpName ("PLAYPAL",PU_CACHE));
+
+    // see if the border needs to be initially drawn
+    if (gamestate == GS_LEVEL && oldgamestate != GS_LEVEL)
+    {
+       viewactivestate = false;        // view was not active
+       R_FillBackScreen ();    // draw the pattern into the back screen
+    }
+
+    // see if the border needs to be updated to the screen
+    if (gamestate == GS_LEVEL && !automapactive && scaledviewwidth != 320)
+    {
+       if (menuactive || menuactivestate || !viewactivestate)
+           borderdrawcount = 3;
+       if (borderdrawcount)
+       {
+           R_DrawViewBorder ();    // erase old menu stuff
+           borderdrawcount--;
+       }
+
+    }
+
+    menuactivestate = menuactive;
+    viewactivestate = viewactive;
+    inhelpscreensstate = inhelpscreens;
+    oldgamestate = wipegamestate = gamestate;
+    
+    // draw pause pic
+    if (paused)
+    {
+       if (automapactive)
+           y = 4;
+       else
+           y = viewwindowy+4;
+       V_DrawPatchDirect(viewwindowx+(scaledviewwidth-68)/2,
+                         y,0,W_CacheLumpName ("M_PAUSE", PU_CACHE));
+    }
+
+
+    // menus go directly to the screen
+    M_Drawer ();          // menu is drawn even on top of everything
+    NetUpdate ();         // send out any new accumulation
+
+
+    // normal update
+    if (!wipe)
+    {
+       I_FinishUpdate ();              // page flip or blit buffer
+       return;
+    }
+    
+    // wipe update
+    wipe_EndScreen(0, 0, SCREENWIDTH, SCREENHEIGHT);
+
+    wipestart = I_GetTime () - 1;
+
+    do
+    {
+       do
+       {
+           nowtime = I_GetTime ();
+           tics = nowtime - wipestart;
+       } while (!tics);
+       wipestart = nowtime;
+       done = wipe_ScreenWipe(wipe_Melt
+                              , 0, 0, SCREENWIDTH, SCREENHEIGHT, tics);
+       I_UpdateNoBlit ();
+       M_Drawer ();                            // menu is drawn even on top of wipes
+       I_FinishUpdate ();                      // page flip or blit buffer
+    } while (!done);
+}
+
+
+
+//
+//  D_DoomLoop
+//
+extern  boolean         demorecording;
+
+void D_DoomLoop (void)
+{
+    if (demorecording)
+       G_BeginRecording ();
+               
+    if (M_CheckParm ("-debugfile"))
+    {
+       char    filename[20];
+       sprintf (filename,"debug%i.txt",consoleplayer);
+       printf ("debug output to: %s\n",filename);
+       debugfile = fopen (filename,"w");
+    }
+       
+    I_InitGraphics ();
+
+    while (1)
+    {
+       // frame syncronous IO operations
+       I_StartFrame ();                
+       
+       // process one or more tics
+       if (singletics)
+       {
+           I_StartTic ();
+           D_ProcessEvents ();
+           G_BuildTiccmd (&netcmds[consoleplayer][maketic%BACKUPTICS]);
+           if (advancedemo)
+               D_DoAdvanceDemo ();
+           M_Ticker ();
+           G_Ticker ();
+           gametic++;
+           maketic++;
+       }
+       else
+       {
+           TryRunTics (); // will run at least one tic
+       }
+               
+       S_UpdateSounds (players[consoleplayer].mo);// move positional sounds
+
+       // Update display, next frame, with current state.
+       D_Display ();
+
+#ifndef SNDSERV
+       // Sound mixing for the buffer is snychronous.
+       I_UpdateSound();
+#endif 
+       // Synchronous sound output is explicitly called.
+#ifndef SNDINTR
+       // Update sound output.
+       I_SubmitSound();
+#endif
+    }
+}
+
+
+
+//
+//  DEMO LOOP
+//
+int             demosequence;
+int             pagetic;
+char                    *pagename;
+
+
+//
+// D_PageTicker
+// Handles timing for warped projection
+//
+void D_PageTicker (void)
+{
+    if (--pagetic < 0)
+       D_AdvanceDemo ();
+}
+
+
+
+//
+// D_PageDrawer
+//
+void D_PageDrawer (void)
+{
+    V_DrawPatch (0,0, 0, W_CacheLumpName(pagename, PU_CACHE));
+}
+
+
+//
+// D_AdvanceDemo
+// Called after each demo or intro demosequence finishes
+//
+void D_AdvanceDemo (void)
+{
+    advancedemo = true;
+}
+
+
+//
+// This cycles through the demo sequences.
+// FIXME - version dependend demo numbers?
+//
+ void D_DoAdvanceDemo (void)
+{
+    players[consoleplayer].playerstate = PST_LIVE;  // not reborn
+    advancedemo = false;
+    usergame = false;               // no save / end game here
+    paused = false;
+    gameaction = ga_nothing;
+
+    if ( gamemode == retail )
+      demosequence = (demosequence+1)%7;
+    else
+      demosequence = (demosequence+1)%6;
+    
+    switch (demosequence)
+    {
+      case 0:
+       if ( gamemode == commercial )
+           pagetic = 35 * 11;
+       else
+           pagetic = 170;
+       gamestate = GS_DEMOSCREEN;
+       pagename = "TITLEPIC";
+       if ( gamemode == commercial )
+         S_StartMusic(mus_dm2ttl);
+       else
+         S_StartMusic (mus_intro);
+       break;
+      case 1:
+       G_DeferedPlayDemo ("demo1");
+       break;
+      case 2:
+       pagetic = 200;
+       gamestate = GS_DEMOSCREEN;
+       pagename = "CREDIT";
+       break;
+      case 3:
+       G_DeferedPlayDemo ("demo2");
+       break;
+      case 4:
+       gamestate = GS_DEMOSCREEN;
+       if ( gamemode == commercial)
+       {
+           pagetic = 35 * 11;
+           pagename = "TITLEPIC";
+           S_StartMusic(mus_dm2ttl);
+       }
+       else
+       {
+           pagetic = 200;
+
+           if ( gamemode == retail )
+             pagename = "CREDIT";
+           else
+             pagename = "HELP2";
+       }
+       break;
+      case 5:
+       G_DeferedPlayDemo ("demo3");
+       break;
+        // THE DEFINITIVE DOOM Special Edition demo
+      case 6:
+       G_DeferedPlayDemo ("demo4");
+       break;
+    }
+}
+
+
+
+//
+// D_StartTitle
+//
+void D_StartTitle (void)
+{
+    gameaction = ga_nothing;
+    demosequence = -1;
+    D_AdvanceDemo ();
+}
+
+
+
+
+//      print title for every printed line
+char            title[128];
+
+
+
+//
+// D_AddFile
+//
+void D_AddFile (char *file)
+{
+    int     numwadfiles;
+    char    *newfile;
+       
+    for (numwadfiles = 0 ; wadfiles[numwadfiles] ; numwadfiles++)
+       ;
+
+    newfile = malloc (strlen(file)+1);
+    strcpy (newfile, file);
+       
+    wadfiles[numwadfiles] = newfile;
+}
+
+//
+// IdentifyVersion
+// Checks availability of IWAD files by name,
+// to determine whether registered/commercial features
+// should be executed (notably loading PWAD's).
+//
+void IdentifyVersion (void)
+{
+
+    char*      doom1wad;
+    char*      doomwad;
+    char*      doomuwad;
+    char*      doom2wad;
+
+    char*      doom2fwad;
+    char*      plutoniawad;
+    char*      tntwad;
+
+#ifdef NORMALUNIX
+    char *home;
+    char *doomwaddir;
+    doomwaddir = getenv("DOOMWADDIR");
+    if (!doomwaddir)
+       doomwaddir = ".";
+
+    // Commercial.
+    doom2wad = malloc(strlen(doomwaddir)+1+9+1);
+    sprintf(doom2wad, "%s/doom2.wad", doomwaddir);
+
+    // Retail.
+    doomuwad = malloc(strlen(doomwaddir)+1+8+1);
+    sprintf(doomuwad, "%s/doomu.wad", doomwaddir);
+    
+    // Registered.
+    doomwad = malloc(strlen(doomwaddir)+1+8+1);
+    sprintf(doomwad, "%s/doom.wad", doomwaddir);
+    
+    // Shareware.
+    doom1wad = malloc(strlen(doomwaddir)+1+9+1);
+    sprintf(doom1wad, "%s/doom1.wad", doomwaddir);
+
+     // Bug, dear Shawn.
+    // Insufficient malloc, caused spurious realloc errors.
+    plutoniawad = malloc(strlen(doomwaddir)+1+/*9*/12+1);
+    sprintf(plutoniawad, "%s/plutonia.wad", doomwaddir);
+
+    tntwad = malloc(strlen(doomwaddir)+1+9+1);
+    sprintf(tntwad, "%s/tnt.wad", doomwaddir);
+
+
+    // French stuff.
+    doom2fwad = malloc(strlen(doomwaddir)+1+10+1);
+    sprintf(doom2fwad, "%s/doom2f.wad", doomwaddir);
+
+    home = getenv("HOME");
+    if (!home)
+      I_Error("Please set $HOME to your home directory");
+    sprintf(basedefault, "%s/.doomrc", home);
+#endif
+
+    if (M_CheckParm ("-shdev"))
+    {
+       gamemode = shareware;
+       devparm = true;
+       D_AddFile (DEVDATA"doom1.wad");
+       D_AddFile (DEVMAPS"data_se/texture1.lmp");
+       D_AddFile (DEVMAPS"data_se/pnames.lmp");
+       strcpy (basedefault,DEVDATA"default.cfg");
+       return;
+    }
+
+    if (M_CheckParm ("-regdev"))
+    {
+       gamemode = registered;
+       devparm = true;
+       D_AddFile (DEVDATA"doom.wad");
+       D_AddFile (DEVMAPS"data_se/texture1.lmp");
+       D_AddFile (DEVMAPS"data_se/texture2.lmp");
+       D_AddFile (DEVMAPS"data_se/pnames.lmp");
+       strcpy (basedefault,DEVDATA"default.cfg");
+       return;
+    }
+
+    if (M_CheckParm ("-comdev"))
+    {
+       gamemode = commercial;
+       devparm = true;
+       /* I don't bother
+       if(plutonia)
+           D_AddFile (DEVDATA"plutonia.wad");
+       else if(tnt)
+           D_AddFile (DEVDATA"tnt.wad");
+       else*/
+           D_AddFile (DEVDATA"doom2.wad");
+           
+       D_AddFile (DEVMAPS"cdata/texture1.lmp");
+       D_AddFile (DEVMAPS"cdata/pnames.lmp");
+       strcpy (basedefault,DEVDATA"default.cfg");
+       return;
+    }
+
+    if ( !access (doom2fwad,R_OK) )
+    {
+       gamemode = commercial;
+       // C'est ridicule!
+       // Let's handle languages in config files, okay?
+       language = french;
+       printf("French version\n");
+       D_AddFile (doom2fwad);
+       return;
+    }
+
+    if ( !access (doom2wad,R_OK) )
+    {
+       gamemode = commercial;
+       D_AddFile (doom2wad);
+       return;
+    }
+
+    if ( !access (plutoniawad, R_OK ) )
+    {
+      gamemode = commercial;
+      D_AddFile (plutoniawad);
+      return;
+    }
+
+    if ( !access ( tntwad, R_OK ) )
+    {
+      gamemode = commercial;
+      D_AddFile (tntwad);
+      return;
+    }
+
+    if ( !access (doomuwad,R_OK) )
+    {
+      gamemode = retail;
+      D_AddFile (doomuwad);
+      return;
+    }
+
+    if ( !access (doomwad,R_OK) )
+    {
+      gamemode = registered;
+      D_AddFile (doomwad);
+      return;
+    }
+
+    if ( !access (doom1wad,R_OK) )
+    {
+      gamemode = shareware;
+      D_AddFile (doom1wad);
+      return;
+    }
+
+    printf("Game mode indeterminate.\n");
+    gamemode = indetermined;
+
+    // We don't abort. Let's see what the PWAD contains.
+    //exit(1);
+    //I_Error ("Game mode indeterminate\n");
+}
+
+//
+// Find a Response File
+//
+void FindResponseFile (void)
+{
+    int             i;
+#define MAXARGVS        100
+       
+    for (i = 1;i < myargc;i++)
+       if (myargv[i][0] == '@')
+       {
+           FILE *          handle;
+           int             size;
+           int             k;
+           int             index;
+           int             indexinfile;
+           char    *infile;
+           char    *file;
+           char    *moreargs[20];
+           char    *firstargv;
+                       
+           // READ THE RESPONSE FILE INTO MEMORY
+           handle = fopen (&myargv[i][1],"rb");
+           if (!handle)
+           {
+               printf ("\nNo such response file!");
+               exit(1);
+           }
+           printf("Found response file %s!\n",&myargv[i][1]);
+           fseek (handle,0,SEEK_END);
+           size = ftell(handle);
+           fseek (handle,0,SEEK_SET);
+           file = malloc (size);
+           fread (file,size,1,handle);
+           fclose (handle);
+                       
+           // KEEP ALL CMDLINE ARGS FOLLOWING @RESPONSEFILE ARG
+           for (index = 0,k = i+1; k < myargc; k++)
+               moreargs[index++] = myargv[k];
+                       
+           firstargv = myargv[0];
+           myargv = malloc(sizeof(char *)*MAXARGVS);
+           memset(myargv,0,sizeof(char *)*MAXARGVS);
+           myargv[0] = firstargv;
+                       
+           infile = file;
+           indexinfile = k = 0;
+           indexinfile++;  // SKIP PAST ARGV[0] (KEEP IT)
+           do
+           {
+               myargv[indexinfile++] = infile+k;
+               while(k < size &&
+                     ((*(infile+k)>= ' '+1) && (*(infile+k)<='z')))
+                   k++;
+               *(infile+k) = 0;
+               while(k < size &&
+                     ((*(infile+k)<= ' ') || (*(infile+k)>'z')))
+                   k++;
+           } while(k < size);
+                       
+           for (k = 0;k < index;k++)
+               myargv[indexinfile++] = moreargs[k];
+           myargc = indexinfile;
+       
+           // DISPLAY ARGS
+           printf("%d command-line args:\n",myargc);
+           for (k=1;k<myargc;k++)
+               printf("%s\n",myargv[k]);
+
+           break;
+       }
+}
+
+
+//
+// D_DoomMain
+//
+void D_DoomMain (void)
+{
+    int             p;
+    char                    file[256];
+
+    FindResponseFile ();
+       
+    IdentifyVersion ();
+       
+    setbuf (stdout, NULL);
+    modifiedgame = false;
+       
+    nomonsters = M_CheckParm ("-nomonsters");
+    respawnparm = M_CheckParm ("-respawn");
+    fastparm = M_CheckParm ("-fast");
+    devparm = M_CheckParm ("-devparm");
+    if (M_CheckParm ("-altdeath"))
+       deathmatch = 2;
+    else if (M_CheckParm ("-deathmatch"))
+       deathmatch = 1;
+
+    switch ( gamemode )
+    {
+      case retail:
+       sprintf (title,
+                "                         "
+                "The Ultimate DOOM Startup v%i.%i"
+                "                           ",
+                VERSION/100,VERSION%100);
+       break;
+      case shareware:
+       sprintf (title,
+                "                            "
+                "DOOM Shareware Startup v%i.%i"
+                "                           ",
+                VERSION/100,VERSION%100);
+       break;
+      case registered:
+       sprintf (title,
+                "                            "
+                "DOOM Registered Startup v%i.%i"
+                "                           ",
+                VERSION/100,VERSION%100);
+       break;
+      case commercial:
+       sprintf (title,
+                "                         "
+                "DOOM 2: Hell on Earth v%i.%i"
+                "                           ",
+                VERSION/100,VERSION%100);
+       break;
+/*FIXME
+       case pack_plut:
+       sprintf (title,
+                "                   "
+                "DOOM 2: Plutonia Experiment v%i.%i"
+                "                           ",
+                VERSION/100,VERSION%100);
+       break;
+      case pack_tnt:
+       sprintf (title,
+                "                     "
+                "DOOM 2: TNT - Evilution v%i.%i"
+                "                           ",
+                VERSION/100,VERSION%100);
+       break;
+*/
+      default:
+       sprintf (title,
+                "                     "
+                "Public DOOM - v%i.%i"
+                "                           ",
+                VERSION/100,VERSION%100);
+       break;
+    }
+    
+    printf ("%s\n",title);
+
+    if (devparm)
+       printf(D_DEVSTR);
+    
+    if (M_CheckParm("-cdrom"))
+    {
+       printf(D_CDROM);
+       mkdir("c:\\doomdata",0);
+       strcpy (basedefault,"c:/doomdata/default.cfg");
+    }  
+    
+    // turbo option
+    if ( (p=M_CheckParm ("-turbo")) )
+    {
+       int     scale = 200;
+       extern int forwardmove[2];
+       extern int sidemove[2];
+       
+       if (p<myargc-1)
+           scale = atoi (myargv[p+1]);
+       if (scale < 10)
+           scale = 10;
+       if (scale > 400)
+           scale = 400;
+       printf ("turbo scale: %i%%\n",scale);
+       forwardmove[0] = forwardmove[0]*scale/100;
+       forwardmove[1] = forwardmove[1]*scale/100;
+       sidemove[0] = sidemove[0]*scale/100;
+       sidemove[1] = sidemove[1]*scale/100;
+    }
+    
+    // add any files specified on the command line with -file wadfile
+    // to the wad list
+    //
+    // convenience hack to allow -wart e m to add a wad file
+    // prepend a tilde to the filename so wadfile will be reloadable
+    p = M_CheckParm ("-wart");
+    if (p)
+    {
+       myargv[p][4] = 'p';     // big hack, change to -warp
+
+       // Map name handling.
+       switch (gamemode )
+       {
+         case shareware:
+         case retail:
+         case registered:
+           sprintf (file,"~"DEVMAPS"E%cM%c.wad",
+                    myargv[p+1][0], myargv[p+2][0]);
+           printf("Warping to Episode %s, Map %s.\n",
+                  myargv[p+1],myargv[p+2]);
+           break;
+           
+         case commercial:
+         default:
+           p = atoi (myargv[p+1]);
+           if (p<10)
+             sprintf (file,"~"DEVMAPS"cdata/map0%i.wad", p);
+           else
+             sprintf (file,"~"DEVMAPS"cdata/map%i.wad", p);
+           break;
+       }
+       D_AddFile (file);
+    }
+       
+    p = M_CheckParm ("-file");
+    if (p)
+    {
+       // the parms after p are wadfile/lump names,
+       // until end of parms or another - preceded parm
+       modifiedgame = true;            // homebrew levels
+       while (++p != myargc && myargv[p][0] != '-')
+           D_AddFile (myargv[p]);
+    }
+
+    p = M_CheckParm ("-playdemo");
+
+    if (!p)
+       p = M_CheckParm ("-timedemo");
+
+    if (p && p < myargc-1)
+    {
+       sprintf (file,"%s.lmp", myargv[p+1]);
+       D_AddFile (file);
+       printf("Playing demo %s.lmp.\n",myargv[p+1]);
+    }
+    
+    // get skill / episode / map from parms
+    startskill = sk_medium;
+    startepisode = 1;
+    startmap = 1;
+    autostart = false;
+
+               
+    p = M_CheckParm ("-skill");
+    if (p && p < myargc-1)
+    {
+       startskill = myargv[p+1][0]-'1';
+       autostart = true;
+    }
+
+    p = M_CheckParm ("-episode");
+    if (p && p < myargc-1)
+    {
+       startepisode = myargv[p+1][0]-'0';
+       startmap = 1;
+       autostart = true;
+    }
+       
+    p = M_CheckParm ("-timer");
+    if (p && p < myargc-1 && deathmatch)
+    {
+       int     time;
+       time = atoi(myargv[p+1]);
+       printf("Levels will end after %d minute",time);
+       if (time>1)
+           printf("s");
+       printf(".\n");
+    }
+
+    p = M_CheckParm ("-avg");
+    if (p && p < myargc-1 && deathmatch)
+       printf("Austin Virtual Gaming: Levels will end after 20 minutes\n");
+
+    p = M_CheckParm ("-warp");
+    if (p && p < myargc-1)
+    {
+       if (gamemode == commercial)
+           startmap = atoi (myargv[p+1]);
+       else
+       {
+           startepisode = myargv[p+1][0]-'0';
+           startmap = myargv[p+2][0]-'0';
+       }
+       autostart = true;
+    }
+    
+    // init subsystems
+    printf ("V_Init: allocate screens.\n");
+    V_Init ();
+
+    printf ("M_LoadDefaults: Load system defaults.\n");
+    M_LoadDefaults ();              // load before initing other systems
+
+    printf ("Z_Init: Init zone memory allocation daemon. \n");
+    Z_Init ();
+
+    printf ("W_Init: Init WADfiles.\n");
+    W_InitMultipleFiles (wadfiles);
+    
+
+    // Check for -file in shareware
+    if (modifiedgame)
+    {
+       // These are the lumps that will be checked in IWAD,
+       // if any one is not present, execution will be aborted.
+       char name[23][8]=
+       {
+           "e2m1","e2m2","e2m3","e2m4","e2m5","e2m6","e2m7","e2m8","e2m9",
+           "e3m1","e3m3","e3m3","e3m4","e3m5","e3m6","e3m7","e3m8","e3m9",
+           "dphoof","bfgga0","heada1","cybra1","spida1d1"
+       };
+       int i;
+       
+       if ( gamemode == shareware)
+           I_Error("\nYou cannot -file with the shareware "
+                   "version. Register!");
+
+       // Check for fake IWAD with right name,
+       // but w/o all the lumps of the registered version. 
+       if (gamemode == registered)
+           for (i = 0;i < 23; i++)
+               if (W_CheckNumForName(name[i])<0)
+                   I_Error("\nThis is not the registered version.");
+    }
+    
+    // Iff additonal PWAD files are used, print modified banner
+    if (modifiedgame)
+    {
+       /*m*/printf (
+           "===========================================================================\n"
+           "ATTENTION:  This version of DOOM has been modified.  If you would like to\n"
+           "get a copy of the original game, call 1-800-IDGAMES or see the readme file.\n"
+           "        You will not receive technical support for modified games.\n"
+           "                      press enter to continue\n"
+           "===========================================================================\n"
+           );
+       getchar ();
+    }
+       
+
+    // Check and print which version is executed.
+    switch ( gamemode )
+    {
+      case shareware:
+      case indetermined:
+       printf (
+           "===========================================================================\n"
+           "                                Shareware!\n"
+           "===========================================================================\n"
+       );
+       break;
+      case registered:
+      case retail:
+      case commercial:
+       printf (
+           "===========================================================================\n"
+           "                 Commercial product - do not distribute!\n"
+           "         Please report software piracy to the SPA: 1-800-388-PIR8\n"
+           "===========================================================================\n"
+       );
+       break;
+       
+      default:
+       // Ouch.
+       break;
+    }
+
+    printf ("M_Init: Init miscellaneous info.\n");
+    M_Init ();
+
+    printf ("R_Init: Init DOOM refresh daemon - ");
+    R_Init ();
+
+    printf ("\nP_Init: Init Playloop state.\n");
+    P_Init ();
+
+    printf ("I_Init: Setting up machine state.\n");
+    I_Init ();
+
+    printf ("D_CheckNetGame: Checking network game status.\n");
+    D_CheckNetGame ();
+
+    printf ("S_Init: Setting up sound.\n");
+    S_Init (snd_SfxVolume /* *8 */, snd_MusicVolume /* *8*/ );
+
+    printf ("HU_Init: Setting up heads up display.\n");
+    HU_Init ();
+
+    printf ("ST_Init: Init status bar.\n");
+    ST_Init ();
+
+    // check for a driver that wants intermission stats
+    p = M_CheckParm ("-statcopy");
+    if (p && p<myargc-1)
+    {
+       // for statistics driver
+       extern  void*   statcopy;                            
+
+       statcopy = (void*)atoi(myargv[p+1]);
+       printf ("External statistics registered.\n");
+    }
+    
+    // start the apropriate game based on parms
+    p = M_CheckParm ("-record");
+
+    if (p && p < myargc-1)
+    {
+       G_RecordDemo (myargv[p+1]);
+       autostart = true;
+    }
+       
+    p = M_CheckParm ("-playdemo");
+    if (p && p < myargc-1)
+    {
+       singledemo = true;              // quit after one demo
+       G_DeferedPlayDemo (myargv[p+1]);
+       D_DoomLoop ();  // never returns
+    }
+       
+    p = M_CheckParm ("-timedemo");
+    if (p && p < myargc-1)
+    {
+       G_TimeDemo (myargv[p+1]);
+       D_DoomLoop ();  // never returns
+    }
+       
+    p = M_CheckParm ("-loadgame");
+    if (p && p < myargc-1)
+    {
+       if (M_CheckParm("-cdrom"))
+           sprintf(file, "c:\\doomdata\\"SAVEGAMENAME"%c.dsg",myargv[p+1][0]);
+       else
+           sprintf(file, SAVEGAMENAME"%c.dsg",myargv[p+1][0]);
+       G_LoadGame (file);
+    }
+       
+
+    if ( gameaction != ga_loadgame )
+    {
+       if (autostart || netgame)
+           G_InitNew (startskill, startepisode, startmap);
+       else
+           D_StartTitle ();                // start up intro loop
+
+    }
+
+    D_DoomLoop ();  // never returns
+}
diff --git a/linuxdoom-1.10/d_main.h b/linuxdoom-1.10/d_main.h
new file mode 100644 (file)
index 0000000..7763e13
--- /dev/null
@@ -0,0 +1,64 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// $Log:$
+//
+// DESCRIPTION:
+//     System specific interface stuff.
+//
+//-----------------------------------------------------------------------------
+
+
+#ifndef __D_MAIN__
+#define __D_MAIN__
+
+#include "d_event.h"
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+
+
+#define MAXWADFILES             20
+extern char*           wadfiles[MAXWADFILES];
+
+void D_AddFile (char *file);
+
+
+
+//
+// D_DoomMain()
+// Not a globally visible function, just included for source reference,
+// calls all startup code, parses command line options.
+// If not overrided by user input, calls N_AdvanceDemo.
+//
+void D_DoomMain (void);
+
+// Called by IO functions when input is detected.
+void D_PostEvent (event_t* ev);
+
+       
+
+//
+// BASE LEVEL
+//
+void D_PageTicker (void);
+void D_PageDrawer (void);
+void D_AdvanceDemo (void);
+void D_StartTitle (void);
+
+#endif
diff --git a/linuxdoom-1.10/d_net.c b/linuxdoom-1.10/d_net.c
new file mode 100644 (file)
index 0000000..75b5436
--- /dev/null
@@ -0,0 +1,767 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// $Log:$
+//
+// DESCRIPTION:
+//     DOOM Network game communication and protocol,
+//     all OS independend parts.
+//
+//-----------------------------------------------------------------------------
+
+
+static const char rcsid[] = "$Id: d_net.c,v 1.3 1997/02/03 22:01:47 b1 Exp $";
+
+
+#include "m_menu.h"
+#include "i_system.h"
+#include "i_video.h"
+#include "i_net.h"
+#include "g_game.h"
+#include "doomdef.h"
+#include "doomstat.h"
+
+#define        NCMD_EXIT               0x80000000
+#define        NCMD_RETRANSMIT         0x40000000
+#define        NCMD_SETUP              0x20000000
+#define        NCMD_KILL               0x10000000      // kill game
+#define        NCMD_CHECKSUM           0x0fffffff
+
+doomcom_t*     doomcom;        
+doomdata_t*    netbuffer;              // points inside doomcom
+
+
+//
+// NETWORKING
+//
+// gametic is the tic about to (or currently being) run
+// maketic is the tick that hasn't had control made for it yet
+// nettics[] has the maketics for all players 
+//
+// a gametic cannot be run until nettics[] > gametic for all players
+//
+#define        RESENDCOUNT     10
+#define        PL_DRONE        0x80    // bit flag in doomdata->player
+
+ticcmd_t       localcmds[BACKUPTICS];
+
+ticcmd_t        netcmds[MAXPLAYERS][BACKUPTICS];
+int            nettics[MAXNETNODES];
+boolean                nodeingame[MAXNETNODES];                // set false as nodes leave game
+boolean                remoteresend[MAXNETNODES];              // set when local needs tics
+int            resendto[MAXNETNODES];                  // set when remote needs tics
+int            resendcount[MAXNETNODES];
+
+int            nodeforplayer[MAXPLAYERS];
+
+int             maketic;
+int            lastnettic;
+int            skiptics;
+int            ticdup;         
+int            maxsend;        // BACKUPTICS/(2*ticdup)-1
+
+
+void D_ProcessEvents (void); 
+void G_BuildTiccmd (ticcmd_t *cmd); 
+void D_DoAdvanceDemo (void);
+boolean                reboundpacket;
+doomdata_t     reboundstore;
+
+
+
+//
+//
+//
+int NetbufferSize (void)
+{
+    return (int)&(((doomdata_t *)0)->cmds[netbuffer->numtics]); 
+}
+
+//
+// Checksum 
+//
+unsigned NetbufferChecksum (void)
+{
+    unsigned           c;
+    int                i,l;
+
+    c = 0x1234567;
+
+    // FIXME -endianess?
+#ifdef NORMALUNIX
+    return 0;                  // byte order problems
+#endif
+
+    l = (NetbufferSize () - (int)&(((doomdata_t *)0)->retransmitfrom))/4;
+    for (i=0 ; i<l ; i++)
+       c += ((unsigned *)&netbuffer->retransmitfrom)[i] * (i+1);
+
+    return c & NCMD_CHECKSUM;
+}
+
+//
+//
+//
+int ExpandTics (int low)
+{
+    int        delta;
+       
+    delta = low - (maketic&0xff);
+       
+    if (delta >= -64 && delta <= 64)
+       return (maketic&~0xff) + low;
+    if (delta > 64)
+       return (maketic&~0xff) - 256 + low;
+    if (delta < -64)
+       return (maketic&~0xff) + 256 + low;
+               
+    I_Error ("ExpandTics: strange value %i at maketic %i",low,maketic);
+    return 0;
+}
+
+
+
+//
+// HSendPacket
+//
+void
+HSendPacket
+ (int  node,
+  int  flags )
+{
+    netbuffer->checksum = NetbufferChecksum () | flags;
+
+    if (!node)
+    {
+       reboundstore = *netbuffer;
+       reboundpacket = true;
+       return;
+    }
+
+    if (demoplayback)
+       return;
+
+    if (!netgame)
+       I_Error ("Tried to transmit to another node");
+               
+    doomcom->command = CMD_SEND;
+    doomcom->remotenode = node;
+    doomcom->datalength = NetbufferSize ();
+       
+    if (debugfile)
+    {
+       int             i;
+       int             realretrans;
+       if (netbuffer->checksum & NCMD_RETRANSMIT)
+           realretrans = ExpandTics (netbuffer->retransmitfrom);
+       else
+           realretrans = -1;
+
+       fprintf (debugfile,"send (%i + %i, R %i) [%i] ",
+                ExpandTics(netbuffer->starttic),
+                netbuffer->numtics, realretrans, doomcom->datalength);
+       
+       for (i=0 ; i<doomcom->datalength ; i++)
+           fprintf (debugfile,"%i ",((byte *)netbuffer)[i]);
+
+       fprintf (debugfile,"\n");
+    }
+
+    I_NetCmd ();
+}
+
+//
+// HGetPacket
+// Returns false if no packet is waiting
+//
+boolean HGetPacket (void)
+{      
+    if (reboundpacket)
+    {
+       *netbuffer = reboundstore;
+       doomcom->remotenode = 0;
+       reboundpacket = false;
+       return true;
+    }
+
+    if (!netgame)
+       return false;
+
+    if (demoplayback)
+       return false;
+               
+    doomcom->command = CMD_GET;
+    I_NetCmd ();
+    
+    if (doomcom->remotenode == -1)
+       return false;
+
+    if (doomcom->datalength != NetbufferSize ())
+    {
+       if (debugfile)
+           fprintf (debugfile,"bad packet length %i\n",doomcom->datalength);
+       return false;
+    }
+       
+    if (NetbufferChecksum () != (netbuffer->checksum&NCMD_CHECKSUM) )
+    {
+       if (debugfile)
+           fprintf (debugfile,"bad packet checksum\n");
+       return false;
+    }
+
+    if (debugfile)
+    {
+       int             realretrans;
+       int     i;
+                       
+       if (netbuffer->checksum & NCMD_SETUP)
+           fprintf (debugfile,"setup packet\n");
+       else
+       {
+           if (netbuffer->checksum & NCMD_RETRANSMIT)
+               realretrans = ExpandTics (netbuffer->retransmitfrom);
+           else
+               realretrans = -1;
+           
+           fprintf (debugfile,"get %i = (%i + %i, R %i)[%i] ",
+                    doomcom->remotenode,
+                    ExpandTics(netbuffer->starttic),
+                    netbuffer->numtics, realretrans, doomcom->datalength);
+
+           for (i=0 ; i<doomcom->datalength ; i++)
+               fprintf (debugfile,"%i ",((byte *)netbuffer)[i]);
+           fprintf (debugfile,"\n");
+       }
+    }
+    return true;       
+}
+
+
+//
+// GetPackets
+//
+char    exitmsg[80];
+
+void GetPackets (void)
+{
+    int                netconsole;
+    int                netnode;
+    ticcmd_t   *src, *dest;
+    int                realend;
+    int                realstart;
+                                
+    while ( HGetPacket() )
+    {
+       if (netbuffer->checksum & NCMD_SETUP)
+           continue;           // extra setup packet
+                       
+       netconsole = netbuffer->player & ~PL_DRONE;
+       netnode = doomcom->remotenode;
+       
+       // to save bytes, only the low byte of tic numbers are sent
+       // Figure out what the rest of the bytes are
+       realstart = ExpandTics (netbuffer->starttic);           
+       realend = (realstart+netbuffer->numtics);
+       
+       // check for exiting the game
+       if (netbuffer->checksum & NCMD_EXIT)
+       {
+           if (!nodeingame[netnode])
+               continue;
+           nodeingame[netnode] = false;
+           playeringame[netconsole] = false;
+           strcpy (exitmsg, "Player 1 left the game");
+           exitmsg[7] += netconsole;
+           players[consoleplayer].message = exitmsg;
+           if (demorecording)
+               G_CheckDemoStatus ();
+           continue;
+       }
+       
+       // check for a remote game kill
+       if (netbuffer->checksum & NCMD_KILL)
+           I_Error ("Killed by network driver");
+
+       nodeforplayer[netconsole] = netnode;
+       
+       // check for retransmit request
+       if ( resendcount[netnode] <= 0 
+            && (netbuffer->checksum & NCMD_RETRANSMIT) )
+       {
+           resendto[netnode] = ExpandTics(netbuffer->retransmitfrom);
+           if (debugfile)
+               fprintf (debugfile,"retransmit from %i\n", resendto[netnode]);
+           resendcount[netnode] = RESENDCOUNT;
+       }
+       else
+           resendcount[netnode]--;
+       
+       // check for out of order / duplicated packet           
+       if (realend == nettics[netnode])
+           continue;
+                       
+       if (realend < nettics[netnode])
+       {
+           if (debugfile)
+               fprintf (debugfile,
+                        "out of order packet (%i + %i)\n" ,
+                        realstart,netbuffer->numtics);
+           continue;
+       }
+       
+       // check for a missed packet
+       if (realstart > nettics[netnode])
+       {
+           // stop processing until the other system resends the missed tics
+           if (debugfile)
+               fprintf (debugfile,
+                        "missed tics from %i (%i - %i)\n",
+                        netnode, realstart, nettics[netnode]);
+           remoteresend[netnode] = true;
+           continue;
+       }
+
+       // update command store from the packet
+        {
+           int         start;
+
+           remoteresend[netnode] = false;
+               
+           start = nettics[netnode] - realstart;               
+           src = &netbuffer->cmds[start];
+
+           while (nettics[netnode] < realend)
+           {
+               dest = &netcmds[netconsole][nettics[netnode]%BACKUPTICS];
+               nettics[netnode]++;
+               *dest = *src;
+               src++;
+           }
+       }
+    }
+}
+
+
+//
+// NetUpdate
+// Builds ticcmds for console player,
+// sends out a packet
+//
+int      gametime;
+
+void NetUpdate (void)
+{
+    int             nowtime;
+    int             newtics;
+    int                                i,j;
+    int                                realstart;
+    int                                gameticdiv;
+    
+    // check time
+    nowtime = I_GetTime ()/ticdup;
+    newtics = nowtime - gametime;
+    gametime = nowtime;
+       
+    if (newtics <= 0)  // nothing new to update
+       goto listen; 
+
+    if (skiptics <= newtics)
+    {
+       newtics -= skiptics;
+       skiptics = 0;
+    }
+    else
+    {
+       skiptics -= newtics;
+       newtics = 0;
+    }
+       
+               
+    netbuffer->player = consoleplayer;
+    
+    // build new ticcmds for console player
+    gameticdiv = gametic/ticdup;
+    for (i=0 ; i<newtics ; i++)
+    {
+       I_StartTic ();
+       D_ProcessEvents ();
+       if (maketic - gameticdiv >= BACKUPTICS/2-1)
+           break;          // can't hold any more
+       
+       //printf ("mk:%i ",maketic);
+       G_BuildTiccmd (&localcmds[maketic%BACKUPTICS]);
+       maketic++;
+    }
+
+
+    if (singletics)
+       return;         // singletic update is syncronous
+    
+    // send the packet to the other nodes
+    for (i=0 ; i<doomcom->numnodes ; i++)
+       if (nodeingame[i])
+       {
+           netbuffer->starttic = realstart = resendto[i];
+           netbuffer->numtics = maketic - realstart;
+           if (netbuffer->numtics > BACKUPTICS)
+               I_Error ("NetUpdate: netbuffer->numtics > BACKUPTICS");
+
+           resendto[i] = maketic - doomcom->extratics;
+
+           for (j=0 ; j< netbuffer->numtics ; j++)
+               netbuffer->cmds[j] = 
+                   localcmds[(realstart+j)%BACKUPTICS];
+                                       
+           if (remoteresend[i])
+           {
+               netbuffer->retransmitfrom = nettics[i];
+               HSendPacket (i, NCMD_RETRANSMIT);
+           }
+           else
+           {
+               netbuffer->retransmitfrom = 0;
+               HSendPacket (i, 0);
+           }
+       }
+    
+    // listen for other packets
+  listen:
+    GetPackets ();
+}
+
+
+
+//
+// CheckAbort
+//
+void CheckAbort (void)
+{
+    event_t *ev;
+    int                stoptic;
+       
+    stoptic = I_GetTime () + 2; 
+    while (I_GetTime() < stoptic) 
+       I_StartTic (); 
+       
+    I_StartTic ();
+    for ( ; eventtail != eventhead 
+             ; eventtail = (++eventtail)&(MAXEVENTS-1) ) 
+    { 
+       ev = &events[eventtail]; 
+       if (ev->type == ev_keydown && ev->data1 == KEY_ESCAPE)
+           I_Error ("Network game synchronization aborted.");
+    } 
+}
+
+
+//
+// D_ArbitrateNetStart
+//
+void D_ArbitrateNetStart (void)
+{
+    int                i;
+    boolean    gotinfo[MAXNETNODES];
+       
+    autostart = true;
+    memset (gotinfo,0,sizeof(gotinfo));
+       
+    if (doomcom->consoleplayer)
+    {
+       // listen for setup info from key player
+       printf ("listening for network start info...\n");
+       while (1)
+       {
+           CheckAbort ();
+           if (!HGetPacket ())
+               continue;
+           if (netbuffer->checksum & NCMD_SETUP)
+           {
+               if (netbuffer->player != VERSION)
+                   I_Error ("Different DOOM versions cannot play a net game!");
+               startskill = netbuffer->retransmitfrom & 15;
+               deathmatch = (netbuffer->retransmitfrom & 0xc0) >> 6;
+               nomonsters = (netbuffer->retransmitfrom & 0x20) > 0;
+               respawnparm = (netbuffer->retransmitfrom & 0x10) > 0;
+               startmap = netbuffer->starttic & 0x3f;
+               startepisode = netbuffer->starttic >> 6;
+               return;
+           }
+       }
+    }
+    else
+    {
+       // key player, send the setup info
+       printf ("sending network start info...\n");
+       do
+       {
+           CheckAbort ();
+           for (i=0 ; i<doomcom->numnodes ; i++)
+           {
+               netbuffer->retransmitfrom = startskill;
+               if (deathmatch)
+                   netbuffer->retransmitfrom |= (deathmatch<<6);
+               if (nomonsters)
+                   netbuffer->retransmitfrom |= 0x20;
+               if (respawnparm)
+                   netbuffer->retransmitfrom |= 0x10;
+               netbuffer->starttic = startepisode * 64 + startmap;
+               netbuffer->player = VERSION;
+               netbuffer->numtics = 0;
+               HSendPacket (i, NCMD_SETUP);
+           }
+
+#if 1
+           for(i = 10 ; i  &&  HGetPacket(); --i)
+           {
+               if((netbuffer->player&0x7f) < MAXNETNODES)
+                   gotinfo[netbuffer->player&0x7f] = true;
+           }
+#else
+           while (HGetPacket ())
+           {
+               gotinfo[netbuffer->player&0x7f] = true;
+           }
+#endif
+
+           for (i=1 ; i<doomcom->numnodes ; i++)
+               if (!gotinfo[i])
+                   break;
+       } while (i < doomcom->numnodes);
+    }
+}
+
+//
+// D_CheckNetGame
+// Works out player numbers among the net participants
+//
+extern int                     viewangleoffset;
+
+void D_CheckNetGame (void)
+{
+    int             i;
+       
+    for (i=0 ; i<MAXNETNODES ; i++)
+    {
+       nodeingame[i] = false;
+               nettics[i] = 0;
+       remoteresend[i] = false;        // set when local needs tics
+       resendto[i] = 0;                // which tic to start sending
+    }
+       
+    // I_InitNetwork sets doomcom and netgame
+    I_InitNetwork ();
+    if (doomcom->id != DOOMCOM_ID)
+       I_Error ("Doomcom buffer invalid!");
+    
+    netbuffer = &doomcom->data;
+    consoleplayer = displayplayer = doomcom->consoleplayer;
+    if (netgame)
+       D_ArbitrateNetStart ();
+
+    printf ("startskill %i  deathmatch: %i  startmap: %i  startepisode: %i\n",
+           startskill, deathmatch, startmap, startepisode);
+       
+    // read values out of doomcom
+    ticdup = doomcom->ticdup;
+    maxsend = BACKUPTICS/(2*ticdup)-1;
+    if (maxsend<1)
+       maxsend = 1;
+                       
+    for (i=0 ; i<doomcom->numplayers ; i++)
+       playeringame[i] = true;
+    for (i=0 ; i<doomcom->numnodes ; i++)
+       nodeingame[i] = true;
+       
+    printf ("player %i of %i (%i nodes)\n",
+           consoleplayer+1, doomcom->numplayers, doomcom->numnodes);
+
+}
+
+
+//
+// D_QuitNetGame
+// Called before quitting to leave a net game
+// without hanging the other players
+//
+void D_QuitNetGame (void)
+{
+    int             i, j;
+       
+    if (debugfile)
+       fclose (debugfile);
+               
+    if (!netgame || !usergame || consoleplayer == -1 || demoplayback)
+       return;
+       
+    // send a bunch of packets for security
+    netbuffer->player = consoleplayer;
+    netbuffer->numtics = 0;
+    for (i=0 ; i<4 ; i++)
+    {
+       for (j=1 ; j<doomcom->numnodes ; j++)
+           if (nodeingame[j])
+               HSendPacket (j, NCMD_EXIT);
+       I_WaitVBL (1);
+    }
+}
+
+
+
+//
+// TryRunTics
+//
+int    frametics[4];
+int    frameon;
+int    frameskip[4];
+int    oldnettics;
+
+extern boolean advancedemo;
+
+void TryRunTics (void)
+{
+    int                i;
+    int                lowtic;
+    int                entertic;
+    static int oldentertics;
+    int                realtics;
+    int                availabletics;
+    int                counts;
+    int                numplaying;
+    
+    // get real tics           
+    entertic = I_GetTime ()/ticdup;
+    realtics = entertic - oldentertics;
+    oldentertics = entertic;
+    
+    // get available tics
+    NetUpdate ();
+       
+    lowtic = MAXINT;
+    numplaying = 0;
+    for (i=0 ; i<doomcom->numnodes ; i++)
+    {
+       if (nodeingame[i])
+       {
+           numplaying++;
+           if (nettics[i] < lowtic)
+               lowtic = nettics[i];
+       }
+    }
+    availabletics = lowtic - gametic/ticdup;
+    
+    // decide how many tics to run
+    if (realtics < availabletics-1)
+       counts = realtics+1;
+    else if (realtics < availabletics)
+       counts = realtics;
+    else
+       counts = availabletics;
+    
+    if (counts < 1)
+       counts = 1;
+               
+    frameon++;
+
+    if (debugfile)
+       fprintf (debugfile,
+                "=======real: %i  avail: %i  game: %i\n",
+                realtics, availabletics,counts);
+
+    if (!demoplayback)
+    {  
+       // ideally nettics[0] should be 1 - 3 tics above lowtic
+       // if we are consistantly slower, speed up time
+       for (i=0 ; i<MAXPLAYERS ; i++)
+           if (playeringame[i])
+               break;
+       if (consoleplayer == i)
+       {
+           // the key player does not adapt
+       }
+       else
+       {
+           if (nettics[0] <= nettics[nodeforplayer[i]])
+           {
+               gametime--;
+               // printf ("-");
+           }
+           frameskip[frameon&3] = (oldnettics > nettics[nodeforplayer[i]]);
+           oldnettics = nettics[0];
+           if (frameskip[0] && frameskip[1] && frameskip[2] && frameskip[3])
+           {
+               skiptics = 1;
+               // printf ("+");
+           }
+       }
+    }// demoplayback
+       
+    // wait for new tics if needed
+    while (lowtic < gametic/ticdup + counts)   
+    {
+       NetUpdate ();   
+       lowtic = MAXINT;
+       
+       for (i=0 ; i<doomcom->numnodes ; i++)
+           if (nodeingame[i] && nettics[i] < lowtic)
+               lowtic = nettics[i];
+       
+       if (lowtic < gametic/ticdup)
+           I_Error ("TryRunTics: lowtic < gametic");
+                               
+       // don't stay in here forever -- give the menu a chance to work
+       if (I_GetTime ()/ticdup - entertic >= 20)
+       {
+           M_Ticker ();
+           return;
+       } 
+    }
+    
+    // run the count * ticdup dics
+    while (counts--)
+    {
+       for (i=0 ; i<ticdup ; i++)
+       {
+           if (gametic/ticdup > lowtic)
+               I_Error ("gametic>lowtic");
+           if (advancedemo)
+               D_DoAdvanceDemo ();
+           M_Ticker ();
+           G_Ticker ();
+           gametic++;
+           
+           // modify command for duplicated tics
+           if (i != ticdup-1)
+           {
+               ticcmd_t        *cmd;
+               int                     buf;
+               int                     j;
+                               
+               buf = (gametic/ticdup)%BACKUPTICS; 
+               for (j=0 ; j<MAXPLAYERS ; j++)
+               {
+                   cmd = &netcmds[j][buf];
+                   cmd->chatchar = 0;
+                   if (cmd->buttons & BT_SPECIAL)
+                       cmd->buttons = 0;
+               }
+           }
+       }
+       NetUpdate ();   // check for new console commands
+    }
+}
diff --git a/linuxdoom-1.10/d_net.h b/linuxdoom-1.10/d_net.h
new file mode 100644 (file)
index 0000000..b277472
--- /dev/null
@@ -0,0 +1,149 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// DESCRIPTION:
+//     Networking stuff.
+//
+//-----------------------------------------------------------------------------
+
+
+#ifndef __D_NET__
+#define __D_NET__
+
+#include "d_player.h"
+
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+
+//
+// Network play related stuff.
+// There is a data struct that stores network
+//  communication related stuff, and another
+//  one that defines the actual packets to
+//  be transmitted.
+//
+
+#define DOOMCOM_ID             0x12345678l
+
+// Max computers/players in a game.
+#define MAXNETNODES            8
+
+
+// Networking and tick handling related.
+#define BACKUPTICS             12
+
+typedef enum
+{
+    CMD_SEND   = 1,
+    CMD_GET    = 2
+
+} command_t;
+
+
+//
+// Network packet data.
+//
+typedef struct
+{
+    // High bit is retransmit request.
+    unsigned           checksum;
+    // Only valid if NCMD_RETRANSMIT.
+    byte               retransmitfrom;
+    
+    byte               starttic;
+    byte               player;
+    byte               numtics;
+    ticcmd_t           cmds[BACKUPTICS];
+
+} doomdata_t;
+
+
+
+
+typedef struct
+{
+    // Supposed to be DOOMCOM_ID?
+    long               id;
+    
+    // DOOM executes an int to execute commands.
+    short              intnum;         
+    // Communication between DOOM and the driver.
+    // Is CMD_SEND or CMD_GET.
+    short              command;
+    // Is dest for send, set by get (-1 = no packet).
+    short              remotenode;
+    
+    // Number of bytes in doomdata to be sent
+    short              datalength;
+
+    // Info common to all nodes.
+    // Console is allways node 0.
+    short              numnodes;
+    // Flag: 1 = no duplication, 2-5 = dup for slow nets.
+    short              ticdup;
+    // Flag: 1 = send a backup tic in every packet.
+    short              extratics;
+    // Flag: 1 = deathmatch.
+    short              deathmatch;
+    // Flag: -1 = new game, 0-5 = load savegame
+    short              savegame;
+    short              episode;        // 1-3
+    short              map;            // 1-9
+    short              skill;          // 1-5
+
+    // Info specific to this node.
+    short              consoleplayer;
+    short              numplayers;
+    
+    // These are related to the 3-display mode,
+    //  in which two drones looking left and right
+    //  were used to render two additional views
+    //  on two additional computers.
+    // Probably not operational anymore.
+    // 1 = left, 0 = center, -1 = right
+    short              angleoffset;
+    // 1 = drone
+    short              drone;          
+
+    // The packet data to be sent.
+    doomdata_t         data;
+    
+} doomcom_t;
+
+
+
+// Create any new ticcmds and broadcast to other players.
+void NetUpdate (void);
+
+// Broadcasts special packets to other players
+//  to notify of game exit
+void D_QuitNetGame (void);
+
+//? how many ticks to run?
+void TryRunTics (void);
+
+
+#endif
+
+//-----------------------------------------------------------------------------
+//
+// $Log:$
+//
+//-----------------------------------------------------------------------------
+
diff --git a/linuxdoom-1.10/d_player.h b/linuxdoom-1.10/d_player.h
new file mode 100644 (file)
index 0000000..0a4d887
--- /dev/null
@@ -0,0 +1,219 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// DESCRIPTION:
+//
+//
+//-----------------------------------------------------------------------------
+
+
+#ifndef __D_PLAYER__
+#define __D_PLAYER__
+
+
+// The player data structure depends on a number
+// of other structs: items (internal inventory),
+// animation states (closely tied to the sprites
+// used to represent them, unfortunately).
+#include "d_items.h"
+#include "p_pspr.h"
+
+// In addition, the player is just a special
+// case of the generic moving object/actor.
+#include "p_mobj.h"
+
+// Finally, for odd reasons, the player input
+// is buffered within the player data struct,
+// as commands per game tick.
+#include "d_ticcmd.h"
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+
+
+
+//
+// Player states.
+//
+typedef enum
+{
+    // Playing or camping.
+    PST_LIVE,
+    // Dead on the ground, view follows killer.
+    PST_DEAD,
+    // Ready to restart/respawn???
+    PST_REBORN         
+
+} playerstate_t;
+
+
+//
+// Player internal flags, for cheats and debug.
+//
+typedef enum
+{
+    // No clipping, walk through barriers.
+    CF_NOCLIP          = 1,
+    // No damage, no health loss.
+    CF_GODMODE         = 2,
+    // Not really a cheat, just a debug aid.
+    CF_NOMOMENTUM      = 4
+
+} cheat_t;
+
+
+//
+// Extended player object info: player_t
+//
+typedef struct player_s
+{
+    mobj_t*            mo;
+    playerstate_t      playerstate;
+    ticcmd_t           cmd;
+
+    // Determine POV,
+    //  including viewpoint bobbing during movement.
+    // Focal origin above r.z
+    fixed_t            viewz;
+    // Base height above floor for viewz.
+    fixed_t            viewheight;
+    // Bob/squat speed.
+    fixed_t            deltaviewheight;
+    // bounded/scaled total momentum.
+    fixed_t            bob;    
+
+    // This is only used between levels,
+    // mo->health is used during levels.
+    int                        health; 
+    int                        armorpoints;
+    // Armor type is 0-2.
+    int                        armortype;      
+
+    // Power ups. invinc and invis are tic counters.
+    int                        powers[NUMPOWERS];
+    boolean            cards[NUMCARDS];
+    boolean            backpack;
+    
+    // Frags, kills of other players.
+    int                        frags[MAXPLAYERS];
+    weapontype_t       readyweapon;
+    
+    // Is wp_nochange if not changing.
+    weapontype_t       pendingweapon;
+
+    boolean            weaponowned[NUMWEAPONS];
+    int                        ammo[NUMAMMO];
+    int                        maxammo[NUMAMMO];
+
+    // True if button down last tic.
+    int                        attackdown;
+    int                        usedown;
+
+    // Bit flags, for cheats and debug.
+    // See cheat_t, above.
+    int                        cheats;         
+
+    // Refired shots are less accurate.
+    int                        refire;         
+
+     // For intermission stats.
+    int                        killcount;
+    int                        itemcount;
+    int                        secretcount;
+
+    // Hint messages.
+    char*              message;        
+    
+    // For screen flashing (red or bright).
+    int                        damagecount;
+    int                        bonuscount;
+
+    // Who did damage (NULL for floors/ceilings).
+    mobj_t*            attacker;
+    
+    // So gun flashes light up areas.
+    int                        extralight;
+
+    // Current PLAYPAL, ???
+    //  can be set to REDCOLORMAP for pain, etc.
+    int                        fixedcolormap;
+
+    // Player skin colorshift,
+    //  0-3 for which color to draw player.
+    int                        colormap;       
+
+    // Overlay view sprites (gun, etc).
+    pspdef_t           psprites[NUMPSPRITES];
+
+    // True if secret level has been done.
+    boolean            didsecret;      
+
+} player_t;
+
+
+//
+// INTERMISSION
+// Structure passed e.g. to WI_Start(wb)
+//
+typedef struct
+{
+    boolean    in;     // whether the player is in game
+    
+    // Player stats, kills, collected items etc.
+    int                skills;
+    int                sitems;
+    int                ssecret;
+    int                stime; 
+    int                frags[4];
+    int                score;  // current score on entry, modified on return
+  
+} wbplayerstruct_t;
+
+typedef struct
+{
+    int                epsd;   // episode # (0-2)
+
+    // if true, splash the secret level
+    boolean    didsecret;
+    
+    // previous and next levels, origin 0
+    int                last;
+    int                next;   
+    
+    int                maxkills;
+    int                maxitems;
+    int                maxsecret;
+    int                maxfrags;
+
+    // the par time
+    int                partime;
+    
+    // index of this player in game
+    int                pnum;   
+
+    wbplayerstruct_t   plyr[MAXPLAYERS];
+
+} wbstartstruct_t;
+
+
+#endif
+//-----------------------------------------------------------------------------
+//
+// $Log:$
+//
+//-----------------------------------------------------------------------------
diff --git a/linuxdoom-1.10/d_textur.h b/linuxdoom-1.10/d_textur.h
new file mode 100644 (file)
index 0000000..3624efb
--- /dev/null
@@ -0,0 +1,51 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// DESCRIPTION:
+//     Typedefs related to to textures etc.,
+//      isolated here to make it easier separating modules.
+//    
+//-----------------------------------------------------------------------------
+
+
+#ifndef __D_TEXTUR__
+#define __D_TEXTUR__
+
+#include "doomtype.h"
+
+
+
+
+//
+// Flats?
+//
+// a pic is an unmasked block of pixels
+typedef struct
+{
+    byte               width;
+    byte               height;
+    byte               data;
+} pic_t;
+
+
+
+
+#endif
+//-----------------------------------------------------------------------------
+//
+// $Log:$
+//
+//-----------------------------------------------------------------------------
diff --git a/linuxdoom-1.10/d_think.h b/linuxdoom-1.10/d_think.h
new file mode 100644 (file)
index 0000000..6a58165
--- /dev/null
@@ -0,0 +1,79 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// DESCRIPTION:
+//  MapObj data. Map Objects or mobjs are actors, entities,
+//  thinker, take-your-pick... anything that moves, acts, or
+//  suffers state changes of more or less violent nature.
+//
+//-----------------------------------------------------------------------------
+
+
+#ifndef __D_THINK__
+#define __D_THINK__
+
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+
+
+//
+// Experimental stuff.
+// To compile this as "ANSI C with classes"
+//  we will need to handle the various
+//  action functions cleanly.
+//
+typedef  void (*actionf_v)();
+typedef  void (*actionf_p1)( void* );
+typedef  void (*actionf_p2)( void*, void* );
+
+typedef union
+{
+  actionf_p1   acp1;
+  actionf_v    acv;
+  actionf_p2   acp2;
+
+} actionf_t;
+
+
+
+
+
+// Historically, "think_t" is yet another
+//  function pointer to a routine to handle
+//  an actor.
+typedef actionf_t  think_t;
+
+
+// Doubly linked list of actors.
+typedef struct thinker_s
+{
+    struct thinker_s*  prev;
+    struct thinker_s*  next;
+    think_t            function;
+    
+} thinker_t;
+
+
+
+#endif
+//-----------------------------------------------------------------------------
+//
+// $Log:$
+//
+//-----------------------------------------------------------------------------
diff --git a/linuxdoom-1.10/d_ticcmd.h b/linuxdoom-1.10/d_ticcmd.h
new file mode 100644 (file)
index 0000000..5817989
--- /dev/null
@@ -0,0 +1,53 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// DESCRIPTION:
+//     System specific interface stuff.
+//
+//-----------------------------------------------------------------------------
+
+
+#ifndef __D_TICCMD__
+#define __D_TICCMD__
+
+#include "doomtype.h"
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+// The data sampled per tick (single player)
+// and transmitted to other peers (multiplayer).
+// Mainly movements/button commands per game tick,
+// plus a checksum for internal state consistency.
+typedef struct
+{
+    char       forwardmove;    // *2048 for move
+    char       sidemove;       // *2048 for move
+    short      angleturn;      // <<16 for angle delta
+    short      consistancy;    // checks for net game
+    byte       chatchar;
+    byte       buttons;
+} ticcmd_t;
+
+
+
+#endif
+//-----------------------------------------------------------------------------
+//
+// $Log:$
+//
+//-----------------------------------------------------------------------------
diff --git a/linuxdoom-1.10/doomdata.h b/linuxdoom-1.10/doomdata.h
new file mode 100644 (file)
index 0000000..bab5e00
--- /dev/null
@@ -0,0 +1,222 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// DESCRIPTION:
+//  all external data is defined here
+//  most of the data is loaded into different structures at run time
+//  some internal structures shared by many modules are here
+//
+//-----------------------------------------------------------------------------
+
+#ifndef __DOOMDATA__
+#define __DOOMDATA__
+
+// The most basic types we use, portability.
+#include "doomtype.h"
+
+// Some global defines, that configure the game.
+#include "doomdef.h"
+
+
+
+//
+// Map level types.
+// The following data structures define the persistent format
+// used in the lumps of the WAD files.
+//
+
+// Lump order in a map WAD: each map needs a couple of lumps
+// to provide a complete scene geometry description.
+enum
+{
+  ML_LABEL,            // A separator, name, ExMx or MAPxx
+  ML_THINGS,           // Monsters, items..
+  ML_LINEDEFS,         // LineDefs, from editing
+  ML_SIDEDEFS,         // SideDefs, from editing
+  ML_VERTEXES,         // Vertices, edited and BSP splits generated
+  ML_SEGS,             // LineSegs, from LineDefs split by BSP
+  ML_SSECTORS,         // SubSectors, list of LineSegs
+  ML_NODES,            // BSP nodes
+  ML_SECTORS,          // Sectors, from editing
+  ML_REJECT,           // LUT, sector-sector visibility        
+  ML_BLOCKMAP          // LUT, motion clipping, walls/grid element
+};
+
+
+// A single Vertex.
+typedef struct
+{
+  short                x;
+  short                y;
+} mapvertex_t;
+
+
+// A SideDef, defining the visual appearance of a wall,
+// by setting textures and offsets.
+typedef struct
+{
+  short                textureoffset;
+  short                rowoffset;
+  char         toptexture[8];
+  char         bottomtexture[8];
+  char         midtexture[8];
+  // Front sector, towards viewer.
+  short                sector;
+} mapsidedef_t;
+
+
+
+// A LineDef, as used for editing, and as input
+// to the BSP builder.
+typedef struct
+{
+  short                v1;
+  short                v2;
+  short                flags;
+  short                special;
+  short                tag;
+  // sidenum[1] will be -1 if one sided
+  short                sidenum[2];             
+} maplinedef_t;
+
+
+//
+// LineDef attributes.
+//
+
+// Solid, is an obstacle.
+#define ML_BLOCKING            1
+
+// Blocks monsters only.
+#define ML_BLOCKMONSTERS       2
+
+// Backside will not be present at all
+//  if not two sided.
+#define ML_TWOSIDED            4
+
+// If a texture is pegged, the texture will have
+// the end exposed to air held constant at the
+// top or bottom of the texture (stairs or pulled
+// down things) and will move with a height change
+// of one of the neighbor sectors.
+// Unpegged textures allways have the first row of
+// the texture at the top pixel of the line for both
+// top and bottom textures (use next to windows).
+
+// upper texture unpegged
+#define ML_DONTPEGTOP          8
+
+// lower texture unpegged
+#define ML_DONTPEGBOTTOM       16      
+
+// In AutoMap: don't map as two sided: IT'S A SECRET!
+#define ML_SECRET              32
+
+// Sound rendering: don't let sound cross two of these.
+#define ML_SOUNDBLOCK          64
+
+// Don't draw on the automap at all.
+#define ML_DONTDRAW            128
+
+// Set if already seen, thus drawn in automap.
+#define ML_MAPPED              256
+
+
+
+
+// Sector definition, from editing.
+typedef        struct
+{
+  short                floorheight;
+  short                ceilingheight;
+  char         floorpic[8];
+  char         ceilingpic[8];
+  short                lightlevel;
+  short                special;
+  short                tag;
+} mapsector_t;
+
+// SubSector, as generated by BSP.
+typedef struct
+{
+  short                numsegs;
+  // Index of first one, segs are stored sequentially.
+  short                firstseg;       
+} mapsubsector_t;
+
+
+// LineSeg, generated by splitting LineDefs
+// using partition lines selected by BSP builder.
+typedef struct
+{
+  short                v1;
+  short                v2;
+  short                angle;          
+  short                linedef;
+  short                side;
+  short                offset;
+} mapseg_t;
+
+
+
+// BSP node structure.
+
+// Indicate a leaf.
+#define        NF_SUBSECTOR    0x8000
+
+typedef struct
+{
+  // Partition line from (x,y) to x+dx,y+dy)
+  short                x;
+  short                y;
+  short                dx;
+  short                dy;
+
+  // Bounding box for each child,
+  // clip against view frustum.
+  short                bbox[2][4];
+
+  // If NF_SUBSECTOR its a subsector,
+  // else it's a node of another subtree.
+  unsigned short       children[2];
+
+} mapnode_t;
+
+
+
+
+// Thing definition, position, orientation and type,
+// plus skill/visibility flags and attributes.
+typedef struct
+{
+    short              x;
+    short              y;
+    short              angle;
+    short              type;
+    short              options;
+} mapthing_t;
+
+
+
+
+
+#endif                 // __DOOMDATA__
+//-----------------------------------------------------------------------------
+//
+// $Log:$
+//
+//-----------------------------------------------------------------------------
+
diff --git a/linuxdoom-1.10/doomdef.c b/linuxdoom-1.10/doomdef.c
new file mode 100644 (file)
index 0000000..e5fb686
--- /dev/null
@@ -0,0 +1,38 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// $Log:$
+//
+// DESCRIPTION:
+//  DoomDef - basic defines for DOOM, e.g. Version, game mode
+//   and skill level, and display parameters.
+//
+//-----------------------------------------------------------------------------
+
+static const char
+rcsid[] = "$Id: m_bbox.c,v 1.1 1997/02/03 22:45:10 b1 Exp $";
+
+
+#ifdef __GNUG__
+#pragma implementation "doomdef.h"
+#endif
+#include "doomdef.h"
+
+// Location for any defines turned variables.
+
+// None.
+
+
diff --git a/linuxdoom-1.10/doomdef.h b/linuxdoom-1.10/doomdef.h
new file mode 100644 (file)
index 0000000..1850477
--- /dev/null
@@ -0,0 +1,338 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// DESCRIPTION:
+//  Internally used data structures for virtually everything,
+//   key definitions, lots of other stuff.
+//
+//-----------------------------------------------------------------------------
+
+#ifndef __DOOMDEF__
+#define __DOOMDEF__
+
+#include <stdio.h>
+#include <string.h>
+
+//
+// Global parameters/defines.
+//
+// DOOM version
+enum { VERSION =  110 };
+
+
+// Game mode handling - identify IWAD version
+//  to handle IWAD dependend animations etc.
+typedef enum
+{
+  shareware,   // DOOM 1 shareware, E1, M9
+  registered,  // DOOM 1 registered, E3, M27
+  commercial,  // DOOM 2 retail, E1 M34
+  // DOOM 2 german edition not handled
+  retail,      // DOOM 1 retail, E4, M36
+  indetermined // Well, no IWAD found.
+  
+} GameMode_t;
+
+
+// Mission packs - might be useful for TC stuff?
+typedef enum
+{
+  doom,                // DOOM 1
+  doom2,       // DOOM 2
+  pack_tnt,    // TNT mission pack
+  pack_plut,   // Plutonia pack
+  none
+
+} GameMission_t;
+
+
+// Identify language to use, software localization.
+typedef enum
+{
+  english,
+  french,
+  german,
+  unknown
+
+} Language_t;
+
+
+// If rangecheck is undefined,
+// most parameter validation debugging code will not be compiled
+#define RANGECHECK
+
+// Do or do not use external soundserver.
+// The sndserver binary to be run separately
+//  has been introduced by Dave Taylor.
+// The integrated sound support is experimental,
+//  and unfinished. Default is synchronous.
+// Experimental asynchronous timer based is
+//  handled by SNDINTR. 
+#define SNDSERV  1
+//#define SNDINTR  1
+
+
+// This one switches between MIT SHM (no proper mouse)
+// and XFree86 DGA (mickey sampling). The original
+// linuxdoom used SHM, which is default.
+//#define X11_DGA              1
+
+
+//
+// For resize of screen, at start of game.
+// It will not work dynamically, see visplanes.
+//
+#define        BASE_WIDTH              320
+
+// It is educational but futile to change this
+//  scaling e.g. to 2. Drawing of status bar,
+//  menues etc. is tied to the scale implied
+//  by the graphics.
+#define        SCREEN_MUL              1
+#define        INV_ASPECT_RATIO        0.625 // 0.75, ideally
+
+// Defines suck. C sucks.
+// C++ might sucks for OOP, but it sure is a better C.
+// So there.
+#define SCREENWIDTH  320
+//SCREEN_MUL*BASE_WIDTH //320
+#define SCREENHEIGHT 200
+//(int)(SCREEN_MUL*BASE_WIDTH*INV_ASPECT_RATIO) //200
+
+
+
+
+// The maximum number of players, multiplayer/networking.
+#define MAXPLAYERS             4
+
+// State updates, number of tics / second.
+#define TICRATE                35
+
+// The current state of the game: whether we are
+// playing, gazing at the intermission screen,
+// the game final animation, or a demo. 
+typedef enum
+{
+    GS_LEVEL,
+    GS_INTERMISSION,
+    GS_FINALE,
+    GS_DEMOSCREEN
+} gamestate_t;
+
+//
+// Difficulty/skill settings/filters.
+//
+
+// Skill flags.
+#define        MTF_EASY                1
+#define        MTF_NORMAL              2
+#define        MTF_HARD                4
+
+// Deaf monsters/do not react to sound.
+#define        MTF_AMBUSH              8
+
+typedef enum
+{
+    sk_baby,
+    sk_easy,
+    sk_medium,
+    sk_hard,
+    sk_nightmare
+} skill_t;
+
+
+
+
+//
+// Key cards.
+//
+typedef enum
+{
+    it_bluecard,
+    it_yellowcard,
+    it_redcard,
+    it_blueskull,
+    it_yellowskull,
+    it_redskull,
+    
+    NUMCARDS
+    
+} card_t;
+
+
+
+// The defined weapons,
+//  including a marker indicating
+//  user has not changed weapon.
+typedef enum
+{
+    wp_fist,
+    wp_pistol,
+    wp_shotgun,
+    wp_chaingun,
+    wp_missile,
+    wp_plasma,
+    wp_bfg,
+    wp_chainsaw,
+    wp_supershotgun,
+
+    NUMWEAPONS,
+    
+    // No pending weapon change.
+    wp_nochange
+
+} weapontype_t;
+
+
+// Ammunition types defined.
+typedef enum
+{
+    am_clip,   // Pistol / chaingun ammo.
+    am_shell,  // Shotgun / double barreled shotgun.
+    am_cell,   // Plasma rifle, BFG.
+    am_misl,   // Missile launcher.
+    NUMAMMO,
+    am_noammo  // Unlimited for chainsaw / fist.       
+
+} ammotype_t;
+
+
+// Power up artifacts.
+typedef enum
+{
+    pw_invulnerability,
+    pw_strength,
+    pw_invisibility,
+    pw_ironfeet,
+    pw_allmap,
+    pw_infrared,
+    NUMPOWERS
+    
+} powertype_t;
+
+
+
+//
+// Power up durations,
+//  how many seconds till expiration,
+//  assuming TICRATE is 35 ticks/second.
+//
+typedef enum
+{
+    INVULNTICS = (30*TICRATE),
+    INVISTICS  = (60*TICRATE),
+    INFRATICS  = (120*TICRATE),
+    IRONTICS   = (60*TICRATE)
+    
+} powerduration_t;
+
+
+
+
+//
+// DOOM keyboard definition.
+// This is the stuff configured by Setup.Exe.
+// Most key data are simple ascii (uppercased).
+//
+#define KEY_RIGHTARROW 0xae
+#define KEY_LEFTARROW  0xac
+#define KEY_UPARROW    0xad
+#define KEY_DOWNARROW  0xaf
+#define KEY_ESCAPE     27
+#define KEY_ENTER      13
+#define KEY_TAB                9
+#define KEY_F1         (0x80+0x3b)
+#define KEY_F2         (0x80+0x3c)
+#define KEY_F3         (0x80+0x3d)
+#define KEY_F4         (0x80+0x3e)
+#define KEY_F5         (0x80+0x3f)
+#define KEY_F6         (0x80+0x40)
+#define KEY_F7         (0x80+0x41)
+#define KEY_F8         (0x80+0x42)
+#define KEY_F9         (0x80+0x43)
+#define KEY_F10                (0x80+0x44)
+#define KEY_F11                (0x80+0x57)
+#define KEY_F12                (0x80+0x58)
+
+#define KEY_BACKSPACE  127
+#define KEY_PAUSE      0xff
+
+#define KEY_EQUALS     0x3d
+#define KEY_MINUS      0x2d
+
+#define KEY_RSHIFT     (0x80+0x36)
+#define KEY_RCTRL      (0x80+0x1d)
+#define KEY_RALT       (0x80+0x38)
+
+#define KEY_LALT       KEY_RALT
+
+
+
+// DOOM basic types (boolean),
+//  and max/min values.
+//#include "doomtype.h"
+
+// Fixed point.
+//#include "m_fixed.h"
+
+// Endianess handling.
+//#include "m_swap.h"
+
+
+// Binary Angles, sine/cosine/atan lookups.
+//#include "tables.h"
+
+// Event type.
+//#include "d_event.h"
+
+// Game function, skills.
+//#include "g_game.h"
+
+// All external data is defined here.
+//#include "doomdata.h"
+
+// All important printed strings.
+// Language selection (message strings).
+//#include "dstrings.h"
+
+// Player is a special actor.
+//struct player_s;
+
+
+//#include "d_items.h"
+//#include "d_player.h"
+//#include "p_mobj.h"
+//#include "d_net.h"
+
+// PLAY
+//#include "p_tick.h"
+
+
+
+
+// Header, generated by sound utility.
+// The utility was written by Dave Taylor.
+//#include "sounds.h"
+
+
+
+
+#endif          // __DOOMDEF__
+//-----------------------------------------------------------------------------
+//
+// $Log:$
+//
+//-----------------------------------------------------------------------------
diff --git a/linuxdoom-1.10/doomstat.c b/linuxdoom-1.10/doomstat.c
new file mode 100644 (file)
index 0000000..8d19ace
--- /dev/null
@@ -0,0 +1,46 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// $Log:$
+//
+// DESCRIPTION:
+//     Put all global tate variables here.
+//
+//-----------------------------------------------------------------------------
+
+static const char
+rcsid[] = "$Id: m_bbox.c,v 1.1 1997/02/03 22:45:10 b1 Exp $";
+
+
+#ifdef __GNUG__
+#pragma implementation "doomstat.h"
+#endif
+#include "doomstat.h"
+
+
+// Game Mode - identify IWAD as shareware, retail etc.
+GameMode_t gamemode = indetermined;
+GameMission_t  gamemission = doom;
+
+// Language.
+Language_t   language = english;
+
+// Set if homebrew PWAD stuff has been added.
+boolean        modifiedgame;
+
+
+
+
diff --git a/linuxdoom-1.10/doomstat.h b/linuxdoom-1.10/doomstat.h
new file mode 100644 (file)
index 0000000..65f5225
--- /dev/null
@@ -0,0 +1,296 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// DESCRIPTION:
+//   All the global variables that store the internal state.
+//   Theoretically speaking, the internal state of the engine
+//    should be found by looking at the variables collected
+//    here, and every relevant module will have to include
+//    this header file.
+//   In practice, things are a bit messy.
+//
+//-----------------------------------------------------------------------------
+
+
+#ifndef __D_STATE__
+#define __D_STATE__
+
+// We need globally shared data structures,
+//  for defining the global state variables.
+#include "doomdata.h"
+#include "d_net.h"
+
+// We need the playr data structure as well.
+#include "d_player.h"
+
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+
+
+// ------------------------
+// Command line parameters.
+//
+extern  boolean        nomonsters;     // checkparm of -nomonsters
+extern  boolean        respawnparm;    // checkparm of -respawn
+extern  boolean        fastparm;       // checkparm of -fast
+
+extern  boolean        devparm;        // DEBUG: launched with -devparm
+
+
+
+// -----------------------------------------------------
+// Game Mode - identify IWAD as shareware, retail etc.
+//
+extern GameMode_t      gamemode;
+extern GameMission_t   gamemission;
+
+// Set if homebrew PWAD stuff has been added.
+extern  boolean        modifiedgame;
+
+
+// -------------------------------------------
+// Language.
+extern  Language_t   language;
+
+
+// -------------------------------------------
+// Selected skill type, map etc.
+//
+
+// Defaults for menu, methinks.
+extern  skill_t                startskill;
+extern  int             startepisode;
+extern int             startmap;
+
+extern  boolean                autostart;
+
+// Selected by user. 
+extern  skill_t         gameskill;
+extern  int            gameepisode;
+extern  int            gamemap;
+
+// Nightmare mode flag, single player.
+extern  boolean         respawnmonsters;
+
+// Netgame? Only true if >1 player.
+extern  boolean        netgame;
+
+// Flag: true only if started as net deathmatch.
+// An enum might handle altdeath/cooperative better.
+extern  boolean        deathmatch;     
+       
+// -------------------------
+// Internal parameters for sound rendering.
+// These have been taken from the DOS version,
+//  but are not (yet) supported with Linux
+//  (e.g. no sound volume adjustment with menu.
+
+// These are not used, but should be (menu).
+// From m_menu.c:
+//  Sound FX volume has default, 0 - 15
+//  Music volume has default, 0 - 15
+// These are multiplied by 8.
+extern int snd_SfxVolume;      // maximum volume for sound
+extern int snd_MusicVolume;    // maximum volume for music
+
+// Current music/sfx card - index useless
+//  w/o a reference LUT in a sound module.
+// Ideally, this would use indices found
+//  in: /usr/include/linux/soundcard.h
+extern int snd_MusicDevice;
+extern int snd_SfxDevice;
+// Config file? Same disclaimer as above.
+extern int snd_DesiredMusicDevice;
+extern int snd_DesiredSfxDevice;
+
+
+// -------------------------
+// Status flags for refresh.
+//
+
+// Depending on view size - no status bar?
+// Note that there is no way to disable the
+//  status bar explicitely.
+extern  boolean statusbaractive;
+
+extern  boolean automapactive; // In AutoMap mode?
+extern  boolean        menuactive;     // Menu overlayed?
+extern  boolean        paused;         // Game Pause?
+
+
+extern  boolean                viewactive;
+
+extern  boolean                nodrawers;
+extern  boolean                noblit;
+
+extern int             viewwindowx;
+extern int             viewwindowy;
+extern int             viewheight;
+extern int             viewwidth;
+extern int             scaledviewwidth;
+
+
+
+
+
+
+// This one is related to the 3-screen display mode.
+// ANG90 = left side, ANG270 = right
+extern  int    viewangleoffset;
+
+// Player taking events, and displaying.
+extern  int    consoleplayer;  
+extern  int    displayplayer;
+
+
+// -------------------------------------
+// Scores, rating.
+// Statistics on a given map, for intermission.
+//
+extern  int    totalkills;
+extern int     totalitems;
+extern int     totalsecret;
+
+// Timer, for scores.
+extern  int    levelstarttic;  // gametic at level start
+extern  int    leveltime;      // tics in game play for par
+
+
+
+// --------------------------------------
+// DEMO playback/recording related stuff.
+// No demo, there is a human player in charge?
+// Disable save/end game?
+extern  boolean        usergame;
+
+//?
+extern  boolean        demoplayback;
+extern  boolean        demorecording;
+
+// Quit after playing a demo from cmdline.
+extern  boolean                singledemo;     
+
+
+
+
+//?
+extern  gamestate_t     gamestate;
+
+
+
+
+
+
+//-----------------------------
+// Internal parameters, fixed.
+// These are set by the engine, and not changed
+//  according to user inputs. Partly load from
+//  WAD, partly set at startup time.
+
+
+
+extern int             gametic;
+
+
+// Bookkeeping on players - state.
+extern player_t        players[MAXPLAYERS];
+
+// Alive? Disconnected?
+extern  boolean                playeringame[MAXPLAYERS];
+
+
+// Player spawn spots for deathmatch.
+#define MAX_DM_STARTS   10
+extern  mapthing_t      deathmatchstarts[MAX_DM_STARTS];
+extern  mapthing_t*    deathmatch_p;
+
+// Player spawn spots.
+extern  mapthing_t      playerstarts[MAXPLAYERS];
+
+// Intermission stats.
+// Parameters for world map / intermission.
+extern  wbstartstruct_t                wminfo; 
+
+
+// LUT of ammunition limits for each kind.
+// This doubles with BackPack powerup item.
+extern  int            maxammo[NUMAMMO];
+
+
+
+
+
+//-----------------------------------------
+// Internal parameters, used for engine.
+//
+
+// File handling stuff.
+extern char            basedefault[1024];
+extern  FILE*          debugfile;
+
+// if true, load all graphics at level load
+extern  boolean         precache;
+
+
+// wipegamestate can be set to -1
+//  to force a wipe on the next draw
+extern  gamestate_t     wipegamestate;
+
+extern  int             mouseSensitivity;
+//?
+// debug flag to cancel adaptiveness
+extern  boolean         singletics;    
+
+extern  int             bodyqueslot;
+
+
+
+// Needed to store the number of the dummy sky flat.
+// Used for rendering,
+//  as well as tracking projectiles etc.
+extern int             skyflatnum;
+
+
+
+// Netgame stuff (buffers and pointers, i.e. indices).
+
+// This is ???
+extern  doomcom_t*     doomcom;
+
+// This points inside doomcom.
+extern  doomdata_t*    netbuffer;      
+
+
+extern  ticcmd_t       localcmds[BACKUPTICS];
+extern int             rndindex;
+
+extern int             maketic;
+extern  int             nettics[MAXNETNODES];
+
+extern  ticcmd_t        netcmds[MAXPLAYERS][BACKUPTICS];
+extern int             ticdup;
+
+
+
+#endif
+//-----------------------------------------------------------------------------
+//
+// $Log:$
+//
+//-----------------------------------------------------------------------------
diff --git a/linuxdoom-1.10/doomtype.h b/linuxdoom-1.10/doomtype.h
new file mode 100644 (file)
index 0000000..e89a7a6
--- /dev/null
@@ -0,0 +1,66 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// DESCRIPTION:
+//     Simple basic typedefs, isolated here to make it easier
+//      separating modules.
+//    
+//-----------------------------------------------------------------------------
+
+
+#ifndef __DOOMTYPE__
+#define __DOOMTYPE__
+
+
+#ifndef __BYTEBOOL__
+#define __BYTEBOOL__
+// Fixed to use builtin bool type with C++.
+#ifdef __cplusplus
+typedef bool boolean;
+#else
+typedef enum {false, true} boolean;
+#endif
+typedef unsigned char byte;
+#endif
+
+
+// Predefined with some OS.
+#ifdef LINUX
+#include <values.h>
+#else
+#define MAXCHAR                ((char)0x7f)
+#define MAXSHORT       ((short)0x7fff)
+
+// Max pos 32-bit int.
+#define MAXINT         ((int)0x7fffffff)       
+#define MAXLONG                ((long)0x7fffffff)
+#define MINCHAR                ((char)0x80)
+#define MINSHORT       ((short)0x8000)
+
+// Max negative 32-bit integer.
+#define MININT         ((int)0x80000000)       
+#define MINLONG                ((long)0x80000000)
+#endif
+
+
+
+
+#endif
+//-----------------------------------------------------------------------------
+//
+// $Log:$
+//
+//-----------------------------------------------------------------------------
diff --git a/linuxdoom-1.10/dstrings.c b/linuxdoom-1.10/dstrings.c
new file mode 100644 (file)
index 0000000..e6abe88
--- /dev/null
@@ -0,0 +1,72 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// $Log:$
+//
+// DESCRIPTION:
+//     Globally defined strings.
+// 
+//-----------------------------------------------------------------------------
+
+static const char
+rcsid[] = "$Id: m_bbox.c,v 1.1 1997/02/03 22:45:10 b1 Exp $";
+
+
+#ifdef __GNUG__
+#pragma implementation "dstrings.h"
+#endif
+#include "dstrings.h"
+
+
+
+char* endmsg[NUM_QUITMESSAGES+1]=
+{
+  // DOOM1
+  QUITMSG,
+  "please don't leave, there's more\ndemons to toast!",
+  "let's beat it -- this is turning\ninto a bloodbath!",
+  "i wouldn't leave if i were you.\ndos is much worse.",
+  "you're trying to say you like dos\nbetter than me, right?",
+  "don't leave yet -- there's a\ndemon around that corner!",
+  "ya know, next time you come in here\ni'm gonna toast ya.",
+  "go ahead and leave. see if i care."
+
+  // QuitDOOM II messages
+  "you want to quit?\nthen, thou hast lost an eighth!",
+  "don't go now, there's a \ndimensional shambler waiting\nat the dos prompt!",
+  "get outta here and go back\nto your boring programs.",
+  "if i were your boss, i'd \n deathmatch ya in a minute!",
+  "look, bud. you leave now\nand you forfeit your body count!",
+  "just leave. when you come\nback, i'll be waiting with a bat.",
+  "you're lucky i don't smack\nyou for thinking about leaving."
+
+  // FinalDOOM?
+  "fuck you, pussy!\nget the fuck out!",
+  "you quit and i'll jizz\nin your cystholes!",
+  "if you leave, i'll make\nthe lord drink my jizz.",
+  "hey, ron! can we say\n'fuck' in the game?",
+  "i'd leave: this is just\nmore monsters and levels.\nwhat a load.",
+  "suck it down, asshole!\nyou're a fucking wimp!",
+  "don't quit now! we're \nstill spending your money!",
+
+  // Internal debug. Different style, too.
+  "THIS IS NO MESSAGE!\nPage intentionally left blank."
+};
+
+
+  
+
+
diff --git a/linuxdoom-1.10/dstrings.h b/linuxdoom-1.10/dstrings.h
new file mode 100644 (file)
index 0000000..291767b
--- /dev/null
@@ -0,0 +1,66 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+//
+// $Log:$
+//
+// DESCRIPTION:
+//     DOOM strings, by language.
+//
+//-----------------------------------------------------------------------------
+
+
+#ifndef __DSTRINGS__
+#define __DSTRINGS__
+
+
+// All important printed strings.
+// Language selection (message strings).
+// Use -DFRENCH etc.
+
+#ifdef FRENCH
+#include "d_french.h"
+#else
+#include "d_englsh.h"
+#endif
+
+// Misc. other strings.
+#define SAVEGAMENAME   "doomsav"
+
+
+//
+// File locations,
+//  relative to current position.
+// Path names are OS-sensitive.
+//
+#define DEVMAPS "devmaps"
+#define DEVDATA "devdata"
+
+
+// Not done in french?
+
+// QuitDOOM messages
+#define NUM_QUITMESSAGES   22
+
+extern char* endmsg[];
+
+
+#endif
+//-----------------------------------------------------------------------------
+//
+// $Log:$
+//
+//-----------------------------------------------------------------------------
diff --git a/linuxdoom-1.10/f_finale.c b/linuxdoom-1.10/f_finale.c
new file mode 100644 (file)
index 0000000..a6e74dd
--- /dev/null
@@ -0,0 +1,738 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id:$
+//
+// Copyright (C) 1993-1996 by id Software, Inc.
+//
+// This source is available for distribution and/or modification
+// only under the terms of the DOOM Source Code License as
+// published by id Software. All rights reserved.
+//
+// The source is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
+// for more details.
+//
+// $Log:$
+//
+// DESCRIPTION:
+//     Game completion, final screen animation.
+//
+//-----------------------------------------------------------------------------
+
+
+static const char
+rcsid[] = "$Id: f_finale.c,v 1.5 1997/02/03 21:26:34 b1 Exp $";
+
+#include <ctype.h>
+
+// Functions.
+#include "i_system.h"
+#include "m_swap.h"
+#include "z_zone.h"
+#include "v_video.h"
+#include "w_wad.h"
+#include "s_sound.h"
+
+// Data.
+#include "dstrings.h"
+#include "sounds.h"
+
+#include "doomstat.h"
+#include "r_state.h"
+
+// ?
+//#include "doomstat.h"
+//#include "r_local.h"
+//#include "f_finale.h"
+
+// Stage of animation:
+//  0 = text, 1 = art screen, 2 = character cast
+int            finalestage;
+
+int            finalecount;
+
+#define        TEXTSPEED       3
+#define        TEXTWAIT        250
+
+char*  e1text = E1TEXT;
+char*  e2text = E2TEXT;
+char*  e3text = E3TEXT;
+char*  e4text = E4TEXT;
+
+char*  c1text = C1TEXT;
+char*  c2text = C2TEXT;
+char*  c3text = C3TEXT;
+char*  c4text = C4TEXT;
+char*  c5text = C5TEXT;
+char*  c6text = C6TEXT;
+
+char*  p1text = P1TEXT;
+char*  p2text = P2TEXT;
+char*  p3text = P3TEXT;
+char*  p4text = P4TEXT;
+char*  p5text = P5TEXT;
+char*  p6text = P6TEXT;
+
+char*  t1text = T1TEXT;
+char*  t2text = T2TEXT;
+char*  t3text = T3TEXT;
+char*  t4text = T4TEXT;
+char*  t5text = T5TEXT;
+char*  t6text = T6TEXT;
+
+char*  finaletext;
+char*  finaleflat;
+
+void   F_StartCast (void);
+void   F_CastTicker (void);
+boolean F_CastResponder (event_t *ev);
+void   F_CastDrawer (void);
+
+//
+// F_StartFinale
+//
+void F_StartFinale (void)
+{
+    gameaction = ga_nothing;
+    gamestate = GS_FINALE;
+    viewactive = false;
+    automapactive = false;
+
+    // Okay - IWAD dependend stuff.
+    // This has been changed severly, and
+    //  some stuff might have changed in the process.
+    switch ( gamemode )
+    {
+
+      // DOOM 1 - E1, E3 or E4, but each nine missions
+      case shareware:
+      case registered:
+      case retail:
+      {
+       S_ChangeMusic(mus_victor, true);
+       
+       switch (gameepisode)
+       {
+         case 1:
+           finaleflat = "FLOOR4_8";
+           finaletext = e1text;
+           break;
+         case 2:
+           finaleflat = "SFLR6_1";
+           finaletext = e2text;
+           break;
+         case 3:
+           finaleflat = "MFLR8_4";
+           finaletext = e3text;
+           break;
+         case 4:
+           finaleflat = "MFLR8_3";
+           finaletext = e4text;
+           break;
+         default:
+           // Ouch.
+           break;
+       }
+       break;
+      }
+      
+      // DOOM II and missions packs with E1, M34
+      case commercial:
+      {
+         S_ChangeMusic(mus_read_m, true);
+
+         switch (gamemap)
+         {
+           case 6:
+             finaleflat = "SLIME16";
+             finaletext = c1text;
+             break;
+           case 11:
+             finaleflat = "RROCK14";
+             finaletext = c2text;
+             break;
+           case 20:
+             finaleflat = "RROCK07";
+             finaletext = c3text;
+             break;
+           case 30:
+             finaleflat = "RROCK17";
+             finaletext = c4text;
+             break;
+           case 15:
+             finaleflat = "RROCK13";
+             finaletext = c5text;
+             break;
+           case 31:
+             finaleflat = "RROCK19";
+             finaletext = c6text;
+             break;
+           default:
+             // Ouch.
+             break;
+         }
+         break;
+      }        
+
+   
+      // Indeterminate.
+      default:
+       S_ChangeMusic(mus_read_m, true);
+       finaleflat = "F_SKY1"; // Not used anywhere else.
+       finaletext = c1text;  // FIXME - other text, music?
+       break;
+    }
+    
+    finalestage = 0;
+    finalecount = 0;
+       
+}
+
+
+
+boolean F_Responder (event_t *event)
+{
+    if (finalestage == 2)
+       return F_CastResponder (event);
+       
+    return false;
+}
+
+
+//
+// F_Ticker
+//
+void F_Ticker (void)
+{
+    int                i;
+    
+    // check for skipping
+    if ( (gamemode == commercial)
+      && ( finalecount > 50) )
+    {
+      // go on to the next level
+      for (i=0 ; i<MAXPLAYERS ; i++)
+       if (players[i].cmd.buttons)
+         break;
+                               
+      if (i < MAXPLAYERS)
+      {        
+       if (gamemap == 30)
+         F_StartCast ();
+       else
+         gameaction = ga_worlddone;
+      }
+    }
+    
+    // advance animation
+    finalecount++;
+       
+    if (finalestage == 2)
+    {
+       F_CastTicker ();
+       return;
+    }
+       
+    if ( gamemode == commercial)
+       return;
+               
+    if (!finalestage && finalecount>strlen (finaletext)*TEXTSPEED + TEXTWAIT)
+    {
+       finalecount = 0;
+       finalestage = 1;
+       wipegamestate = -1;             // force a wipe
+       if (gameepisode == 3)
+           S_StartMusic (mus_bunny);
+    }
+}
+
+
+
+//
+// F_TextWrite
+//
+
+#include "hu_stuff.h"
+extern patch_t *hu_font[HU_FONTSIZE];
+
+
+void F_TextWrite (void)
+{
+    byte*      src;
+    byte*      dest;
+    
+    int                x,y,w;
+    int                count;
+    char*      ch;
+    int                c;
+    int                cx;
+    int                cy;
+    
+    // erase the entire screen to a tiled background
+    src = W_CacheLumpName ( finaleflat , PU_CACHE);
+    dest = screens[0];
+       
+    for (y=0 ; y<SCREENHEIGHT ; y++)
+    {
+       for (x=0 ; x<SCREENWIDTH/64 ; x++)
+       {
+           memcpy (dest, src+((y&63)<<6), 64);
+           dest += 64;
+       }
+       if (SCREENWIDTH&63)
+       {
+           memcpy (dest, src+((y&63)<<6), SCREENWIDTH&63);
+           dest += (SCREENWIDTH&63);
+       }
+    }
+
+    V_MarkRect (0, 0, SCREENWIDTH, SCREENHEIGHT);
+    
+    // draw some of the text onto the screen
+    cx = 10;
+    cy = 10;
+    ch = finaletext;
+       
+    count = (finalecount - 10)/TEXTSPEED;
+    if (count < 0)
+       count = 0;
+    for ( ; count ; count-- )
+    {
+       c = *ch++;
+       if (!c)
+           break;
+       if (c == '\n')
+       {
+           cx = 10;
+           cy += 11;
+           continue;
+       }
+               
+       c = toupper(c) - HU_FONTSTART;
+       if (c < 0 || c> HU_FONTSIZE)
+       {
+           cx += 4;
+           continue;
+       }
+               
+       w = SHORT (hu_font[c]->width);
+       if (cx+w > SCREENWIDTH)
+           break;
+       V_DrawPatch(cx, cy, 0, hu_font[c]);
+       cx+=w;
+    }
+       
+}
+
+//
+// Final DOOM 2 animation
+// Casting by id Software.
+//   in order of appearance
+//
+typedef struct
+{
+    char               *name;
+    mobjtype_t type;
+} castinfo_t;
+
+castinfo_t     castorder[] = {
+    {CC_ZOMBIE, MT_POSSESSED},
+    {CC_SHOTGUN, MT_SHOTGUY},
+    {CC_HEAVY, MT_CHAINGUY},
+    {CC_IMP, MT_TROOP},
+    {CC_DEMON, MT_SERGEANT},
+    {CC_LOST, MT_SKULL},
+    {CC_CACO, MT_HEAD},
+    {CC_HELL, MT_KNIGHT},
+    {CC_BARON, MT_BRUISER},
+    {CC_ARACH, MT_BABY},
+    {CC_PAIN, MT_PAIN},
+    {CC_REVEN, MT_UNDEAD},
+    {CC_MANCU, MT_FATSO},
+    {CC_ARCH, MT_VILE},
+    {CC_SPIDER, MT_SPIDER},
+    {CC_CYBER, MT_CYBORG},
+    {CC_HERO, MT_PLAYER},
+
+    {NULL,0}
+};
+
+int            castnum;
+int            casttics;
+state_t*       caststate;
+boolean                castdeath;
+int            castframes;
+int            castonmelee;
+boolean                castattacking;
+
+
+//
+// F_StartCast