December 22, 1998
- Fixed the thing spawners so that they don't spawn monsters if the
  nomonsters dmflag is set.
- Changed the imp fireball to be 75% opaque.
- Replaced the am_key?color cvars with am_lockedcolor. Finally rewrote the
  code in the automap that uses it, too. (Up until now, it was still using
  the old Doom specials to determine locked doors, even though they all get
  converted into Door_LockedRaise before the automap ever sees the line.

December 21, 1998
- Added ML_BLOCKEVERYTHING linedef flag.

December 20, 1998
- Added support for a ChangeCamera special.

December 19, 1998
- Added a fire effect to the player setup menu (which I had wanted to do
  ever since I saw Unreal).

December 15, 1998
- Went through commands.txt, and documented new commands and cvars (and also
  some that I had missed from 1.14). I still count 4 undocumented commands,
  but I can't figure out what they are even when I compare it with the output
  of the cmdlist command.
- Fixed problem with V_BreakLines() not properly setting the pixels width
  of lines that were broken.
- Fixed problem of Plat_UpByValue not going back down.

December 13, 1998
- Fixed problem of lighting in hires modes lightening too quickly.
- Added outsidefog key to MAPINFO lump parser to set the fog color for
  any sectors with sky ceilings.
- Removed the translucency on health bonuses.
- Improved some of the error-handling code in the midi playback routines,
  and the problem seems to have gone away.

December 12, 1998
- Started experiencing a strange midi problem: it works with the debug
  build but not the release.
- Added soundlist command to display the assignment of sounds.
- Added dynamic sound linking so that sounds that refer to the same lump
  use the same copy of the sound. Added the soundlinks command to view
  the linking of sounds.
- Fixed problem of punching someone to death being treated as an
  unknown means of death in the obituaries.
- Spawning players now telefrag things standing at their spawnpoint, so
  it's no longer possible to get stuck inside another player when
  spawning. Also relaxed the restriction on deathmatch starts so that
  only one is needed to start a game.
- Added nobfgaim cvar to disable freeaiming of the bfg. (suggested by
  Tony Fabris)
- Was trying to figure out why weapnext and weapprev only worked for
  player 0 in network games, when they suddenly started working.
  Hopefully it's permanent... [Now that I've thought about it a little
  more, I probably just wasn't getting the mouse captured when I alt-tabbed
  to the other player's window.]
- Rewrote weapnext and weapprev commands to use the inventory "system."
- Added a dir command.
- Added support for the second joystick device because my joystick somehow
  got assigned to it (and made me aware that it exists :-). Also added
  joy_xthreshold, joy_ythreshold, joy_xsensitivity, joy_ysensitivity, and
  joy_speedmultiplier cvars.
- Added support for double bindings (for double clicking, but it works with
  all keys, not just the mouse buttons) to C_DoKey() and some associated
  console commands.
- Changed C_DoKey() so that it takes an event as input.
- Added some code to PTR_ShootTraverse so that bullet puffs can appear on
  floors and ceilings.

December 6, 1998
- Fixed problem of monsters being slow to attack a player if they were
  on a route: Their reactiontime was too high.
- Added a gender option to the player setup menu.
- If getsfx() tries to load a sexed sound, and it doesn't exist, it will
  try to load a male version of the sound.
- Added an empty sound (dsempty).
- Changed sound handling slightly so that sounds are now loaded when
  they are first used instead of during I_InitSound(). They still stick
  around forever after that.
- Changed the names of every sound in SNDINFO. It's no longer Hexen-
  compatible, but it should at least be compatible with what I want to
  do eventually. I also redid the way skin sounds are handled to better
  fit my new sound naming conventions: Any gender/skin-specific sounds
  can be used by prefacing them with a '*' and passing a player mobj to
  a sound function. (If a player mobj is not passed, it defaults to male).
- Fixed the problem of button sounds being played in the wrong place
  when they're deactivated. For some reason, I had this line in
  P_UpdateSpecials():
		S_StartSound ((mobj_t *)&button->soundorg, "Switch1", 78);
  but button->soundorg is an mobj_t *. I'm surprised it didn't crash.
- Changed P_Thing_Spawn() and P_Thing_Projectile() so that they will only
  spawn things at map spots and not just anything with a matching tid.
- Fixed P_Thing_Projectile() so that it will still spawn missiles even if
  there is something at their spawn spot.

December 4, 1998
- Was playing a dark level and noticed that the fog isn't "thick"
  enough at higher resolutions: It transitions from darkness to fullbright
  far too quickly.
- Tweaked the falling damage some more using some code from Q2.
- Rearranged the startup sequence slightly so that I_Init() gets called
  before I_InitGraphics() (like it was before).
- Added support for gendered death messages.
- Rewrote portions of d_dehack.c so that it takes less space when compiled
  and also added .bex support. (Tried it with a few .bex files, but didn't
  do any extensive testing. Assuming it works. :-)
- Added a check in Printf() to avoid drawing to the console too rapidly
  during startup, because that can slow it down.
- Changed P_LoadSegs so that it clears a line's ML_TWOSIDED flag if an
  associated sidedef doesn't point to a back sector (otherwise the game
  could crash in p_sight.c when the line came into view).
- Removed foreign language "support." It's been broken for a while and was
  too hard to add new strings.
- Moved string names out of d_dehack.c and into dstrings.c (which is where
  they should have been in the first place.)

November 30, 1998
- Had a flash of insight for how I could speed up the rendering of walls. A
  quick test shows that filling the screen with columns of shorts is about
  twice as fast as filling it with columns of bytes. If I draw wall columns
  into memory in consecutive bytes, and then copy them to the screen in
  another pass, I should be able to combine the writing of two or more
  columns together, obtaining a speed boost that should, at the very least,
  let me maintain 35 fps at 800x600 on my machine. I'll have to try it and
  see if it actually works in practice. The overhead of writing the walls
  twice might kill any performance boost this could offer. On 486s and slow
  Pentiums, this will almost certainly be more of a hinderance than a help,
  and it's not needed at low resolutions anyway, so I plan on keeping it
  optional if it turns out to be benefitial.

