doom

a minimalistic implementation of doom
git clone git://ssnf.xyz/doom
Log | Files | Refs

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:
AREADME.TXT | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/CVS/Entries | 109+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/CVS/Repository | 1+
Alinuxdoom-1.10/CVS/Root | 1+
Alinuxdoom-1.10/ChangeLog | 922+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/DOOMLIC.TXT | 112+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/FILES | 98+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/FILES2 | 221+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/Makefile | 96+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/README.asm | 283+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/README.b | 140+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/README.book | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/README.gl | 149+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/README.sound | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/TODO | 123+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/am_map.c | 1349+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/am_map.h | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/d_englsh.h | 701+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/d_event.h | 122+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/d_french.h | 433+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/d_items.c | 138+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/d_items.h | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/d_main.c | 1171+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/d_main.h | 64++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/d_net.c | 767+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/d_net.h | 149+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/d_player.h | 219+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/d_textur.h | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/d_think.h | 79+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/d_ticcmd.h | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/doomdata.h | 222+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/doomdef.c | 38++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/doomdef.h | 338+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/doomstat.c | 46++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/doomstat.h | 296+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/doomtype.h | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/dstrings.c | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/dstrings.h | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/f_finale.c | 738+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/f_finale.h | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/f_wipe.c | 302++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/f_wipe.h | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/g_game.c | 1690+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/g_game.h | 79+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/hu_lib.c | 354+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/hu_lib.h | 196+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/hu_stuff.c | 759+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/hu_stuff.h | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/i_main.c | 45+++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/i_net.c | 348+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/i_net.h | 45+++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/i_sound.c | 985+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/i_sound.h | 122+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/i_system.c | 183+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/i_system.h | 97+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/i_video.c | 1050+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/i_video.h | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/info.c | 4670+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/info.h | 1340+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/m_argv.c | 56++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/m_argv.h | 42++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/m_bbox.c | 64++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/m_bbox.h | 55+++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/m_cheat.c | 101+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/m_cheat.h | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/m_fixed.c | 87+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/m_fixed.h | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/m_menu.c | 1893+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/m_menu.h | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/m_misc.c | 534+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/m_misc.h | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/m_random.c | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/m_random.h | 47+++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/m_swap.c | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/m_swap.h | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_ceilng.c | 335+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_doors.c | 764+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_enemy.c | 2008+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_floor.c | 555+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_inter.c | 918+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_inter.h | 41+++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_lights.c | 357+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_local.h | 289++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_map.c | 1339+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_maputl.c | 883+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_mobj.c | 988+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_mobj.h | 295+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_plats.c | 314+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_pspr.c | 879+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_pspr.h | 82+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_saveg.c | 586+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_saveg.h | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_setup.c | 708+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_setup.h | 48++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_sight.c | 349+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_spec.c | 1362+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_spec.h | 645+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_switch.c | 654+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_telept.c | 132+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_tick.c | 158+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_tick.h | 44++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/p_user.c | 386+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/r_bsp.c | 580+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/r_bsp.h | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/r_data.c | 849+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/r_data.h | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/r_defs.h | 490+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/r_draw.c | 877+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/r_draw.h | 115+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/r_local.h | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/r_main.c | 898+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/r_main.h | 172+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/r_plane.c | 453+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/r_plane.h | 87+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/r_segs.c | 746+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/r_segs.h | 44++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/r_sky.c | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/r_sky.h | 48++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/r_state.h | 138+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/r_things.c | 989+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/r_things.h | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/s_sound.c | 879+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/s_sound.h | 109+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/sounds.c | 228+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/sounds.h | 297+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/st_lib.c | 293+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/st_lib.h | 226+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/st_stuff.c | 1471+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/st_stuff.h | 86+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/tables.c | 2130+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/tables.h | 100+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/v_video.c | 493+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/v_video.h | 119+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/w_wad.c | 577+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/w_wad.h | 89+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/wi_stuff.c | 1850+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/wi_stuff.h | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/z_zone.c | 467+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alinuxdoom-1.10/z_zone.h | 86+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asndserv/Makefile | 39+++++++++++++++++++++++++++++++++++++++
Asndserv/README.sndserv | 16++++++++++++++++
Asndserv/linux.c | 118+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asndserv/sounds.c | 239+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asndserv/sounds.h | 241+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asndserv/soundsrv.c | 740+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asndserv/soundsrv.h | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asndserv/soundst.h | 312+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asndserv/wadread.c | 256+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asndserv/wadread.h | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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); + +} +