February 5, 2002
- Did away with the longest-playing change to S_StopSoundID because it made
  looping sounds of the same type near each other fight for precedence, and
  the result sounded horrible. Now I use distance to limit the set of sounds
  considered for stopping. Only sounds within 256 units of the new sound will
  possibly be stopped by this function. Also removed sound tags because they
  served the same purpose as the distance comparison.
- Added $playercompat SNDINFO command to create special aliases from the old
  SNDINFO player sounds to the new ones. These are special in that after they
  get created, any attempts to modify them will modify there target instead.
- Added the addrocketexplosion cvar. If true, then rockets use additive
  translucency when the explode. Otherwise, they use normal translucency. This
  can still be overridden with a Dehacked patch.

February 4, 2002
- Realized that because I now project particles as their subsectors are
  entered, I have enough information to clip the particles when they are
  projected. By changing my code to take advantage of this, I can avoid
  running through all the drawsegs for each particle on-screen. When there are
  many drawsegs and particles on-screen at once, the improvement is quite
  impressive--far better than I expected.

February 2, 2002
- Added MF2_FLOORCLIP to many of the Doom monsters so that they can have their
  feet cut off when standing in shallow water, provided that the appropriate
  terrain definitions exist.
- Put back the limit of two identical sounds playing at once from Heretic and
  Hexen in order to prevent the SSG from making super loud splashes that drown
  out everything else. Tweaked S_StopSoundID so that it will use oldest time
  for selecting a sound to stop if it can't find any with lower priority.
- Set all the puffs except BeakPuff back to their default masses.
- Changed splashes so that if a fake flat has a terrain with a splash, you can
  shoot or drop below it and leave a splash.
- Fixed anomalies with the way the railgun made splashes.
- Added code to group particles into subsectors so that I can subject them to
  the same fake floor clipping as normal sprites. I also found a problem with
  lighting of particles in fake sectors and fixed it.

January 31, 2002
- Fixed: Fog boundaries could be erroneously drawn in underwater areas because
  R_FakeFlat did not change the fake sector's colormap when calculating the
  back side of a line.
- Fixed: Using -skill at the command line always set skill to 0.
- Added a check for freeze mode around P_ThinkParticles and the various
  decal animator tickers.
- Fixed .cfg file parsing so that if comments appear on the same line as a
  command, the command will still be executed.
- Fixed ParseCommandLine to work with unterminated quotes.
- Added "proper" support for tall textures by introducing a different patch
  format that uses words instead of bytes to store column lengths and offsets.
  All tall and multipatch textures get converted to this format at runtime, so
  tall textures work equally well on one-sided and two-sided lines, and I
  don't have to worry about sliding windows while generating the composite
  textures.

January 30, 2002
- Fixed: Addkeysection did not load bindings from the ini.
- Fixed: Quicksave did not quicksave.
- Fixed: Savegames could be listed in the menu twice, once with the full path
  and again with just the file name.
- Fixed: Suiciding and giving stuff to a player without an actor crashed.
- Fixed: Loading savegames was broken.

January 28, 2002
- Fixed: Using allowdecals in ANIMDEFS was broken.
- Added more ways to create slopes, all of which are thing-based:

	Things 9500 and 9501: The first argument to these things is a line id.
		For each matching line, the sector on the same side of the line
		has its floor or ceiling sloped so that it passes through this thing.
		The thing does not necessarily need to be in the sector(s) being
		sloped. 9500 slopes the floor, and 9501 slopes the ceiling.
	Things 9502 and 9503: Set the plane equation for the sector they are in
		directly. The first argument determines how far it tilts from
		horizontal and is measured in degrees. 90 degrees is perfectly
		horizontal. Values close to 90 have less slope than values further
		from 90. The thing's angle is used to determine what direction the
		slope faces. The floor or ceiling will be adjusted so that it passes
		through this thing. 9502 slopes the floor, and 9503 slopes the
		ceiling.
	Things 9510 and 9511: The first argument to these is a sector tag. The
		plane equation from the first sector with a matching tag will be
		copied to the sector that this thing is in. 9510 copies the floor
		plane, and 9511 copies the ceiling plane.

	Things 9500-9503 are processed after slopes created with linedef specials,
	so they can be used to further adjust the resultant slope. Things 9510
	and 9511 are processed after all other slopes are set up, so they override
	any slopes that might have been created in their sectors already.
	
January 26, 2002
- Assigned spawn numbers to most of the Heretic actors and added one for
  Doom's health bonus.