November 29, 1998
- Tested a theory, and I was right. :-( Drawing vertical columns is
  inherantly slower than drawing horizontal spans, probably because drawing
  them vertically results in a whole lot more cache misses. What I did to
  test it was replace most of D_Display() with a loop that filled the screen
  a solid color. At 800x600, filling the screen by columns was no faster than
  if I textured the walls (23 fps). Filling by rows, I could get 35 fps.
  Apparently, any further optimizations in the renderer will have to focus
  on drawing walls by rows instead of colums.

November 28, 1998
- Did some slight performance tuning in R_RenderSegLoop() by making more
  variables local to only certain blocks in the function. In 800x600,
  looking straight at a wall now gives ~23 fps vs ~20 fps before. (I really
  wasn't expecting such a marked improvement. It might be worthwhile to try
  and tweak this in assembly.)
- Pulled some blending addition code from the Q2 DLL. I had been trying to
  do the same thing myself, but couldn't quite manage it until I found
  id's code.

November 26, 1998
- Added support for cancelling messagemode by pressing escape.
- On the automap, a player with invulnerability is drawn with a color
  slightly off from the background rather than being hard-coded to palette
  entry 246 (which is almost black with the normal Doom palette).
- Finally got around to working out the bugs in teamplay. (Missiles would
  still hurt you even with friendly fire on.)
- Disabled intermission texts in deathmatch.
- Pretty sure I got a non-fatal version of I_Error working now. It uses
  setjmp() and longjmp() to do its magic.
- Removed the check for -statcopy in d_main.c.
- Removed the system menu from the ZDoom window. Unfortunately, this also
  means it doesn't get a minimize box. Oh well.
- Removed the restriction on using messagemode only during a netgame.
- Added mouse wheel support. Under Win95, it ought to work with DirectInput.
  Under NT 4.0 and 98, it should always works.

November 23, 1998
- Changed the startup code so that the graphics mode is initialized as early
  as possible, allowing us to use the in-game console for most startup text.
- Moved all the functionality of I_StartGraphics() into I_InitGraphics()
  because the game starts up in a fullscreen console now.
- Added endgame to quit out of a game and drop to the fullscreen console.
- Removed the ormask parameter from V_PrintStr() and V_PrintStr2(). It was
  almost never used, and in those cases where it was, it was easy enough to
  just or the string beforehand.
- Adjusted the colors of the CONCHARS lumps and changed a few special
  characters. With the fullscreen console, it was obvious that they were
  all too dark.
- Added a fullscreen console.
- Changed handling of WM_DESTROY messages in i_input.c to call exit()
  directly, because the WM_QUIT message didn't seem to be making its way
  into the message stream.
- Removed some unused #defines from doomdef.h
- Removed the store demo check from D_ProcessEvents().

November 22, 1998
- Fixed saving of monster goals (was referencing the tracer field instead).
- Made one-sided lines pushable.
- Made P_PushSpecialLine aware of the side of the line that was pushed.
- Moved the execution of deferred scripts out of P_StartOpenScripts so
  that going to a level with a saved snapshot would not terminate the
  script prematurely when the snapshot was loaded.

November 21, 1998
- Teleport_EndGame and Teleport_NewMap no longer execute if crossed
  along a linedef's back side.
- Discovered I had missed implementing Teleport_EndGame, so I added it.
- Fixed problem with level snapshots where plats and ceilings that were
  in stasis were saved incorrectly.

November 15, 1998
- Just tried listening to D_RUNNIN after a clean boot, and it didn't work
  the first time. :-( At least it plays properly after I use iwinit now...

November 14, 1998
- Bumped the height of the three small torches up from 34 to 37 units so
  that the player can't jump on top of them.
- Tweaked the thing auto step up in PIT_CheckThing some more so that it
  will only do the auto step up if you're not in the air. It seemed funny
  to be able to jump on top of most monsters. Never mind. I can't seem to
  get it to work only when I'm not jumping. :-(
- Added code to mus2strm.c so that it generates a tempo event at the
  beginning of the song. (The tempo used appears to be the default for
  midiStreamOpen, but I felt like being safe anyway.) AddEventToStream() in
  mid2strm.c also keeps track of all instruments used in a song now. This
  way I can get around what appears to be a bug in the GUS PnP drivers
  that would cause it not to play some instruments if they weren't already
  loaded in the card's RAM. Just before I start playing the actual song, I
  play each instrument very briefly and very quietly to get the instruments
  into the card's RAM.

November 2, 1998
- Added snd_mididevice cvar to allow the user to select which MIDI device
  to use and a snd_listmididevices cvar to enumerate the available devices.
- Added MIDI volume cvar snd_midivolume and a corresponding menu item.
- Finished mus2strm.c and made a few cleanups to the MIDI streaming code.
  Now I just need to switch to MikMod, and I won't have to use temporary
  files anywhere. (MIDAS can only load MODs from disk and not from memory.)

November 1, 1998
- Started cleaning up qmus2mid.c and transforming it into mus2strm.c.

October 31, 1998
- Took the mid2strm sample from the dx5sdk and used it to redo my MIDI
  support so that I can use the MIDI stream API now, the primary benefit
  being that it lets me set the MIDI volume for just that stream and not the
  entire system.
- Changed I_DetectOS() so that it doesn't identify Windows 98 as Windows 95.

October 24, 1998
- Discovered the blockmap generation wasn't actually working. Can't figure
  out why, since the same code works just fine in BOOM...
- Incorporated several of the changes from BOOM 2.02 such as "loose files",
  fire trail elimination, and automatic blockmap generation for large maps.

October 17, 1998
- Implemented the Radius_Quake line special.
- Removed limit on the size of recordable demos.
- Changed P_SpawnPlayer() so that it always spawns players on the ground.
- Created an MT_TELEPORTMAN2 that can be used to teleport things to points
  above the ground and fixed MT_TELEPORTMAN so that it teleports things onto
  the ground.
- Updated the teleport code so that it finds destinations using P_FindGoal()
  instead of searching through all the active thinkers.
- Fixed a memory allocation problem with the -iwad parameter.

October 16, 1998
- Rewrote IdentifyVersion() so that it identifies IWADs by their contents
  instead of their names. (except for tnt.wad and plutonia.wad, since I
  don't know of any other way to distinguish them from doom2.wad)
- Doors that needed yellow skull keys to be opened said they needed yellow
  cards instead. Fixed.
- Finally added proper support for substituting translucency for the fuzz
  effect. Instead of using a NULL colormap to represent fuzz, it takes
  advantage of the vissprite's flags field and sets MF_SHADOW. Then the
  colormap points to the colormap that would be used if the sprite wasn't
  shadow, so that it can be properly shaded when r_drawfuzz is 0.
- Got the colormaps code working. I just wasn't allocating enough space for
  the realcolormaps array. Oopsy.

October 15, 1998
- Decided to support changing of colormaps via Boom's 242 linedef after all
  instead of just changing the blend, so I started adding some code to
  support that. Unfortunately, now it doesn't work without any C_START/C_END
  colormaps. :-( Will fix tomorrow.

October 14, 1998
- Added a callback for the splashfactor cvar that prevents it from being
  set to illegal non-positive values and also computes the inverse of the
  cvar for scaling of the thrust felt by things that chew on their own
  missiles. That way, a player will always rocket jump the same height no
  matter what their splashfactor is set to.
- Fixed a problem with continuous sounds that prevented them from being
  played. When I had consolidated to using a single mobj thinker for all
  sounds instead of splitting them up as I had previously, I was erroneously
  setting the activation time for continuous sounds to 0 because I wanted
  their thinkers to get called right away. But the mobj thinker decrements
  the tic counter and *then* compares it with 0, so it would decrement the
  0, see -1, and then never doing anything with that mobj again.

October 10, 1998
- The button list gets saved in level snapshots now.
- Added full support for activation types of projectile cross, projectile
  hit, and push. Also added support for a few linedef types to be
  monster-activatable depending on their activation type even if
  ML_MONSTERSCANACTIVATE is not set. (So that, e.g. a monster can still
  open a local door of type Door_Raise without the level designer
  having to do anything special.)
- Removed the MAXBUTTONS limit and also fixed a problem with the sound
  origin used when activating switches/buttons.
- Changed the error messages in V_DrawWrapper() and V_DrawSWrapper() to
  use DPrintf() instead of Printf().
- Fixed problem with invulnerability I introduced yesterday. (Walls were
  still being drawn with the normal colormap.)

October 9, 1998
- Spent about an hour changing the rendering code so that each sector can
  have its own colormap. The light tables are now indices into a colormap
  rather than pointers into one. Spent about half an hour afterward
  figuring out why it seemed to be merging visplanes that were alike in
  everyway except for colormap. All in all, it was easier than I had
  expected. Unfortunately, it's also too slow to build a colormap in the
  middle of gameplay, so I guess an open script will have to be used to
  build any colormaps before the level starts if anyone wants to change a
  sector's color on the fly.

Ocober 8, 1998
- I had earlier changed PIT_RadiusAttack() to do only half damage to targets
  that originated the explosion, so that rocket jumping didn't hurt so much.
  The scale factor has now been moved into the cvar splashfactor and
  defaults to 1.0. The former behavior can be restored by setting it to 0.5.

October 5, 1998
- Spent about 15 minutes writing a routine to build a colormap for non-
  white lights. Tested it using an orange light for the entire level. It
  worked nicely, so now I just need to make it possible to set the light
  color on a sector-by-sector basis.
- Issue: Teleport destinations need to be flush with the floor instead of
  remembering the position they are spawned at. Discovered this while
  playing MAP20. A teleport destination lowers a great distance the first
  time you land on it. Going on it again will teleport you to its original
  height, and you fall from there. Maybe another type for destinations that
  remember their height, then?

October 4, 1998
- Added say_team and messagemode2 commands and team and teamplay cvars.
- Externalized the obituary messages and added a "Strings" section to the
  dehacked code. Since I'm pretty sure I'll be switching to scripted code
  ala Quake, this is only temporary (along with everything else dehacked).
- Added support for showing both skull and card keys in the status bar
  ala Boom.
- Added Sector_SetDamage and Sector_SetGravity line specials.
- Added another mobj flag (MF2_NOADJUST) so that you can walk on floating
  bridges without worrying about them getting bumped up above your head.
- Adjused PIT_CheckThing() so that it allows stepping up on top of things
  if their tops are no more than 24 units above the thing moving.

October 3, 1998
- Added an MT_AMBIENT mobj (doomed #14065). Its first argument determines
  which ambient sound it represents. (And is valid in the range 0-255.) It
  also subsumes the earlier MT_AMBIENT0 - MT_AMBIENT63 mobjs (doomed
  #14001 - 14064), and P_SpawnMapThing translates them into an
  instance of MT_AMBIENT. Also merged the world ambient thinker into the
  mobj thinker so that all ambient sounds are controlled with a single
  thinker function and not two.
- Removed sounds.h. Everything necessary to use sounds is now found in
  s_sound.h
- Disabled the recognition of any display modes other than INDEX8 in
  i_video.cpp. I'm no longer sure high/true color is such a good thing.
  Without a major loss of performance, I can't see any way to avoid a
  huge memory loss with more than a few palettes in those modes. :-(
- Did some work with ARGB8888 modes: I_Blit can now blit from INDEX8 to
  ARGB8888 surfaces. The console font now gets drawn on ARGB8888 surfaces
  (pretty sure it was before, but it stopped working sometime).
- Fixed the cast drawer so that the names don't get squashed together in
  resolutions at least 640 pixels wide.
- Fixed bug where pressing a key with a menu active would move the cursor
  to a blank line if it wasn't assigned as a hotkey.
- Added support for actually seeing skins as well as setting them in the
  player setup menu.
- Fixed bug with player colors for players 5-8.

October 1, 1998
- Continued work with "skins." Everything works now except actually
  seeing them.
- Did away with the spriteoffset[], spritewidth[], and spritetopoffset[]
  arrays and moved their contents into the sprite frame structure.

September 30, 1998
- Started work on supporting Doom Legacy "skins." (Personally, I think
  skin is a misnomer, but I'm afraid the term's probably here to stay.)
- Removed the maskdraw_t structure from r_things.c since it wasn't used
  anywhere. Here it is preserved for history:
	typedef struct {
		int x1, x2;
		int column;
		int topclip, bottomclip;
	} maskdraw_t;
  Wonder what it was for.

September 27, 1998
- Fixed long-standing bug in R_DrawSprite that could cause sprites to be
  drawn through the floor of a cliff if you look down just the right amount
  (when the top edge of the floor is exactly two pixels above the top of
  the screen).
- Added hacked-in support for colormaps with the Transfer_LightsHeights
  special. ZDoom actually sets the blending through this special instead
  of changing the colormap. To accomodate BOOM levels that use colormaps,
  it will average all the colors in the colormap together and derive a
  blend from that. Alternatively, you set the blend directly by setting
  the appropriate texture name to a hex string of the format AARRGGBB.
- Fixed barrels (again) so that barrel traps work as expected. Not sure if
  this problem existed in 1.14a or not, but it's gone now.
- Added ignoreInvisibility parameter to P_CheckSight(), because it is
  occasionally used to determine if there is an unblocked line between two
  things (not if one can see the other).
- Switched to using a logarithmic scale for pain flashes.
- Added support for Boom's push/pullers, wind, current, and friction effects.

September 26, 1998
- Saw this at the Team TNT message board:

      the bug has been found and fixed. What was happening was that the fake
	  sector was being passed instead of the real one, and this messed up
	  the check for whether a sector had had its sprites added to the view
	  already. As a result each sprite generated was being added once per
	  subsector rather than just once.

  So I went looking around in the code some and found this in R_Subsector():
  "R_AddSprites (frontsector)". I replaced frontsector with sub->sector, and
  that seems to have done the trick. A test level I made went from 15 fps to
  35 fps (the max) with this fix.

September 23, 1998
- Using -cdrom creates the directory if it doesn't exist (like it used to).
- When used with -cdrom, screenshots now get saved to C:\ZDOOMDAT instead of
  the game directory.
- Put back support for taking screenshots by pressing F1 with -devparm
  active, since some people probably won't read the docs and realize there's
  a screenshot command bound to the "Print Screen" key by default.
- Added "ticker" cvar to control display of the -devparm ticker at the
  bottom of the display (so that -devparm is now totally useless).
- Changed the directory for -cdrom from C:\DOOMDATA to C:\ZDOOMDAT and added
  support for using that directory to store zdoom.cfg.
- Fixed bug that caused using -devparm or -cdrom to crash the game during
  startup. (They referenced the Strings[] table before it was fully
  initialized.)

September 19, 1998
- Turned off screenwiping when moving between levels in a hub (but only if
  the level the player just left has LEVEL_NOINTERMISSION set).
- Fixed a savegame bug I had added with hubs that caused the game to
  forget the player's state.
- Added noise cvar to control display of sound debugging info.
- Added turn180 command to quickly turn the player around.
- Added support for the ACS thingsound(), sectorsound(), and ambientsound()
  commands.
- Changed every reference to S_StartSound so that they refer to sounds
  by name rather than id and specify priority information (since it's
  no longer a part of the sfxinfo).

September 18, 1998
- Finished S_ParseSndInfo so that it has no maximum number of sounds it
  can define and works with more than just ambient sounds.
- Changed w_wad.c back to using the buffered I/O functions again. (I had
  done this a long time ago, but thanks to some mistakes on my part, I
  ended up putting taking it out. Now it's back for good. :-) It doesn't
  seem to have any effect on disk performance, but it will let me use
  MikMod functions to load samples and MODs directly from the wad.
- Played around with MikMod some. With the assembly mixer, its
  performance seems to be about the same as MIDAS', so I will
  probably switch to it at some point.

September 17, 1998
- Improved support for analog joysticks by using their full range of
  motion instead of treating them like digital devices.

September 15, 1998
- Added support for world vars and controlling scripts on other maps.
- Added the hub clusterdef flag and supporting code.
- Figured out what the problem with hub savegames was: Instead
  of writing out a copy of the snapshots for each level with one,
  I wrote out a copy of the current level's snapshot for each
  level with a snapshot. Whoops! Easy fix.

September 14, 1998
- Worked with supporting hubs. For maps that belong to a hub,
  whenever you exit the level, the game makes a mini-savegame
  of the level. When you return, the world state is based on
  the mini-savegame. Theoretically, saving games to disk should
  be as simple as storing each of these "snapshots" along with
  some extra info, but I couldn't get it to work. The current
  level worked, but trying to go to a previously visited level
  after loading the savegame crashed the game.

September 13, 1998
- Redid my ACS code a bit so that scripts are now kept track of
  through a private linked list rather than thinkers. The only
  real advantage this offers is that I have complete control
  over when scripts get executed, so a script that executes a
  scriptwait command will be guaranteed to run in the same tic
  that the script it's waiting on terminates.

September 12, 1998
- Replaced my visplanes code with Lee Killough's hashing method
  and got a noticable performance boost in high visplane areas
  (even those with <128!).

September 4, 1998
- Added weapnext and weapprev commands courtesy of
  Papst Johannes Jrg IV. [which were later completely
  rewritten by me]
- Add support for suspending and resuming scripts (easy when
  you know you can only have one copy running at a time).
- Added checks to ensure that only one instance of a script is
  running at a time (like Hexen).

September 3, 1998
- Took out the stuff for sliding doors. You want it, then
  fake it with a script.
- Ran around in hexen.wad for a while and fixed a few bugs.
- Added support for ACS scripts (except for the sound p-codes
  and polywait).

September 2, 1998
- Added support for monsters remembering their previous target
  from BOOM.
- Made the mobj's targettic a counter that decrements to zero
  instead of a time relative to gametic (so that it works properly
  across savegames).
- Added more mobj flags bits and consolidated invisible into it.
- Implemented all the Thing_* line specials.
- Added support for stairs that reset and/or have delays and the
  sync stair builders.

September 1, 1998
- Fixed problem with several plat types that didn't deactivate
  themselves.
- Fixed bug that caused Plat_UpWaitDownStay to act like
  Plat_PerpetualRaise.
- Made NOINTERMISSION levels work by moving the check for it later
  in G_DoCompleted().
- Added HealThing special to match DamageThing.
- Added full support for the Teleport_NewMap special. Levelnum is
  actually used for something in the MAPINFO now, too.

August 31, 1998
- Implemented Hexen's thing specials that don't use tids.

August 30, 1998
- Added support for Hexen pillars.
- Finished ceilings.
- Finished floors.
- Added compression of .tch files and significantly rewrote the
  associated part of v_video.c in the process. Not quite the savings
  I would have liked: only about 57%.
- Tried using the LZ(77?) code from the Doom utilities to compress save
  games, but it was too slow to be practical. I now use minilzo which
  seems to compress about the same but is a *lot* faster. As an example
  of the kind of savings this offers, the size of a savegame on one
  level shrank to 20% of its original size.
- Used BOOM's code to remove the savegame size limit and fix some other
  savegame bugs.
- Used Killough's global boss brain state.
- Tweaked I_FatalError() so that if something really bad happens, you
  shouldn't end up in an infinite recursion sequence because Printf()
  gets called somewhere during the exit sequence.
- Implemented Floor_Waggle. Unfortunately, it's not the same as Hexen's
  since I couldn't find any decent documentation about it and also had
  a hard time determining just how every different parameter affected it
  by watching it in a test level. It's close, but not the same.

August 29, 1998
- Added support for normal (not sync) Hexen stairs.
- Added support for Hexen's phased lighting.

August 26, 1998
- Continued on floors.

August 25, 1998
- Started getting moving floors working again.

August 21, 1998
- Got plats working again.
- Switched to using a linked list to keep track of active ceilings and
  plats. This is similar to the way BOOM does it, except I store the
  list pointers in the active entities themselves rather than seperately.

August 20, 1998
- Fixed a savegame bug I had introduced. They got saved as "version 115"
  instead of zdoomsv?.dsg.

August 8, 1998 - August 15, 1998
- Did some work converting to Hexen-like line specials. Sorry, I was too
  lazy to record the specific changes.

August 7, 1998
- Incorporated BOOM's Pain Elemental Lost Soul shooting fix.
- Incorporated some of BOOM's changes to p_map.c.
- Incorporated Killough's changes to p_sight.c.

August 6, 1998
- Added snd_surround cvar to control use of surround sounds. If "0", then
  anything that would otherwise have been played surround is played
  identically from both speakers instead.
- Added cvar_defflags variable to hold any flags automatically applied to
  new cvars, the intended purpose being to allow all cvars in a config
  file to be flagged as CVAR_ARCHIVE. Useful if one port of ZDoom has cvars
  that another doesn't, but you still want them to share the same config
  file.

August 5, 1998
- Finished keyboard handler and tried to create a mouse handler for the
  DOS port.
- Switched to using PTC Mode IDs to describe video modes instead of
  bpp since the DOS version of PTC has multiple modes with the same bpp.

August 4, 1998
- Created partial keyboard handler for DOS port.

July 28, 1998
- Fixed use of config files in paths containing spaces. (I had forgotten to
  enclose the pathname in quotes when constructing the exec command string.)
- Added calls to FixPathSeperator() in a bunch of places where it was needed.

July 27, 1998
- Uploaded a quick fix to 1.14a that lets it load save games again.
- Renamed the project and workspace to zdoom (rather than doom).
- Created a version info resource for ZDoom and moved the system-specific
  files into a new win32 directory in the code tree.

July 26, 1998
- Uploaded 1.14a to notgod.com along with a source patch for 1.14->1.14a.
- If FONTA?? is available, it is now used in deference to STCFN??? (i.e.
  -file heretic)
- Renamed all the WICHAR?? in zdoom.wad to FONTB?? to match the naming
  convention used by Heretic and Hexen.

July 23, 1998
- I must be an idiot! I took a fix from BOOM for freeing the lnames array too
  soon and stuck it into ZDoom without really thinking about it. In BOOM (and
  DOOM) lnames[] is dynamically allocated. In ZDoom, it's static since it
  only needs to contain two items (the patch of the level just left and the
  patch of the level being entered). Fixed.
- Using the changemap command no longer says you are leaving the map you're
  entering when no title patch is provided. (Unless they're one and the same.)

July 22, 1998
- Added a z parameter to P_TeleportMove() to properly handle checks in the
  third dimension. Previously, I was checking for this, too, but against the
  thing's original position. Now I check against the desired z location. This
  prevents monsters from teleporting inside of each other.

July 19, 1998
- Improved handling of international keymaps (such as the French one) by
  moving all responsibility for determining the shifted state of keys into
  i_input.c. C_consol.c no longer maintains a ShiftLOT since .data3 of the
  key event will contain a character that is sensitive of the current state
  of modifier keys. (i.e. .data3 contains 'a' when the A key is pressed and
  'A' when SHIFT-A is pressed.)
- Made some changes to D_DoAdvanceDemo() and G_CheckDemoStatus() so that
  using the player setup menu during demo playback is now safe.
- Added a check to C_BackupCVars() so that it doesn't back up CVAR_LATCH
  cvars are not saved. This is unnecessary since they don't actually
  change until a new game anyway. The primary advantage of this is that
  starting a new game during demo playback now uses the selected skill
  level (again).
- Anything spawned by a boss shooter will now always telefrag even if
  LEVEL_MONSTERSTELEFRAG is not set.
- Modifed PIT_RadiusAttack() (again) so that when a barrel is doing the
  exploding, the original damage code is used.
- Removed the bitwise and against 0xff for angle in R_DrawSky() and
  R_DrawMaskedSky(). Some skies in various PWADs are wider than this, and
  R_GetColumn() masks it to the proper width for us anyway.

July 18, 1998
- Changed the unknown thing to have no gravity so that it stays at the
  height it was spawned at (useful with Hexen).
- Discovered the source of a memory leak: When I added the thing_list code
  from BOOM, I left out some from P_UnsetThingPosition(), so
  P_SetThingPosition() was always creating a new thing_list and letting the
  old one waste space. Conveyors even work now! Yay!
- Removed support for repeating the left and right arrow keys in m_menu.c
  since some people had trouble with it.
- Changed D_DoServerInfoChange() so that it doesn't print messages in
  single player games.

July 16, 1998
- Added entries for Heretic to SWITCHES and ANIMATED lumps (because I can).
- Did equivalent things for BOOM SWITCHES lumps.
- Removed MAXANIMS limit by scanning through the AnimDefs array to find out
  how many entries it contains and then allocating that many anim_t's. Also
  added support for BOOM ANIMATED lumps.
- Reduced the Revenant's height from 80 back to 56 to fix a problem with a
  trap on DOOM2 MAP27. The new height caused the revenants heads to get
  stuck in the ceiling, so the platforms they were on wouldn't lower. Since
  there are probably other situations like this elsewhere, I went and gave
  all the monsters their original heights back.
- Fixed a problem with BOOM's openings limit removal. Pointers to openings
  get stored in drawsegs, and the realloc() of the openings didn't bother
  to adjust those pointers. A simple fix in r_segs.c once I figured out what
  the problem was.
- Incorporated BOOM's Medusa fix.

July 15, 1998
- Added Lee Killough's generalized scrollers from BOOM.
- Added Rand Phares' thing list stuff from BOOM.
- Finished support for BOOM's multiple sector thinkers and threw in the
  elevator code in the process (but nothing that calls it).

July 14, 1998
- Started adding support for BOOM's multiple actions per sector.
- Uploaded the 1.14 binaries and source to notgod.com.
- Fixed bug that caused the bunny scroller to crash: Using 0 instead of
  &screens[0] in the calls to F_DrawPatchCol().
- Added support for the ML_PASSUSE flag from BOOM.
- Decided using a default texture for unknowns was too complicated to bother
  with at this point, so I took it back out. (Left in for flats, though.)

July 13, 1998
- Fixed IDKFA cheat to give the correct amount of armor.
- Slightly updated and reformated editing.txt and updated it to use
  the new ambient thing numbers.
- Reformatted and updated zdoom.txt.
- Created red and blue checkerboards that get substituted for unknown textures
  and flats.

July 12, 1998
- Created a new thing that gets substituted for unknown things in a map and
  things that are known but have no sprite frames (such as Doom II monsters
  using a DOOM I IWAD).
- Kill and kill monsters commands now get sent over the network.
- Reformatted commands.txt to make it fit on a 76-column display and hopefully
  be more readable.

July 11, 1998
- Renumbered the ambient things to the range 14001-14064.

July 10, 1998
- Renamed -nosound to -nosfx to be more compatible with most other Dooms.
- Adjusted the autoaim values used by the player setup menu to not use
  such a large range (0-5000 with big steppings in-between).
- During another deathmatch session, discovered a problem on MAP03 with
  spawn farthest. No matter what, the dead player would always spawn at
  the spawn spot near the beginning of the level. Realized that deathmatch
  spawn spots weren't recorded as 16.16 fixed point, so I adjusted
  PlayersRangeFromSpot accordingly.
- Was playing around in a deathmatch a little when I tried the changemap
  command and the game bombed out in Z_Free() because the block being freed
  didn't have a ZONEID. So I added a wrapper around Z_Free() to pass it
  the source file and line number of the caller in case this happens again.
- Discovered that I had forgotten to add the server var sending/reading
  to the netgame arbitration process, so I added it.
- Added changemap command which should be able to change the level during
  netgames and demos.
- Added support for cheat network commands so that they can work in netgames
  and demos (if desired).
- Added hack to DeHackEd support to use the original Doom thing height's
  if the thing hangs from the ceiling but the patch doesn't set its height.

July 9, 1998
- Improved wi_stuff.c so that it can still draw the level name even if a
  patch hasn't been designed for it.

July 8, 1998
- Fixed aiming. This consisted of two things: First, I needed to change
  the way I generated yslopetab and looked into it so that fullscreen
  windows and non-fullscreen had the same relative range. (Side effect:
  When the status bar is visible, you get a larger freelook range than
  before.) Second, I had to adjust my calculation of view pitch->slope
  from 0.5 to 0.75 times. I arrived at this value by standing on a cliff
  and firing a rocket launcher with different multipliers until I found one
  that looked good.
- Fixed sky scaling with different r_detail settings.
- Fixed spacing of the ammo count numbers on the fullscreen HUD.
- Hacked around in i_video.cpp and PTC's idirectx.cpp a little to support
  Mode X modes under Windows 95.
- Changed C_Drawer() so that it doesn't call C_EraseLines() if the automap
  is active, since it just creates junk on top of the automap.
- Changed the notify text drawer to use Doom's standard red text instead
  of white.

July 7, 1998
- Made several changes to the code to make it more portable and removed
  a few unused variables. DJGPP can now compile the machine-independant
  parts with only minimal warnings with -Wall.
- Thank's to gcc's -Wall, I figured out why togglemessages didn't
  work: I had left out the parentheses in Cmd_ToggleMessages
  when I wanted to call M_ChangeMessages(). Oops.
- Tried compiling r_draw.c with DJGPP and discovered that it doesn't
  like long file names, so I renamed everything to fit the 8.3 format.
  (Stupid MS-DOS! Grr!)
- Changed the midprinter to use the hu_font instead of the console font
  since it looks better and also means that the "You need a * key..."
  messages don't need special treatment in the DeHackEd code.
- Changed C_AddNotifyString() to use V_BreakLines().

July 6, 1993
- Created V_BreakLines() and V_FreeBrokenLines() to handle splitting of
  text into multiple lines. Unlike the code I had in C_AddNotifyString(),
  these will properly break lines at whitespace if possible instead of
  the middle of a word.
- Stopped using the pitch field of the S_sfx table to store the sounds'
  playback frequencies so that I can handle pitched sounds properly ala
  some magic I found in BOOM.

July 3, 1998
- Went ahead and took some code from BOOM for "kill monsters" command
  since it also kills losts souls spawned by a pain elemntal's death.
- Used BOOM's P_SetMobjState() since it has nifty state cycle detection.
- Removed a lot of stuff from cmdlib.c that I didn't actually use. (Kept
  the CRC code around since I *might* use it.)
- Discovered that taking screenshots directly inside the screenshot command
  was a bad thing because it can be called during the middle of a screen
  draw. Fixed to delay using ga_screenshot.
- Changed the gamma command into a cvar and removed the code for
  "floaters" from the options menu, since that was all they were used for.
- Fixed bug in alias code: New aliases would not properly clear the
  next field if they were the first one in a bucket.
- Aliases now get saved to the config file.
- Added "Always Mouselook" to the Options menu. I thought it was already
  there, but... It wasn't.

July 2, 1998
- Added autoexec cvar to determine the autoexec file (partially because
  Doom Legacy decided they wanted to use autoexec.cfg--just like they
  used config.cfg).
- Renamed menu_video to menu_display and added menu_video, menu_player,
  and menu_gameplay commmands.
- Moved I_WaitVBL() into i_system.c and changed it to make a simple Sleep()
  call because that's what it's really used for.
- Changed C_DrawNotifyText() to not draw when the menu is up.
- Added proper support for usejoystick and usemouse cvars in i_input.c
- Cleaned up the Convert() table in i_input.c by reformatting it.

July 1, 1998
- Tweaked PIT_RadiusAttack() to be more realistic.
- Fixed PCX writing code so that it properly indicates that the image is in
  color.

June 30, 1998
- Added Gameplay Options menu for setting dmflags.

June 29, 1998
- Documented the map command. (How did I miss this?)
- Changed the map command so that it doesn't die fatally if the specified lump
  doesn't exist.
- Borrowed some of NTDOOM's mouse input code (using Win32 functions instead of
  DirectInput), and the mouse seems smoother under NT. Use the in_mouse cvar
  to select which method of input to use.
- Added I_DetectOS() function and in_mouse cvar.

June 27, 1998
- Added DF_NO_JUMP and DF_NO_FREELOOK dmflags.
- Made -turbo parameter a normal cvar.

June 26, 1998
- Spent most of the day trying to beat MineSweeper at expert difficulty.
  Sorry. :-)

June 25, 1998
- Implemented fraglimit and timelimit cvars.
- deathmatch is also a cvar now.
- Added q2-like dmflags cvar. It adds some new deathmatch options and also
  takes over the duties of the g_falldamage and g_unlimitedammo cvars as well
  as the -fast, -respawn, and -nomonsters.
- Added one second delay until respawning after death is allowed (so that when
  noexit is active, and you hit an exit switch, you don't instantly respawn).

June 24, 1998
- Changes to serverinfo cvars now get transmitted properly in netgames, and
  only the key player can change them.
- Finally added cvarlist command and removed the multiple variations of "set".
- Added support for 8 players. Using more should now be as simple as increasing
  the MAXPLAYERS #define.
- Created brighter faceback graphics that better represent the player's
  chosen color.

June 23, 1998
- Added spynext and spyprev commands. Spynext is equivalent to pressing F12
  in the original Doom.
- Added +showscores action. It gets bound to \ by default.
- Save games now hold copies of every serverinfo cvar and the level locals.
  With Doom 1, they also contain a list of visited levels.
- The game now keeps a cumulative frag count for each player which is the same
  as what gets displayed on the status bar during a deathmatch.
- Removed "Next Weapon" from the controls menu. I need to get the inventory
  system working before I can implement it, and I don't feel like doing that
  right now.
- With a little help from BOOM, sounds in spy mode now center around the
  displayplayer rather than the consoleplayer.

June 22, 1998
- Got dynamic player translation tables up-and-running. Status bar also uses
  the translation table for the faceback instead of different patches. Automap
  now uses the player's chosen color in netgames instead of a fixed array
  of color values.
- Left and right arrow keys now repeat in the menus (for sliders).
- Continued work on player setup menu.
- Fixed C_AddNotifyString() so that it doesn't crash if passed a string with
  a newline in the middle but not at the end of the string.
- m_menu.c's text input routine now uses the user's preferred keymap.

June 20, 1998
- Continued work on player setup menu.
- Fixed a bug in V_Clear(): 8-bit modes ignored left parameter.
- Upped number of savegame slots to 8.
- Removed all alloca() calls by replacing them with Z_Malloc()/Z_Free() pairs.

June 19, 1998
- Compiled with warning level 4 and caught a few problems and potential
  problems as well as some code that was never executed. (Thanks, Grant.)
- Fixed uppercopy so that it doesn't always copy 8-chars even if the passed
  string is shorter.
- Removed <windows.h>, <io.h>, <direct.h>, and <errno.h>
  #includes from d_main.c.

June 18, 1998
- Removed R_OK #define from one of the source files and changed the typedef
  for BOOL in doomtype.h. Also created dxcrap.c which holds some information
  from dinput.lib and dxguid.lib since Microsoft seems to have left most of
  the Watcom DX libraries out of its DX 5 SDK.
- Started work on player setup menu.

June 17, 1998
- Got GNU diff and patch to compile under Win32. I intend to use them to
  distribute my changes to the PTC source along with the rest of the ZDoom
  source.

June 13, 1998
- Fixed a shutdown bug in the new sound code.

June 12, 1998
- Changed i_sound.c to something inspired by BOOM. It now uses MIDAS's
  auto effect channels instead of a bunch of junk left over from the
  Linux port to determine which channel to play a sound on. As a result,
  it doesn't seem to lose the player's weapon fire anymore. (Yay!)
  Also, the snd_channels cvar is now useful.
- Made spawning of unknown things in maps a warning instead of an error.
- Changed R_CheckTextureNumForName() around to use a hash table
  instead of a linear search.

June 11, 1998
- Added support for BOOM's -fastdemo parameter.
- Made MIDAS initialization failure a non-fatal error.
- Did a small change to R_InitSpriteDefs() so that it scans the list of
  sprites backwards.
- Rewrote R_PrecacheLevel() based on BOOM's.
- Found a better way to trap Alt-Space: I listen for WM_SYSCOMMAND messages
  and filter out any for SC_KEYMENU events.

June 10, 1998
- Removed Martin Howe's sprite rotation fix in R_InstallSpriteLump()
  and replaced it with something from BOOM.
- Discovered the Win32 function RegisterHotKey() and used it to trap
  Alt-Space so that it doesn't open the window's system menu. Alas,
  it doesn't seem to work with DirectDraw. :-(
- Added RGB->HSV and HSV->RGB functions to v_palette.c.

June 9, 1998
- Removed WS_POPUP style from the ZDoom window.
- Integrated the changes in PTC 0.73b with mine, and PTC stopped working
  with DirectX (again). Thankfully, I managed to get it working again.
  (Sometimes I wonder if using PTC is more trouble than it's worth...)

June 8, 1998
- Each machine now broadcasts its userinfo in D_ArbitrateNetStart() ala
  Doom Legacy 1.11.
- Userinfo settings are now properly set at game startup.
- Modified D_ArbitrateNetStart() to use the stream reading and writing
  functions for setting and retrieving some game info.
- Changed the global var startmap to be the actual name of the desired map
  and got rid of startepisode global var.
- Chat messages now get sent using special "ticcmds" instead of char-by-char
  in a normal ticcmd.
- Layed the foundation for special network commands besides user movement.
- Pressing escape in a menu now backs up one menu instead exiting the menu
  system entirely. (And backspace is now used to clear key bindings in the
  configure controls menu.)
- Menu now displays messages that don't expect any specific input without
  quickly hiding them away.
- Changed some stuff so that ZDoom doesn't grab the mouse when a menu is
  active and it's running in a window.
- Added some code so that during a demo, if a key is bound to toggleconsole,
  menu_*, sizeup, or sizedown, it will execute that command instead of
  activate the menu.
- Removed F1 screenshot hack from m_menu.c. (Use screenshot command.)
- Removed support for picking menu items with the joystick and mouse.
- Integrated the changes in PTC 0.73a with my own.

June 6, 1998
- Added -config option in GetConfigPath().
- Added messagemode and say console commands.
- Fixed C_AddNotifyString() so that it breaks lines without losing characters.
- Changed chat code to use whatever the user's selected keymap is instead of
  always Qwerty. Did the same for the console.
- Made it possible to actually send chat messages.
- Added check for chat_on to C_DoKey() so that we don't try to do something
  while the player is typing a message.
- Removed French stuff from hu_stuff.c.
- Discovered big booboo on my part. Chat hasn't been working since version
  1.11 has it? I was comparing ev->data1 with 't' in hu_stuff.c, but data1
  is a scancode, not ASCII.
- Removed RCS ID lines from all the source files. I only have RCS on my Amiga,
  and that's not the machine I'm using to develop this.

June 5, 1998
- Created some new pr_* classes for the gib throwing code.
- Removed RNG shuffling from P_Random() since it was screwing up sync in
  demos and network games.

June 4, 1998
- Made network ticcmd's variable length using the demo packing.
- Removed reference to turbomesage in G_Ticker().
- Simplified RefreshPalette() so that generating the invulnerability colormap
  uses fewer multipilies and no divides.

June 3, 1998
- Fixed P_InitSwitchList() so that the retail version is treated like the
  registered version instead of the shareware.
- Removed Martin Howe's code from w_wad.c and replaced it with a combination
  of code written by me and code from Boom. (Using hash tables speeds up
  level loading a *lot*--far more than I expected!)
- Added key repeating to the console. (So easy, I should have done it sooner.)

June 2, 1998
- Removed DEVONLY macro and added DPrintf() function.

June 1, 1998
- Fixed a bug in C_InitConsole when it reformats the console buffer. I had
  been using Printf (string); to reformat the text, but if string contained
  any sequences like "%s" I would be in big trouble. So now I use
  Printf ("%s", string);
- Fixed a problem with the invulnerability color map being wrong. I had
  been subtracting from 4278190080 when I calculated the inverse.
  (Don't know where I got that number from!) Also discovered my other
  stuff wouldn't work, so I just went and switched to fp like dcolors.c uses.
- Fixed a bug in the DeHackEd text replacement code I had introduced when
  I added support for ambient sounds. It was checking the names of all
  sound effects, but the ambient sounds start out with no names, so I
  ended up dereferencing a null pointer once I reached sfx_ambient0.

May 30, 1998
- Replaced lots of constant 35's with TICRATE (when measuring time).
- Switched to the BOOM random number generator.
- Added onfloor parameter to P_SpawnMobj() for when I actually support
  Hexen-style maps (which have a z parameter for Things).
- Changed to using mapthing2_t's internally instead of mapthing_t's.
- Created entries for Hexen-style maps in doomdata.c.
- Added a repeat byte to DEM_USERCMDCLONE to shrink demos even more.

May 29, 1998
- While recording a demo, discovered that I can't telefrag monsters.
  Must investigate.
- Added DEM_USERCMDCLONE command to indicate that this user command in the
  demo is the same as the previous one. Drastically reduced demo sizes.
- Scrapped support for my previous ZDEM format completely and adopted
  an IFF FORM instead.
- Changed all SVC_* labels to DEM_* since they have nothing to do with
  server-to-client communication and everything to do with demos.

May 28, 1998
- Got ZDEM recording and playback working again.
- Got idea from Boom: Rewrote all occurences of P_Random()-P_Random() that
  I could find so that they don't make assumptions about the order of
  execution. Old demo playback improved noticably (but it still gets out
  of sync easily). Even better, ZDEMs now appear to play back properly in
  both the release and debug builds.

May 26, 1998 - May 27, 1998
- Studied the code generated by the Hexen utility ACC and wrote a utility
  capable of disassembling BEHAVIOR lumps.

*******

May 25, 1998
- Released ZDoom 1.13
- Made gibs toggleable with testgibs cvar.
- Created zdoom.wcf file.
- Wrote some more documentation.
- Finished demo.wad
- Finished ambient sound support:
    Point random and periodic.
    World (& surround) continuous, random, and periodic.
    Limited SNDINFO lump support.
- Added the new level flags to the MAPINFO parser.

May 23, 1998
- Continued work on ambient sounds:
    Positional sounds with specific volumes work.
- Fixed intermission maps for Doom I. (I had broken them when I stopped
  identifying maps by episode and level numbers.)
- Added some more level flags to generalize behavior that had previously
  been restricted certain levels. Also removed LEVEL_SECRET and didsecret
  references, since I can now mimic them using LEVEL_VISITED.

May 22, 1998
- Started support for ambient sounds:
    Positional, continuous sounds work.
- Fixed coop intermission stats.
- Fixed bug in I_FinishUpdate() that could cause it to crash if the
  fps meter was up and it was called in very quick succession.
- Tried the following to fix the NT mouse bug:
	Read the mouse after reading the keyboard.
	Poll the mouse's position using GetDeviceState().
  Both methods failed to fix the problem. :-(
- Fixed handling of secret levels in G_WorldDone().
- Fixed problem with finale writer showing the full text of a message
  during wipes.
- Fixed display of cluster entry text in G_WorldDone().
- Discovered that R_DrawMaskedSky() doesn't work for sky textures that
  are actually masked (probably due to the way the composite texture
  generator works, but I could easily be wrong). Will investigate
  further later.
- Discovered that DITerm() was never being called, so I threw a call to
  it into I_ShutdownGraphics().
- Failure to specify a next map in the MAPINFO now repeats the current
  map instead of crashing.
- Added support for maps without music specified in their MAPINFO.

May 21, 1998
- Finished MAPINFO parser, began work on demo (and test) wad.

May 20, 1998
- Started work on a parser for MAPINFO lumps.

May 19, 1998
- Changed ST_doPaletteStuff() to be dynamic and use a larger range of
  blendings.
- Added W_FindLump() command.
- Changed W_CacheLumpNum() so that it allocates an extra zero byte after
  the end of the lump.
- Modified dehacked code to parse the patch file from memory so that
  they can be stored inside a wad file.
- Added limits command to list the state of all dynamic limits.
- Added default binding to the SysRq (Print Screen) key: "screenshot".
- Discovered the pause key wasn't getting bound by default. Fixed.
- Changed .cfg comments to anything starting with '//' rather than lines
  starting with ';'.
- Changed the default config file to zdoom.cfg and added the -config
  parameter to choose alternate ones. (Blargh! Doom Legacy decided to
  use config.cfg as it's default config file, when I've been using it
  all along!)

May 18, 1998
- Tried adding support for saving TGA screenshots and discovered that PTC's
  image class doesn't actually do anything for a save.
- Changed M_ScreenShot() to accept a filename (if desired) and added a
  screenshot console command that can be used to specify one.
- Changed WritePCXFile to use ARGB values instead of RGB triples so that
  I can pass it the colors array from a palette_t.
- Bumped the screenshot limit in M_ScreenShot up to 10000 different
  images (properly this time); changed the I_Error to a simple error
  message (no reason to kill the program if you can't take a screenshot);
  and added support for dumping true color files.

May 16, 1998
- Removed the MAXSPECIALCROSS limit.
- Made palette blending dynamic and added the testblend command to
  make sure that it actually works properly.
- Moved the gamma correction stuff from v_video.c into v_palette.c.
- Fixed the color of the red player in the automap.
- Changed I_SetPalette() to take a pointer to an array of uints instead
  of RGB triples and avoid gamma correction since that should be done
  before the call to I_SetPalette().

May 15, 1998
- Added V_Clear() function to set a rectangle to a solid color.
- Added dmflags, fraglimit, and timelimit cvars. Alas, they are just
  placeholders for the moment.

May 14, 1998
- Discovered a bug in Doom Legacy's assembly R_DrawColumn while I was
  in the process of rewriting it: They were calculating (centery-dc_yl)
  when it should have been (dc_yl-centery).
- Rearranged FixedDiv_ASM() to make it pair better on a Pentium and
  aligned the main division code to a 16 byte boundary.

May 13, 1998
- Removed the next and prev links from the definition of a vissprite_t
  since they were used only for the bubble sort.
- Changed R_SortVisSprites() to use the stdlib qsort() function instead
  of a bubblesort, the end result being that scenes with a lot of sprites
  are a *lot* faster than before. For means of comparison, I played DOOM2
  MAP30 until I got MaxVisSprites up to 1824, and the lowest my framerate
  ever went was 13 fps. That's compared to my earlier run where a mere 992
  sprites slowed me down to about 3 fps.
- Fixed bug in the C-based R_DrawFuzzColumn?()s: I wasn't properly
  masking fuzzpos when I added 3 to it at the end.
- Added preliminary C-based ARGB drawers to r_draw.c. They work, but
  slower than I would like.
- Changed the main column drawers in r_draw.c into pointers that can
  point to different routines depending on the screen depth (and/or
  presence of assembly/MMX routines). This is essentially the route
  DOSDoom takes, except I didn't split r_draw.c into two files.

May 12, 1998
- Fixed the below bug. I now set dc_mask to 0xff at the beginning of
  R_DrawVisSprite() since it wasn't always large enough. A nice side
  benefit of this is that it allows for taller sprites than before.
  (Considering that I added dc_mask a few weeks ago, I'm surprised it
  took me so long to notice this!)
- Discovered a weird bug. Things were occasionally being drawn with their
  heads being repeated near their feet but still clipping to the original
  shape of the thing. In DPaint, I could do this by drawing the thing once,
  then turning the background into a stencil so I can't draw over it and
  drawing the thing lower but in the same horizontal position.

May 11, 1998
- Started adding gibs (sprite grouping in w_wad.c is always enabled now).
- Started adding support for RGB modes in various spots.
- Separated all the V_DrawPatch* functions into various wrappers and
  column drawers. This makes it easy to use the same function for both
  indexed and direct color modes and to add more (which I have done)
  without too much work.
- Created R_DrawSky() out of first part of R_DrawPlanes() for
  double sky drawing. Created R_DrawMaskedSky() that draws masked
  sky textures (i.e. the front one for a double sky); it can also
  properly tile any height sky but at a performance hit.
- Moved definition of skyiscale from r_things.c int r_sky.c and split
  it into sky1iscale and sky2iscale. Also created their inverses:
  sky1scale and sky2scale.
- Added r_stretchsky cvar to stretch the sky if it isn't taller than
  128 pixels.
- Rewrote DimScreenPLoop() so that it should be slightly faster now.
  Still has lots of AGI stalls, though. :-(

May 8, 1998
- Added detail mode setting to display options menu.
- Implemented horizontal pixel doubling.
- Added ds_colshift to go along with ds_colsize.
- Changed R_ExecuteSetViewSize() so that the view window it creates is
  always a multiple of 16 bytes wide.
- Moved definition of rowbytes out of tmap.nas and into r_draw.c and
  renamed it dc_pitch. Also created ds_colsize variable. Renamed
  ASM_PatchRowBytes() to ASM_PatchPitch() and created ASM_PatchColSize().
- Moved the call to I_BeginUpdate() in D_Display() after the call to
  R_ExecuteSetViewSize(). This lets it update the display pitch
  properly based on any changes to detailyshift. Previously, it would
  use the old pitch for one frame before switching over, which is why
  it was crashing yesterday.

May 7, 1998
- Started adding detail modes back in. Got vertical doubling working
  although I ran into a few unexpected problems. Also crashes when I
  switch from doubled to non-doubled. :-(
- Added fullscreen option to video modes menu.
- Created a "Video Modes" patch and changed the "Video Options" patch
  to "Display Options."

May 6, 1998
- Fixed the drawing of the faceback on the status bar in network games.
  (I can't believe I messed that up!)
- Added fragcount to player quit (netgame) messages.
- Added -noidle parameter to disable lowering of ZDoom's priority to
  the idle class when the window loses the focus (so that running a
  netgame on a single machine doesn't slow down too much because one of
  the sessions only receives processor time during idle moments).
- Removed the need for the leading . in IP addresses for -net.
- Added support for different ports per machine in network code.
- Changed i_net.c so that Win32 platforms now print descriptive errors.
- Fixed -net parameter so that address list can end at +commands.
- Added player obituaries.

May 5, 1998
- Adjusted options menu code so that pressing ENTER, T, and D always do
  their special functions when in the video modes menu and not just when
  the current item is of type screenres.
- Hacked double buffering into PTC's idirectx.cpp. Why? Because it
  improves compatibility with a lot of video cards under NT (like my
  old one) that don't support locking the primary surface directly.
- Mucked around in PTC's idirectx.cpp for several hours and finally got
  it to work properly in fullscreen. Yay! (I really hope a future release
  has proper support for this built in.)

May 4, 1998
- Changed (PTC's) idirectx.cpp so that it allows Ctrl-Alt-Del in
  exclusive mode.
- Looked through V_PrintStr2() and finally realized why it was crashing
  on non-MMX machines: I failed to check the status of UseMMX before
  calling EndMMX().

May 1, 1998
- Downloaded PTC 0.72. It still gets slow on the blits, but at least now
  I have the source code for it.
- Tried using PTC's BitBlt() inside I_Blit() and came across a weird
  problem: The more blits I do, the slower they get. That sucks.
- Changed the focus-losing and gaining mechanism in i_input.c. Instead
  of sending pause events, it just pauses the sound. Changing fullscreen
  video modes caused the window to lose and regain its focus a bunch, and
  it was messing up the pause sending code, sometimes leaving the game
  paused after a mode change.
- Changed R_PlaneInitData() so that it allocates the fixed_t arrays
  separately instead of all together.
- Played Blood for a little bit. That, and a prior suggestion concerning
  rocket jumping made me decide to make a slight tweak to the freelook
  code: You can now look down twice as far as before.

April 30, 1998
- Figured out why PTC clipping windowed modes larger than 512x384:
  They were larger than the initial window size! I work around it
  by resizing the window and then reinitializing PTC.
- Moved some variable declarations out of i_input.h and into
  i_input.c, eliminating some in the process.
- Realized that C_AddNotifyString() really *was* perpetuating changes
  to its input string. Now I make a copy of that and work with it to
  save myself some headaches. Plus, the const identifier is now 100%
  correct.

April 29, 1998
- Changed R_DrawColumn_ASM() and R_DrawTranslucentColumn_ASM() so
  that they check the size of the column *before* looking into
  ylookup and columnofs (thus avoiding the occasional page fault).
- Discovered that R_ExecuteSetViewSize() could be called outside of
  D_Display(). In this case it was in G_DoLoadGame(), and that
  messed things up when I used the -loadgame parameter on the command
  line. Now R_InitBuffer() locks the screen before grabbing the
  buffer pointer and pitch.

April 28, 1998
- Changed cvar() function so that if a cvar of the specified name
  exists, it still changes the cvars flags. (i.e. it gets loaded from
  the config file before this function is called.)
- Added win_stretchx and win_stretchy cvars to stretch the windowed
  display.
- Fixed hang at shutdown: wasn't decrementing counter in I_WaitVBL().
- Received and installed 128 MB of RAM and a 32x CD-ROM drive. :-)
- Got ZDoom working in a window through PTC. It doesn't do fullscreen
  yet, but that's only because I haven't written any code to handle it
  yet. It also gets into an infinite loop during shutdown. (Should be
  easy to fix.)

April 25, 1998
- Started working on PTC-ized i_video.cpp.
- Weird palette problem now. When switching modes, ZDoom will only
  very rarely set the palette properly. Me guessing it's a Win95
  problem, since I didn't see this under NT. Shouldn't really matter
  since I'm switching to PTC anyway.
- Fixed fuzzoffset[] initialization. I was using screen[0]'s pitch
  without first locking it to ensure that the value stored in the
  screen was valid.

April 24, 1998
- Discovered I have a problem adjusting the fuzzoffset[] table
  dynamically. Looks like it still keeps its old values. Will
  investigate further tomorrow.
- Finished the video modes menu. My options menu code is nowhere near
  as neat as I would have liked. Oh well...
- Implemented mode testing from the video modes menu. D_ProcessEvents()
  was hacked to make it work. (There might be a better place, but this
  was the first function I saw, and it works.)
- Figured it out: I wasn't reallocating negonearray when I resized the
  screen. Doh! Moved its initialization from R_InitSprites() into
  R_MultiresInit(). For consistancy, I now allocate screenheightarray
  and xtoviewangle in R_MultiresInit() instead of V_SetResolution(), too.
- Noticed I seem to have a problem with the playersprites now. Some
  columns aren't getting drawn completely. Which ones and how much is
  missing seems to vary depending on the game state. This is worse the
  wider the sprite is drawn. At 320 wide, I can't detect it, although
  if it covered the entire width of the screen, it would probably pop
  up. Don't know what's going on here, since it worked fine before.
  When did this happen?

April 23, 1998
- Discovered that the boolean being used in i_video.c was only a byte,
  so I looked through the standard header files, and it looks like
  rpcndr.h is the culprit with this line:
	typedef unsigned char boolean;
  Went through all my files where I've defined __BYTEBOOL__ by hand and
  changed all occurances of boolean to BOOL. Then I found out that that
  caused problems with variables that had been declared as boolean in
  header files, so I changed all the remaining instances of boolean to
  BOOL.
- Started work on the video modes menu.

April 22, 1998
- Discovered I wasn't locking the back buffer in wi_stuff.c when
  I wrote drew the background on it. Fixed.
- Added code to actual change the screen resolution and discovered I
  wasn't reallocating the VisPlanes' top and bottom arrays, so you
  couldn't switch to a screen larger than what you started with. Fixed.

April 21, 1998
- Started work on dynamic resolution changing. Most of it was already
  done when I added the multires support. Just need to change the size
  of the display surface now; everything else seems to works.
- Fixed evil bug in V_SetResolution(): I had been allocating
  xtoviewangle[] with one too few angle_t's. Ouch.
- Fixed a bug in AddToHash() that caused it to "forget" the previous
  contents of a bucket when a new entry was added to the beginning
  of the bucket.
- Added a callback to the screenblocks cvar, so that ZDoom will sense
  changes to it and adjust the screen as needed.
- ...I now allocate two screens for the status bar. If it's not scaled
  I continue drawing to the screen as before and pretty much ignore the
  second buffer. However, if the status bar is scaled, then I draw all
  the changes into the second buffer and then blit the entire thing onto
  the screen. It works, but it's also slower.
- Added support for scaling the status bar (use st_scale cvar). When I
  did this, I noticed that V_DrawPatchStretched() looks horrid when it
  draws multi-post columns, because it doesn't line them up properly.
  Plus, the areas that got updated weren't being drawn in exactly the
  same spot as what appeared on the screen, so...
- Changed status bar code so that widget coordinates are relative to
  the status bar instead of the screen, which makes the next change
  easier...

April 20, 1998
- Changed the status bar code so that the status bar surface is only as
  wide as the status bar and not the underlying screen.
- Fixed the wipe: Inside wipe_doMelt(), I had neglected to account for
  the fact that pitch desribed bytes, but d described shorts.
- Removed the use of DDraw's blitter inside I_Blit() since I was still
  having problems with it. Now I do it myself, and it works.
- Fixed blitting: needed to make sure both surfaces were unlocked.
- Got the program running again. Blitting surfaces doesn't work yet. :-(
  Neither do the wipes. (They skip every other line.)
- Removed the fractional part from the fps display.
- Got the code to a point where it builds again.

April 18, 1998
- Added new functions and changed some code in i_video.c to handle
  screens as DDraw surfaces.
- Changed R_VideoErase() to take a rect as a parameter and call V_Blit().

April 17, 1998
- Removed SCREENPITCH, SCREENWIDTH, and SCREENHEIGHT variables from
  doomdef.c. Now I need to remove all references to them.
- Cleaned up v_video.c somewhat in preparation of integrating PTC with
  the video code: created a screen_t structure; transferred SCREENWIDTH,
  SCREENHEIGHT, and SCREENPITCH into the screen_t; added some SHORT()
  macros where I had omitted them; and fixed some spots where I had
  left SCREENWIDTH intact from the original Linux code when it was really
  referring to screen pitch. Also added a small amount of code to handle
  different bit depths.
- Moved registration of vid_* commands out of c_commands.c and into
  i_video.c where they belong.
- Fixed Printf() routine in c_console.c so that it doesn't apply
  printxormask to control characters.

April 16, 1998
- Added code to i_input.c so that it puts the game in the idle priority
  class when the user switches to another window. It also pauses single
  player games now, too.
- Added some code to scroll the sky lixe Hexen. Still need to make it
  configurable, but at least I know it works.
- Tried making some taller (good-looking) skies. I sucked at it.
- Fixed R_DrawFuzzColumn_ASM so that it never draws columns slightly too
  tall. (When drawing the odd pixels before the loop, I had been using
  ebx and bl for two very different tasks. Now I use bh and bl instead.)

April 15, 1998
- Removed tutti-frutti effect for textures 1, 2, 4, 8, 16, 32, and 64
  units tall. Also allow textures taller than 128 units now.
- Tried holding the sky's vertical position constant when freelooking.
  IMO, it's actually worse than letting it move: You can still see it
  wrapping, and it looks weird, too. I guess I'll just have to draw
  some taller skypics if I want something that really looks nice.
- Adjusted P_FindFloor() and P_FindCeiling() to check the health of
  corpses intead of their tics to determine if they have been raised.
- Set the MT_SKULL height back to 56 units from the 30 I had previously
  set it at, since they were occasionally getting stuck in the floor.

April 14, 1998
- Stayed on MAP30 for about 1.5 hours. MaxVisSprites got bumped all
  the way up to 992, and it was slooowwww (except in the corners). Also
  noticed that the plats would sometimes get stuck going up, and I
  shot right through the resurrected corpses. Must fix tomorrow.
  Me go bed now.
- Adjusted the heights of most things to make them better match
  their image sizes. Some were okay as they were, while others were
  way off.
- Did a very quick netgame to see how things looked. Some things are
  too short (like the torches) and others are too tall (like the
  barrels).
- For all intents and purposes, 3D collision detection is now done.
  There is only one potential problem I can foresee: With enough
  vertical velocity, an object could pass right through another
  object in midair. I don't think situations like this will arise very
  often (if at all), so I'm not going to bother rewriting all my new
  code to fix it. At any rate, it's still a lot better than it used
  to be.
- Added targettic to mobj_t to create a delay before missiles can
  impact the thing that shot them. This fixes the problem of missiles
  exploding in the shooter's face before they get anywhere.
- Adjusted P_FindFloor() to search neighboring blocks in the blockmap.
  This solved the problem of occasionally falling into things. Did the
  same thing to P_FindCeiling().

April 13, 1998
- Worked on more thorough 3D collision detection code than my
  previous attempt. (At least it doesn't crash now!) FIXME:
   Missiles are often exploding right in front of the shooter's face.
   It's still possible to land inside of monsters sometimes.
- PIT_RadiusAttack() can now throw things around in three dimensions.
  The only real benefit of this is that it allows for rocket jumping.
  (Which is still pretty cool and well worth the effort of coding it.)
- Made health bonuses and muzzle flashes translucent.
- Fixed bug with Arch-Vile resurrecting a 25% or 75% translucent
  monster. Did equivalent thing for exploding missiles.
- Put idmus cheat and command back.
- Added CVAR_CALLBACK flag for non-latching cvars.
- Added map command to the console.
- Modified G_InitNew() and associated code to use skill cvar.
- Implemented proper cvar latching.
- Hooked localization code into g_level.c. This also cleaned up
  the text patching code in d_dehack.c somewhat, since level names
  and cluster messages are no longer special cases.

April 12, 1998
- Multi-language support is pretty much done. A nice benefit of this
  is that it makes DeHackEd text replacement support easier.
- -iwad and -deh parameters now automatically append the appropriate
  extension (.wad or .deh) if none is specified with them.
- IdentifyVersion() now sets gamemission according to which IWAD
  it finds.
- Removed -shdev, -regdev, and -comdev parameters.
- Fixed inadvertant bug in st_new.c that prevented ZDoom from
  working with the shareware IWAD. I had previously been loading
  the ammo patches with W_CacheLumpName() which bombs out if it
  can't find a named lump (like CELLA0 which isn't in the shareware
  WAD). Now I check for the presence of the lump before I try to
  load it.

April 11, 1998
- Created strutil utility to create string lumps for ZDoom. Also
  created source files for strutil containing the English and French
  translations. (Though English will still be stored in the
  executable as a fallback and to assist with DeHackEd patch text
  replacement.)

April 10, 1998
Not much done today:
- Added g_unlimitedammo cvar.
- Added optional fall damage code originally created by Andy Kempling.

April 9, 1998
- Fixed the pickup of health bonuses. Before, the bonuses maxed
  out at deh_MaxHealth. Now they max out at deh_MaxSoulsphere.
- Added I_SetTitleString() so that we can once again display the
  game banner at startup.
- Removed -wart parameter.
- Completely rewrote the tab completion code. :-) It still works
  the same from the end-user's point of view, but now the code is
  a whole lot cleaner and more flexible.

April 8, 1998
- Implemented tab completion for the console. The associated code
  is really convoluted, but at least it works.
- Implemented monster infighting for DeHackEd patches. It
  was really easy once I looked in the DeHackEd source and
  figured out that it was modifying PIT_CheckThing(). Too bad
  I didn't do this a day earlier...

April 7, 1998
- Updated the documentation and uploaded 1.12 to cdrom.com.
- Put the integer divide code back in FixedDiv_ASM().
  I'm pretty sure the real problem was with my overflow
  detection code, which I fixed yesterday when I put in
  the float code. It works properly now and always
  rounds down. (Some code such as the sprite drawer assumed
  that this was the case, but using floats rounded to the
  nearest integer.) I just don't understand why the problem
  didn't show up much sooner.

April 6, 1998
- Added am_showsecrets, am_showmonsters, and
  am_showtime cvars.
- Added V_DrawPatchTranslatedCleanNoMove() and
  V_DrawTextClean(). Changed console notify text
  code and automap text code to clean scale their
  text.
- Made a change to P_CrossSubsector() that ought
  to speed things up marginally.
- Fixed a small bug in P_DivlineSide() that was
  in the original id code.
- Rewrote FixedDiv_ASM() to use floating point
  math, and it worked. Also removed division by
  zero check, since it appears it's still being
  called with b==0. It looks like DOOM doesn't
  ensure that it never divides by zero and makes
  an assumption about the way FixedDiv() will
  handle these cases.
- #defined NOASM to disable the use of assembly
  routines, and it seemed to run fine. Recompiled
  with assembly routines except FixedDiv_ASM() and
  it still worked.

April 3, 1998
- This crashing stuff is getting even weirder. At
  first, if I disabled optimization in the release
  build, it went away. Now it's showing up under
  all configurations, and I haven't done anything
  to the code. I'm at a loss as to what to do. :-(
- Fixed an obscure bug in FixedDiv_ASM(). When it
  overflowed, it was popping esi instead of ebx.
  Also added a check for division by zero.

April 2, 1998
- Did some bug hunting. The problem is happening in
  P_CrossSubsector(), so it's likely something that
  happens before then, since I never touched that
  function.
- Moved the FPS drawer in I_FinishUpdate() before
  the -devparm dot drawer.

April 1, 1998
- Added Andy Baker's stealth monsters code. Upon
  tessting, a discovered the release build was still
  crashing even without loading a .deh file. My guess
  is that this is the same problem I had on the P60,
  and adding the DeHackEd code just reorganized things
  enough for the problem to show up on my machine too.
- Changed P_TouchSpecialThing() so that picking up a
  power plays a surround sound.
- Continued DeHackEd support. Most text strings now
  get replaced, and almost all miscellaneous info is
  supported as well. Still crashes in the release build.

March 31, 1998
- Continued work on DeHackEd support. Everything except
  miscellaneous info and text changing is supported.
  Unfortunately, my release build is experiencing crash
  problems not present in the debug build now. :-(
- Ripped the MHFX_LAXSPRITEROTATIONS fix out of
  DOSDoom's r_things.c.

March 30, 1998
- Started work on DeHackEd support: things, frames,
  and weapons done. Sounds mostly done.
- Added minimal code to handle changes to userinfo cvars.
- Changed player movement code to allow for very minimal
  corrections to momentum while in mid-air.
- Did a quick test of z-checking for collisions. Needs
  more work; disabled for now.
- Optimized FixedDiv_ASM() further using a neat absolute
  value trick I discovered on a website somewhere.
- Did the same thing for P_BulletSlope(). One unexpected
  twist: bullets always hit walls no matter what their slope.
- Added shoot up/down for projectile weapons with a
  quick hack to P_SpawnPlayerMissile().
- Moved ysheer out of player_t and into mobj_t as pitch.
- Changed P_ExplodeMissile() to set missile explosion
  sprites translucent.
- Changed D_DoomMain() so that it always loads zdoom.wad
  first instead of second.
- Added m_alloc.(c|h) so that I can finally check to
  make sure I get all the memory I ask for with malloc().
- Finished automap overlay. Use am_overlay cvar.
- Moved automap framebuffer boundary determination out of
  AM_LevelInit() and into AM_Drawer(). Did other mucking
  about in the automap code so it clips the automap to the
  view window when the map is overlayed on top of it.

March 29, 1998
- Jotted down some code for truecolor routines.

March 28, 1998
- Worked on automap overlay.
- Changed C_DoKey() to return true if the key generated a
  command, and false if it didn't.
- Automap can now rotate. Use am_rotate cvar to control it.
- Finished new HUD (for now). It gets the job done, and it's not
  too cluttered.

March 27, 1998
- Continued work on new options menu: Removed old sound menu.
  Created new menu title patches. Created controls menu.
  Created video menu.

March 26, 1998
- Started work on the new options menu.
- Created binddefaults command.
- Created a bunch of menu_* commands to access the different
  menus directly. Also added some of them to the default
  bindings string.
- Fixed sky height bug. The key is that skytexturemid is NOT
  resolution-dependant. It is a constant.
- Changed yesterday's sky height fix so that it is based on Doom
  Legacy's aspect ratio correction rather than what DOSDoom did.
  (BTW, this was not done in the 1.11 Doom Legacy source. :-)

March 25, 1998
- Fixed sky height with a little help from DOSDoom.
- Started work on the new HUD. Not yet sure what I like.
- Created the C version of Print2CharP_MMX. It sucks. I know there
  must be a clever way to do it using bit shifts and masking, but
  I don't feel like persuing it right now, since I have an MMX
  machine, and MMX makes it very easy to do.

March 24, 1998
- Ran ZDoom on the Pentium 60 sitting next to me. It crashed whenever
  I tried to enter a level. Some testing is obviously called for. :-(
- Added code to check for the presence of MMX support.
- Created misc.nas and moved the assembly versions of FixedMul() and
  FixedDiv() into it. Also created an assembly inner loop for
  V_DimScreen(). Also created an assembly routine to plot one conchar
  to the screen (Print1CharP) and an MMX version that doubles the
  conchar in size.
- Made command parameters in commands.txt consistant with other
  parameter lists. (<> for required params, [] for ones that aren't.)
  Also added brief descriptions of the different cvar types at the.
- Removed idmypos command. It was redundant with the
  "toggle idmypos" command.

March 23, 1998
- Added dimamount and dimcolor (defaults to gold) cvars for
  V_DimScreen() so that it can shade the screen to any color instead
  of just darkening it (although it will revert to its old behavior if
  translucency is disabled).
- Added assembly version of R_DrawFuzzColumn as well as a proper
  assembly version of R_DrawTranslucentColumn().
- Changed fuzztable in r_draw.c from 50 to 64 entries so that I can
  use a simple mask in R_DrawFuzzColumn() instead of conditionals.
  This should speed up that loop significantly (especially once it's
  in assembly). Also removed references to frac and fracstep from
  R_DrawFuzzColumn() since they weren't needed.
- Can't seem to get V_DrawPatchFlipped() to position patches properly
  (they keep getting drawn too far to the left and up), so for now,
  it just calls V_DrawPatchIndirect().
- Added special case to V_DrawPatchStretched for full-screen patches.
  Also added a scrn parameter to F_DrawPatchCol to accomodate this.
- Changed cyberdemon and spider mastermind sight and death sounds
  in the cast finale to surround.
- Changed brain's pain sound to use ORIGIN_SURROUND2. That way, the
  things it throws out won't override it.
- Added ORIGIN_AMBIENT3-4 and ORIGIN_SURROUND2-4 to s_sound.(c|h).

March 19, 1998
- Fixed UpdateCursorPosition() in i_input.c so that mouse
  sensitivity is independent of the framerate.
- Increased speed of text wipe in f_finale.c.
- Added V_DrawRedTextClean(), V_DrawWhiteTextClean(), and
  V_DrawTranslatedPatchStretched(), and V_DrawTranslatedPatchClean()
  to v_video.c.
- Fixed bug in V_DrawPatchStretched(). Was using unsigned ints where
  I should have used signed ints.
- Rewrote F_Ticker().
- Specifying -nomusic no longer causes I_InitSound() to allocate
  channels for MOD music.
- Changed several V_DrawPatch()es and V_DrawPatchDirect()s to
  V_DrawPatchClean() and V_DrawPatchIndirect() in various source files.
- Added V_DrawPatchIndirect(), V_DrawPatchClean(), and
  V_DrawPatchCleanNoMove() to v_video.c.
- Made lots of changes relating to level and cluster handling.
- Fixed problem in wi_stuff.c that prevented par times from appearing
  on Doom II levels 12 and above.

March 18, 1998
- Changed idmus command to changemus. Now it expects its input
  to be an actual song name. (Consquently, the idmus cheat is gone.)
- Moved stuff from S_music[] into LevelInfos[];
- Changed all references to leveltime, totalsecret, totalkills, and
  totalitems to level.time, level.total_secrets, level.total_monsters,
  and level.total_items respectively. levelstarttic was never used;
  got rid of it.
- Remaved mapnames* arrays from hu_stuff.c and some ST_MAP* #defines
  in st_stuff.c.
- Moved drawing of level name in automap out of hu_stuff.c into am_map.c.

March 17, 1998
- Started laying the framework for better customizability of maps.
  (Any lump can be a map, use any map for the next and secret maps,
  give custom maps a name, custom par times, etc.)
- Played at 640x480 for about 1.5 hours trying to get my machine
  to crash. I have had a report of intermittant crashing possibly
  related to high resolutions, but have been unable to duplicate
  the problem on my machine. On a side note, 640x480 is way too slow.
  Doom95 does ~32 fps at 640x400, and Duke 3D does ~25 fps at 640x480.
  I get ~10 fps at 640x480 and ~12 fps at 640x400. Wish I knew how
  they do it...

March 16, 1998
- Hacked in some code into S_ChangeMusic() to allow it to play songs
  stored as individual files on disk. Added primarily because I
  have a large collection of MODs, and I don't want to be forced
  to pick which ones I want to listen to when I start the game
  (by specifying them with the -file parameter).
- Discovered the Win32 Demo Programming FAQ. Now I can disable
  code segment protection so self-modifying code can stay in
  the same segment as all the other code instead of hiding in
  the data segment.
- Put in the R_DrawColumn code from Doom Legacy. Took me awhile to
  realize that ylookup and columnofs are now pointers instead of
  arrays.

March 14, 1998
- mb_used changed to a float, so the heap doesn't need to be an
  integral number of megs in size.
- Added -heapsize parameter to set size of zone heap at run time.
- Increased size of demoname[] from 32 to 256 chars.
- Rewrote snippets of -playdemo code so that demos can be played
  from any directory and with any path.
- Removed all references to basedefault, since it's been replaced
  by configfile.
- Fixed a really dumb bug in FixPathSeperator. Was initializing
  c to progdir instead of path. Now you can add lumps in different
  directories, and still refer to them by name.
- Reformatted w_wad.c for 4 character tabs.
- Looked through the PTC archive. It needs better documentation, but
  I think I'll probably switch to it for the third release of ZDoom.

March 13, 1998
- Added back some of the stuff I had originally added to w_wad.c.
- Borrowed BT_JUMP and BT_DUCK from DOSDoom. Also added jumping code.
- IDFA and IDKFA now include the backpack.
- Downloaded Prometheus Truecolor. Trying to decide if I should use it
  for high- and true-color support.
- Added support for caching the translucency tables to disk.
  (TODO: Compress this file.)
- Added support for 25% and 75% translucency (because DOSDoom 0.60
  has it.)
- Copied w_wad.c and w_wad.h from DOSDoom 0.60. (decided not to
  bother trying to get PACK support in)
- Moved ConChars data into zdoom.wad as an ordinary patch. zDoom now
  generates the neccessary data on the fly.
- Removed MAXCEILINGS limit. (was 30)
- Removed MAX_DEATHMATCH_STARTS limit. (was 10)
- Removed MAXPLATS limit. (was 30)

March 12, 1998
- Rewrote P_FindNextHighestFloor() so that it doesn't use an internal
  array (thus also removing the MAX_ADJOINING_SECTORS limit).
- Removed some files from the code directory I had added but never used.
- Removed MAXSEGS limit. (was 32.. What are solidsegs anyway?)
- Removed MAXDRAWSEGS limit. (was 256)
- Now allocate R_DrawSprite()'s clipbot and cliptop arrays inside
  R_MultiresInit() instead of each time the function is called. Should
  have done this in the first place, but I obviously wasn't thinking.
  One particularly sprite-laden scene went from ~25 fps to almost 35 fps.
- Created R_MultiresInit() function. Now V_SetResolution() calls it, and
  it calls the various R_*() functions related to supporting multiple
  resolutions.
- Changed the default am_gridcolor to a decent color that actually fits
  with the rest of the color scheme.
- Took a cue from WinDoom and split my keyboard handler between the
  DirectInput code and the window's message handler. Ugly, but at least
  now it handles Pause and Alt-Tab properly. (The original problem with
  Alt-Tab, incidentally, was that I was failing to reacquire the keyboard
  when I regained the input focus.)
- Inserting text at the command line in the console now works properly.
- Pressing ` to hide the console now clears the command line. This is
  the same behavior as Quake, but previously only Escape would clear the
  command line in ZDoom. I found that to be too annoying.
- Pressing up and down arrow keys in the console to scroll through the
  history now ensures that the cursor is always visible.
- Changed BuildString() so that if it is called with argc==1, it just
  returns a copy of the string unmodified instead of sticking it in
  quotes if it contains a space.
- Renamed setcolorbyname to setcolor. The former was just too long.
- Added setcolorbyname command and corresponding V_GetColorStringByName()
  function and X11R6RGB lump listing a bunch of named colors.

March 11, 1998
- Added crosshair cvar and corresponding code to draw the crosshair.
  Put some cheezy crosshairs in zdoom.wad, too. (Now if only you could
  actually aim up and down...)
- Added V_DrawLucentPatch() function to draw translucent patches.
- Added freelook, lookspring, lookstrafe, m_pitch, m_yaw, m_forward,
  and m_side cvars.

March 10, 1998
- Added invertmouse cvar.
- Put the colon back into the "startskill..." message in d_net.c.
- ylookup[] and columnofs[] tables in r_draw.c are now allocated
  dynamically based on screen size. Hacked this into R_InitFuzzTable().
- Status bar finally properly draws borders to the left and right
  of itself if the screen is wider than it is.
- Added documentation for am_* and developer cvars in commands.txt.
- Discovered that lines not yet seen but visible thanks to the
  automap powerup were not color-configurable. Changed it.
- Changed all color #defines in am_map.c into ints that get
  initialized from color values in cvars each time
  AM_initVariables is called. Also added back support for the
  original automap color scheme regardless of what the user's colors are
  through the am_usecustomcolors cvar.
- In single player, automap can now draw the player's arrow using
  any color and not just WHITE.
- Removed all references to lightlev in am_map.c, including the
  AM_updateLightLev() function. The "strobe" effect was really cheap
  anyway, never used, and will be fairly difficult to implement
  cleanly when I make the automap colors customizable.
- Changed I_Error() call in ParseHex() to a Printf() call.
- Removed "extern byte *demo_p;" from d_protocol.c. It didn't need to
  be there anyway.
- Added V_GetColorFromString() to v_video.c.
- Changed BASEYCENTER #define in r_things.c from
  (100-((SCREENHEIGHT-200)/12)) to (100). PlayerSprites are now drawn
  in approximately the same location at all resolutions.

March 9, 1998
- Seem to have finally fixed the problem with my visplane growing
  code. Using calloc() in PrepVisPlanes() instead of malloc() seems
  to have solved all my woes. Now on to something else!
- Boy do I feel dumb. Found a bug in C_DrawConsole () where the
  revealed variable wasn't always being set before it was used.
  Now I rewrote it so that it doesn't need to calculate
  revealed at all. It ought to be marginally faster, too (although
  it probably won't make a bit of difference during gameplay).

March 7, 1998
- Still working on MaxVisPlanes bug. This is proving to be more
  elusive than I had expected, since VC++ is being most unhelpful.
  The bug doesn't show up in the debug build (heap checking doesn't
  even catch anything), and I can't use the debugger on the release
  build where the bug does show up! Grrr!

March 6, 1998

- Started changing MAXVISPLANES constant into the growing integer
  MaxVisPlanes. Moved some code from R_PlaneInitData() to
  R_InitPlanes() and added the GetMoreVisPlanes() function to
  allocate more planes. Strange crashing bugs in release but not
  debug builds. Probably stomping on memory somewhere.
- Fixed stupid bug in I_ShutdownSound: was calling MIDASfreeSample()
  when I should have been calling MIDASfreeChannel(). Also moved
  freeing of channels to another for loop (probably not necessary, but...).
- Fixed -file parameter to work with console commands on the
  command line.
- Changed MAXVISSPRITES constant into the integer MaxVisSprites,
  which is the size of the vissprites[] array. This value can now
  grow as needed to accomodate more vissprites.
- Added developer cvar and DEVONLY macro.
- Functions in i_music.c now pay attention to the looping flag.
- C_AddNotifyString() now pays attention to show_messages cvar.
- Added support for specifying console commands on the command line.
