commit 4eb368a960647c8cc82d721d0183629ae10759d1
Author: Travis Bradshaw <travis.bradshaw@idsoftware.com>
Date: Tue, 31 Jan 2012 15:27:37 -0600
The DOOM sources as originally released on December 23, 1997
Diffstat:
149 files changed, 59221 insertions(+), 0 deletions(-)
diff --git a/README.TXT b/README.TXT
@@ -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
@@ -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
@@ -0,0 +1 @@
+/info/cvsroot/id/id_doom
diff --git a/linuxdoom-1.10/CVS/Root b/linuxdoom-1.10/CVS/Root
@@ -0,0 +1 @@
+/info/cvsroot/
diff --git a/linuxdoom-1.10/ChangeLog b/linuxdoom-1.10/ChangeLog
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
+//
+extern gamestate_t wipegamestate;
+
+
+void F_StartCast (void)
+{
+ wipegamestate = -1; // force a screen wipe
+ castnum = 0;
+ caststate = &states[mobjinfo[castorder[castnum].type].seestate];
+ casttics = caststate->tics;
+ castdeath = false;
+ finalestage = 2;
+ castframes = 0;
+ castonmelee = 0;
+ castattacking = false;
+ S_ChangeMusic(mus_evil, true);
+}
+
+
+//
+// F_CastTicker
+//
+void F_CastTicker (void)
+{
+ int st;
+ int sfx;
+
+ if (--casttics > 0)
+ return; // not time to change state yet
+
+ if (caststate->tics == -1 || caststate->nextstate == S_NULL)
+ {
+ // switch from deathstate to next monster
+ castnum++;
+ castdeath = false;
+ if (castorder[castnum].name == NULL)
+ castnum = 0;
+ if (mobjinfo[castorder[castnum].type].seesound)
+ S_StartSound (NULL, mobjinfo[castorder[castnum].type].seesound);
+ caststate = &states[mobjinfo[castorder[castnum].type].seestate];
+ castframes = 0;
+ }
+ else
+ {
+ // just advance to next state in animation
+ if (caststate == &states[S_PLAY_ATK1])
+ goto stopattack; // Oh, gross hack!
+ st = caststate->nextstate;
+ caststate = &states[st];
+ castframes++;
+
+ // sound hacks....
+ switch (st)
+ {
+ case S_PLAY_ATK1: sfx = sfx_dshtgn; break;
+ case S_POSS_ATK2: sfx = sfx_pistol; break;
+ case S_SPOS_ATK2: sfx = sfx_shotgn; break;
+ case S_VILE_ATK2: sfx = sfx_vilatk; break;
+ case S_SKEL_FIST2: sfx = sfx_skeswg; break;
+ case S_SKEL_FIST4: sfx = sfx_skepch; break;
+ case S_SKEL_MISS2: sfx = sfx_skeatk; break;
+ case S_FATT_ATK8:
+ case S_FATT_ATK5:
+ case S_FATT_ATK2: sfx = sfx_firsht; break;
+ case S_CPOS_ATK2:
+ case S_CPOS_ATK3:
+ case S_CPOS_ATK4: sfx = sfx_shotgn; break;
+ case S_TROO_ATK3: sfx = sfx_claw; break;
+ case S_SARG_ATK2: sfx = sfx_sgtatk; break;
+ case S_BOSS_ATK2:
+ case S_BOS2_ATK2:
+ case S_HEAD_ATK2: sfx = sfx_firsht; break;
+ case S_SKULL_ATK2: sfx = sfx_sklatk; break;
+ case S_SPID_ATK2:
+ case S_SPID_ATK3: sfx = sfx_shotgn; break;
+ case S_BSPI_ATK2: sfx = sfx_plasma; break;
+ case S_CYBER_ATK2:
+ case S_CYBER_ATK4:
+ case S_CYBER_ATK6: sfx = sfx_rlaunc; break;
+ case S_PAIN_ATK3: sfx = sfx_sklatk; break;
+ default: sfx = 0; break;
+ }
+
+ if (sfx)
+ S_StartSound (NULL, sfx);
+ }
+
+ if (castframes == 12)
+ {
+ // go into attack frame
+ castattacking = true;
+ if (castonmelee)
+ caststate=&states[mobjinfo[castorder[castnum].type].meleestate];
+ else
+ caststate=&states[mobjinfo[castorder[castnum].type].missilestate];
+ castonmelee ^= 1;
+ if (caststate == &states[S_NULL])
+ {
+ if (castonmelee)
+ caststate=
+ &states[mobjinfo[castorder[castnum].type].meleestate];
+ else
+ caststate=
+ &states[mobjinfo[castorder[castnum].type].missilestate];
+ }
+ }
+
+ if (castattacking)
+ {
+ if (castframes == 24
+ || caststate == &states[mobjinfo[castorder[castnum].type].seestate] )
+ {
+ stopattack:
+ castattacking = false;
+ castframes = 0;
+ caststate = &states[mobjinfo[castorder[castnum].type].seestate];
+ }
+ }
+
+ casttics = caststate->tics;
+ if (casttics == -1)
+ casttics = 15;
+}
+
+
+//
+// F_CastResponder
+//
+
+boolean F_CastResponder (event_t* ev)
+{
+ if (ev->type != ev_keydown)
+ return false;
+
+ if (castdeath)
+ return true; // already in dying frames
+
+ // go into death frame
+ castdeath = true;
+ caststate = &states[mobjinfo[castorder[castnum].type].deathstate];
+ casttics = caststate->tics;
+ castframes = 0;
+ castattacking = false;
+ if (mobjinfo[castorder[castnum].type].deathsound)
+ S_StartSound (NULL, mobjinfo[castorder[castnum].type].deathsound);
+
+ return true;
+}
+
+
+void F_CastPrint (char* text)
+{
+ char* ch;
+ int c;
+ int cx;
+ int w;
+ int width;
+
+ // find width
+ ch = text;
+ width = 0;
+
+ while (ch)
+ {
+ c = *ch++;
+ if (!c)
+ break;
+ c = toupper(c) - HU_FONTSTART;
+ if (c < 0 || c> HU_FONTSIZE)
+ {
+ width += 4;
+ continue;
+ }
+
+ w = SHORT (hu_font[c]->width);
+ width += w;
+ }
+
+ // draw it
+ cx = 160-width/2;
+ ch = text;
+ while (ch)
+ {
+ c = *ch++;
+ if (!c)
+ break;
+ c = toupper(c) - HU_FONTSTART;
+ if (c < 0 || c> HU_FONTSIZE)
+ {
+ cx += 4;
+ continue;
+ }
+
+ w = SHORT (hu_font[c]->width);
+ V_DrawPatch(cx, 180, 0, hu_font[c]);
+ cx+=w;
+ }
+
+}
+
+
+//
+// F_CastDrawer
+//
+void V_DrawPatchFlipped (int x, int y, int scrn, patch_t *patch);
+
+void F_CastDrawer (void)
+{
+ spritedef_t* sprdef;
+ spriteframe_t* sprframe;
+ int lump;
+ boolean flip;
+ patch_t* patch;
+
+ // erase the entire screen to a background
+ V_DrawPatch (0,0,0, W_CacheLumpName ("BOSSBACK", PU_CACHE));
+
+ F_CastPrint (castorder[castnum].name);
+
+ // draw the current frame in the middle of the screen
+ sprdef = &sprites[caststate->sprite];
+ sprframe = &sprdef->spriteframes[ caststate->frame & FF_FRAMEMASK];
+ lump = sprframe->lump[0];
+ flip = (boolean)sprframe->flip[0];
+
+ patch = W_CacheLumpNum (lump+firstspritelump, PU_CACHE);
+ if (flip)
+ V_DrawPatchFlipped (160,170,0,patch);
+ else
+ V_DrawPatch (160,170,0,patch);
+}
+
+
+//
+// F_DrawPatchCol
+//
+void
+F_DrawPatchCol
+( int x,
+ patch_t* patch,
+ int col )
+{
+ column_t* column;
+ byte* source;
+ byte* dest;
+ byte* desttop;
+ int count;
+
+ column = (column_t *)((byte *)patch + LONG(patch->columnofs[col]));
+ desttop = screens[0]+x;
+
+ // step through the posts in a column
+ while (column->topdelta != 0xff )
+ {
+ source = (byte *)column + 3;
+ dest = desttop + column->topdelta*SCREENWIDTH;
+ count = column->length;
+
+ while (count--)
+ {
+ *dest = *source++;
+ dest += SCREENWIDTH;
+ }
+ column = (column_t *)( (byte *)column + column->length + 4 );
+ }
+}
+
+
+//
+// F_BunnyScroll
+//
+void F_BunnyScroll (void)
+{
+ int scrolled;
+ int x;
+ patch_t* p1;
+ patch_t* p2;
+ char name[10];
+ int stage;
+ static int laststage;
+
+ p1 = W_CacheLumpName ("PFUB2", PU_LEVEL);
+ p2 = W_CacheLumpName ("PFUB1", PU_LEVEL);
+
+ V_MarkRect (0, 0, SCREENWIDTH, SCREENHEIGHT);
+
+ scrolled = 320 - (finalecount-230)/2;
+ if (scrolled > 320)
+ scrolled = 320;
+ if (scrolled < 0)
+ scrolled = 0;
+
+ for ( x=0 ; x<SCREENWIDTH ; x++)
+ {
+ if (x+scrolled < 320)
+ F_DrawPatchCol (x, p1, x+scrolled);
+ else
+ F_DrawPatchCol (x, p2, x+scrolled - 320);
+ }
+
+ if (finalecount < 1130)
+ return;
+ if (finalecount < 1180)
+ {
+ V_DrawPatch ((SCREENWIDTH-13*8)/2,
+ (SCREENHEIGHT-8*8)/2,0, W_CacheLumpName ("END0",PU_CACHE));
+ laststage = 0;
+ return;
+ }
+
+ stage = (finalecount-1180) / 5;
+ if (stage > 6)
+ stage = 6;
+ if (stage > laststage)
+ {
+ S_StartSound (NULL, sfx_pistol);
+ laststage = stage;
+ }
+
+ sprintf (name,"END%i",stage);
+ V_DrawPatch ((SCREENWIDTH-13*8)/2, (SCREENHEIGHT-8*8)/2,0, W_CacheLumpName (name,PU_CACHE));
+}
+
+
+//
+// F_Drawer
+//
+void F_Drawer (void)
+{
+ if (finalestage == 2)
+ {
+ F_CastDrawer ();
+ return;
+ }
+
+ if (!finalestage)
+ F_TextWrite ();
+ else
+ {
+ switch (gameepisode)
+ {
+ case 1:
+ if ( gamemode == retail )
+ V_DrawPatch (0,0,0,
+ W_CacheLumpName("CREDIT",PU_CACHE));
+ else
+ V_DrawPatch (0,0,0,
+ W_CacheLumpName("HELP2",PU_CACHE));
+ break;
+ case 2:
+ V_DrawPatch(0,0,0,
+ W_CacheLumpName("VICTORY2",PU_CACHE));
+ break;
+ case 3:
+ F_BunnyScroll ();
+ break;
+ case 4:
+ V_DrawPatch (0,0,0,
+ W_CacheLumpName("ENDPIC",PU_CACHE));
+ break;
+ }
+ }
+
+}
+
+
diff --git a/linuxdoom-1.10/f_finale.h b/linuxdoom-1.10/f_finale.h
@@ -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:
+//
+//
+//-----------------------------------------------------------------------------
+
+
+#ifndef __F_FINALE__
+#define __F_FINALE__
+
+
+#include "doomtype.h"
+#include "d_event.h"
+//
+// FINALE
+//
+
+// Called by main loop.
+boolean F_Responder (event_t* ev);
+
+// Called by main loop.
+void F_Ticker (void);
+
+// Called by main loop.
+void F_Drawer (void);
+
+
+void F_StartFinale (void);
+
+
+
+
+#endif
+//-----------------------------------------------------------------------------
+//
+// $Log:$
+//
+//-----------------------------------------------------------------------------
diff --git a/linuxdoom-1.10/f_wipe.c b/linuxdoom-1.10/f_wipe.c
@@ -0,0 +1,302 @@
+// 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:
+// Mission begin melt/wipe screen special effect.
+//
+//-----------------------------------------------------------------------------
+
+
+static const char rcsid[] = "$Id: f_wipe.c,v 1.2 1997/02/03 22:45:09 b1 Exp $";
+
+
+
+#include "z_zone.h"
+#include "i_video.h"
+#include "v_video.h"
+#include "m_random.h"
+
+#include "doomdef.h"
+
+#include "f_wipe.h"
+
+//
+// SCREEN WIPE PACKAGE
+//
+
+// when zero, stop the wipe
+static boolean go = 0;
+
+static byte* wipe_scr_start;
+static byte* wipe_scr_end;
+static byte* wipe_scr;
+
+
+void
+wipe_shittyColMajorXform
+( short* array,
+ int width,
+ int height )
+{
+ int x;
+ int y;
+ short* dest;
+
+ dest = (short*) Z_Malloc(width*height*2, PU_STATIC, 0);
+
+ for(y=0;y<height;y++)
+ for(x=0;x<width;x++)
+ dest[x*height+y] = array[y*width+x];
+
+ memcpy(array, dest, width*height*2);
+
+ Z_Free(dest);
+
+}
+
+int
+wipe_initColorXForm
+( int width,
+ int height,
+ int ticks )
+{
+ memcpy(wipe_scr, wipe_scr_start, width*height);
+ return 0;
+}
+
+int
+wipe_doColorXForm
+( int width,
+ int height,
+ int ticks )
+{
+ boolean changed;
+ byte* w;
+ byte* e;
+ int newval;
+
+ changed = false;
+ w = wipe_scr;
+ e = wipe_scr_end;
+
+ while (w!=wipe_scr+width*height)
+ {
+ if (*w != *e)
+ {
+ if (*w > *e)
+ {
+ newval = *w - ticks;
+ if (newval < *e)
+ *w = *e;
+ else
+ *w = newval;
+ changed = true;
+ }
+ else if (*w < *e)
+ {
+ newval = *w + ticks;
+ if (newval > *e)
+ *w = *e;
+ else
+ *w = newval;
+ changed = true;
+ }
+ }
+ w++;
+ e++;
+ }
+
+ return !changed;
+
+}
+
+int
+wipe_exitColorXForm
+( int width,
+ int height,
+ int ticks )
+{
+ return 0;
+}
+
+
+static int* y;
+
+int
+wipe_initMelt
+( int width,
+ int height,
+ int ticks )
+{
+ int i, r;
+
+ // copy start screen to main screen
+ memcpy(wipe_scr, wipe_scr_start, width*height);
+
+ // makes this wipe faster (in theory)
+ // to have stuff in column-major format
+ wipe_shittyColMajorXform((short*)wipe_scr_start, width/2, height);
+ wipe_shittyColMajorXform((short*)wipe_scr_end, width/2, height);
+
+ // setup initial column positions
+ // (y<0 => not ready to scroll yet)
+ y = (int *) Z_Malloc(width*sizeof(int), PU_STATIC, 0);
+ y[0] = -(M_Random()%16);
+ for (i=1;i<width;i++)
+ {
+ r = (M_Random()%3) - 1;
+ y[i] = y[i-1] + r;
+ if (y[i] > 0) y[i] = 0;
+ else if (y[i] == -16) y[i] = -15;
+ }
+
+ return 0;
+}
+
+int
+wipe_doMelt
+( int width,
+ int height,
+ int ticks )
+{
+ int i;
+ int j;
+ int dy;
+ int idx;
+
+ short* s;
+ short* d;
+ boolean done = true;
+
+ width/=2;
+
+ while (ticks--)
+ {
+ for (i=0;i<width;i++)
+ {
+ if (y[i]<0)
+ {
+ y[i]++; done = false;
+ }
+ else if (y[i] < height)
+ {
+ dy = (y[i] < 16) ? y[i]+1 : 8;
+ if (y[i]+dy >= height) dy = height - y[i];
+ s = &((short *)wipe_scr_end)[i*height+y[i]];
+ d = &((short *)wipe_scr)[y[i]*width+i];
+ idx = 0;
+ for (j=dy;j;j--)
+ {
+ d[idx] = *(s++);
+ idx += width;
+ }
+ y[i] += dy;
+ s = &((short *)wipe_scr_start)[i*height];
+ d = &((short *)wipe_scr)[y[i]*width+i];
+ idx = 0;
+ for (j=height-y[i];j;j--)
+ {
+ d[idx] = *(s++);
+ idx += width;
+ }
+ done = false;
+ }
+ }
+ }
+
+ return done;
+
+}
+
+int
+wipe_exitMelt
+( int width,
+ int height,
+ int ticks )
+{
+ Z_Free(y);
+ return 0;
+}
+
+int
+wipe_StartScreen
+( int x,
+ int y,
+ int width,
+ int height )
+{
+ wipe_scr_start = screens[2];
+ I_ReadScreen(wipe_scr_start);
+ return 0;
+}
+
+int
+wipe_EndScreen
+( int x,
+ int y,
+ int width,
+ int height )
+{
+ wipe_scr_end = screens[3];
+ I_ReadScreen(wipe_scr_end);
+ V_DrawBlock(x, y, 0, width, height, wipe_scr_start); // restore start scr.
+ return 0;
+}
+
+int
+wipe_ScreenWipe
+( int wipeno,
+ int x,
+ int y,
+ int width,
+ int height,
+ int ticks )
+{
+ int rc;
+ static int (*wipes[])(int, int, int) =
+ {
+ wipe_initColorXForm, wipe_doColorXForm, wipe_exitColorXForm,
+ wipe_initMelt, wipe_doMelt, wipe_exitMelt
+ };
+
+ void V_MarkRect(int, int, int, int);
+
+ // initial stuff
+ if (!go)
+ {
+ go = 1;
+ // wipe_scr = (byte *) Z_Malloc(width*height, PU_STATIC, 0); // DEBUG
+ wipe_scr = screens[0];
+ (*wipes[wipeno*3])(width, height, ticks);
+ }
+
+ // do a piece of wipe-in
+ V_MarkRect(0, 0, width, height);
+ rc = (*wipes[wipeno*3+1])(width, height, ticks);
+ // V_DrawBlock(x, y, 0, width, height, wipe_scr); // DEBUG
+
+ // final stuff
+ if (rc)
+ {
+ go = 0;
+ (*wipes[wipeno*3+2])(width, height, ticks);
+ }
+
+ return !go;
+
+}
diff --git a/linuxdoom-1.10/f_wipe.h b/linuxdoom-1.10/f_wipe.h
@@ -0,0 +1,71 @@
+// 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:
+// Mission start screen wipe/melt, special effects.
+//
+//-----------------------------------------------------------------------------
+
+
+#ifndef __F_WIPE_H__
+#define __F_WIPE_H__
+
+//
+// SCREEN WIPE PACKAGE
+//
+
+enum
+{
+ // simple gradual pixel change for 8-bit only
+ wipe_ColorXForm,
+
+ // weird screen melt
+ wipe_Melt,
+
+ wipe_NUMWIPES
+};
+
+int
+wipe_StartScreen
+( int x,
+ int y,
+ int width,
+ int height );
+
+
+int
+wipe_EndScreen
+( int x,
+ int y,
+ int width,
+ int height );
+
+
+int
+wipe_ScreenWipe
+( int wipeno,
+ int x,
+ int y,
+ int width,
+ int height,
+ int ticks );
+
+#endif
+//-----------------------------------------------------------------------------
+//
+// $Log:$
+//
+//-----------------------------------------------------------------------------
diff --git a/linuxdoom-1.10/g_game.c b/linuxdoom-1.10/g_game.c
@@ -0,0 +1,1690 @@
+// 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: none
+//
+//-----------------------------------------------------------------------------
+
+
+static const char
+rcsid[] = "$Id: g_game.c,v 1.8 1997/02/03 22:45:09 b1 Exp $";
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "doomdef.h"
+#include "doomstat.h"
+
+#include "z_zone.h"
+#include "f_finale.h"
+#include "m_argv.h"
+#include "m_misc.h"
+#include "m_menu.h"
+#include "m_random.h"
+#include "i_system.h"
+
+#include "p_setup.h"
+#include "p_saveg.h"
+#include "p_tick.h"
+
+#include "d_main.h"
+
+#include "wi_stuff.h"
+#include "hu_stuff.h"
+#include "st_stuff.h"
+#include "am_map.h"
+
+// Needs access to LFB.
+#include "v_video.h"
+
+#include "w_wad.h"
+
+#include "p_local.h"
+
+#include "s_sound.h"
+
+// Data.
+#include "dstrings.h"
+#include "sounds.h"
+
+// SKY handling - still the wrong place.
+#include "r_data.h"
+#include "r_sky.h"
+
+
+
+#include "g_game.h"
+
+
+#define SAVEGAMESIZE 0x2c000
+#define SAVESTRINGSIZE 24
+
+
+
+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);
+
+
+gameaction_t gameaction;
+gamestate_t gamestate;
+skill_t gameskill;
+boolean respawnmonsters;
+int gameepisode;
+int gamemap;
+
+boolean paused;
+boolean sendpause; // send a pause event next tic
+boolean sendsave; // send a save event next tic
+boolean usergame; // ok to save / end game
+
+boolean timingdemo; // if true, exit with report on completion
+boolean nodrawers; // for comparative timing purposes
+boolean noblit; // for comparative timing purposes
+int starttime; // for comparative timing purposes
+
+boolean viewactive;
+
+boolean deathmatch; // only if started as net death
+boolean netgame; // only true if packets are broadcast
+boolean playeringame[MAXPLAYERS];
+player_t players[MAXPLAYERS];
+
+int consoleplayer; // player taking events and displaying
+int displayplayer; // view being displayed
+int gametic;
+int levelstarttic; // gametic at level start
+int totalkills, totalitems, totalsecret; // for intermission
+
+char demoname[32];
+boolean demorecording;
+boolean demoplayback;
+boolean netdemo;
+byte* demobuffer;
+byte* demo_p;
+byte* demoend;
+boolean singledemo; // quit after playing a demo from cmdline
+
+boolean precache = true; // if true, load all graphics at start
+
+wbstartstruct_t wminfo; // parms for world map / intermission
+
+short consistancy[MAXPLAYERS][BACKUPTICS];
+
+byte* savebuffer;
+
+
+//
+// controls (have defaults)
+//
+int key_right;
+int key_left;
+
+int key_up;
+int key_down;
+int key_strafeleft;
+int key_straferight;
+int key_fire;
+int key_use;
+int key_strafe;
+int key_speed;
+
+int mousebfire;
+int mousebstrafe;
+int mousebforward;
+
+int joybfire;
+int joybstrafe;
+int joybuse;
+int joybspeed;
+
+
+
+#define MAXPLMOVE (forwardmove[1])
+
+#define TURBOTHRESHOLD 0x32
+
+fixed_t forwardmove[2] = {0x19, 0x32};
+fixed_t sidemove[2] = {0x18, 0x28};
+fixed_t angleturn[3] = {640, 1280, 320}; // + slow turn
+
+#define SLOWTURNTICS 6
+
+#define NUMKEYS 256
+
+boolean gamekeydown[NUMKEYS];
+int turnheld; // for accelerative turning
+
+boolean mousearray[4];
+boolean* mousebuttons = &mousearray[1]; // allow [-1]
+
+// mouse values are used once
+int mousex;
+int mousey;
+
+int dclicktime;
+int dclickstate;
+int dclicks;
+int dclicktime2;
+int dclickstate2;
+int dclicks2;
+
+// joystick values are repeated
+int joyxmove;
+int joyymove;
+boolean joyarray[5];
+boolean* joybuttons = &joyarray[1]; // allow [-1]
+
+int savegameslot;
+char savedescription[32];
+
+
+#define BODYQUESIZE 32
+
+mobj_t* bodyque[BODYQUESIZE];
+int bodyqueslot;
+
+void* statcopy; // for statistics driver
+
+
+
+int G_CmdChecksum (ticcmd_t* cmd)
+{
+ int i;
+ int sum = 0;
+
+ for (i=0 ; i< sizeof(*cmd)/4 - 1 ; i++)
+ sum += ((int *)cmd)[i];
+
+ return sum;
+}
+
+
+//
+// G_BuildTiccmd
+// Builds a ticcmd from all of the available inputs
+// or reads it from the demo buffer.
+// If recording a demo, write it out
+//
+void G_BuildTiccmd (ticcmd_t* cmd)
+{
+ int i;
+ boolean strafe;
+ boolean bstrafe;
+ int speed;
+ int tspeed;
+ int forward;
+ int side;
+
+ ticcmd_t* base;
+
+ base = I_BaseTiccmd (); // empty, or external driver
+ memcpy (cmd,base,sizeof(*cmd));
+
+ cmd->consistancy =
+ consistancy[consoleplayer][maketic%BACKUPTICS];
+
+
+ strafe = gamekeydown[key_strafe] || mousebuttons[mousebstrafe]
+ || joybuttons[joybstrafe];
+ speed = gamekeydown[key_speed] || joybuttons[joybspeed];
+
+ forward = side = 0;
+
+ // use two stage accelerative turning
+ // on the keyboard and joystick
+ if (joyxmove < 0
+ || joyxmove > 0
+ || gamekeydown[key_right]
+ || gamekeydown[key_left])
+ turnheld += ticdup;
+ else
+ turnheld = 0;
+
+ if (turnheld < SLOWTURNTICS)
+ tspeed = 2; // slow turn
+ else
+ tspeed = speed;
+
+ // let movement keys cancel each other out
+ if (strafe)
+ {
+ if (gamekeydown[key_right])
+ {
+ // fprintf(stderr, "strafe right\n");
+ side += sidemove[speed];
+ }
+ if (gamekeydown[key_left])
+ {
+ // fprintf(stderr, "strafe left\n");
+ side -= sidemove[speed];
+ }
+ if (joyxmove > 0)
+ side += sidemove[speed];
+ if (joyxmove < 0)
+ side -= sidemove[speed];
+
+ }
+ else
+ {
+ if (gamekeydown[key_right])
+ cmd->angleturn -= angleturn[tspeed];
+ if (gamekeydown[key_left])
+ cmd->angleturn += angleturn[tspeed];
+ if (joyxmove > 0)
+ cmd->angleturn -= angleturn[tspeed];
+ if (joyxmove < 0)
+ cmd->angleturn += angleturn[tspeed];
+ }
+
+ if (gamekeydown[key_up])
+ {
+ // fprintf(stderr, "up\n");
+ forward += forwardmove[speed];
+ }
+ if (gamekeydown[key_down])
+ {
+ // fprintf(stderr, "down\n");
+ forward -= forwardmove[speed];
+ }
+ if (joyymove < 0)
+ forward += forwardmove[speed];
+ if (joyymove > 0)
+ forward -= forwardmove[speed];
+ if (gamekeydown[key_straferight])
+ side += sidemove[speed];
+ if (gamekeydown[key_strafeleft])
+ side -= sidemove[speed];
+
+ // buttons
+ cmd->chatchar = HU_dequeueChatChar();
+
+ if (gamekeydown[key_fire] || mousebuttons[mousebfire]
+ || joybuttons[joybfire])
+ cmd->buttons |= BT_ATTACK;
+
+ if (gamekeydown[key_use] || joybuttons[joybuse] )
+ {
+ cmd->buttons |= BT_USE;
+ // clear double clicks if hit use button
+ dclicks = 0;
+ }
+
+ // chainsaw overrides
+ for (i=0 ; i<NUMWEAPONS-1 ; i++)
+ if (gamekeydown['1'+i])
+ {
+ cmd->buttons |= BT_CHANGE;
+ cmd->buttons |= i<<BT_WEAPONSHIFT;
+ break;
+ }
+
+ // mouse
+ if (mousebuttons[mousebforward])
+ forward += forwardmove[speed];
+
+ // forward double click
+ if (mousebuttons[mousebforward] != dclickstate && dclicktime > 1 )
+ {
+ dclickstate = mousebuttons[mousebforward];
+ if (dclickstate)
+ dclicks++;
+ if (dclicks == 2)
+ {
+ cmd->buttons |= BT_USE;
+ dclicks = 0;
+ }
+ else
+ dclicktime = 0;
+ }
+ else
+ {
+ dclicktime += ticdup;
+ if (dclicktime > 20)
+ {
+ dclicks = 0;
+ dclickstate = 0;
+ }
+ }
+
+ // strafe double click
+ bstrafe =
+ mousebuttons[mousebstrafe]
+ || joybuttons[joybstrafe];
+ if (bstrafe != dclickstate2 && dclicktime2 > 1 )
+ {
+ dclickstate2 = bstrafe;
+ if (dclickstate2)
+ dclicks2++;
+ if (dclicks2 == 2)
+ {
+ cmd->buttons |= BT_USE;
+ dclicks2 = 0;
+ }
+ else
+ dclicktime2 = 0;
+ }
+ else
+ {
+ dclicktime2 += ticdup;
+ if (dclicktime2 > 20)
+ {
+ dclicks2 = 0;
+ dclickstate2 = 0;
+ }
+ }
+
+ forward += mousey;
+ if (strafe)
+ side += mousex*2;
+ else
+ cmd->angleturn -= mousex*0x8;
+
+ mousex = mousey = 0;
+
+ if (forward > MAXPLMOVE)
+ forward = MAXPLMOVE;
+ else if (forward < -MAXPLMOVE)
+ forward = -MAXPLMOVE;
+ if (side > MAXPLMOVE)
+ side = MAXPLMOVE;
+ else if (side < -MAXPLMOVE)
+ side = -MAXPLMOVE;
+
+ cmd->forwardmove += forward;
+ cmd->sidemove += side;
+
+ // special buttons
+ if (sendpause)
+ {
+ sendpause = false;
+ cmd->buttons = BT_SPECIAL | BTS_PAUSE;
+ }
+
+ if (sendsave)
+ {
+ sendsave = false;
+ cmd->buttons = BT_SPECIAL | BTS_SAVEGAME | (savegameslot<<BTS_SAVESHIFT);
+ }
+}
+
+
+//
+// G_DoLoadLevel
+//
+extern gamestate_t wipegamestate;
+
+void G_DoLoadLevel (void)
+{
+ int i;
+
+ // Set the sky map.
+ // First thing, we have a dummy sky texture name,
+ // a flat. The data is in the WAD only because
+ // we look for an actual index, instead of simply
+ // setting one.
+ skyflatnum = R_FlatNumForName ( SKYFLATNAME );
+
+ // DOOM determines the sky texture to be used
+ // depending on the current episode, and the game version.
+ if ( (gamemode == commercial)
+ || ( gamemode == pack_tnt )
+ || ( gamemode == pack_plut ) )
+ {
+ skytexture = R_TextureNumForName ("SKY3");
+ if (gamemap < 12)
+ skytexture = R_TextureNumForName ("SKY1");
+ else
+ if (gamemap < 21)
+ skytexture = R_TextureNumForName ("SKY2");
+ }
+
+ levelstarttic = gametic; // for time calculation
+
+ if (wipegamestate == GS_LEVEL)
+ wipegamestate = -1; // force a wipe
+
+ gamestate = GS_LEVEL;
+
+ for (i=0 ; i<MAXPLAYERS ; i++)
+ {
+ if (playeringame[i] && players[i].playerstate == PST_DEAD)
+ players[i].playerstate = PST_REBORN;
+ memset (players[i].frags,0,sizeof(players[i].frags));
+ }
+
+ P_SetupLevel (gameepisode, gamemap, 0, gameskill);
+ displayplayer = consoleplayer; // view the guy you are playing
+ starttime = I_GetTime ();
+ gameaction = ga_nothing;
+ Z_CheckHeap ();
+
+ // clear cmd building stuff
+ memset (gamekeydown, 0, sizeof(gamekeydown));
+ joyxmove = joyymove = 0;
+ mousex = mousey = 0;
+ sendpause = sendsave = paused = false;
+ memset (mousebuttons, 0, sizeof(mousebuttons));
+ memset (joybuttons, 0, sizeof(joybuttons));
+}
+
+
+//
+// G_Responder
+// Get info needed to make ticcmd_ts for the players.
+//
+boolean G_Responder (event_t* ev)
+{
+ // allow spy mode changes even during the demo
+ if (gamestate == GS_LEVEL && ev->type == ev_keydown
+ && ev->data1 == KEY_F12 && (singledemo || !deathmatch) )
+ {
+ // spy mode
+ do
+ {
+ displayplayer++;
+ if (displayplayer == MAXPLAYERS)
+ displayplayer = 0;
+ } while (!playeringame[displayplayer] && displayplayer != consoleplayer);
+ return true;
+ }
+
+ // any other key pops up menu if in demos
+ if (gameaction == ga_nothing && !singledemo &&
+ (demoplayback || gamestate == GS_DEMOSCREEN)
+ )
+ {
+ if (ev->type == ev_keydown ||
+ (ev->type == ev_mouse && ev->data1) ||
+ (ev->type == ev_joystick && ev->data1) )
+ {
+ M_StartControlPanel ();
+ return true;
+ }
+ return false;
+ }
+
+ if (gamestate == GS_LEVEL)
+ {
+#if 0
+ if (devparm && ev->type == ev_keydown && ev->data1 == ';')
+ {
+ G_DeathMatchSpawnPlayer (0);
+ return true;
+ }
+#endif
+ if (HU_Responder (ev))
+ return true; // chat ate the event
+ if (ST_Responder (ev))
+ return true; // status window ate it
+ if (AM_Responder (ev))
+ return true; // automap ate it
+ }
+
+ if (gamestate == GS_FINALE)
+ {
+ if (F_Responder (ev))
+ return true; // finale ate the event
+ }
+
+ switch (ev->type)
+ {
+ case ev_keydown:
+ if (ev->data1 == KEY_PAUSE)
+ {
+ sendpause = true;
+ return true;
+ }
+ if (ev->data1 <NUMKEYS)
+ gamekeydown[ev->data1] = true;
+ return true; // eat key down events
+
+ case ev_keyup:
+ if (ev->data1 <NUMKEYS)
+ gamekeydown[ev->data1] = false;
+ return false; // always let key up events filter down
+
+ case ev_mouse:
+ mousebuttons[0] = ev->data1 & 1;
+ mousebuttons[1] = ev->data1 & 2;
+ mousebuttons[2] = ev->data1 & 4;
+ mousex = ev->data2*(mouseSensitivity+5)/10;
+ mousey = ev->data3*(mouseSensitivity+5)/10;
+ return true; // eat events
+
+ case ev_joystick:
+ joybuttons[0] = ev->data1 & 1;
+ joybuttons[1] = ev->data1 & 2;
+ joybuttons[2] = ev->data1 & 4;
+ joybuttons[3] = ev->data1 & 8;
+ joyxmove = ev->data2;
+ joyymove = ev->data3;
+ return true; // eat events
+
+ default:
+ break;
+ }
+
+ return false;
+}
+
+
+
+//
+// G_Ticker
+// Make ticcmd_ts for the players.
+//
+void G_Ticker (void)
+{
+ int i;
+ int buf;
+ ticcmd_t* cmd;
+
+ // do player reborns if needed
+ for (i=0 ; i<MAXPLAYERS ; i++)
+ if (playeringame[i] && players[i].playerstate == PST_REBORN)
+ G_DoReborn (i);
+
+ // do things to change the game state
+ while (gameaction != ga_nothing)
+ {
+ switch (gameaction)
+ {
+ case ga_loadlevel:
+ G_DoLoadLevel ();
+ break;
+ case ga_newgame:
+ G_DoNewGame ();
+ break;
+ case ga_loadgame:
+ G_DoLoadGame ();
+ break;
+ case ga_savegame:
+ G_DoSaveGame ();
+ break;
+ case ga_playdemo:
+ G_DoPlayDemo ();
+ break;
+ case ga_completed:
+ G_DoCompleted ();
+ break;
+ case ga_victory:
+ F_StartFinale ();
+ break;
+ case ga_worlddone:
+ G_DoWorldDone ();
+ break;
+ case ga_screenshot:
+ M_ScreenShot ();
+ gameaction = ga_nothing;
+ break;
+ case ga_nothing:
+ break;
+ }
+ }
+
+ // get commands, check consistancy,
+ // and build new consistancy check
+ buf = (gametic/ticdup)%BACKUPTICS;
+
+ for (i=0 ; i<MAXPLAYERS ; i++)
+ {
+ if (playeringame[i])
+ {
+ cmd = &players[i].cmd;
+
+ memcpy (cmd, &netcmds[i][buf], sizeof(ticcmd_t));
+
+ if (demoplayback)
+ G_ReadDemoTiccmd (cmd);
+ if (demorecording)
+ G_WriteDemoTiccmd (cmd);
+
+ // check for turbo cheats
+ if (cmd->forwardmove > TURBOTHRESHOLD
+ && !(gametic&31) && ((gametic>>5)&3) == i )
+ {
+ static char turbomessage[80];
+ extern char *player_names[4];
+ sprintf (turbomessage, "%s is turbo!",player_names[i]);
+ players[consoleplayer].message = turbomessage;
+ }
+
+ if (netgame && !netdemo && !(gametic%ticdup) )
+ {
+ if (gametic > BACKUPTICS
+ && consistancy[i][buf] != cmd->consistancy)
+ {
+ I_Error ("consistency failure (%i should be %i)",
+ cmd->consistancy, consistancy[i][buf]);
+ }
+ if (players[i].mo)
+ consistancy[i][buf] = players[i].mo->x;
+ else
+ consistancy[i][buf] = rndindex;
+ }
+ }
+ }
+
+ // check for special buttons
+ for (i=0 ; i<MAXPLAYERS ; i++)
+ {
+ if (playeringame[i])
+ {
+ if (players[i].cmd.buttons & BT_SPECIAL)
+ {
+ switch (players[i].cmd.buttons & BT_SPECIALMASK)
+ {
+ case BTS_PAUSE:
+ paused ^= 1;
+ if (paused)
+ S_PauseSound ();
+ else
+ S_ResumeSound ();
+ break;
+
+ case BTS_SAVEGAME:
+ if (!savedescription[0])
+ strcpy (savedescription, "NET GAME");
+ savegameslot =
+ (players[i].cmd.buttons & BTS_SAVEMASK)>>BTS_SAVESHIFT;
+ gameaction = ga_savegame;
+ break;
+ }
+ }
+ }
+ }
+
+ // do main actions
+ switch (gamestate)
+ {
+ case GS_LEVEL:
+ P_Ticker ();
+ ST_Ticker ();
+ AM_Ticker ();
+ HU_Ticker ();
+ break;
+
+ case GS_INTERMISSION:
+ WI_Ticker ();
+ break;
+
+ case GS_FINALE:
+ F_Ticker ();
+ break;
+
+ case GS_DEMOSCREEN:
+ D_PageTicker ();
+ break;
+ }
+}
+
+
+//
+// PLAYER STRUCTURE FUNCTIONS
+// also see P_SpawnPlayer in P_Things
+//
+
+//
+// G_InitPlayer
+// Called at the start.
+// Called by the game initialization functions.
+//
+void G_InitPlayer (int player)
+{
+ player_t* p;
+
+ // set up the saved info
+ p = &players[player];
+
+ // clear everything else to defaults
+ G_PlayerReborn (player);
+
+}
+
+
+
+//
+// G_PlayerFinishLevel
+// Can when a player completes a level.
+//
+void G_PlayerFinishLevel (int player)
+{
+ player_t* p;
+
+ p = &players[player];
+
+ memset (p->powers, 0, sizeof (p->powers));
+ memset (p->cards, 0, sizeof (p->cards));
+ p->mo->flags &= ~MF_SHADOW; // cancel invisibility
+ p->extralight = 0; // cancel gun flashes
+ p->fixedcolormap = 0; // cancel ir gogles
+ p->damagecount = 0; // no palette changes
+ p->bonuscount = 0;
+}
+
+
+//
+// G_PlayerReborn
+// Called after a player dies
+// almost everything is cleared and initialized
+//
+void G_PlayerReborn (int player)
+{
+ player_t* p;
+ int i;
+ int frags[MAXPLAYERS];
+ int killcount;
+ int itemcount;
+ int secretcount;
+
+ memcpy (frags,players[player].frags,sizeof(frags));
+ killcount = players[player].killcount;
+ itemcount = players[player].itemcount;
+ secretcount = players[player].secretcount;
+
+ p = &players[player];
+ memset (p, 0, sizeof(*p));
+
+ memcpy (players[player].frags, frags, sizeof(players[player].frags));
+ players[player].killcount = killcount;
+ players[player].itemcount = itemcount;
+ players[player].secretcount = secretcount;
+
+ p->usedown = p->attackdown = true; // don't do anything immediately
+ p->playerstate = PST_LIVE;
+ p->health = MAXHEALTH;
+ p->readyweapon = p->pendingweapon = wp_pistol;
+ p->weaponowned[wp_fist] = true;
+ p->weaponowned[wp_pistol] = true;
+ p->ammo[am_clip] = 50;
+
+ for (i=0 ; i<NUMAMMO ; i++)
+ p->maxammo[i] = maxammo[i];
+
+}
+
+//
+// G_CheckSpot
+// Returns false if the player cannot be respawned
+// at the given mapthing_t spot
+// because something is occupying it
+//
+void P_SpawnPlayer (mapthing_t* mthing);
+
+boolean
+G_CheckSpot
+( int playernum,
+ mapthing_t* mthing )
+{
+ fixed_t x;
+ fixed_t y;
+ subsector_t* ss;
+ unsigned an;
+ mobj_t* mo;
+ int i;
+
+ if (!players[playernum].mo)
+ {
+ // first spawn of level, before corpses
+ for (i=0 ; i<playernum ; i++)
+ if (players[i].mo->x == mthing->x << FRACBITS
+ && players[i].mo->y == mthing->y << FRACBITS)
+ return false;
+ return true;
+ }
+
+ x = mthing->x << FRACBITS;
+ y = mthing->y << FRACBITS;
+
+ if (!P_CheckPosition (players[playernum].mo, x, y) )
+ return false;
+
+ // flush an old corpse if needed
+ if (bodyqueslot >= BODYQUESIZE)
+ P_RemoveMobj (bodyque[bodyqueslot%BODYQUESIZE]);
+ bodyque[bodyqueslot%BODYQUESIZE] = players[playernum].mo;
+ bodyqueslot++;
+
+ // spawn a teleport fog
+ ss = R_PointInSubsector (x,y);
+ an = ( ANG45 * (mthing->angle/45) ) >> ANGLETOFINESHIFT;
+
+ mo = P_SpawnMobj (x+20*finecosine[an], y+20*finesine[an]
+ , ss->sector->floorheight
+ , MT_TFOG);
+
+ if (players[consoleplayer].viewz != 1)
+ S_StartSound (mo, sfx_telept); // don't start sound on first frame
+
+ return true;
+}
+
+
+//
+// G_DeathMatchSpawnPlayer
+// Spawns a player at one of the random death match spots
+// called at level load and each death
+//
+void G_DeathMatchSpawnPlayer (int playernum)
+{
+ int i,j;
+ int selections;
+
+ selections = deathmatch_p - deathmatchstarts;
+ if (selections < 4)
+ I_Error ("Only %i deathmatch spots, 4 required", selections);
+
+ for (j=0 ; j<20 ; j++)
+ {
+ i = P_Random() % selections;
+ if (G_CheckSpot (playernum, &deathmatchstarts[i]) )
+ {
+ deathmatchstarts[i].type = playernum+1;
+ P_SpawnPlayer (&deathmatchstarts[i]);
+ return;
+ }
+ }
+
+ // no good spot, so the player will probably get stuck
+ P_SpawnPlayer (&playerstarts[playernum]);
+}
+
+//
+// G_DoReborn
+//
+void G_DoReborn (int playernum)
+{
+ int i;
+
+ if (!netgame)
+ {
+ // reload the level from scratch
+ gameaction = ga_loadlevel;
+ }
+ else
+ {
+ // respawn at the start
+
+ // first dissasociate the corpse
+ players[playernum].mo->player = NULL;
+
+ // spawn at random spot if in death match
+ if (deathmatch)
+ {
+ G_DeathMatchSpawnPlayer (playernum);
+ return;
+ }
+
+ if (G_CheckSpot (playernum, &playerstarts[playernum]) )
+ {
+ P_SpawnPlayer (&playerstarts[playernum]);
+ return;
+ }
+
+ // try to spawn at one of the other players spots
+ for (i=0 ; i<MAXPLAYERS ; i++)
+ {
+ if (G_CheckSpot (playernum, &playerstarts[i]) )
+ {
+ playerstarts[i].type = playernum+1; // fake as other player
+ P_SpawnPlayer (&playerstarts[i]);
+ playerstarts[i].type = i+1; // restore
+ return;
+ }
+ // he's going to be inside something. Too bad.
+ }
+ P_SpawnPlayer (&playerstarts[playernum]);
+ }
+}
+
+
+void G_ScreenShot (void)
+{
+ gameaction = ga_screenshot;
+}
+
+
+
+// DOOM Par Times
+int pars[4][10] =
+{
+ {0},
+ {0,30,75,120,90,165,180,180,30,165},
+ {0,90,90,90,120,90,360,240,30,170},
+ {0,90,45,90,150,90,90,165,30,135}
+};
+
+// DOOM II Par Times
+int cpars[32] =
+{
+ 30,90,120,120,90,150,120,120,270,90, // 1-10
+ 210,150,150,150,210,150,420,150,210,150, // 11-20
+ 240,150,180,150,150,300,330,420,300,180, // 21-30
+ 120,30 // 31-32
+};
+
+
+//
+// G_DoCompleted
+//
+boolean secretexit;
+extern char* pagename;
+
+void G_ExitLevel (void)
+{
+ secretexit = false;
+ gameaction = ga_completed;
+}
+
+// Here's for the german edition.
+void G_SecretExitLevel (void)
+{
+ // IF NO WOLF3D LEVELS, NO SECRET EXIT!
+ if ( (gamemode == commercial)
+ && (W_CheckNumForName("map31")<0))
+ secretexit = false;
+ else
+ secretexit = true;
+ gameaction = ga_completed;
+}
+
+void G_DoCompleted (void)
+{
+ int i;
+
+ gameaction = ga_nothing;
+
+ for (i=0 ; i<MAXPLAYERS ; i++)
+ if (playeringame[i])
+ G_PlayerFinishLevel (i); // take away cards and stuff
+
+ if (automapactive)
+ AM_Stop ();
+
+ if ( gamemode != commercial)
+ switch(gamemap)
+ {
+ case 8:
+ gameaction = ga_victory;
+ return;
+ case 9:
+ for (i=0 ; i<MAXPLAYERS ; i++)
+ players[i].didsecret = true;
+ break;
+ }
+
+//#if 0 Hmmm - why?
+ if ( (gamemap == 8)
+ && (gamemode != commercial) )
+ {
+ // victory
+ gameaction = ga_victory;
+ return;
+ }
+
+ if ( (gamemap == 9)
+ && (gamemode != commercial) )
+ {
+ // exit secret level
+ for (i=0 ; i<MAXPLAYERS ; i++)
+ players[i].didsecret = true;
+ }
+//#endif
+
+
+ wminfo.didsecret = players[consoleplayer].didsecret;
+ wminfo.epsd = gameepisode -1;
+ wminfo.last = gamemap -1;
+
+ // wminfo.next is 0 biased, unlike gamemap
+ if ( gamemode == commercial)
+ {
+ if (secretexit)
+ switch(gamemap)
+ {
+ case 15: wminfo.next = 30; break;
+ case 31: wminfo.next = 31; break;
+ }
+ else
+ switch(gamemap)
+ {
+ case 31:
+ case 32: wminfo.next = 15; break;
+ default: wminfo.next = gamemap;
+ }
+ }
+ else
+ {
+ if (secretexit)
+ wminfo.next = 8; // go to secret level
+ else if (gamemap == 9)
+ {
+ // returning from secret level
+ switch (gameepisode)
+ {
+ case 1:
+ wminfo.next = 3;
+ break;
+ case 2:
+ wminfo.next = 5;
+ break;
+ case 3:
+ wminfo.next = 6;
+ break;
+ case 4:
+ wminfo.next = 2;
+ break;
+ }
+ }
+ else
+ wminfo.next = gamemap; // go to next level
+ }
+
+ wminfo.maxkills = totalkills;
+ wminfo.maxitems = totalitems;
+ wminfo.maxsecret = totalsecret;
+ wminfo.maxfrags = 0;
+ if ( gamemode == commercial )
+ wminfo.partime = 35*cpars[gamemap-1];
+ else
+ wminfo.partime = 35*pars[gameepisode][gamemap];
+ wminfo.pnum = consoleplayer;
+
+ for (i=0 ; i<MAXPLAYERS ; i++)
+ {
+ wminfo.plyr[i].in = playeringame[i];
+ wminfo.plyr[i].skills = players[i].killcount;
+ wminfo.plyr[i].sitems = players[i].itemcount;
+ wminfo.plyr[i].ssecret = players[i].secretcount;
+ wminfo.plyr[i].stime = leveltime;
+ memcpy (wminfo.plyr[i].frags, players[i].frags
+ , sizeof(wminfo.plyr[i].frags));
+ }
+
+ gamestate = GS_INTERMISSION;
+ viewactive = false;
+ automapactive = false;
+
+ if (statcopy)
+ memcpy (statcopy, &wminfo, sizeof(wminfo));
+
+ WI_Start (&wminfo);
+}
+
+
+//
+// G_WorldDone
+//
+void G_WorldDone (void)
+{
+ gameaction = ga_worlddone;
+
+ if (secretexit)
+ players[consoleplayer].didsecret = true;
+
+ if ( gamemode == commercial )
+ {
+ switch (gamemap)
+ {
+ case 15:
+ case 31:
+ if (!secretexit)
+ break;
+ case 6:
+ case 11:
+ case 20:
+ case 30:
+ F_StartFinale ();
+ break;
+ }
+ }
+}
+
+void G_DoWorldDone (void)
+{
+ gamestate = GS_LEVEL;
+ gamemap = wminfo.next+1;
+ G_DoLoadLevel ();
+ gameaction = ga_nothing;
+ viewactive = true;
+}
+
+
+
+//
+// G_InitFromSavegame
+// Can be called by the startup code or the menu task.
+//
+extern boolean setsizeneeded;
+void R_ExecuteSetViewSize (void);
+
+char savename[256];
+
+void G_LoadGame (char* name)
+{
+ strcpy (savename, name);
+ gameaction = ga_loadgame;
+}
+
+#define VERSIONSIZE 16
+
+
+void G_DoLoadGame (void)
+{
+ int length;
+ int i;
+ int a,b,c;
+ char vcheck[VERSIONSIZE];
+
+ gameaction = ga_nothing;
+
+ length = M_ReadFile (savename, &savebuffer);
+ save_p = savebuffer + SAVESTRINGSIZE;
+
+ // skip the description field
+ memset (vcheck,0,sizeof(vcheck));
+ sprintf (vcheck,"version %i",VERSION);
+ if (strcmp (save_p, vcheck))
+ return; // bad version
+ save_p += VERSIONSIZE;
+
+ gameskill = *save_p++;
+ gameepisode = *save_p++;
+ gamemap = *save_p++;
+ for (i=0 ; i<MAXPLAYERS ; i++)
+ playeringame[i] = *save_p++;
+
+ // load a base level
+ G_InitNew (gameskill, gameepisode, gamemap);
+
+ // get the times
+ a = *save_p++;
+ b = *save_p++;
+ c = *save_p++;
+ leveltime = (a<<16) + (b<<8) + c;
+
+ // dearchive all the modifications
+ P_UnArchivePlayers ();
+ P_UnArchiveWorld ();
+ P_UnArchiveThinkers ();
+ P_UnArchiveSpecials ();
+
+ if (*save_p != 0x1d)
+ I_Error ("Bad savegame");
+
+ // done
+ Z_Free (savebuffer);
+
+ if (setsizeneeded)
+ R_ExecuteSetViewSize ();
+
+ // draw the pattern into the back screen
+ R_FillBackScreen ();
+}
+
+
+//
+// G_SaveGame
+// Called by the menu task.
+// Description is a 24 byte text string
+//
+void
+G_SaveGame
+( int slot,
+ char* description )
+{
+ savegameslot = slot;
+ strcpy (savedescription, description);
+ sendsave = true;
+}
+
+void G_DoSaveGame (void)
+{
+ char name[100];
+ char name2[VERSIONSIZE];
+ char* description;
+ int length;
+ int i;
+
+ if (M_CheckParm("-cdrom"))
+ sprintf(name,"c:\\doomdata\\"SAVEGAMENAME"%d.dsg",savegameslot);
+ else
+ sprintf (name,SAVEGAMENAME"%d.dsg",savegameslot);
+ description = savedescription;
+
+ save_p = savebuffer = screens[1]+0x4000;
+
+ memcpy (save_p, description, SAVESTRINGSIZE);
+ save_p += SAVESTRINGSIZE;
+ memset (name2,0,sizeof(name2));
+ sprintf (name2,"version %i",VERSION);
+ memcpy (save_p, name2, VERSIONSIZE);
+ save_p += VERSIONSIZE;
+
+ *save_p++ = gameskill;
+ *save_p++ = gameepisode;
+ *save_p++ = gamemap;
+ for (i=0 ; i<MAXPLAYERS ; i++)
+ *save_p++ = playeringame[i];
+ *save_p++ = leveltime>>16;
+ *save_p++ = leveltime>>8;
+ *save_p++ = leveltime;
+
+ P_ArchivePlayers ();
+ P_ArchiveWorld ();
+ P_ArchiveThinkers ();
+ P_ArchiveSpecials ();
+
+ *save_p++ = 0x1d; // consistancy marker
+
+ length = save_p - savebuffer;
+ if (length > SAVEGAMESIZE)
+ I_Error ("Savegame buffer overrun");
+ M_WriteFile (name, savebuffer, length);
+ gameaction = ga_nothing;
+ savedescription[0] = 0;
+
+ players[consoleplayer].message = GGSAVED;
+
+ // draw the pattern into the back screen
+ R_FillBackScreen ();
+}
+
+
+//
+// G_InitNew
+// Can be called by the startup code or the menu task,
+// consoleplayer, displayplayer, playeringame[] should be set.
+//
+skill_t d_skill;
+int d_episode;
+int d_map;
+
+void
+G_DeferedInitNew
+( skill_t skill,
+ int episode,
+ int map)
+{
+ d_skill = skill;
+ d_episode = episode;
+ d_map = map;
+ gameaction = ga_newgame;
+}
+
+
+void G_DoNewGame (void)
+{
+ demoplayback = false;
+ netdemo = false;
+ netgame = false;
+ deathmatch = false;
+ playeringame[1] = playeringame[2] = playeringame[3] = 0;
+ respawnparm = false;
+ fastparm = false;
+ nomonsters = false;
+ consoleplayer = 0;
+ G_InitNew (d_skill, d_episode, d_map);
+ gameaction = ga_nothing;
+}
+
+// The sky texture to be used instead of the F_SKY1 dummy.
+extern int skytexture;
+
+
+void
+G_InitNew
+( skill_t skill,
+ int episode,
+ int map )
+{
+ int i;
+
+ if (paused)
+ {
+ paused = false;
+ S_ResumeSound ();
+ }
+
+
+ if (skill > sk_nightmare)
+ skill = sk_nightmare;
+
+
+ // This was quite messy with SPECIAL and commented parts.
+ // Supposedly hacks to make the latest edition work.
+ // It might not work properly.
+ if (episode < 1)
+ episode = 1;
+
+ if ( gamemode == retail )
+ {
+ if (episode > 4)
+ episode = 4;
+ }
+ else if ( gamemode == shareware )
+ {
+ if (episode > 1)
+ episode = 1; // only start episode 1 on shareware
+ }
+ else
+ {
+ if (episode > 3)
+ episode = 3;
+ }
+
+
+
+ if (map < 1)
+ map = 1;
+
+ if ( (map > 9)
+ && ( gamemode != commercial) )
+ map = 9;
+
+ M_ClearRandom ();
+
+ if (skill == sk_nightmare || respawnparm )
+ respawnmonsters = true;
+ else
+ respawnmonsters = false;
+
+ if (fastparm || (skill == sk_nightmare && gameskill != sk_nightmare) )
+ {
+ for (i=S_SARG_RUN1 ; i<=S_SARG_PAIN2 ; i++)
+ states[i].tics >>= 1;
+ mobjinfo[MT_BRUISERSHOT].speed = 20*FRACUNIT;
+ mobjinfo[MT_HEADSHOT].speed = 20*FRACUNIT;
+ mobjinfo[MT_TROOPSHOT].speed = 20*FRACUNIT;
+ }
+ else if (skill != sk_nightmare && gameskill == sk_nightmare)
+ {
+ for (i=S_SARG_RUN1 ; i<=S_SARG_PAIN2 ; i++)
+ states[i].tics <<= 1;
+ mobjinfo[MT_BRUISERSHOT].speed = 15*FRACUNIT;
+ mobjinfo[MT_HEADSHOT].speed = 10*FRACUNIT;
+ mobjinfo[MT_TROOPSHOT].speed = 10*FRACUNIT;
+ }
+
+
+ // force players to be initialized upon first level load
+ for (i=0 ; i<MAXPLAYERS ; i++)
+ players[i].playerstate = PST_REBORN;
+
+ usergame = true; // will be set false if a demo
+ paused = false;
+ demoplayback = false;
+ automapactive = false;
+ viewactive = true;
+ gameepisode = episode;
+ gamemap = map;
+ gameskill = skill;
+
+ viewactive = true;
+
+ // set the sky map for the episode
+ if ( gamemode == commercial)
+ {
+ skytexture = R_TextureNumForName ("SKY3");
+ if (gamemap < 12)
+ skytexture = R_TextureNumForName ("SKY1");
+ else
+ if (gamemap < 21)
+ skytexture = R_TextureNumForName ("SKY2");
+ }
+ else
+ switch (episode)
+ {
+ case 1:
+ skytexture = R_TextureNumForName ("SKY1");
+ break;
+ case 2:
+ skytexture = R_TextureNumForName ("SKY2");
+ break;
+ case 3:
+ skytexture = R_TextureNumForName ("SKY3");
+ break;
+ case 4: // Special Edition sky
+ skytexture = R_TextureNumForName ("SKY4");
+ break;
+ }
+
+ G_DoLoadLevel ();
+}
+
+
+//
+// DEMO RECORDING
+//
+#define DEMOMARKER 0x80
+
+
+void G_ReadDemoTiccmd (ticcmd_t* cmd)
+{
+ if (*demo_p == DEMOMARKER)
+ {
+ // end of demo data stream
+ G_CheckDemoStatus ();
+ return;
+ }
+ cmd->forwardmove = ((signed char)*demo_p++);
+ cmd->sidemove = ((signed char)*demo_p++);
+ cmd->angleturn = ((unsigned char)*demo_p++)<<8;
+ cmd->buttons = (unsigned char)*demo_p++;
+}
+
+
+void G_WriteDemoTiccmd (ticcmd_t* cmd)
+{
+ if (gamekeydown['q']) // press q to end demo recording
+ G_CheckDemoStatus ();
+ *demo_p++ = cmd->forwardmove;
+ *demo_p++ = cmd->sidemove;
+ *demo_p++ = (cmd->angleturn+128)>>8;
+ *demo_p++ = cmd->buttons;
+ demo_p -= 4;
+ if (demo_p > demoend - 16)
+ {
+ // no more space
+ G_CheckDemoStatus ();
+ return;
+ }
+
+ G_ReadDemoTiccmd (cmd); // make SURE it is exactly the same
+}
+
+
+
+//
+// G_RecordDemo
+//
+void G_RecordDemo (char* name)
+{
+ int i;
+ int maxsize;
+
+ usergame = false;
+ strcpy (demoname, name);
+ strcat (demoname, ".lmp");
+ maxsize = 0x20000;
+ i = M_CheckParm ("-maxdemo");
+ if (i && i<myargc-1)
+ maxsize = atoi(myargv[i+1])*1024;
+ demobuffer = Z_Malloc (maxsize,PU_STATIC,NULL);
+ demoend = demobuffer + maxsize;
+
+ demorecording = true;
+}
+
+
+void G_BeginRecording (void)
+{
+ int i;
+
+ demo_p = demobuffer;
+
+ *demo_p++ = VERSION;
+ *demo_p++ = gameskill;
+ *demo_p++ = gameepisode;
+ *demo_p++ = gamemap;
+ *demo_p++ = deathmatch;
+ *demo_p++ = respawnparm;
+ *demo_p++ = fastparm;
+ *demo_p++ = nomonsters;
+ *demo_p++ = consoleplayer;
+
+ for (i=0 ; i<MAXPLAYERS ; i++)
+ *demo_p++ = playeringame[i];
+}
+
+
+//
+// G_PlayDemo
+//
+
+char* defdemoname;
+
+void G_DeferedPlayDemo (char* name)
+{
+ defdemoname = name;
+ gameaction = ga_playdemo;
+}
+
+void G_DoPlayDemo (void)
+{
+ skill_t skill;
+ int i, episode, map;
+
+ gameaction = ga_nothing;
+ demobuffer = demo_p = W_CacheLumpName (defdemoname, PU_STATIC);
+ if ( *demo_p++ != VERSION)
+ {
+ fprintf( stderr, "Demo is from a different game version!\n");
+ gameaction = ga_nothing;
+ return;
+ }
+
+ skill = *demo_p++;
+ episode = *demo_p++;
+ map = *demo_p++;
+ deathmatch = *demo_p++;
+ respawnparm = *demo_p++;
+ fastparm = *demo_p++;
+ nomonsters = *demo_p++;
+ consoleplayer = *demo_p++;
+
+ for (i=0 ; i<MAXPLAYERS ; i++)
+ playeringame[i] = *demo_p++;
+ if (playeringame[1])
+ {
+ netgame = true;
+ netdemo = true;
+ }
+
+ // don't spend a lot of time in loadlevel
+ precache = false;
+ G_InitNew (skill, episode, map);
+ precache = true;
+
+ usergame = false;
+ demoplayback = true;
+}
+
+//
+// G_TimeDemo
+//
+void G_TimeDemo (char* name)
+{
+ nodrawers = M_CheckParm ("-nodraw");
+ noblit = M_CheckParm ("-noblit");
+ timingdemo = true;
+ singletics = true;
+
+ defdemoname = name;
+ gameaction = ga_playdemo;
+}
+
+
+/*
+===================
+=
+= G_CheckDemoStatus
+=
+= Called after a death or level completion to allow demos to be cleaned up
+= Returns true if a new demo loop action will take place
+===================
+*/
+
+boolean G_CheckDemoStatus (void)
+{
+ int endtime;
+
+ if (timingdemo)
+ {
+ endtime = I_GetTime ();
+ I_Error ("timed %i gametics in %i realtics",gametic
+ , endtime-starttime);
+ }
+
+ if (demoplayback)
+ {
+ if (singledemo)
+ I_Quit ();
+
+ Z_ChangeTag (demobuffer, PU_CACHE);
+ demoplayback = false;
+ netdemo = false;
+ netgame = false;
+ deathmatch = false;
+ playeringame[1] = playeringame[2] = playeringame[3] = 0;
+ respawnparm = false;
+ fastparm = false;
+ nomonsters = false;
+ consoleplayer = 0;
+ D_AdvanceDemo ();
+ return true;
+ }
+
+ if (demorecording)
+ {
+ *demo_p++ = DEMOMARKER;
+ M_WriteFile (demoname, demobuffer, demo_p - demobuffer);
+ Z_Free (demobuffer);
+ demorecording = false;
+ I_Error ("Demo %s recorded",demoname);
+ }
+
+ return false;
+}
+
+
+
diff --git a/linuxdoom-1.10/g_game.h b/linuxdoom-1.10/g_game.h
@@ -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:
+// Duh.
+//
+//-----------------------------------------------------------------------------
+
+
+#ifndef __G_GAME__
+#define __G_GAME__
+
+#include "doomdef.h"
+#include "d_event.h"
+
+
+
+//
+// GAME
+//
+void G_DeathMatchSpawnPlayer (int playernum);
+
+void G_InitNew (skill_t skill, int episode, int map);
+
+// Can be called by the startup code or M_Responder.
+// A normal game starts at map 1,
+// but a warp test can start elsewhere
+void G_DeferedInitNew (skill_t skill, int episode, int map);
+
+void G_DeferedPlayDemo (char* demo);
+
+// Can be called by the startup code or M_Responder,
+// calls P_SetupLevel or W_EnterWorld.
+void G_LoadGame (char* name);
+
+void G_DoLoadGame (void);
+
+// Called by M_Responder.
+void G_SaveGame (int slot, char* description);
+
+// Only called by startup code.
+void G_RecordDemo (char* name);
+
+void G_BeginRecording (void);
+
+void G_PlayDemo (char* name);
+void G_TimeDemo (char* name);
+boolean G_CheckDemoStatus (void);
+
+void G_ExitLevel (void);
+void G_SecretExitLevel (void);
+
+void G_WorldDone (void);
+
+void G_Ticker (void);
+boolean G_Responder (event_t* ev);
+
+void G_ScreenShot (void);
+
+
+#endif
+//-----------------------------------------------------------------------------
+//
+// $Log:$
+//
+//-----------------------------------------------------------------------------
diff --git a/linuxdoom-1.10/hu_lib.c b/linuxdoom-1.10/hu_lib.c
@@ -0,0 +1,354 @@
+// 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: heads-up text and input code
+//
+//-----------------------------------------------------------------------------
+
+static const char
+rcsid[] = "$Id: hu_lib.c,v 1.3 1997/01/26 07:44:58 b1 Exp $";
+
+#include <ctype.h>
+
+#include "doomdef.h"
+
+#include "v_video.h"
+#include "m_swap.h"
+
+#include "hu_lib.h"
+#include "r_local.h"
+#include "r_draw.h"
+
+// boolean : whether the screen is always erased
+#define noterased viewwindowx
+
+extern boolean automapactive; // in AM_map.c
+
+void HUlib_init(void)
+{
+}
+
+void HUlib_clearTextLine(hu_textline_t* t)
+{
+ t->len = 0;
+ t->l[0] = 0;
+ t->needsupdate = true;
+}
+
+void
+HUlib_initTextLine
+( hu_textline_t* t,
+ int x,
+ int y,
+ patch_t** f,
+ int sc )
+{
+ t->x = x;
+ t->y = y;
+ t->f = f;
+ t->sc = sc;
+ HUlib_clearTextLine(t);
+}
+
+boolean
+HUlib_addCharToTextLine
+( hu_textline_t* t,
+ char ch )
+{
+
+ if (t->len == HU_MAXLINELENGTH)
+ return false;
+ else
+ {
+ t->l[t->len++] = ch;
+ t->l[t->len] = 0;
+ t->needsupdate = 4;
+ return true;
+ }
+
+}
+
+boolean HUlib_delCharFromTextLine(hu_textline_t* t)
+{
+
+ if (!t->len) return false;
+ else
+ {
+ t->l[--t->len] = 0;
+ t->needsupdate = 4;
+ return true;
+ }
+
+}
+
+void
+HUlib_drawTextLine
+( hu_textline_t* l,
+ boolean drawcursor )
+{
+
+ int i;
+ int w;
+ int x;
+ unsigned char c;
+
+ // draw the new stuff
+ x = l->x;
+ for (i=0;i<l->len;i++)
+ {
+ c = toupper(l->l[i]);
+ if (c != ' '
+ && c >= l->sc
+ && c <= '_')
+ {
+ w = SHORT(l->f[c - l->sc]->width);
+ if (x+w > SCREENWIDTH)
+ break;
+ V_DrawPatchDirect(x, l->y, FG, l->f[c - l->sc]);
+ x += w;
+ }
+ else
+ {
+ x += 4;
+ if (x >= SCREENWIDTH)
+ break;
+ }
+ }
+
+ // draw the cursor if requested
+ if (drawcursor
+ && x + SHORT(l->f['_' - l->sc]->width) <= SCREENWIDTH)
+ {
+ V_DrawPatchDirect(x, l->y, FG, l->f['_' - l->sc]);
+ }
+}
+
+
+// sorta called by HU_Erase and just better darn get things straight
+void HUlib_eraseTextLine(hu_textline_t* l)
+{
+ int lh;
+ int y;
+ int yoffset;
+ static boolean lastautomapactive = true;
+
+ // Only erases when NOT in automap and the screen is reduced,
+ // and the text must either need updating or refreshing
+ // (because of a recent change back from the automap)
+
+ if (!automapactive &&
+ viewwindowx && l->needsupdate)
+ {
+ lh = SHORT(l->f[0]->height) + 1;
+ for (y=l->y,yoffset=y*SCREENWIDTH ; y<l->y+lh ; y++,yoffset+=SCREENWIDTH)
+ {
+ if (y < viewwindowy || y >= viewwindowy + viewheight)
+ R_VideoErase(yoffset, SCREENWIDTH); // erase entire line
+ else
+ {
+ R_VideoErase(yoffset, viewwindowx); // erase left border
+ R_VideoErase(yoffset + viewwindowx + viewwidth, viewwindowx);
+ // erase right border
+ }
+ }
+ }
+
+ lastautomapactive = automapactive;
+ if (l->needsupdate) l->needsupdate--;
+
+}
+
+void
+HUlib_initSText
+( hu_stext_t* s,
+ int x,
+ int y,
+ int h,
+ patch_t** font,
+ int startchar,
+ boolean* on )
+{
+
+ int i;
+
+ s->h = h;
+ s->on = on;
+ s->laston = true;
+ s->cl = 0;
+ for (i=0;i<h;i++)
+ HUlib_initTextLine(&s->l[i],
+ x, y - i*(SHORT(font[0]->height)+1),
+ font, startchar);
+
+}
+
+void HUlib_addLineToSText(hu_stext_t* s)
+{
+
+ int i;
+
+ // add a clear line
+ if (++s->cl == s->h)
+ s->cl = 0;
+ HUlib_clearTextLine(&s->l[s->cl]);
+
+ // everything needs updating
+ for (i=0 ; i<s->h ; i++)
+ s->l[i].needsupdate = 4;
+
+}
+
+void
+HUlib_addMessageToSText
+( hu_stext_t* s,
+ char* prefix,
+ char* msg )
+{
+ HUlib_addLineToSText(s);
+ if (prefix)
+ while (*prefix)
+ HUlib_addCharToTextLine(&s->l[s->cl], *(prefix++));
+
+ while (*msg)
+ HUlib_addCharToTextLine(&s->l[s->cl], *(msg++));
+}
+
+void HUlib_drawSText(hu_stext_t* s)
+{
+ int i, idx;
+ hu_textline_t *l;
+
+ if (!*s->on)
+ return; // if not on, don't draw
+
+ // draw everything
+ for (i=0 ; i<s->h ; i++)
+ {
+ idx = s->cl - i;
+ if (idx < 0)
+ idx += s->h; // handle queue of lines
+
+ l = &s->l[idx];
+
+ // need a decision made here on whether to skip the draw
+ HUlib_drawTextLine(l, false); // no cursor, please
+ }
+
+}
+
+void HUlib_eraseSText(hu_stext_t* s)
+{
+
+ int i;
+
+ for (i=0 ; i<s->h ; i++)
+ {
+ if (s->laston && !*s->on)
+ s->l[i].needsupdate = 4;
+ HUlib_eraseTextLine(&s->l[i]);
+ }
+ s->laston = *s->on;
+
+}
+
+void
+HUlib_initIText
+( hu_itext_t* it,
+ int x,
+ int y,
+ patch_t** font,
+ int startchar,
+ boolean* on )
+{
+ it->lm = 0; // default left margin is start of text
+ it->on = on;
+ it->laston = true;
+ HUlib_initTextLine(&it->l, x, y, font, startchar);
+}
+
+
+// The following deletion routines adhere to the left margin restriction
+void HUlib_delCharFromIText(hu_itext_t* it)
+{
+ if (it->l.len != it->lm)
+ HUlib_delCharFromTextLine(&it->l);
+}
+
+void HUlib_eraseLineFromIText(hu_itext_t* it)
+{
+ while (it->lm != it->l.len)
+ HUlib_delCharFromTextLine(&it->l);
+}
+
+// Resets left margin as well
+void HUlib_resetIText(hu_itext_t* it)
+{
+ it->lm = 0;
+ HUlib_clearTextLine(&it->l);
+}
+
+void
+HUlib_addPrefixToIText
+( hu_itext_t* it,
+ char* str )
+{
+ while (*str)
+ HUlib_addCharToTextLine(&it->l, *(str++));
+ it->lm = it->l.len;
+}
+
+// wrapper function for handling general keyed input.
+// returns true if it ate the key
+boolean
+HUlib_keyInIText
+( hu_itext_t* it,
+ unsigned char ch )
+{
+
+ if (ch >= ' ' && ch <= '_')
+ HUlib_addCharToTextLine(&it->l, (char) ch);
+ else
+ if (ch == KEY_BACKSPACE)
+ HUlib_delCharFromIText(it);
+ else
+ if (ch != KEY_ENTER)
+ return false; // did not eat key
+
+ return true; // ate the key
+
+}
+
+void HUlib_drawIText(hu_itext_t* it)
+{
+
+ hu_textline_t *l = &it->l;
+
+ if (!*it->on)
+ return;
+ HUlib_drawTextLine(l, true); // draw the line w/ cursor
+
+}
+
+void HUlib_eraseIText(hu_itext_t* it)
+{
+ if (it->laston && !*it->on)
+ it->l.needsupdate = 4;
+ HUlib_eraseTextLine(&it->l);
+ it->laston = *it->on;
+}
+
diff --git a/linuxdoom-1.10/hu_lib.h b/linuxdoom-1.10/hu_lib.h
@@ -0,0 +1,196 @@
+// 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: none
+//
+//-----------------------------------------------------------------------------
+
+#ifndef __HULIB__
+#define __HULIB__
+
+// We are referring to patches.
+#include "r_defs.h"
+
+
+// background and foreground screen numbers
+// different from other modules.
+#define BG 1
+#define FG 0
+
+// font stuff
+#define HU_CHARERASE KEY_BACKSPACE
+
+#define HU_MAXLINES 4
+#define HU_MAXLINELENGTH 80
+
+//
+// Typedefs of widgets
+//
+
+// Text Line widget
+// (parent of Scrolling Text and Input Text widgets)
+typedef struct
+{
+ // left-justified position of scrolling text window
+ int x;
+ int y;
+
+ patch_t** f; // font
+ int sc; // start character
+ char l[HU_MAXLINELENGTH+1]; // line of text
+ int len; // current line length
+
+ // whether this line needs to be udpated
+ int needsupdate;
+
+} hu_textline_t;
+
+
+
+// Scrolling Text window widget
+// (child of Text Line widget)
+typedef struct
+{
+ hu_textline_t l[HU_MAXLINES]; // text lines to draw
+ int h; // height in lines
+ int cl; // current line number
+
+ // pointer to boolean stating whether to update window
+ boolean* on;
+ boolean laston; // last value of *->on.
+
+} hu_stext_t;
+
+
+
+// Input Text Line widget
+// (child of Text Line widget)
+typedef struct
+{
+ hu_textline_t l; // text line to input on
+
+ // left margin past which I am not to delete characters
+ int lm;
+
+ // pointer to boolean stating whether to update window
+ boolean* on;
+ boolean laston; // last value of *->on;
+
+} hu_itext_t;
+
+
+//
+// Widget creation, access, and update routines
+//
+
+// initializes heads-up widget library
+void HUlib_init(void);
+
+//
+// textline code
+//
+
+// clear a line of text
+void HUlib_clearTextLine(hu_textline_t *t);
+
+void HUlib_initTextLine(hu_textline_t *t, int x, int y, patch_t **f, int sc);
+
+// returns success
+boolean HUlib_addCharToTextLine(hu_textline_t *t, char ch);
+
+// returns success
+boolean HUlib_delCharFromTextLine(hu_textline_t *t);
+
+// draws tline
+void HUlib_drawTextLine(hu_textline_t *l, boolean drawcursor);
+
+// erases text line
+void HUlib_eraseTextLine(hu_textline_t *l);
+
+
+//
+// Scrolling Text window widget routines
+//
+
+// ?
+void
+HUlib_initSText
+( hu_stext_t* s,
+ int x,
+ int y,
+ int h,
+ patch_t** font,
+ int startchar,
+ boolean* on );
+
+// add a new line
+void HUlib_addLineToSText(hu_stext_t* s);
+
+// ?
+void
+HUlib_addMessageToSText
+( hu_stext_t* s,
+ char* prefix,
+ char* msg );
+
+// draws stext
+void HUlib_drawSText(hu_stext_t* s);
+
+// erases all stext lines
+void HUlib_eraseSText(hu_stext_t* s);
+
+// Input Text Line widget routines
+void
+HUlib_initIText
+( hu_itext_t* it,
+ int x,
+ int y,
+ patch_t** font,
+ int startchar,
+ boolean* on );
+
+// enforces left margin
+void HUlib_delCharFromIText(hu_itext_t* it);
+
+// enforces left margin
+void HUlib_eraseLineFromIText(hu_itext_t* it);
+
+// resets line and left margin
+void HUlib_resetIText(hu_itext_t* it);
+
+// left of left-margin
+void
+HUlib_addPrefixToIText
+( hu_itext_t* it,
+ char* str );
+
+// whether eaten
+boolean
+HUlib_keyInIText
+( hu_itext_t* it,
+ unsigned char ch );
+
+void HUlib_drawIText(hu_itext_t* it);
+
+// erases all itext lines
+void HUlib_eraseIText(hu_itext_t* it);
+
+#endif
+//-----------------------------------------------------------------------------
+//
+// $Log:$
+//
+//-----------------------------------------------------------------------------
diff --git a/linuxdoom-1.10/hu_stuff.c b/linuxdoom-1.10/hu_stuff.c
@@ -0,0 +1,759 @@
+// 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: Heads-up displays
+//
+//-----------------------------------------------------------------------------
+
+static const char
+rcsid[] = "$Id: hu_stuff.c,v 1.4 1997/02/03 16:47:52 b1 Exp $";
+
+#include <ctype.h>
+
+#include "doomdef.h"
+
+#include "z_zone.h"
+
+#include "m_swap.h"
+
+#include "hu_stuff.h"
+#include "hu_lib.h"
+#include "w_wad.h"
+
+#include "s_sound.h"
+
+#include "doomstat.h"
+
+// Data.
+#include "dstrings.h"
+#include "sounds.h"
+
+//
+// Locally used constants, shortcuts.
+//
+#define HU_TITLE (mapnames[(gameepisode-1)*9+gamemap-1])
+#define HU_TITLE2 (mapnames2[gamemap-1])
+#define HU_TITLEP (mapnamesp[gamemap-1])
+#define HU_TITLET (mapnamest[gamemap-1])
+#define HU_TITLEHEIGHT 1
+#define HU_TITLEX 0
+#define HU_TITLEY (167 - SHORT(hu_font[0]->height))
+
+#define HU_INPUTTOGGLE 't'
+#define HU_INPUTX HU_MSGX
+#define HU_INPUTY (HU_MSGY + HU_MSGHEIGHT*(SHORT(hu_font[0]->height) +1))
+#define HU_INPUTWIDTH 64
+#define HU_INPUTHEIGHT 1
+
+
+
+char* chat_macros[] =
+{
+ HUSTR_CHATMACRO0,
+ HUSTR_CHATMACRO1,
+ HUSTR_CHATMACRO2,
+ HUSTR_CHATMACRO3,
+ HUSTR_CHATMACRO4,
+ HUSTR_CHATMACRO5,
+ HUSTR_CHATMACRO6,
+ HUSTR_CHATMACRO7,
+ HUSTR_CHATMACRO8,
+ HUSTR_CHATMACRO9
+};
+
+char* player_names[] =
+{
+ HUSTR_PLRGREEN,
+ HUSTR_PLRINDIGO,
+ HUSTR_PLRBROWN,
+ HUSTR_PLRRED
+};
+
+
+char chat_char; // remove later.
+static player_t* plr;
+patch_t* hu_font[HU_FONTSIZE];
+static hu_textline_t w_title;
+boolean chat_on;
+static hu_itext_t w_chat;
+static boolean always_off = false;
+static char chat_dest[MAXPLAYERS];
+static hu_itext_t w_inputbuffer[MAXPLAYERS];
+
+static boolean message_on;
+boolean message_dontfuckwithme;
+static boolean message_nottobefuckedwith;
+
+static hu_stext_t w_message;
+static int message_counter;
+
+extern int showMessages;
+extern boolean automapactive;
+
+static boolean headsupactive = false;
+
+//
+// Builtin map names.
+// The actual names can be found in DStrings.h.
+//
+
+char* mapnames[] = // DOOM shareware/registered/retail (Ultimate) names.
+{
+
+ HUSTR_E1M1,
+ HUSTR_E1M2,
+ HUSTR_E1M3,
+ HUSTR_E1M4,
+ HUSTR_E1M5,
+ HUSTR_E1M6,
+ HUSTR_E1M7,
+ HUSTR_E1M8,
+ HUSTR_E1M9,
+
+ HUSTR_E2M1,
+ HUSTR_E2M2,
+ HUSTR_E2M3,
+ HUSTR_E2M4,
+ HUSTR_E2M5,
+ HUSTR_E2M6,
+ HUSTR_E2M7,
+ HUSTR_E2M8,
+ HUSTR_E2M9,
+
+ HUSTR_E3M1,
+ HUSTR_E3M2,
+ HUSTR_E3M3,
+ HUSTR_E3M4,
+ HUSTR_E3M5,
+ HUSTR_E3M6,
+ HUSTR_E3M7,
+ HUSTR_E3M8,
+ HUSTR_E3M9,
+
+ HUSTR_E4M1,
+ HUSTR_E4M2,
+ HUSTR_E4M3,
+ HUSTR_E4M4,
+ HUSTR_E4M5,
+ HUSTR_E4M6,
+ HUSTR_E4M7,
+ HUSTR_E4M8,
+ HUSTR_E4M9,
+
+ "NEWLEVEL",
+ "NEWLEVEL",
+ "NEWLEVEL",
+ "NEWLEVEL",
+ "NEWLEVEL",
+ "NEWLEVEL",
+ "NEWLEVEL",
+ "NEWLEVEL",
+ "NEWLEVEL"
+};
+
+char* mapnames2[] = // DOOM 2 map names.
+{
+ HUSTR_1,
+ HUSTR_2,
+ HUSTR_3,
+ HUSTR_4,
+ HUSTR_5,
+ HUSTR_6,
+ HUSTR_7,
+ HUSTR_8,
+ HUSTR_9,
+ HUSTR_10,
+ HUSTR_11,
+
+ HUSTR_12,
+ HUSTR_13,
+ HUSTR_14,
+ HUSTR_15,
+ HUSTR_16,
+ HUSTR_17,
+ HUSTR_18,
+ HUSTR_19,
+ HUSTR_20,
+
+ HUSTR_21,
+ HUSTR_22,
+ HUSTR_23,
+ HUSTR_24,
+ HUSTR_25,
+ HUSTR_26,
+ HUSTR_27,
+ HUSTR_28,
+ HUSTR_29,
+ HUSTR_30,
+ HUSTR_31,
+ HUSTR_32
+};
+
+
+char* mapnamesp[] = // Plutonia WAD map names.
+{
+ PHUSTR_1,
+ PHUSTR_2,
+ PHUSTR_3,
+ PHUSTR_4,
+ PHUSTR_5,
+ PHUSTR_6,
+ PHUSTR_7,
+ PHUSTR_8,
+ PHUSTR_9,
+ PHUSTR_10,
+ PHUSTR_11,
+
+ PHUSTR_12,
+ PHUSTR_13,
+ PHUSTR_14,
+ PHUSTR_15,
+ PHUSTR_16,
+ PHUSTR_17,
+ PHUSTR_18,
+ PHUSTR_19,
+ PHUSTR_20,
+
+ PHUSTR_21,
+ PHUSTR_22,
+ PHUSTR_23,
+ PHUSTR_24,
+ PHUSTR_25,
+ PHUSTR_26,
+ PHUSTR_27,
+ PHUSTR_28,
+ PHUSTR_29,
+ PHUSTR_30,
+ PHUSTR_31,
+ PHUSTR_32
+};
+
+
+char *mapnamest[] = // TNT WAD map names.
+{
+ THUSTR_1,
+ THUSTR_2,
+ THUSTR_3,
+ THUSTR_4,
+ THUSTR_5,
+ THUSTR_6,
+ THUSTR_7,
+ THUSTR_8,
+ THUSTR_9,
+ THUSTR_10,
+ THUSTR_11,
+
+ THUSTR_12,
+ THUSTR_13,
+ THUSTR_14,
+ THUSTR_15,
+ THUSTR_16,
+ THUSTR_17,
+ THUSTR_18,
+ THUSTR_19,
+ THUSTR_20,
+
+ THUSTR_21,
+ THUSTR_22,
+ THUSTR_23,
+ THUSTR_24,
+ THUSTR_25,
+ THUSTR_26,
+ THUSTR_27,
+ THUSTR_28,
+ THUSTR_29,
+ THUSTR_30,
+ THUSTR_31,
+ THUSTR_32
+};
+
+
+const char* shiftxform;
+
+const char french_shiftxform[] =
+{
+ 0,
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
+ 31,
+ ' ', '!', '"', '#', '$', '%', '&',
+ '"', // shift-'
+ '(', ')', '*', '+',
+ '?', // shift-,
+ '_', // shift--
+ '>', // shift-.
+ '?', // shift-/
+ '0', // shift-0
+ '1', // shift-1
+ '2', // shift-2
+ '3', // shift-3
+ '4', // shift-4
+ '5', // shift-5
+ '6', // shift-6
+ '7', // shift-7
+ '8', // shift-8
+ '9', // shift-9
+ '/',
+ '.', // shift-;
+ '<',
+ '+', // shift-=
+ '>', '?', '@',
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
+ 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+ '[', // shift-[
+ '!', // shift-backslash - OH MY GOD DOES WATCOM SUCK
+ ']', // shift-]
+ '"', '_',
+ '\'', // shift-`
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
+ 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+ '{', '|', '}', '~', 127
+
+};
+
+const char english_shiftxform[] =
+{
+
+ 0,
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
+ 31,
+ ' ', '!', '"', '#', '$', '%', '&',
+ '"', // shift-'
+ '(', ')', '*', '+',
+ '<', // shift-,
+ '_', // shift--
+ '>', // shift-.
+ '?', // shift-/
+ ')', // shift-0
+ '!', // shift-1
+ '@', // shift-2
+ '#', // shift-3
+ '$', // shift-4
+ '%', // shift-5
+ '^', // shift-6
+ '&', // shift-7
+ '*', // shift-8
+ '(', // shift-9
+ ':',
+ ':', // shift-;
+ '<',
+ '+', // shift-=
+ '>', '?', '@',
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
+ 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+ '[', // shift-[
+ '!', // shift-backslash - OH MY GOD DOES WATCOM SUCK
+ ']', // shift-]
+ '"', '_',
+ '\'', // shift-`
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
+ 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+ '{', '|', '}', '~', 127
+};
+
+char frenchKeyMap[128]=
+{
+ 0,
+ 1,2,3,4,5,6,7,8,9,10,
+ 11,12,13,14,15,16,17,18,19,20,
+ 21,22,23,24,25,26,27,28,29,30,
+ 31,
+ ' ','!','"','#','$','%','&','%','(',')','*','+',';','-',':','!',
+ '0','1','2','3','4','5','6','7','8','9',':','M','<','=','>','?',
+ '@','Q','B','C','D','E','F','G','H','I','J','K','L',',','N','O',
+ 'P','A','R','S','T','U','V','Z','X','Y','W','^','\\','$','^','_',
+ '@','Q','B','C','D','E','F','G','H','I','J','K','L',',','N','O',
+ 'P','A','R','S','T','U','V','Z','X','Y','W','^','\\','$','^',127
+};
+
+char ForeignTranslation(unsigned char ch)
+{
+ return ch < 128 ? frenchKeyMap[ch] : ch;
+}
+
+void HU_Init(void)
+{
+
+ int i;
+ int j;
+ char buffer[9];
+
+ if (french)
+ shiftxform = french_shiftxform;
+ else
+ shiftxform = english_shiftxform;
+
+ // load the heads-up font
+ j = HU_FONTSTART;
+ for (i=0;i<HU_FONTSIZE;i++)
+ {
+ sprintf(buffer, "STCFN%.3d", j++);
+ hu_font[i] = (patch_t *) W_CacheLumpName(buffer, PU_STATIC);
+ }
+
+}
+
+void HU_Stop(void)
+{
+ headsupactive = false;
+}
+
+void HU_Start(void)
+{
+
+ int i;
+ char* s;
+
+ if (headsupactive)
+ HU_Stop();
+
+ plr = &players[consoleplayer];
+ message_on = false;
+ message_dontfuckwithme = false;
+ message_nottobefuckedwith = false;
+ chat_on = false;
+
+ // create the message widget
+ HUlib_initSText(&w_message,
+ HU_MSGX, HU_MSGY, HU_MSGHEIGHT,
+ hu_font,
+ HU_FONTSTART, &message_on);
+
+ // create the map title widget
+ HUlib_initTextLine(&w_title,
+ HU_TITLEX, HU_TITLEY,
+ hu_font,
+ HU_FONTSTART);
+
+ switch ( gamemode )
+ {
+ case shareware:
+ case registered:
+ case retail:
+ s = HU_TITLE;
+ break;
+
+/* FIXME
+ case pack_plut:
+ s = HU_TITLEP;
+ break;
+ case pack_tnt:
+ s = HU_TITLET;
+ break;
+*/
+
+ case commercial:
+ default:
+ s = HU_TITLE2;
+ break;
+ }
+
+ while (*s)
+ HUlib_addCharToTextLine(&w_title, *(s++));
+
+ // create the chat widget
+ HUlib_initIText(&w_chat,
+ HU_INPUTX, HU_INPUTY,
+ hu_font,
+ HU_FONTSTART, &chat_on);
+
+ // create the inputbuffer widgets
+ for (i=0 ; i<MAXPLAYERS ; i++)
+ HUlib_initIText(&w_inputbuffer[i], 0, 0, 0, 0, &always_off);
+
+ headsupactive = true;
+
+}
+
+void HU_Drawer(void)
+{
+
+ HUlib_drawSText(&w_message);
+ HUlib_drawIText(&w_chat);
+ if (automapactive)
+ HUlib_drawTextLine(&w_title, false);
+
+}
+