- Added ChangeSkill special (#179).
- Changed A_FireRailgun to use the ammouse field to determine how much ammo
  to eat up.
- Added a minammo member to FWeaponInfo and made it dehacked-settable.
- Fixed: Savegames went in the current directory instead of the program
  directory.
- Fixed: Aliases could not realias themselves reliably.
- Fixed: Particle drawing was erratic in sectors with fake floors.
- Improved detection of windows into below-deep-floor areas to have fewer
  false positives with complex geometry. It works for all the test cases I
  have now, so hopefully all the false positives have been eliminated.

January 25, 2002
- Because I can't figure out what's going wrong with the blitter, when loading
  an ini from a previous ZDoom version, vid_noblitter will now be reset to
  true, because I'm not sure it's benefiting anyone.
- Removed DFrameBuffer::PartialUpdate.
- Added more debugging spew and tried different blit techniques, and blits
  still take too long. They're supposed to be asynchronous, but my timings
  indicate otherwise--the blit times are proportional to the size of the
  blit, BltFast almost never returned DDBLT_WASSTILLDRAWING when I removed the
  _WAIT flag, and a 1600x1200 blit takes ~15 ms to complete (memcpy only needs
  ~4 ms to do the same thing). It seems like it's not using DMA at all but
  some lame software emulation instead, so I tried obtaining an
  IDirectDrawSurface2 interface and PageLocking the blitter surface, but it
  made no difference. Why did it work before but it doesn't now?
- Removed the unlock/lock around D_NetUpdate when rendering. This is only
  needed when a video memory surface is locked under Win9x. Since my
  experiment with writing directly to video memory is gone, this never
  happens.
- Fixed: Alt-tabbing away and back when using the blitter would fail to
  restore the lost surfaces, because system memory surfaces don't normally
  get lost from such a situation, so the LockSurf call would return ok, and
  the BltFast in Update would fail later.

January 24, 2002
- Added heapsize cvar so you don't need to use -heapsize if you always want
  to use a heap other than 8 megabytes. Moved Z_Init to happen after loading
  the config file so that the cvar is available when it gets called.
- Lines with sky on the front and back are no longer considered fog
  boundaries. As long as fog does not effect the sky, it looks bad to be
  drawing the boundaries of different fogs in outdoor areas.
- Fixed: R_ProjectParticle() did not set vis->cx, so R_DrawSprite() was
  unable to properly determine if a drawseg was in front of a particle or
  not.
- Added a #wadauthor switch to ACC to cause it to create dummy scripts for
  all the real scripts in the map so WadAuthor's error checking will know
  about them. I had to change my ACSe detection to no longer look for scripts
  that appear to have 0 scripts and strings. Since the standard ACC will
  never generate object files with the ACSe tag, this should be safe.
- I think I must have messed up the blitter code somewhere, because now it
  slows down the machine it used to speed up. I don't see anything wrong
  though! Changed the default for vid_noblitter to true until I can figure
  out what's going on.
- Added vid_vsync cvar to control whether or not vsync is used when flipping
  the display. Since the framerate gets clamped well below the refresh rate,
  turning off vsync is probably useless.

January 23, 2002
- Fixed: Deleting the most recently saved game and then dying would crash
  because the game would try to load that game and fail because it no longer
  exists.
- Added disableautosave cvar to control when autosaves happen. At 0, autosaves
  always happen. At 1, they only happen when an autosave special is activated.
  At 2, they never happen. Also disabled autosaving when starting a new game.
  Autosaves now happen only when advancing to a new map.
- Fixed: Exiting a level in Heretic crashed.
- Fixed: FSOUND_OUTPUT_WINMM was always used if snd_output was not set to
  dsound. Also added "directsound" as a synonym for "dsound" when used with
  this cvar.

January 22, 2002
- Changed the in-game priority class to normal so ZDoom won't give itself
  a high priority when running.
- Added "Ammo use" field for dehacked weapon modifications.
- Fixed palette translation through Dehacked again. While I was at it, I
  decided to remove translation control from the actor's flags member
  entirely and just rely on the Translation member.
- Fixed: Bouncing a missile off a floor/ceiling near a wall could crash if
  no missiles had already bounced off a wall.
- Fixed: PIT_RadiusAttack() only pushed things in directions with positive
  x and y.
- Gave names to the anonymous structs in p_setup.cpp/sidei_t so that it
  compiles with GCC 2.95.3.
- Rearranged FBaseCVar::ToInt() to try and compile it with GCC 2.95.3.

January 20, 2002
- Fixed: Picking items up when item respawn is enabled would mess up collision
  detection because the items would move themselves back to their original
  positions, and the collision detection code is not reentrant. They now
  relocate themselves as the result of a state change later on.
- Made some changes to the renderer to support drawing textures with different
  scales on the same wall and to also support obtaining textures scaling from
  some of the previously unused bytes in the maptexture_t structs stored in
  the wad.

January 19, 2002
- Added support for DeePsea's tall patches.
- Fixed: Sky textures wider than 1024 could not scroll properly because the
  sky position was always clamped past 255.

January 17, 2002
- Added a new player property: PROP_INSTANTWEAPONSWITCH (2). When set, the
  player can switch weapons instantly without lowering and raising them.

January 16, 2002
- Fixed: Autoaim could mess up. Same reason as PTR_SightTraverse below.
- Changed giveinventory when giving a weapon so that the weapon will not be
  brought up automatically if the player did not have it already. If this is
  desired, it can be simulated with setweapon.
- Disabled drawing of the crosshair when the camera is not a player.
- Fixed a problem under NT4 when using waveout for sound effects and playing
  MIDI music: A memory block would be modified after being freed. The fix is
  a 50 ms delay between stopping the song and shutting down the sound.
- Added "waveout" as a synonym for "winmm" for the snd_output cvar.
- Added CheckWeapon and SetWeapon ACS commands.
- Added support for a -1 translation in Thing_SetTranslation to set the
  target's translation to that of the activator's.

January 14, 2002
- Fixed a bug in PTR_SightTraverse() that could cause it to think something
  was visible when it really wasn't.
- Fixed: Masked mid textures in foggy areas could be drawn with the wrong
  light level, because they checked the foggy flag to determine if they were
  in a foggy area. This flag is not set when drawing masked mid textures.
- Added a tx cvar to test different horizontal wall texture scales.
- Fixed some errors GCC found and added GetFlashedPalette() to SDLVideo
  so that ZDoom compiles under Linux again.

January 12, 2002
- Added a ty cvar to test different vertical wall texture scales.

January 10, 2002
- Added a vid_noblitter cvar to force memcpy to be used for copying from
  system to video memory, even when the blitter is available to do the job.
  On my P3-866 with a GeForce2 Go, the blitter is about twice as fast as
  memcpy. On my Athlon XP 1600+ with GeForce2 MX, memcpy is about three
  times faster than the blitter. I need more data before I can decide what
  a reasonable default for different systems is, but right now it defaults
  to false.
- Fixed: The blitter surfaces would only flip when logging was enabled
  because I had the Flip call enclosed inside a LOG1 macro.
- Fixed the case where the video driver reported it could blit from system
  to video memory, but the blitter surfaces could not be allocated. When this
  happened, the screen would not update.

January 9, 2002
- Changed P_CheckSlopeWalk() to return false if the actor's floorsector is
  different from the actor's sector. It seems to fix the problem with the
  "push pad". The whole Doom collision detection/movement code is a mess and
  deserves to be rewritten from the ground up.
- Changed sky texture positioning to match older versions. It should be based
  on the height of the screen, not the height of the texture.
- Commented out a check at the beginning of wallscan(), because sky boxes can
  make the check invalid.

January 8, 2002
- By default, animated textures will no longer have decals drawn on top of
  them. This can be changed by adding "allowdecals" to the animation sequence
  in ANIMDEFS.
- Moved the SpawnableThings/DoomEdMap initialization out of
  FActorInfo::StaticGameSet() into ::StaticSetActorNums() so that Dehacked
  patches that change doomednums will work as expected.

January 7, 2002
- Added an error message for switches that have more than one sound for their
  on or off states.
- Fixed: Creating a switch with a valid start texture but an invalid second
  texture would crash when you tried to use the switch. Now you get an error
  when the ANIMDEFS is parsed.

January 5, 2002
- Wrote some code for Convert24(). Since my video card does not support 24-bit
  displays, I had to test it using a 32-bit display instead, but it seems to
  be working.
- Removed the special case for writing to 8-bit windowed displays in
  win32video.cpp.
- Added turnspeeds command to adjust the keyboard turning rate.
- Added sin, cos, and vectorangle ACS functions. They use 16-bit angles. 0 is
  0 degrees, and 65536 would be 360 degrees if it didn't wrap to 0.

January 4, 2002
- Fixed: CheckIWAD() would consider as valid any files that were present in
  the search, even if they weren't IWADs. Hence, something like
  "zdoom -iwad zdoom.exe" would be accepted and cause a crash.

January 3, 2002
- Got rid of the divide in P_AdjustLine when it calculated the slopetype for
  diagonal lines. Because only the sign of the result is significant, a
  simple xor is enough. Did the same for UpdateSegBBox.
- Turned R_PointOnSide into a simple inlining of DivScale32. Multiplies are
  cheaper than mispredicted branches, so I took out the special cases for
  perfectly horizontal and vertical lines. Also made similar changes to
  P_PointOnLineSide and P_PointOnDivlineSide, which are exactly the same
  thing, except they use different line representations. Also inlined
  P_MakeDivline, because it's so simple.

January 2, 2002
- Moved cl_bobscale and cl_stillbob into userinfo (and renamed them to
  movebob and stillbob). There are sector actions that depend on the player's
  eye height, so these values need to be sent across the network.
- Optimized R_DrawFogBoundary() by drawing horizontal spans instead of
  vertical strips.

December 24, 2001
- Added a check for sectors without any lines in p_setup.cpp. If any are
  found, their tags are set to 0 so that they cannot be used by most specials.

December 22, 2001
- Fixed: If you saved over a savegame from a different ZDoom version, the menu
  would still list it as being from a different version until you quit and
  restarted the game.
- Added the CreateTranslation ACS command and Thing_SetTranslation special to
  allow changing the translation used by any actor.
- Added a ScriptedMarine actor. It looks just like the player but wears indigo
  and acts like a monster (except its attacks don't actually do anything).
  Doomednum 9100, spawnable #151.

December 21, 2001
- Added function and array support to ZDoom's ACS VM.

December 18, 2001
- Fixed: Player corpses would revert to the default skin if the player
  respawned before their death animation finished.
- Changed the Doom weapons so that they use the ammouse member of FWeaponInfo.
  This way, when a deh patch sets a weapon to no ammo, I can set its ammouse to
  0, and nothing will change when the weapon is fired..
- Changed video code so that if the blitter is not being used to copy the
  frame from system memory, all the drawing will still happen in system memory
  because the processor has faster access to it than video memory.
- Changed video code so that it works with drivers that do not support
  FLIP_NOVSYNC.

December 16, 2001
- Changed the SSG flash to not last longer than the associated weapon frame.

December 8, 2001
- Fixed: CheckIfExitIsGood() always returned false if self was NULL. This
  meant open scripts could not change the level.
- Fixed: Exit_Normal and Exit_Secret specials ignored their position
  arguments and always used position 0.

December 7, 2001
- Changed PIT_RadiusAttack() to be closer to the original behavior. Doom does
  radius damage in a square pattern, not a circle. Oops!

November 23, 2001
- Changed translationtables into an array of translation tables and fixed a
  bug with the serialization of decals with custom translations in the
  process.
- Added the CreateTranslation command to ACC.
- Redesigned the layout of ACSe/ACSE files so that they can be included with
  editors other than ZETH. The new format looks like a normal ACS\0 file with
  some junk in the string area but no actual scripts or strings. The old
  ACSe/ACSE format is still supported for people who took the time to compile
  the ACC 1.16 source I had posted.

November 22, 2001
- Changed the translation member of AActor to an index into the
  translationtables array.
- Added the Thing_SpawnFacing special. It works like Thing_Spawn(NoFog)
  except the angle of the new actor is taken from the spot where it spawns at.
- Corrected the xspeed and yspeed arrays in p_enemy.cpp so that they better
  reflect diagonal movement at the correct speed of 1.

November 20, 2001
- More tool work: Added IMGZ, FON1, and FON2 loading support and ILBM, PCX,
  and BMP writing support to imagetool. It loads FON1 and FON2 as images, not
  fonts, so converting to/from FON1 and FON2 requires extra work on the user's
  part. However, it does make it possible to obtain an editable image for
  the font that can be used to create another font of the same type. It also
  makes imagetool usable as a general-purpose image conversion program, which
  is fitting considering that it was spawned from an ILBM to PCX converter I
  had written earlier.

November 19, 2001
- Changed FFont to construct a font whose glyphs are all the same height so
  that I don't need to keep track of the height and y-offset of individual
  characters.
- Fixed the FONTA63 character in zdoom.wad to be a proper copy of the
  underscore character for Heretic/Hexen.
- Fixed: The Beak's weapon infos did not have their type member filled in.

November 15, 2001
- Changed fog boundary handling so that black fog is treated like diminishing
  light rather than fog, so it will not appear on a boundary.
- Fixed: The Fortress of Mystery appeared on the intermission map when
  entering E2M8 instead of E2M9. It will also stay on the map after you
  finish it now.
- Fixed: When using the changemap command to switch episodes in Doom 1, only
  the episode just finished would be shown during the intermission.
- Renamed CONCHARS to CONFONT.
- Merged all of the FONTB?? graphics in zdoom.wad into a single DBIGFONT
  lump, partly to save space but mostly because I wanted an example font to
  include with imagetool when I distribute it.
- After inspiration struck, I added some code to make fog boundaries look
  better: At a two-sided line where the front fog is different from the back
  fog, draw a solid-colored window of varying translucency in the color of
  the front fog color. This is effectively what creating a new colormap for
  each fog color already does for sprites and one-sided lines.

November 13, 2001
- Added FON2 creation support to imagetool. Like FON1, this is a font format,
  but this one supports characters of varying widths and a custom palette.

November 12, 2001
- Tool work: Added pcx, bmp, and patch loading support to imagetool.
- Fixed: Screen shots did not capture the palette blend.
- Added the ability for HUD messages to resize themselves when the screen
  size changes.
- Removed precachefonts command from ACC, as I decided it was not needed.

November 10, 2001
- Implemented the setfont command.
- Fixed: HUD messages were not saved with save games.
- Added decal teleporting support to TeleportInSector so that decals can move
  between the different shafts of a fake 3D elevator. Then I commented it out
  because doing it right is too hard.

November 9, 2001
- Added the ACS functions setfloortrigger, setceilingtrigger, getactorx,
  getactory, and getactorz. The first two are to make convincing fake 3D
  lifts possible. The last three are there because they have been requested
  a lot.

November 8, 2001
- Fixed: Elevators did not set floordata or ceilingdata, so you could not
  tagwait on them.
- Improved sprite clipping by fake flats further. Now you can look into an
  underwater area through a window, and the sprites in it will still show
  when your view is above water.

November 7, 2001
- Fixed: Autosaves do not become the default quicksave if the player has not
  saved a game manually yet.
- FMOD 3.33 also has some division by zero issues, so now I'm back to using
  FMOD 3.40--but this one was updated with some more checks that seem to be
  keeping the division errors away. Unfortunately, the updated FMOD 3.40
  isn't available for Linux yet.
- Fixed: G_InitNew() was calling StaticGameSet(), but that only needs to be
  called during startup. Calling it again later can cause some Dehacked
  changes to be undone.
- Fixed: Swimming into a one-sided line while in water would try to jump you
  out of the water. Since there's nothing on the other side of the line,
  that's rather pointless.
- Made R_DrawSkyBoxes() set the camera properly.
- Changed most instances of camera->Sector in the renderer with viewsector
  so that deep water clipping can behave as expected when using a chase
  camera that moves out of the same sector as the camera.
- Improved clipping of sprites by sloped fake floors. To be completely
  correct, the clip line should be sloped with the floor, but it's still
  horizontal because I am feeling lazy right now. At least things don't
  appear and disappear as you move around underneath a sloped fake floor.
- Added a sound to A_HeadAttack() so that the Cacodemon can be given a melee
  sound through SNDINFO.
- Changed A_CPosAttack() to use self->AttackSound instead of hard-coding it
  to "chainguy/attack". Now the WolfSS can have a different attack sound.
- Fixed: secplane_t::FlipVert() was wrong. It needs to negate everything, not
  just c and d. This prevented sloped fake floors and ceilings from
  displaying properly.

November 6, 2001
- Added things 9983 and 9982 to perform actions when going below and above
  fake ceilings.
- Added some more Transfer_Heights modifiers: 16 causes the control sector
  to have no effect at all on the target sector. With this modifier, it is
  used solely for triggering sector actions. 32 causes the control sector to
  not effect the lighting in the target sector.
- Added two new sector actions: SecActEyesDive (9993) and SecActEyesSurface
  (9992). When used in conjunction with TeleportGroup, these can produce the
  Duke3D silent teleport to and from underwater sectors effect.
- Changed TeleportGroup so that if group_tid is 0, it treats the activator
  as the group.

November 3, 2001
- Made some changes to P_ExplodeMissile() so that missiles exploding on a
  corner are more likely to leave behind decals.
- Added the cvars cl_bobscale and cl_stillbob to control the amount of view
  bob when moving and standing still, respectively.

November 2, 2001
- Improved the accuracy of EV_SilentLineTeleport(). The original function was
  written as if the actor was always exactly on the line, so it calculated a
  destination position directly on the line and fudged with it to get the
  player on the correct side. It's better to find the closest point on the
  source line and the corresponding point on the destination line and then
  offset off of the destination line so that the actor is in the same
  relative position as it is to the source line. This eliminates the need for
  fudging, and I can't get stuck in the wall when teleporting in a sample
  level anymore.
- Why does the Doom map format have to store sectors only implicitly? Because
  of this, people can create maps with oodles of unclosed sectors. I've
  already had to modify my P_Trace() function because of this. Now I found
  out that they can cause problems if I don't always divide front space in
  R_RenderBSPNode(): I made it conditional because I assumed it was
  unconditional because of precision problems with using polar coordinates to
  perform the transformations. When sectors are well formed (and most are),
  having the check causes no visible problems. But when sectors are badly
  formed, it is possible that sprites in the sectors will not be drawn because
  the sectors do not actually get visited, even though the space they occupy
  is drawn.
- Changed the Doom fullscreen HUD so that health and armor counts are drawn
  at a location based on the actual font height.
- Fixed: DCanvas::DrawShadowedMaskedBlock and ::ScaleShadowedMaskedBlock did
  not check to make sure the shadow was drawn inside the screen. Now they do,
  and if the shadow lies partially off the surface, the image and shadow get
  drawn in two passes instead of one.

October 31, 2001
- Fixed: The bloodbath announcer was not entirely silent in single player
  games.
- Fixed AImpactDecal::SpreadLeft() and SpreadRight() so that they can spread
  across adjacent loops without getting stuck in an infinite loop.
- Fixed: Corpses can fall to the bottom of deep water now.
- Fixed a bug in P_Trace() when the trace is on the floor or ceiling and it
  hits a two sided line that blocks it.
- New: Instant hit weapons can make splashes in liquids, even deep ones.
  The size of the splash is determined by the weapon's puff's mass, so I set
  several of the puff actors to have masses of 5 so their trails only leave
  small splashes instead of big ones.
- Renamed DThinker::RunThink() to Tick().

October 30, 2001
- Finally added a playmovie command to ACS.
- Fixed: FDecalLibrary::GetDecalByNum() would only find the decal if it was
  on the right-most branch of the tree.
- Changed the subsector pointer in AActor to a sector pointer. The only place
  where it wasn't used to get the actor's containing sector was an early-out
  in P_CheckSight(). Since the sight checking in ZDoom uses the blockmap
  instead of the BSP, I doubt it provided much benefit, especially since it
  was rarely taken.

October 29, 2001
- Put back some code that lets you see underwater areas through windows. It
  is not perfect and cannot be used at the same time that you can see the
  abovewater area of any deep sectors.
- Fixed: The back side of a mirror could clip sprites in front of it because
  the determination of which side of a line a sprite is on was being done in
  world space. The solution is to use camera space for the determination
  instead. Since I was already calculating all the necessary values, the
  solution mostly involved extending vissprite_t and drawseg_t to hold the
  extra information.
- Fixed: Sectors set to drop their ceilings after 30 seconds would not go
  back to their original height if they were blocked while closing.
- Added the con_ctrl_d cvar so that I can set it to "quit" and press Ctrl-D
  at an empty console prompt to quit the game.
- Added the exit command as a synonym for quit.
- Added the defaultbind command.

October 27, 2001
- Made a slight optimization for sprite drawing by moving the floorclip
  clipping out of R_DrawMaskedColumn and into R_DrawSprite.
- Fixed: Spawning objects in a swimmable water area would create a splash on
  the water surface.
- Fixed: Passing +map at startup just prints a warning to the console instead
  of quitting altogether if the map could not be found.
- Added new options to Transfer_Heights: By setting the second argument to 2,
  only the deep water effect will be created. By setting it to 4, the fake
  floor and/or ceiling will only show if it is "inside" the sector, but only
  if the real sector's and the control sector's corresponding planes are not
  sloped. This also effects the texturing in that the control sector's
  textures are used for both the top and bottom of the surface they correspond
  to, and the sector being faked keeps its textures for its normal range.
  Set the first argument to 8, and it will be made into water even without a
  WaterZone actor in the control sector. These can be added together to
  combine effects. So Transfer_Heights (tag, 12) should produce an effect
  similar to Doom Legacy's 280 linetype.
- Added the test and eval console commands. Test is like if/then/else, and
  eval evaluates an expression, possibly storing the result in a variable.
  This should take care of all the major functionality the console was
  missing before.

October 26, 2001
- Made the atexit cvar a command that registers different commands to
  execute when the game quits.
- Cfg files listed at the start of the command line now get executed as if
  they had appeared after +exec. (i.e. "zdoom foo.cfg" works just like
  "zdoom +exec foo.cfg")
- Added the pullin command so that .cfg scripts loaded at startup can cause
  one or more wads to be loaded. (They "pull in" the wads they need.)
- Changed the exec command so that it can execute more than one file.
- Added the addkeysection and addmenukey commands for people writing console
  scripts.

October 25, 2001
- Added ACS commands fadeto, faderange, and cancelfade to do some palette
  blending stuff under scripted control.
- Added BloodSplash, BloodSplashBase, SlimeSplash, and SlimeChunk classes
  for anyone who wants to use them in a TERRAIN lump.
- Added the atexit cvar. It gets executed like an alias when the game quits.
- Added archivecvar command to force user-defined cvars to save themselves
  in the config file.
- Added snd_waterreverb cvar to disable the use of underwater reverb.
- Added support for specials with variable argument counts to ACC so that
  specials which have had parameters added (such as Thing_Spawn) can still
  be used without the extra parameter.
- Added TeleportOther (76) and TeleportGroup (77) specials.
- Added autosave capabilities. Up to four autosaves are kept at a time,
  and they get created whenever a player enters a map. The level designer
  can also place them at strategic locations in the level using special
  15 or linetypes 348/349.

October 24, 2001
- Fixed: The level name shown on the automap included the hours of the
  current time if the map was in a hub.
- Added Line_Horizon to DOOMX/HERETICX as linetype 337.
- Added am_showitems cvar to show the item count on the automap.
- Added pattern matching support to D_AddConfigWads().
- Fixed: Variable substitution only worked for the last argument of a
  command line.
- Removed FCommandLine::AllButFirstArg(). It did not handle variable
  substitution, and since you can escape quotes inside strings, it's not
  really neccessary, either.
- Added a generator line for the Spider Mastermind to DECALDEF.
- Added some division-by-zero checks to the projection calculations in
  R_AddLine(), R_CheckBBox(), and R_RenderBoundWallSprite().

October 23, 2001
- Added Scale and Decal properties to Dehacked thing sections. Added Decal
  property to Dehacked weapon sections.
- Changed the scalars in DECALDEF to be 1-based instead of 64-based. This
  lets me silently expand its range in the future without breaking existing
  decal definitions.
- Fixed: fixedlightlev was being applied to skies. It looks weird to see a
  torch lighting up the entire sky, so skies should ignore the setting of
  fixedlightlev.
- Fixed the scaled status bar. I was simply forgetting to add the image
  offsets in FBaseStatusBar::DrawImage() before calling CopyToScreen().
- Added code to let decals move with sliding and rotating polyobjects.
- Fixed: The wait console command waited one tic too few.
- Fixed a resizing problem with playing movies windowed.
- I think checkinventory, giveinventory, and takeinventory are fully working
  now.
- Made checkinventory not crash in open scripts.
- Made AInventory::TryPickup() public so that I can use it with
  giveinventory and avoid printing a message about the pickup.
- Passing an amount of 0 to takeinventory now removes all of that item
  from the player's inventory.
- Made TakeInventory work in open scripts.
- Removed the Health option from GiveInventory.
- Changed DamageThing so that negative damages cause it to act like
  HealThing.
- Added OldStyleID() methods to AFist, APistol, AStaff, and AGoldWand.

October 22, 2001
- Made clearinventory work in open scripts.
- Made ambientsound use CHAN_AUTO instead of CHAN_BODY, so you can have
  multiple overlapping ambientsounds.
- Fixed: Setplayerproperty was using the set property as the who property.
- Fixed: Closing the console when the overlay automap is active and the view
  window does not cover the width of the screen would not redraw the border.
- Fixed: The overlay automap did not center itself inside the view window.
- Fixed: When neverswitchonpickup was changed during a game, it would always
  become false in the playerinfo struct.
- Made the rocket explosion style modifiable through dehacked in the misc
  section. Use the keys "Rocket Explosion Style" and "Rocket Explosion Alpha"
  to change it.
- Changed the sky drawer so that it properly tiles skies of any height and
  not just those that are a power of 2.
- Changed R_InitSkyMap() so that tall skies will always be aligned at the
  top of the screen when looking all the way up. Now 240-tall skies will
  actually be useful, since so many people seem to think skies need to be
  that tall to be considered "tall" even though anything taller than 128
  pixels is "tall".
- Fixed: Files specified at the start of the command line were treated as
  if they were listed after a -bot parameter.
- Modified DArgs::GatherFiles() so that it can handle files listed after
  multiple instances of the same parameter (e.g. "-file 1.wad -file 2.wad")
- Changed ConsiderPatches() so that it tries appending both .deh and .bex to
  files listed after both -deh and -bex parameters, which means the two
  parameters now behave identically and are just synonyms for each other.
- Made a fix to BaseFileSearch() when it retries with an extension.

October 20, 2001
- Added range checks to R_SetVisibility to prevent visual glitches caused by
  too high visibility/fov combinations.
- Made r_visibility unchangeable in netgames.
- Made FOV changes get sent through the net interface, so they can be
  recorded in demos, and also so that they can be restricted with the new
  sv_nofov cvar.
- Fixed: Bool cvars (such as sv_nomonsters) would change their associated
  serverinfo var without going through the network.
- Fixed: The Doom status bar would not update the arms/frags area when the
  deathmatch cvar is changed during the game.
- Fixed: Player corpses could still make the grunt sound when they hit the
  ground.
- Fixed: StreamSong would always play at full volume until snd_musicvolume
  changed because it kept its own internal copy of the volume that was not
  updated with the actual volume until the cvar was changed.
- Made crushing ceilings call PlayCeilingSound() again, but only if the
  ceiling is not playing a looping sound. This fixes the almost silent crusher
  in Doom2 MAP04 that had become totally silent.
- Fixed: The weapon sprite did not flash when invisibility was about to run
  out.
- Made DECALDEF generators support using "None" to remove decals from actors.
- Added fullbright flag to the BFG lightning and plasma scorch decals.
- Fixed: Ambient things could not be spawned silent, because they start
  themselves with PostBeginPlay, which gets called after Deactivate
  when their dormant bit is set. So they would stop themselves and then
  immediately start again. Using BeginPlay fixes this, since it gets
  called before the dormant Deactivate.
- Fixed: S_RelinkSound() should not be able to move repeating sounds to
  positioned sounds. This fixes removing continuous ambient sound things
  from not stopping the sound immediately.
- Fixed: Deactivating a continuous ambient sound thing would not stop the
  sound until it was either overridden by more important sounds or disappeared
  out of range.
- Fixed: The bex include directive ignored the file name if it appeared in
  files that mark line endings with CR/LF instead of just LF. (AFAIK, that's
  all bex files that exist.) For files that just use LF, it would try to
  include the file but crash.
- Win32Video::EnumDDModesCB() now rejects modes whose widths are not
  multiples of 8, because there are various places in the source that assume
  this to be true, and I have no alternative code (or desire to write such
  code) to handle cases when this is not true. I don't know of any standard
  modes that would be rejected by this, but it's better to be safe than sorry.
- Fixed: Viewwindows with widths that are not divisible by 16 could crash
  when doubling pixels horizontally, because the MMX routines write to
  quadwords at a time. Now the non-MMX code is always used in such cases,
  since they are rare (only when the window is the full width of the screen
  and the screen width is not a multiple of 16).
- Removed vid_bufferarea and related code to switch between buffered and
  unbuffered display based on translucent areas visible in the last frame.
- Fixed: Savegames did not remember which levels had been marked visited for
  the Doom 1 intermission screen.
- Fixed: Actors' alphacolor was not serialized.
- Fixed vid_setmode not always resizing the window to a reasonable size under
  Win ME because the OS sends out WM_GETMINMAXINFO before performing the
  resize with SetWindowPos().

October 19, 2001
- Added the ability for DDrawFB to draw to a system memory surface and then
  blit it to the primary surface. This can greatly improve performance, both
  because the video card can write to its own memory faster than the CPU, but
  also because the next frame can start rendering in a separate surface while
  the blit is underway. The net result is that drawing to system memory is
  only a little slower than drawing directly to video memory (if at all), and
  there is really no reason for me to support writing directly to the primary
  surface any more. I can even run 1400x1050 at 35 fps, though it is somewhat
  jumpy, and it does get slower if the scene is too complicated. But just
  being able to run it full speed at all at that high a resolution rocks! Even
  a 300 MHz P2 can run the standard levels at a full 35 fps at 800x600, which
  it couldn't before.

October 18, 2001
- Need to fix windowed 256 color updating for systems that cannot lock the
  primary surface. (result is DDERR_CANTLOCKSURFACE when you try)
- Added a performance counter for blitting the frame buffer to the screen and
  discovered that it is a real performance sink. When no pixel format
  conversion is involved, it should be no slower than wall drawing, right? Well,
  it's about twice as slow.
- Improved performance at 1024x768 by using a pitch larger than the width for
  the underlying SimpleCanvas at that resolution (so that successive pixels
  drawn in columns are not exactly 1k apart and can make better use of the
  cache). The result is that wall pixels take about 5.4 cycles to draw, which
  is in line with what the other resolutions manage.

October 17, 2001
- Did some performance tests at different resolutions and discovered something
  very weird: up to and including 800x600, wall drawing ranges between 4.5 and
  5.2 cycles/pixel. But at 1024x768, it jumps up to a whopping 18 cycles per
  pixel. Even stranger, 1280x1024 only uses 7 cycles/pixel, and 1400x1050 takes
  just 5.5 cycles/pixel. (These numbers include all overhead such as traversing
  the BSP and creating visplanes, not just the time actually spent stuffing
  pixels to the framebufer.)
- Changed the mode iterator to allow resolutions taller than 1024 pixels,
  since there is nowhere in the source that this restriction exists. (There
  is a limit of 1200 pixels tall, but this is easily changed with a #define.)
- Massaged the assembly output of vlinec4 to produce vlinetallasm4. This
  new function is about 7% faster than provlineasm4 and is not limited to
  256 pixel tall columns, so I stopped using provlineasm4. I don't know
  how it compares to vlineasm4 on a Pentium, but my guess is that vlineasm4
  is faster on such a machine. It's probably worth also noting that contrary
  to my initial belief, self-modifying code was essential to getting this
  function to perform well. Also, I did not even bother trying to optimize
  it for a Pentium, just Pentium Pro and above. Moving things around to help
  pairing on a Pentium actually reduced performance on this P3-M.

October 15, 2001
- Wrote C versions of vlineasm1 and vlineasm4. On a P3, vlinec4 performs
  about half way between vlineasm4 and provlineasm4. P2 performance is
  probably similar.
- Got rid of all the 2-column drawers. Whatever performance improvements
  they might have been able to offer was negated by the complexity of the
  code neccessary to use them. This let me greatly clean up rt_draw4cols()
  and actually make it readable.

October 12, 2001
- Fixed: I_InitMusic() was not called if -nosound or -nosfx was passed.
- Changed visplanes so that the bottom array stores the pixels just below
  the plane--a simple semantic change that lends itself to a few more
  optimization chances elsewhere in the engine, since it unifies the way
  top and bottom arrays are handled everywhere.
- Enhanced wallscan so that it can get a texture column using any function.
  This lets me use it for layered skies.

October 10, 2001
- Drawing of a single sky layer now uses wallscan. 
- Removed the use of dc_mask from all of the non-wallscan column drawers,
  since they are only used for masked columns, which never repeat and hence
  never need masking.
- Tried out the new code on a P2-300. It is also slightly faster. Drawing a
  wall covering the entire screen is about 10ms faster at 800x600 on it. This
  made me decide to do away with BlastColumn, R_RenderSegLoop1, and
  R_RenderSegLoop2. There is just one R_RenderSegLoop now, using vlineasm4.

October 9, 2001
- Added Build's vlineasm4 and associated code to speed up wall drawing.
  Surprisingly, it only offers a marginal improvement on this P3-866 equipped
  notebook: The higher resolutions are only a few FPS faster than
  r_columnmethod 1. When I get a new monitor, I will have to try it out with
  my main system, since it still has a P2-350. I think the biggest benefit
  should be for people with Pentium-class or less processors.
  Since it is faster, I'll keep it. I also improved it so that it works with
  textures taller than 256 pixels (or should, I haven't tested).

October 4, 2001
- Fixed fullscreen video playback so that it does not minimize the game
  window immediately after the video is stopped.
- Improved dragging the ZDoom window around by making the window procedure
  pay attention to WM_PAINT messages and redraw the screen as needed. Making
  WM_SIZE invalidate the client rect also lets it redraw as the window is
  shrinking.

October 3, 2001
- Fixed DDrawFB::CreateSurfacesComplex() so that it can retry without
  requesting video memory. This lets it work with Mode X, so presumably it
  will also let it work with old video cards that lack proper DirectDraw
  support.
- Commented out the GammaControl stuff in win32video.cpp. Too many people
  complained about not being able to compile it (get a newer DX SDK!), and
  it does not provide me much benefit when working with paletted displays
  anyway. Nor was it ever actually implemented.

October 2, 2001
- Fixed: DROPPED bit was defined twice in DEHSUPP.
- Updated my source files with the new BSD-ish license.
- Renamed p_spark.cpp to g_shared/a_spark.cpp.
- Removed d_items.cpp and d_items.h. They have been obsolete ever since I
  changed the give command to accept class names.
- Changed the randomized sound names in DEHSUPP from their individual names
  to their new base name. (i.e. grunt/sight1, 2, and 3 all become grunt/sight)
- Fixed a typo in DEHSUPP: gatso/death should have been fatso/death.

October 1, 2001
- Added a playmovie command to play a file using DirectShow. Currently, it
  works best with windowed mode.

September 27, 2001
- Added Line_Horizon special to extend a sector's floor and ceiling to
  infinity--should be useful for skyboxes. It is not meant for use with
  slopes, so don't do that.
- Fixed: ceilingclip/floorclip generation in R_DrawSkyBoxes was wrong for
  unused portions of the sky box's visplane (when pl->top[x] == 0xffff).
  This could cause problems when taking the snapshot for savegames.
- Fixed: Quicksaving would continue to ask for a save slot until a normal
  save had been done.
- Fixed: Bad decal texture coordinates could crash the game. These were
  generated when the camera gets extremely close to a decal, so I chose to
  use the same tactic I used with masked mid textures and not render them
  at all if they get too close. I think the only time something like this
  becomes a real issue is when somebody is noclipping around the level.

September 26, 2001
- Fixed P_LoopSides() to not trash memory when loading a map with a
  single-sided line that does not attach to anything at its right end. (E1M3
  is one such map.)
- Fixed decals not drawing their full height except when they were on upper
  textures; BlastColumn was storing wallbottom wrong.
- Fixed inconsistant usage of ceilingclip. It is supposed to store the top
  good y, but some places still treated it as the y just above the first good
  y, as it was in the original renderer.
- Fixed the GCC version of qinterpolatedown16short(). It wrote 2 more
  entries than it was supposed to and could start writing one entry before
  it was supposed to.
- Previous log entries were accidentally lost when I was improving the
  todos/fromdos scripts. Now only the files that have changed get copied
  across, and I can avoid rebuilding every source file each time I transfer
  the code between partitions. Under Linux, this is a big deal, because GCC
  is so slow.

September 17, 2001
- Added cl_missiledecals cvar to turn off decals left behind by missile
  explosions.
- Added cl_bloodsplats cvar to turn off blood splats while leaving other
  decals alone.
- Added -timerdelay parameter to specify how fast the game timer tics (in
  milliseconds). This is just here so that when I occasionally get demos
  illustrating problems, I can easily fast forward through them.
- Made A3D the default for snd_3d again, because A3D has one more hardware
  channel than DirectSound on my Vortex2 and because it seems to work
  better than DirectSound.
- Changed I_StartSound3D() so that it starts sounds on a specific channel
  instead of using FSOUND_FREE, because it loses sounds with DirectSound
  if I let FMOD pick a channel. Oddly, FSOUND_FREE with A3D works fine.
  [Nevermind, that doesn't work with DirectSound, either. It seemed to be
  working the first time I tried it, but when I tried again later, it
  was not working anymore.] [Another footnote: A3D seems to position the
  sounds wrong that DirectSound does not play. What's going on?]
- Let I_SetChannels() change the number of channels available so that all
  the available hardware channels can be used if using 3D audio.
- Made CPU speed detection more accurate.
- Added underwater reverb for hardware 3D sound.
- Updated sound code for FMOD 3.4.
- Fixed timer resolution checking in WinMain--my parentheses were misplaced.
- Put SectorSilencer back at doomednum 9082. I don't know why I had changed
  it to 9002.

September 15, 2001
- Fixed: Monsters that reached the end of a patrol path did not have their
  reactiontime reset, so they would wait a very long time before attacking.
- Fixed: STYLE_Shaded ignored special colormaps like invulnerability.
- Added support for autoloading wads through the config file. Create a
  section called [Game.Autoload] and place "Path=<file>" beneath it for each
  file to be automatically loaded. They are loaded after the files in the
  skins directory and before any files on the command line. Game can be
  Global to load the files for any game. Global files are added before game-
  specific files.
- Fixed StreamSong when using 3D sound: The stream was not created with
  FSOUND_2D, so it was being positioned in the world.

September 14, 2001
- Made the ACS spawn and spawnspot commands automatically prepend A to their
  type names. They remain untested, however.
- Added decals for all remaining Doom things. Heretic is next.
- Fixed pitch calculation in P_TraceBleed() when a missile's velocity is used
  to determine pitch.

September 12, 2001
- Added decal stretchers, sliders, combiners, and colorchangers. Also added
  a few more decals.

September 11, 2001
- Fixed FDecalLib::GetDecalByNum() and ::GetDecalByName() so that they do not
  crash if the decal is not found.
- Tried putting back in the BSP-based sight checking code that was in the
  Linux Doom 1.10 source, and the result was quite surprising. Using the BSP
  to check sight was actually slower than using the blockmap, sometimes
  significantly so--Vrack 2 spent between 4 and 6 times as much time checking
  site using the BSP as it did without. In the best case, the BSP routines
  were about as fast as the blockmap ones, so I took the BSP routines back
  out, because they offer no benefit over the Hexen code I had ben using for
  some time now.
- Fixed: Maps with starts for players 5-8 would trample over memory
  when saving the starts for those players.
- Added blood splats for instant hit weapons.

September 10, 2001
- Made alpha affect STYLE_Shade.
- Fixed: rt_shaded4cols sometimes drew texels too dark because it
  calculated the value of fill wrong.
- Fixed: Decals that used picnums (i.e. all of them) could not be flipped
  horizontally.
- Stopped using actors' memory locations as their phase shift for float
  bob motion. This works fine for single player, but in multiplayer,
  there's no way to ensure that the same actor will have the same phase
  on different machines. Now I use the random number generator instead.

September 8, 2001
- Added decal faders so that decals that are likely to bog things down
  (such as the plasma rifle's) can disappear sooner than if they wait for
  cl_maxdecals to be hit and get cycled out. [Edit: I only use these for
  special effect decals right now.]
- Added the ability for missiles to leave behind decals on walls.
- Fixed a sub-pixel alignment problem for vertically flipped sprites.
- Fixed: Adding bots and then changing the map could crash because the bot's
  "player" was still carrying around the actor from the previous level.
- Bumped the barrel respawn time back up to 1050 tics--forgot I had dropped
  it down to 50 for testing.
- Added support for loading sounds from RFF files so that I can have the
  Bloodbath announcer.

September 7, 2001
- Fixed: Dehacked patches that set weapons to ammo type 5 (what was once
  am_noammo) would use am_crossbow, because that is type 5 now.

September 5, 2001
- Fixed: Trying to alias a command through the .ini file would crash
  because the game would actually try to do it instead of giving a warning.

September 4, 2001
- Added the falling splat sound to A_PlayerScream().
- Changed skin semantics in AActor::SetState() again so that players can
  actually burn because the burn states use the FDTH sprite instead of
  the normal player sprite. Now, if the actor is not a player, or the
  player does not have a skin, or the state's sprite is not the same as
  the sprite the player was spawned with, the state's sprite will be
  used. Otherwise, the skin's sprite will be used.
- Fixed burning and icy deaths to not crash.
- Fixed a stack overflow in Heretic/Hexen that could happen after death
  because A_Chase and A_Look would repeatedly cause the other function
  to execute, ad nauseum.
- Added Hexen's Ice Guy/Ice Golem.
- The SkyboxViewPoint's angle is now used to adjust the yaw when drawing
  a skybox. This means you can rotate a skybox by rotating its viewpoint
  (which is courrently only possible with an actor mover and several
  overlapping interpolation points).
- Added simple Dolby Pro Logic surround support to s_sound.cpp using code
  from a post on the message board.

September 3, 2001
- Fixed: The alias command will no longer try to set or remove aliases for
  normal console commands.
- Fixed an error in C_RemoveTabCommand() that moved one extra name down
  at the end of the array.
- Added Hexen's Serpent/Water Lurker, Centaur, Demons, and mana.

September 1, 2001
- Reintroduced MF_CRASHED, this time as MF3_CRASHED, so that I don't need a
  special case to crash FireDemons that die on the floor.
- Added Hexen's FireDemon/Fire Gargoyle/Imp, just because it's been so long
  since I added anything from Hexen.

August 29, 2001
- Changed ADecal::StickToWall() to add decals to the end of the list so that
  new decals get drawn on top of old ones.
- Fixed: Actors with STYLE_None were still being projected to the screen,
  needlessly wasting time.

August 28, 2001
- Fixed: Quicksaving into an existing slot would rename the quicksave to the
  name of whatever was saved most recently instead of keeping the name
  of the quicksave slot unchanged.
- Fixed: PWADs that replaced sprite frames that originally only had a rotation
  0 with multiple rotations would only show the first rotation.
- Fixed: When the light to dark part of R_CalcTiltedLighting() clamped the
  end of the range, it set lightfiller to a value calculated with
  (NUMCOLORMAPS-1)<<FRACBITS. FRACBITS should have been COLORMAPSHIFT. The
  result was strange colors at best and crashes at worst.
- Fixed: Shuffling playlists crashed because I failed to clamp the result
  of rand() to the number of songs in the playlist. Whoops!
- Changed R_SetupFrame() so that the chasecam will only be used if the
  current camera has an image.
- Changed Win32 mouse grabbing so that when the mouse becomes ungrabbed,
  it will return to the same place it was at before being grabbed.
- Changed win32/i_input.cpp so that deactivating the window will pause the
  game if the player is not in a network game.
- Fixed Thing_Destroy to just hurt things enough to kill them instead of
  giving them 10000 damage like massacre does. (This is the way it is
  supposed to be.) For people who liked the accidental behavior, I added a
  second argument that can be used to enable the massacre-like effect.
- Fixed some entries to doomxlat.txt: Generalized floors and ceilings
  can be set to allow monster activation now. Changed the delays for
  generalized doors so that they more closely match the actual tic counts
  used by BOOM instead of rounding them to the nearest second.
- Fixed: Palette flashes were not carried over when creating a new frame
  buffer. Also fixed palette flashes being gamma adjusted multiple times
  whenever the framebuffer resources need to be recreated.
- Fixed: After adding 16 sprite rotations, the player setup menu showed
  the side view instead of the back view.

August 20, 2001
- Fixed: Sprite frames beyond P were always flipped.

August 18, 2001
- Fixed some sizes in Net_SkipCommand()--should elimate some out of sync
  errors.
- Reimplemented "give weapons" by having it silently spawn each weapon under
  the player and faking a touch so that the player picks it up. Similarly,
  the give command can now be passed actor names and will function like a
  summon that automatically picks up the item spawned.
- Changed Win32Video::GoFullscreen() and Win32Video::CreateFrameBuffer() so
  that they try harder to allow the game to continue without putting up an
  error. This is not tested very well, because I never had any problems with
  it. Hopefully it will work as desired.
- Changed DDrawFB::Update() and DDrawFB::Unlock() so that calling Update() when
  the LockCount is greater than 1 no longer bombs out with an error. Instead,
  it sets a flag that tells Unlock() to call Update() the next time LockCount
  would drop from 1 to 0. This allows Update() to be safely used as an Unlock()
  when the image on screen is desired to be updated but it cannot be
  guaranteed that there is only one lock on the surface.
- Changed R_SetupFrame() to not use floorz and ceilingz to clip viewz, because
  not everything that can be viewed through sets these. (Specifically, moving
  cameras do not touch them, and there's really no reason to bother setting
  them, because they're more for physics than rendering.
- New: DDrawFB::LockSurf() is not required to successfully lock the frame
  buffer. This should help computers where Alt-Tab did not work before (though
  I cannot test it myself, because I never had problems with it).
- Remembered why I didn't use DIK_PAUSE as the pause key. DirectInput support
  for the pause key is not universal, so I have to use the standard Windows
  messages to detect it. Moved KEY_PAUSE back to 255, where I had it before.
- Fixed: Quickload crashed if a game had not previously been quicksaved in the
  same session.

August 16, 2001
- S_StartSound() keeps track of the sound id passed to it before it
  follows links, so now S_GetSoundPlayingInfo() can use that to determine if
  a sound is playing or not without having to resolve links.
- Changed GrabMouse_Win32() to restrict the pointer to the window's client
  rect and not the window's entire rect so the user can't accidentally click
  buttons in the window's title bar while moving the mouse rapidly.
- WndProc() now catches WM_MOVE and WM_SIZE messages to better ease
  transitions to/from fullscreen when not using DirectInput.
- Fixed: The mouse was not being grabbed if DirectInput was selected with
  in_mouse. I just added "NativeMouse = true;" to the beginning of
  I_InitInput() to force I_CheckNativeMouse() to grab the mouse when it
  gets called.
- Fixed: A_CorpseExplode used the exploding actor as the base for CorpseBit
  frames and not the CorpseBit itself.

August 15, 2001
- Fixed: The wind sound in Hexen played wrong because it used
  S_GetSoundPlayingInfo(), which has no way of following sound links. And now
  that I have random sounds, I can't think of an easy way to make it work with
  those. Fixed it by adding S_IsActorPlayingSomething() and using that
  instead. Changed a few other places that called S_GetSoundPlayingInfo() to
  match.
- Fixed: Animating flats with an ANIMDEFS lump was broken.
- Fixed: The values returned by MakeKey() changed with each rebuild because
  I was using the address of get_crc_table() as the CRC table instead of
  actually calling the function to get the CRC table's location. Now klook and
  mlook hash uniquely without any need for twiddling the return value from
  the CRC routine.
- Changed falling damage so that it can't kill you if you have god mode on.
- Added the filterstarts mapinfo flag to enable filtering out player starts
  based on skill/gametype.
- Fixed: Redefining sounds with a random list (whether it had one before or
  not) would cause problems because I was still sorting the S_rnd array--a
  remnant from the time when random lists were found by using binary search
  on S_rnd instead of by following the sound's link field.
- Added the sv_ihatesounds cvar for people who think they should be able
  to shut up the BFG by landing on the ground. It forces all sounds to
  use channel 1 instead of their preferred channel.
- Changed crushing ceilings to not restart their sound sequences each time
  they reach the top or bottom of their path.
- Added a tag argument to S_StopSoundID() so that it only stops sounds in
  a certain group. For my purposes, a group is currently defined as "any
  sectors with the same tag." Actors do not utilise sound groups.
- Removed S_CheckSound().
- Added entries to DOOMX and HERETICX to make mirrors and slopes possible
  without using the Hexen map format. Also added some of EDGE's default
  linetypes for scrolling, translucency, and 2-unit floor raising.

August 12, 2001
- Changed the algorithm in W_LumpNameHash() and MakeKey() to a CRC32
  algorithm because it hashes better. The only problem was that using a CRC,
  klook and mlook both have the same CRC value, so I had to twiddle MakeKey
  a little to give them unique keys.

August 11, 2001
- Added support for sprite frames with 16 rotations ala EDGE. The assignment
  of rotations is the same as for EDGE: 1,9,2,A,3,B,4,C,5,D,6,E,7,F,8,G.
- Changed the music streamers to use FSOUND_Stream_Play3DAttrib because of a
  report that they were actually being positioned with snd_3d true. I can't
  use snd_3d under NT, where I do most of my development, so I don't know if
  it made a difference or not.
- Fixed music recognition so that wave files can be played as music.
- Fudged about with slope handling in AActor::RunThink and P_CheckSlopeWalk
  in an effort to let the player walk on some steep slopes that are not very
  far off the surrounding ground. It is a big hack. I do not like it.

August 10, 2001
- Fixed drawing of rotated, scaled, and sloped flats.
- Fixed: PCD_PRINTNUMBER did not update the stack pointer.

August 8, 2001
- Fixed drawing of scaled and sloped flats.
- Restored the default radius and height for AInvisibleBridge, since it can no
  longer inherit them from ABridge (which sets them at game start time).

August 4, 2001
- The alwaysfake modification for R_FakeFlat() did not work as intended, so I
  removed it. The changes Lee Killough made for MBF seem to be good enough.
- Added new Thing_Destroy semantics: a tid of 0 will kill all monsters in the
  level, just like the massacre cheat.
- Changed the friendly fire check in P_DamageMobj from (target != source) to
  (target->player != source->player). This is just so that voodoo doll damage
  cannot be reduced by turning on teamplay and changing teamdamage.

August 2, 2001
- Fixed: Items were respawning at the location where they were picked up when
  they should have respawned where the level author placed them on the map.
- Changed the criteria for executing thing death specials from MF_COUNTKILL to
  !MF_SPECIAL. Now you can give a barrel a special, and it will be executed when
  the barrel is destroyed.
- Added the print command to print a string from the string table.
- Added the contributed Italian translation.
- Fixed: OB_UNDEAD said "revevant" instead of "revenant".
- Added names for all the new keys I found when looking at the dinput.h from
  the DX8 SDK.
- Fixed: Bindings for kp= would not save in the ini file properly.
- Added rebind command to change the binding of the key that activated it.
  This is intended to allow the creation of generic sequential aliases. (That
  is, a series of aliases that do something, then bind a key to the next alias
  in the sequence.) Like this:
	alias dumb1 "echo one; rebind dumb2"
	alias dumb2 "echo two; rebind dumb1"

July 26, 2001
- Fixed the TMulScale<x> definitions for GCC.

July 25, 2001
- In I_InitSound(), A3D is no longer the default if snd_3d is true.
- Moved s_sfxvolume, s_midivolume, and s_musicvolume into their appropriate
  i_* files and integrated them with the functions they called. Also made
  their ranges uniform at [0.0,1.0].

July 23, 2001
- Added some more checks to p_setup.cpp to catch bad maps. In this
  case, the checks were added for ma_sincity.wad, which has two one-
  sided linedefs that have -1 as their front sector and will crash if
  you look at them.

June 8, 2001
- Fixed: Single files added with -file were recorded with their lump
  names instead of the file names so if they got closed, they could
  not be reopened.

June 3, 2001
- Finished TiMidity++ support for the Win32 version. It has two modes
  of operations: 1) Just play as normal. This only works if the sound
  card can play multiple wave streams at a time. 2) The default, have
  TiMidity output wave data through a pipe and use that to fill an
  FMOD stream. This will work with all sound cards and offers a little
  more control over the output. The only problem I could not figure out
  how to solve was how to make TiMidity quit (safely) when ZDoom wants
  it to without modifying TiMidity. The solution I ended up using was to
  have TiMidity start a thread that waits on a special named event and
  calls exit when the event becomes signalled.
    Ironically, the whole purpose of being able to use TiMidity for music
  was that it could provide better music support under Linux, yet the
  Linux side of things has not even been done yet. When I do write it, it
  should work fine with an unmodified TiMidity.

June 1, 2001
- Put back the "<type> operator *()" members of the different cvar
  classes because VC++ always uses a bitwise copy when passing a class
  to a varargs function EVEN IF THE COPY CONSTRUCTOR IS DEFINED. This
  means that something like printf ("%d", dmflags); will actually copy
  dmflags to the stack instead of just dmflag's value. To make it work
  as expected, you need to use printf ("%d", (int)dmflags);. Since
  printf ("%d", *dmflags); is more compact, I decided operator * is
  useful after all.
  I just hope the timidity cvars are the only ones I used with printf
  style functions. I did not see any others when I scanned the source,
  but that doesn't mean I didn't miss any. :-(
- Changed the name of the variable passed to cvar callbacks from "var"
  to "self" to make its use more obvious.
- Changed the "<type> operator *()" of the different cvar types to
  "operator <type> ()" so that fetching a cvar's value looks just like
  fetching any other variable's value.

May 30, 2001
- Added snd_midiprecache cvar so that people without GUSes can turn off
  the precaching.
- Fixed: snd_surround was ignored.
- Fixed: snd_reset turned off MIDI.
- Added assembly routines for the different r_detail settings.

May 28, 2001
- Fixed: LEVEL_SPECOPENDOOR opened the door at a speed of 8*TICRATE instead
  of 8*FRACUNIT, about 1872 times slower than it should have been.

May 26, 2001
- Fixed the positioning of y-doubled view windows and changed the x-doubling
  so that it works with the optimized column drawer and does not need the
  columnofs table.
- Fixed: M_FindResponseFile had a poor parser that considered lots of things
  to be white space that weren't and did not treat quotes specially. Now it
  uses essentially the same parser as the console.
- Fixed Heretic/Hexen wind specials so that they can apply even when an
  actor's current velocity is 0.
- Added MF3_NOBLOCKMONST flag to indicate which things can cross
  ML_BLOCKMONSTERS lines (because this is a better way than writing a
  special case for Heretic's APod).
- Removed MaxSpecialCross, since it isn't needed anymore.

May 25, 2001
- Fixed: ATreeDestructible's default list was missing the mass property.
- Added Hexen's falling damage code and made the two types of falling damage
  (ZDoom or Hexen) selectable from the level and dmflags. The dmflags falling
  damage selector can now be used to enable falling damage but not to disable
  it to avoid cheating in levels meant to be played with falling damage.
- Added a new dmflag (sv_nopassover) to make thing z-checking work as it
  did in Doom (that is, not at all, except for missiles).
- Fixed: Chat macros did not work because Windows sends WM_SYSCHAR instead of
  WM_CHAR when ALT is held down.

May 14, 2001
- Added decal groups and generators to DECALDEF.
- Fixed potential crash when defining decals with SpawnIDs.

May 3, 2001
- Added lightning scripts, which get executed whenever lightning strikes in
  a level.
- Added the OutdoorLightning sector special (197) so that skyboxes can
  flash outdoor (as opposed to indoor) lightning without fancy scripts.

May 2, 2001
- Fixed: When teleporting in a non-hub environment, the level's snapshot
  would stay around if the player had saved while in it. This was especially
  obvious if the player was moving to the same map he just left.
- Enabled key repeating in the menus.
- Added Hexen's lightning and fixed a bug in Hexen's code: It is not safe
  to assume that the number of sectors that lightning can apply to will
  remain constant through the level (thanks to ACS).

May 1, 20001
- Fixed: The SkyBox member of sector_t was not serialized.

April 26, 2001
- Fixed: When loading savegames, bobbing actors would have semi-random
  heights because they get loaded in a different memory address than they
  were saved at. The actor's address is used to determine its phase shift
  compared to other bobbing actors, so when the actor was restored there
  was no way to restore the original cycle. The solution is to take out the
  bob offset before saving and add it back in when restoring.
- Added some DrawChar functions to DCanvas.
- Fixed DCanvas::StringWidth() for high ASCII characters.
- Changed the arrangement of codes in ESpecialGUIKeys to document the
  standard ASCII codes in the range [1,31].
- Changed text color escape character from 0x81 to 0x1c, because 0x81 is a
  printable character (though most Windows fonts seem to leave it undefined).
- Added support for WM_CHAR messages (they get fired off as EV_GUI_Char), so
  now you can do all the standard Windows text manipulation stuff when typing
  text at the console or elsewhere.
- Fixed: Decals were being saved to savegames but were not restored properly.
  I think this was also causing crash problems after loading savegames.
- Changed mouse pointer hiding to change the cursor to an invisible cursor
  instead of changing its visibility. This is to ensure that it works
  correctly all the time instead of just most of the time.
- Removed testing for WM_ACTIVATE in the window procedure. Looking for
  input focus is what we really want to do where the window's active status
  was being checked.
- Got rid of I_Pause/ResumeMouse() and let the code in i_input.cpp decide
  whether or not the pointer should be visible.

April 25, 2001
- Changed action command handling so that multiple keys bound to the same
  action can coexist peacefully. That is, if you are pressing two keys bound
  to the same action and release one of them, the action will still persist
  until the second key is also released. This is like Quake.
- Added a check for key bindings to check if a binding contains the substring
  "bind". Only if it does is the binding copied before being executed.
  Previously, the command was always copied, even if it was unneccessary.
- Changed C_DoCommand()'s argument to a const char *.

April 24, 2001
- Changed command line handling for console commands so that argv and argc
  are not calculated until the first time they are needed.

April 23, 2001
- Added shuffle parameter to playlist command.

April 22, 2001
- Added playlistprev and playlistnext commands.
- Pressing F1 at the save/load menu replaces the comment with the actual
  file name of the savegame.
- Added GK_ entries for the function keys.
- Fixed: Quicksaving without saving/loading first crashed.
- Added reverse tab-completion to the console, when pressing Shift-Tab.

April 21, 2001
- Fixed: P_GiveAmmo() did not check userinfo.neverswitch before setting the
  pendingweapon.
- Got rid of P_GiveWeapon() and moved its functionality into AWeapon::
  TryPickup() and added some more AWeapon member functions just so that
  picking up a weapon with sv_weaponstay true will produce all the standard
  pickup feedback. This breaks the "give weapons" cheat, but you can still
  summon them, so how bad is that really?
- Changed P_GroupLines() to warn about lines that lack frontsectors instead of
  crashing.

April 20, 2001
- Fixed: In Heretic and Hexen, things are supposed to gib at negative half
  their original health.

April 17, 2001
- Fixed: It was possible to stand at the very edge of a steep slope and not
  fall off of it. It is still possible to "balance" by running away from the
  edge, but I think that will take more time to fix than it's work (especially
  if I really do go ahead and rewrite the level geometry collision detection.)
- Added in-air friction that depends on aircontrol: The greater aircontrol is,
  the more friction affects things. Only affects players.
- Made level gravity and aircontrol accessible through MAPINFO as well as ACS.
- Disabled migration of zdoom.cfg. Perhaps it is better to make a clean break
  from the old format than to try and import it if zdoom.ini is not found.
- Fixed: When the status bar face graphic changed and the status bar was
  scaled, only the area enclosing the new graphic was updated to the screen.
  It should update the entire face box.
- Fixed: When a dehacked/bex patch changed a level's name, the change was not
  reflected in the level infos, so it did not actually become visible.

April 14, 2001
- Modified S_LookupPlayerSound() to detect player sounds which were defined
  but did not have any valid lumps and automatically try again using male.
- Added storesavepic cvar.
- Added sorting to the savegame menus.
- Finally tested the savegame menus to make sure that they work with more
  save games than are visible and discovered that they didn't, so I fixed
  them so they do work.
- DCanvas::StringWidth() now knows about '\n' characters and returns the
  length of the longest line.
- Changed the savegame menus to display games saved with an incompatible
  ZDoom version so that the user has a more convenient means of deleting them
  than by opening the savegames in a hex editor to find out which version each
  one was saved with.
- Added "name" support to archives. Basically, names are just managed strings
  that allow duplicates to be stored by index instead of duplicating the
  string.

April 13, 2001
- Fixed: Particles were rendered as if they were being drawn to the main
  frame buffer, even when they weren't.
- Fixed: After deleting the last save game, the menu would think you still
  had a game selected and crashed if you tried to delete again.
- Discovered the problem with some of Tei Tenga's cameras: They have invalid
  heights that put them above/below the sector. Copied the viewz clamping
  from P_CalcHeight() into R_SetupFrame() to compensate. I don't know why
  they worked in earlier versions.
- Moved zvox.wad loading to happen after loading the IWAD. There are certain
  places where the IWAD is assumed to be the second wad loaded.

April 12, 2001
- Added a new game menu for Hexen that explains you cannot start Hexen from
  a menu yet.
- Made the names stored in DEHSUPP case-insensitive.
- Fixed: R_RenderViewToCanvas() did not lower the Heretic weapons to the
  bottom of the rendered area.
- Fixed positioning of the save/load menu titles and the save game cursor
  at high resolutions.
- Fixed: Many ammo types were derived from AInventory and not AAmmo, so
  they did not play the dedicated ammo-pickup sound.
- Fixed AAmbientSound::Activate() to check that the ambient sound assigned
  to it actually exists. If not, it destroys itself.
- Changed doomtype.h to use the ANSI <limits.h> instead of defining its
  own limits.

April 10, 2001
- Fixed: FindNextFileA() returns 0 on failure, which is the opposite of
  _findnext(), and I did not realise that when I changed I_FindNext()
  to use the Win32 API function.

April 9, 2001
- Made some code changes to allow for compilation with GCC again
  (specifically, Cygwin's GCC). Fixed a few latent bugs in the process,
  thanks to GCC's more stringent default warnings.
- Fixed: FHelperThread must have a virtual destructor, which might
  explain why I was having so much trouble with it before.

April 7, 2001
- Added r_drawtrans cvar to allow disabling the drawing of translucent
  things.
- Fixed: The stretched Doom status bar would not properly clear away the
  big ammo count when switching to a weapon that does not use ammo.
- Fixed: At certain screen heights, scaled status bars would not touch the
  bottom of the screen because of inaccuracy in the calculation of ::ST_Y
  in FBaseStatusBar::SetScaled().
- Added separate pickup sounds for health, armor, and ammo items.
- Improved sound link resolution in S_StartSound() so that regular sounds
  can alias player sounds.
- Reimplemented idmypos in a more useful manner.

April 3, 2001
- Fixed: DLevelScript::RunScript() sets TeleportSide according to its
  lineSide property instead of assuming that it is already set correctly.
- Fixed: ASectorAction::CheckTrigger() should set TeleportSide to 0 so that
  teleports always work.

March 29, 2001
- Added language cvar.
- Fixed: Float bobbing objects would warp to the floor when on a rising
  platform.
- Fixed: "Torque" should not be applied to float bob objects. (Hexen MAP11
  is a good example of why not.)
- Fixed: Spree messages should only be shown in deathmatch.
- Changed sound effect loading to try the sound as DMX format first instead
  of last. (FMOD was recognizing CHICPK2 in heretic.wad as some compressed
  format.)
- Made skins work with the new player sound system.

March 28, 2001
- Changed player sounds to exist separately from the main sound list (sort
  of). The generic player sounds (e.g. "*death") now exist as actual sound
  entries, but they only serve as a context for getting an index into a
  separate list of class/gender specific sounds which index back into the
  main sound list and provide the actual sound to play. This also reduces
  the total number of sounds that need to be registered. Several new SNDINFO
  commands were introduced to support this.
- Fixed: When the tomed phoenix rod ran out of flame, the weapon disappeared.
- Fixed: Intensity calculations in InitPalette() could overflow and cause
  the invulnerability colormap to be wrong.

March 27, 2001
- Made the Ambients array in s_advsound.cpp a list of pointers to
  AmbientSounds instead of a container of AmbientSounds, since the array is
  usually nowhere near full and just wasting memory.

March 26, 2001
- Fixed: Using sound names in a dehacked Thing section works again.
- Enhanced the soundlist command to show links and random lists.
- Added an overloaded Printf() that does not take a print level, but just
  prints at PRINT_HIGH.
- Added the $random SNDINFO command.
- Moved the template functions into templates.h and added the BinarySearch
  template function.
- Fixed: The spectre had sounds defined in SNDINFO, but its defaults didn't
  specify any sounds, so it used the demon's sounds instead.
- Implemented a suggestion from the message board to A_VileChase so that
  negative speed archviles do not run away from corpses.

March 24, 2001
- Fixed: Monsters following a patrol path would not have their reactiontime
  reset to 0 if they heard a player before seeing her.
- Fixed: Picking up a thing by walking over it would remove it from the
  blocklist and make it possible to walk into another thing near it, because
  the P_BlockThingsIterator would not find anymore actors in that block for
  that call.
- Tried making DThinker::Delete() private so as to enforce the "use Destroy
  with thinkers" rule, but it didn't work. If the object's constructor can
  throw an exception, the caller of new needs to be able to call delete in
  order to remove the partially constructed object. However, I did change
  the definition of DECLARE_STATELESS_ACTOR so that all actors have nothrow
  constructors (since they're not allowed to use a constructor), which should
  help reduce the size of a lot of the CreateObject()s.
- Split the Thinkers list into two in order to guarantee that every thinker
  will have a chance to think during the same tic when it is created.
- Fixed: A thinker that destroyed itself in PostBeginPlay() would block the
  ticks for all actors after it for that game tic.

March 23, 2001
- Fixed: Float bobbing was not properly centered around the object's "ideal"
  height.
- Added A_SPosAttackUseAtkSound(). This is the same as A_SPosAttack(), except
  it plays the actor's attack sound instead of being hardcoded to play
  "shotguy/attack". Now changing spider/attack in SNDINFO can have an effect.

March 22, 2001
- Wrote a fully-functional gccinlines.h compatible with GCC 2.95.

March 20, 2001
- Undid: When I made float bobbing work for variable heights, I started
  clamping bobbing objects to the floor/ceiling. Heretic and Hexen do not do
  this, so I stopped clamping them.
- Fixed: P_BloodSplatter() should only be called for Raven's games, not Doom.
- Changed sound ID 0 to mean "no sound" instead of -1.
- Changed actor default sounds from strings to IDs so that I don't have to
  worry about tracking a bunch of pointers when loading/saving games, because
  this information gets saved out now.
- Fixed: Midtextures on two-sided lines are not drawn if they pass too close
  to the player. What is considered "too close" was determined empirically.
- Fixed typo: Wizard's spawnhealth should be 180, not 100.
- Turned off monsters killing other monsters when the player is dead and
  the game is Doom.
- Added global ACS variables. These are like world variables, except they
  do not get cleared when moving to a new hub.
- Reduced the ACS stack size from 200 to 64.

March 19, 2001
- Added a list of needed wads to savegames.
- Moved the SAVESTRINGSIZE definition into version.h so that I can be
  sure all the files that use it use the same value. One file had it
  at 32, and the rest used 24, which was causing crashes when switching
  levels after saving a game.
- Fixed a Doom bug: If a boss eye tried to shoot a cube at a boss target
  with the same y-coordinate as itself, the game would crash with a divide
  by 0 because only the difference in y-coordinates was used to determine
  how long it would take for the cube to reach the target.

March 17, 2001
- Rewrote the save and load menus to support the new savegame features and
  to also support far more files than before.
- Fixed: The patch drawers in v_draw.cpp crashed with patches that had
  useless 0-length posts.
- Fixed: Sound sequence SS_CMD_END was being generated wrong.
- Fixed: Sound sequences with no current sound were archived wrong.

March 16, 2001
- Added screenshots to save games, ala all the Build games I've played.
  Also added comments that currently just indicate the time when the game
  was saved.
- Added R_RenderViewToCanvas() and rearranged r_main.cpp a little to
  accomodate it.

March 15, 2001
- Added page up/down support for long options menus (i.e. controls menu).
- Changed console paging keys: Ctrl-Home and Ctrl-End now move to top/bottom
  of console buffer, and Shift-PageUp and Shift-PageDown move up/down by
  pages.
- Fixed: Trace() picked PT_ADDTHINGS based on ActorMask instead of actorMask.
  The most obvious consequence of this was that hitscan weapons worked
  sporadicly with the chasecam on.
- Fixed: Backpack was only giving one of each ammo type instead of one clip
  of each ammo type.

March 14, 2001
- Added MBF "torque" to fix "The items that the monsters drop when they die
  sometimes float in the air (happens very often when the monsters die in
  stairs)." Although it does fix this, I think it looks goofy to see ammo
  clips go careening down the stairs at the beginning of MAP01. The better
  solution to this particular situation would probably be to adjust the
  pickupable items' radii to accurately reflect their physical sizes, but
  I fear that might make them harder to grab. Maybe if they were noclip?
- Fixed dumpmapthings command.
- Space tuning: Shrank FState from 28 to 16 bytes.
- Fixed spree and multikill messages to correctly display the killer.
- Fixed DPusher::ChangeValues() to properly convert from byte angles to
  fineangles.
- Added PROP_STATE_BASE to AMaceFX3's defaults, so that it gets the right
  death state.

March 11, 2001
- Changed bex string section handling to simulate old death messages
  (without %o and %k).
- Added support for international characters to the FFont class and also
  added some corresponding characters to zdoom.wad.
- Changed Heretic/Hexen font loading to use name plates like Doom fonts
  instead of FONTA/FONTB markers, because templates allow for gaps in the
  character set.
- Tweaked string loading so that variant-neutral strings are loaded before
  loading strings from any variant of the specified language.
- Toned down the alpha on BFG and plasma projectiles.
- Changed rocket explosions back to STYLE_Translucent.
- Fixed ADEF_SkipSuper handling, though I wonder if it wouldn't be better
  to rework the situations that use it, so it isn't needed at all.
- Fixed: Music for Doom 1 was wrong.
- Fixed: The cast finale was messed up.
- Fixed: The new actor members were not being serialized.
- Fixed: None of the new actor fields were being serialized.
- Fixed: The FState * serializer did not use TAutoSegIterator.
- Fixed: Dehacked monsters could be really slow, because monsters speeds
  are now fixed point but weren't before.
- Fixed: M_QuitDOOM() was not getting DOSY through GStrings.
- Fixed: Stringlist did not write out enough information in the name table,
  so FStringTable could not figure out which index belonged to which name.
- Fixed: String names were not loaded before using a bex string section.

March 9, 2001
- Added PCD_SETTHINGSPECIAL and its analagous Skull Tag special,
  Thing_SetSpecial.
- Added obituary messages for the Heretic monsters.
- Added %o and %k substitutions for obituaries, ala Unreal.
- Fixed: Player obituaries were not being displayed unless it was a player
  who did the killing.
- Extended SexMessage() to handle %o and %k.
- Fixed: tmfloorsector was being calculated wrong, which could cause
  problems moving around in slopy areas.
- Replaced all the DivScale30() calls in WallMost() to SafeDivScale30().

March 8, 2001
- Wrote support for the string tables into the game, which shrank it 28k
  (but only because the text data got moved into the wad).

March 7, 2001
- Wrote a tool to compile localized string tables.

March 5, 2001
- Fixed: PTR_TraceIterator expected to be able to cross closed sectors. That
  is, when it stepped across a two-sided line, it assumed that the next line
  in sequence would belong to the sector it had stepped into.
- Fixed: P_SightTraverseIntercepts() needs to set up openbottom and opentop
  before calling PTR_SightTraverse so that the results of P_CheckSight()
  are always defined.
- Fixed: Using include in bex patches caused the DehSupp data to be freed
  prematurely.
- Got the code to fully compile again with default lists. The executable is
  only 104k smaller than before (I had hoped for something more dramatic),
  but at least now it only takes one minute to link the release build.

February 28, 2001
- Changed the console command implementation so that new commands do not
  require subclasses (and all the function overhead that goes with them).
- Finished building default lists for every actor.

February 27, 2001
- Began the tedious process of converting to actor default lists.
- Simplified the IMPLEMENT_CLASS macros to not require the parent type
  because that information can be derived thanks to the DECLARE_CLASS macros.
- Removed the distinction between serializable and non-serializable DObjects
  so only objects that do some specific serialization actually need
  Serialize() methods.
- Fixed: Teleport_EndGame works again.
- Added WALLF_NOAUTODECALS flag to sidedefs, so certain lines will not
  get impact decals (bullet holes) on them, specifically: scrolling walls.
- Increased the precision of P_InterceptVectors so that it can handle longer
  lines.

February 26, 2001
- Added limitpainelemental cvar to control whether or not Pain Elementals
  will limit their attacks based on the number of Lost Souls in the level.

Feburary 24, 2001
- Fixed some class serializers that did not call their superfunction.

February 23, 2001
- Changed P_DropItem() so that negative special values will not be stored in
  the item's health field. This is primarily to support exoteric DeHackEd
  patches, as it doesn't matter under normal circumstances.

February 22, 2001
- Removed the ClassInit class, and made TypeInfo constructors register
  themselves, saving around 20k.
- Fixed: Places that use P_SpawnMissile() and then manipulate the missile
  somehow now check for NULL returns.
- Fixed: AMovingCamera::Serialize() did not call its superfunction.
  This is an oversight I keep making, so I added some code to DObject and
  FArchive to look for this error.

February 20, 2001
- Fixed: Normal skies did not reflect in mirrors, and sky boxes mostly failed
  to be drawn at all in mirrors.

February 19, 2001
- Added PCD_PUSHBYTES and PCD_PUSHxBYTES p-codes to ACS, since PCD_PUSHBYTE
  was a fairly common sequence.

February 17, 2001
- Made G_DoLoadLevel() remove any existing HUD messages.
- Made BLOCKMAP lumps optional (sort of--the lump still needs to be there,
  but it can be length 0).
- Rearranged P_SetupLevel() so that a map's behavior is loaded before
  anything else (in order to make enter scripts work when a map is just
  loaded).
- Changed I_RegisterSong() to not bother loading a song if -nomusic.
- Added support for these Skull Tag script types: Death, Enter, and Respawn.
- Added cl_showsprees and cl_showmultikills cvars.
- Fixed: A_Look made stealth monsters visible.
- Fixed: BlurSphere needs to be STYLE_Translucent for the pulse to be
  visible.
- Fixed: StealthDemon was STYLE_Add instead of STYLE_Translucent.
- Fixed: Col2RGB8_2 needs to have cover most entries from Col2RGB8, not just
  half of them..
- Fixed: Net_SkipCommand() was still calculating the length of
  DEM_SINFCHANGED based on the old semantics.
- Changed startup command processing again. Now, all commands are processed
  at once, but ones considered "not safe" to be executed before everything
  is set up will have their execution delayed.

February 15, 2001
- Changed autoexec.cfg parsing to be similar to command line parsing.
  All sets are run as soon as possible, then other commands are executed
  later after all the subsystems are initialized.
- Changed BEGIN_CUSTOM_CVAR/END_CUSTOM_CVAR pair to CUSTOM_CVAR.
- Changed BEGIN_STAT/END_STAT pair to ADD_STAT.
- Changed BEGIN_COMMAND/END_COMMAND pair to CCMD.
- Added detection for Windows 2000, so the sound code will default to
  DirectSound under that OS instead of WinMM.

February 12, 2001
- Changed Die for missiles set as shootable so that they explode instead
  of doing a regular death.
- Changed MF2_FLOATBOB handling to not use health or special1. (So now
  it works with monsters.)
- Sorted the list of skins for a more user-friendly experience in the
  player setup menu and to make R_FindSkin() faster.
- Removed all traces of COM_Parse().
- Added support for ACS scripts that store p-codes and certain other values
  in bytes instead of dwords. This can offer considerable space savings.
  Also tweaked the interpreter to help keep the program counter and stack
  pointer in registers.

February 11, 2001
- Fixed: I_ShutdownMusic() should call S_StopMusic() so that the general
  sound code knows the song no longer exists. Having it free the song itself
  could crash if the game lost and regained focus while quitting.

February 8, 2001
- Added Anubis cheat.
- Really fixed rotated flats on sloped planes. The previous fix only affected
  floors at certain angles and did nothing for ceilings.

February 5, 2001
- Fixed: FPS meter with vid_fps was always 0.
- Fixed: Tilted floors/ceilings did not rotate properly.
- Fixed: Mirrors did not reflect slopes properly.
- Changed P_ProcessSwitchDef() so that not specifying a game name is the
  same as specifying "any".
- Fixed: Typo in zdoom.animdefs prevented SW1STRTN/SW2STRTN from switching.
- Fixed: -iwad did not work with wads that included a path.
- Tweaked P_TestActivateLine() so that only actual missiles will be promoted
  to activate player cross teleports.
- Did away with I_SetGUICapture(). It was too prone to error. Now the input
  code checks what kind of events it should generate each time I_StartTic()
  is called.
- Fixed: "Screenshot" mis-spelled as "screeshot" in controls menu.
- Fixed: The cursor in the option menus was one pixel too low.
- Fixed: Standard automap colors were all black if the game was started with
  am_overlay set to true.
- Fixed a typo in P_CheckKeys() that prevented the yellow skull and cards
  from being equivalent for 3-key doors. While I was at it, I rewrote the
  function, although it's still not what I would consider very readable. :-(
- Removed cheat-changing Dehacked support.
- I think I've got the problems with changing a thing's MF_SHADOW bit with
  Dehacked worked out now.

February 3, 2001
- Added "Alpha" and "Render Style" lines to Thing sections of dehacked
  patches.
- Fixed: Changing a thing's doomednum with dehacked would not update the
  DoomEdMap hash table, so it would have no effect.
- Fixed: Changing a thing's doomednum also changed its scale.
- Fixed: Modifying a hanging ceiling thing with dehacked would usually not
  reset the height to its Doom default. (Was using sizeof(OrgHeights)
  instead of NumOrgHeights.)
- Changed actor's translucency variable to alpha to reflect that it
  controls the alpha value for more than just translucency.
- Centralized column drawer selection to make adding more render styles
  in the future more convenient. The function is R_SetPatchStyle(). The
  selection of fg2rgb and bg2rgb has also been moved out of the various
  column drawers and into R_SetBlendFunc() so that they can be more
  generalized. What was a translucent column drawer is now blending without
  clamping, and what was an additive column drawer is now blending with
  clamping. Their names have been changed to reflect this.
- Changed WallMost()'s frac bits back to 30, but now it uses SafeDivScale.
  Now it should never crash there.
- Fixed: -playdemo did not like to use files in other directories.

February 1, 2001
- Fixed: Particles would not draw properly if a mirror was visible.
- Fixed: Viewing decals in mirrors could crash because PrepWall() only knew
  about non-mirrored surfaces when it clipped the lwall values.
- Changed the number of frac bits in WallMost() when clipping a line to 28
  instead of 30 to (better) avoid possible integer overflow.
- Fixed: Hub travel would hang when visiting a previously visited level.
- Got rid of linear.nas. It was only there to try and make things better for
  486s, and as I care even less about 486s now, there didn't seem to be much
  point in having it around wasting space in the executable.
- Removed RF_FORCECENTER renderflag and added a new RenderStyle actor member
  that's used to specify the render style instead of renderflags. Some
  styles are just aliases to other styles based on cvars (r_drawfuzz and
  transsouls), and others are styles that specify drawing. I also added a
  new style: STYLE_Add (additive blending) and made many of the DOOM
  projectiles that I had previously made translucent use it instead.

January 30, 2001
- Fixed xtoviewangle generation in R_InitTextureMapping(). (It was phase
  shifted 90 degrees)
- Removed R_ScaleFromGlobalAngle(), rw_distance, rw_angle1, and
  rw_normalangle.

January 27, 2001
- Fixed: Things made fuzzy with dehacked appeared no different when
  r_drawfuzz is false, because they also need to have their translucency set.
- Set the default for vid_bufferarea to 0, because large translucent areas
  suddenly coming into view (such as firing the BFG) can cause a very
  noticeable slowdown. I may take out the support for unbuffered output
  entirely.
- Fixed: Demons in nightmare mode would end up with 0 tic chase states.
- Fixed: A_BFGSpray() was using the player's autoaim setting for finding
  things to spray.

January 19, 2001
- Fixed some text prompts (e.g. "Do you want to quit?") so that they properly
  release the input code from GUI mode.
- Fixed ABossEye::Serialize() and DBrainState::Serialize().
- Extended Dehacked thing sound replacements so that you can use any sound
  defined in a SNDINFO lump.
- Fixed Dehacked thing sound replacements -- a 0 sound index means "no sound"
  and should not be treated as an offset into the sound list.
- Fixed translation table selection in R_ProjectSprite when using flags to
  specify a translation.
- Fixed HeadsOnAStick to be solid.

January 18, 2001
- Added some invisible bridge things.
- Fixed the sky around the tunnel in E1M1.
- Fixed P_DrawSplash2 not centering splashes around their point of origin.
- Fixed assignment of codepointers in [CODEPTR] sections of bex files.

December 24, 2000
- Added the firstvissprite and firstdrawseg variables so that I can restrict
  the vissprites and drawsegs drawn in skyboxes without changing their base
  pointers, which could move when they get realloced.

December 19, 2000
- Fixed Ceiling_LowerByValue acting like Ceiling_RaiseInstant.
- Fixed game grabbing the mouse during startup when the IWAD dialog
  is shown.
- Fixed dmflags not changing in gameplay menu.
- Fixed standard Doom colors not showing up on automap if the game was
  started with am_usecustomcolors 0.
- Fixed demons moving very slowly in nightmare mode.
- Fixed dehacked patches not setting bright frames properly.
- Fixed dehacked patches that change the player sprite's name.
- Fixed dehacked patches setting a thing's fuzzy property.
- Moved lots of supplementary dehacked data into zdoom.wad so that it's
  only in memory when it's needed.

December 18, 2000
- Fixed my sidedefs decompressor so that it works with maps that have
  unused sidedefs. As a consequence of this, the ordering of sidedefs in
  memory may be completely different from their ordering on disk.
- Fixed P_LoadSectors() to clamp each sector's light to the range [0,255]
  instead of ignoring the high byte stored in the wad.
- Fixed rendering of shaded decals when the light amp is on.
- Fixed the generation of the shading tables in R_InitTranslationTables() to
  not create values > 64.
- Gave spawnids to some things that were missing them.
- Reduced the default for vid_bufferarea to 6000.
- Reread the description of the SAL/SAR/SHL/SHR instructions. The OF
  flag is undefined for shifts other than 1--not unchanged. Rewrote
  the stretchers in blocks.nas to correct for this. On my Pentium II,
  the OF flag is left unchanged, so I got the desired result, but
  other processors can change it. :-(
- Added back triple buffering, because double buffering can be
  (but is not always) significantly slower.
- Fixed up the sound code for the new FMOD 3.3 API.

December 15, 2000
- Fixed fourth and fifth episodes not appearing in the menu for the
  extended Heretic IWAD.
- Reorganized DCajunMaster::WhatToGet() so that Reachable() is called
  less often.
- Fixed multikill messages appearing for everyone and not just whoever
  got it.
- Divided thinkers into thinking and non-thinking classes. By default,
  a FThinkerIterator will not iterate through non-thinking classes.
  Those must be specified explicitly. Made the decals non-thinking so
  the think code doesn't waste any time on them.
- Fixed bots not being able to spawn in deathmatch mode if there are
  not enough coop starts.
- Added support for compressed SIDEDEFS lumps.
- Made the splash bases MF_NOGRAVITY so that they stay at the surface
  of BOOM deep water instead of sinking into it.
- Made splashes work as expected in sectors with the BOOM deep water
  effect (and set as a water zone).
- Fixed positioning of weapon sprite. (Was one pixel too high.)
- Fixed vertical aiming on railgun being swapped.
- Fixed SUBCLASS_NS macro in a_doomdecorations.cpp. It was using radius
  as the height.

December 14, 2000
- Fixed lines not being considered for rendering when at least one side
  is sloped but the heights on each side of the line are identical at
  both ends.
- Fixed physics and rendering of non-horizontal slopes. They were both
  messed up because I had been subtracting b*y in the ZatPoint
  calculations when I should have added it. Clipping the right edge of
  non-horizontal slopes to the screen was also wrong because I was
  subtracting from x instead of y for the y component of the point
  intersecting the screen.
- Fixed automap being all black when am_usecustomcolors is false.
- Updated Heretic status bar for unbuffered output.
- Stopped creating the primary surface as a complex flipping surface so
  that I can set colors 0 and 255 under NT.
- Made the video code better able to cope with different surface lost
  conditions.
- Fixed alt-tab killing the program by listening to WM_ACTIVATEAPP and
  forcing buffering (that never gets flushed to the screen) when the app
  goes inactive.
- Moved the palette change to occur immediately after the page blit.
- Fixed GUI capture being lost when the demo cycle returns to the title 
  screen and the menu is active.
- Fixed being able to get stuck in the edges of sloped ceilings. In
  PIT_CheckLine(), I was using the actor's current position instead of its
  desired position to calculate the nearest point on the line.
- Fixed skyboxes so that sprites seen through multiple visplanes are visible
  in all the visplanes and not just the first one.
- Made a bunch of changes to slope walking to try to make walking along the
  very edge of a slope work better. This included adding a floorsector field
  to AActor that records the sector that the floorz field came from.
- Changed the nearest point on line calculation in PIT_CheckLine() to use
  floats, because ints aren't large enough for the intermediate calculations.
- Changed S_StopSoundID() to not stop sounds with the same priority.
- Fixed normal mace balls so that they fall down after some distance.
  Apparently, in Heretic MF2_LOGRAV has precedence over MF_NOGRAVITY.
- Fixed sky boxes so they are not lit by extralight.

December 13, 2000
- Fixed image collections not remapping any instances of color 0 in a patch
  to a different color. This was most evident in the multiplayer status bar
  where the background could be seen through the player's eyes and eyebrows.
- Made normal skies work with animations found in an ANIMDEFS lump.
- Made screen melts work by forcing them to use buffered output.
- Reimplemented screenshot command.
- Changed DCanvas::Dim() to read and write four pixels at a time so that
  the first frame dimmed before buffering is forced only takes about 1/4th
  the time to draw as it would if single pixels were read and written.
- Made shaded and fuzzy decals count toward transparent area.
- Fixed not being able to pick up a Megasphere if your armor is already full.
- Fixed Dehacked patches not being able to clear a frame's fullbright
  property.

December 12, 2000
- Renamed zdoom.cfg to zdoom.ini so that old versions can coexist in the
  same directory as this one with less hassle.
- Reimplemented decals.
- Changed the player setup menu to use number instead of named teams.
- Fixed stack overflow caused by floating point imprecision when setting
  turbo out of range.
- Fixed DGlow not working properly because lightlevels are now unsigned.
- Fixed the second DScroller constructor not setting m_vdx and m_vdy.
- Changed R_SetDefaultColormap() to look in the colormaps namespace before
  looking in the global namespace.
- Fixed fade MAPINFO command not working.
- Fixed picking up the green armor showing the generic pickup message.
- Fixed massacre cheat to not let pain elementals spew out lost souls upon
  their death. This also fixes massacre from crashing if the dead lost soul
  was patched to actually stick around in a map.
- Separated AGibs into ARealGibs and AGibs. ARealGibs is what gets spawned
  automatically when something gets crushed. AGibs is what gets spawned when
  gibs are explicitly placed on a map.
- Fixed C_BackupCVars() recording the specific value of a cvar instead of
  making a copy of that value.

December 11, 2000
- Fixed generic ceilings with texture/type changes from using model floor
  sectors instead of model ceiling sectors if they had type raise to highest
  ceiling or type lower to highest ceiling.
- Fixed elevators.

December 9, 2000
- Made old Doom level translation programmable through the use of simple
  precompiled scripts that the game loads from a wad.

December 6, 2000
- Restored Doom's original 50-element fuzzoffset table and rewrote the
  fuzz drawers to accomodate it while still using as few branches as I
  thought reasonable.

December 5, 2000
- Got the display mostly up and running again without PTC. The new design
  allows for automatic switching between buffered and unbuffered modes
  based on how many transparent pixels were visible in the previous frame,
  similar to Build. Unlike Build, the cutoff is always a specific amount
  of pixels (cvar-controlled) instead of one-eighth the total area of the
  screen.

November 28, 2000
- Removed the use of PTC and returned to my rudimentary DirectDraw support.
- Got rid of all the funky multiple palette handling stuff in v_palette.cpp.
  Paletted textures haven't been realized yet, and if they ever are, the way
  I had things set up probably isn't the way to utilize them.

November 25, 2000
- Fixed BossTargets automatically destroying themselves.
- Got rid of the global brain state and moved it into a thinker that gets
  spawned if any BrainEyes are present on the level.
- Made PIT_RadiusAttack() calculate damage based on distance from the
  thing's bounding cylinder instead of its center point.
- Made thinkers use Exec-style lists because of their simple insertion and
  deletion code.
- Made R_TextureNumForName() return 1 instead of 0 for missing textures so
  levels that lack textures are easier to navigate.
- Changed ADecal's doomednum to 9200 to deconflict with Hexen coop start 5.
- Created an MMX version of the color picker routine. Building a fade table
  with it is about 15% faster than with the straight C version. Not exactly
  a stunning speed increase, but on slower machines, the speedup should at
  least be slightly noticable.

November 24, 2000
- #ifdef'ed out most of the FColorMatcher class. Too many colors are
  visibly off when building fog with it. :-(
- Simplified the calculations in DoBlending() and created an MMX version.

November 20, 2000
- Implemented Scroll_Floor and Scroll_Ceiling specials for ACS scripts.
- Fixed drawing of masked midtextures that are used as special effects (i.e.
  invisible platforms).
- Updated R_AddLine() to only treat as solid two-sided lines if the upper or
  lower tier (whichever is appropriate) actually has a texture.
- Made doors close to the current floor height instead of whatever the floor
  was at when the door started lowering.
- Rearranged P_DoCrunch() somewhat so that non-shootable things do not block
  moving floors/ceilings. (Same behavior as Doom.)
- Fixed model sector changes in EV_DoFloor() and EV_DoCeiling().
- Added mdk command to kill whatever the player is aiming at.
- Added the BOOM fix to getNextSector() so that lines that have the same
  sector on both sides and are also part of the sector will not return
  that sector.
- Fixed PathFollower not initializing PrevNode and CurrNode when it is
  spawned.

November 18, 2000
- Added per-sidedef lighting control. Also added two new mapinfo fields
  (vertwallshade and horizwallshade) to control the relative light of
  vertical/horizontal walls with the sectors. Evenlighting is now obsolete.

November 17, 2000
- Added a new thing (SectorSilencer) to prevent actors from making noise in
  specific sectors, in case anybody wants to use noisy actors in their
  sky boxes.
- Fixed skyboxes to draw all visplanes with a skybox and not just the first
  one.
- Added tilted floor physics. Actors can walk around on floors with slopes
  as large as 45 degrees. For anything steeper than that, they slide down.
  Monsters will treat steep floors like drop offs and avoid getting on them.

November 16, 2000
- Added a bForceSlide parameter to P_XYMovement() to force actors to slide
  against walls when blocked, even if they don't specify MF2_SLIDE. This
  allows for better operation of conveyor belts with corners.
- Fixed volcano sounds in Heretic.
- Revised carrying sectors again. Removed sc_carry_players. Each thing
  checks the sectors it is standing on to see if they have any carry
  properties. If they do, it adds those values to its momx and momy.
  Thinkers are still used to set the carry properties, which are reset
  to 0 at the beginning of each tic. In order to make sure all carry
  properties have been set before any actors think, I introduced the
  concept of statnums for DThinkers ala Build. DScrollers have lower statnums
  than actors, so they all get executed before actors.
  All carriers for a single sector are cumulative. If an actor is straddling
  multiple sectors with carry properties, then those properties are averaged.
  (X and Y components are averaged separately.) This should give the best
  compromise between BOOM carry behavior and realistic behavior at sector
  boundaries.

November 15, 2000
- Made A_WaterfallSound() and A_WindSound() play looped sounds.
- Fixed spelling error in SNDINFO: Heretic's waterfall sound is
  waterfl, not watrfl.
- Changed P_ActivateLine() to call P_TestActivateLine() and changed
  P_TestActivateLine() to allow missiles to activate regular teleporters.
  This is neccessary for the Mace's Death Ball.
- Took the momz and tics setting out of P_SpawnPuff(). It is the
  responsibility of the spawned puff to set these things as desired. I had
  meant to do it a long time ago but forgot all about it.
- Changed deferred scripts to remember the player who triggered them.

November 14, 2000
- Removed the code for F*CVar::GetRealType() from c_cvars.h and moved it
  into c_cvars.cpp. Virtual inline functions are not inlined and cause the
  function to be generated for every source file the class is used in.
- Fixed bug with Transfer_CeilingLight special. I was or'ing CeilingLight
  with SECF_ABSLIGHTING instead of CeilingFlags.

November 11, 2000
- Slopes don't work in mirrors. :-(
- Removed the viewangletox table and rewrote R_InitTextureMapping() to
  generate xtoviewangle without it.
- Added support for per-skybox control of visibility.

November 10, 2000
- Implemented sky boxes. Total time: ~40 minutes. :-) Should probably test
  it some more, though.

November 9, 2000
- Fixed a sprite clipping bug at the right edge of mirrors.

November 8, 2000
- Reimplemented mirrors.
- Improved positioning of masked mid textures.

November 7, 2000
- Increased the fractional precision of swall calculations.
- Removed all references to Doom's light tables.

November 6, 2000
- Moved the lighting calculation out of the main loop in R_MapTiltedPlane()
  (and its assembly equivalent) into a separate function, since it can now
  be linearly interpolated. This does away with the use of CMOVs in the
  assembly code, so now I won't need to write a non-CMOV version of it. It's
  also somewhat faster, especially in the non-assembly version.

November 3, 2000
- Tweaked the brown color range for console fonts to actually look brown.
- Generalized FFont::BuildTranslations() some so it's not so big. Did the
  same for the FConsoleFont version.

November 1, 2000
- Got the tilted plane lighting working without the LUT in 320x200. Also
  removed the divide from the nontilted version.

October 31, 2000
- Got the plane light calculation without using zlight to match the light
  when using zlight (aside from the finer gradiation). Woohoo! Now to get
  rid of the divide...
- Fixed creation of large (>64k) blockmaps. Also replaced the Boom version
  of P_CreateBlockMap() with the MBF version.

October 17, 2000
- Tried to remove the use of the zlight lookup for plane mapping, but I'm
  having a hard time actually duplicating its results. (Nevermind that I
  should be able to derive the properly formula without difficulty...)
- Noticed distant sprites were way too jumpy. At first, I thought it was
  because I was only using 8 bits of precision, so I temporarily upped it
  back to 16 bits, and the problem persisted. It was caused by calculating
  1/z in R_ProjectSprite() (as a fixed 16.16) and multiplying by that.
  Dividing by z instead fixed the problem.

October 16, 2000
- I think I have all the sector movers set to properly handle tilty areas.
- Set P_SpawnDoorCloseIn30() and P_SpawnDoorRaiseIn5Mins() to set the
  thinker's m_BotDist.
- Upped the fractional bits of precision for view space coordinates to 12.
  This drops the upper FOV limit to ~172.8.

October 10, 2000
- Fixed pillar floors using the ceiling plane for calculations.
- Changed P_Thing_Spawn() and P_Thing_Projectile() to only set MF_DROPPED
  for special things, so spawned monsters can be crushed to gibs.
- Added carrymomx, carrymomy, and carrycount members to AActor. DScroller
  now effects these rather than momx and momy. Slow scrollers work now,
  and there's no possibility of drift caused by friction.
- Changed earthquake behavior to match Hexen's.

October 9, 2000
- Added Unreal teleport zoom effect controlled by the telezoom cvar.
- Reduced the renderer's precision along the (x,y) plane in view space to
  8 bits of fractional precision in order to accomodate large FOVs.

October 7, 2000
- Fixed lighting to not vary with different FOVs.
- Changed the initialization of finetangent to not phase shift the table,
  as I did previously for finesine.

October 6, 2000
- Added support for panning, scaling, and rotating of tilted flats.

October 5, 2000
- Added FloorLight and CeilingLight members to sector_t. Changed
  Transfer_FloorLight and Transfer_CeilingLight to use a thinker to copy
  light levels over to these fields.
- Fixed serialization of sectors: The ceiling's xoffs was stored twice
  instead of storing both xoffs and yoffs.

October 4, 2000
- Added back the "too far off side?" check to R_ProjectSprite(), since
  sprites are now projected into a view space with a constant 90 degree FOV.
  Also added a test for sprites above/below the screen. This test is
  different from Lee Killough's test in Boom, which I never managed to get
  working right with freelook (not that I tried very hard, either...).

October 2, 2000
- Added an optimization to R_AddLine(): 2-sided lines that cannot be seen
  past because their openings are off-screen will be marked as solid.
- Changed the pointers in drawseg_t to ptrdiff_t so the "fun" stuff in
  R_StoreWallRange for expanding the openings array and adjusting
  pointers is unnecessary.
- Did the changes I talked about on September 23, except the calculations
  are still associated with R_StoreWallRange() so they don't need to be
  performed if the wall is entirely clipped (but they only get done once
  per wall, no matter how many ranges it gets clipped to).

September 27, 2000
- Moved wall texture calculation (i.e. prepwall) back to floats, just to be
  safe as far as integer overflow goes.

September 26, 2000
- All right, I've caved in. I'm now using some Build code. Build already does
  everything necessary for good quality rendering, and it seems a shame to
  needlessly duplicate all of Ken's work.

September 23, 2000
- After trying to get slopes to look nicer, I have come to the following sad
  conclusion. Clipping walls into pieces and then doing all the drawing
  calculations in R_StoreWallRange() is not the way to go when you have
  slopes, since all fractional precision is lost at the edges of the
  drawsegs, making an accurate calculation of (x,y) for slope calculations
  impossible. So my plan for now is: Move most of the functionality of
  R_StoreWallRange() into R_AddLine(), and leave R_StoreWallRange() around as
  a function that just creates drawsegs and calls the texture mapping
  routines.
- Made solidsegs a fixed-size array that is big enough. (It was not actually
  growing before, so it might as well have been fixed!)

September 21, 2000
- Fixed C_WriteCVars() so that it doesn't delete the strings it gets
  using GetGenericRep().
- Reduced the FOV range to [5,175] to combat integer overflow with extreme
  values.
- Removed excess precision from texturecolumn calculations in BlastColumn,
  since it was overflowing occasionally.

September 20, 2000
- Removed the offset field from r_segs, as it is no longer necessary. (Walls
  are now mapped based on their linedefs, not their individual segs.)
- Bumped the wall mapper down to only 4 bits of fractional precision. The
  results look just as good as floats, and don't overflow so easily--a wall
  15296 units long didn't overflow. (I didn't check any longer, since walls
  that long are highly unlikely to occur in any Doom map, because the
  original Doom engine would render them with horrible jitter.)

  In the process, I decided to go the Build route and give walls a texture
  width (the number of texels that fit across the wall). When arbitrarily
  moveable walls are implemented, I think it will be more useful to maintain
  a constant spread of texels across a wall than to maintain a constant
  texel width. Without moveable walls, this approach just makes diagonal
  walls align nicer.

September 19, 2000
- Swapped the meanings of the m and n vectors for the wall texture mapper
  and got the correct vectors to use. Unfortunately, under most
  circumstances, they generate values too big for 16.16 fixed point.

September 18, 2000
- Changed R_RenderBSPNode() to check against the bbox for front nodes as
  well as back. Must remember to be on the lookout for drawing errors this
  might cause, since the old R_CheckBBox() was too inaccurate for this.
- Tried to change wall texture mapping to use the same "magic" vectors that
  I use for tilted planes, but I don't trust the vectors I derived: The
  u/z vector depended on (x,y), but v/z depended only on x, just the opposite
  of what it should be.
- About the adjacent wall problem, that was caused by a subsector with a
  single seg viewed almost head-on. Changing R_CheckBBox() to use the same
  transforms as R_AddLine() fixed the problem.
- Fixed some bad cases for my clipping code in R_AddLine(). Although I had
  already used it in my prototype engine with several Build maps, I found
  problems in Doom2 MAP02 that needed fixing.

September 16, 2000
- Changed wall projection in r_bsp.cpp to use more standard 1/z perspective
  projections instead of polar coordinates and got the desired result: no
  more excessively jiggly walls. Now I need to do it with the wall texture
  mapper, so that wall textures don't jiggle either. One minor problem:
  Adjacent walls can sometimes be one pixel apart. (Why?)

September 13, 2000
- Added the 181 special to slope floors/ceilings at two-sided walls.
- Fixed sporadic rendering problems with masked mid textures caused by
  not ensuring sprflipvert was false.
- Added "world" as a valid ambient sound type, for consistancy with the
  other types. Ambient sounds without a type specified still default to
  world.
- Change P_AimLineAttack() to return a pitch instead of slope. It also
  returns the actor's pitch instead of 0, if nothing to aim at was found.
  Also changed it to be responsible for limiting the player's autoaim,
  since this is a more logical place than in the routines that call it.
  This simplified P_SpawnPlayerMissile() and P_BulletSlope().

September 12, 2000
- Created a generic Trace() function.

September 11, 2000
- Finished the assembly plane drawer. Or, rather, the Pentium Pro and higher
  version, since it uses CMOV instructions.
- Things to do:
    Create a Pentium version of the plane drawer.
    Create a trace function that knows about planes and replace all the
	 redundant code in the different traversal iterators.
	Fix the bots so they understand planes.
	Fix movement code so that planes are treated as planes and not as a
	 bunch of discrete steps.

September 9, 2000
- Started work on the assembly plane drawer. It's your standard subdividing
  affine mapper using the overlapped FDIV trick, but with Doom-style lighting.
  It's about four times faster than the previous C version, and at high enough
  resolutions, it's even faster than the wall drawer. But it's not complete:
  It doesn't draw incomplete subspans at the end of a span.

September 6, 2000
- Made some optimizations to the plane renderer. It now runs nearly 13 times
  faster than before (in the debug build). Adding some inline assembly to
  R_MapTiltedPlane() to convert floats to ints (instead of using (int) to
  cast it) sped it up to 20% of its original time. Most of the rest was
  achieved through the standard technique of splitting it up into spans and
  using affine mapping for those spans. Interestingly, in the debug build,
  the span-based approach is only about half the speed of the "perfect"
  implementation and no faster. ("Perfect" is in quotes because there is
  some error built up by using deltas between pixels instead of calculating
  1/z, u/z, and v/z anew each pixel, so it's not really perfect, but it is
  very close.) Hopefully converting this to assembly will give another good
  speed up.

September 5, 2000
- Finished preliminary renderer for planes. They draw properly, but very
  slowly. (With one divide, seven multiplies, and three compiler-generated
  calls to ftol per pixel, that's to be expected.)

September 4, 2000
- Continued work on planes.

September 2, 2000
- Moved R_DoorClosed() into R_AddLine() so it can use the already-calculated
  ceiling/floor heights without making them global variables.

September 1, 2000
- Continued work on planes.
 -Removed tsilheight and bsilheight from drawseg_t, since they're not
  particularly useful when the floor or ceiling isn't at a constant height.

August 30, 2000
- Continued work on planes.

August 29, 2000
- Started work on adding real floor/ceiling planes. (And I do mean planes,
  not just slopes.)

August 28, 2000
- Removed the "too far off the side?" check from R_ProjectSprite(). The fix
  for wide FOVs made sprites disappear when they weren't very far away.
- Started work on extended skins by writing the spec notes in skins.cpp.

August 24, 2000
- Fixed memory corruption when trying to add more coop bots than there are
  enough single player starts for: DoAddBot needs to check for the start,
  not PlayerThink. Otherwise, when DoAddBot calls G_DoReborn, it thinks
  the player is -1, because it gets the player number from the player start
  for the index passed instead of using the index itself.
- Tried to prevent drawing areas behind mirrors through a mirror. If no
  segs cross the line defined by the mirror, no walls will be drawn
  through the mirror. However, things can still show up through the mirror.
  Another issue is that gaps can be seen through the junction of two
  adjoining mirrors. I can live with this; A mirror with restrictions is still
  better than no mirror at all, right?
- Added proper view positioning for mirrors at any angle.

August 23, 2000
- Made mirrors actually flip the view. I still need to handle mirroring
  around arbitrary mirrors instead of just horizontal/vertical ones.

August 21, 2000
- Started working on mirrors by adding semi-portals.
- Simplified P_InitAnimDefs() by getting rid of the explicit state machine
  and using a separate function to parse flat and texture animations.
- Fixed sprite clipping for high FOVs.
- Changed R_DrawPlanes() to calculate texture coordinates relative to the
  middle of the screen instead of the left edge of the screen. Thanks to
  this change, I was able to remove the distscale variable, as it is no
  longer needed. Flats now line up with walls as perfectly as they're going
  to get, given the jiggly nature of wall rendering.

August 19, 2000
- Added support for animating switches and extended the ANIMDEFS lump to
  support defining them. Converted the ANIMATED lump in zdoom.wad to an
  ANIMDEFS lump, and changed the code to support multiple ANIMDEFS lumps.

August 15, 2000
- Added more consistant sorting for sprites in the same (x,y) location: In
  the event of a tie, the sprites' tops are used for sorting. If that is
  insufficient, the sort order is undefined, as before.
- Removed all references to CALC_TABLES. The game will always generate the
  tables on startup now.
- Changed finecosine to a class with a single inline operator[] member.
  Now cosine lookups are just as fast as sine lookups, because it's not
  necessary to dereference a pointer.
- Changed ylookup, columnofs, r_dsclipbot, r_dscliptop, floorclip,
  walltop, wallbottom, negonearray, screenheightarray, xtoviewangle,
  ceilingclip, yslope, and spanend back into fixed-size arrays. Their
  maximum possible values aren't *that* big, and the compiler can generate
  more efficient code when it always knows where the array will be.
- Another optimization: The renderer no longer draws underneath the console.
- Thanks to the span renderer's improved accuracy, I have been able to do
  some optimizations to bring R_MapPlane() down to five multiplies per span.
  This is better than the previous eight and also better than the original
  Doom's worst case of six multiplies per span. Doom also used a cache that
  could give it a best case of just three multiplies per span, but I'm not
  sure doing so is really worthwhile.

  As an added bonus, visplanes with the same orientation will line up with
  each other no matter where they are on screen. Now I just need to fix the
  wall jittering... (That may be too much to ask from the Doom engine.)
  
  As part of the optimizations, I:
  - Removed the distscale array and replaced it with a single value.
  - Renamed spanstart to spanend to reflect the fact that it now holds the
    right edges of spans instead of their left edges. Also changed it to an
    array of shorts.
  - Made R_DrawPlanes() responsible for maintaining the texture coordinates.
    Now all R_MapPlane() has to do is scale and pan them.
  - Removed most of my comments from R_DrawPlanes(), since the texture
    coordinates are no longer calculated in a single location.

August 14, 2000
- Added code in w_wad.cpp to limit the number of open wads to some preset
  amount instead of keeping all the wads open at a time, in case the user
  has more wads s/he wants to use than there are file handles available.
- Figured out the crash from the other day: Decals were only being cached
  if their sizes were unknown; they were not recached if they had been
  flushed.

August 12, 2000
- Added bullet holes. It crashed once in testing when I was foolishly
  running fullscreen, so now I am trying to replicate the problem. The
  error occured in WallSpriteColumn() where it called drawfunc() and was
  an access violation.
- Implemented RF_FULLBRIGHT for wall sprites.
- Moved most virtual function bodies that were in header files out of the
  headers so that the compiler wouldn't generate code for them for every
  derived class that didn't supply their own versions.
- Added FDecalLib and supporting classes.

August 10, 2000
- Removed the MF3_CARRIED flag and replaced it with the carrysec member. The
  intent of MF3_CARRIED was to prevent neighboring sectors from having an
  accelerative effect on actors (an undesirable effect in at least one of
  Heretic's maps), but it also prevented multiple carriers in a single sector
  from having a cumulative effect on the player.
- Optimized R_DrawSprite() to initialize the sprite clipping arrays to their
  largest possible range instead of initializing them to a special "not
  clipped" value. This saves the time needed to set "not clipped" columns
  to valid values later. It also saves the trouble of making any passes for
  clipping sprites in fake floor/ceiling sectors. Also redid the clipping
  loops so that VC++ produces more optimal code for them.
- Fixed R_InitTables() to produce an accurate sine table instead of a sine
  table that was slightly off. Also implemented the optimization suggestion
  that was in the code.
- Moved the << 10 scaling out of R_MapPlane() and into the calculation of
  xscale and yscale in R_DrawPlanes() with the intent to speed up plane
  mapping slightly. As a bonus, adjacent visplanes with the same texture
  now match up far better than before, so it was worth it even if it didn't
  give a huge speedup.

August 8, 2000
- Changed FHelperThread() to use MsgWaitForMultipleObjects() instead of
  MsgWaitForMultipleObjectsEx(), because the latter is not available under
  Windows 95. I also had to change FCDThread to not use QueueUserAPC() to
  handle play finished notifications, since MsgWaitForMultipleObjects() is
  not an alertable function. Fortunately, the reason I used an APC in the
  first place no longer applies, because the CD_WndProc will always be
  called from the helper thread's context, since the window is now being
  created in the thread's context. (See my July 14 log; I don't know why
  it even worked under 98.)
- Fixed FHelperThread() to call Init() from within the context of the newly-
  created thread, as it should.
- Eliminated BestColor() from the game and replaced its use with
  ColorMatcher. Then I found a bug in R_BuildPlayerTranslation(): RGB values
  were not clipped to the range [0,255]. 

August 7, 2000
- Wrote the FColorMatcher class to do color matching much quicker than
  BestColor() with nearly the same quality.

August 5, 2000
- Changed the command parser in c_dispatch.cpp to something simpler, but
  which also allows for using \" inside quoted strings.

August 2, 2000
- Implemented RF_ALPHASHADED for wall sprites.

August 1, 2000
- Implemented RF_REL* flags. They use the texture pegging flags of the linedef
  to keep them in line with the underlying textures if the sector height
  changes.

July 29, 2000
- Implemented RF_CLIPUPPER and RF_CLIPLOWER. RF_CLIPFULL also works for
  one-sided lines, since that was the first case I did when I added the
  bound wall sprites.
- Added vertical flipping for wall sprites.

July 28, 2000
- Made fullbright a separate field in FState instead of merging it with
  the frame index.

July 27, 2000
- Added these fields to AActor: renderflags, picnum, and alphacolor, although
  they still need to actually be implemented. Also changed the sizes of the
  sprite and frame fields.
- Started work on wall sprites bound to walls (i.e. decals). Right now, it
  can clip the sprite to one-sided walls.
- Fixed hotkeys not selecting appropriate item(s) in the menus.

July 22, 2000
- Fixed console drawing extra lines above the top of the screen.
- Added IWADPaths section to the config file to indicate a default set of
  directories to search for IWADs.
- Added screenshot_quiet cvar to prevent the screenshot command from
  displaying any messages when a screenshot is captured.
- Added wait and unset console commands.
- Changed C_DoKey() to execute a copy of the command bound to a key instead
  of the original, because the key might rebind itself and mess up the
  parser if the original command is executed.

July 21, 2000
- Changed FindSprite() in d_dehacked.cpp to use DWORDs for comparisons.
- Added Thing_Move and ThrustThingZ specials from Skull Tag. Also added
  Skull Tag's newtid parameter to Thing_Spawn(NoFog).
- Changed blocked pillars to stay in one place until not blocked, because
  they had stopped doing that, probably because of something I did for
  stacked things on moving sectors.

July 20, 2000
- Removed the use of memmoves in R_ClipWallSegment(). VC++ generates more
  optimal code using for loops, because memmove generated a function call.
- Fixed R_DrawVisSprite() not always drawing the full width of a sprite when
  using r_columnmethod 1.
- Added x and y thing scaling factors. Range is 0-255, and 63 is the default.
  Actual scale is (scale+1)/64.
- Changed R_DrawSprite() to clip sprites against drawsegs based on depth
  and not vertical scale. Also added an extra parameter to
  R_ScaleFromGlobalAngle() that receives the depth of the passed angle.
- Fixed Heretic's bloody skull transitioning to one of the player's states.
- Removed MF3_SKINNED flag and added a skin field for every actor.
- Made -host 1 not start a multiplayer game without starting the network,
  because I currently have no TCP/IP stack installed on my computer.
- Fixed players being able to gib infinitely under a crusher.
- Changed crushing ceilings to behave more like Doom again: Things that were
  on the floor stay on the floor, and things above the floor get pushed into
  it.
- Fixed "jiggly" sprites where each columns' textures were not aligned
  properly. Also fixed a bug in rt_map4cols_asm1() and rt_map4cols_asm2()
  that was less obvious with the jiggly sprites: The right 2 pixels of
  odd-length runs were swapped.
- Fixed bug in R_DrawColumnHorizP_C(): Mapped one pixel too many.
- Condensed R_ClipSolidWallSegment() and R_ClipPassWallSegment() into
  R_ClipWallSegment(), since they were nearly identical.

July 19, 2000
- Fixed WritePCXfile(). I was writing two extra header bytes.
- Added assembly versions of the scaling masked block drawers and made them
  support clipping the block to the screen.

July 17, 2000
- Added assembly versions of the non-scaling masked block drawers and made
  them support clipping the block to the screen.

July 15, 2000
- Slightly optimized parallax sky drawing.
- Changed the controls menu to only grab the mouse when it's waiting for a
  key to bind to an action.
- Changed the DirectInput keyboard reader in i_input.cpp to read the entire
  keyboard state and generate events based on the differences between that
  state and the previous one. Reading key transitions with GetDeviceData()
  was more efficient (I assume), but it was too easy for NT to miss
  transitions if CPU time got tight.
- Added an absolute parameter to I_SetGUICapture to force the setting of
  GUI capturing to a specific setting instead of adjusting a counter. This
  is necessary for proper recovery when catching a recoverable error, and
  GUI capturing was already enabled.
- Finished CD code (at least I hope I did). Under NT, it can even loop a
  track without bringing the game to a halt. (Yay!) Unfortunately, that
  seems unavoidable under 9x. Oh well.

July 14, 2000
- Under NT, APC calls do not seem to work when there is an outstanding MCI
  notification. Now FHelperThread uses an event to signal the thread to quit.
- Here's a mean difference between NT and 98 (as far as I can tell): Under
  98, each thread has its own message queue. Under NT, each thread shares
  a single queue for the entire process. Now I use an APC call to restart
  playback, because I don't know what context the WndProc is runnning in.
  (I could check the OS version and work accordingly, but then I'd have two
  methods to do the same thing, and I have no guarantee Microsoft won't
  change things in a future version of Windows.)
- Changed autoexec handling so now you can run any number console scripts
  automatically.
- Added a new config file format that can store information for multiple
  games (i.e. Doom, Heretic, and Hexen) and keep the appropriate settings
  separate. This is your basic ini-style file, rather than a list of
  console commands.

July 11, 2000
- Removed an I_PauseMouse() call from Win32Video::SetMode() that was
  preventing the game from grabbing the mouse in windowed mode at startup.
  (Why was that in there?)
- Implemented localized ACS strings in the game. It's even smart enough to
  detect when the user changes the regional settings!

July 8, 2000
- Created enhanced ACS format (ACSE) and used it to add string localization
  support to the language.
- Added InterpolationSpecial (#9075) whose special is activated whenever
  a PathFollower reaches an InterpolationPoint with the same special.
- Fixed stack overflows when all the patrol points in a path are so close
  together that a monster can touch them all at once, by setting
  MF_JUSTATTACKED when the monster reaches one point to force it to move
  when SetState() is called instead of cycling to the next point.
- Renamed AWayPoint to APatrolPaint.

July 5, 2000
- Moved the StatusBar->Tick() call inside P_Ticker() so that the status bar
  doesn't tick when the game is paused.
- Reworked the string-building p-codes in p_acs.cpp so that the string gets
  built as each p-code is encountered instead of waiting until the end p-code.
  This is safe because a properly-generated script will never enter a wait
  state between the begin and end p-codes (which I initially thought it
  might).
- Changed the meaning of some HUD message X coordinates:
	[ 0.0, 1.0]: Position between left and right edge valid box locations
	[-1.0, 0.0): Position between left and right edge of screen
	( 1.0, 2.0]: Same as [0.0,1.0], but center each line inside box
	[-2.0, 1.0): Same as [-1.0,0.0), but center each line inside box
- Added FHUDMessageTypeOnFadeOut class.
- Added an id for use with Attach/DetachMessage(). The status bar can now
  keep track of HUD messages for you and automatically deletes an old version
  of a message when a newer one is attached. An id of 0 means not to track
  the message.
- Added the hudmessage ACS command.
- Tried improving the accuracy of span drawing by increasing precision (i.e.
  a>>6 is better than (a>>16)<<10), but it didn't seem to do any good. Still,
  as a remnant of that there is now a function FixedMulDiv(a,b,c) that
  calculates the fixed point result of a*b/c. Even if it's not much more
  precise than FixedDiv(FixedMul(a,b),c), it's at least marginally faster,
  since it does no shifts.
- Changed APathFollower::Activate() to reposition itself to the first node so
  that it doesn't briefly appear at its old location when activated.
- Changed AInterpolationPoint::PostBeginPlay() to FormChain(). Now it's called
  whenever something that uses the path wants to get on the path. Thus, we can
  be sure that the path is actually completed when the thing wants to get on
  it (at level start), which it wouldn't be if the thing was placed on the map
  before all the points of the path.
- Simplified AInterpolationPoint::ScanForLoop().

July 4, 2000
- Added sector actions for players landing on floor, hitting ceiling, entering
  a sector, leaving a sector, hitting use inside a sector, or hitting use on
  a sector's wall. The way this is exposed to level designers is the same as
  Skull Tag's 9999 thing (action taken whenever the player is on the floor),
  but is more flexible because it supports multiple activation types and you
  can have multiple actions in a single sector.

July 3, 2000
- Added an effect for respawn protection.
- Added dmflags2 cvar, and consolidated weapondrop and nobfgaim into it. Also
  implemented Skull Tag's respawn protection and barrel respawning into it.
- Added the FFlagCVar class. This just maps onto a FIntCVar (i.e. dmflags)
  and allows a more meaningful way for the user to manipulate it than by
  changing bit values directly.

June 27, 2000
- Removed the restriction in ChangeCamera that it can only change the
  player's view to SecurityCameras. Now the proper way to activate a
  moving camera is to use both ChangeCamera and Thing_Activate. ChangeCamera
  sets the player's view to the camera, and Thing_Activate gets it moving.
- Changed the automap so that changes to the am_*color cvars take effect
  immediately instead of the next time the automap is toggled.

June 26, 2000
- Got rid of cvar_t and switched to a subclassable FBaseCVar class. Now the
  game actively recognizes different cvar types.

June 14, 2000
- The -iwad parameter can now specify a directory, as in BOOM.
- Changed -warp parameter so that using -warp x with ExMx games will use
  episode 1, map x instead of episode x, map unknown.
- Added a dialog box to select the IWAD to use if the game finds more than
  one.
- Switched the compression library from mini-LZO to zlib. Zlib gives better
  compression, but still seems pretty fast (hard to judge on a P2-350 :-).
  More importantly, zlib is not GPL (it has a BSD-style license) and I can't
  have something so relatively minor as a compression library trying to attach
  its license terms to the included Heretic and Hexen source, which are not
  GPL.

June 10, 2000
- Modified FindLevelByNum() to check that a map exists before returning a
  level with that number, because I have Doom 1 and 2 using the same levelnums
  for different maps.

June 7, 2000
- Added MF3_SKINNED flag to prevent sprite changing when calling SetState().
- Added fallingdamage and nofallingdamage MAPINFO flags.
- Added support for RIFF CDDA files.
- Added support for CD tracks as music. The cdtrack and cdid MAPINFO keys can
  be used to select it for a specific map.

June 6, 2000
- Added the CVAR_NOINITCALL flag to allow for cvars with callbacks that
  aren't called automatically during initialization.

June 5, 2000
- Moved all the CD-related MCI calls into a separate thread in an attempt to
  avoid pauses when looping a CD track. A ring buffer is used to send
  commands from the main thread to the helper thread. Unfortunately, the game
  still stalls on MCI_PLAY commands. Apparently, every thread in the process
  calling mciSendCommand() is halted until the play has begun. :-( Even
  though the separate thread turned out to be useless, I'm keeping this
  architecture, because if there is someway to avoid the pause, it probably
  won't be by using the game thread for CD control.

June 3, 2000
- Started work on CD support after (finally) finding information about using
  different CD drives hidden in the Microsoft Knowledgebase.
- Added Win32 clipboard support (copy & paste) to the console and chat mode.

May 29, 2000
- Implemented some spiffy interpolated path stuff: APathFollower,
  AMovingCamera, and AActorMover.
- SetPlayerProperty should work in open scripts now. Needed to make sure it
  was non-NULL.

May 24, 2000
- Did a release build under Win98, and it took ~4.25 minutes to link--about
  twice as long as NT. Ack!
- Fixed improperly freeing a MUSSong after playing a MIDI. I guess
  redefined virtual member functions for subclasses don't work in a
  superclass's destructor. (Which makes sense, since the subclass's stuff
  is already gone by the time any classes it's derived from destruct.) So
  I replaced MIDISong::IsMUS() with a variable MUSSong::m_IsMUS.

May 2, 2000
- Seem to have fixed 3D sound crashes; listener position and velocity were
  being calculated using FLOAT2FIXED instead of FIXED2FLOAT, so they were
  very big and apparently overflowed the drivers. Unfortunately, the sounds
  are really noisy.

April 28, 2000
- Revised the event system by creating a generic EV_GUI_Event type in
  anticipation of creating at least a minimal windowing system. The console
  now uses this system for input, which will hopefully resolve certain
  console key down misses under NT. (Running 98 right now, so can't check.)

April 27, 2000
- Tried to add 3D sound support. Gave up after several nasty crashes that
  left me with no clue what I was doing wrong.

April 13, 2000
- Fixed P_DamageMobj not pushing things if the source was a player.

April 11, 2000
- Increased map and world variable counts to the amounts Ty Halderman raised
  them to in acc.
- Implemented clearinventory, checkinventory, giveinventory, and takeinventory
  ACS functions. Still need to test them.
- Added support for playing a specific order of a MOD and changing the song
  from ACS.

April 10, 2000
- Skins with sounds that precede the S_SKIN identifier now work. A side-effect
  of this is that skin wads can no longer replace non-skin resources. (This is
  intentional.)
- Added the sc_carry_players type to DScroller, which only carries players
  (hence the name), to match Heretic and Hexen.
- Added an MF3_CARRIED flag to keep track of which actors have been pushed
  by a DScroller, so that adjacent small sectors with the same scrolliness
  do not have cumulative effects on a thing.
- Changed I_StartSound to let FMOD pick a free channel at the suggestion
  someone e-mailed to me. It still seems to work for me, and hopefully it
  will work for everyone else now, too.

April 4, 2000
- Why did I decide to use the MFC names for the macros RUNTIME_TYPE and
  RUNTIME_CLASS? It's confusing. _TYPE: Return the TypeInfo for an existing
  instance of an object. _CLASS: Return the TypeInfo for a class.
- Fixed running with -nosfx crashing the game when trying to play a MOD/MP3.

April 3, 2000
- Change P_Move() again so that monsters stepping down steps move down
  immediately instead of falling under gravity because it looks better.
- Changed FMOD initialization sequence to be more tolerant of failure.
- Added checks for self->target to the A_FatAttack? routines.

March 29, 2000
- Fixed dehacked patches changing "BFG Cells/Shot".
- Fixed PickPrevWeapon to properly wrap from low to slot 0 to 9.

March 28, 2000
- Added the ACS internal functions spawn and spawnspot. Also added support
  internal functions with optional parameters to acc.
- Fixed console not maintaining correct text color when splitting lines.

March 27, 2000
- Fixed ACS sound commands only supporting volumes 0 and 127 (was not
  converting to float when dividing).
- Changed the status bar number drawers to round down to the closest "good"
  number if the space allocated for the number's display is too small.
- Changed friendly fire so that it is a scaler like UT, and not a simple
  on-off dmflag. Of course, this means it's a cvar now.
- Changed teamplay so you can still hurt yourself even if you can't hurt your
  teammates. You can also telefrag teammates now in those instances where you
  happen to respawn where a teammate is standing.
- Added MF3_NOTARGET flag so that Heretic bosses can be ignored if they happen
  to hurt something, but Doom bosses are not.
- Added a playerinfo command to peek at the userinfo for any player in
  the game.
- Fixed D_ReadUserInfoStrings() ignoring the last value in a compacted
  userinfo list, causing neverswitchonpickup to not be replicated during
  netgame startup.

March 25, 2000
- Skins with no frames get removed from the list.
- Duplicate skins get renamed to avoid conflicts.

March 24, 2000
- Fixed crash when running with +set developer 1.
- Fixed savegame slots drawn too high in the Doom menus. (I unwittingly
  raised them at some point.)
- Turend off auto-monster respawning on skill 4 when not playing Doom.
- Fixed locked, repeatable, local doors being translated with their tags
  intact (should be 0).
- Disabled highlighting of teleport lines if their activation type is
  monster cross.
- Added support for Doom maps that use teleport dests in sectors with 0 tags.
- Fixed Heretic stair speeds (was 1/4 too slow, because they were going at
  Doom speed).
- Fixed cursor drawn in wrong column on video modes menu. (184 is not the
  same as 104.)

March 13, 2000
- Linking the release build now takes 2:35. :-(
- Added some more debug output to i_sound.cpp.
- Added a hack to PIT_RadiusAttack() to make the Romero head easier to hit.
- Fixed rippers doing no damage because P_CreateSecNodList() altered tmthing.
- Fixed the holdatkstate used by the powered-up phoenix rod.
- Fixed "bouncing" problems when standing still on the waggly muck in
  Hexen map08.
- Discovered only players were having their z velocity reset to 0 when they
  hit the floor. Fixed. Now I don't need the MF_CRASHED flag I added earlier.
- Made demon scroller more efficient.
- Fixed bunny scroller showing end screen for first 230 tics.
- Changed quit message for non-Doom games.

March 8, 2000
- Fixed New Game menu not displaying properly with Ultimate Doom.
- Made FImageCollection::Uninit() more complete to avoid potential problems
  when turning off the crosshair.

March 6, 2000
- Stepping out of a floorclipping sector now adjusts the player's viewheight.
- Added the Hexen decorations.

March 5, 2000
- Tweaked P_CheckPosition() some more.
- Changed DThinker::DestroyAllThinkers() to call EndFrame() after each
  thinker gets destroyed.

March 2, 2000
- Fixed console not showing top line of its buffer.
- Made some DeHackEd compatibility fixes.
- Fixed stealth Hell Knight having same doomednum as stealth Baron.
- Changed sound code to not override sounds with the same priority. Fixes
  continuous ambient sounds fighting for the same channel in low channel
  environments. (e.g. only one sfx channel)
- Fixed the monster morphers to transfer tids and specials to the morphed
  monsters.
- Fixed ambient sounds replaying too soon (i.e. one tic after they start).
- Changed DoLoad in i_sound.cpp to use FSOUND_Sample_Upload instead of
  FSOUND_Sample_Lock. Hopefully will fix sound problems on some cards.
- Fixed PatchAmmo() not checking to make sure a weapon is present before
  checking its ammo member.

March 1, 2000
- Added dummy entries for the splash sounds to the Doom section of zdoom.wad's
  SNDINFO to avoid warnings when starting Doom.
- Set BaronOfHell to proper mass.
- Modified DObject::DestroyScan (both versions) to scan each sector's
  soundtarget field if a destroyed object is a PlayerPawn and clear
  matching fields.
- Made jumping velocity a PlayerPawn property
- Set MF3_DONTSPLASH for chicken feathers.
- Fixed Heretic secret level exits.
- Fixed imps/lost souls slamming into things and crashing because they
  ended up calling P_CheckPosition recursively.
- Fixed crashing when trying to scroll past the top of options menus that
  fit entirely on the screen.
- Added Hexen cheats. (Note that not all Heretic and Hexen cheats are
  implemented, because I didn't feel it was worth reimplementing their
  behavior--such as Heretic's gimme or Hexen's version of the same).

February 29, 2000
- Redid cheat parser and added Heretic cheats.
- Added heretic.wad, heretic1.wad, and hexen.wad to the list of iwads
  searched for.
- Fixed to properly detect and use shareware heretic1.wad.
- Fixed morphed player making normal player pain sounds.
- Fixed P_MorphPlayer not setting camera and morphTics.
- Fixed activated monsters not triggering SPAC_MCROSS lines, because
  AActor::Activate was clearing everything in flags2. (Used ! instead of ~).
- Fixed mapthings being spawned with wrong angles due to round-off error.
- FWeaponSlot::AddWeapon no longer adds a single weapon to a slot more than
  once. Fixes nextweap not working with fast monsters. They were added once
  at init time, and again when fast monsters were set.
- Added LeavingIntermission state for intermission to avoid trying to draw
  after the graphics have been freed.
- Loaded BigFont for Doom game.

February 27, 2000
- Implemented infinite ammo option for Heretic weapons.
- Set particle fountain heights back to 0 (missed them during conversion).
- Added option to flip player view in player setup menu between front
  and back.
- Fixed stepping onto a thing and getting stuck inside another thing
  above you.
- Fixed crash when starting with -loadgame.
- Fixed moving into walls when on top of things (such as when killing
  something next to a wall with gauntlets and being pulled forward on top
  of the dead thing before it clears MF_SOLID).
- Fixed text aligned improperly at high resolutions on the intermission's
  "now entering" screen.
- Fixed missiles climbing up steps before exploding (very noticeable with
  mace balls.)
- Gave AMaceFX1 MF_DROPOFF. (It was missing it.)
- Fixed P_HitFloor to return true/false based on the floor's liquid status.
- Fixed Heretic weapons drawn too high at high resolutions with st_scale 0.
- Fixed mummies not attacking you. Forgot to uncomment some stuff I had
  commented out for checking the collision detection.

February 25, 2000
- Did a release build and timed it as ~70 seconds spent linking.
- Disabled messagemode when confirmation messages are up.
- Switched to the console font to display key names in the controls menu,
  because the Raven fonts don't have enough characters for all the keys.

February 24, 2000
- Gave the Heretic imp chunks masses of 5 so they make small splashes.
- Made the color for locked doors default to green.
- Added more items to the controls menu and made it scrollable.
- Doom, Heretic, and Hexen now use separate config files.

February 23, 2000
- Added support for a TERRAIN lump.

February 22, 2000
- Added translations for Heretic's skullrod rain, lifegem, and player cape.

February 21, 2000
- Tried making the chasecam use the player's viewheight to smoothly move
  itself up when the player stepped up, but it looked odd to see the player
  jump up while the camera moved smoothly, so I took it out.
- Wrote 4 different iterators for P_ChangeSector that should be able to
  properly handle moving things standing on top of other things. Such
  situations were completely ignored before.
- Removed limit on intercepts.

February 20, 2000
- Fixed setting skill from menu when fullscreen console is active.

February 18, 2000
- Fixed annoying screen "jiggling" when jumping up onto ledges.
- Fixed Plat_DownByValue handling.
- Fixed a lockup problem in situations where stairs are triggered and then
  retriggered, but from the opposite end.

February 15, 2000
- Fixed the display of the player's name on spynext/prev.
- Added the FHUDMessage class and change C_MidPrint to use it. This class
  can be used to display text at any location on-screen and is patterned
  after Half-Life's text messages. Additional effects besides plain on and
  off are accomplished by subclassing it.
- Reimplemented Doom's status bar.
- Fixed instances when bots were not respawning themselves.
- Fixed bodyque so that it is actually used again.
- Fixed an (obscure?) error when a thinker destroys the next thinker
  scheduled for thinking while it thinks. The problem can be reproduced
  with the following steps using a deathmatch map with only one start, one
  player, and weapondrop on: 1. You spawn. 2. You spawn a bot without moving.
  3. The bot telefrags you. 4. You drop a clip, then the bot picks it up
  when it moves and destroys it. 5. Because DThinker::RunThinkers() had cached
  the next thinker, it doesn't know the clip was destroyed and tries to make
  it think. The clip thinks, and relinks itself into the world, and causes a
  whole bunch of problems.

February 14, 2000
- Tried separating the different game directories into static libraries to
  see if that would reduce the link time. It didn't seem to have made
  much of a difference, and some classes weren't being linked into the
  executable, so I went back to linking everything together into a single
  executable without any intermediate libraries. The different game
  directories stayed, though, since I like the organization.

February 13, 2000
- Made the Heretic and Hexen scrollers accurately mimic their counterparts
  from those games.
- Added more endgame types, including a customizable picture viewer.

February 12, 2000
- Also in the way of movement code, I fixed a problem that caused the
  player's view to jump drastically when jumping onto another thing,
  because I was using the player's z in two places where it should have
  been the other thing's z.
- After much juggling, I believe I finally have the movement code fixed so
  that floating monsters won't float themselves into other monsters. Testing
  was done in Heretic E1M1 by summoning a bunch of mummies and wizards.
  I also cleaned up P_FakeZMovement() so that it's much leaner. I was able
  to find the following causes of the problem: 1. When monsters went up
  steps, they didn't check to make sure there was nothing in the way above
  them. 2. When P_CheckOnmobj() found a monster's move to be blocked, the
  monster could still float down inside the head of it's blocker, causing
  the blocking monster to get stuck until it floated up again.

February 9, 2000
- Added fixeddiv, fixedmul, setgravity, and setaircontrol commands to acs.
- Added floorclipping from Hexen/Heretic.
- Moved the turn180 code over to P_PlayerThink.

February 2, 2000
- Got ZDoom to link against ELK and run. While trying to get a setup that
  worked properly with the Scheme reset procedure, I accidentally got a
  setup where Scheme code was calling the main loop every tic. The result
  was that it had to garbage collect a lot. And then I realized that
  Scheme is not the way to go for implementing a real-time game scripting
  language. If the GC has to work a lot when we only call a single
  procedure 35 times a second, think how horrible it would be if 100
  different procedures were called that often (for 100 different actors).
  Ugh. I think I'll do something with ACS instead.

February 1, 2000
- Got ELK (Extension Language Kit) to compile into a usable library. The
  idea was to use it as a simple way for the end user to create new action
  functions for actors.

January 1, 2000
- Fixed P_FakeZMovement so it knows about underwater movement.
- Added a workaround for the imps continuosly performing their crashstate.
  When P_ZMovement sets the crashstate, it also sets a MF_CRASHED flag, so
  it knows not to do it again. I can't see why Heretic doesn't exhibit
  the same problem. :-(

December 30, 1999
- Changed the changemap command to return harmlessly if called without an
  instigator.
- Tried adding the Heretic Imp, and it worked, kind of; the imps continuosly
  spew chunks of flesh when they hit the ground after death.

December 29, 1999
- Changed mobjinfo handling so they get set by a class' SetDefaults() method.
  This means that every actor needs to have its own class, but they get more
  control over their defaults depending on the game mode, and it also
  condenses code some, because they only need to list the values different
  from the actor defaults.

December 17, 1999
- Added the dumpmapthings command.
- Removed the testgibs cvar.
- Added angle and speed parameters to security cameras, so now they can turn
  like Duke's. Also add pitch parameter.
- Made ambient sounds recognize activate and deactivate.
- In DCajunMaster::FakeFire(), the maximum distance a bot will trace is now
  SAFE_SELF_MISDIST. Since they will fire if the trace would have hit
  something past this, there's no sense in wasting time going further if the
  trace hasn't hit anything by the time it gets that far away.

December 16, 1999
- Set the default for fullscreen under Win32 back to 1. Not sure why I had
  it at 0.
- Made mobjinfos dynamic so they don't need to be in one monolithic info.cpp.
  Now they can be in the file with their related code, and subclassing AActor
  is useful.

December 12, 1999
- Changed DPolyAction::m_Dist to be signed. I'm not sure why I changed it
  to unsigned, because there are lots of places where it gets checked if
  it's less than zero.
- Added sorting of the cvars that get sent during netgame arbitration. In
  the old system, they were sent out in whatever order they were registered,
  which was compiler-dependant. This worked fine when playing against a copy
  built with the same compiler, but broke when trying to play a version
  built with a different compiler. Thus, Windows, Linux, and OSF/1 versions
  could not play each other.

December 11, 1999
- Made some changes to get the code to compile and run without
  unaligned accesses on Alpha processors. ZDoom will now compile and run
  under OSF/1. It appears to play ordinary Doom levels properly. Levels
  with Hexen features will crash it, and savegames seem to have problems,
  too. (Some of which, I think, is attributable to using LZO for
  compression. It apparently isn't 64-bit friendly.)

November 30, 1999
- Made the Scroll_Texture_Both and TranslucentLine specials dynamic.
  That is, they can be used from inside the game after the level is
  loaded.

November 26, 1999
- Added the hud_scale cvar to control scaling of the fullscreen hud.
- Removed targettic from AActor, because it's no longer meaningful (and
  hasn't been for quite a while). Replaced it with dummies in the
  AActor serializer so that savegame compatibility can be retained.
- Fixed a next thinker determination problem in DThinker::RunThinkers().
  A thinker can destroy itself during its RunThink(), so the next thinker
  to run needs to be determined before we run the current thinker, not
  after.
- Added calls to I_FinishUpdateNoBlit() and I_BeginUpdate() at
  strategic locations in R_RenderPlayerView().

November 25, 1999
- Removed the outer layer of compression from savegames. Since all
  the snapshots in the savegame are already compressed, compressing
  them again will do little good.
- Fixed archiving of defered ACS scripts. There were actually two
  problems here. One, if there were any, it would get stuck in an
  infinite loop. Two, they were being saved in a format different
  from what they were being loaded as.
- Fixed the operation of FLZOMemFile's serializer so that it restores
  to the state it was archived in (e.g. an imploded file stored in
  m_ImplodedBuffer, as opposed to an uncompressed file stored in
  m_BUffer).

November 24, 1999
- Fixed BOOM generalized locked doors so that the open/close type will
  actually close.

November 23, 1999
- Machines that use -join will now select their port automatically.
- Here's another problem the bots helped me catch: DThinker::
  DestroyAllThinkers() was still deleting each thinker. The correct
  approach now is to call Destroy() on each thinker, and then call
  DObject::EndFrame() to perform the actual deletion.
- Those bots are great for stress testing. Thanks to them, I was able to
  find and correct a problem with my Destroy() implementation: DThinker
  also needs to implement Destroy() to get the object out of the thinker
  list. Otherwise, you can do things like destroy an actor, then have
  the thinking code move it before it gets removed from the thinker list,
  which leaves the block and/or sector pointers messed up and causes all
  sorts of odd and nasty behavior.

October 27, 1999
- Added my own fixes for -host and -join to handle aborts better.
- Tweaked underwater friction in P_GetFriction().
- Added Jeffrey Cuenco's fixes for the -host and -join parameters.

October 26, 1999
- Added a check in A_Scream() to make sure the actor has a death sound.
- Fixed demo sync problems caused by playing demos back with a cl_pufftype
  different from what they were recorded with. I have no idea why it should
  make a difference, since the puffs are supposed to be inert, but spawning
  them and keeping them hidden when cl_pufftype is 1 fixes the problem.
- Implemented stale pointer cleaning. If you want to remove an object now,
  call its Destroy() method instead of deleting it. The object will be
  placed in a queue. At the end of the frame, all objects will be scanned
  for references to objects in the queue, and any references that are found
  will be NULLed. Then the objects will be deleted.

  Any objects that have (DObject *) (or some subclass of DObject) members
  need to be implemented with the IMPLEMENT_POINTY_SERIAL or
  IMPLEMENT_POINTY_CLASS macros. See the implementation of AActor in
  p_mobj.cpp for an example of their use.

September 15, 1999
- Fixed a nasty bug when saving big games. FArchive used pointers into the
  m_ObjectMap array when mapping objects to indices. Now it uses indices
  all the way through so that they will still remain valid if m_ObjectMap
  has to grow.
- Reduced the rate at which arbitration packets are sent out to 4 times per
  second. Combined with their reduced size, this will hopefully solve
  problems I understand some people were having using 1.18 with DoomServ.
  (Based on the assumption that their problems were caused by the lack of
  bandwidth offered by modems.)
- Reduced the size of netgame arbitration packets by removing the names of
  the cvars the values represent. When playing with the same copy of the
  executable, these are implicit in the order in which the values appear in
  the stream, so storing the name of the key is essentially redundant.
- Pulled out the original 1.18a source and fixed loading of savegames before
  a new game is begun. The problem was in DCajunMaster::RemoveAllBots(),
  where the consoleplayer's camera is restored to the console player if
  viewing a bot. Before the game begins, the camera field is NULL. Also
  changed caught recoverable errors so that bots are removed and level
  snapshots are deleted.

September 12, 1999
- Made actor movement floating-point based. I had already done the fp time
  system (to an extent) before I had to pull out the 1.18 source and fix
  bugs. Gravity seems to be inversely proportional to the ticrate. Can't
  figure out why.

Okay, I was stupid. I accidentally erased the version of the log file that
contained my changes from 1.18 to 1.18a.

September 5, 1999
- The +moveup and +movedown commands finally do something.
- Added a fly cheat.
- Changed the handling of action commands so that they increment and
  decrement numbers in an array instead of setting and clearing bits in an
  int.
- Fixed R_AlignFlat(). Apparently, I broke it sometime (or it never worked
  properly in the first place). Also made it simpler.

September 3, 1999
- Added localambientsound and activatorsound ACS commands.
- Fixed the DLevelScript constructor to place new scripts in the array of
  RunningScripts (if not ACS_ExecuteAlways).

September 2, 1999
- Replaced the error abort in FArchive.cpp when an attempt is made to store
  a DObject, with a NULL object save instead. There are conditions that will
  come up during regular gameplay that will result in dangling pointers.
  Example: A lost soul attacks a monster. The attacked monster then sets its
  target field to the lost soul. Something kills the lost soul, and it
  destroys itself. The other monster is now left with a pointer to nowhere.
  The only reasonable solution to this problem I can think of is to collect
  a list of all objects that want to destroy themselves. At the end of each
  tic, they get destroyed, *and* all thinkers are searched for pointers to
  those object. If any pointers are found, they get NULLed.

September 1, 1999
- Significantly cleaned up G_ParseMapInfo(). It's easier to follow what it's
  doing, and now it's smart enough to give you an error message if you make
  a mistake in your MAPINFO lump instead of hanging.
- Added a flat warping effect similar to Quake's liquid textures.

August 31, 1999
- Added swimmable water. The forcewater cvar can be used to make all BOOM
  deep water swimmable.
- C_MidPrint() now adds messages to the console as well as the middle of
  the screen.
- Fixed the "you need a key" messages to only appear for the player who
  tries to activate the locked door.
- Restored the code for storing server cvars in savegames.

August 30, 1999
- Made items respawn the default for -deathmatch.
- After creating some huge log files, I believe I finally fixed the demo
  and network sync with bots. The bots use P_CheckPosition() to determine
  if a spot is free. This function can also causes items to be picked up.
  Thus, on the arbitrator's machine, bots pick up items before they do
  on the other machines, and they can also pick up items that they decide
  not to touch (and so don't pick them up on other machines). To fix, I
  made a wrapper for the bots that turns off their MF_PICKUP flag before
  performing the check and then sets it back after the check is made.
- Fixed the loading of the "straight-ahead" status bar graphics for skins.
  The corresponding patches weren't being moved into the skin's namespace.

August 28, 1999
- Fixed the bot's FakeFire() so that it doesn't do damage to anything
  that it might hit, by adding another thing instead of using MT_HEADSHOT.
- Another cause of the sync problem is in P_CheckSight(). If a monster
  is invisible, a random number is used to determine if the thing
  should be reported as not visible.
- Found part of the problem with bot sync: P_SpawnPlayerMissile() used
  a special routine when a bot wanted to fire. The routine aimed at
  whatever the bot's enemy was set at. Only on the arbitrary (and not
  during demo playback), can enemy ever be non-NULL. Changed this to
  just disable autoaim for bots. Should be effectively the same.
- Changed P_SpawnPlayerMissile() so that if a player has autoaim set to
  0, it doesn't try adjusting the angle left and right.
- Fixed projectile velocities by using vector math. Doom calculated the
  velocity on a 2D plane, then added in the vertical component.
- Fixed the bot's vertical aiming.
- Rewrote the parts of the Cajun that used degrees to use binary angles
  instead.
- Changed the Cajun's TurnToAng() function to let it turn both left and
  right, depending on which results in a shorter distance.

August 27, 1999
- Added the Cajun 0.97 code. Needs work yet: Bot looks up/down too far,
  always turns right, demos don't stay in sync, and networking with bots
  probably doesn't work either.

August 14, 1999
- Cleaned out a lot of the no longer relevant docs from the docs dir that
  came from the Linux source.
- Changed IdentifyVersion() so that it can look for an IWAD in one of four
  directories: current, program, $DOOMWADDIR, and $HOME. (The same search
  order used by BOOM.)

August 13, 1999
- Fixed the DLevelScript constructor. (Using local vars with the same names
  as member vars still isn't a good thing. :-)

August 12, 1999
- Made the vertical calculations in the renderer subpixel-accurate. This
  negates some of the work I did on the 10th. A pity. Something also needs to
  be done about the walls--they are horribly jittery.
- Moved the calculation of the initial texture coordinate out of the column
  drawers and into their callers. Besides making the column drawers simpler,
  it also allows for some optimizations of masked texture/sprite rendering,
  where the initial coordinate is almost always 0.
- Added variable field of view. Use the fov command to change it.

August 11, 1999
- When using -nosound, MIDAS's dsmClearBufferFloat() sometimes tries to free
  memory that isn't allocated (apparently already freed). To compensate, I
  avoid initializing MIDAS when -nosound or -nosfx is specified instead of
  setting MIDAS's nosound option.
- Found that when a stat display is active when the game is quit, a pure
  virtual function call was being made. Unfortunately, when I tried to track
  it down, the problem stopped.
- Optimized away two multiplies I had added to R_MapPlane() earlier. Oddly,
  performance seems unaffected.

August 10, 1999
- Did some performance tuning for the yslope movement loop in
  R_SetupFrame(). memmove() is not an intrinsic function, so I wrote some
  loops that VC++ optimizes nicely. (Other optimizing compilers should be
  able to do the job just as well.) I also split up the loop that calculates
  the yslope values into three cases so that the body of the loop can be as
  simple as possible.
  It probably wasn't worth the effort...
- Changed P_SpawnPlayer to set player_t::attacker to NULL so that invalid
  attackers aren't carried over across levels, which can cause the problems
  if you try to save your game before being attacked on the new level.
- Finished reimplementing hub travel. The new code in FArchive worked
  properly on the first try. (Yay!)

August 7, 1999
- Added some code to FArchive that distinguishes player-controlled actors
  (but not voodoo dolls) so that the stored actors can be overridden by
  explicitly spawned ones when travelling between levels in a hud. Untested,
  but I think it should work.
- For curiosity's sake, a did a comparison of savegame sizes with 1.17c and
  test9. The map tested was map29, just after spawning. The 1.17c snapshot
  for the level was 99542 bytes uncompressed (20659 compressed). The test9
  snapshot was 111786 bytes uncompressed (14824 compressed). So the new
  archive format is bigger but compresses better, which I'll consider to be
  a good thing, because snapshots are normally stored in memory in their
  compressed state.

August 6, 1999
- Changed the tag changing behavior of W_CacheLumpNum(). Before, it would
  always change a block's tag. Now, it will only change the tag if the new
  one is less than the previous. This way, a block can be promoted from
  PU_CACHE to PU_STATIC, but not the other way around. This was the cause
  of intermittant bugs that were visible in st_new.cpp. ST_New uses some
  graphics that also serve as sprite graphics. When those sprites are drawn,
  their tags were changed to PU_CACHE, and with enough spawning, their data
  could be overwritten, and st_new would never know.

August 5, 1999
- Changed M_Drawer() to use V_BreakLines() to split lines for prompt
  messages, because it wasn't working right. Also fixed a bug in
  V_BreakLines() so that now it will recognize blank lines.
- Added nofilecompression cvar to prevent compression of LZO files.
- Fixed savegames.
- Made the thinkers the first thing that gets serialized in a level
  snapshot (instead of sectors and walls), because a sector's specialdata
  fields might cause a thinker to be serialized. But when
  DThinker::SerializeAll is called, it destroys all existing thinkers,
  including the ones that were created while reading the sectors. Storing
  the thinkers before anything else avoids this.
- Moved the serialization of player data into G_SerializeLevel. The bots
  use pointers to some actors in their player_s, so we need to keep the
  player data in the same context as the actors they reference. (i.e. They
  need to go in the level snapshot instead of outside of them as was done
  previously.)
- Also fixed a bug with FLZOFile::Write. If a large write request was made,
  it would only double the amount of memory to store the file in, which
  might not have been enough. Now it doubles it until the buffer is large
  enough to store the new data.
- Figured out what was wrong with storing FLZOMemFiles in an archive: I was
  forgetting to add the 8 bytes of header to the size of the block to write
  out.

August 4, 1999
- Hubs somewhat work. Level data is properly stored on exit and loaded when
  reentering the level. I just need to fix the player spawning. Savegames
  are another matter. I seem to be having trouble embedding an FLZOMemFile
  inside an archive. It appears to be getting saved properly, but trying to
  decompress it crashes.
- Got the FArchive class working. It is now able to write out objects and
  reconstruct them, filling in pointers as appropriate. Cool.

August 3, 1999
- Instead of relying on Z_FreeTags to remove all thinkers when a new level
  is started, I now call DThinker::RemoveAllThinkers, so that any subclasses
  of DThinker that have custom destructors can have them called. Currently,
  the only one with a destructor is DACSThinker, which destroys all the
  active scripts.
- Created a thinker responsible for running the ACS scripts, because it
  makes serializing them easier.
- Moved some of the mobj handling functions into the AActor class. Most
  notably, P_SpawnMobj and P_RemoveMobj are gone. Use the new and delete
  operators instead. AActor has a constructor that takes the same parameters
  as P_SpawnMobj, so converting old code to use new is easy enough.

August 1, 1999
- Changed the code in i_music.cpp to use a simple class hierarchy for
  defining music formats and how to play them. This removed some (messy)
  switch statements and the nameless unions (that I guess mingw32 chokes on).
- Rearranged the atterm functions so that I_ShutdownMusic() is called before
  I_ShutdownSound() to prevent crashes when a MOD is playing at shutdown time.

July 31, 1999
- Removed the lists of active ceilings and plats, mainly because it makes
  the serialization code simpler, but also because the same result can be
  achieved (albeit more slowly) by searching the list of thinkers for each
  instance of DCeiling or DPlat.
- Made the active buttons (button_t) and earthquakes (quake_t) subclasses of
  DThinker (DActiveButton and DEarthquake, respectively).
- Created a TThinkerIterator template class to manage iterating through the
  list of active thinkers.

July 28, 1999
- Ever since I added the extra network commands (like say) around a year ago,
  I have been executing them the instant they arrived from the network. I
  have only now figured out that this is wrong. They should be stored and
  only executed when the gametic they arrived with is executed. With commands
  like say, the timing is unimportant. With other commands, like changemap,
  it can be vital that all machines execute the command on the same gametic.
- Made some changes to the ticcmd building code in d_net.cpp to compensate
  for ticdups greater than 1 by dividing pitch and yaw deltas by the ticdup
  value so that the end result of moving the mouse a certain distance is the
  same as if a ticdup of 1 were used. This is also necessary to make bots
  work with ticdups other than 1.
- Fixed the crazy bot turning. The cause? I was calculating angle deltas for
  the bots' ticcmds based on their yaw when their think routine was called.
  This is incorrect, because that yaw can incorrectly reflect the state of
  the current gametic, because maketic can be more than 1 tic in advance of
  gametic. The correct way is to take the bot's current yaw, add all the
  deltas that haven't been played yet to it, and using the resulting yaw as
  the base for the current maketic's yaw delta. In some ways, this is exactly
  what you would also do for player prediction.

July 26, 1999
- Removed G_InitPlayer(). It was never used and just called G_PlayerReborn().

July 23, 1999
- Spent too many hours tracking down a circular #include dependancy I had
  inadvertantly created yesterday.

July 22, 1999
- Did some work with the savegame serialization.

July 21, 1999
- Changed P_SpawnMapThing() to silently reject mapthings of type -1.
- Fixed kill command to restore player's MF_SHOOTABLE flag before doing the
  damage.
- Changed bot observer mode to use noclip instead of noblockmap. Otherwise,
  the player is unable to ride lifts while observing.
- The bot code spawns bglobal.body1 and bglobal.body2 actors to help with
  aiming. The original code would carry pointers to these over between
  levels, even though all actors disappear when travelling between levels.
  Not a good thing. Fixed.

July 20, 1999
- Changed the network code so that now bots work in network games. Their
  ticcmds are sent along with the arbitrator's to the other players in the
  game. This way, only one computer is responsible for doing the bot
  thinking. (BOOM's random number generator was extremely useful for this.)
  Unfortunately, the bots seem to have trouble aiming with more than one
  live player and often end up spinning wildly.
- Made weapondrop a server variable.
- Fixed bots so that they can be recorded in savegames. There were two things
  preventing it before: 1) The bots ticcmd was being written directly to the
  player structure instead of netcmds, so the demo writer never had a change
  to see the bot's commands. 2) There are several places in the bot code that
  fiddle with the bot's angle directly. The quick (and acceptable) fix was to
  keep the fiddling in, but use the new angle to calculate the bot's ucmd.yaw
  value and set its angle back to what it was before being fiddled.
- Delayed the call to I_InitMusic() in I_InitSound() until after MIDAS
  is initialized. Also removed the call to I_ShutdownMusic() in I_InitSound(),
  since I_ShutdownMusic() will be called automatically at exit.

July 19, 1999
- Made the network arbitrator changeable, so that if player 1 leaves the game,
  someone will still be able to control things.
- Moved the call to I_FinishClockCalibration() before D_CheckNetGame().

July 17, 1999
- Changed several references in am_map.cpp from plr to the console player's
  camera. Also added colors for inter- and intra-level teleporters.
- Changed P_PlayerThink() so that the game doesn't die if you try to add more
  bots than there are coop starts (in a coop game, of course).
- Fixed removebots command so that if you are looking through a bot's eyes
  when you remove the bots, your vision is restored to your own head.

July 16, 1999
- Fixed the rotation of player arrows in the rotating automap in coop games.
- Changed wipe_initBurn to allocate FIREHEIGHT+5 rows. Apparently FIREHEIGHT+4
  wasn't enough.
- Fixed SN_StartSequence so that it doesn't attempt to play nonassigned
  sequences. I had broken it when I separated part of the code into a
  separate TwiddleSeqNum function.

July 14, 1999
- Moved the "VectorCopy (RailEnd, end);" line in P_RailAttack() in front of
  the for loop.

July 12, 1999
- Enclosed the bot thinking code inside if (bglobal.botnum) {} blocks so that
  no bot thinking occurs when there are no bots. Also defaulted bot_calcnodes
  to 0. If a bot is spawned, and there are no nodes loaded, bot_calcnodes
  will automatically be set to 1. Now the bots don't eat up any time if none
  are present in the world.
- Added a generic FStat class. Different statistics can be measured and
  reported by subclassing it. The console command "stat" provides the
  interface to select which stats to view.
- You cannot directly call a constructor from inside another constructor to
  help do initialization. Instead, you end up with a temporary object that
  is destroyed immediately when the second constructor finishes. This was
  causing crashes with wall scrollers, because their constructor was calling
  the constructor for more general scrollers.

July 11, 1999
- Changed the bot code so that it doesn't go into multiplayer mode until
  after a bot is spawned, so the game won't be in coop mode when players have
  no intention of playing with bots.

July 10, 1999
- Changed ReplaceString() function to properly handle the case where the 
  string being replaced is the same as the new one.
- Cajun bot now runs under ZDoom, although some things aren't perfect (such
  as skin color).

July 9, 1999
- Received the Cajun bot source. Started moving it to ZDoom.

July 7, 1999
- The sky can now scale horizontally as well as vertically (when using
  r_stretchsky), so its aspect ratio is preserved when stretched.
- Redid the Wu line drawer to support 64 intensity levels and wrote a version
  that used the translucency tables so that it could look good in overlayed
  mode. Also cleaned up the code to make it more readable (to me anyway) and
  removed the use of short ints.

July 6, 1999
- Restored Cmd_Exec to it's 1.17c version. I'm not sure what I was trying to
  accomplish with the changes I made, but they broke it under certain
  situations.

July 5, 1999
- Added Heretic's anti-aliased Wu line drawer to the automap.
- Delayed the execution of cvar callbacks until the video subsystem has been
  initialized.

July 3, 1999
- ST_Start() now sets the status bar dimensions.
- Fixed some of the DCanvas member functions that used width and height as
  parameters. Having two function parameters with the same names as two
  member variables is not a good thing...

July 2, 1999
- Converted screen_t to class DCanvas and moved a bunch of the screen drawing
  functions into it. This let me catch a few instances where the screen
  dimensions were being referenced before they were initialized.
- Found this code in i_input.cpp under WM_ACTIVATE:
		if (Fullscreen)
		{
			extern int DisplayWidth, DisplayHeight, DisplayBits;
			I_SetMode (DisplayWidth, DisplayHeight, DisplayBits);
		}
  Apparently, I added it when converting the video code to OpenPTC and
  completely forgot about it. I still don't remember adding it. This was
  probably the cause of problems starting up in fullscreen mode with some
  chipsets. (Banshee and Voodoo3 are the two I know about.)
- Changed refreshDisplay() in i_video.cpp to not do anything during startup.
- Added a WM_GETMINMAXINFO handler to prevent the user from shrinking the
  window smaller than the surface.

July 1, 1999
- Added default aliases for idclip and idspispopd that point to noclip.
- Further fleshed out the DConsoleCommand and DConsoleAlias classes. Commands
  and aliases are now hashed in the same array, and aliases get saved to the
  config file again.
- Changed PIT_ChangeSector() to not call P_DamageMobj() if the crushing damage
  is 0. This is the way it used to be in Doom (so I hear; I don't feel like
  checking), but not in Hexen.
- Added a check to P_SpawnMapThing() to not bother checking mapthings of
  type 0. Apparently, some maps in Final Doom actually have these.
- DActor.movecount needs to be signed; there are places in p_enemy.cpp that
  test if it is < 0. I had changed it to unsigned. Making it signed again
  fixed the problem in test1 that made monsters act as if they had "bad
  vision."
- Changed P_AimLineAttack to calculate the top and bottom slope based on a
  spherical 64 degree vertical field of view instead of just adding some
  values to the center slope. With things that look straight ahead, the
  result is the same as the original Doom. With things that don't, the result
  is more correct than before. Also fixes the BFG problem in test1.

June 30, 1999
- Did some cleanup. Released 118test1.

June 29, 1999
- Made the actor's pitch member variable represent an angle between -ANGLE_90
  and +ANGLE_90 exclusive instead of a screen sliding amount. Now the same
  representation can be used for the current engine and any possible future
  ones that offer true 6 DOF. This also makes the relationship between pitch
  and all the slope values Doom uses for collision detection more apparent--
  just take the tangent of the pitch instead of multiplying it by a magic
  number.

June 23, 1999
- Moved the multiplication by lightscalexmul out of the inner wall
  rendering loop so that it can be stepped instead, saving all the time I
  used to be spending multiplying.
- Finished converting all cvars to a cvar_t class. Use the macros defined in
  c_cvars.h for declaring them. One (possibly significant for mods) change
  is that callback functions are now always called when a cvar is created.
  If callback depends on something else being initialized to work properly
  (see snd_mididevice in i_music.cpp), either make sure the callback only
  does its thing once the stuff it needs has been initialized, or don't
  create any instances of the cvar until the initialization has finished.

June 17, 1999
- Added flat scaling, manual panning, and rotation.
- Fixed a problem with PCD_UNARYMINUS. It was popping the result off the
  stack, so any calculations that used it were wrong and could potentially
  crash.

June 15, 1999
- Got the program to compile and link as C++ code. Some structs have been
  transformed into classes, and savegames are disabled until I can get
  serialization to work.

June 11, 1999
- Found an interesting problem with EV_StartLightFlickering. It takes two
  parameters describing the light levels, but they were completely ignored.
  Fixed.

June 7, 1999
- Changed R_FakeFlat to optionally not care about whether or not the camera's
  current sector is also in a sector referenced by a Transfer_Heights special.
- Changed all numspechit loops in the code to test against (numspechit > 0)
  instead of (numspechit--).
- Changed Thing_Projectile(Gravity) so that it should work properly with any
  non-missiles.
- Fixed a bug in P_NightmareRespawn caused by mindlessly cutting-and-pasting
  from P_SpawnMapThing.
- Found a bug in the translation of BOOM generalized floors/ceilings. One
  of my bit shifts was off by one. Also fixed the code in zwadconv.
- Changed the boss brain's height back to 16 for compatibility with
  Strain MAP20.
- A few days ago, I tried sorting the edges of polyobjects at runtime to
  support concave polys at any rotation. It didn't work. I'll probably
  have to use a span buffer.
- Stuck in my new span drawer. I actually wrote it about two months ago.
  Now it's finally going to be in a release version of ZDoom. It's about
  6 fps (~23%) faster at 1024x768. Also removed ds_colshift (because it is
  no longer used) and the unrolled span drawer in linear.nas.
- The turbo cvar's callback wasn't being called when it was set. Fixed.
- This a huge gap between log entries. Sorry, but I've been too lazy to
  write anything here.

March 15, 1999
- Added support for custom ambient sound attenuations. This is an optional
  floating point value that follows the point keyword.
- For 1.17, I had changed the sound volumes in s_sound.c to floats
  *except* for the ambient sounds which were still being treated as byte
  values between 0-255, so they would always play at full volume. Fixed.

March 14, 1999
- Discovered a savegame bug: An mobj's translation table was being saved
  improperly and could point to invalid memory on reload. Fixed.
- Added another dmflag, DF_RESPAWN_SUPER, to cause invulnerability and
  invisibility to respawn. No room in menu, so you have to set it by hand.
- Added an alwaysapplydmflags cvar that can be used to cause dmflags that
  normally only affect deathmatch to apply to single player and coop games
  as well.
- Changed P_Thing_Spawn() so that it can spawns things anywhere and not
  just at map spots. (Useful for making it look like a monster was carrying
  an item.)
- Added support for MBF's sky texture transfer linedefs. Also added support
  for Hexen's Sky2 sector special.
- In r_plane.c, spanstop was never used anywhere. Removed it.

March 10, 1999
- Made the network code "better." htons is used in the appropriate places,
  and the port a packet is sent from is used to determine which node sent
  a packet (so now I can test more than two-player games on my machine).
- Added an event-driven timer routine. Instead of busy waiting for a new tic,
  I can wait on an event and give other processes some CPU time. This makes
  two-player games on one machine run much more smoothly on Windows 95/98.
  (It was already smooth for the foreground player on NT.)

March 8, 1999
- Fixed a problem with R_DrawPSprite. It was leaving vis->translucency unset,
  which could produce odd results depending on the contents of the stack.

March 7, 1999
- Discovered a big problem with my linked list of ceiling_t's implementation.
  Fixed.

March 6, 1999
- Added two new screen wipes: burn and crossfade.
- The mid-screen message gets cleared out on level load now.
- Stopped using the zone heap to store level snapshots.
- Enhanced the stealth monsters so that they will take advantage of all
  translucency levels available.
- Fixed the damage for A_MonsterRail. I guess DOOM doesn't copy the damage
  amount out of the mobjinfo when an mobj is spawned.
- Added a check to the fullscreen HUD to prevent it from going outside the
  array of armor pictures if the AC was above 2.
- The DeHackEd code was setting the Blue AC for max soulsphere health. Fixed.
- Tried out Rick Clark's toxplant.wad and discovered a bug with the
  particles: They were colored by whichever sector was drawn last and not
  the sector they were in. Fixed.
- Pulled the old info.h from the 1.17a source so I could get things in a
  working state to put up a fixed DeHackEd version for the Ground Zero TC.

March 4, 1999
- Word of advice: When you have 2847 states and 399 mobjinfos (from Hexen)
  to reformat, don't try to do it all by hand. I was smart enough to use a
  program to convert all the states into the multigen format, but I thought
  I could handle the mobjs myself. Ha ha ha ha ha ha! After a few hours,
  my arm was aching, and I had only done about one fourth of the mobjinfos.
  Then I wrote a program to convert the ones from Hexen's info.c into
  multigen format, and all I had to do was drag them to the correct place
  with my mouse. Much easier, and much less strenuous. (Also much less
  error-prone.)

  For comparison, Heretic has 161 mobjinfos and 1205 states.
  Doom 2 has a mere 137 mobjinfos and 967 states.

March 3, 1999
- Had a change of plans about how I want to implement multiple games in a
  single executable. All the data in info.c and info.h will be moved to an
  external data file whose format is based on that used by multigen (the
  tool id used to generate info.c). The list of spawnable things will also
  be moved out of p_things.c and into this file.
  
  This means that everything I did in info.h on March 1 was wasted. Oh well.

March 1, 1999
- Pasted labels for the Heretic and Hexen things into info.c. Had to
  shuffle a few of them around:

  --- Things renamed ---
	MT_MISC* -> MT_DMISC* (if Doom)
				MT_HMISC* (if Heretic)
				MT_XMISC* (if Hexen)
	MT_BARREL -> MT_HBARREL (for Heretic)
				 MT_DBARREL (for Doom)
	MT_TFOG -> MT_DTFOG, MT_HTFOG, MT_XTFOG
			   created a new MT_TFOG elsewhere. the others should be
			   copied on top of it as appropriate.
	MT_HEAD -> renamed Doom's to MT_CACODEMON
	MT_KNIGHT -> renamed Doom's to MT_HELLKNIGHT
	MT_FIREBOMB -> MT_HFIREBOMB, MT_XFIREBOMB

  --- Things moved into common Heretic/Hexen section ---
	MT_ARTIFLY
	MT_ARTIINVULNERABILITY -> ditto
	MT_ARTIEGG -> ditto
	MT_EGGFX -> ditto
	MT_ARTISUPERHEAL -> ditto
	MT_ARTITELEPORT -> ditto
	MT_SPLASH
	MT_SPLASHBASE
	MT_LAVASPLASH
	MT_LAVASMAKE
	MT_SLUDGECHUNK
	MT_SLUDGESPLASH
	MT_BLOODSPLATTER
	MT_BLOODYSKULL
	MT_MNTRFX1
	MT_MNTRFX2 (deathsound is sfx_phohit in Heretic, no sound in Hexen)
	MT_MNTRFX3
	MT_SOUNDWATERFALL

  --- Things moved to global section ---
	MT_BLOOD (note that Hexen's blood has mass 5, not 100. was #38)
	MT_TELEPORTMAN (was #41)
	MT_PLAYER (was #0) Hexen's is name differently, so it didn't move.

	(Hexen things renamed)
	MT_MINOTAUR -> MT_MAULATOR
	MT_SOUNDWIND -> MT_XSOUNDWIND

- Added a pulsating effect for the invisibility powerup that slowly
  "pulses" it in and out of visibility, but never going below 25%, so it's
  never totally invisible.
- Spent a few hours with the DOSDoom translucency code. I think the
  greenness of it is probably more the fault of DOOM's limited palette,
  particularly after comparing the 25% translucency table from before
  with 25% translucency now. Very low levels of translucency with one
  of the colors being dark are still too green, though.

February 28, 1999
- Added DOSDoom 0.65's translucency code. I'm not sure if it was really
  worth it, though. I tried Allegro's RGB table code to speed up the
  generation of the translucency table, but it didn't seem to produce
  very satisfactory results, so I use BestColor to find palette colors
  to use. The results are satisfactory, but they seem a bit too green.
- Delayed gathering of data on a sprite's patches (width, topoffset, and
  offset) until it is needed (either when the level is precached, or when
  the sprite is first seen). Game startup is a great deal quicker without
  any noticable performance hit elsewhere. Cool.

February 27, 1999
- Note: Hexen's friction is roughly equivalent to a Sector_SetFriction of
  171 (ends up as 0xf909, Hexen uses 0xf900). Player movement thrust should
  be halved at this level. Changed the calculation of sector->movefactor
  accordingly. (With the BOOM code, player thrust was nearly one fourth
  normal with that level of friction.)
- Discovered that MBF's code to affect monsters with friction doesn't
  work without the change it made to how mobjs are linked into the blockmap.

February 24, 1999
- Stopped using stdio in w_wad.c.
- Had left some calls to W_Profile in W_InitMultipleFiles(). Removed.

February 21, 1999
- Added support for real looping sounds, because Herian 2 used so many of
  them, and the old method sounded pretty bad with them.
- Found a problem with sliding polyobj doors: If, when they try to close,
  they can't move anywhere from their open position, they would move
  slightly further open and leave a gap when they managed to close. Fixed.
- Added support for auto-loading of skins if they're in a skins directory
  in the same directory as the executable.
- Added support for C-style formatting codes to ACS print statements.
- Fixed a problem where, when a player turns into a pile of bloody gibs
  (from e.g. a crushing ceiling), they would assume their standing position.
  This is because the gibs are a different sprite, and I wasn't letting
  player mobjs change their sprite.
- Fixed ceilings so that they stop making noise when they get put in stasis.
- PIT_ChangeSector() can spawn particle blood now.
- Fixed R_DrawSplash2() so that it doesn't draw all the particles to the
  left of the impact point.
- Added an A_MonsterRail function so monsters can shoot a railgun too.
- Fixed the railgun sound when you're not the one shooting it. My algorithm
  for finding the closest point on the line was wrong and still should
  remnants from when I was calculating the distance from the line.
- Fixed some player bobbing problems.

February 20, 1999
- Changed sparks to play with static attenuation.
- Found out why pickup messages would sometimes seemingly print several
  times for a single item. Some maps have several of the same item on top
  of each other so that a player can get more than they would normally
  without even realizing it. I get around this by disallowing two identical
  pickup messages from being printed back-to-back in a single tic.
- Fixed transsouls. I wasn't calling its callback at initialization, so it
  wouldn't take effect until the next time it was changed at the console.
- Recompiled PTC with DDFLIP_WAIT enabled. I had accidentally left it off
  from my testing run on January 8.
- Dug up the DirectDraw code from 1.12 and used it to add DirectDraw support
  back into the game. Now even people who can't get PTC to work should be
  able to use it.
  One interesting thing I noticed is that IDirectDrawSurface's Blt method
  is horribly slow for blitting between system and video memory. I tried it,
  thinking it would be optimized, but it wasn't even close.
- Added the A_Die, A_Detonate, and A_Mushroom routines from MBF.
- Removed the screens array and replaced it with a single variable named
  (oddly enough) screen.
- Added a V_SetBlend() to F_StartFinale() to get rid of any palette flashes
  that might have been on screen (such as after finishing E1M8).
- Discovered the real reason why the brain shooter wasn't working. DOOM
  doesn't explode noclip missiles when they go above the ceiling or below
  the floor; it just adjusts their positions. Hexen doesn't have that check
  for noclip, so it will explode/remove it. I guess I didn't check MAP30
  after adding Hexen's z-checking.

February 19, 1999
- Finally got around to fixing V_DrawPatchFlipped(). Wow, that was easy. I
  wonder why I was having so much trouble with it the last time I touched it
  many months ago.
- Changed the item pickup sounds to play with a NULL entity for the local
  player (like before), but still play on CHAN_ITEM for other players.
- Fixed the problem of monster names not being drawn in the cast finale: I
  was still xoring each character with 0x80 to make it red under the old
  text system.
- Changed the keyboard code so that the keypad isn't translated into number
  keys in full console mode with the menu active.
- Fixed the Read This! sequence of menus in Ultimate Doom. When it's
  finished, it's supposed to re-enable the skull and empty the stack.
- Fixed a problem with raise doors. In Doom, you can close them prematurely
  by activating them again. I had the right idea:
		if (GET_SPAC(line->flags) == SPAC_PUSH)
  but it should have been
		if (GET_SPAC(line->flags) != SPAC_PUSH)

February 18, 1999
- Release 1.17 again, hopefully this time for good.
- Fixed some problems that were already found with 1.17:
  * The cubes spawned by the boss on DOOM2/MAP30 would be in the ceiling and
    disappear right away. (All I can say is that it worked before; I don't
	know why it stopped.)
  * Because of my quick hack for voodoo doll obituaries, getting killed by
    the world would crash.
  * Open scripts above 255 wouldn't properly restart when the level
    reloaded because the game thought they were still running.

February 17, 1999
- Made a final "final" compile of 1.17.
- Removed the hack that could transform normal exits into Teleport_NewMaps
  during the level translation process.
- Realized I had forgotten to do the following, so I did them:
  * Support the MF_TRANSLATION bits for DeHackEd patches that use them.
  * Add a TRANSLUC75 .bex mnemonic for symmetry.
  * Add a defaultmap entry for MAPINFO lumps.
  * Make r_columnmethod 1 the default.
  * Add a neverswitchonpickup cvar.
  * Extralight and fullbright need to be ignored in foggy areas.

February 16, 1999
- Did a final compile for 1.17 under both DOS and Win32. This will be the
  first release where I release versions for both operating systems
  simultaneously. Eventually, I'll have to abandon DOS if I want to keep
  progressing, but for now it's nice to be able to do this.
- Removed the limit on the number of sound sequences that can be loaded.
  There's still a limit on the number of translation slots, and I think
  it's good to leave it that way.
- Added a menu stack, so that pressing escape to back out of a menu only
  backs up through the menus the user has visited.
- Tried adding some code to djgpp/i_video.cpp so that it could write
  directly to VGA memory. Then I found out that regular VGA mode 13h
  doesn't support page flipping, so I took it out.

February 14, 1999
- Added some #ifdef's to i_sound.c so that it works equally well with
  both VC++ and DJGPP.
- Added support for Hexen's parallax skies. I'm not sure why I thought
  the front one was a normal masked texture. (It uses color 0 to indicate
  transparency instead.) I also removed R_DrawMaskedSky() and added the
  restriction that both sky textures must be the same height.

February 13, 1999
- Tried boomedit.wad, and it turns out I was wrong about ML_PASSUSE. Non-
  use lines could and did eat uses. Changed it so that only SPAC_USE
  does now.
- Moved the functionality of the ML_PASSUSE flag into a new activation
  type: SPAC_USETHROUGH. The flag was only applicable to use activation
  lines, so it seemed sensely to have it wasting a bit for all other
  types. Now I have a free linedef flag if I need it.
- Removed the hack to allow players to move if they were currently stuck.
  With it in, polyobjects could push players through walls, which is even
  more undesirable. Since I'm now using MBF's momentum code (which, like
  Doom's but not Boom's, allows players to build up enough momentum to
  escape from walls if they're trivially inside them), I don't really need
  the "fix" anyway.
- Added a revert argument to the ChangeCamera special that causes the camera
  to move back inside the player's head if he moves.
- Added a SetPlayerProperty special.
- Created things for the particle fountains and sparks.
- Created sound sequences for the appropriate Doom sector movements. I also
  had to expand on the language as defined by Hexen a bit.
- Replaced my floor waggling code with Hexen's, so now it's right.
- Added three new level flags:
	* evenlighting
	* noautosequences
	* forcenoskystretch
- Added a progress indicator for the translucency table building process.

February 12, 1999
- Removed the round-robin assignment of virtual channels in i_sound.c. Since
  we're no longer letting MIDAS pick the sfx channels for us, this is
  pointless (and potentially hazard-prone if many sounds are being played
  very frequently).
- Added support for sound sequences, so now the polyobjects aren't silent
  when they move.

February 11, 1999
- Added "support" for 0-length sounds. (Meaning they get replaced by dsempty
  instead of crashing when malloc tries to alloc 4 gigs for them.)

February 10, 1999
- Adopted Hexen's script parsing code (sc_man.c). It lends itself toward
  much cleaner script handling code. [no association with ACS]

February 7, 1999
- Incorporated MBF's friction code in place of BOOM's. (Incidentally, I also
  discovered that I had left out some of BOOM's. No matter now.)
- Added a hack to P_XYMovement() so that players will still be able to move
  if they get stuck inside a line or another thing.

February 6, 1999
- Played some deathmatch with gothicdm2 and noticed two problems:
    * On rare occasions, I would spawn and be stuck.
	* Weapon pickup messages would sometimes print more than once. (Was I
	  picking them up more than once when I ran over them? Not sure.)
	* Once when the other player died, he didn't turn into a corpse.
- Added the ability to activate scripts by picking up items.
- Changed the polyobject functions called from p_lnspec.c so that they take
  individual paremeters rather than a byte array of args.
- Demos can now be played from disk without first loading them with the
  -file parameter.
- The automap will now follow the console player's camera rather than the
  console player himself.
- Added a notice warning that a demo will go out of sync if it was recorded
  with a different version of the game.
- Added playdemo and timedemo commands.
- Added colored text support and different message levels. This was
  planned for several months, and now I've finally written the code for it.

February 4, 1999
- Modified C_AddNotifyString() so that it properly supports lines
  ending with '\r' or '\n' instead of assuming that they all end with
  '\n' and starting each on a new line.
- Fixed a problem with PTR_CameraTraverse() that could position the
  chasecam inside a two-sided wall.
- Removed the handling for ANIM_RANDOM from wi_stuff.c since it wasn't
  used anywhere.

February 3, 1999
- Removed the use of screens[1] in wi_stuff.c by allocating a new screen
  just big enough to hold the background image and then blitting that to
  the screen each frame.
- Changed the demo loop a bit so that it will automatically try to play
  any number of demos beginning with DEMO1 and continuing up in sequence.
  (Of course, since I removed the ability to play old-style demos, it's
  only of use for wads that provide their own demos.)
- Did a bunch of miscellaneous cleanup from the Hexen source.
- Fixed player extreme deaths playing "*gibbed" instead of "*xdeath1".
- When a player leaves a network game, their body is now removed.
- Removed the check against monsters crossing secret lines. They *can*
  cross secret lines and activate them, they just don't use/push secret
  lines.

January 31, 1999
- Linedef type 134 was being improperly translated to require a blue key.
  It should have been red.
- Fixed a round-off problem in P_ZMovement() that could cause the player's
  landing sound to play when the player wasn't falling fast enough. For
  some reason, converting the floating point minimum momz to an it was
  subtracting one (even though it was already integral). So, for normal
  gravity, it was comparing the player's z momentum against -524287
  instead of -524288.
- Fixed a crash bug in M_LoadDefaults() when migrating from a pre-1.14
  config file without any binding for F5.

January 30, 1999
- Added blood, gunshot, and grenade particle effects.

January 29, 1999
- Fixed up the handling of .bex thing mnemonics and added the names for
  the second set of flags (albeit, not many are actually implemented).

January 27, 1999
- Created a new traversal function for the rail gun.
- Finally figured out why so many lost souls spawned by pain elementals
  were getting stuck. I was spawning two lost souls in the same spot (where
  there should have been only one). Oops.
- Found a case where the sight-checking code could trace a line that missed
  its ending cell and continue off the edge of the map, thus crashing the
  game. Made some changes to compensate: When the ending column or row is
  reached, mapxstep or mapystep will be set to 0 to prevent it from
  traversing any further in that direction.
- Using spynext and spyprev now briefly display the name of the player
  you switched to.

January 25, 1999
- Added armor and keys to the fullscreen HUD.

January 24, 1999
- Imported Hexen's z-checking code in place of my own. Hopefully it will
  work better. Also added a few other Hexenism while I was at it, like
  bouncy objects.
- Sped up wipes on tall screens so they should be about the same speed as
  one 200 pixels tall.
- Fixed plats so that they properly rebound off the ceiling. I was
  checking if the plat's crush field was non-zero when I should have been
  checking that it wasn't -1.
- Made some more improvements to D_ErrorLoop().
- Fixed some problems with the lighting with different r_detail values.
- columnofs[] was being constructed wrong for horizontally stretched
  detailed modes (too far to the right). Fixed.
- Added some unrolled drawers based off the Hexen source for 320x200
  and 320x240. I don't expect anything but a 386/486 to benefit from them.

January 23, 1999
- Fixed the light-amp so that it doesn't turn off colored lighting.
- Added positional sounds. Now that I have them, I also removed the
  temporary switch mobj that was used to provide a place to play the
  switch sounds.
- During demo playback, the chase command will now let you switch to
  and from the chasecam, so chasedemo isn't really needed unless you want
  to start the demo in chasecam mode.
- Added the player's score to the fullscreen HUD in deathmatch.
- Fixed the spynext/spyprev commands so that they properly update the
  status bar when you switch to another player. Also fixed it so the
  camera doesn't stay in a dead player's corpse if you're not watching
  the person who recorded the demo.
- Fixed the alignment of the scores display at high resolutions and also
  added a level countdown timer if timelimit is in effect (ala Lithium).
- Removed Hexen's solution for getting the player to produce more than
  one sound and adopted Quake's: each mobj has 8 channels with some of
  them set aside for predefined uses.

January 21, 1999
- Stopped using MIDAS's auto effect channels and started using the ones
  calculated by the game's own sound code. This seems to have fixed all
  the previous problems with sounds cutting out prematurely.

January 20, 1999
- Adjusted the WEAPONTOP #define in p_pspr.c so that the player sprites
  will meet the bottom of the screen at higher resolutions instead of
  leaving a gap.

January 17, 1999
- Added a chasedemo cvar. When it's true, the demo is played back in
  chasecam mode.
- Fixed a memory leak when the game had to generate a translucency table.
  (out was not being freed.)
- Stopped using Z_Malloc() for temporary compression buffers and switched
  to the libc functions. (libc has a bigger memory pool.)
- Fixed problem with skins that used sounds in the IWAD.
- Fixed a bug that could crash the game if something went amiss during
  the startup process but after setjmp() was called. Now D_ErrorLoop()
  explicitly enters the GS_FULLCONSOLE state before doing anything else.

January 16, 1999
- Added particle fountain effects with the following colors:
	red, green, blue, yellow, purple, black, and white
- Got rocket trails into a state I think looks nice.
- Improved the particle system further by making the particle sizes
  adjustable, letting particles fade out over time, and moving all of
  the particle thinking out of the renderer and into the play simulation.
- Imported some of Hexen's sound code to limit the total number of same
  sounds playing and also to allow players to make more than one noise
  at a time.
- Fixed the operation of FloorAndCeiling_(Raise/Lower)ByValue. Contrary
  to what the Hexen specs state, they do not multiply their height
  argument by 8.

January 14, 1999
- Switched to the p_sight.c of Hexen. This is benefitial for two reasons:
  1. It knows about polyobjects.
  2. It doesn't traverse the BSP tree. Yes, I know this means it's slower,
     but it also means I can use it with a portal engine, which doesn't
	 even have a BSP tree.
- Moved the locating of the polyobj spots out of PO_Init() and into
  P_SpawnMapThing().

January 12, 1999
- Added the polyobject stuff from Hexen.
- Copied Hexen's earthquake viewshifting code into R_SetupFrame().
- Changed P_Thing_Projectile() so that it can play a thing's sight sound
  and sets some other values properly.
- Added a delay to open and deferred scripts of one second after seeing
  that the Hexen code does it (and it's a good way of avoiding delays in
  open scripts to get past the screen wipe).
- Fixed a bug in P_StartScript() that would cause it to crash if someone
  tried to start a nonexistant script.

January 11, 1999
- Added an r_drawflat cvar to draw segs as flat colors instead of textures.
- In R_StoreWallRange(), changed the lighting calculation so that lines will
  have the same amount of light no matter what their orientation if a
  non-black fade is applied to them (otherwise the fog effect looks dumb).

January 10, 1999
- Added a rocket trail using the particle system.
- Added a particle system.
- Added support for PWADs like Gothic DM2 that used a hack to get sprites-in-
  a-pwad with regular Doom by making some changes to W_MergeLumps().

January 9, 1999
- Added a progress-meter to the console.
- Made a fix (submitted by John Cole) to the height-checking code so that if a
  player stands on another player, the player on the bottom doesn't get
  stuck.
- Changed P_GiveWeapon() to check if there are any graphics for a weapon. If
  there aren't, then it won't give the player the weapon. Also changed "give
  weapons" to call P_GiveWeapon() so that it won't give the player a weapon
  that doesn't exist in the current iwad (like the ssg with doom.wad).
- Fixed psprites so that the muzzleflash has the same visibility (fuzz) flags
  as the weapon sprite.
- Added the setting of YourColor when am_usecustomcolors is 0. It should have
  been there a long time ago.

January 8, 1999
- Since the new column rendering code is essentially done (unless I decide
  that it's actually worth the hassle to draw columns in bunches of 8--4 was
  enough bother), I took some timings with the new and old routines. These
  are for looking directly at a wall, the worst-case scenario for the old
  routines. I tried disabling vbl wait, but DirectDraw always seems to do it
  even when I don't tell it to, so the numbers for the low resolutions aren't
  very informative since they cap at the screen's refresh rate. Rates from
  two Build games under similar conditions are also given for comparison.
  This is on my PII-350:

	mode		old		new		Blood	Duke3D
	320x200		70		70		212		324
	320x240		60		60		174		274
	400x300		60		60		120		212
	480x360		60		60		91		147
	512x384		40		60		80		128
	640x400		32		64		60		96
	640x480		27		57		51		83
	800x600		27		42		34		51
	960x720		12		27		24		37
	1024x768	8		21		21		33
	1152x864	9		19		17		23
	1280x1024	6		15		12		17

  It looks like the new routines are about twice as fast as the old ones. It
  also looks like I can draw walls faster than Blood but not Duke. For
  rendering a real scene that consists of more than just a single wall, ZDoom
  beats them both, since a single wall is the best-case scenario for Build.
  Frame rates in ZDoom seem to be pretty even now, which is nice since the
  old routines were significantly slower at drawing walls than anything else.

- Put in a check in R_RenderSegLoop1() and R_RenderSegLoop2() for NULL
  walllights. Right after starting a level, it seems walllights isn't
  getting set properly, but it appears to work fine afterward. Hmm...
- Got back to school and had a chance to try the new routines on my machine
  and, wow! I can now do a steady 35 fps at 800x600. 960x720 hovers around
  27 fps. 1024x768 is around 20 fps. Not bad.

January 6, 1999
- Wrote a better assembly version of R_DrawColumnHoriz() with no partial
  register stalls and presumably no AGI stalls on regular Pentiums. If it's
  faster than the C code, it's not much faster. (At least it's not
  significantly slower, anyway.)

January 5, 1999
- Tried an assembly version of R_DrawColumnHoriz(). It was actually
  slower than the C code by about 8 fps. Probably because of all the
  partial register stalls. I guess they really can kill performance.
  Stupid Intel processors. :-)
- Continued work on the optimized column drawers so that they have
  analogues of all the regular column drawers and can also be used to
  draw sprites. On this P-II 300, 720x480 runs at a pretty consistent
  35 fps. 864x480 isn't much worse, either. (Yeah, weird modes, I know.)
  800x600 runs at about 25 fps. Not bad, considering that this is all
  C code.
- Added R_StretchColumn() and R_DrawTlatedLucentColumn() functions.

January 4, 1999
- Recompiled everything with __fastcall as the default parameter-passing
  convention. Is it better? Not sure, but the exe did shrink by 11k. I
  think the framerate may have risen by 0.5 fps, too.

January 3, 1999
- Added support for using RIFF WAVEs as sound lumps.

January 2, 1999
- Fixed EV_StopPlat() so that it doesn't get stuck looping on the first
  plat because I had forgot to advance scan inside the while loop.
- Fixed P_LineAttack() so that it can still spawn bullet puffs on the
  floor or ceiling even if the bullet path never hits a line within range.

January 1, 1999
- Worked some more with the cache optimized column drawers. Now they work
  for masked walls and skies as well as solid walls.

December 28, 1998
- Added some C code to do "interleaved column drawing" (the method that
  proved to be the fastest in my test two days ago). Wall drawing is about
  twice as fast at 1024x768. Lower resolutions show less, but still
  measurable, improvement. Hopefully converting it to assembly will
  result in a further speedup.
- Fixed problem with monsters continuing to attack their target even after
  they had killed it.
- Adjusted the minimum distance between the chasecam and a wall/floor/
  ceiling.

December 27, 1998
- Added a chasecam. Use the chase command to turn it on and off.

December 26, 1998
- Ran a simple texturing test drawing a 128-pixel tall texture into a
  1024x768 block using several different methods. The methods and
  average times for one pass of each method are:
  > drawing it directly to the buffer: 94.18 ms
  > drawing four columns into a temp array and then merging
    them into the buffer: 24.456 ms
  > interleaving four columns into a temp array and then copying them
    into the buffer as a series of longword writes: 24.338 ms
  > interleaving four columns into a temp array and then colormapping them
    as they get copied to the buffer: 21.71 ms

  using variations of the fourth method for translated columns:
  > translating during the copy to the buffer: 21.684 ms
  > translation during the mapping to the temp array: 24.29 ms

  using variations of the third and fourth method for translucent columns:
  > colormapping into the temp array: 31.75 ms
  > colormapping during the copy to the buffer: 30.42 ms

  using variations of the third and fourth method for translated,
  translucent columns:
  > translating into the temp array: 32.58 ms
  > translating during the copy to the buffer: 31.45 ms

  These tests give me an idea of what I need to do to improve the game's
  renderer.

- Added an extension to normal exit lines during translation so that if a
  map has a MAPINFO entry, then it gets translated to Teleport_NewMap
  instead of Exit_Normal. The levelnum is (tag % 1000) and position is
  (tag / 1000). Thus, you can create hubs with regular Doom maps provided
  that they have MAPINFO entries.
- The video drivers on this machine at home have a weird bug. Apparently at
  random, when the palette is changed, random colors will have their blue
  values set to the opposite of what they should be. I can't see any way to
  work around it. Ah well. It's not my machine anyway... :-)
- Fixed togglemap so that it does nothing if the player isn't in a level.
  (Could have crashed if used on the title screen.)

December 25, 1998
- Added Static_Init special (190) to handle BOOM-like control linedefs for
  setting sector properties (at the moment: color, fog, damage, and gravity)
  at level load time.

December 24, 1998
- Fixed a problem in G_CheckSpot() where a corpse would get moved vertically
  to check for collisions in a spawn spot, but then it wouldn't be restored
  to its original height after the check.
- Fixed a problem I had introduced in P_LookForPlayers(). I had been
  operating under the assumption that whenever it was called, actor->target
  was NULL. Thus, I thought that assigning actor->goal to actor->target was
  safe even if actor->goal was NULL. This isn't the case. In coop, this
  function can be called with a valid actor->target. Setting it to NULL can
  then play havoc with P_NewChaseDir(), which can get called immediately
  afterward in A_Chase(). Now it only sets actor->target to actor->goal if
  actor->target is already NULL.

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.
- Removed 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.
