﻿January 3, 2010  (Changes by Graf Zahl)
- fixed: The player setup menu used the main menu's line spacing which
	for all non-Doom games was too wide.
- fixed: Strife's dialogues cannot use the new options menu code to draw
	themselves so now they use a stripped down version of the old code.
- Replaced I_MSTime with I_FPSTime in node builder timing because basetime
	will not be initialized yet if a map is started directly from the commandline.

January 2, 2010  (Changes by Graf Zahl)
- fixed: Polyobjects could contain segs that weren't flagged as such.
- fixed: Trying to show a popup crashed in the SBARINFO code because of a
	missing NULL pointer check.
- fixed: The ACS thinker needs its own statnum above all actors. Otherwise
	order of execution is not guaranteed.
- fixed: Only ActorMovers should go into STAT_ACTORMOVER, not all PathFollowers.
- fixed: SBARINFO's DrawGem command accepted a size value of 0 and divided
	by it. Reinstated the old '+1' this command had in the old code.
- fixed: The floor waggle code used FloatBobOffsets as sine table but this
	only has 64 entries and is not precise enough. It now uses finesine instead.
- fixed: When compositing a multipatch texture any patch that is a multpatch
	texture itself and contains rotations may not be composited directly into
	the destination buffer. This must be done with an intermediate buffer.
- Fixed: Drawing a slider in the options menu did not scale the x-coordinate.
- Fixed: If the alt HUD had to draw negative numbers the minus sign was misplaced
	due to incorrect texture coordinate calculations.
- changed option menu scaling for widescreen modes so that it doesn't scale down
	so quickly.
- made some error messages in DECORATE that don't affect the parsing non-fatal
	so that the parser can continue to find more problems.

January 1, 2010  (Changes by Graf Zahl)
- added initial support for a GAMEINFO lump in PWADs. When the game is started
	all files loaded with '-file' are scanned for this lump. This lump is read
	before any WAD initialization takes place, in particular the IWAD is not yet
	loaded at this time. This allows PWADs the option to specify an IWAD they
	want to run with and optionally autoload external resource WADs.
- Fixed a few places where FixPathSeperator was called with a locked FString buffer.
	It's better to use the FString version of this function instead.
- replaced wadlist_t with an array of FStrings and added a list parameter to
	everything that eventually calls D_AddFile. Also create the list of files
	loaded on the command line separately to allow further checks on them.
- Added Blzut3's Solaris patch.
- Fixed: Heretic's Weredragon (Beast) should not have a melee state.

January 1, 2010  (SBARINFO update)
- Reorganized the SBarInfo code.
- Added interpolate(<speed>) flag to drawnumber, drawbar, and drawgem.  The old
	way of interpolating the health and armor is depreciated.
- Added: armortype to drawswitchableimage loosely based on Gez's submission.
- As an extension to the previous you can now use comparison operators on
	inventory items and armortype in drawswitchableimage.

January 1, 2010  (Changes by Graf Zahl)
- Added Blzut3's Solaris patch.
- Fixed: Heretic's Weredragon (Beast) should not have a melee state.

December 31, 2009  (Changes by Graf Zahl)
- fixed: FastProjectile was missing all sky checks when the projectile's move
	was blocked.

December 30, 2009
- Fixed: A_ThrowGrenade used the same code as the old fighter flechette, so
	it was just as broken at aiming up and down.

December 30, 2009  (Changes by Graf Zahl)
- fixed: Movement performed by actor movers was not interpolated because
	it happened outside the moved actor's Tick function. This got particularly
	obvious with moving skybox viewpoints (See Daedalus's MAP21 intro for a good
	example.)
	Fixing this exposed a design flaw in the thinker system:
	Having every single actor default to the highest available statnum means that
	nothing can be placed in a slot where it is guaranteed to be run after all actors
	have ticked. But this is required for any thinker that moves an actor
	(i.e. AActorMover and DSectorEffect.) With DSectorEffect it just went unnoticed
	because they were added at the end of the list so almost nothing they moved was
	behind them in a thinker list. However, when an actor was spawned on a moving
	floor it did not move smoothly. The default statnum is now 100 so that there's
	sufficient slots above where such thinkers can be placed.

December 28, 2009
- Fixed: Shooting up and down with AArtiPoisonBag3::Use() was completely
	broken. I don't know what I thinking when I plugged in 2*finesine[pitch]
	for Hexen's lookdir, because that's totally wrong. Not only is the
	magnitude far too low, but it also aims in the opposite direction you
	are looking. The new code only attempts to be close to Hexen's original
	while looking straight ahead and extrapolates that to other angles using
	proper 3D math.

December 28, 2009  (Changes by Graf Zahl)
- Added full sound definitions for Heretic's ChickenPlayer and Hexen's
	PigPlayer (submitted by NeuralStunner.)
- Added unmorph fix by Gez.
- merged all portals with the same displacement together. While this provides
	a mild performance increase it's not what I hoped it would do...
- Moved portal initialization for the portal things to P_SpawnSpecials
	instead of having the things self-initialize in PostBeginPlay. This was
	done to ensure that the portals are fully set up when the game begins.
	Otherwise there is no decent way to let the renderer post-process this
	information during setup.
- Changed: For 800x600 the default scaling handling of the options menu
	makes it become too small so for any resolution with a width between
	800 and 959 it has been reverted to the regular clean scaling factor.

December 27, 2009  (Changes by Graf Zahl)
- added Hirogen2's Backpack fix for sv_unlimited_pickup.
- added a linedef based method to define portals. Portals defined this way
	still have the same limitations as those defines with the portal things.

December 25, 2009  (Changes by Graf Zahl)
- Fixed: Decals could spread to walls which had a decal-less texture or
	were flagged not to have decals.
- Fixed: DBaseDecal/DImpactDecal::CloneSelf never checked the return value
	from their StickToWall call and left unplaced decals behind if that happened.
- Reintroduced Doom.exe's player_t::usedown variable so that respawning a
	player does not immediately activate switches. oldbuttons was not usable
	for this. This also required that CopyPlayer preserves this info.
- Fixed: When restarting the music there was a NULL pointer check missing
	so it crashed when the game was started wi
- Fixed: If the Use key is used to respawn the player it must be cleared
	so that it doesn't trigger any subsequent actions after respawning.
- Fixed: Resurrecting a monster did not restore flags5 and flags6.
- Fixed: Projectiles which killed a non-monster were unable to determine
	what precisely they hit because MF_CORPSE is only valid for monsters.
	A new flag, MF6_KILLED that gets set for all objects that die, was added
	for this case.
- Added a generic A_Weave function that exposes all possible options of
	A_BishopMissileWeave and A_CStaffMissileSlither. These 2 functions are
	no longer needed from DECORATE and therefore deprecated.

December 24, 2009
- The options menu no longer scales up so quickly, so it can fit wider text
	onscreen. In addition, it now uses the whole height available to it. Also,
	at lower resolutions, items on the compatibility options menu now cut off
	the beginning of the option label rather than the option setting, making
	this menu useable where previously it was not.
- Added a channel parameter to the sector overload of SN_StopSequence() so
	it can be properly paired with calls to SN_StartSequence().
- Fixed: P_CheckPlayerSprites() ignored the MF4_NOSKIN flag.  It now also sets
	the X scale, so switching skins while morphed does not produce weird
	stretching upon unmorphing.
- Fixed: Calling S_ChangeMusic() with the same song but a different looping
	flag now restarts the song so that the new looping setting can be applied.
	(This was easier than modifying every music handler to support modifying
	loop changes on the fly, which seems like overkill.)
- Fixed: savepatchsize was declared incorrectly in d_dehacked.cpp:DoInclude().
- Changed AFastProjectile::Effect() so that it sets the spawned trail to face
	same direction as the projectile.

December 24, 2009  (Changes by Graf Zahl)
- fixed: The UDMF blockfloaters flag was misnamed. Changed to match the spec.

December 23, 2009  (Changes by Graf Zahl)
- made the initial weave index for A_BishopMissileWeave and A_CStaffMissileSlither
	a configurable actor property.
- added a menu item for snd_channels.

December 20, 2009  (Changes by Graf Zahl)
- Fixed: The Dehacked parser could read past the end of the file if the last
	element was improperly defined.

December 19, 2009
- Extended MF3_SKYEXPLODE to apply to horizon walls as well.

December 19, 2009  (Changes by Graf Zahl)
- Fixed: It was not possible to set the ammo type of a weapon explicitly to
	'none'.

December 18, 2009
- A_FreezeDeath() now removes fuzz effects.
- In mus2midi.cpp, added range checking to MUS_SYSEVENT and MUS_CTRLCHANGE,
	and masking for note-off keys, note-on velocities, and program changes.

December 18, 2009  (Changes by Graf Zahl)
- added all known maps requiring inverted sprite sorting to compatibility.txt.
- added compatibility option to invert sprite sorting. Apparently Doom.exe
	originally sorted them differently than most source port and on some maps
	which depends on this it doesn't look right (e.g. Strain MAP13)

December 17, 2009
- Fixed: Using Transfer_Heights with the SECF_UNDERWATER and
	SECF_FAKEFLOORONLY flags applied the water effect to the ceiling and not
	just the floor.
- Replaced sprite sorting with a stable sort. Performance at the start of
	nuts.wad seems the same.

December 16, 2009  (Changes by Graf Zahl)
- Fixed: Morphed players tried endlessly to switch to a weapon they picked up.
- fixed: P_DamageMobj just set an ice corpse's velocity to 0 to make it shatter.
	But that's insufficient because it doesn't factor in any subsequent velocity
	change that happens between the damaging and the next call to A_FreezeDeathChunks.
- fixed: The TimeFreezer did not freeze other players' controls in a
	multiplayer game.
- fixed: DECORATE's 'gravity' property incorrectly messed around with the
	NOGRAVITY flag.
- fixed: Hitscan attacks didn't check the puff's replacement for damage types.

December 13, 2009  (Changes by Graf Zahl)
- fixed: old-style DECORATE definitions with non-alphanumeric characters in
	the name produced an error.

December 12, 2009
- Added a DMG_NO_FACTOR flag for P_DamageMobj(). A_KillChildren, A_KillMaster,
	and A_KillSiblings now use it.
- Added a damage type parameter to A_KillChildren, A_KillMaster, and
	A_KillSiblings.

December 11, 2009  (Changes by Graf Zahl)
- fixed: Auto-COMPAT_SHORTTEX for IWADs must be set per IWAD, not in general
	for Doom.
- added autodetection of Harmony's IWAD.
- Added SnailMan's updated language.ita file.

December 11, 2009
- Fixed: You should still be able to pick up ammo that has a max amount set
	at 0.
- Added a few NULL screen checks.

December 6, 2009  (Changes by Graf Zahl)
- added some code that prevents overlapping monsters from getting stuck in
	each other. PIT_CheckThing will return true under the following contitions
	now:
	* It was called from P_Move
	* The actor that is blocking the move already overlaps with the monster
		that is being moved.
	* the move will take the 2 actors further apart.

December 1, 2009
- Added another surface to receive a copy of the top back buffer immediately
	before it is presented. This effectively produces a copy of the front
	buffer without the performance penalty of GetFrontBufferData, so fullscreen
	wipe preparation and screenshots are faster now. At lower resolutions,
	always copying the backbuffer does incur a slight FPS hit, but it's
	practically free at higher resolutions.

November 30, 2009
- The initial wipe screen is now kept in video memory. I had previously
	assumed that since the wipes only run at 35 FPS, the time spent DMA'ing
	it from system to video memory would be acceptable. Apparently I was wrong.
	In particular, updating the same surface several times probably has to
	synchronize between each one, making melt particularly slower than it
	needs to be.

November 29, 2009  (Changes by Graf Zahl)
- fixed: Line_SetBlocking and Line_SetTextureScale were not in the list
	of action specials used by DECORATE or MAPINFO.
- fixed: Teleport_NoStop was not in the line special function table.

November 28, 2009
- Fixed: The FPS meter cannot use I_MSTime(), because if the game is started
	with +vid_fps 1, it can need the time before the timer is ready to start.
- Initialize TempRenderTexture and the back buffer to black upon creation.
- Fixed: Windowed mode always needs to draw to the temporary surface, even
	when not gamma correcting, so that D3DFB::GetCurrentScreen() can read from
	it.
- Use the spawned class's scale as default for ScriptedMarine instead of
	DoomPlayer.

November 28, 2009  (Changes by Graf Zahl)
- fixed: Morph weapons weren't destroyed because the code checked for
	them in the unmorphed player class.
- fixed: With padding the largest texture to fit into a page is 254x254.

November 27, 2009  (Changes by Graf Zahl)
- fixed an uninitialized variable in p_xlat.cpp (Thanks, MSVC for not
	warning about such an obvious problem! :( )
- fixed: The charge attack of Heretic's imp is not precisely the same
	as A_SkullAttack with a different speed so A_ImpMsAttack has been
	reinstated.

November 25, 2009
- Make the palette indexes used by FRemapTable subject to the global remap
	table, just as the images they translate are.

November 24, 2009  (Changes by Graf Zahl)
- Added MF4_ALLOWPARTICLES checks to blood spawning code.
- Fixed: EV_DoDonut, EV_DoElevator and EV_StartWaggle did not to any 0-tag
	checks.
- Fixed: Doom line type 44 (lower ceiling to 8 above floor) must halt
	movement if blocked which essentially means it acts like a Hexen-style
	crusher.
- Fixed: Not all places checking for player start spots did it correctly.
	The editor number for player start spot 5 is now stored in the game info
	so that there's only one place where this check needs to be done.
- Fixed: WIF_NOAUTOAIM only worked for projectiles.

November 23, 2009
- Added Windows 7 (aka Windows NT 6.1) and Server 2008 identification to
	I_DetectOS().
- Fixed: ArtiPork did not use all its sprite frames.
- Fixed: FWadCollection::AddFile() did not call FixPathSeperator(), so
	savegames would hold the full file path for wads that had been specified
	with backslash characters, because GetWadName() would not trim off the
	path.

November 22, 2009  (Changes by Graf Zahl)
- extended Doom map format linedef translator so that it also handles the flags.

November 19, 2009
- Replaced toint/quickertoint with the portable routines from xs_Float.h. The
	former used fistp, which is not portable across platforms, so cannot be
	used in the play simulation. They were only suitable for the renderer.
	xs_Float.h also has a very fast float->fixed conversion, so FLOAT2FIXED
	uses that now.
	(And I also learned that the FPU's round to nearest is not the rounding I
	learned in grade school but actually Banker's Rounding. I had no idea.)
	(Also, also, the only thing that could have made quickertoint faster than
	toint was that it stored a 32-bit int. I never timed them, and I doubt in
	practice there was any real difference between the two.)

November 18, 2009
- Added padding around packed textures to compensate for apparent NVidia
	texture coordinate imprecision.

November 17, 2009
- Fixed two bugs in FMODSoundRenderer::HandleChannelDelay():
	* Looping sounds that have been playing for a very long time, were evicted,
		and then were restarted need to have their positions clamped to lie
		within the bounds of the sounds. If we try to set a start position very
		far beyond the end, it will overflow inside FMOD and not work.
	* A start time of 0 is not actually valid and means the sound was never
		assigned a start time.
- The latter bug also reveals a problem with starting looped sounds evicted:
	They need to be assigned a start time so if they should have the opportunity
	to start later, they will be properly synchronized.

November 17, 2009  (Changes by Graf Zahl)
- fixed: P_NowayTraverse was called with a trace distance of 128 instead of
	the 64 that should have been used.
- fixed: R_PointToAngle could overflow with very long vectors passed to
	it. This caused rendering bugs on some maps. (Interestingly the only
	other port having a safeguard for this in place was PrBoom.)
- reverted the change that makes 0-damage projectiles call P_DamageMobj.
	Both Hexen and Heretic depend on such projectiles not doing it as do many
	mods that create snow/rain effects plus any terrain splash mod.

November 15, 2009  (Changes by Graf Zahl)
- fixed: fullscreen images with texture scaling used the unscaled size for
	positioning. To avoid future problems with them I added a new DTA_Fullscreen
	option for DrawTexture.
- fixed: The sky baseline position needs to take texture scaling into account.

November 14, 2009
- Do not squash skies taller than 200 into square pixels.

November 14, 2009  (Changes by Graf Zahl)
- Added skillinfo fix by Gez.
- added a r_scaletallskies CVAR so that sky positioning can be checked
	more easily.
- fixed: Skies with a height of exactly 200 pixels should not be stretched.

November 13, 2009
- More sky changes: Textures taller than 200 pixels but shorter than 241
	are scaled to the height of a 200 pixel tall sky. Skies taller than 240
	use the same scale as a 240 tall sky but are shifted down to make the
	top of the texture align with the top of the screen when looking fully up.
	Thus, by using a sky texture with a height of 240 or more pixels, the sky
	will be drawn with square pixels instead of the vertically elongated ones
	imposed by Doom's native 320x200 resolution.

November 12, 2009
- Improved sky stretching a bit: It now only stretches the sky as tall as it
	needs to be: 228 pixels, not 256. It no longer stretches horizontally,
	either.

	The reason it stretches to 228 and not 200 pixels is because Doom shifted
	its sky texture down 28 pixels. By stretching to 228 pixels, we can keep
	the sky tiled at the same height on the horizon. Skies 200 pixels tall
	(or more) will continue to tile at the center of the screen when looking
	directly ahead.
- Cleaned up win32/i_system.cpp.
- Put back the previous event-driven ticker, except now the timer isn't
	started until the first time it is needed.

November 11, 2009
- Modified the event-driven ticks to use the same code for calculating the
	time as the polled timer so that the timer does not start running until the
	first time it is used.
- Removed the srand() call from D_DoomMain(), because it started the game
	timer running prematurely, and we never call rand() anywhere. (Not to
	mention, even if we did use rand(), always seeding it with 0 is rather
	pointless.)
- Fixed: The framerate was not capped before starting a game.
- Removed the one embedded DeHackEd lump restriction.
- Fixed: nofreeaim in P_SpawnPlayerMissile() was broken.
- Fixed: MBF sky Y offsets were ignored. X offsets should also be applied to
	the sky cylinder, not the screen like Hexen scrolling skies.

November 9, 2009
- Maps inside zips can now satisfy the map checks for IWAD detection.
- Fixed: F7ZFile did not delete its Archive when destroyed.

November 7, 2009
- Fixed: The x64 Release build was configured to use the 32-bit GME, and
	neither release nor debug builds built the library.
- Fixed: R_GetOneSkyColumn() and R_GetTwoSkyColumns are mulscaling an
	unsigned integer that can use all 32 bits. They must therefore use
	the unsigned mul instruction rather than the signed imul instruction.
- Fixed several signed/unsigned comparison and possibly uninitialized
	variable warnings flagged by GCC.

November 5, 2009  (Changes by Graf Zahl)
- fixed: The 'new format only' flag for MAPINFO options was never checked.
	(ZDoom itself doesn't use it yet so it's only relevant for child ports.)

November 3, 2009
- Fixed: S_RestartSound() cleared the evicted flag even if the sound
	was not restarted because it was too close to too many other identical
	sounds that were already playing.
- Added virtual status and audibility to the noise debug display.
- Added a command line option -warpwipe to perform the screen wipe if you
	start with -warp or +map.

October 31, 2009
- Changed all coordinates for DrawTexture() to floating point so that the
	player sprites will retain the same precision they had when they were
	rendered as part of the 3D view. (needed for propery alignment of flashes
	on top of weapon sprites) It worked just fine for D3D, but software
	rendering was another matter. I consequently did battle with imprecisions
	in the whole masked texture drawing routines that had previously been
	partially masked by only drawing on whole pixel boundaries. Particularly,
	the tops of posts are calculated by multiplying by spryscale, and the
	texture mapping coordinates are calculated by multiplying by dc_iscale
	(where dc_iscale = 1 / spryscale). Since these are both 16.16 fixed point
	values, there is a significant variance. For best results, the drawing
	routines should only use one of these values, but that would mean
	introducing division into the inner loop. If the division removed the
	necessity for the fudge code in R_DrawMaskedColumn(), would it be worth it?
	Or would the divide be slower than the fudging? Or would I be better off
	doing it like Build and using transparent pixel checks instead, not
	bothering with skipping transparent areas? For now, I chop off the
	fractional part of the top coordinate for software drawing, since it was
	the easiest thing to do (even if it wasn't the most correct thing to do).

October 29, 2009
- Fixed: Sprites and decals that are drawn with addition must fade to black.
- Make TranslateToStartSpot() set the new sector references for a polyobj's
	walls so that P_CheckSwitchRange() will work with them.
- Fixed: An unspecified save_dir will now save to the program directory on
	Windows. (Other operating systems already use the user's home directory
	instead.)
- Fixed: S_EvictAllChannels() must replace the channel's start time with its
	position when evicting sounds, because restarting the sound system causes
	the DSP clock to restart at 0, so start times that were recorded before
	the reset are no longer applicable after the reset.
- Fixed: S_StopChannel() always set the channel's actor to NULL, eliminating
	origin information when resetting the sound system.

October 28, 2009
- Added Gez's patch for IWAD detection of Blasphemer and Action Doom 2.
- Fixed: 0 damage projectiles did not call P_DamageMobj.
- Fixed: Do not exit P_DamageMobj early if damage is 0, so we can still get
	the side effects from it. PainThreshold also needs to be inclusive, as
	the docs already state.

October 26, 2009
- Changes to both A_MonsterRail() and A_CustomRailgun(): Save actor's pitch,
	use a larger aiming range, ignore non-targets in P_AimLineAttack(), and
	aim at the target anyway even if P_AimLineAttack() decides it has no
	chance of hitting.
- Added another parameter to P_AimLineAttack(): A target to be aimed at. If
	this is non-NULL, then all actors between the shooter and the target will
	be ignored.
- Added new sound sequence ACS functions:
		SoundSequenceOnActor(int tid, string seqname);
		SoundSequenceOnSector(int tag, string seqname, int location);
		SoundSequenceOnPolyobj(int polynum, string seqname);
	SoundSequenceOnSector takes an extra parameter that specifies where in the
	sector the sound comes from (floor, ceiling, interior, or all of it). See
	the SECSEQ defines in zdefs.acs.
- Fixed: R_RenderDecal() must save various Wall globals, because the originals
	may still be needed. In particular, when drawing a seg with a midtexture is
	split by foreground geometry, the first drawseg generated from it will have
	the correct WallSZ1,2 values, but subsequent ones will have whatever
	R_RenderDecal() left behind. These values are used to calculate the upper
	and lower bounds of the midtexture. (Ironically, my work to Build-ify things
	had done away with these globals, but that's gone now.)

October 24, 2009  (Changes by Graf Zahl)
- fixed: sector_t::GetHeightSec checked the wrong MoreFlags.
- made max. view pitch a property of the renderer so that it's overridable without
	changing game code.
- made SpawningMapThing an argument of AActor::StaticSpawn instead of a global
	variable.
- added a stub to the DECORATE parser for defining dynamic lights directly
	in DECORATE. This is needed so that ZDoom remains compatible with any DECORATE
	which uses this GZDoom feature in the future.

October 24, 2009
- Removed the Actor uservar array and replaced it with user-defined variables.
	A_SetUserVar/SetUserVariable/GetUserVariable now take a variable name
	instead of an array index. A_SetUserArray/SetUserArray/GetUserArray
	have been added to access elements in user-defined arrays.
- Rewrote wide sky texture scaling again. This time, it should work for any
	size textures at any scale. I also tried doing sky scrolling on the sky
	cylinder, but that didn't look so good, so I left it in screen space.

October 23, 2009
- Fixed: When giving completely new ammo, the backpack did not clamp the
	amount given to the ammo's max amount.
- Fixed drawing of wide high resolution skies. (At least for the samples I
	received. I'm not convinced that it's yet fixed for the general case.)

October 19, 2009  (Changes by Graf Zahl)
- fixed: Setting the first state's duration of a fast projectile to 0 caused
	an underflow and blocked all further state changes.

October 18, 2009  (Changes by Graf Zahl)
- fixed: FMultiPatchTexture::MakeTexture was missing a range check for the
	special colormap index.

October 17, 2009  (Changes by Graf Zahl)
- Fixed: 3DMidtex checks were treating the Null texture as a valid texture.
- Fixed: The rail sound's position was not clamped to the actual range between
	the trail's start and end point.
- Fixed: Explosions no longer caused splashes.
- Fixed: Copying translations to lower decals had the shade color check wrong.
- Fixed: Waggling floors did not moved attached geometry.
- Cleaned up p_floor.cpp so that related parts of the code are grouped together.
- fixed: The translation addition broke parsing of palette index based translations.

October 16, 2009  (Changes by Graf Zahl)
- added 'defaultterrain' option to terrain parser for mods that want to have
	a different default terrain than a generic solid surface.
- added format char processing to A_Print(Bold) and all printable messages
	that can be defined in DECORATE.
- Fixed: The railgun code ignored MF3_ALWAYSPUFF.
- added desaturated translations.
- added optional state parameters to A_ReFire and A_GunFlash and A_CountdownArg.

October 15, 2009  (Changes by Graf Zahl)
- added ACS CheckActorClass function
- fixed: When a blasted actor collided with another one this other actor's
	DONTBLAST flag was not checked.
- added a global DamageFactor actor property. All damage this actor takes is multiplied
	by this factor in addition to damage type specific damage factors.
- added better earthquake functions for ACS and DECORATE.

October 10, 2009  (Changes by Graf Zahl)
- Added MF6_NOTRIGGER flag that disables all line actions for an actor.

October 9, 2009  (Changes by Graf Zahl)
- Added Gez's seeker missile submission.
- Added Gez's thing activation submission.
- added a NULL pointer check to fog spawning in unmorphing code.
- fixed: frozen corpses need to be treated as solid by z-movement code.
- fixed: AAmbientSound::Serialize was adjusting its timer value for savegames
	even when it was set to a 'don't check' value.

October 8, 2009
- Reinstated the off-by-one check in D3DFB from r399. I thought I could get by
	at just fixing it at a specific value, since the supply of SM14 cards isn't
	all that diverse and all from ATI, but apparently Radeon 8500s and 9000s
	have different precision levels in their pixel shaders. See bug report
	<http://forum.zdoom.org/viewtopic.php?p=444523>

October 8, 2009  (Changes by Graf Zahl)
- Added a PainThreshold actor property.
- fixed: Teleport_EndGame did not set the end sequence name properly.

October 7, 2009
- Since I am currently without a primary video card and stuck with this
	Mobility Radeon 9000 (on a PCI card, no less!), I have decided to give the
	PS14 support some loving: D3D windowed gamma now works on these cards using
	a texture lookup for the gamma table. Sadly, this halves my framerate, so
	setting gamma to 1 will skip the gamma correction, as it was before, for
	full speed. (On my 8800 GT, the gamma correction was free.)

October 4, 2009  (Changes by Graf Zahl)
- Deleted a_magewand.cpp because it only contained unused code.
- Fixed: The conversation code tried to get the player's tag instead of the
	NPC's he is talking to when it had no given name.

October 3, 2009  (Changes by Graf Zahl)
- Added Gez's MageWandMissile customization patch but moved the new functionality
	into the FastProjectile base class and removed the native MageWandMissile
	class, using the generic functionality instead.
- Fixed: GetReplacement and GetReplacee always checked the skill definitions,
	even if they weren't supposed to be used. It was also missing a range check
	for 'gameskill'.

October 2, 2009  (Changes by Graf Zahl)
- fixed: Savegames stored the global fixed light levels when saving a player.

October 1, 2009  (Changes by Graf Zahl)
- Fixed some GCC warnings.
- fixed: The BossCube could be blocked by floors and ceiling resulting
	in incorrect movement. I changed it so that A_BrainSpit now sets the
	MF5_NOINTERACTION flag for anything it spawns that has the MF_NOCLIP
	flag. For travelling cubes active collision detection makes no sense
	and only causes problems. This should also make the boss brain
	work in the other games which previously were excluded by a game mode
	check in the movement code.
- fixed: ACS's GetUserVariable did not work for the script activator.
- fixed: Moving floors could be blocked by 2 actors without MF2_PASSMOBJ
	overlapping each other (common mapping bug, check Herian 2 MAP30.)

September 30, 2009  (Changes by Graf Zahl)
- Fixed: Coordinate handling for multipatch texture compositing was not correct
	for true color. Instead of using a clipping rectangle on the destination it
	tried to alter the source offsets which produced incorrect results for
	mirrored or rotated patches.

September 29, 2009
- Fixed: Alt+F4 no longer quit the program.

September 28, 2009  (Changes by Graf Zahl)
- Added BHS's death special flags submission.
- Added Gez's A_Blast submission.

September 27, 2009  (Changes by Graf Zahl)
- Fixed: Floor and ceiling huggers' velocity was wrong when used with
	P_SpawnPlayerMissile.
- Fixed: When hitting a voodoo doll the real player needs to be checked for
	invulnerability.
- Fixed: G_QueueBody was not notifying the translation that it was changed.
- Fixed: The multitexture composition code was missing a NULL pointer check.
- fixed: The changes for new colormap handling in FMultipatchtexture were incomplete.
	Some code was still checking Blend.r instead of the full variable for colormap indices.

September 26, 2009
- Fixed: R_DrawPSprite() did not initialize the colormap for the targeter
	vissprites.
- Added a check for SPAC_AnyCross to P_TestActivateLine() before the "monster"
	activation checks. They are actually non-player checks and interfered with
	SPAC_AnyCross.
- idclev and hxvisit are no longer considered cheats, however, they are still
	invalid for net games. hxvisit was erroneously accepted for net games
	before, which it shouldn't have, since it's basically idclev for Hexen.

September 24, 2009
- Fixed: "give health" without an amount would set your health to IDDQD health
	instead of the player class's maximum.
- Fixed: A_CStaffCheck() assumed the player's max health was 100 instead
	of getting checking for the true maximum.
- Changed P_XYMovement() to not call P_SlideMove() if the act of being
	blocked changed the actor's velocity. I'm not entirely happy with this,
	but it gets push-activated force fields to work.
- Fixed: FMultiPatchTexture::CopyTrueColorPixels() should clear the buffer
	first before drawing into it if the copy op passed to it is OP_OVERWRITE.
	FTexture::FillBuffer() sets this to erase whatever texture might have been
	in the space it is going into.

September 22, 2009
- Added a technique to try and minimize input lag with vsync enabled: Two
	surfaces are alternately locked for read-only access each frame, forcing
	the driver to stop buffering more than one frame at a time. The input lag
	on my system doesn't seem to be as bad as it once was (I can no longer
	see it obviously with my naked eye), but turning antilag on "feels"
	slightly more responsive. The cvar d3d_antilag turns this technique on and
	off. See <http://www.xyzw.de/c120.html> for more details.

September 22, 2009  (Changes by Graf Zahl)
- Added a check to Dehacked code which tries to set the blend color.
	It must set it to 0 if the alpha is 0 to avoid problems with special
	colormap detection.
- Changed SPECIALCOLORMAP_MASK again so that it does not interfere with
	any valid setting. It must use a value with a 0-alpha because these
	are guaranteed not to be produced by the DECORATE code elsewhere.
- Fixed precision issues with AddFixedColormap's search for identical colormaps.
- Added custom colormap support to texture composition code.
- Fixed initialization of FSpecialColormap::GrayscaleToColor. This is not
	a mapping from the palette but from a [0,255] grayscale ramp and used to
	apply colormaps to true color images for texture composition.

September 21, 2009
- For hardware 2D, apply fixed colormaps when copying to video memory instead
	of doing it directly during the rendering, in order to improve visual
	fidelity for colormaps that aren't grayscale.
- Added support for defining the full color range of a special colormap.
- Moved the code for specialcolormap and colormapstyle in D3DFB::SetStyle()
	at the end of the normally-colored block so that they get all the proper
	texture format setup.
- Fixed: In letterbox modes, the clipping window needs to be adjusted down.

September 21, 2009  (Changes by Graf Zahl)
- Fixed: When drawing with a special colormap the quad's flags weren't cleared
	which could cause crashes.
- Added custom special colormaps to DECORATE.
- Cleaned up special colormap code and removed lots of dependencies on the
	knowledge of the tables' contents.

September 20, 2009  (Changes by Graf Zahl)
- Changed call to R_DrawRemainingPlayerSprites into a virtual function
	of DFrameBuffer because its implementation is specific to the software
	renderer and needs to be overridable.

September 19, 2009
- Fixed: Wall drawing handled fixed light levels improperly (but did not
	completely ignore them, either).
- Separated light level fixing out of player_t's fixedcolormap parameter.
	Using a fixed light level (e.g. PowerTorch) will no longer wipe out
	colored lighting.
- Moved the blending rectangle drawing into a separate discrete stage, since
	doing it while copying the 3D view window to the display now blends
	underneath the weapon instead of on top of it.
- Consolidated the special colormaps into a single 2D table.
- Tweaked the special colormaps slightly to make the true color results more
	closely match the paletted approximations.
- fb_d3d9_shaders.h was getting unwieldy, so I moved the shaders out of the
	executable and into zdoom.pk3. Shaders are still precompiled so I don't need
	to pull in a dependancy on D3DX.
- Added a few more shaders to accomodate drawing weapons with all the in-game
	lighting models. These are accessed with the new DrawTexture tags
	DTA_SpecialColormap and DTA_ColormapStyle.
- Player weapon sprites are now drawn using Direct3D and receive all the
	benefits thereof.

September 17, 2009  (Changes by Graf Zahl)
- Fixed: Unmorphing while invulnerable was blocked.
- Various cleanup changes.
- fixed Dog's class name in DEHSUPP.
- Renamed plane flags from SECF_* to PLANEF_*.
- Changed Heretic's plat raise type to use a flag to block further sector movement
	instead of keeping the dead thinker around to block the sector.

September 16, 2009  (Changes by Graf Zahl)
- Fixed: A_LookEx did not work for monsters having the MF_NOSECTOR flag.
- Fixed: The deprecated flag handler for the old bounce flags needs to clear
	BOUNCE_MBF and BOUNCE_UseSeeSound, too, when clearing one of these flags.
- Fixed: When adding the AVOIDMELEE code the code was accidentally changed so that
	friendly monsters could no longer acquire targets by themselves.
- Renamed WIF_BOT_MELEE to WIF_MELEEWEAPON because it's no longer a bot only flag.
- Added MBF's monster_backing feature as an actor flag: AVOIDMELEE.
- Gez's misc. bugs patch:
* Moves the dog sound out of the Doom-specific sounds in SNDINFO to address this,
* Renames the dog actor to MBFHelperDog to prevent name conflicts,
* Adds APROP_Score to CheckActorProperty,
* Completes the randomspawner update (the reason I moved the recursion counter out of
	special1 was that I found some projectiles had this set to them, for example in
	A_LichAttack, but I forgot to add transfer for them),
* Provides centered sprites for beta plasma balls if this is deemed deserving correction.
- Added some pieces of MBF's friendly AI.
- Cleaned up A_LookEx code and merged most of it with the base functions.
	The major difference was a common piece of code that was repeated 5 times
	throughout the code so I moved it into a subfunction.
- Changed P_BlockmapSearch to pass a user parameter to its callback so that
	A_LookEx does not need to store its info inside the actor itself.
- fixed: The linetarget CCMD duplicated all of the info CCMD.
- fixed: PrintActorInfo crashed due to some incomplete implementation.

September 15, 2009  (Changes by Graf Zahl)
- added PinkSilver's A_Respawn enhancement patch.
- added RandomSpawner update from Gez's experimental build.
- added thing activation types for BUMPSPECIAL and USESPECIAL. Also added
	a new ClearSpecial flag to the activation type.
- added MBF's code for dogs jumping down, controlled by the MF6_JUMPDOWN
	flag.
- fixed: pr_bounce was declared statically in o_mobj.cpp and redeclared externally
	in p_map.cpp resulting in a CRC conflict.
- fixed: The Dehacked flags parser fix from May 31 (r1624) was undone by
	yesterday's additions. Changed it so that the parser first checks for
	the presence of a '-' sign before deciding whether to use strtol or
	strtoul to convert the string into a number.

September 14, 2009  (Changes by Graf Zahl)
- Added PinkSilver's A_LookEx fix.
- added resources needed for MBF support.
- removed unused score items from DECORATE file.
- Fixed: Argument count for UsePuzzleItem was wrong.
- Added a few things from Gez's experimental build:
	* MBF Dehacked emulation but removed the COMPATF_MBFDEHACKED flag because
		it wouldn't work and is more or less useless anyway.
	* MBF's dog (definition only, no sprites yet.)
	* User variables. There's an array of 10. They can be set and checked in
		both DECORATE and ACS.
	* Made the tag name changeable but eliminated the redundancy of having
		both the meta property and the individual actor's one. Having one is
	fully sufficient. TO BE FIXED: Names are case insensitive but this
	should better be case sensitive. Unfortunately there's currently nothing
	better than FName to store a string inside an actor without severely
	complicating matters. Also bumped savegame version to avoid problems
	with this change.
	* MBF grenade and bouncing code.
	* several compatibility options.
	* info CCMD to print extended actor information (not fully implemented yet)
	* summonmbf CCMD.
	* Beta BFG code pointer (but not the related missiles yet.)
	* PowerInvisibility enhancements.
	* ScoreItem with one significant change: Added a score variable that can be
		checked through ACS and DECORATE. The engine itself will do nothing with it.
	* Nailgun option for A_Explode.
	* A_PrintBold and A_Log.
	* A_SetSpecial.
	* Beta Lost Soul (added DoomEdNum 9037 to it)
	* A_Mushroom extensions
	* Vavoom compatible MAPINFO keynames.

September 11, 2009
- Added warning messages when loading maps that have non-zero values in
	unused line argument fields, because these maps could potentially break
	in the future if the argument is later assigned a meaning. (Hopefully
	all the argument counts in actionspecials.h are accurate. I found a
	few that were wrong.)

September 10, 2009
- Fixed: If a damaged actor has negative mass, it needs to have its damage
	thrust set to maximum instead of 0. See Action Doom's broken glass
	"CommanderKeens".
- Changed the SCROLLTYPE define so that any extra bits set cause it to default
	to 7. This effects action.wad, MAP02, lines 12054 and 12059, which had them
	at 128, so they no longer scrolled in r832+.

September 9, 2009
- Look for files in Mac-like places on Macs.
- Fixed: The non-Windows CreatePath can fail if part of the path already
	exists, because mkdir will return an error code for trying to recreate
	an existing directory.

September 8, 2009
- Because entryway timed it, here is a new version of R_PointToAngle2 that is
	closer to the original. The old code was shorter but a little slower. The
	new code is a bit faster than the original with VC++ and about the same
	with GCC. Interestingly, GCC produces code for Killough's version that
	performs about the same as the original, but when compiled with VC++,
	Killough's is notably worse.

September 8, 2009  (Changes by Graf Zahl)
- moved ENDOOM lump name definition into gameinfo.
- moved default item drop style into gameinfo.
- moved default respawn time into gameinfo.
- moved default inventory max amount into gameinfo.
- turned Heretic's blocking of the sector for LS_Plat_RaiseAndStayTx0 into
	a parameter instead of having the game mode decide.

September 7, 2009
- Applied vertical SBARINFO inventory bar patch.

September 7, 2009  (Changes by Graf Zahl)
- moved definition of games' default armor icons into gameinfo definition.
- fixed: The PNG loader for true color textures overwrote the IDAT size with
	the IDAT id when reading the image.

September 6, 2009  (Changes by Graf Zahl)
- fixed: Trying to pick up an object of the Ammo base class caused a crash.
- changed line_t's sidenum into sidedef pointers.
- changed side_t's linenum into a linedef pointer.
- Added PinkSilver's SetActorVelocity code submission (with optimizations.)

September 5, 2009
- Added the frandom decorate function, which is exactly like random except
	that it works with floating point instead of integers.
- Split the bounce types completely into separate flags and consolidated
	the various bounce-related flags spread across the different Actor flags
	field into a single BounceFlags field.
- Fixed: P_BounceWall() should calculate the XY velocity using a real
	square root and not P_AproxDistance(), because the latter can cause
	them to speed up or slow down.

September 5, 2009  (Changes by Graf Zahl)
- made menu dimming a mapping option but kept the CVARS as user override.

September 4, 2009
- Fixed: R_CreatePlayerTranslation() only initialized the first truecolor
	palette entry.
- Fixed: D3DPal::Update() used BorderColor == 0 as the condition for skipping
	an entry. It should be SM14 as in UploadPalette().
- Fixed: The aliasing of CPUInfo was still wrong. (Yarr! The things I do
	for you, GCC!) The AMD feature flags weren't stored anywhere, either; not
	that it really matters.
- Add an alternate PIC-compliant __cpuid macro in x86.cpp.
- Fixed: S_LoadSound() did not byte-swap the frequency and length it reads
	from DMX sounds.
- Fixed: PNGTexture must not use the FArchive >> operator as a short hand
	for reading 4-byte integers, because that operator works with little
	endian numbers--a no-op on Intel processors, but bad joojoo on PowerPCs.

September 3, 2009  (Changes by Graf Zahl)
- fixed: Weapons must first check if they can be switched and afterwards
	if they can be fired. These checks were reversed.

September 2, 2009  (Changes by Graf Zahl)
- fixed: The newly altered WAD code could not load embedded WADs anymore.

September 1, 2009
- Added directory detection to the -file parameter. This obsoletes -dir, so
	that parameter is now gone.
- Removed automatic ".wad" appending from FWadCollection::InitMultipleFiles()
	since it isn't needed and prevented files without extensions from being
	loaded. D_AddFile() already takes care of adding the extension if the
	name as-given does not exist.
- Fixed: Loading single files did not print a newline in the startup text.
- Fixed: A_JumpIf(InTarget)Inventory jumped if the check amount was greater
	than the item's max amount and the item was maxed.
- Fixed: Some dmadds wads used zero-length sprites as placeholders. When you
	ran dmadds to combine it with the IWAD's sprites, they would be replaced by
	the IWAD's sprites, so when loading such wads, we should ignore those as
	valid sprites. (Thanks to entryway for finding this.) See 22ventry's
	22sprite.wad for an example.

August 31, 2009
- Basic Mac support: Everything compiles but does not yet link.
- Replaced the use of autoconf's WORDS_BIGENDIAN with __BIG_ENDIAN__, since
	latter comes predefined by GCC.

August 29, 2009  (Changes by Graf Zahl)
- fixed: R_InitColormaps was broken since the resource file code rewrite.
- fixed: WIF_STAFF2_KICKBACK did not work anymore because it depended on conditions
	that were changed some time ago.
- fixed: The damage inflictor for a rail attack was the shooter, not the puff.
- Fixed: Floor and ceiling huggers may not change their z-velocity when seeking.
- Fixed: UDMF set the secret sector flag before parsing the sector's properties,
	resulting in it always being false.
- Renamed sector's oldspecial variable to secretsector to better reflect its
	only use.
- Fixed: A_BrainSpit stored as the SpawnShot's target the intended BossTarget,
	not itself contrarily to other projectile spawning functions.
	A_SpawnFly then used the target for CopyFriendliness, thinking it'll be the
	BossEye when in fact it wasn't.
- Added Gez's submission for a DEHACKED hack introduced by Boom.
	(using code pointers of the form 'Pointer 0 (x statenumber)'.
- fixed: Attaching 3DMidtex lines by sector tag did not work because lines
	were marked by index in the sector's line list but needed to be marked by
	line index in the global array.
- fixed: On Linux ZDoom was creating a directory called "~.zdoom" for
	save files because of a missing slash.
- fixed: UDMF was unable to read floating point values in exponential format
	because the C Mode scanner was missing a definition for them.
- fixed: The recent changes for removing pointer aliasing got the end sequence
	info from an incorrect variable. To make this more robust the sequence index
	is now stored as a hexadecimal string to avoid storing binary data in a string.
	Also moved end sequence lookup from f_finale.cpp to the calling code so that
	the proper end sequences can be retrieved for secret exits, too.

August 28, 2009  (Changes by Graf Zahl)
- fixed: Switching a weapon did not reset the refire counter.

August 28, 2009
- Fixed: The first lighting plane added to a light stack had the bOverlaps
	flag set, causing it to be ignored during rendering. Why this didn't cause
	more trouble, I don't know.
- Fixed: The UDMF parser passed the wrong value for "default alpha" for
	TranslucentLine to P_FinishLoadingLineDef().
- Fixed: genStringEnter mode acted on key up events rather than key repeat
	events.

August 12, 2009  (Changes by Graf Zahl)
- Fixed: paletted texture composition with part translucent patches
	did not work.
- Fixed: A_SorcOffense2 depended on args being bytes and overflowing.
- Fixed: Even though P_DamageMobj checked an attack's originator
	for MF2_NODMGTHRUST the same check was missing from P_RadiusAttack.
- Fixed: A_MinotaurRoam should not assume without check that it was
	called by a MinotaurFriend.
- Fixed: The Minotaur declared A_MntrFloorFire which it did not use.
- Fixed: All Spawnspot functions did not check for a spot tid of 0 as
	the script's activator.
- Fixed: Friendly monsters ignored team association of their owning
	players.

August 11, 2009  (Changes by Graf Zahl)
- Fixed: The pause sprite was not centered correctly when it was a scaled
	graphic.

August 10, 2009
- Fixed: P_TestMobjZ() needs THRUSPECIES and THRUACTORS checks, too.
- Fixed: The UDMF loader did not initialize the sectors' sectornum property.

August 10, 2009  (Changes by Graf Zahl)
- Fixed: The true color texture compositing code did not clip the edges
	of multipatch textures used as patches on other multipatch textures.

August 9, 2009  (Changes by Graf Zahl)
- Fixed: A_EntityAttack did not spawn the correct missiles.

August 8, 2009  (Changes by Graf Zahl)
- replaced all code that changed a sector's light level with a setter function.
- Fixed: The FeatureFlags array in the CPUInfo struct was not mapped to the
	flags properly.

August 8, 2009
- Changed the return value of SetActivatorToTarget to match the description
	in the wiki.

August 7, 2009
- If SetActivatorToTarget is used for a player-run script, and the player is
	alive, it now sets the activator to the actor the player is aiming at. I
	also noticed that this looked like it was a quick copy'n'paste job from
	SetActivator. It returns false if the activator at the end of the function
	was the world, but it never sets the activator to the world. I'm not sure
	that's the best use of the return value.
- Added support for per-SpawnShot spawn lists. (Also fixed a potential
	infinite loop, though I'm not sure the parser allowed this condition to
	happen.)
- Changed the DWORDs in dobject.h into uint32s, since they were preventing
	edit-and-continue from working for the Windows source files.
- When a WM_KEYDOWN message is received with VK_PROCESSKEY, the scan key is
	now used to retrieve the real virtual key for the message. This fixes the
	previous issue that caused me to completely disable the IME.
- Removed the code that disables the IME, since it also disables the ability
	to switch between keyboard layouts that do not use an IME.
- TranslateMessage() is no longer called if GUI capture mode is off, so no
	dead key processing is performed until it might be useful.

August 6, 2009
- Added player MugShotMaxHealth property. Negative values use the player's
	max health as the mug shot max health, zero uses 100 as the mug shot max
	health, and positive values used directly as the mug shot max health.
- Added buddha cheat.
- Added TELEFRAG_DAMAGE constant, and changed the two places that still used
	1000 as the threshold for god mode damage to use it instead. (Players with
	MF2_INVULNERABLE set already used 1000000 as their threshold.)
- Added MF6_NOTELEPORT flag.
- Fixed: M_QuitResponse() tried to play a sound even when none was specified
	in the gameinfo.
- Added Yes/No selections for Y/N messages so that you can answer them
	entirely with a joystick.
- Fixed: Starting the menu at the title screen with a key other than Escape
	left the top level menu out of the menu stack.
- Changed the save menu so that cancelling input of a new save name only
	deactivates that control and does not completely close the menus.
- Fixed "any key" messages to override input to menus hidden beneath them and
	to work with joysticks.
- Removed the input parameter from M_StartMessage and the corresponding
	messageNeedsInput global, because it was redundant. Any messages that want
	a Y/N response also supply a callback, and messages that don't care which
	key you press don't supply a callback.
- Changed MKEY_Back so that it cancels out of text entry fields before
	backing to the previous menu, which it already did for the keyboard.
- Changed the menu responder so that key downs always produce results,
	regardless of whether or not an equivalent key is already down.

August 4, 2009
- Added the MF6_STEPMISSILE flag so that the Whirlwind can "walk" up steps.
- Changed the dword definition of PalEntry to uint32 so that it has one
	consistent definition across all source files.
- Swapped the order of floor and ceiling moves in DElevator::Tick() so that
	if an elevator contains an actor exactly the same height as it, it will not
	be blocked.
- Fixed: FWeaponSlot::PickWeapon() wrapped around improperly when the starting
	value for i was 0.

August 3, 2009  (Changes by Graf Zahl)
- Added kgsws's SummonActor enhancement and bumped netgame and demo versions
	because this submission changes an existing command.

August 2, 2009  (Changes by Graf Zahl)
- Changed: DEHACKED parsing is disabled now when a user supplied DEHSUPP lump
	is found. This mimics the old behavior which also disabled DEHACKED when
	the DEHSUPP lump was incompatible with the current engine. This behavior is
	needed to ensure that WADs that contain a ZDaemon-exclusive DEHSUPP lump
	continue to work as intended.
- Added A_Mushroom compatibility option for Dehacked.
- Added Gez's submission for interhubamount DECORATE property.
- Fixed: The big endian version of PalEntry did not add the DWORD d field.
- Fixed: TObjPtr did not use a union to map its 2 pointers together.
- Added a compatibility mode for A_Mushroom. For DECORATE it is an additional
	parameter but to force it for Dehacked mods some minor hacks using the
	Misc1 variable were needed.

August 1, 2009
- Moved the target->velz assignment to the end of A_VileAttack to remove the
	influence of vertical thrust from the radius attack, since ZDoom does
	explosions in three dimensions, but Doom only did it in two.
- Fixed: The last three parameters to A_VileAttack had their references off
	by one. Most notably as a result, the blast radius was used as the thrust,
	so it sent you flying far faster than it should have.
- Restored the reactiontime countdown for A_SpawnFly, since some Dehacked
	mod could conceivable rely on it. The deadline is now kept in special2
	and used in preference as long as it is non-zero.
- Removed -fno-strict-aliasing from the GCC flags for ZDoom and fixed the
	issues that caused its inclusion. Is an optimized GCC build any faster
	for being able to use strict aliasing rules? I dunno. It's still slower
	than a VC++ build.

	I did run into two cases where TAutoSegIterator caused intractable problems
	with breaking strict aliasing rules, so I removed the templating from it,
	and the caller is now responsible for casting the probe value from void *.

July 31, 2009
- Removed #include "autosegs.h" from several files that did not need it
	(in particular, dobject.h when not compiling with VC++).
- gdtoa now performs all type aliasing through unions. -Wall has been added
	to the GCC flags for the library to help verify this.
- Changed A_SpawnFly to do nothing if reactiontime is 0. Reactiontime was
	originally a counter, so if it started at 0, A_SpawnFly would effectively
	never spawn anything. Fixes Dehacked patches that use A_SpawnSound to
	play a sound without shooting boss cubes, since it also calls A_SpawnFly.

July 25, 2009
- Joystick devices now send key up events for any buttons that are held
	down when they are destroyed.
- Changed the joystick enable-y menu items to be nonrepeatable so that you
	can't create several device scans per second. Changing them with a
	controller is also disabled so that you can't, for example, toggle XInput
	support using an XInput controller and have things go haywire when the
	game receives an infinite number of key down events when the controller
	is reinitialized with the other input system.
- Changed menu input to use a consolidated set of buttons, so most menus
	can be navigated with a controller as well as a keyboard.
- Changed the way that X/Y analog axes are converted to digital axes.
	Previously, this was done by checking if each axis was outside its deadzone.
	Now they are checked together based on their angle, so straight up/down/
	left/right are much easier to achieve.

July 25, 2009  (Changes by Graf Zahl)
- Fixed: The composer for complex multipatch textures did not clear the palette
	buffer before filling it.

July 24, 2009  (Changes by Graf Zahl)
- Fixed: using custom automap backgrounds crashed.

July 22, 2009
- Added extra states to dehsupp for the MBF additions.
- Removed specific Button_Speed handling from the controllers' AddAxes()
	methods. Analog axes now respond to Button_Speed and cl_run in exactly the
	same way as digital buttons do.
- Changed rounding slightly for analog axis -> integer in G_BuildTiccmd().
- Fixed: FXInputController::ProcessThumbstick() was slightly off when it
	converted to the range [-1.0,+1.0].
- Added default bindings for the Xbox 360 controller buttons.
- Fixed: Redefining an existing skill would set that skills ACSReturn to be
	the same as the next new skill defined, if neither definition explicitly set
	the value for ACSReturn.
- Added a DefaultSkill property. Adding it to a skill will cause that skill
	to be the default one selected in the menu. If none is specified as the
	default, then the middle skill is the default.
- Slider controls in the options menu now display their values
	numerically next to the slider.
- The minimum value for m_yaw, m_pitch, m_forward, and m_side from the
	menu has been dropped from 0.5 to 0, so those particular mouse motions can
	be disabled entirely without using the console.

July 17, 2009  (Changes by Graf Zahl)
- fixed blue colormap
- Added parameters to A_VileAttack.
- Removed redundant definition of use_joystick from SDL/i_input.cpp.

July 16, 2009
- Turned net decompression into a non fatal error. It now drops the packet
	and waits for the sender to send a new, hopefully good, packet.
- Reduced potential for overflow in R_ProjectSprite().
- Moved the IF_ADDITIVETIME check earlier in APowerup::HandlePickup so
	that additive time powerups can be activated before the existing
	power has entered its blink threshold.
- Added a "BlueMap" for powerup colors.
- Added a NULL screen check when detaching HUD messages.
- Added HotWax's A_SetArg.
- Gez's patch for more A_WeaponReady flags:
	* WRF_NOBOB (1): Weapon won't bob
	* WRF_NOFIRE (12): Weapon won't fire at all
	* WRF_NOSWITCH (2): Weapon can't be switched off
	* WRF_NOPRIMARY (4): Weapon will not fire its main attack
	* WRF_NOSECONDARY (8): Weapon will not fire its alt attack

July 15, 2009
- Attempt to add support for Microsoft's SideWinder Strategic Commander.

July 14, 2009
- Split the joystick menu into two parts: A top level with general options
	and a list of all attached controllers, and a second level for configuring
	an individual controller.
- Fixed: Pressing Up at the top of a menu with more lines than fit on screen
	would find an incorrect bottom position if the menu had a custom top height.
- Added the cvars joy_dinput, joy_ps2raw, and joy_xinput to enable/disable
	specific game controller input systems independant of each other.
- Device change broadcasts are now sent to the Doom event queue, so
	device scanning can be handled in one common place.
- Added a fast version of IsXInputDevice that uses the Raw Input device
	list, because querying WMI for this information is painfully slow.
- Added support for compiling with FMOD Ex 4.26+ and running the game
	with an older DLL. This combination will now produce sound.

July 13, 2009  (Changes by Graf Zahl)
- added submission for raising master/children/siblings.
- added submission for no decals on wall option.
- removed some useless code from SpawnMissile function.

July 12, 2009  (Changes by Graf Zahl)
- Backported 2 fixes from Skulltag:
	* A_SentinelAttack must check for a NULL target
	* Monsters with CANTLEAVEFLOORPIC could not move because their floor
		texture was not initialized.
- Fixed: The 'idclev' cheat set the player's health to 0 which caused the
	level to end when in a sector of type 'end level when health below 10'.

July 11, 2009  (Changes by Graf Zahl)
- Fixed: The 'kill' cheat set the player to nonshootable even if it did not
	succeed.

July 10, 2009
- Added joystick config loading and saving support; moved generic joystick
	interfaces to m_joy.h.

July 9, 2009
- Added Raw Input PS2 adapter support.

July 6, 2009  (Changes by Graf Zahl)
- Added Gez's A_WeaponReady enhancement submission.

July 5, 2009  (Changes by Graf Zahl)
- Added Gez's CheckActorProperty submission.

July 4, 2009  (Changes by Graf Zahl)
- Added code submissions for non-piercing railguns and new skill options.

July 3, 2009
- ZDoom now disables the input method editor, since it has no east-Asian
	support, and having it open a composition window when you're only expecting
	a single keypress is not so good.
- Fixed: Setting intermissioncounter to false in gameinfo drew all the stats
	at once, instead of revealing them one line at a time.
- Fixed: The border definition in MAPINFO's gameinfo block used extra braces.

June 30, 2009
- Added A_SetCrosshair.
- Added A_WeaponBob.
- Dropped the Hexen player classes' JumpZ down to 9, since the original value
	now works as it originally did.
- MF2_NODMGTHRUST now works with players, too. (Previously, it was only for
	missiles.) Also added PPF_NOTHRUSTWHILEINVUL to prevent invulnerable players
	from being thrusted while taking damage. (Non-players were already
	unthrusted.)
- A_ZoomFactor now scales turning with the FOV by default. ZOOM_NOSCALETURNING
	will leave it unaltered.
- Added Gez's PowerInvisibility changes.
- Fixed: clearflags did not clear flags6.
- Added A_SetAngle, A_SetPitch, A_ScaleVelocity, and A_ChangeVelocity.
- Enough with this "momentum" garbage. What Doom calls "momentum" is really
	velocity, and now it's known as such. The actor variables momx/momy/momz
	are now known as velx/vely/velz, and the ACS functions GetActorMomX/Y/Z
	are now known as GetActorVelX/Y/Z. For compatibility, momx/momy/momz will
	continue to work as aliases from DECORATE. The ACS functions, however,
	require you to use the new name, since they never saw an official release
	yet.
- Added A_ZoomFactor. This lets weapons scale their player's FOV. Each weapon
	maintains its own FOV scale independent from any other weapons the player
	may have.
- Fixed: When parsing DECORATE functions that were not exported, the parser
	crashed after giving you the warning.

June 27, 2009
- Fixed some improper preprocessor lines in autostart/autozend.cpp.
- Added XInput support. For the benefit of people compiling with MinGW,
	the CMakeLists.txt checks for xinput.h and disables it if it cannot
	be found. (And much to my surprise, I accidentally discovered that if you
	have the DirectX SDK installed, those headers actually do work with GCC,
	though they add a few extra warnings.)

June 27, 2009  (Changes by Graf Zahl)
- Added Gez's submissions for A_M_Saw customization, area damage and
	pitch for A_FireCustomMissile.

June 26, 2009
- Attaching and detaching joysticks once again updates the joystick menu.
- Added joystick axis -> button mapping.

June 26, 2009  (Changes by Graf Zahl)
- Added Gez's actor replacement per skill submission.

June 25, 2009
- Joystick axes can be configured in the menu again. TODO: Config saving
	and loading, XInput, allow axes to be used as buttons (for the Xbox
	controller's trigger buttons), allow the joystick to move through the
	menus, and my PS2 adapter which has no Vista x64 drivers.

June 22, 2009
- Changed the definition of SBarInfoCoordinate to use bitfields to pack its
	members into 32 bits so that it can be stored in a plain old int without
	any transformations. The transformation coord -> int -> coord was
	destructive if the coordinate value was negative, causing the final
	coordinate to be centered even if the original was not.
- SBARINFO patch: Enable forcescaled with fullscreenoffsets.
- Fixed: Since UDMF allows for fractional vertex coordinates, it is no longer
	safe for P_AlignPlane() to truncate coordinates when searching for the
	furthest vertex from the line.

June 19, 2009
- The reorganized DirectInput game controller code finally compiles. (Ugh! It
	took far too long to reach this point.) Manual axis configuration is
	currently disabled, since I need to rewrite that, too. The eventual point of
	this is that the code will be modular enough that I can just plop in
	routines for XInput controllers and driver-less PlayStation 2 adapters
	without much fuss, since the old joystick code was very much DirectInput-
	centric.

June 19, 2009  (Changes by Graf Zahl)
- Changed AWeaponGiver to keep the weapon actor around instead of respawning a new
	one for each call.
- Fixed: AWeaponGiver::TryPickup checked the wrong item for ammo to give.
- fixed: FRandom::Random2(int mask) must return the difference between 2 byte values
	for compatibility.
- fixed: The sound name world/volcano/shoot was accidentally destroyed in the source.

June 16, 2009  (Changes by Graf Zahl)
- Reintroduced damage thrust clamping but with a higher threshold. The clamping
	is now also done in floating point before any fixed point overflows can occur.

June 14, 2009  (Changes by Graf Zahl)
- added a compatibility option to restore the original Heretic bug where
	a Minotaur couldn't spawn floor flames when standing in water having its
	feet clipped.
- added vid_vsync to display options.
- fixed: Animations of type 'Range' must be disabled if the textures don't
	come from the same definition unit (i.e both containing file and use type
	are identical.)
- changed: Item pushing is now only done once per P_XYMovement call.
- Increased the push factor of Heretic's pod to 0.5 so that its behavior
	more closely matches the original which depended on several bugs in the engine.
- Removed damage thrust clamping in P_DamageMobj and changed the thrust calculation
	to use floats to prevent overflows. The prevention of the overflows was the
	only reason the clamping was done.
- Added Raven's dagger-like vector sprite for the player to the automap code.

June 10, 2009
- Changed wad namespacing so that wads with a missing end marker will be
	loaded as if they had one more lump with that end marker. This matches the
	behaviour of previously released ZDooms. (The warning is still present, so
	there's no excuse to release more wads like this.)
- Moved Raw Input processing into a seperate method of FInputDevice so that
	all the devices can share the same setup code.

June 9, 2009
- Removed F16 mapping for SDL, because I guess it's not present in SDL 1.2.

June 9, 2009  (Changes by Graf Zahl)
- Added Gez's Skulltag feature patch, including:
		* BUMPSPECIAL flag: actors with this flag will run their special if collided on by a player
		* WEAPON.NOAUTOAIM flag, though it is restricted to attacks that spawn a missile (it will
		not affect autoaim settings for a hitscan or railgun, and that's deliberate)
		* A_FireSTGrenade codepointer, extended to be parameterizable
		* The grenade (as the default actor for A_FireSTGrenade)
		* Protective armors à la RedArmor: they work with a DamageFactor; for example to
		recreate the RedArmor from Skulltag, copy its code from skulltag.pk3 but remove
		the "native" keyword and add DamageFactor "Fire" 0.1 to its properties.
- Fixed: I_ShutdownInput must NULL all pointers because it can be called twice
	if an ENDOOM screen is displayed.
- Fixed: R_DrawSkyStriped used frontyScale without initializing it first.
- Fixed: P_LineAttack may not check the puff actor for MF6_FORCEPAIN because
	it's not necessarily spawned yet.
- Fixed: FWeaponSlots::PickNext/PrevWeapon must be limited to one iteration
	through the weapon slots. Otherwise they will hang if there's no weapons
	in a player's inventory.
- Added Line_SetTextureScale.
- Fixed: sv_smartaim 3 treated the player like a shootable decoration.
- Added A_CheckIfInTargetLOS
- Removed redundant A_CheckIfTargetInSight.

June 8, 2009
- Fixed: The initial play of a GME song always started track 0.
- Fixed: The RAWINPUT buffer that GetRawInputData() fills in is 40 bytes on
	Win32 but 48 bytes on Win64, so Raw Mouse on x64 builds was getting random
	data off the stack because I also interpreted the error return incorrectly.

June 7, 2009  (Changes by Graf Zahl)
- added parameter to A_FadeOut so that removing the actor can be made an option.
- added PERSISTENTPOWER and TRANSFERPOINTERS submissions by Gez.
- fixed FORCEPAIN logic.
- added Gez's infinite ammo powerup and random spawner fix patches.
- reduced size of Hexen's flames to fix bug in Deathkings MAP01.
- added checks for sidedef scaling values
- Added Karate Chris's poison cloud fix.

June 6, 2009
- Added per-tier texture scaling with these new UDMF sidedef properties:
	* scalex_top
	* scaley_top
	* scalex_mid
	* scaley_mid
	* scalex_bottom
	* scalex_bottom
- Added sidedef versions of the linedef flags wrapmidtex and clipmidtex (via
	UDMF; names are the same). If the flag is set on the line, it applies to
	both sides. Otherwise, each side can control them individually.

June 6, 2009  (Changes by Graf Zahl)
- Added Hirogen2's unlimited pickup patch.
- Added railgun performance customization CVARs by Spleen.
- Added aspect ratio override submission by SoulPriestess.
- Added a 'resetinventory' MAPINFO option.
- Added MF6_NOFEAR flag.
- Added A_MonsterRefire(probability, jumptarget).
- Added A_JumpIfTargetInSight(state) action function.
- Changed: Puffs set their angle to face the originator of the attack.
- Strife's burning hands originally make the level view fullbright.
	changed in ZDoom to do partial brightening.

June 5, 2009
- Added support for horizontal mouse wheels, and set invprev/invnext as
	default bindings for it. This is Vista only. DirectInput mouse (in_mouse 2)
	does not support it, because the DirectInput mouse device does not expose
	this control.
- Added a label for the F16 key and mapped the kp= key on a Mac keyboard to
	the PC98 equivalent so it will be identified as kp=. (Interestingly, F13-
	F16 and kp= only generate events when using Raw Input, not when using
	DirectInput.

June 5, 2009  (Changes by Graf Zahl)
- Added MF6_FORCEPAIN flag that forces the target to go into the pain state
	regardless of pain chance.
- Changed screenblocks CVAR to be settable per game.
- Added SpawnSpotForced and SpawnSpotFacingForced ACS functions.
- Added pushfactor actor property.
- Added Gez's GetArmorType submission

June 2, 2009
- Swapped snes_spc out for the full Game Music Emu library.

June 2, 2009  (Changes by Graf Zahl)
- Fixed: The Hexen status bar still uses MAX_MANA for some calculations instead
	of MaxAmount.

June 1, 2009  (Changes by Graf Zahl)
- Added Blzut3's submission for displaying underwater stats in SBARINFO.

May 31, 2009  (Changes by Graf Zahl)
- Added Gez's AMMO_CHECKBOTH submission.
- Added Gez's THRUSPECIES submission.
- Added loading directories into the lump directory.
- fixed: The Dehacked parser could not parse flag values with the highest bit
	set because it used atoi to convert the string into a number.
- fixed: bouncing sounds were limited to inventory items.

May 30, 2009  (Changes by Graf Zahl)
- Rewrote IWAD detection code to use the ResourceFile classes instead of
	reading the WAD directory directly. As a side effect it should now be
	possible to use Zip and 7z for IWADs, too.
- Added 'EndTitle' nextmap option which goes to the regular title loop after
	the game has finished.
- Added NOBOSSRIP flag. Note: we are now at flags6!
- Added SetSkyScrollSpeed(int skyplane, fixed speed) ACS function.
- Added THRUACTORS flag that disables all actor<->actor collision detection.
- Added DONTSEEKINVISIBLE flag for missiles that can't home in on invisible
	targets.
- Added SFX_TRANSFERPITCH flag to A_SpawnItemEx.
- Added Ultimate Freedoom IWAD detection.
- Added GetAirSupply and SetAirSupply functions to ACS.
- Fixed: The *surface sound was not played when drowning was switched off
	by setting the level's air supply to 0.

May 27, 2009
- Fixed: The mouse wheel generated no events in GUI mode if you weren't
	fullscreen. (e.g. You could no longer scroll the console with the mouse
	buffer.)
- Fixed: Wheeling down was seen as wheeling up with the Win32 mouse.
- EV_GUI_Key(Down|Up|Repeat) events no longer provide shifted key codes
	in data2. This was just unnecessary overhead that wasn't really needed
	anywhere.
- Moved GUI-mode input into a separate function to make the code easier to
	read.
- Removed HaveFocus variable in preference of using GetForegroundWindow().
- Added Raw Input keyboard handling.

May 26, 2009
- Split DirectInput keyboard handling into a separate file and class. I also
	switched it to buffered input, and the pause key seems to be properly
	cooked, so I don't need to look for it with WM_KEYDOWN/UP. Tab doesn't
	need to be special-cased either, because buffered input never passes on
	the Tab key when you press Alt+Tab. I have no idea why I special-cased
	Num Lock, but it seems to be working fine. By setting the exclusive mode
	to background, I can also avoid special code for releasing all keys when
	the window loses focus, because I'll still receive those events while the
	window is in the background.
- Fixed: The Heretic "take weapons" cheat did not remove all the weapons at
	once. This is because destroying one weapon has a potential to destroy a
	sister weapon as well. If the sister weapon is the next one in line (as it
	typically is), it would process that one, not realizing it was no longer
	part of the inventory, and stop because its Inventory link was NULL.

May 25, 2009
- Recoverable errors that are caught during the demo loop no longer shut off
	the menu.
- Specifying non-existent directories with -savedir or the save_dir cvar now
	attempts to create them.
- I_CheckNativeMouse() now checks the foreground window to determine if the
	mouse should be grabbed. This fixes the case where you start the game in
	the background and it grabs the mouse anyway.
- Changed raw mouse grabbing to call ShowCursor() directly instead of through
	SetCursorState(), since changing the pointer isn't working with it
	(probably due to the lack of legacy mouse messages), and the others work
	fine by setting an invisible cursor.
- Fixed: Raw mouse input passes wheel movements in an unsigned field, but the
	value is signed, so it requires a cast to use it.

May 23, 2009
- SetCursorState() now calls ShowCursor() again, because capturing the mouse
	with RIDEV_NOLEGACY apparently prevents SetCursor() from doing anything.
- Split mouse code off from i_input.cpp into i_mouse.cpp and added raw mouse
	handling. (WM_INPUT obsoleted most of DirectInput for XP.)
- Fixed: Similar to the Win32 mouse, using the DirectInput mouse in windowed
	mode, if you alt-tabbed away and then clicked on the window's title bar,
	mouse input would be frozen until the mouse was ungrabbed again.

May 23, 2009  (Changes by Graf Zahl)
- Fixed: Textures with dimensions <= 0 are invalid and should be treated as NULL
	textures. They also must be set to dimensions other than (0,0) to avoid division
	by zero errors.
- Fixed: Random spawners did not handle the MF_DROPPED flag.
- Fixed: When setting up a deep water sector with Transfer_Heights the floorclip
	information of all actors in the sector needs to be updated.

May 22, 2009  (Changes by Graf Zahl)
- Fixed: A_CountdownArg and A_Die must ensure a certain kill.

May 22, 2009
- Moved SetSoundPaused() out of i_input.cpp and into s_sound.cpp.
- Fixed: When using Win32 mouse, windowed mode, alt-tabbing away and then
	clicking on the window's title bar moved it practically off the screen.
- Beginnings of i_input.cpp rewrite: Win32 and DirectInput mouse handling has
	been moved into classes.

May 21, 2009  (Changes by Graf Zahl)
- Changed bounce flags into a property and added real bouncing sound properties.
	Compatibility modes to preserve use of the SeeSound are present and the old
	flags map to these.

May 20, 2009  (Changes by Graf Zahl)
- Fixed: The SBARINFO parser compared an FString in the GAMEINFO with a NULL
	pointer and tried to load a lump with an empty name as statusbar script
	for non-Doom games.

May 19, 2009
- Fixed: SetSoundPaused() still needs to call S_PauseSound() to pause music
	that isn't piped through the digital sound system. (Was removed in r1004.)

May 16, 2009
- Added input buffering to the Implode and Shrink routines for a marked
	speedup.
- Replaced the Shanno-Fano/Huffman reading routines from FZipExploder with
	ones of my own devising, based solely on the specs in the APPNOTE.

May 15, 2009
- Found a copy of PKZIP 1.1 and verified that Implode support works with
	files that use a literal table and 8k dictionary, and that the just-added
	Shrink support works at all.
- Replaced the bit-at-a-time Shannon-Fano decoder from GunZip.c64 with the
	word-at-a-time one from 7-Zip for a slight speedup when working with
	Imploded files.

May 15, 2009  (Changes by Graf Zahl)
- Fixed: Monsters should not check the inventory for damage absorbtion when
	they have the MF5_NODAMAGE flag set.
- Added patch for saving automap zoom.
- Added ACS GetChar function.
- Added Gez's submission for polyobjects being able to crush corpses but made
	it an explicit MAPINFO option only.
- Changed APlayerPawn::DamageFade to a PalEntry from 3 floats.
- Removed #pragma warnings from cmdlib.h and fixed the places where they were
	still triggered.
	These #pragmas were responsible for >90% of the GCC warnings that were not
	listed in VC++.
- Fixed one bug in the process: DSeqNode::m_Atten was never adjusted when the
	parameter handling of the sound functions for attenuation was changed.
	Changed m_Atten to a float and fixed the SNDSEQ parser to set proper values.
	Also added the option to specify attenuation with direct values in addition
	to the predefined names.

May 14, 2009  (Changes by Graf Zahl)
- fixed a few Heretic actors:
	* The pod generator's attacksound was wrong
	* The teleglitter generators need different flags if they are supposed to work
		with z-aware spawning of the glitter.
	* The knight's axes need the THRUGHOST flag.

May 14, 2009
- Fixed non-POD passing in G_BuildSaveName() and other things GCC warned
	about.
- Added support for imploded zips.

May 11, 2009  (Changes by Graf Zahl)
- Fixed: Some missile spawning functions ignored the FastSpeed setting.
- Fixed: P_CheckSwitchRange tried to access a line's backsector without
	checking if it is valid.
- Fixed: Fast projectile could not be frozen by the Time freezer.
- Added several new ACS functions: GetActorMomX/Y/Z, GetActorViewHeight,
	SetActivator, SetActivatorToTarget.

May 11, 2009
- Added Species property for actors and separated Hexen's Demon1 and Demon2
	into different species.

May 10, 2009  (Changes by Graf Zahl)
- Added handling for UDMF user keys.
- Added support for ACS functions that can be defined without recompiling ACC.
- Fixed: The short lump name for embedded files must be cleared so that they
	are not found by a normal lump search.

May 9, 2009  (Changes by Graf Zahl)
- Added AProp_Notarget actor property.
- Fixed: TraceBleed was missing a NULL pointer check,
- Fixed: P_RandomChaseDir could crash for friendly monsters that belong to
	a player which left the game.
- Changed A_PodGrow so that it plays the generator's attack sound instead of
	"misc/podgrow".

May 8, 2009
- Added transference of a select few flags from PowerProtection to its owner.
- Added actor type parameters to A_PodPain() and A_MakePod().
- The savegame path is now passed through NicePath(), since it's user-
	specifiable.
- Added save_dir cvar. When non-empty, it controls where savegames go.
- SBARINFO update:
	* Added the ability to center things with fullscreenoffsets enabled.  Due
		to some limitations the syntax is [-]<integer> [+ center].
	* Fixed: the translucent flag on drawinventorybar didn't work quite right.
	* Fixed: Extremely minor inaccuracy in the Doom SBarInfo code.  The
		fullscreen inventory bar wasn't scaled correctly.

May 3, 2009  (Changes by Graf Zahl)
- fixed: The CHECKSWITCHRANGE line flag was ignored for one sided lines.
- Added more compatibility settings, submitted by Gez.

May 2, 2009  (Changes by Graf Zahl)
- Fixed: Doom's fullscreen HUD was limited to 6 keys.
- Made 'next endgame' work again for cases where it is supposed to be
	the same as 'next endgame4'.
- GCC nitpick fix: Classes being used as template parameters may not be
	defined locally in a function. Fixed FWadFile::SetNamespace for that.
- Improved error reporting for incorrect textures in maps.
- Fixed: When music was stopped this was not set in the global music state.
- Fixed: Friendly monsters did not target enemy players in deathmatch.

April 30, 2009  (Changes by Graf Zahl)
- Fixed: Completely empty patches (8 0-bytes) could not be handled by the
	texture manager. They now get assigned a new FEmptyTexture object
	that is just a 1x1 pixel transparent texture.
- Fixed: Multiple namespace markers of the same type were no longer detected.
- Fixed sprite renaming.

April 29, 2009
- Maps defined with Hexen-style MAPINFOs now run their scripts in the proper
	order.
- Fixed: FWadCollection::CheckNumForName() read the lump each iteration before
	checking for the end marker. On 32-bit systems, this is -1, but on 64-bit
	systems, it is a very large integer that is highly unlikely to be in mapped
	memory.

April 28, 2009  (Changes by Graf Zahl)
- Added ML_BLOCKUSE line flag, accessible through UDMF and Line_SetBlocking.

April 25, 2009  (Changes by Graf Zahl)
- Fixed handling of embedded WADs.

April 23, 2009  (Changes by Graf Zahl)
- Added Gez's A_CheckCeiling submission.
- Fixed: AM_NewResolution crashed when called from outside a level.
- Added support for Quake PAK files.
- Improved warning messages for WAD files with incorrect marker usage.
- complete restructuring of resource file handling for more flexibility and future
	extensions.
- Removed merging of special namespaces. For the texture manager this has
	become totally useless so there is no need to do this anymore. Not merging
	the namespaces also allows a much more reliable detection of lumps belonging
	to special namespaces so the ScanForFlatHack function is no longer needed.
	Instead, any lump up to F_END with a length of 4096 will be marked for
	inclusion as a flat texture if no F_START marker is found.

April 21, 2009  (Changes by Graf Zahl)
- fixed MustConfirm parsing in MAPINFO

April 19, 2009  (Changes by Graf Zahl)
- Made the counting of intermission stats in Doom a GAMEINFO option so that
	it can be activated in all games.

April 17, 2009
- Gave the intermission screen sounds their own SNDINFO entries.

April 16, 2009
- Removed obsolete snd_surround cvar.

April 15, 2009
- Changing screen resolution now adjusts the automap scale to be constant
	relative to screen resolution.
- Fixed: When FMultiPatchTexture::MakeTexture() needed to work in RGB
	colorspace, it didn't zero out the temporary buffer.
- Fixed memory leak from leftover code for 7z loading and added the
	LUMPF_ZIPFILE flag to their contents so they have the same semantics
	as zips.

April 14, 2009
- Added support for 7z archives.

April 13, 2009  (Changes by Graf Zahl)
- Added -noautoload option.
- Added default Raven automap colors set. Needs to be tested because I can't
	compare against the DOS version myself.
- Extened A_PlaySound and A_StopSound to be able to set all parameters of the
	internal sound code.

April 13, 2009
- Changed gravity doubling so that it only happens when you run off a ledge.

April 10, 2009
- Fixed: World panning was ignored for the X offset of masked midtextures.

April 10, 2009  (Changes by Graf Zahl)
- Extended MF5_MOVEWITHSECTOR so that it always keeps the actor on the ground
	of a moving floor, regardless of movement speed. For NOBLOCKMAP items this
	is necessary because otherwise they can be left in the air and it also adds
	some options for other things.

April 9, 2009
- Changed A_FreezeDeathChunks() so that instead of directly destroying an
	actor, it sets it to the "Null" state, which will make it invisible and
	destroy it one tic later.
- Added a NULL pointer check to A_Fire() and copied the target to a local
	variable inside A_VileAttack() so that if P_DamageMobj() destroys the
	target, the function will still have a valid pointer to it (since reading
	it from the actor's instance data invokes the read barrier, which would
	return NULL).

April 9, 2009  (Changes by Graf Zahl)
- Added NOBLOCKMAP/MOVEWITHSECTOR combination to a few items that had their
	NOBLOCKMAP flag taken away previously to make them move with a sector.
	This should fix the performance problem Claustrophobia had with recent
	ZDoom versions.

April 8, 2009
- Added MF5_MOVEWITHSECTOR flag, so you can have the benefits of MF_NOBLOCKMAP
	but still have actors that will move up and down with the floor. IceChunk
	now uses both of these flags.
- Performance optimization for FBlockThingsIterator::Next(): Actors that
	exist in only one block don't need to be added to the CheckArray or
	scanned for in it. Also changed the array used to keep track of visited
	actors into a hash table.

April 7, 2009  (Changes by Graf Zahl)
- added some default definitions for constants that may miss in some headers.
- replaced __va_copy with va_copy per Chris's suggestion.
- replaced #include <malloc.h> with #include <stdlib.h> where possible.

April 6, 2009  (Changes by Graf Zahl)
- Fixed: The UDMF textmap readbuffer was never freed.

April 4, 2009
- Fixed: GetPlayerInput() died if you tried to get the input of the activator
	and the activator was the world.

April 4, 2009  (Changes by Graf Zahl)
- fixed: Any player class inheriting directly from PlayerPawn was left with
	empty weapon slots due to the recent rewrite of the weapon slot assignment
	code. To handle such classes each game now defines a default weapon slot
	setting in its gameinfo. This will be used when a player class without any
	weapon slot settings is used.
- added 'damage' to the actor variables exported to DECORATE's expression
	evaluator.
- fixed: solid corpses could block ripper missile that originally killed them.

April 2, 2009
- Fixed: Doom's status bar was lacking its default face.
- Fixed: Custom skin face graphics were not added to the texture manager.
- Fixed: UseHealthItems() gave you health equal to the number of items in
	the stack of health items, rather than the item's proper amount.

April 1, 2008
- Fixed: SBARINFO's "usessecondaryammo" considered a weapon to not use
	secondaryammo if ammo2's type was the same as ammo1's, but only if you
	didn't use the "not" keyword with it.

March 29, 2009  (Changes by Graf Zahl)
- Fixed: Altering a link type with Sector_SetLink did not work.
- Fixed: player.crouchsprite had no proper means of unsetting the crouch
	sprite which is needed by the ChexPlayer.
- Fixed: A_ChangeFlags must unlink the actor from the world before changing
	the NOBLOCKMAP and NOSECTOR flags.

March 28, 2009  (Changes by Graf Zahl)
- Fixed: Dehacked string replacement did not check the clusters' finaleflats.
- Changed the definition of several typedef'd structs so that they are
	properly named.
- Limited DEHSUPP lump lookup to search zdoom.pk3 only. It will no longer
	be possible to load DEHSUPP lumps from user WADs.
- Brought back the text-based DEHSUPP parser and changed it to be able to
	reference states by label. Also changed label names of
	DoomUnusedStates and added proper labels to all states that were
	previously forced to be the first state of an actor so that the old
	(limited) method could access them. This was done to address the following
	bug:
- Fixed: The player's death states calling A_PlayerSkinCheck should not be
	part of the state set that is accessible by Dehacked. These will produce
	error messages when mapped to non-players.

March 27, 2009  (Changes by Graf Zahl)
- Fixed: Reading the RNG states from a savegame calculated the amounts of
	RNGs in the savegame wrong.

March 26, 2009
- Changed random seed initialization so that it uses the system's
	cryptographically secure random number generator, if available, instead
	of the current time.
- Changed the random number generator from Lee Killough's algorithm to the
	SFMT607 variant of the Mersenne Twister.
	<http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/index.html>

March 25, 2009
- Made fmodex.dll delay-loaded so the game should be runnable on Windows 95
	again, though without sound.
- Changed gameinfo_t and gameborder_t to be named structs instead of
	typedef'ed anonymous structs.
- Fixed: P_AutoUseHealth() used autousemodes 0 and 1 instead of 1 and 2.
- Fixed: SBARINFO did not recognize 5:4 aspect ratio.
- Fixed: screenshot_dir was ignored.

March 25, 2009  (Changes by Graf Zahl)
- Removed some obsolete code from G_InitLevelLocals that was causing problems
	with maps that have no name.
- Fixed: The inner loop in AWeaponSlot::PickWeapon could endlessly loop when
	the counter variable became negative.
- Fixed: Implicitly defined clusters were not initialized when being created.

March 24, 2009  (Changes by Graf Zahl)
- Fixed: Item tossing did not work anymore.

March 23, 2009  (Changes by Graf Zahl)
- Changed: Making the gameinfo customizable by MAPINFO requires different
	checks for map specific border flats.

March 22, 2009  (Changes by Graf Zahl)
- removed gamemission variable because it wasn't used anywhere.
- removed gamemode variable. All it was used for were some checks that
	really should depend on GI_MAPxx.
- Externalized all internal gameinfo definitions.
- added include to MAPINFO parser.
- split IWAD detection code off from d_main.cpp into its own file.
- disabled gamemission based switch filtering because it is not useful.
- added GAMEINFO submission by Blzut3 with significant modifications. There
	is no GAMEINFO lump. Instead all information is placed in MAPINFO, except
	the data that is needed to decide which WADs to autoload.

March 19, 2009
- Added the current value of the string buffer to the state saved when
	making a function call in ACS. Now you can print inside functions and
	also return values from them for the caller to plug directly into
	another string without having to save it to a temporary variable.
- Added an OutputVolume() call after the MusicVolumeChanged() call in
	MIDIStreamer::Play(). Since the state isn't playing yet when
	MusicVolumeChanged() is called, it doesn't do this itself.
- Fixed: P_RailAttack() passed the wrong angle variable to P_TraceBleed().

March 18, 2009  (Changes by Graf Zahl)
- Fixed: S_StopSound may not assume that after stopping a sound channel
	its link to the next item in the list is still valid.
- Fixed typo in src/CMakeLists.txt.
- Fixed: Armor only worked for players.
- Fixed: P_FindFloorCeiling may not call P_PointInSector if called from
	P_SpawnMapThing. It must use the values the actor has been initialized to
	by LinkToWorldForMapThing.

March 17, 2009
- Added the -norun parameter to quit the game just before video
	initialization. To be used to check for errors in scripts without actually
	running the game.
- Added the -stdout parameter to the Windows version to send all output to
	a console, like the Linux version has done all along.

March 16, 2009
- Added support for loading ZGL2 nodes. (Only useful with UDMF and maps with
	more than 65534 lines.)

March 15, 2009  (Changes by Graf Zahl)
- Fixed: AWeapon::PickupForAmmo accessed ammo type 1 when checking ammo type2.

March 14, 2009
- Changed Linux default for fullscreen to false.
- Removed CVAR_SERVERINFO flag from compatmode. Since it writes to
	compatflags, that should be enough. Having that flag set for both of
	them leads to problems with e.g. loading a savegame, where compatflags is
	restored, then compatmode is restored and it completely undoes whatever
	compatflags was restored to.
- Fixed: Trying to start a map for some single file that isn't really a map
	caused a crash.

March 12, 2009
- Fixed: After loading a savegame or unmorphing, a player's weapon slots
	were empty.

March 11, 2009
- Moved weapon slot initialization into APlayerPawn::PostBeginPlay() so that
	they can be initialized when players respawn in multiplayer.

March 11, 2009  (Changes by Graf Zahl)
- Added a Check for the Vavoom namespace to the UDMF parser. Functionally
	it's 100% identical with ZDoom's own but needs to be checked for in
	case Vavoom compatible UDMF maps are released.

March 10, 2009
- Added an SDL output plugin, so FMOD can produce sound using SDL's audio
	support instead of its own OSS/ALSA/ESD support. This is selectable by
	setting snd_output to "sdl".
- Fixed: On Linux systems with ALSA but no OSS support, trying to start
	the sound system with snd_output "default" would fail instead of trying
	to use ALSA.
- Added sdl_nokeyrepeat to disable key repeating in the menus and console
	on Linux.
- Added support for zip/pk3 files with LZMA and bzip2 compression to ZDoom.
- Added more output to zipdir and a -q option to turn it off.
- Added -u option to zipdir to only recompress those files in a zip that have
	changed.

March 7, 2009
- Added -d and -f options to zipdir. -d forces deflate compression, and -f
	forces a write of the zip, even if it's newer than all the files it contains.

March 7, 2009  (Changes by Graf Zahl)
- Fixed: P_CompleteWeaponSetup was missing a NULL pointer check for the player.
- Adjusted some gravity related thresholds for the fix from Feb 28. Also removed
	some unnecessary floating point math from this code.

March 6, 2009
- Added support for bzip2 and LZMA compression to zipdir.

March 6, 2009  (Changes by Graf Zahl)
- Added Hirogen2's patch for unlimited ammo CVAR.

March 4, 2009
- Fixed: You couldn't easily play with the compatibility options menu during
	the title screen, because the demo loop reset the server cvars after each
	attempt to play a demo, even though the demos never actually played. The
	proper long-term solution would be to make shadow copies of all cvars
	touched by demos and use those for the demo and the real things for
	everything else, but this should do for now and is a lot easier.
- Fixed: When using BOOM-style sector flags and specials together, the
	special was ignored unless it was "secret".
- Fixed: One byte is too short for DUMB_IT_SIGRENDERER to store song tempo.
	Changed it to a word.
- Went back to using RDTSC for timing on Win32. Ironically,
	QueryPerformanceCounter() is obviously using the TSC for its timing on my
	machine, yet the overhead it has to do to keep the timer sane is apparently
	noticeable on a few maps. I suppose I should at some time check
	clock_gettime() and see if it has similar issues on Linux.

March 3, 2009  (Changes by Graf Zahl)
- changed: If a monster with the BOSSDEATH flag is crushed A_BossDeath will
	be called now.
- fixed: D'Sparil's second form was missing the BOSSDEATH flag.
- fixed: D'Sparil's first form requires the DONTGIB flag.
- fixed: Heretic doesn't crush monsters. To handle this in a more generic
	fashion this depends on the presence of a gib sprite now.

March 1, 2009  (Changes by Graf Zahl)
- Changed burn and Acolyte death sequences so that they leave corpses that
	don't vanish.
- Fixed: AActor::SetOrigin must call P_FindFloorCeiling to get the true
	floor and ceiling heights. Otherwise the actor will fall right through
	3DMidtex textures (and 3D-floors.)

February 29, 2008
- Version bump to 2.3.0.

February 28, 2009
- Fixed: The TeleporterBeacon tried to enter its See state rather than its
	Drop state. Also changed it to fade out when it's done rather than
	disappearing abruptly.

February 28, 2009  (Changes by Graf Zahl)
- Fixed: Strife's quest based line actions also work in Deathmatch.
- Fixed: Gravity application was not correct. For actors with no vertical
	momentum the initial pull is supposed to be twice as strong as when
	vertical movement already takes place.
- added invquery CCMD like in Strife. Also removed all underscores from the
	tag strings so that they can be printed properly.
- Fixed: Skill baby was missing 'autousehealth' for all games.
- Added a new CVAR: sv_disableautohealth
- Autouse of health items is no longer hardwired to the default item classes.
	There's a new property HealthPickup.Autouse. 0 means no autouse, 1 a small
	Raven health item, 2 a large Raven health item and 3 a Strife item.

February 26, 2009
- Removed an early-out in wallscan_striped() that is invalid when drawing a
	skybox.

February 25, 2009  (Changes by Graf Zahl)
- fixed: nextmap and nextsecret CCMDs set skill to 0.
- fixed: level.flags2 was not stored in savegames. Also bumped min. savegame
	version and removed old compatibility handlings.

February 25, 2009
- The SFX Reverb unit is now moved so that it serves as an input to the water
	effect rather than as an input to the ChannelGroup Target Unit. This means
	the water effect is now applied after any room reverb, rather than in
	parallel with it.
- Fixed: UI sounds should not have reverb applied to them.
- Removed the delay for starting all sounds from one tic at exactly the same
	DSP position. Without also synchronizing the stopping of sounds, it can
	cause problems with things like the chainsaw where the sound is stopped and
	immediately restarted, causing occassional gaps between the stopping of the
	sound and the starting of the new one. (I added the start synchronization to
	combat flanging of paired moving polyobjects when moving around, but I think
	just removing velocity from the player for sound calculations takes care of
	that well enough.)

February 24, 2009  (Changes by Graf Zahl)
- Added GCC headers for intptr_t to tarray.h.
- Added MF5_PAINLESS flag for projectiles that don't make the target go into
	the pain state.

February 23, 2009
- Changed DEM_ADDSLOTDEFAULT, DEM_ADDSLOT, and DEM_SETSLOT to be more space-
	efficient.
- Fixed: player->oldbuttons was copied from the current button set at the end
	of P_PlayerThink(), well before ACS could ever get at it with GetPlayerInput.

February 23, 2009  (Changes by Graf Zahl)
- Fixed: The map name display on the automap was incomplete.
- Added FakeInventory.Respawns DECORATe property
- Fixed: Unsetting the MF5_INCONVERSATION flag did not work when quitting the
	conversation by pressing Escape.

February 22, 2009  (Changes by Graf Zahl)
- added ML_BLOCKPROJECTILE flag to lines.
- Fixed: With opl_onechip set the second OPL chip was never set to anything valid
	so it contained an invalid pointer. There were also a few other places that
	simply assumed that the second chip is set to something valid.
- Fixed: NPCs which are engaged in a conversation should not move.
- Fixed: Player movement animation was not stopped when starting a conversation.

February 21, 2009
- Added selective compression of network packets. Interestingly, most packets
	don't actually compress all that well, even the ones that aren't too short
	to possibly compress. (Maybe make the whole thing one long, never-ending
	zlib data stream with Z_SYNC_FLUSH used to chunk things at packet
	boundaries? That would probably help the compression ratio, but it would
	require changing the way the netcode determines sequence, which would be
	a much more invasive change.)

February 21, 2009  (Changes by Graf Zahl)
- Fixed: Heretic's fullscreen HUD crashed when the player had armor without
	a valid icon.
- Fixed: The StrifePlayer was missing a RunHealth setting.
- Fixed: Untranslated colors in fonts had an alpha value of 0 but need 255.
- Fixed: The Doom status bar's ammo display may not use the INDEXFONT for
	the alternative HUD. Instead it has to create a separate one out of the
	STYSNUM characters.
- Fixed: skins can not be sorted for binary search because the player class
	code depends on the original indices.
- Fixed: P_StartConversation set the global dialog node variable for all
	players, not just the consoleplayer.
- Fixed: AWeapon::PickupForAmmo assumed that any weapon having a secondary
	ammo type also has a primary one.

February 20, 2009  (Changes by Graf Zahl)
- Bumped netgame, demo and min demo version for the weapon slot changes.
- changed weapon slots to be stored per player. Information is now transmitted
	across the network so that all machines know each player's current weapon
	configuration so that it can be used by cheats or HUD display routines.
- fixed: level_info_t::mapbg was not initialized

February 17, 2009
- Fixed: Player names and chat macros that end with incomplete \c escapes now
	have those escapes stripped before printing so that they do not merge with
	subsequent text.

February 15, 2009  (Changes by Graf Zahl)
- Fixed: The CHARFORMAT structure that is used to set the color in a Windows
	Rich Edit control was not fully initialized resulting in incorrect colors
	being set.

Feburary 14, 2009
- Moved default weapon slot assignments into the player classes.
	Weapon.SlotNumber is now used solely for mods that want to add new weapons
	without completely redoing the player's arsenal. Restored some config-based
	weapon slot customization, though slots are no longer automatically saved
	to the config and section names have changed slightly. However, unlike
	before, config slots are now the definitive word on slot assignments and
	cannot be overridden by any other files loaded.

February 14, 2009  (Changes by Graf Zahl)
- Added MF5_CANTSEEK flag to prevent seeker missiles from homing in on
	certain actors and added an option to APowerInvisibility to set this
	flag when active.
- Added map specific automap backgrounds.
- Fixed: Voodoo dolls did not play a sound when dying.
- Added colorized error messages to DECORATE and made a few more error
	conditions that do not block further parsing not immediately abort.
- Made all errors in CreateNewActor not immediately fatal so that the
	rest of the DECORATE lump can be parsed normally to look for more errors.
- Fixed: Defining classes with the same name as their immediate base class
	was legal. It should not be allowed that a class has another one with the
	same name in its ancestry.
- Fixed: Formatting of the intermission screen on Heretic, Hexen and Strife
	was broken. Changed it to use WI_Drawpercent which does it properly and
	also allows showing percentage in these games now.
- Fixed: The MAPINFO parser ignored missing terminating braces of the last
	block in the file.

February 11, 2009
- Fixed: Several weapons were missing a game filter from their definitions.
- Removed storage of weapon slots in the config so that weapon slots can
	be setup in the weapons themselves. Slots are still configurable, since
	they need to be for KEYCONF to work; any changes simply won't be saved
	when you quit.
- Removed limit on weapon slot sizes.

February 10, 2009
- Fixed: DirectInput8Create() used the wrong calling convention.
- Moved the V_InitFontColors() call earlier in the startup sequence so that
	colored error messages appear colored in the startup window. Also lightened
	up the "Flat" red to contrast better on the startup background.

February 9, 2009
- Changed I_InitInput() to acquire the IDirectInput8A interface by using
	DirectInput8Create() instead of CoCreateInstance(). This allows the Steam
	GameOverlayRenderer.dll to properly hook it.
- Stopped sending double the number of wheel events as appropriate to the
	console under Linux.
- Added middle mouse button selection pasting for X systems.

February 8, 2009  (Changes by Graf Zahl)
- Fixed parsing of 'cluster' keyword when format is not yet known.
- Moved CheckCompatibility call so that it is done after setting LEVEL_HEXENFORMAT.
- Fixed parsing for MustConfirm key in skill parser.
- Converted internal MAPINFOs to new syntax.
- Added a range parameter to SNDINFO's $limit.
- Restored Dehacked music name replacement.

February 7, 2009
- Added GUICapture mouse button events for Win32.
- Changed I_GetFromClipboard() to return an FString.
- Added GTK+-based clipboard support for Linux.
- Fixed: Most Linux filesystems do not fill in d_type for scandir(), so we
	cannot rely on it to detect directories.
- Added NicePath() function to perform shell-style ~ substitution on path
	names.
- Changed the default screenshot directory on Unix to ~/.zdoom/screenshots/.
- Added -shotdir command line option to temporarily override the
	screenshot_dir cvar.

February 7, 2009  (Changes by Graf Zahl)
- Fixed: G_SerializeLevel must use the TEXMAN_ReturnFirst flag for getting
	the sky textures so that it still works when the first texture in a TEXTURE1
	lump is used as sky.

February 6, 2009
- Restored the old drawseg/sprite distance check from 2.0.63. The code that
	replaced it did the check at the center of the area intersected by the
	sprite and the drawseg, whereas 2.0.63 only did the check at the location
	of the sprite on the map.
- Commented out the CALL_ACTION(A_Look, actor) for targetless friendly
	monsters in A_DoChase(). They can still find new targets without this,
	and with it, they got stuck on the first frame of their see state.
- Fixed: Keys bound in a custom key section would unbind the key in the
	main game section.
- Fixed scrolling of the automap background on a rotated automap.

February 5, 2009
- Changed singleplayer allowrespawn to act like a co-op game when you
	change levels while dead by immediately respawning you before the switch
	so that you get to keep all your inventory.
- Fixed: G_InitLevelLocals() did not set flags2.

February 5, 2009  (Changes by Graf Zahl)
- fixed: The compatibility parser applied the last map's settings to all
	maps in the compatibility list.
- Added compatibility settings for a few more levels in some classic WADs.
- Added spechit overflow workaround for Strain MAP07. This is highly map
	specific because the original behavior cannot be restored.
- Added a check for Doom's IWAD levels that forces COMPAT_SHORTTEX for them.
	MD5 cannot be used well here because there's many different IWADs with
	slightly different levels. This is only done for Doom format levels to
	ensure that custom IWADs for ZDoom are not affected.
- fixed: level.flags2 was not reset at level start.
- Fixed: Morph powerups can change the actor picking up the item so
	AInventory::CallTryPickup must be able to return the new actor.
- Fixed: ACS's GiveInventory may not assume that a PlayerPawn is still
	attached to the player data after an item has been given.
- Added a missing NULL pointer check to DBaseStatusBar::Blendview.

February 4, 2009
- Added a compatibility lump because I think it's a shame that Void doesn't
	work properly on new ZDooms after all the collaboration I had with Cyb on
	that map. (Works with other maps, too.)

February 4, 2009  (Changes by Graf Zahl)
- Made improvements so that the FOptionalMapinfoData class is easier to use.

February 3, 2009
- Moved the MF_INCHASE recursion check from A_Look() into A_Chase(). This
	lets A_Look() always put the actor into its see state. This problem could
	be heard by an Archvile's resurrectee playing its see sound but failing to
	enter its see state because it was called from A_Chase().
- Fixed: SBARINFO used different rounding modes for the background and
	foreground of the DrawBar command.
- Bumped MINSAVEVER to coincide with the new MAPINFO merge.
- Added a fflush() call after the logfile write in I_FatalError so that the
	error text is visible in the file while the error dialog is displayed.

January 18, 2009 - February 3, 2009  (Changes by Graf Zahl)
- moved all code related to global ACS variables to p_acs.cpp where it belongs.
- fixed: The nextmap and nextsecret CCMDs need to call G_DeferedInitNew instead of G_InitNew.
- rewrote the MAPINFO parser:
	* split level_info_t::flags into 2 DWORDS so that I don't have to deal with 64 bit values later.
	* split off skill code into its own file
	* created a parser class for MAPINFO
	* replaced all uses of ReplaceString in level_info_t with FStrings and made the specialaction
		data a TArray so that levelinfos can be handled without error prone maintenance functions.
	* split of parser code from g_level.cpp
	* const-ified parameters to F_StartFinale.
	* Changed how G_MaybeLookupLevelName works and made it return an FString.
	* removed 64 character limit on level names.

February 2, 2009
- Changed DECORATE replacements so that they aren't overridden by Dehacked.

February 2, 2009  (Changes by Graf Zahl)
- Fixed: The damage factor for 'normal' damage is supposed to be applied to
	all damage types that don't have a specific damage factor.

January 31, 2009
- Changed FMOD init() to allocate some virtual channels.
- Fixed clipping in D3DFB::DrawTextureV() for good by using a scissor test.

January 30, 2009
- Fixed: D3DFB::DrawTextureV() did not properly adjust the texture coordinate
	for lclip and rclip.
- Added weapdrop ccmd.
- Centered the compatibility mode option in the comptibility options menu.
- Added button mappings for 8 mouse buttons on SDL. It works with my system,
	but Linux being Linux, there are no guarantees that it's appropriate for
	other systems.
- Fixed: SDL input code did not generate GUI events for the mousewheel, so it
	could not be used to scroll the console buffer.

January 30, 2009  (Changes by Graf Zahl)
- Added Blzut3's statusbar maintenance patch.

January 29, 2009  (Changes by Graf Zahl)
- fixed sound origin of the Mage Wand's missile.

January 28, 2009  (Changes by Graf Zahl)
- Added APROP_Dropped actor property.
- Fixed: The compatmode CVAR needs CVAR_NOINITCALL so that the compatibility
	flags don't get reset each start.
- Fixed: compatmode Doom(strict) was missing COMPAT_CROSSDROPOFF

January 27, 2009
- More GCC warning removal, the most egregious of which was the security
	vulnerability "format not a string literal and no format arguments".
- Changed the CMake script to search for fmod libraries by full name instead
	of assuming a symbolic link has been placed for the latest version. It can
	also find a non-installed copy of FMOD if it is placed local to the ZDoom
	source tree.

January 26, 2009
- Fixed: Some OPL state needs to be restored before calculating rhythm. Also,
	since only the rhythm section uses the RNG, it doesn't need to be advanced
	for the normal voice processing.

January 25, 2009  (Changes by Graf Zahl)
- fixed some issues with P_FindFloorCeiling's coordinate processing.
- added a new compatmode CVAR which allows setting some generic compatibility
	flag combinations:
	Doom: sets the options needed to make most Doom.exe compatible map play without
	errors.
	Doom (strict): Same as above but sets a few more options. Please note that this
	does not mean full Doom.exe behavior emulation.
	Boom: Sets all options that consider differences between ZDoom and Boom.
	ZDoom 2.0.63: Sets only the COMPATF_SOUNDTARGET option which is needed for
	many older ZDoom maps.
- added new COMPAT_CROSSDROPOFF option to block monsters from being pushed over
	dropoffs by damage kickback.
- fixed: AFastProjectile::Tick must call Effect only 8 times per tic, regardless
	of the amount of steps taken.
- fixed: momentum checks in AFastProjectile did not use absolute values.

January 24, 2009
- Restored the rhythm section to fmopl.cpp and made some slight updates from
	version 0.72 of MAME's fmopl.c. Also refactored CalcVoice so that the
	original MAME structure is more visible.
- Removed the SoundChans bitfield from AActor, since it seems there are race
	conditions I don't fully understand where it simply doesn't work.
- Removed BaseTime initialization from sdl/i_system.cpp as per Chris's
	recommendation.

January 24, 2009  (Changes by Graf Zahl)
- Fixed: The sight checking code didn't initialize the myseethrough variable.
- Fixed: With COMPAT_TRACE switched on linedef actions on lines having
	the same sector on both sides were not triggered.

January 23, 2009
- Set packet server as the default for four or more player games, and also the
	default for three player games where the other players are not in the same
	private IP range.

January 18, 2009  (Changes by Graf Zahl)
- Added a CopyInfo function to FTexture that contains all code required to
	clone a texture. Used for creating warping textures.
- Fixed: P_FindFloorCeiling should not be called before setting the actor's z-
	coordinate. For testing 3D Midtex lines and 3D floors the proper position
	needs to be set first.
- Fixed the autoaim fix from Jan 10.

January 11, 2009  (Changes by Graf Zahl)
- Added option to specify the amount of ammo to be given by a WeaponGiver.

January 10, 2009  (Changes by Graf Zahl)
- fixed: Identification of Doom1 Freedoom IWAD did not work.
- fixed: UDMF did not initialize a sector's light colors.
- fixed implementation of DF2_NOAUTOAIM flag.

January 7, 2009  (Changes by Graf Zahl)
- copied some 3D floor fixes from GZDoom.
- fixed: Crushing polyobject did incomplete checks for blocked moves.

January 5, 2009  (Changes by Graf Zahl)
- fixed: Parsing of color strings with 6 characters and spaces did not work.
- fixed: State labels must be evaluated for the state's owner, not the calling actor.

January 4, 2009  (Changes by Graf Zahl)
- Fixed: For map spawns any change to an actor's floor z-coordinate must be
	delayed until after its z-coordinate has been set. That means that for
	map spawns AActor::StaticSpawn may not call P_FindFloorCeiling for such
	actors.
- added GZDoom's 3D floor physics code. This is not active yet so anything
	compiled from this code won't have any support for it!
- Used new functionality to avoid moving the puff around in SpawnDeepSplash.
- Fixed: P_RailAttack used the shooting actor or a default puff for some splash
	related actions. It should use the puff type passed to it as a parameter instead.
- Changed splash handling in P_LineAttack to use the actual hit position to
	spawn the splash and not the puff's spawn position which is offset a little.
- made some precision related changes to P_HitWater. The precise hit coordinate
	can now be passed as parameters.

January 3, 2009  (Changes by Graf Zahl)
- Made spawning of floor- and ceiling huggers a little more intelligent.
- Fixed: 'None' was no longer recognized as a NULL class name by the
	DECORATE parser.

January 1, 2009  (Changes by Graf Zahl)
- Added 'ininventory item, amount' option to SBARINFO to check for a minimum
	amount instead of mere presence in the inventory.
- Fixed: Door lock messages were overwritten by remote messages.

January 1, 2009  (Changes by Graf Zahl)
- Fixed: SBARINFO used GetSpecies instead of GetClass to check weapon types.
- Added a few missing NULL pointer checks to SBARINFO code.
- Changed pickup sounds of local player to unpaused to resolve problems with
	the time freezer and make them behave better.
- Fixed: When sounds are paused not all newly started sounds should actually
	be played.
- Fixed: SBARINFO had no means to check if a weapon uses any ammo at all and
	as a result the inventory icon was misplaced if a no-ammo weapon was selected.

December 31, 2008  (Changes by Graf Zahl)
- Fixed: P_CheckMissileSpawn and AFastProjectile didn't adjust their
	calculations for missiles with small radii.
- Added a new aiming mode to A_CustomRailgun to aim directly at the target
	from the actual point the shot originates from.
- Added a constant name for Skulltag's 128 flag for A_SpawnItemEx. For
	compatibility ZDoom needs to define this name, too, even though it doesn't
	use it.
- Fixed: The nodebuilder could hang on badly set up polyobjects. Now it aborts
	when the loop iterates NumberOfSegs times.

December 30, 2008  (Changes by Graf Zahl)
- Fixed: FMOD calls for setting the water reverb must check the return code
	for errors.
- Fixed: Hexen's dual attack weapons must check distance to targets in 3D,
	not 2D.
- Made several DECORATE errors which do not involve parsing non-fatal.
- Added a static error counter to FScriptPosition class.
- Changed initialization of actor class type properties: fuglyname is gone as
	is the postprocessing in FinishThingdef. Instead an empty placeholder class
	is now created when a class is first referenced and this placeholder is later
	filled in.
- Added option to replace backslash with '^' in state frame definitions because
	the backslash is just causing too many problems because it's also an escape
	character.

December 28, 2008  (Changes by Graf Zahl)
- Added Karate Chris's new DMFlags submission.

December 27, 2008  (Changes by Graf Zahl)
- Fixed: The correct player class was not remembered when the menu had both
	a player class selection menu and an episode menu.
- Fixed: AddToConsole could write outside its working buffer.
- Fixed: 0 was no longer recognized as placeholder for 'no state' in A_Chase.
- Fixed: When picking up weapons the code did not check if it should switch away
	from weak weapons.

December 20, 2008
- OggMod improperly decodes the right channel of stereo samples when sending
	them to OggEnc, so I have no choice but to convert them to mono by chopping
	off the right channel and only using the left channel information.

December 19, 2008
- Fixed: OggMod passes the raw sample data to OggEnc for stereo samples, so
	the resultant Vorbis stream is not actually stereo but mono with the right
	channel after the left. The two need to be interleaved just like
	uncompressed samples are.
- Removed the pattern length limit in the XM reader.

December 18, 2008
- Decal changes as per Xaser's suggestions: Smaller decal for PhoenixFX2,
	CrossbowFX2 and MaceFX4 were missing decals, and HornRodFX2 gets a whole
	new decal.
- Fixed: bfgscrc2.png had some holes in the middle that did not look so good.
	(From previously being handled through WinTex, maybe?)

December 17, 2008
- Fixed: Thing_ProjectileIntercept broke slightly when converted to the new
	vector math routines (almost two years ago!) because the original code
	multiplied down columns of the rotation matrix, but the new code multiplies
	across rows of the matrix instead. This is remedied by flipping the matrix
	across the x=y axis by reversing the sign of the sine value passed to the
	matrix constructor.

December 15, 2008
- Fixed: Autoloading a game (e.g. respawning after dying in single player)
	during demo playback prematurely ended demo control of the player.
- Fixed: Loading a multiplayer save with only one player crashed.
- Changed the co-op intermission screen to draw the stats with the small font.
- Added Karate Chris's patch to optionally specify an angle offset for
	summoning.
- Added Karate Chris's fix for Serpent Staff vampirism on teammates.
- Locks and teleporters now take precedence over one-sidedness for automap
	coloring.
- Increased maximum number of per-pattern rows for the XM loader from
	256 to 1024 to deal with a module that otherwise would not load.
- Removed the artificial restriction on not supporting Vorbis-compressed
	samples in XMs if they are stereo, since it turns out that OggMod does
	support them.

December 12, 2008  (Changes by Graf Zahl)
- Added a SECF_NORESPAWN flag for sectors that prevents players from being respawned
	in such a sector. As a workaround for current map formats a new actor
	(DoomEdNum 9041) was added that can set the extended sector flags without the
	use of ACS and sector tags. The new flag can also be set with Sector_ChangeFlags.
- Fixed: Players ignored MF2_TELESTOMP and always telefragged what was in the way.
- Fixed: Actors with MF5_NOINTERACTION were not affected by the time freezer.

December 7, 2008  (Changes by Graf Zahl)
- Added a strbin1 function that does the same as strbin but creates a copy
	instead of overwriting the original string. ACS performing this operation
	in place caused crashes with RTC-3057.
- fixed: FScriptPosition::Message did not print the message if it was not
	a fatal error.
- Fixed: The save percentage for Doom's green armor was slightly too low
	which caused roundoff errors that made it less than 1/3 effective.
- Added support for "RRGGBB" strings to V_GetColor.
- Fixed: Desaturation maps for the TEXTURES lump were calculated incorrectly.
- Changed GetSpriteIndex to cache the last used sprite name so that the code
	using this function doesn't have to do it itself.
- Moved some more code for the state parser into p_states.cpp.
- Fixed: TDeletingArray should not try to delete NULL pointers.

December 6, 2008
- Added binary (b) and hexadecimal (x) cast types for ACS's various print
	statements.
- Added ClassifyActor(tid) ACS builtin function. This takes a TID and returns
	a set of bits describing the actor. If TID is 0, it returns information
	about the activator. If there is more than one actor with the given TID,
	only the first one is considered. Currently defined bits are:
		ACTOR_NONE         No actors with this TID exist (only when TID is not 0).
		ACTOR_WORLD        Activator is the world (only when TID is 0).
		ACTOR_PLAYER       Actor is a player (includes bots and voodoo dolls).
		ACTOR_BOT          Actor is a bot.
		ACTOR_VOODOODOLL   Actor is a voodoo doll.
		ACTOR_MONSTER      Actor is a monster.
		ACTOR_ALIVE        Actor is alive (players/monsters only).
		ACTOR_DEAD         Actor is dead (players/monsters only).
		ACTOR_MISSILE      Actor is a missile.
		ACTOR_GENERIC      Actor exists, but no further information is available.
- Moved ExpandEnvVars() from d_main.cpp to cmdlib.cpp.
- AutoExec paths now support the same variable expansion as the search paths.
	Additionally, on Windows, the default autoexec path is now relative to
	$PROGDIR, rather than using a fixed path to the executable's current
	directory.
- All usable Autoload and AutoExec sections are now created at the top of
	the config file along with some brief explanatory notes so they are
	readily visible to anyone who wants to edit them.

December 6, 2008  (Changes by Graf Zahl)
- Fixed: G_DoPlayDemo did not free the demobuffer or the CVAR backups when it
	failed to start the demo.

December 2, 2008  (Changes by Graf Zahl)
- Added a MF5_BRIGHT flag to always render an actor fullbright.
- Fixed: Calling Door_Animated with a non-zero tag created a new thinker
	for each two-sided line of the sector.

December 1, 2008  (Changes by Graf Zahl)
- Added Karate Chris's submission for making 'spray' a cheat.
- Added CO2's default parameter additions for several Doom code pointers
	submission.
- Added CO2's A_RemoveMaster/A_RemoveChildren submission.
- Added Blzut3's SBARINFO replacement for the Doom statusbar.
- Fixed: SBarInfo still displayed the wrong bar for height 0
- Added A_KillSiblings and A_DamageSiblings code pointers.
- added MaxAbsorb and MaxFullAbsorb properties for Armor.

December 1, 2008
- Restored the multiplayer scoreboard's former centering so that it doesn't
	look awful on widescreen intermissions. Also changed the column widths to
	be font-dependant rather than fixed proportions of the screen width.
- Fixed horizontal positioning of 'finished' on the Raven games when scaled.

November 30, 2008  (Changes by Graf Zahl)
- Fixed: 'finished' wasn't drawn on the intermission because the space
	check compared scaled with unscaled coordinates.
- Changed: Textures without a name no longer get added to the texture manager's
	hash chains.
- Fixed: specifying texture patches or font characters by full lump name instead
	of texture name didn't work. To do this properly the texture manager needs
	an option to look for a texture by lump number so that such textures can
	be maintained without interfering with regular operation.
- added 'skystretch' and 'autosequences' keywords for MAPINFO so that the effects
	of 'noautosequences' and 'forcenoskystretch' can be cancelled.
- Added a 'gamedefaults' section to MAPINFO after discovering that 'defaultmap'
	gets reset for each MAPINFO. A global section is needed to define a game's
	default setting in zdoom.pk3. The gamedefaults should normally not be changed
	by PWADs but it can be done if some mod intends to change gameplay settings
	but wants to allow custom add-ons on its own.

November 29, 2008
- Fixed alignment of "finished" line in WI_drawLF() when the level name is a
	graphic and scaled.
- It is now possible to replace the game's SmallFont with a single lump font
	called SMALLFNT.
- Reduced the width of the second column in wi_percents false mode from 3 to
	2 characters.
- Added a WISLASH graphic for Doom's intermission screen when wi_percents is
	false.

November 29, 2008 (sbarinfo update)
- Added: inventorybarnotvisible to check to see if the inventory bar is up.
- Added the following flags to drawselectedinventory center, centerbottom, and
	drawshadow.
- Fixed: The translucent flag for drawinventorybar should only have affected
	the artibox image.

November 27, 2008
- Removed S_MarkSoundChannels(), as it caused all non-actor sounds to
	have their origins zeroed during collections.
- WI_drawLF() now draws the level name at the top of the screen, always.
- Fixed: disabling lowerHealthCap didn't affect interpolateHealth.
- The co-op summary screen now has a totals row at the bottom (if it fits).
- Changed WI_drawPercent() when wi_percents is false so that the total
	display is optional, and it formats it like Heretic's intermission, with
	a slash and a fixed-width right column.

November 21, 2008
- Font is no longer a property of the screen object. Pass the font to
	DrawText and DrawChar directly instead.
- Doom's intermission characters are now collected together as a font
	so they can be colorized.

November 18, 2008  (Changes by Graf Zahl)
- Fixed: compatf_limitpain must check for 21 Lost Souls, not 20.

November 15, 2008  (Changes by Graf Zahl)
- Moved common code of Raven's fast projectiles into a base class
	called FastProjectile. This base class doesn't have any effects attached
	so that it can be used for user defined fast projectiles.

November 14, 2008
- Removed GC barriers from the sound channels. If we must, we can always
	do it the old way and scan every channel to see if it matches an actor/
	entchannel pair.
- Fixed: S_RelinkSounds() did not move the SoundChans bitfield to the new
	actor.
- Fixed: Stolen channels could be kept around by the high-level channels
	indefinitely.
- Fixed: AMageStaffFX2::IsOkayToAttack() / A_MStaffAttack aimed at friendlies.
- Added kill count awareness to A_ChangeFlag.
- P_NightmareRespawn() now clears the MTF_AMBUSH flag, so respawned monsters
	aren't dormant (since there would be no way to activate them, and they
	were certainly not dormant when they died).

November 8, 2008
- Made sdl/i_system.cpp:I_GetTimePolled() functionally equivalent to the
	Win32 version.
- Updated fmod_wrap.h and fmodsound.cpp for FMOD 4.20.
- GCC warning removal.

November 2, 2008  (Changes by Graf Zahl)
- Fixed: The TEXTURES parser didn't report an error for invalid keywords.
- Fixed: The DECORATE expression evaluator was too strict with missing jump labels.
	For compatibility it only may print a warning, not an error.

October 29, 2008  (Changes by Graf Zahl)
- Fixed: FxClassTypeCast::Resolve didn't work for NULL classes because a variable
	was not initialized.

October 28, 2008  (Changes by Graf Zahl)
- Fixed: The railgun attack functions still read their puff parameters as names
	even though they are now passed as class pointers.
- Fixed: The state parser counted one parameter too many for a varargs function.
- Fixed: FStateExpressions could copy unresolved default parameter expressions.
	When these were resolved and changed later all copied pointers pointed to
	invalid data.

October 26, 2008  (Changes by Graf Zahl)
- Added read and write barriers to the actor pointer in the sound channel
	structure.
- Fixed: Items which should stay but had an IF_ALWAYSPICKUP flag were removed.
- Fixed: The pickup flash must only play when an item is picked up so the
	correct place to spawn it is in AInventory::Touch, not in AInventory::GoAway.
- Fixed: A_Jump didn't properly determine a state's owner anymore when called
	from weapons.

October 25, 2008  (Changes by Graf Zahl)
- Added NULL checks to all places where class names are passed as DECORATE
	parameters.
- All DECORATE parameters are passed as expressions now. This change allows
	for compile time checks of all class names being used in DECORATE so many
	incorrect definitions may output warnings now.

October 23, 2008  (Changes by Graf Zahl)
- Changed: S_StopChannel now resets the actor's sound flags. The previous bug
	made me think that delaying this until FMod calls the end of sound callback
	may simply be too late.
- Fixed: The high level sound code must not rely on FMod immediately returning
	the sound channel data when a sound is being stopped. This caused
	an endless loop when changing levels with Strife's Flamethrower active.

October 22, 2008  (Changes by Graf Zahl)
- Changed DECORATE sound and color parameters to use expressions.

October 21, 2008  (Changes by Graf Zahl)
- Added a proper function parser to the expression evaluator and converted
	sin/cos and action specials to use it. The old evaluator is gone now.
- fixed some GCC problems with autosegs.

October 20, 2008
- Game time is now frozen during screen wipes. This obsoletes the DEM_WIPEON
	and DEM_WIPEOFF commands. Fixes multimap demos desyncing when played back
	or recorded with wipes enabled, and prevents multiplayer games from
	starting until all players' wipes have finished.

October 19, 2008  (Changes by Graf Zahl)
- Added native variables to expression evaluator and replaced the previous
	handling of actor variables in expressions with it.
- Added support for floating point constants to DECORATE expression evaluator.

October 18, 2008
- Rewrote the SeePastShootableLines check in P_SightCheckLine() to be
	more readable.
- Commented out the MugShot state nulling in DSBarInfo::AttachToPlayer() so
	that fiddling with player options does not reset the mug shot.
- Fixed: SetMugShotState ACS command did not pop the stack.

October 18, 2008  (Changes by Graf Zahl)
- Added a global symbol table and changed DECORATE parser to put its global
	symbols there instead of into AActor.
- Changed the expression evaluator's floating point precision to double.
- Started rewriting the DECORATE expression evaluator to allow more flexibility.
	All the operators use the new functionality but functions, variables and
	constants are yet to be redone.
	While doing this rewrite I noticed that random2 was always evaluated as const.
	This got fixed automatically.

October 13, 2008
- This may or may not be a problem, but GCC warned that FStateDefinitions::
	AddStateDefines() does not initialize def.FStateDefine::DefineFlags, so
	I fixed that.
- Fixed: The three-argument version of AActor::FindState() initialized a
	two-entry array for passing to the main FindState() routine, but did
	not actually pass it, passing the original primary label instead.
- Fixed: SDL builds did not shutdown the sound system at exit.
- Fixed: ThingCountSector and ThingCountNameSector did not remove enough
	entries from the stack, and did not put the result in the right slot.
- Fixed: Teleport lines were prioritized over secret lines when deciding what
	color to draw them on the automap.
- Fixed: Death-reverting morphs did not remove the morph item from the
	player's inventory when death caused the morph to revert.
- Updated fmod_wrap.h for FMOD Ex 4.18.

October 10, 2008  (Changes by Graf Zahl)
- Fixed: The TEXTURES parser could copy beyond the end of a string when parsing
	a 'define' definition.

October 7, 2008  (Changes by Graf Zahl)
- Fixed: Cheats in demos must not access the weapon slots.
- Fixed: S_ChannelEnded didn't check for a NULL SfxInfo.
- Fixed: R_InitTables did a typecast to angle_t instead of fixed_t.

October 6, 2008  (Changes by Graf Zahl)
- Fixed: PowerProtection and PowerDamage applied their defaults incorrectly.
- Fixed: The damage type property didn't properly read its factor.

October 5, 2008  (Changes by Graf Zahl)
- Finally has the right idea how to restore Doom's original clipping of projectiles
	against decorations without breaking anything newer:
	Added a new 'projectilepassheight' property that defines an alternative height
	that is only used when checking a projectile's movement against this actor.
	If the value is positive it is used regardless of other settings, if it is
	negative, its absolute will be used if a new compatibility option is enabled
	and if it is 0 the normal height will be used.
- Fixed: Powerup.Color's handler contained an unnecessary 'else' which resulted
	in opaque powerup blends.

October 4, 2008  (Changes by Graf Zahl)
- Fixed: Resurrecting a player didn't unset the RF_INVISIBLE flag which is
	set when the player is crushed to gibs under a door.

September 28, 2008  (Changes by Graf Zahl)
- Fixed: Dropitem gave incorrect amounts to the item if a probability was set.

September 27, 2008  (Changes by Graf Zahl)
- Fixed: weapon.ammogive2 always gave 2 amounts of ammo.
- Fixed: The translation string parser printed a broken error message.

September 24, 2008  (Changes by Graf Zahl)
- Fixed: player.colorrange didn't read the parameters correctly.
- Reverted an 'optimization' in d_dehacked.cpp that didn't work.

September 23, 2008  (Changes by Graf Zahl)
- Fixed: Old style decorations forgot all inherited states when installing
	their labels.

September 22, 2008  (Changes by Graf Zahl)
- Used the one unused byte in the state structure as a flag to tell what type
	the NextState parameter is. The code did some rather unsafe checks with it
	to determine its type.
- moved all state related code into a new file: p_states.cpp.
- merged all FindState functions. All the different variations are now inlined
	and call the same function to do the real work.

September 21, 2008  (Changes by Graf Zahl)
- did some code cleanup and reorganization in thingdef.cpp.
- Replaced the translation parser for TEXTURES with FRemapTable::AddToTranslation.
- To get the game name the screenshot code might as well use the globally
	available GameNames array instead of creating its own list.
- Moved backpack names for cheat into gameinfo.
- Fixed: SNDINFO must be loaded before the textures. However, this required
	some changes to the MAPINFO parser which tried to access the texture manager
	to check if the level name patches exist. That check had to be moved to
	where the intermission screen is set up.
- Fixed: 'bloodcolor' ignored the first parameter value when given a list
	of integers.
	Please note that this creates an incompatibility between old and new
	versions so if you want to create something that works with both 2.2.0
	and current versions better use the string format version for the color
	parameter!
- Rewrote the DECORATE property parser so that the parser is completely
	separated from the property handlers. This should allow reuse of all
	the handler code for a new format if Doomscript requires one.
- Fixed: PClass::InitializeActorInfo copied too many bytes if a subclass's
	defaults were larger than the parent's.
- Moved A_ChangeFlag to thingdef_codeptr.cpp.
- Moved translation related code from thingdef_properties.cpp to r_translate.cpp
	and rewrote the translation parser to use FScanner instead of strtol.
- replaced DECORATE's 'alpha default' by 'defaultalpha' for consistency.
	Since this was never used outside zdoom.pk3 it's not critical.
- Removed support for game specific pickup messages because the only thing
	this was ever used for - Raven's invulnerability item - has already been
	split up into a Heretic and Hexen version.

September 20, 2008
- Fixed: The Timidity config parser always tried to process the note number,
	even if it wasn't specified.

September 19, 2008
- Fixed: When UpdateJoystickMenu() modifies the menu items for different
	controllers, the joystick axis selectors need to NULL the d.graycheck
	field, since this is shared by the axis sensitivity sliders' step values.

September 19, 2008  (Changes by Graf Zahl)
- Fixed: The crosshair must be initialized after the texture manager because
	on the fly texture creation for graphics patches is no longer supported.
- Fixed a few Linux compile errors.

September 16, 2008  (Changes by Graf Zahl)
- Changed: Replaced weapons should not be given by generic cheats, only
	when explicitly giving them.
- Changed 'give weapon' cheat so that in single player it only gives weapons
	belonging to the current game or are placed in a weapon slot to avoid
	giving the Chex Quest weapons in Doom and vice versa.
- Fixed: The texture manager must be the first thing to be initialized
	because MAPINFO and DECORATE both can reference textures and letting them
	create their own textures is not safe.

September 15, 2008  (Changes by Graf Zahl)
- Separated low level sound code from all high level dependencies.
- Separated low level sound channel class from high level class which now
	is just a subclass of the low level class.
- Moved some more high level sound logic out of FMODSoundRenderer:
	The rolloff and channel ended callbacks now call functions in s_sound.cpp
	instead of working on the data itself and GSnd->StopSound has been replaced
	with S_StopChannel.
- Changed compilation for g_doom, g_heretic, g_hexen and g_strife folders so
	that all files are included by a central one instead of compiling each one
	separately. This speeds up the compilation process by 25% when doing a
	complete rebuild in Visual C.

September 14, 2008  (Changes by Graf Zahl)
- Cleaned up some include dependencies.
- fixed: For Chex Quest some CVars were initialized to Heretic's default.
- fixed pickup message for LargeZorchPack.

September 13, 2008  (Changes by Graf Zahl)
- Moved IF_ALWAYSPICKUP and GiveQuest into CallTryPickup so that they are
	automatically used by all inventory classes.
- The previous change made it necessary to replace all TryPickup calls with
	another function that just calls TryPickup.
- Fixed: AInventory::TryPickup can change the toucher so this must be reported
	to subclasses calling the super function. Changed TryPickup to pass the
	toucher pointer by reference.
- Prefixed all names of CQ decorations with Chex after seeing some conflicts
	with PWADs.
- Removed Chex Quest actors that were just unaltered duplicates of Doom's.
- Added detection for Chex Quest 3 IWAD.
- Cleaned up M_QuitGame because the code was almost incomprehensible and I
	wanted to add CQ3's new quit messages.
- Added Chex Quest obituaries and a few other messages from CQ3.
- Fixed: drawbar improperly clipped images when not in the top left quadrant.
- Fixed: Crouching no longer worked due to a bug introduced by the
	player input code.

September 12, 2008
- Added GetPlayerInput() for examining a player's inputs from ACS. Most
	buttons are now passed across the network, and there are four new user
	buttons specifically for use with this command. Also defined +zoom
	and +reload for future implementation.

September 11, 2008
- Fixed: Hexen's fourth weapon pieces did not play the correct pickup sound,
	and when they were fully assembled, they did not play the sound across the
	entire level.
- Antialiasing of lines is now controlled solely by the vid_hwaalines cvar,
	ignoring what the driver reports, since ATI is apparently just as bad as
	NVidia.

September 9, 2008
- Added a check for D3DLINECAPS_ANTIALIAS, but this is complicated by the
	fact that NVidia's don't report it, even though they support it. If there
	are any cards that no longer have antialised lines on the automap, please
	let me know.
- Added vid_hwaalines cvar to force antialiased lines off for the
	Direct3D renderer, in case it doesn't really support them.

September 9, 2008  (Changes by Graf Zahl)
- Fixed: The new rolloff values being stored in FSoundChan need to be serialized
	for savegames.
- Since loading of the sound lump is now done in S_LoadSound I added an IsNull
	method to the SoundRenderer class so that this function doesn't need to
	load the sound for the NullSoundRenderer.
- Took some more non-FMOD related code out of fmodsound.cpp, including the
	code that checks for raw and Doom sounds. This means that sfxinfo_t is no
	longer needed in the SoundRenderer class so I took out all references to it.
- Fixed: FMODSoundRenderer::StartSound3D must set the static variable pointing
	to the rolloff information back to NULL when starting the sound fails.
- Fixed: Rolloff information was taken from the sfxinfo that contained the
	actual sound data, not the one that was used for starting the sound.

September 7, 2008  (Changes by Graf Zahl)
- Fixed: Chex Quest's Super Bootspork was missing the pickup message.
- Added missing Strife automap colors for items and non-monsters.
- Fixed: GetMSLength didn't resolve random and player sounds.
- Moved sound aliasing code out of fmodsound.cpp into S_LoadSound.

September 6, 2008  (Changes by Graf Zahl)
- Fixed: The tagged version of TranslucentLine took the information for additive
	translucency from the tagged linedef, not the control linedef.
- Added check for additive translucency to TRANMAP checking.
- Changed listener structure to directly contain the sound environment instead
	of getting it from the zone in the low level code.
- Changed sound interface so that all references to game data like actors
	and sectors are done in s_sound.cpp and not in fmodsound.cpp. Also removed
	several 'sector' parameters because they were never used inside the sound code.

September 5, 2008
- Added the "extended" keyword for episode definitions to define episodes
	that are only available in the extended version of Heretic.
- Added hexendemo.wad and hexdemo.wad as aliases for the demo Hexen IWAD.
- Added IWAD checks for freedoom1.wad and freedm.wad.
- The garbage collector now has an opportunity to step each time individual
	thinkers tick, not just once every game tick. This more closely follows
	the original Lua behavior. This change was made because, in cases of
	extremely large and frequent memory allocations, the collector may not run
	fast enough if it only has a chance to execute once per tick.

September 4, 2008
- Fixed: The "same level" dmflag did not work.
- Changed the nextlevel global var to an FString.
- Implemented some more controllers for the OPL player:
	* RPN select (controllers 100 and 101)
	*  RPN 0 (pitch bend sensitivity)
	* NPRN select (controllers 98 and 99)
	* Data entry (controllers 6 and 38)
	* All notes off (controller 123)
	* All sounds off (controller 120)
	* Reset controllers (controller 121)
- Added pixel doubling and quadrupling for fullscreen DirectDraw modes.
	The command line options -2 and -4 can be used to force them.

September 4, 2008  (Changes by Graf Zahl)
- Fixed: Red blood particles used too dark colors.
- Fixed: The smoothlighting code in side_t::GetLightLevel relied on
	the global 'linedef' variable for automatic fake contrast although
	this issue had already been fixed for the original code here.
- Replaced static string buffers with FString in FONTDEFS parser.

September 1, 2008  (Changes by Graf Zahl)
- Added an 'allcheats' CVAR. This will enable all cheats from all
	supported games in any game being played.
- Changed Chex Quest DoomEdNum initilization so that all empty slots
	are filled with Doom actors if they exist.
- Added missing spawn filters to Chex Quest items.
- Gave the PlayerPawn base class a default damage fade color instead of
	hacking it into the actor when actually used.
- Fixed: The DamageFade color was not saved in savegames.

August 30, 2008  (Changes by Graf Zahl)
- Added Blzut3's patch for a real Chex Quest game mode.

August 29, 2008  (Changes by Graf Zahl)
- Fixed: SKIP_SUPER doesn't work for inventory items so it must be
	disabled for them
- Fixed: Chex Quest doesn't have a HELP2 screen so it must not be used
	in the gameinfo.
- Fixed: Default blood color is no longer red so P_DrawSplash2 must
	get it from the gameinfo instead.
- Added new French language texts by DoomKn1ght_.

August 26, 2008  (Changes by Graf Zahl)
- Blood default color is set in the gameinfo now so that Chex Quest
	can default to green instead of red.
- Fixed: The version of CheckNumForFullName that checks for a specific
	WAD did not work.
- Moved MAPINFO names into gameinfo structure.
- Added Chex Quest support. Credits go to fraggle for creating a
	Dehacked patch that does most of the work. The rest includes a new
	MAPINFO and removal of the drop items from the monsters being used.

August 23, 2008
- Added Win64 support to the crash report generator. (Pity that Win32
	cannot be as informative.)

August 22, 2008  (Changes by Graf Zahl)
- Added and fixed Boss death submission for random spawner.
- Added functions to FActorInfo that can set the damage factors and
	pain chances to reduce the chance of new errors when working with
	these features.
- Fixed: The handling of the deprecated FIRERESIST flag didn't work.
	There were 3 problems:
	* Actor defaults have no class information so HandleDeprecatedFlags
		needs to be passed a pointer to the ActorInfo.
	* The DamageFactors list is only created when needed so the code needs to
		check if it already exists.
	* damage factors are stored as fixed_t but this set a float.

August 22, 2008
- Fixed: Timidity::Renderer::reset_voices() must completely zero the
	voices. Because this wasn't done, note_on() could try to access
	the sample for a voice that had never been played yet and access
	random memory. There may be other places where it's a problem, but
	this is where I noticed it, by chance.

August 21, 2008  (Changes by Graf Zahl)
- Added a traditional Strife color set for the automap.

August 21, 2008  (Changes by Graf Zahl)
- Fixed: The conversion of the strings in wbstartstruct_t to FStrings
	caused crashes when reloading the hub data.
- Replaced WALLF_AUTOCONTRAST with WALLF_NOFAKECONTRAST so that the
	default setting for the flags is 0.
- Added: doom2day's smoothlighting
- Added: dontincrement argument to A_CheckForReload.
- Fixed: The UDMF parser wrote class filter bits into SkillFilter.
- Fixed: (SBARINFO patch) DrawInventoryBar has a missing argument in
	one of its drawgraphic calls.

August 20, 2008 (Changes by Graf Zahl)
- Added Gez's patch for Heretic's GIMME cheat.
- Externalized some cheat strings.

August 19, 2008 (Changes by Graf Zahl)
- Added Gez's patch for removing MF4_FIRERESIST.

August 18, 2008 (SBARINFO patch)
- Fixed: DrawBar would not show.
- Fixed: IsSelected took string constants instead of identifiers.

August 16, 2008 (Changes by Graf Zahl)
- Put more floor/ceiling properties in sector_t into a substructure and
	added wrapper functions.
- Fixed: A_Explode wants the distance parameter as an int, not a fixed_t.
- some minor DECORATE fixes.

August 14, 2008 (Changes by Graf Zahl)
- Fixed: The count parameter of A_Jump is a constant, not an expression.
- Fixed: A_Jump used a wrong index into the jump address table.
- Fixed: The recent changes in the DECORATE parser require the special parameter
	to A_CallSpecial to be an expression, not a constant.
- Removed game filters from old style decorations. No WAD in existence ever
	used them and removing them allows to make the parser more robust.
- Added a few more macros so that the action function code doesn't have
	to reference its arguments directly, except 'self'. This may be helpful if it
	becomes necessary to restructure this code once DoomScript becomes real.
- Removed the last remaining global variable related to action functions:
	pStateCall. Everything is passed properly as function arguments now.
- fixed: PlayerChunk was missing the NOSKIN flag.

August 13, 2008 (Changes by Graf Zahl)
- Macro-fied access to action function parameters.
- Deactivated debug output code in d_Dehacked.cpp.
- fixed: A_FreezeDeathChunks crashed when a player's head got spawned.
- fixed: A_CallSpecial must be declared in DECORATE so that a symbol table
	entry can be generated for it.
- fixed: Dehacked replaced pickups multiple times for changing its states.
- fixed: Dehacked must copy AInventory's state to any item it hacks to be a
	pickup.
- fixed a few more DECORATE bugs.

August 12, 2008 (Changes by Graf Zahl)
- Fixed: The chat sound for Strife was misnamed in the gameinfo structure.
- fixed a few DECORATE bugs.
- Changed the action function declaration parser so that optional parameters
	can be given a default value. The 'optional' keyword is no longer needed
	and was removed, as well as 'evalnot'.
- Restructured the action function interface to remove the dependence on
	the global CallingState variable.
- Changed handling of AUTOPAGE texture so that it is properly inserted into
	the texture manager even if it is from Raven's IWADs.
- Removed code related to internal ActorInfo definitions from dobjtype.cpp.
- removed unneeded file dehackedactions.h

August 11, 2008
- Ported asm_x86_64/tmap3.nas to AT&T syntax so it can be compiled with gas.
	After finding out that gas does have directives to describe the .eh_frame
	metadata, I figured that would be significantly easier and quicker than
	trying to locate all the scattered docs needed to construct it by hand.
	Unfortunately, this now means I have to maintain two versions of exactly
	the same code. :(

August 11, 2008 (Changes by Graf Zahl)
- Removed 'eval' modifier from DECORATE. All int, float and bool parameters are
	'eval' now by default.
- Did a thorough check of all DECORATE conversions and fixed the errors I found.

August 10, 2008 (Changes by Graf Zahl)
- Macro-fied all access to action functions.
- Changed action function definition so that they have to be defined with a
	DEFINE_ACTION_FUNCTION macro. This should make it easier to improve the
	whole system.
- Removed DECORATE's ParseClass because it was only used to add data to fully
	internal actor classes which no longer exist.
- Changed the state structure so that the Tics value doesn't need to be hacked
	into misc1 with SF_BIGTIC anymore.
- Changed sprite processing so that sprite names are converted to indices
	during parsing so that an additional postprocessing step is no longer needed.
- Fixed: Sprite names in DECORATE were case sensitive.
- Exported AActor's defaults to DECORATE and removed all code for the
	internal property parser which is no longer needed.
- Converted the Heresiarch to DECORATE.
- Added an Active and Inactive state for monsters.
- Made the speed a parameter to A_RaiseMobj and A_SinkMobj and deleted
	GetRaiseSpeed and GetSinkSpeed.
- Added some remaining DECORATE conversions for Hexen by Karate Chris.

August 10, 2008
- Changed Windows to use the performance counter instead of rdtsc.
- Changed Linux to use clock_gettime for profiling instead of rdtsc. This
	avoids potential erroneous results on multicore and variable speed
	processors.

August 9, 2008 (Changes by Graf Zahl)
- Converted the last of Hexen's inventory items to DECORATE so that I could
	export AInventory.
- Removed AT_GAME_SET because it's no longer used anywhere.
- Converted the last remaining global classes to DECORATE.
- Fixed: Inventory.PickupFlash requires an class name as parameter not an
	integer. Some Hexen definitions got it wrong.
- Converted Hexen's Pig to DECORATE.
- Replaced the ActorInfo definitions of all internal inventory classes with
	DECORATE definitions.
- Added option to specify a powerup's duration in second by using a negative
	number.

August 8, 2008
- Added Gez's Freedoom detection patch.
- SBARINFO update:
	* Added: The ability to have drawkeybar auto detect spacing.
	* Added: Offset parameter to drawkeybar to allow two key bars with
		different keys.
	* Added: Multi-row/column keybar parameters.  Spacing can also be auto.
		These  defualt to left to right/top to bottom but can be switched.
	* Added: Drawshadow flag to drawnumber.  This will draw a solid color and
		translucent number under the normal number.
	* Added: hexenarmor to drawimage.  This takes a parameter for a hexen
		armor type and will fade the image like the hexen status bar.
	* Added: centerbottom offset to draw(switchable)image.
	* Added: translucent flag to drawinventorybar.
	* Fixed: Accidentally removed flag from DrawTexture that allowed negative
		coordinates to work with fullscreenoffsets.  Hopefully this is the last
		major bug in the fullscreenoffsets system.
- Ported vlinetallasm4 to AMD64 assembly. Even with the increased number of
	registers AMD64 provides, this routine still needs to be written as self-
	modifying code for maximum performance. The additional registers do allow
	for further optimization over the x86 version by allowing all four pixels
	to be in flight at the same time. The end result is that AMD64 ASM is about
	2.18 times faster than AMD64 C and about 1.06 times faster than x86 ASM.
	(For further comparison, AMD64 C and x86 C are practically the same for
	this function.) Should I port any more assembly to AMD64, mvlineasm4 is the
	most likely candidate, but it's not used enough at this point to bother.
	Also, this may or may not work with Linux at the moment, since it doesn't
	have the eh_handler metadata. Win64 is easier, since I just need to
	structure the function prologue and epilogue properly and use some
	assembler directives/macros to automatically generate the metadata. And
	that brings up another point: You need YASM to assemble the AMD64 code,
	because NASM doesn't support the Win64 metadata directives.

August 8, 2008 (Changes by Graf Zahl)
- Replaced the ActorInfo definitions of several internal classes with DECORATE definitions
- Converted teleport fog and destinations to DECORATE.
- AActor::PreExplode is gone now that the last item that was using it has been converted.
- Converted the Sigil and the remaining things in a_strifeitems.cpp to DECORATE.
- Exported Point pushers, CustomSprite and AmbientSound to DECORATE.
- Changed increased lightning damage for Centaurs into a damage factor.
- Changed PoisonCloud and Lightning special treatment in P_DamageMobj to use damage
	types instead to keep dependencies on specific actor types out of the main engine code.
- Added Korax DECORATE conversion by Gez and a few others by Karate Chris.
- Removed FourthWeaponClass and based Hexen's fourth weapons on the generic weapon
	pieces.
- Added DECORATE conversions for Hexen's Fighter weapons by Karate Chris.
- Added aWeaponGiver class to generalize the standing AssaultGun.
- converted a_Strifeweapons.cpp to DECORATE, except for the Sigil.

August 7, 2008
- Added an SSE version of DoBlending. This is strictly C intrinsics.
	VC++ still throws around unneccessary register moves. GCC seems to be
	pretty close to optimal, requiring only about 2 cycles/color. They're
	both faster than my hand-written MMX routine, so I don't need to feel
	bad about not hand-optimizing this for x64 builds.
- Removed an extra instruction from DoBlending_MMX, transposed two
	instructions, and unrolled it once, shaving off about 80 cycles from the
	time required to blend 256 palette entries. Why? Because I tried writing
	a C version of the routine using compiler intrinsics and was appalled by
	all the extra movq's VC++ added to the code. GCC was better, but still
	generated extra instructions. I only wanted a C version because I can't
	use inline assembly with VC++'s x64 compiler, and x64 assembly is a bit
	of a pain. (It's a pain because Linux and Windows have different calling
	conventions, and you need to maintain extra metadata for functions.) So,
	the assembly version stays and the C version stays out.

August 7, 2008 (Changes by Graf Zahl)
- Converted the rest of a_strifestuff.cpp to DECORATE.
- Fixed: AStalker::CheckMeleeRange did not perform all checks of AActor::CheckMeleeRange.
	I replaced this virtual override with a new flag MF5_NOVERTICALMELEERANGE so that
	this feature can also be used by other actors.
- Converted Strife's Stalker to DECORATE.
- Converted ArtiTeleport to DECORATE.
- Removed the NoBlockingSet method from AActor because everything using it has been
	converted to DECORATE using DropItem instead.
- Changed: Macil doesn't need the StrifeHumanoid's special death states so he might
	as well inherit directly from AActor.
- Converted Strife's Coin, Oracle, Macil and StrifeHumanoid to DECORATE. Also moved
	the burning hand states to StrifePlayer where they really belong.
- Added Gez's dropammofactor submission with some necessary changes. Also merged
	redundant ammo multiplication code from P_DropItem and ADehackedPickup::TryPickup.
- Restricted native action function definitions to zdoom.pk3.
- Fixed. The Firedemon was missing a game filter.

August 7, 2008 (SBARINfO update)
- Added: disablegrin, disableouch, disablepain, and disablerampage flags to
	drawmugshot.
- Fixed: LowerHealthCap did not work properly.
- Fixed: Various bugs I noticed in the fullscreenoffsets code.

August 6, 2008
- Removed all the pixel doubling r_detail modes, since the one platform they
	were intended to assist (486) actually sees very little benefit from them.
- Rewrote CheckMMX in C and renamed it to CheckCPU.
- Fixed: CPUID function 0x80000005 is specified to return detailed L1 cache
	only for AMD processors, so we must not use it on other architectures, or
	we end up overwriting the L1 cache line size with 0 or some other number
	we don't actually understand.
- The x87 precision control is now explicitly set for double precision, since
	GCC defaults to extended precision instead, unlike Visual C++.

August 6, 2008 (Changes by Graf Zahl)
- Converted Strife's Programmer, Loremaster and Thingstoblowup to DECORATE.
- Fixed: Attacking a merchant in Strife didn't alert the enemies.
- Removed AT_GAME_SET(PowerInvulnerable) due to the problems it caused. The two
	occurences in the code that depended on it were changed accordingly.
	Invulnerability colormaps are now being set by the items exclusively.
- Changed many checks for the friendly Minotaur to a new flag MF5_SUMMONEDMONSTER
	so that it can hopefully be generalized to be usable elsewhere later.
- Added Gez's submission for converting the Minotaur to DECORATE.
- Fixed a few minor DECORATE bugs.
- Changed coordinate storage for EntityBoss so that it works properly even
	when the pod is not used to spawn it.
- Converted Strife's Spectres and Entity to DECORATE.

August 6, 2008 (SBARINfO update)
- Added: fullscreenoffsets flag for status bars.  This changes the coordinate
	system to be relative to the top left corner of the screen.  This is useful
	for full screen status bars.
- Changed: drawinventorybar will use the width of artibox or invcurs (strife)
	to determine the spacing.  Let me know if this breaks any released mods.
- Fixed: If a status bar height of 0 was specified in SBarInfo the wrong bar
	would be shown.
- Fixed: If a static inventory bar was used the user still had to press invuse
	in order to get rid of the "overlay".
- Fixed: forcescaled would not work if the height of the bar was 0.
- Added: keyslot to drawswitchableimage.
- Fixed: The transition effects for the log and keys popups were switched.

August 5, 2008 (Changes by Graf Zahl)
- Converted Strife's Crusader, Inquisitor and spectral missiles to
	DECORATE.
- Converted Strife's Acolytes, Rebels, Sentinel, Reaver and Templar to
	DECORATE.
- Added DECORATE conversions for Hexen's Cleric weapons by Karate Chris.
- Added a check to Zipdir that excludes files with a .orig extension. These
	can be left behind by patch.exe and create problems.
- fixed: Unmorphing from chicken caused a crash when reading non-existent
	meta-data strings.
- Converted the ScriptedMarines to DECORATE.
- Fixed: DLightTransfer and DWallLightTransfer were declared as actors.

August 3, 2008 (Changes by Graf Zahl)
- Converted the PhoenixRod and associated classes to DECORATE to make
	the Heretic conversion complete.
- Converted the Minotaur's projectiles to DECORATE so that I can get
	rid of the AT_SPEED_SET code.
- Converted Heretic's Blaster and SkullRod to DECORATE.
- Converted the mace and all related actors to DECORATE and generalized
	the spawn function that only spawns one mace per level.
- Moved Mace respawning code into AInventory so that it works properly
	for replacement actors.
- Added more DECORATE conversions by Karate Chris.
- Cleaned up the new bridge code and exported all related actors to
	DECORATE so that the exported code pointers can be used.
- Separated Heretic's and Hexen's invulnerability items for stability
	reasons.

August 2, 2008
- Fixed spurious warnings on 32-bit VC++ debug builds.
- Made the subsong (order) number a proper parameter to MusInfo::Play()
	instead of requiring a separate SetPosition() call to do it.

August 2, 2008 (Changes by Graf Zahl)
- Added Gez's submission for custom bridge things.
- Fixed: ASpecialSpot must check the array's size before dividing by it.
- Fixed: The mugshot drawe ignored the accuracy parameter.
- Fixed: The Alt HUD's weapon drawer didn't check properly for invalid icons.
- Added DECORATE conversions for Hexen's Cleric Mace, Firedemon and fog by
	Karate Chris.

July 31, 2008
- Fixed: Attempting to load 0-length sounds caused a crash.
- Removed filename-lowercasing from zipdir.
- Fixed: The ouch face fix was lost when SBARINFO mugshot became the only
	mugshot present.
- Fixed: Mace SpawnID was assigned to the MacePowered actor instead.
- Fixed: Sorcerer2FX1's SpawnID was not restricted to Heretic.

July 27, 2008 (Changes by Graf Zahl)
- Added several type checks to the weapon slot code.

July 26, 2008 (Changes by Graf Zahl)
- Changed: Players no longer respawn in instant death sectors with
	the 'Respawn where died' flag on.

July 24, 2008
- Applied Blzut3's 5:4 SBARINFO patch. (At least I think that's what it's
	for.)
- Corrected the revision_check target so that it always checks the revision,
	not just when src/svnrevision.h is not present.
- Added Linux support for the CMakeLists. This meant downgrading them for
	CMake 2.4, since the distros don't seem to consider 2.6 stable yet.
	As a bonus, GTK+ is no longer a required dependency; now it's optional.
- Made dehsupp ignore CR characters, so it doesn't spew warnings on Linux.

July 23, 2008 (Changes by Graf Zahl)
- Fixed: The sounds of Strife's intro need CHAN_UI.
- Changed all instances of playing the chat sounds to use CHAN_UI.

July 21, 2008
- Converted most sprintf (and all wsprintf) calls to either mysnprintf or
	FStrings, depending on the situation.
- Changed the strings in the wbstartstruct to be FStrings.
- Changed myvsnprintf() to output nothing if count is greater than INT_MAX.
	This is so that I can use a series of mysnprintf() calls and advance the
	pointer for each one. Once the pointer goes beyond the end of the buffer,
	the count will go negative, but since it's an unsigned type it will be
	seen as excessively huge instead. This should not be a problem, as there's
	no reason for ZDoom to be using text buffers larger than 2 GB anywhere.
- Ripped out the disabled bit from FGameConfigFile::MigrateOldConfig().
- Changed CalcMapName() to return an FString instead of a pointer to a static
	buffer.
- Changed startmap in d_main.cpp into an FString.
- Changed CheckWarpTransMap() to take an FString& as the first argument.
- Changed d_mapname in g_level.cpp into an FString.
- Changed DoSubstitution() in ct_chat.cpp to place the substitutions in an
	FString.
- Fixed: The MAPINFO parser wrote into the string buffer to construct a map
	name when given a Hexen map number. This was fine with the old scanner
	code, but only a happy coincidence prevents it from crashing with the new
	code.

July 21, 2008 (Changes by Graf Zahl)
- Added MF4_BOSSDEATH to the Minotaur.
- Fixed: The boss brain looped to the wrong state.
- Converted Heretic's Staff, GoldWand, Crossbow and Gauntlets to DECORATE.
- fixed: Morphing to a class without a face definition crashed.
- Converted all of Heretic's actors except the weapons to DECORATE.
- Added the option to define the ActorInfos for native classes in DECORATE.

July 20, 2008 (Changes by Graf Zahl)
- Fixed: When copying visplanes the sky texture was forgotten.
- converted the boss brain to DECORATE.
- added an abstract base class for special map spots that are maintained in
	lists and rewrote the boss brain, the mace and DSparil to use it.
- fixed: RandomSpawners didn't destroy themselves after finishing their work.
- fixed: Textures marked as complex must not redirect to the base patch.
- fixed: Alpha for composite textures was not applied.
- fixed: The CentaurMash didn't inherit from the Centaur.
- added some NULL pointer checks to the sound code.

July 19, 2008 (Changes by Graf Zahl)
- Fixed: When Heretic's Mace was replaced by a non-child class A_SpawnMace still
	treated it as a mace and wrote into some undefined memory.
- Fixed: A_BishopMissileWeave didn't initialize special2 for proper movement.
- Added a speed parameter to A_SkullAttack.
- Fixed: Black as first or only blood color didn't work.
- Fixed: Sounds played in wi_stuff.cpp and f_finale.cpp need the CHAN_UI flag.
- Fixed: Spawning a player could play the *gasp sound.
- Fixed: SBARINFO's health display didn't scale to the proper maximum.

July 18, 2008 (Changes by Graf Zahl)
- Added const char &operator[] (unsigned int index) to FString class.
- Added Skulltag's Teleport_NoStop action special.

July 17, 2008
- Added the 'B' conversion specifier to StringFormat::VWorker() for printing
	binary numbers.

July 16, 2008
- Added CMake support for building with MinGW, MSYS, and NMake. Linux support
	is probably broken until I get around to booting into Linux again. Niceties
	provided over the existing Makefiles they're replacing:
	* All command-line builds can use the same build system, rather than having
		a separate one for MinGW and another for Linux.
	* Microsoft's NMake tool is supported as a target.
	* Progress meters.
	* Parallel makes work from a fresh checkout without needing to be primed
		first with a single-threaded make.
	* Porting to other architectures should be simplified, whenever that day
		comes.

July 15, 2008
- Replaced the makewad tool with zipdir. This handles the dependency tracking
	itself instead of generating an external makefile to do it, since I couldn't
	figure out how to generate a makefile with an external tool and include it
	with a CMake-generated makefile. Where makewad used a master list of files
	to generate the package file, zipdir just zips the entire contents of one or
	more directories.

July 15, 2008 (Changes by Graf Zahl)
- Fixed: Strife's EntityBoss didn't copy friendliness information to the
	sub-entities.

July 12, 2008 (Changes by Graf Zahl)
- Fixed: Friendly spectral monsters should be able to hurt unfriendly ones
	and vice versa.
- Fixed: In deathmatch specral missiles spawned by players should hurt other
	players.
- Fixed: SpectralLightningBigBall didn't set the proper owner for the lightning
	projectiles it spawned.
- Changed the EntityBoss's attack function to call the equivalent spectre
	functions instead of duplicating their code.
- Gave many of Strife's code pointers that only had a number as name more
	meaningful names.
- Fixed: All spectral attacks must set 'health' first before P_CheckMissileSpawn
	is called.
- Added a compatibility option to play sector sounds from the precalculated
	center because some maps apparently abuse the behavior to make the sound
	play somewhere where it can't be heard by the player to fake silent movement.
- Fixed: The S_Sound variant taking an actor must check if the actor is not
	NULL.
- Fixed: ACS's ActivatorSound must check if the activator is valid.
- Changed stats drawing so that multi-line strings can be used.

July 9, 2008
- Added the gdtoa package from netlib's fp library so that ZDoom's printf-style
	formatting can be entirely independant of the CRT.

July 5, 2008
- Added a check to G_DoSaveGame() to prevent saving when you're not actually
	in a level.
- Fixed: Serialized player data must always be loaded, even if it's simply to
	be discarded, so that anything serialized after the players will load from
	the correct position in the file when revisiting a hub map.

July 5, 2008 (Changes by Graf Zahl)
- Changed: AInventory::Tick now only calls the super method if the item is not
	owned. Having owned inventory items interact with the world is not supposed
	to happen.
- Fixed: case PCD_SECTORDAMAGE in p_acs.cpp was missing a terminating 'break'.
- Fixed: When a weapon is destroyed, its sister weapon must also be destroyed.
- Added a check for PUFFGETSOWNER to A_BFGSpray.
- Moved the PUFFGETSOWNER check into P_SpawnPuff and removed the limitation
	to players only.
- Fixed: P_SpawnMapThing still checked FMapThing::flags for the class bits
	instead of FMapThing::ClassFilter.
- Fixed: A_CustomMissile must not let P_SpawnMissile call P_CheckMissileSpawn.
	It must do this itself after setting the proper owner.
- Fixed: CCMD(give) increased the total item count.
- Fixed: A_Stop didn't set the player specific variables to 0.

July 4, 2008
- Fixed: Screenwipes now pause sounds, since there can be sounds playing
	during them.
- UI sounds are now omitted from savegames.
- Fixed: Menu sounds had been restricted to one at a time again.
- Moved the P_SerializeSounds() call to the end of G_SerializeLevel() so that
	it will occur after the players are loaded.

July 2, 2008
- Added fixes from FreeBSD for 0-length and very large string buffers
	passed to myvsnprintf.
- Rewrote myvsnprintf to use the StringFormat routines directly so that no
	additional memory needs to be allocated from the heap.

July 1, 2008
- Polyobject sounds now play from their lines, similar to the way sector
	sounds are handled.
- Why do polyobjects have a 3D start spot? Flattened it to 2D.
- Moved the sector sound origin calculation out of fmodsound.cpp and into
	s_sound.cpp so that the near sound limiting will use the correct sound
	location for deciding on neighbors.

June 30, 2008
- Removed the S_Sound() variant that allows for pointing the origin at an
	arbitrary point. It has been replaced with a variant that takes a polyobject
	as a source, since that was the only use that couldn't be rewritten with the
	other variants. This also fixes the bug that polyobject sounds were not
	successfully saved and caused a crash when reloading the game. Note that
	this is a significant change to how equality of sound sources is determined,
	so some things may not behave quite the same as before. (Which would be a
	bug, but hopefully everything still sounds the same.)
- Adjusted the noise debug table so that fractional volume levels do not
	run into the adjacent columns.
- Added a NullSoundRenderer so that most of the checks against a NULL GSnd
	can be removed.
- Fixed: Looping sounds must always successfully allocate a channel, even if
	it's only a pre-evicted channel.

June 30, 2008 (Changes by Graf Zahl)
- Added A_ClearReFire code pointer for weapons. Preferably A_WeaponReady should
	reset this counter but that can't be done due to unwanted side effects with
	existing weapons.
- Changed the 'scale' variable in CVAR(turbo) to double because the calculations
	depended on the current floating point precision setting and only worked properly
	when set to 'precise' in VC++.

June 29, 2008 (Changes by Graf Zahl)
- Changed: I_Error and I_FatalError now use ZDoom's internal string formatting
	code to process their messages. This was necessary to handle the %zu format
	option used in some memory allocation failure messages.
- Fixed: The flat texture scaling action specials were completely broken.

June 28, 2008
- The sound code now handles restarting looping sounds itself. As far as
	the rest of the game is concerned, these sounds will never stop once they
	have been started until they are explicitly stopped. If they are evicted
	from their channels, the sound code will restart them as soon as possible.
	This means that instead of this:
	if (!S_IsActorPlayingSomething(actor, CHAN_WEAPON, -1))
	{
		S_Sound(actor, CHAN_WEAPON|CHAN_LOOP, soundid, 1, ATTN_NORM);
	}
	The following is now just as effective:
	S_Sound(actor, CHAN_WEAPON|CHAN_LOOP, soundid, 1, ATTN_NORM);
	There are also a couple of other ramifications presented by this change:
		* The full state of the sound system (sans music) is now stored in save
			games. Any sounds that were playing when you saved will still be
			playing when you load. (Try saving while Korax is making a speech in
			Hexen to hear it.)
		* Using snd_reset will also preserve any playing sounds.
		* Movie playback is disabled, probably forever. I did not want to
			update the MovieDisable/ResumeSound stuff for the new eviction
			tracking code. A properly updated movie player will use the VMR,
			which doesn't need these functions, since it would pipe the sound
			straight through the sound system like everything else, so I decided
			to dump them now, which leaves the movie player in a totally unworkable
			state.

June 28, 2008 (Changes by Graf Zahl)
- Removed some unused constant definitions from sc_man.cpp.
- Fixed: A_FireBlasterPL2 played the weapon sound with the missile as origin
	instead of the shooting player.
- Fixed: Dead players didn't get the MF_CORPSE flag set.
- Fixed: The internal definition of Floor_LowerToNearest had incorrect parameter
	settings.
- Fixed: Heretic's ActivatedTimeBomb had the same spawn ID as the inventory item.
- fixed: Heretic's mace did not have its spawn ID set.

June 26, 2008
- Changed S_Sound() to take the same floating point attenuation that the
	internal S_StartSound() uses. Now ambient sounds can use the public
	S_Sound() interface.
- Fixed: S_RelinkSound() compared the points of the channels against the
	from actor's point, rather than checking the channels' mover.
- Changed Strife's animated doors so that their sounds originate from the
	interior of the sector making them and not from the entire vertical height
	of the map.
- For controls that are not bound, the customize controls menu now displays
	a black --- instead of ???.
- Applied Gez's BossBrainPatch3.
- Fixed: P_BulletSlope() did not return the linetarget. This effected
	the Sigil, A_JumpIfCloser, and A_JumpIfTargetInLOS.

June 25, 2008
- Fixed all the new warnings tossed out by GCC 4.3.

June 23, 2008
- Fixed: PickNext/PrevWeapon() did not check for NULL player actors.
- Fixed compilation issues with GCC.
- Removed special case for nobotnodes in MAPINFO.

June 22, 2008 (Changes by Graf Zahl)
- Added support for ST's QUARTERGRAVITY flag.
- Added a generalized version of Skulltag's A_CheckRailReload function.
- Fixed: DrawImage didn't take 0 as a valid image index.
- Added Gez's RandomSpawner submission with significant changes.
- Added optional blocks for MAPINFO map definitions. ZDoom doesn't use
	this feature itself but it allows other ports based on ZDoom
	to implement their own sets of options without making such a MAPINFO
	unreadable by ZDoom.

June 16, 2008 (Changes by Graf Zahl)
- Fixed: The mugshot would not reset on re-spawn.
- Fixed: Picking up a weapon would sometimes not activate the grin.
- Changed: Line_SetIdentification will ignore extended parameters when
	used in maps defined Hexen style in MAPINFO.
- Fixed: Ambient sounds didn't pass their point of origin to S_StartSound.
- Fixed: UseType was not properly set for textures defined in TEXTURES.
- Fixed: You couldn't set an offset for sprites defined in TEXTURES.
- Added read barriers to all actor pointers within player_t except for
	mo, ReadyWeapon and PendingWeapon.

June 15, 2008 (Changes by Graf Zahl)
- Added a read barrier to player_t::PrewmorphWeapon.
- Fixed: After spawning a deathmatch player P_PlayerStartStomp must
	be called.
- Fixed: SpawnThings must check if the players were spawned before
	calling P_PlayerStartStomp.
- Fixed typo in flat scroll interpolation.
- Changed FImageCollection to return translated texture indices so
	that animated icons can be done with it.
- Changed FImageCollection to use a TArray to hold its data.
- Fixed: SetChanHeadSettings did an assignment instead of comparing
	the channel ID witg CHAN_CEILING.
- Changed sound sequence names for animated doors to FNames.
- Automatically fixed: DCeiling didn't properly serialize its texture id.
- Replaced integers as texture ID representation with a specific new type
	to track down all potentially incorrect uses and remaining WORDs used
	for texture IDs so that more than 32767 or 65535 textures can be defined.

June 14, 2008
- Increased the duration of respawn invulnerability by one second.
- DF2_YES_RESPAWN_INVUL and DF_FORCE_RESPAWN now apply to all multiplayer
	games, not just deathmatch, without the need for turning on
	alwaysapplydmflags.
- Fixed: DF2_YES_RESPAWN_INVUL only worked in deathmatch, even with
	alwaysapplydmflags turned on.
- Fixed: DF_COOP_LOSE_ARMOR did not empty the starting armor items.
- Replaced the naive area sound implementation with one that takes into
	consideration the size and shape of the sector producing the sound. See
	the lifts on Doom 2 MAP30 and compare with previous versions.

June 14, 2008 (Changes by Graf Zahl)
- Fixed: The UDMF parser stored plane rotation angles as fixed_t, not angle_t.
- Grouped the sector plane texture transformation values into a separate
	structure and replaced all access to them with wrapper functions.

June 13, 2008
- Fixed: The stop sound for sector-based sound sequences was not played with
	the CHAN_AREA flag.
- Removed the distinction between S_Sound() and S_SoundID() functions. Use
	S_Sound() for both names and IDs from now on.

June 12, 2008
- Add environment 255, 255 as a way to get the software underwater effect in
	any zone you want.
- Using a too-recent version of FMOD now gives an error, since there may be
	breaking changes to the API from one version to the next (excluding
	revisions in stable branches, which only represent bug fixes).
- Updated fmod_wrap.h for FMOD 4.16 and corrected a bug that had gone
	unnoticed before: The delayhi and delaylo parameters for Channel::setDelay()
	and getDelay() were swapped.

June 12, 2008 (Changes by Graf Zahl)
- Fixed: P_ChangeSector could incorrectly block movement when checking for
	mid textures linked to a moving floor.
- Fixed AActor's bouncefactor definitions which I accidentally changed when
	adding wallbouncefactor.
- Fixed: A_SpawnItemEx added the floorclip offset to the z coordinate instead
	of subtracting it.

June 11, 2008 (Changes by Graf Zahl)
- Fixed: SBARINFO's popup code used 1-based indices to address a C++ array.
- Fixed: ACS's ChangeSky command didn't clean up the stack.
- Fixed: Wall scrolling interpolations incremented their reference count twice.
- Fixed: Before a level's thinkers are loaded all previous interpolations must
	be cleared.
- Fixed: deleted interpolations didn't NULL the pointer in the interpolated
	object. Also added all interpolation pointers to DSectorMarker to ensure
	that they are properyl processed by the garbage collector.

June 10, 2008 (Changes by Graf Zahl)
- Added scaling to double size for idmypos display.
- Changed: Players don't telefrag when they are spawned now but after all
	actors have been spawned to avoid accidental voodoo doll telefragging.
- Fixed: ACS scripts for non-existent maps were started on the current one.
- Added a 'wallbouncefactor' property to AActor.
- Reverted forceunderwater change from r1026 and fixed the problem for real:
	SECF_FORCEDUNDERWATER only has meaning when coming from the heightsec.
	So the initial check of the current sector in AActor::UpdateWaterLevel
	must only check for SECF_UNDERWATER, not SECF_UNDERWATERMASK.

June 9, 2008
- Dehacked fix discovered by entryway: Dehacked only changes the blue armor's
	armortype. It does not touch the armor given by the megasphere.
- Changed forcewater handling so that only control sectors created by one-
	sided lines become swimmable, since there's a good chance that a two-sided
	line is creating the control sector out of a normal, accessible portion of
	the map. (See e.g. linedef 29242 of zdoomcmp1.)

June 7, 2008
- Added self-modifying code notifications for Valgrind.
	Build with make VALGRIND=1 to turn them on.

June 6, 2008
- Fixed: There was still an inventory bar check in FMugShot::GetFace() after
	separating it from DDoomStatusBar.

June 5, 2008
- Fixed: When following links in S_StartSound(), the function used sfx
	instead of S_Sfx as the array base for getting the NearLimit.
- Repositioned the declaration of the file string in D_DoomMain() so that it
	won't be left on the stack at exit.
- Fixed: PSymbol needs a virtual destructor so that PSymbolActionFunction can
	free its Arguments.
- Symbols for native classes are now freed on exit.

June 4, 2008
- Removed the 8-character limit on endpic names from the parser. (Though it
	might still be present in the texture manager; I don't remember.)
- Fixed: EndSequence needs a proper constructor.

June 4, 2008 (Changes by Graf Zahl)
- Fixed: The EndSequence structure was not fully initialized.
- While doing the interpolation rewrite I noticed that DScroller and DPolyAction
	were doing some things in their destructor that needed to be done in the
	Destroy method.
- Rewrote the interpolation code. Interpolations are no longer some objects
	that are separate from the rest of the engine. Instead, they are owned by
	the thinkers starting them. Also, polyobjects only spawn a single interpolation
	for each polyobject instead of a single one for each vertex.
	Also, different types of interpolation objects are used for different types
	of interpolation so that they can do some additional work if eventually needed.

June 3, 2008 (Changes by Graf Zahl)
- Fixed: MAPINFO's 'lookup' option should only work for actual strings but
	not for lump and file names.
- Added a few 'activator == NULL' checks to some ACS functions.
- Added line and vertex lists to polyobjects so that I can do some
	changes that won't work with only a seg list being maintained.

June 3, 2008 (SBarInfo update #23)
- Fixed: Drawing the amount of an inventory item in the player's inventory did
	not work
- Added: PowerupTime to drawnumber and drawbar.  You must specify a
	powerupgiver.  Although drawnumber goes in seconds the powerup has left
	drawbar will use ticks for extra accuracy.
- I have increased cross-port compatibility with Skulltag.  If an unknown
	game mode is provided for sbarinfo's gamemode command it will ignore it and
	continue.

June 2, 2008 (Changes by Graf Zahl)
- Added an option to consider intermission screens gameplay for purposes of
	capturing the mouse.
- Changed: Telefragging should not thrust the victim if it isn't in precisely the
	same position as the killer.
- fixed: A_SpawnItemEx must call P_TeleportMove before checking the spawned
	object's position.

June 1, 2008 (Changes by Graf Zahl)
- Fixed: Ouch state was far to easy to achieve.
- Made all the basic texture classes local to their implementation.
	They are not needed anywhere else.
- Changed the HackHack hack for corrupt 256 pixel high textures that
	FMultiPatchTexture only calls a virtual function instead of doing any
	type checks of the patch itself.
- Cleaned up the constant definitions in doomdata.h.
- Moved the TEXTUREx structures from doomdata.h to multipatchtexture.cpp
	because they are used only in this one file.
- Removed some more typedefs from r_defs.h and doomdata.h
- Moved local polyobject data definitions from p_local.h to po_man.cpp.
- Renamed player_s to player_t globally to get rid of the duplicate names
	for this class.

May 31, 2008
- Added coordinate range checking to DCanvas::ParseDrawTextureTags() to avoid
	potential crashes in the situation that con_scaletext is 2 and somebody
	uses a hud message as if a hud size was specified, but forgot to actually
	set the hud size.
- Consolidated the mug shot code shared by DSBarInfo and DDoomStatusBar
	into a single place.
- Fixed: Setting an invalid mug shot state crashed the game.
- Fixed my attempts to be clever with strings yesterday.

May 30, 2008
- If an actor's current target temporarily goes unshootable, its threshold
	is now reset to 0, so it will more readily switch back to it.
- Fixed: Deactivating the game no longer allows reverb effects to continue
	playing while the sound is paused.
- Fixed: S_StartNamedSound() looked for SECF_SILENT in MoreFlags instead of
	Flags.
- Fixed: DSBarInfo::updateState() and DDoomStatusBar::UpdateState() sprung
	leaks and didn't allocate enough space for the fullStateName string.
- Disabled DUMB's mono destination mixers. It's not like I'm ever going to
	target an original SoundBlaster, so they're a waste of space to have around.
	This trims resample.obj down to ~60k now.

May 29, 2008
- Fixed: PrtScn/SysRq key did not work on Linux.

May 29, 2008 (Changes by Graf Zahl)
- Changed: The texture loader now looks for a TEXTURES lump for text based
	texture definitions. HIRESTEX is still supported but deprecated.
- Removed all 16 bit values from texture manager.
- Changed: The texture manager now sorts all textures for a WAD by type
	to avoid priority issues with HIRESTEX defined textures.
- Changed sidedef flag WALLF_ADDTRANS into a linedef flag because it is
	always the same for both sides of a linedef. This also makes handling
	this in the UDMF parser easier because the linedef parsing function does
	not need to access the sidedef data.
- Added new ZDoom specific UDMF linedef and sidedef properties to map parser.

May 28, 2008
- Added an alternate module replay engine that uses foo_dumb's replayer, a
	heavily customized version of DUMB (Dynamic Universal Music Bibliotheque).
	It has been slightly modified by me:
	* Added support for Ogg Vorbis-compressed samples in XM files ala FMOD.
	* Removed excessive mallocs from the replay core.
	* Rerolled the loops in resample.c. Unrolling them made the object file
		~250k large while providing little benefit. Even at ~100k, I think it's
		still larger than it ought to be, but I'll live with it for now.
	Other than that, it's essentially the same thing you'd hear in foobar2000,
	minus some subsong detection features. Release builds of the library look
	like they might even be slightly faster than FMOD, which is a plus.
- Fixed: Timidity::font_add() did not release the file reader it created.
- Fixed: The SF2 loader did not free the sample headers in its destructor.

May 28, 2008 (Changes by Graf Zahl)
- Added new ZDoom specific UDMF sector properties to map parser.
- Added class definitions for new interpolators that are better
	equipped to interact with the interpolated objects.
- Separated interpolation code into its own file r_interpolate.cpp.
- Added some simple customization options to the end game screens.

May 27, 2008 (Changes by Graf Zahl)
- Fixed: Polyobject detection in the internal node builder did not work
	anymore due to some code rearrangement for UDMF map loading. To keep
	it compatible between all map formats the THINGS lump of binary format
	maps must be loaded before building the nodes. This also means that
	the spawning itself can be done in the same function for all map types
	(except Build) now.
- Changed 'Smooth mouse movement' menu option from m_filter to smooth_mouse
	which is more what would be expected from this option.
- Fixed: Weapons and ammo items that were modified by Dehacked gave full
	ammo when being dropped by monsters. To properly handle this the
	handling of spawning Dehacked modified pickups was changed to use
	the DECORATE replacement feature instead of hacking the spawn state
	of the original item and calling a spawn function from there.

May 23, 2008 (Changes by Graf Zahl)
- Fixed: The compatibility searches for teleport destinations did not work
	properly when the teleporter had both a tid and a tag. Now, if a teleporter
	has a tag these are skipped because they are only present for Hexen
	compatibility.
- Fixed: The first texture in a TEXTURE1 lump, although invalid when used
	elsewhere, must be usable as sky (see Requiem.wad's SKY3.)
- Fixed: side_t::GetLightLevel relied on the global 'linedef' variable for
	automatic fake contrast.
- Changed: Fake contrast now uses the WALLF_AUTOCONTRAST globally instead
	of manipulating the sides' light values individually. This allows changing
	the fake contrast at run time and also allows adding individual relative
	lighting on top of it which is a planned UDMF feature.

May 22, 2008
- Fixed: ActorStencilColor() did not set the palette part of the actor's
	fill color, so it would always produce black for STYLE_Shaded.
- Added volume reduction for stereo sounds played in 3D to obtain levels
	closer to FMOD 3, which downmixed all stereo sounds to mono before
	playing them in 3D. Also added experimental 3D spread for stereo sounds
	so that you can actually hear them in stereo.

May 22, 2008 (Changes by Graf Zahl)
- Reworked a few options that previously depended on LEVEL_HEXENFORMAT
	(actors being forced to the ground by instantly moving sectors, strife
	railing handling and shooting lines with a non-zero but unassigned tag.)
	With UDMF such semantics have to be handled diffently.
- finalized UDMF 1.0 implementation.
- Added Martin Howe's latest morph update.

May 21, 2008
- Fixed: When R_DrawTiltedPlane() calculates the p vector, it can overflow
	if the view is near the bounds of the fixed point coordinate system. This
	happens because it rotates the view position around (0,0) according to
	the current viewangle, so the resultant coordinate may be outside the
	bounds of fixed point. All important math in this function is now done
	entirely in floating point.
- Fixed: Slopes didn't draw right on 64-bit platforms.

May 20, 2008
- Fixed: With hardware 2D, the console and menu need not reimplement palette
	flashes to ensure their visibility.
- Fixed: DFlashFader::Destroy() did not call its super method.
- Fixed: If a player was morphed into a class with a taller view height,
	their perceived view height would not change until they walked up a step.

May 19, 2008
- Since KDIZD is the only mapset I know of that used reverb, and it didn't
	define any new ones of its own, I'm pre-emptively renaming the SNDEAX lump
	to REVERBS to remove any possible misunderstanding that this is something
	that requires EAX hardware support. (Ideally, it would have been REVERBDEF,
	but that's 10 characters long.) The eaxedit console command has also been
	renamed to reverbedit for the same reason.
- Fixed: The Palette part of FRemapTable was not initialized with alpha values
	other than 0. I'm not sure if it would be better to fix this in the game
	palette that it copies from or not, but right now, they get set
	unconditionally to 255.
- Fixed: M_DrawSave() and M_DrawLoad() need to use GetScaledWidth(), in case
	the texture is high-res.
- Replaced all instances of "flags +=" in sbarinfo_parser.cpp with "flags |="
	so that using the same flag multiple times will not have unexpected results.

May 19, 2008 (sbarinfo update #21)
- Added: sigil image type to correctly draw the sigil's icon.
- Added: Strife inventory bar style.  This is the only style that is radically
	different from the others.  First of all it changes the SELECTBO to be
	INVCURS and draws it before the icons.  Each box is changed to have a width
	of 35 pixels instead of 31 pixels.  And the INVCURS graphic is drawn at
	(x-6, y-2).
- Added: whennnotzero flag to drawnumber which will cause it to draw nothing if
	the value is 0.
- Fixed: New mugshot code would not leave the god state when it was supposed to
	enter the rampage state.
- Fixed: The ouch state was mostly broken.

May 18, 2008 (SBarInfo Update #20)
- Added: hasweaponpiece command to check for custom weapon pieces.
- Added: usessecondaryammo command to check if the current weapon has a second
	ammo type.
- Most of SBarInfo's mugshot scripting can be used with the default Doom status
	bar.
- Fixed: By default drawmugshot would never come out of normal god mode state.
	In addition the state change to and from god mode was not quite as responsive
	as the original code.

May 17, 2008 (Changes by Graf Zahl)
- Fixed: When FTextureManager::CheckForTexture finds a matching NULL texture
	it should always return 0, not the actual texture's index.
- Fixed coordinate checks for objects on 3DMidtex lines.
- Fixed: All translucent blending operations for CopyColors must treat an
	alpha of 0 so that the pixel is not modified or texture composition as
	intended will not work.

May 16, 2008
- Fixed: 3D hardware texture filling did not copy pixels with 0 alpha,
	preserving whatever was underneath in the texture box previously.
- Fixed: s_sound.cpp had its own idea of whether or not sounds were paused
	and did not entirely keep it in sync with the sound system's. This meant
	that when starting a new game from the menu, all sounds were played as
	menu sounds until you did something to pause the game, because s_sound.cpp
	thought sounds were unpaused, while the FMOD system thought they were.

May 15, 2008 (Changes by Graf Zahl)
- I finally managed to test the translucency options for composite texture
	definitions in HIRESTEX. The feature should be complete now.
- Fixed: A_CheckTargetInLOS used BAM angles instead of degrees which is the
	DECORATE convention.
- Added Snowkate709's A_CheckTargetInLOS addition.
- Added listmaps CCMD.

May 14, 2008
- Revised underwater effect now uses a lowpass filter in combination with an
	optional freeverb unit.
- Removed ResetEnvironment hack, since with software reverb, losing the
	existing reverb when focus is lost isn't a problem.
- Commented out the TiMidity FIXME messages.
- Fixed: FBarShader::GetColumn() passed incorrect information to the software
	renderer for horizontal bars.

May 13, 2008 (Changes by Graf Zahl)
- Changed: For actors not being spawned on the floor P_FindFloorCeiling should
	be used to prevent them from dropping through 3DMIDTEX textures.
- Fixed: AMageStaffFX2::IsOkayToAttack overwrote the projectile's angle variable.

May 13, 2008
- Changed the types of object hash indices in FArchive from size_t to DWORD.
	This seems to fix crashes on GCC 64-bit builds when saving games. Not sure
	if it was a GCC bug or my bug, since it worked fine with VC++, but since the
	code that calculates the index only returns a DWORD, storing it as a size_t
	was rather pointless.
- Added the C99 printf size specifiers 't' (ptrdiff_t) and 'z' (size_t) to
	FString::Format() so that I can fix all the problem printf strings that a
	64-bit GCC compile finds.

May 12, 2008 (Changes by Graf Zahl)
- Added Skulltag's PUFFGETSOWNER flag.
- Fixed: Parsing sector special bit masks must be done backwards so that later
	definitions take precedence.
- Added base translation tables for UDMF compatibility maps which only should
	handle the native line and sector types of each game.
- Turned the inactive SILENT_INSTANT_FLOORS define into a compatibility option
	so that it can be (un)set in a map definition and the menu.
- Fixed: SPAC_AnyCross didn't work.
- Fixed: Pushable doors must also check for SPAC_MPush.
- Fixed: P_LoadThings2 did not adjust the byte order for the thingid field.

May 11, 2008 (Changes by Graf Zahl)
- Changed: HIRESTEX 'define' textures now replace existing textures
	of type MiscPatch with the same name.
- Added UDMF line trigger types MonsterUse and MonsterPush.
- Separated skill and class filter bits from FMapThing::flags so that
	UDMF can define up to 16 of each. Also separated easy/baby and
	hard/nightmare and changed default MAPINFO definitions.

May 10, 2008
- Fixed: FWadCollection::MergeLumps() did not initialize the flags for any
	marker lumps it inserted.
- Fixed: Need write barriers when modifying SequenceListHead.

May 9, 2008
- Added a new cvar: midi_timiditylike. This re-enables TiMidity handling of
	GUS patch flags, envelopes, and volume levels, while trying to be closer
	to TiMidity++ than original TiMidity.
- Renamed timidity_config and timidity_voices to midi_config and midi_voices
	respectively.

May 9, 2008 (Changes by Graf Zahl)
- Changed: Crosshair drawing uses the current player class's default health instead
	of 100 to calculate the color for the crosshair.
- Added SECF_NOFALLINGDAMAGE flag plus Sector_ChangeFlags to set it. Also separated
	all user settable flags from MoreFlags into their own Flags variable.

May 8, 2008
- Reduced volume, expression, and panning controllers back to 7 bits.
- Added very basic Soundfont support to the internal TiMidity. Things missing:
	filter, LFOs, modulation envelope, chorus, reverb, and modulators. May or
	may not be compatible with TiMidity++'s soundfont extensions.

May 8, 2008 (Changes by Graf Zahl)
- Changed all thing coordinates that were stored as shorts into fixed_t.
- Separated mapthing2_t into mapthinghexen_t and the internal FMapThing so
	that it is easier to add new features in the UDMF map format.
- Added some initial code to read UDMF maps.

May 6, 2008
- Added support for quoted strings to the TiMidity config parser.

May 2, 2008 (Changes by Graf Zahl)
- Split off the slope creation code from p_Setup.cpp into its own file.
- Separated the linedef activation types into a bit mask that allows combination
	of all types on the same linedef. Also added a 'first side only' flag. This
	is not usable from Hexen or Doom format maps though but in preparation of
	the UDMF format discussed here:
	http://www.doomworld.com/vb/source-ports/43145-udmf-v0-99-specification-draft-aka-textmap/
- Changed linedef's alpha property from a byte to fixed point after seeing that
	255 wasn't handled to be fully opaque.
- fixed a GCC warning in fmodsound.cpp

April 30, 2008 (Changes by Graf Zahl)
- Fixed: Warped textures didn't work anymore because the default speed was 0.

April 30, 2008
- Fixed: I had instrument vibrato setting the tremolo_sweep_increment value
	in the instrument loader, effectively disabling vibrato.

April 29, 2008
- Fixed: FString::StripRight() stripped the final character of the string if
	there were no designated characters to strip at the end of it.
- Added support for Shoutcast/Icecast playlists.
- Added an error message when a playlist could not be opened.
- Added support for PLS format playlists, in addition to M3U.
- Changed FPlayList to use an array of FStrings.
- Fixed: Playlists required every song to be specified by an absolute path.
- Fixed a copy-and-paste error in win32/i_main.cpp for 64-bit mode.
- Tweaked OPL centering a little.

April 28, 2008
- Added dynamic recentering for the OPL synth. The chip has four basic
	waveforms, and three of them are non-negative. This can cause a tendency
	for the resulting output waveform to go into very high ranges depending on
	the timbres used, and Heretic's exemplify this problem.
- Reduced the OPL volume level slightly.
- Fixed: The waveform view from snd_drawoutput was upside-down.
- Various fixes for compiling working 64-bit binaries with Visual C++. The
	number of changes was pleasantly small, and a cursory check seems to show
	everything working alright.

April 27, 2008
- Separated the skin scale values into separate X and Y values so that skins
	automatically generated for different player classes can use both the
	scaling values that can be set for the actor.

April 26, 2008
- Fixed: Any MIDI ticks that contain only events that are interpreted by
	the MIDI parser and not passed on to the MIDI device would mess up timing
	for future events.
- Changed EMIDI controller 110-113 handling to more accurately match the
	EMIDI specs: Track designations and exclusions should be ignored past
	the initial beat, and EMIDI program change and volume events should be
	ignored unless they were used in the initial beat.
- Fixed: When FMOD::System::init() returns FMOD_ERR_OUTPUT_CREATEBUFFER, it
	could also be because the user selected PCM-Float output, but the driver
	doesn't support it (even if it claims to *cough*Audigy XP drivers*cough*).

April 26, 2008 (Changes by Graf Zahl)
- Added speed factors for texture warp commands.
- Added damage type parameter to A_Die.

April 25, 2008
- Re-enabled TiMidity's loop and envelope stripping for instruments that look
	like they weren't really meant to be played by the GUS MIDI library.

April 25, 2008 (SBarInfo Update #18)
- Simplified the DrawGraphic function in sbarinfo_display.cpp
- Added xOffset, yOffset, and alpha to every drawing function in
	sbarinfo_display.cpp.  So Strife popups can be handeled better and allow for
	other effects (translucent bars?).  I'm thinking about making a struct for
	these five (also x and y) arguments so that the argument lists don't become a
	mess.
- Changed DRAWIMAGE in sbarinfo_display.cpp to not use so many calls to
	DrawGraphic.
- DrawKeyBar wasn't using screen->DrawTexture.
- Added a Fade transition for popups.  It takes two args fade in rate and fade
	out rate.  Both are floats (1.0 = 1 tic to complete 0.5 = 2 tics to complete
	and so on).
- Added a translucency arg to statusbars.  1.0 = opaque and 0.0 = invisible.

April 24, 2008
- Fixed: When an instrument's envelope runs out, it does not immediately ramp
	to zero. Rather, it lets the remainder of the sample finish playing.
- Fixed: When playing a MIDI file with EMIDI track designations to turn a
	track off, any ticks that had only events on the disabled track would cause
	the delay for that track to be thrown away, and the following notes on
	enabled tracks would play too soon. This could be heard quite clearly in
	xplasma.mid, where track 4 (FMGlass Drone 1) would interfere with the timing
	of tracks 13 and 14 (EP1 Melody and EP1 Echo).

April 24, 2008 (Changes by Graf Zahl)
- Fixed: DFlashFader did some operations in its destructor that had to be moved
	to its Destroy method.
- Fixed: Dropped weapons from dying players should not double ammo.

April 23, 2008
- Fixed: When note_on() is called and another copy of the same note is
	already playing on the channel, it should stop it with finish_note(), not
	kill_note(). This can be clearly heard in the final cymbal crashes of
	D_DM2TTL where TiMidity cuts them off because the final cymbals are played
	with a velocity of 1 before the preceding cymbals have finished. (I wonder
	if I should be setting the self_nonexclusive flag for GUS patches to
	disable even this behavior, though, since gf1note.c doesn't turn off
	duplicate notes.)
- Changed envelope handling to hopefully match the GUS player's. The most
	egregious mistake TiMidity makes is to treat bit 6 as an envelope enable
	bit. This is not what it does; every sample has an envelope. Rather, this
	is a "no sampled release" flag. Also, despite fiddling with the
	PATCH_SUSTAIN flag during instrument loading, TiMidity never actually
	used it. Nor did it do anything at all with the PATCH_FAST_REL flag.

April 23, 2008 (Changes by Graf Zahl)
- Fixed: wbstartstruct's lump name fields were only 8 characters long
	and not properly zero-terminated when all 8 characters were used.
- Fixed: Local sound sequence definitions caused a crash because a proper
	NULL check was missing.

April 22, 2008 (Changes by Graf Zahl)
- Added translucent blending modes to FMultipatchTexture (not tested yet!)
- Also changed all true color texture creation functions to use proper alpha
	values instead of inverted ones.
- Changed FRemapTable so that all palette entries must contain proper alpha
	values.

April 21, 2008 (Changes by Graf Zahl)
- Fixed: The F1 screen check in m_menu.cpp was missing a NULL pointer check.

April 20, 2008 (Changes by Graf Zahl)
- Changed: The boss brain's explosions play weapons/rocklx which is an
	unlimited sound. This can become extremely loud. Replaced with a new
	sound which is just an alias to weapons/rocklx but has a limit of 4.

April 19, 2008
- Fixed: MugShotFrame::getTexture() allocated space for the sprite name that
	it never freed. I'm not sure it's a good assumption that 9 characters is
	always long enough, either, since you can have longer file names than that
	inside a zip.
- Fixed: DSBarInfo::DrawGem() crashed if chain or gem was NULL.
- Fixed: Sound sequences are not thinkers, therefore they must be explicitly
	marked as roots for the GC.
- Reduced the range that area sounds require to interpolate between 2D and
	3D panning.
- The listener's velocity is now set at 0 for the sound engine. The player
	moves so fast that you can hear the doppler shift just by running around,
	otherwise.
- Changed the sound code so that all sounds that start playing on a single
	tic actually start playing at the exact same sample position.
- Added the writewave command to write the internal TiMidity's output to a
	wave file.
- Changed the default channel velocity for MUS files from 64 to 100 to
	better match apparent MIDI practice. (Would like to know what this is
	supposed to be.)
- Changed the mus2midi channel assignments to match the internal player's.
- Fixed: apply_envelope_to_amp() should clamp the mix levels to 0.

April 18, 2008
- Made the maximum number of TiMidity voices configurable through the
	timidity_voices cvar.
- Added stats lines for the OPL and Timidity MIDI devices.
- Completely changed the way TiMidity volume calculations are done. It
	should now be extremely close to the output a real GUS would produce with
	its official MIDI player (excepting where TiMidity normalizes sample
	volumes). The new equations more closely match what is specified by the DLS
	and SF2 specs (but not quite), so I presume it's also more musically
	correct than what TiMidity (and TiMidity++) do.

April 18, 2008 (Changes by Graf Zahl)
- Fixed: FBlockThingsIterator didn't set the current block coordinates if
	they were outside the blockmap. This could cause extreme delays if an
	iteration started outside the valid boundaries.

April 17, 2008
- Fixed: The music stream needs to zero the FMOD_REVERB_CHANNELPROPERTIES
	before sending it to Channel::getReverbProperties().
- Fixed: The earthquake effect did not play its sound as an actual looping
	sound. I'm a bit surprised this only recently started causing problems.

April 17, 2008 (Changes by Graf Zahl)
- Added Martin Howe's fixes for morphing and DECORATE function prototypes.
- Minor fixes in texture code.

April 16, 2008
- Fixed: The FMOD::System object was never released, only closed, so
	snd_reset would eventually run into the hard limit on the total number
	of FMOD::System objects that can be created concurrently (currently 15).
- Added proper error checks to the FMOD initialization process.
- Updated fmod_wrap.h for FMOD 4.14.
- Set note velocity back to using a linear sounding volume curve, although
	it's now used to scale channel volume and expression, so recompute_amp()
	is still only doing one volume curve lookup.
- Fixed: TimidityMIDIDevice caused a crash at the end of a non-looping song.

April 16, 2008 (Changes by Graf Zahl)
- Made translation support for multipatch textures operational.

April 15, 2008
- Added support for the GUS patch format's scale_frequency and scale_factor
	parameters. These seem to be used primarily to restrict percussion
	instruments to specific notes.
- Changed note velocity to not use the volume curve in recompute_amp(), since
	this sounds closer to TiMidity++, although I don't believe it's correct
	MIDI behavior. Also changed expression so that it scales the channel volume
	before going through the curve.
- Reworked load_instrument() to be less opaque.
- Went through the TiMidity code and removed pretty much all of the SDL_mixer
	extensions. The only exception would be kill_others(), which I reworked
	into a kill_key_group() function, which should be useful for DLS
	instruments in the future.

April 15, 2008 (Changes by Graf Zahl)
- Added translation support to multipatch textures. Not tested yet!
- Added Martin Howe's morph weapon update.
- Changed true color texture creation to use a newly defined Bitmap class
	instead of having the copy functions in the frame buffer class.
- Fixed: The WolfSS didn't have its obituary defined.
- Added submission for ACS CheckPlayerCamera ACS function.
- Removed FRadiusThingsIterator after discovering that VC++ misoptimized
	it in P_CheckPosition. Now FBlockThingsIterator is used with the distance
	check being done manually.

April 14, 2008 (Changes by Graf Zahl)
- Added rotation 90� angles only) and mirroring to the Multipatch texture
	composition code.
- Fixed: The game crashed when a level was ended while a player was morphed
	by a powerup.
- Fixed: A_VileAttack positioned the fire on the wrong side of the target.
- Reorganized the HackHack code so that the image creation was moved into
	MakeTexture. This was necessary because Unload deleted the pixel data
	and broke the whole thing.
- Fixed: FPatchTexture::HackHack and FDoomStatusbarTexture::DrawToBar used the
	obsolete and uninitialized variable Near255.
- Removed the span creation code specific to FPatchTexture. It only has an
	advantage when the lump has already been loaded in memory but since that
	is no longer the case now the generic version in FTexture is actually better.
- Changed: FTexture::CopyToBlock no longer uses the spans but the pixel buffer
	directly. Since most patches in multipatch textures are non transparent
	the added overhead from creating the spans far outweighs any savings they
	might provide. It is also simpler to handle for mirrored or rotated patches now.
- Changed: Textures only create the spans when really needed. Flats and native
	textures, for example, do not and it only created needless overhead that they
	were always created along with the pixel buffer.
- Made use of player and actor variables consistent in a_hereticweaps.cpp.
- Fixed: A few calls to P_SpawnPlayerMissile passed 0 as angle

April 13, 2008 (Changes by Graf Zahl)
- Fixed a few bugs in the parser for composite textures.
- Changed: When loading Zips all patches in the patches/ directory should
	be loaded, not only those used by a texture in TEXTUREx.
- Disabled timidity_mastervolume for the internal Timidity again because
	with the altered volume calculation it is no longer needed and the default
	volume is on the same level as OPL and FMOD.

April 12, 2008
- Changed FMOD_INIT_ENABLE_DSPNET use to its replacement from 4.14.00,
	FMOD_INIT_ENABLE_PROFILE. Renamed the corresponding cvar to snd_profile.
- Removed the normalize parameter from SoundStream::Play().
- Disabled the chorus and reverb effects added to SDL_mixer's Timidity,
	because they were probably never tested well, either. Thanks to the bug
	in vc_alloc(), they were never even activated.
- Restored the exact frequency range search that was missing from SDL_mixer's
	verion of select_sample().
- Fixed: vc_alloc(), kill_others(), and note_on() treated Voice::status as a
	bit mask, when it's not. These were changes made to SDL_mixer's Timidity.
- Restored the original Timidity volume equation. The other louder one was
	put in when I didn't realize all channels were mono and many notes sounded
	too quiet because they never completed their attack phase.
- Fixed: FileReader::Gets() acted as if fgets() always read the maximum
	number of characters.
- Fixed: FileReader::Open() did not set FilePos and StartPos to 0.

April 12, 2008 (Changes by Graf Zahl)
- Changed the internal Timidity player so that it uses timidity_mastervolume
	because it has the same sound volume issues as the external one.
- Replaced use of stdio in Timidity with FileReader and added the option to read
	from the lump directory. If the main config file is inside the lump directory
	it will assume that everything else is as well. If it is a real file it will be
	assumed that the rest is real files as well.
- Fixed: None of the error returns in read_config_file closed the file being read.
- Added Martin Howe's morph system update.
- Added support for defining composite textures in HIRESTEX. It is not fully tested
	and right now can't do much more than the old TEXTUREx method.
- Added a few NULL pointer checks to the texture code.
- Made duplicate class names in DECORATE non-fatal. There is really no stability
	concern here and the worst that can happen is that the wrong actor is spawned.
	This was a constant hassle when testing with WADs that contain duplicate resources.

April 11, 2008
- Removed some GCC warnings.
- Fixed: MinGW doesn't have _get_pgmptr(), so it couldn't compile i_main.cpp.
- Fixed: MOD_WAVETABLE and MOD_SWSYNTH are not defined by w32api, so MinGW
	failed compiling the new MIDI code.
- Fixed: LocalSndInfo and LocalSndSeq in S_Start() need to be const char
	pointers, since "" is a constant.
- Fixed: parsecontext.h was missing a newline at the end of the file.
- Fixed: Timidity::Channel::mono, rpn, and nrpn were not initialized. In
	particular, this meant that every channel was almost certainly in mono mode,
	which can sound pretty bad if the song isn't meant to be played that way.
- Added bank numbers to the MIDI precaching for Timidity, since I guess I do
	need to care about banks, if even the Duke MIDIs use various banks.
- Fixed: snd_midiprecache only exists in Win32 builds, so gameconfigfile.cpp
	shouldn't unconditionally link against it.
- Fixed: pre_resample() was still disabled, and it left two samples at the end
	of the new wave data uninitialized.
- Moved the xmap table from timidity/tables.cpp to playmidi.cpp. Now I can get
	rid of timidity/tables.cpp, which conflicts in name with the main Doom
	tables.cpp. (And interestingly, VC++ automatically renamed the object file,
	so I wasn't aware of the problem with GCC.)

April 11, 2008 (Changes by Graf Zahl)
- Added a Gets function to the FileReader class which I planned to use
	to enable Timidity to read its config and sound patches from Zips.
	I put this on hold though after finding out that the sound quality
	isn't even near that of Timidity++.
- GCC-Fixes (FString::GetChars() for Printf calls)
- Added a dummy Weapon.NOLMS flag so that Skulltag weapons using this flag
	can be loaded

April 10, 2008
- Changed the MIDIStreamer to send the all notes off controller to each
	channel when restarting the song, rather than emitting a single note off
	event which only has 1 in 127 chance of being for a note that's playing
	on that channel. Then I decided it would probably be a good idea to reset
	all the controllers as well.
- Increasing the size of the internal Timidity stream buffer from 1/14 sec
	(copied from the OPL player) improved its sound dramatically, so apparently
	Timidity has issues with short stream buffers. It's now at 1/2 sec in
	length. However, there seems to be something weird going on with
	corazonazul_ff6boss.mid near the beginning where it stops and immediately
	restarts a guitar on the exact same note.
- Added a new sound debugging cvar: snd_drawoutput, which can show various
	oscilloscopes and spectrums.

April 10, 2008 (Changes by Graf Zahl)
- Eliminated some more global variables (onmobj, DoRipping, LastRipped,
	MissileActor, bulletpitch and linetarget.)

April 9, 2008
- Internal TiMidity now plays music. Unfortunately, it doesn't sound right. :(
- Changed the progdir global variable into an FString.

April 9, 2008 (Changes by Graf Zahl)
- Replaced P_PathTraverse with an FPathTraverse class, rewrote all code using
	P_PathTraverse and got rid of a lot of global variables in the process.
- Simplified the use of the checkarray in FBlockThingsIterator: Since the entire
	game runs single threaded there is no need for multiple check arrays if
	recursive use occurs. Using the same array with a higher start index is
	sufficient if the size is reset after finishing using the iterator.

April 9, 2008 (SBarInfo Update #17)
- Fixed: SBarInfo tried to calculate scaled offsets on unscaled status bars.
- Added: createpopup to SBarInfo.  No we don't have custom popups yet.  It only
	defines the transition effect.  Currently none or slideinbottom.
- Made the first argument of DrawMugShot optional (think of it as an overloaded
	function).  The use of the first argument is deprecated due to the event of
	per player class faces.
- More changes from DrawImage to screen->DrawTexture().  I guess I didn't get
	them all just yet.

April 8, 2008
- Added the FCriticalSection class in critsec.h to make it easier to
	use critical sections in other places besides the OPL player.
- Reimplemented snd_midiprecache, now for MIDI as well as MUS, and
	defaulting to false.

April 8, 2008 (Changes by Graf Zahl)
- Eliminated all use of global variables used as output for P_CheckPosition
	and P_TryMove. Moved BlockingLine and BlockingMobj into AActor because
	the global variables can be easily overwritten with certain DECORATE
	constructs.
- Removed some unnecessary morphing code.
- Fixed some bugs in the HIRESTEX parser.
- Added floating point support and #include and #define tokens to
	FParseContext  Not used yet.
- replaced the value scanning code in FParseContext::GetToken with
	calls to strtol.
- Changed XlatParseContext::FindToken to do a binary search over the
	valid token names.
- Fixed: The check arrays for BlockThingsIterators were not properly
	freed and each iterator allocated a new one as a result.
- Split the Xlat parser context class into a generic part that can be
	used for other Lemon-based parsers in the future and a smaller
	Xlat-specific part.
- Changed: P_TeleportMove now always sets BlockingLine to NULL and
	P_FindFloorCeiling doesn't set it at all. The way it was set in
	PIT_FindFloorCeiling didn't look correct. (Note: It's amazing how
	easy it is to break P_TryMove et.al. with DECORATE if you just know
	which combinations of code pointers will cause problems. This definitely
	needs to be addressed.)
- Changed P_FindFloorCeiling so that it doesn't need global variables
	anymore. I also moved the code to set the calling actor's information
	into this function because that's all it is used for. This also fixes
	another bug:
- AInventory::BecomePickup called P_FindFloorCeiling to get
	proper position values for the item but never set the item's information
	to the return value of this call.
- Removed the check for Heretic when playing *evillaugh when using the
	Chaos Device. This sound is not defined by the other games so it won't
	play by default.
- Added MORPH_UNDOMORPHBYTOMEOFPOWER and MORPH_UNDOMORPHBYCHAOSDEVICE flags
	for the morph style so that the special behavior of these two items
	can be switched on and off.
- Added Martin Howe's morph system enhancement.

April 7, 2008 (Changes by Graf Zahl)
- Removed PT_EARLYOUT from P_PathTraverse because it wasn't used anywhere.
- Rewrote BlockThingsIterator code not to use callbacks anymore.

April 6, 2008 (Changes by Graf Zahl)
- Fixed: PIT_FindFloorCeiling required tmx and tmy to be set but
	P_FindFloorCeiling never did that.
- Merged Check_Sides and PIT_CrossLine into A_PainShootSkull.
- Replaced P_BlockLinesIterator with FBlockLinesIterator in all places it was
	used. This also allowed to remove all the global variable saving in
	P_CreateSecNodeList.
- Added a new FBlockLinesIterator class that doesn't need a callback
	function because debugging the previous bug proved to be a bit annoying
	because it involved a P_BlockLinesIterator loop.
- Fixed: The MBF code to move monsters away from dropoffs did not work as
	intended due to some random decisions in P_DoNewChaseDir. When in the
	avoiding dropoff mode these are ignored now. This should cure the problem
	that monsters hanging over a dropoff tended to drop down.
- Added a NOTIMEFREEZE flag that excludes actors from being affected by
	the time freezer powerup.
- Changed: Empty pickup messages are no longer printed.

April 5, 2008 (Changes by Graf Zahl)
- Changed secret sector drawing in automap so that lines with the ML_SECRET
	flag are only drawn as part of a secret sector if that secret has already
	been found, even if the option is set to always show secret sectors.
- Added the option to use $ as a prefix to a string table name everywhere in
	MAPINFO where 'lookup' could be specified so that there is one consistent
	way to do it.
- Externalized all default episode definitions. Added an 'optional' keyword
	to handle M4 and 5 in Doom and Heretic.
- Added P_CheckMapData function and replaced all calls to P_OpenMapData that
	only checked for a map's presence with it.
- Added Martin Howe's player statusbar face submission.
- Added an 'adddefaultmap' option for MAPINFO. This is the same as 'defaultmap'
	but keeps all existing information in the default and just adds to it. This
	is needed because Hexen and Strife set some information in their base
	MAPINFO and using 'defaultmap' in a PWAD would override that.
- Fixed: Using MAPINFO's f1 option could cause memory leaks.
- Added option to load lumps by full name to several places:
	* Finale texts loaded from a text lump
	* Demos
	* Local SNDINFOs
	* Local SNDSEQs
	* Image names in FONTDEFS
	* intermission script names
- Changed the STCFN121 handling. The character is not an 'I' but a '|' so
	instead of discarding it it should be inserted at position 124.
- Renamed indexfont.fon to indexfont so that I could remove a special case
	from V_GetFont that was just added for this one font.
- Added a 'dumpspawnedthings' CVAR that enables a listing of all things in
	the map and the actor type they spawned.

April 5, 2008 (SBarInfo Update #16)
- Added: fillzeros flag for drawnumber.  When set the string will always have
	a length of the specified size and zeros will fill in for the missing places.
	If the number is negative the negative sign will take the place of the last
	digit.
- Added: globalarray type to drawnumber which will display the value in a
	global array with the index set to the player's number.  Untested.
- Added: isselected command to SBarInfo.
- Fixed: Bi and Tri colored numbers didn't work.
- Fixed: Crash when using nullimage as the last image in drawswitchableimage.
- Applied Graf suggestion to include the y coord when calulating heights to fix
	most of the gaps caused by round off errors.  At least for now anyways and it
	is only applied for drawimage.
- SBarInfo inventory bars have been converted to use screen->DrawTexture()

April 4, 2008 (Changes by Graf Zahl)
- Increased limit for demon/melee to 4.
- Fixed: P_CheckSwitchRange accessed invalid memory when testing a one-sided
	line.
- Fixed: P_SpawnPuff assumed that all melee attacks have the same range
	(MELEERANGE) and didn't set the puff to its melee state if the range
	was different. Even worse, it checked a global variable for this so
	the behavior was undefined when P_SpawnPuff was called from anywhere
	else but P_LineAttack. To reduce the amount of parameters I combined
	this information with the hitthing and temporary parameters into one
	flags parameter. Also changed P_LineAttack so that it gets passed
	an additional parameter that specifies whether the attack is a melee
	attack or not and set this to true in all calls that are to be considered
	melee attacks. I couldn't use the damage type because A_CustomPunch
	and A_CustomMeleeAttack allow passing any damage type they want.
- Added a sprite option as an alternative of particles for FX_ROCKET
	and FX_GRENADE.

April 3, 2008
- Changed the Makefiles that are used by both Linux and MinGW so that msys
	detection occurs only if $OS is Windows_NT. Otherwise, spurious nul files
	are created when compiling on Linux.

April 3, 2008 (Changes by Graf Zahl)
- Fixed: The minimum parameter count for ACS_Execute and ACS_ExecuteAlways for
	DECORATE was wrong (2 instead of 1.)

April 2, 2008 (Changes by Graf Zahl)
- Changed: Hexen set every cluster to be a hub if it hadn't been defined before
	a level using this cluster. Now it will only do that if HexenHack is true,
	i.e. when original Hexen format MAPINFOs are parsed. For ZDoom format
	MAPINFOs it will now be the same as for the other games which means that
	'hub' has to be declared explicitly.
- Added an Idle state that is entered in place of the spawn state if a monster
	has to return to its inactive state if it can't find any more targets.
- Added MF5_NOINTERACTION flag which completely disables all physics related
	code for any actor with this flag. Mostly useful for particle effects where
	the actors just move a certain distance and then disappear.
- Removed the last remains of the antialias precalculation code from
	am_map.cpp because it was no longer used.
- Fixed: Two-sided lines bordering a secret sector were not drawn in the
	proper color
- Fixed: The automap didn't check ACS_LockedExecuteDoor for its lock color.

April 2, 2008
- Switched sounds local to the listener from head-relative 3D sounds to 2D
	sounds so stereo sounds have full separation. I tried using set3DSpread,
	but that still caused some blending of the channels.
- Changed FScanner so that opening a lump gives the complete wad+lump name
	rather than a generic one, so identifying errors among files that all have
	the same lump name no longer involves any degree of guesswork in
	determining exactly which file the error occurred in.
- Added a check to S_ParseSndSeq() for SNDSEQ lumps with unterminated final
	sequences.
- Fixed: Parts of s_sndseq.cpp that scan the Sequences array need NULL
	pointer checks, in case an improper sequence was encountered during
	parsing but not early enough to avoid creating a slot for it in the array.
- Added support for dumping from RAW/DRO/IMF files, so now anything that
	can be played as OPL can also be dumped.
- Removed the opl_enable cvar, since OPL playback is now selectable as just
	another MIDI device.

April 1, 2008
- Added support for DRO playback and dual-chip RAW playback.

March 30, 2008
- Removed MUS support from OPLMUSSong, since using the OPLMIDIDevice with
	MUSSong2 works just as well. There are still lots of leftover bits in
	the class that should probably be removed at some point, too.
- Added dual-chip dumping support for the RAW format.
- Added DosBox Raw OPL (.DRO) dumping support. For whatever reason,
	in_adlib calculates the song length for this format wrong, even though
	the exact length is stored right in the header. (But in_adlib seems buggy
	in general; too bad it's the only Windows version of Adplug that seems to
	exist.)
- Rewrote the OPL dumper to work with MIDI as well as MUS.

March 30, 2008 (Changes by Graf Zahl)
- Changed: When the screen is being deleted the 'screen' variable should be
	set to NULL before performing the delete. Otherwise, in some abnormal
	situations, it could happen that the destroyed screen object is still
	being accessed.
- Fixed: V_Shutdown didn't set OF_YesReallyDelete before deleting screen.
- Fixed: The HIRESTEX parser didn't check if a graphic specified in a remap
	command actually existed.
- Fixed: My $Limit fix from yesterday didn't work because NearLimit was
	an unsigned byte and the comparisons with -1 didn't work. Made it a
	signed word instead.
- Made sfxinfo_t::Link an unsigned int because it limited the amount of
	usable sounds to 65535.

March 29, 2008
- Fixed: OPLMIDIDevice sent the wrong pitch wheel value to the player code.
	Missimp.mid sounds a lot better now, though still a little off.
- Fixed: MIDI files that had ticks with nothing but meta-events did not play
	properly. (fixes sonic3_finalboss.mid)
- Applied Const's Makefile.linux changes.
- Made the OPL MIDI synth available from Linux.

March 29, 2008 (Changes by Graf Zahl)
- Added SnowKate709's A_DamageMaster/A_DamageChildren patch.
- Added a SFX_TRANSFERAMBUSHFLAG for A_SpawnItemEx.
- Added "Shaded" as a valid parameter for DECORATE's RenderStyle.
- Added Karate Chris's patch for a MAPINFO option making Strife conversations
	not halt the game.
- Extended the $limit fix that $alias and $random definitions can have their
	own $limit now.
- Fixed: When resolving a linked sound the limit of the current sound was
	ignored and the one of the referenced sound being used. This was particularly
	noticable when using the chaingun in a group of Zombiemen.
- Added a namespc parameter to FWadCollection::CheckNumForFullName which is
	used when a normal lump name has to be looked up and changed all
	CheckNumForFullName/CheckNumForName combinations in the source to use
	the extended version of CheckNumForFullName only to have consistent
	behavior for lump name lookup.

March 28, 2008
- Moved sound sample rate, buffer size, and buffer count to the
	advanced sound options menu. Removed opl_enable from the menu.
- Added OPL synth as MIDI device -3. Since this is based on the MUS player
	code, it only supports those events and controllers supported by MUS.
	Some of Duke's MIDIs sound awful, but I think that may be more because
	it's using different instruments... There's a thread in the MIDI streamer
	class that could be taken out for Linux, since it doesn't need to deal
	with the Windows Multimedia API, but for now, this is still Windows-only.
- Changed the output of the OPL emulator from 32-bit integers to 32-bit
	floats, so I can write its output directly to the stream buffer. In
	addition, this lets me bring the OPL volume level much closer to the
	standard MIDI volume.

March 27, 2008
- Did some restructuring of the OPL code in preparation for turning it
	into a general MIDI player.
- Fixed: Passing false for a stream callback did not stop the stream.
- Removed opl_frequency, since the only time the emulation sounds good is
	when it plays at the exact frequency of a real chip.
- Music no longer plays at all when snd_musicvolume is 0.
- Bumped up snd_sfxvolume and snd_musicvolume default values.
- Changed D3DFB to explicitly request double buffering instead of assuming
	that the drivers will treat a BackBufferCount of 0 as a request for
	double buffering.
- Fixed: Unsetting a cvar did not remove it from the list of tab
	completions.
- Added "" as a synonym for "nullimage" in SBARINFO.
- Fixed: MAKESAVESIG's stringifier in version.h did not work as expected.
	It stringified the passed macro name, not the value of the macro.
- Moved DCajunMaster off the DObject hierarchy.
- Changed DCajunMaster::getspawned into a TArray of FStrings. It was
	mysteriously being left pointing to uninitialized memory during the
	final GC at exit and crashing.
- Fixed: The code that removed hexdd.wad from the list of IWADs when
	hexen.wad was not present did not work.

March 27, 2008 (Changes by Graf Zahl)
- Fixed: DCajunMaster::End was missing a write barrier for getspawned. The
	same problem in D_DoomMain.
- Made bglobal a pointer because it was causing problems with the garbage
	collector.

March 26, 2008
- Added uppercase copies of the IWAD names to the IWAD search for Unix land.
- Added FMOD_OPENONLY to the callback version of CreateStream() to prevent it
	from doing prebuffering of the song. This was causing the Linux version to
	hang while waiting for input from the pipe, since Timidity hadn't been
	started yet. I tried using a select call in the FillStream() method, but it
	always seems to return the pipe as having nothing available. Unfortunately,
	the game still falls all over itself if Timidity isn't available. Instead
	of execvp failing nicely, X errors kill the game. I don't know why it's
	doing that. My advice for Linux music: Skip Timidity++ and get a DLS patch
	set (/WINDOWS/system32/drivers/gm.dls is probably the most common by far)
	and set the snd_midipatchset cvar to point to it. It's faster and also
	sounds a whole lot better than the crappy freepats Ubuntu wants to install
	with Timidity++ (thank goodness I have the official patches from a real
	GUS so I don't need to use them).
- GCC fixes.

March 26, 2008 (Changes by Graf Zahl)
- Fixed: After starting new music the music volume has to be reset so that
	the song's relative volume takes effect.
- Removed the arbitrary 1024 bytes limit when the file being played is a MIDI
	file. I had a D_DM2TTL that's only 990 bytes.
- Restructured I_RegisterSong so that $mididevice works again and also supports
	selecting FMOD.
- Added Jim' Linux fix.
- Added MartinHowe's fix for mugshot display in status bars.

March 25, 2008
- The garbage collector is now run one last time just before exiting the game.
- Removed movie volume from the sound menu and renamed some of the other
	options to give the MIDI device name more room to display itself.
- Moved the midi device selection into the main sound menu.
- Added FMOD as MIDI device -1, to replace the MIDI mapper. This is still the
	default device. By default, it uses exactly the same DLS instruments as the
	Microsoft GS Wavetable Synth. If you have another set DLS level 1 patch set
	you want to use, set the snd_midipatchset cvar to specify where it should
	load the instruments from.
- Changed the ProduceMIDI function to store its output into a TArray<BYTE>.
	An overloaded version wraps around it to continue to supply file-writing
	support for external Timidity++ usage.
- Added an FMOD credits banner to comply with their non-commercial license.
- Reimplemented the snd_buffersize cvar for the FMOD Ex sound system. Rather
	than a time in ms, this is now the length in samples of the DSP buffer.
	Also added the snd_buffercount cvar to offer complete control over the
	call to FMOD::System::setDSPBufferSize(). Note that with any snd_samplerate
	below about 44kHz, you will need to set snd_buffersize to avoid long
	latencies.
- Reimplemented the snd_output cvar for the FMOD Ex sound system.
- Changed snd_samplerate default to 0. This now means to use the default
	sample rate.
- Made snd_output, snd_output_format, snd_speakermode, snd_resampler, and
	snd_hrtf available through the menu.
- Split the HRTF effect selection into its own cvar: snd_hrtf.
- Removed 96000 Hz option from the menu. It's still available through the
	cvar, if desired.
- Fixed: If Windows sound init failed, retry with DirectSound. (Apparently,
	WASAPI doesn't work with more than two speakers and PCM-Float output at the
	same time.)
- Fixed: Area sounds only played from the front speakers once you got within
	the 2D panning area.

March 25, 2008 (Changes by Graf Zahl)
- Added Karate Chris's submission for multiplayer Strife conversations.
- Increased the limit for 'imp/active' to 6. This sound definitely benefits
	from a higher limit.
- Fixed: $limit should not apply to sounds played from the menu.
- Fixed: The SNDSEQ parser tried to set bDoorSound before actually creating
	the sound sequence data.
- Changed Lemon so that it always writes the header. It still kept recompiling
	the grammar over and over again once it had been changed locally.
- Fixed: ANIMATED allowed animations between different texture types.
- Added a debuganimated CCMD that can be used to output some information
	if a WAD shows broken animations.

March 24, 2008
- Removed xlat_parser.h from the repository. Lemon was always being run on
	xlat_parser.y because both files had the same time stamp after an update,
	and Lemon only rewrites the header file if it's changed.
- Added $volume SNDINFO command. This is multiplied with the volume the sound
	is played at to arrive at the final volume (before distance attenuation).
- Added the CHAN_AREA flag to disable 3D panning within the min distance of a
	sound. Sector sound sequences (except doors) use this flag.
- Added the CHAN_LOOP flag to replace the S_Looped* sound functions.
- Restored the sound limiting.

March 24, 2008 (Changes by Graf Zahl)
- Fixed: THe handling for enum values in Xlat was incorrect. The rule with
	value assignment must set the counter one higher than the current value.
- Fixed: The definition of enums in the Xlat grammar was right-recursive
	which could create stack overflows in the parser. Made it left-recursive as
	recommended in Lemon's docs.
- Added Thomas's submissions for decal assignment to puffs and NOINFIGHTING flag.
- Reverted changes of r715 in v_collection.cpp because they broke loading
	of status bar face graphics belonging to skins.
SBARINFO update #15
- Fixed: Monospacing fonts wasn't quite correct.
- Fixed: The new mug shot code forgot to use the first arg of drawmugshot (the
	one that picks the default sprite prefix).
- Added: lowerHealthCap variable to SBarInfo, which is set to true by default.
- Added: ininventory event to SBarInfo to detect if one or two items are in (or
	not in) the player's inventory.
- Added: The ability to print global vars using drawnumber.  I need someone to
	test it though.
- Added: aspectratio command to detect what the user's aspect ratio is.
- Added: missing spacing argument to drawstring.
- Changed the sbarinfo display routine for drawnumber to not use cmd.value to
	store what it is about to display.  Now it uses a new variable.
- More conversions from DrawImage to screen->DrawTexture.  I think only the
	inventory bar drawing functions have to be changed now.

March 23, 2008 (Changes by Graf Zahl)
- Fixed: The Sequence pointer in ASoundSequenceSlot was not declared as
	a pointer and it was missing both read and write barriers.
- Fixed: The sector translators must clear unused bits because they might
	render a sector's special inoperable.
- Expanded the args for MAPINFO special actions to 32 bit integers as in
	the rest of the game.
- Fixed: The specialaction list was not copied properly when transferred
	from the defaultinfo.
- Fixed: The defaultinfo for MAPINFO wasn't cleared fully after MAPINFO
	parsing was completed.
- Made Doom-format linedef translators a map property so that it's easier
	to define replacements or extensions.

March 22, 2008
- Changed MIDI playback to not bother playing super short songs that don't
	contain enough music to fill the initial output buffers.
- Removed the read barrier around ADehackedPickup::RealPickup. If the real
	pickup is picked up, it may very well destroy itself before the dehacked
	wrapper's stubs that use it are called.
- Reverted revision 840. For a file we don't want end users to be touching,
	making DEHSUPP plain text sends out mixed messages: "Don't mess with this.
	Oh, by the way, it's plain text now to make it easier for you to edit."
	Is there some reason other than a desire to do away with binary lumps to
	make the distributed lump text?
- Added a new speakermode for Stereo + HRTF: "Headphones". This is the only
	way to get the HRTF low pass filter effect now.
- Fixed: No more than one sector could make noise at once.
- Trying out sound without varying priorities again.
- Fixed: Need to use setSpeakerMix to let 2D sounds (aka streamed music) use
	their full volume range.

March 22, 2008 (Changes by Graf Zahl)
- Added sector type translation to xlat_parser and removed the old sectorx
	lump.
- Added Line_SetTextureOffset special.
- Added 'allowprotection' keyword to terrain definitions to allow damaging
	flats that don't damage players with a radiation suit.
- Fixed: SNDINFO rolloff setting for Strife was missing.
- Added more options to Light_ForceLightning: Setting the first arg to 0
	will behave as before, setting it to 1 will create exactly one lighting
	and setting it to 2 will terminate lightning for the current level
	completely. And it will also work on maps that don't have lightning set
	in MAPINFO now.
- Added: Sector movement that causes deep water to change its height now
	will trigger associated sector actions and adjust the actor's water level.
- Fixed: The serializer for side_t::part never read the texture information
	from a savegame.
- Fixed: side_t::StopInterpolation called setinterpolation instead of
	stopinterpolation. Also moved the clearinterpolation call in
	P_SetupLevel after the P_FreeLevelData to make absolutely sure that
	nothing in there can leave an interpolator behind by accident.
- Applied Linux fixes by Jim.
SBARINFO update by Blzut3:
- Fixed: the playerclass command needed a null pointer check to prevent
	crashing on respawn.
- Fixed: Mug Shot states were not reset on respawn.
- Removed keepoffsets flag since apparently it was keeping the offsets by
	default.  The means that the only thing not affected by the offsets was using
	nullimage as a background.  Since I wasn't able to get a result I liked I'm
	going to say that if you want a black background with high res positioning
	you will have to create your own bar image.  Maybe I'll fix it some other
	time.
- Added: monospacefonts variable which allows for all of the fonts to be
	monospaced by a specified character (from their fontset of corse).
- Made SBarInfo recognize the bar names for the Strife popups but they don't
	do anything beyond that.  The names are: popuplog, popupkeys, and popupstatus.
- Started converting the drawing routine to be more flexable towards high
	resolution status bars.  (Only did one call so far.)

March 21, 2008
- Fixed: Actor-less sounds that aren't played on CHAN_AUTO should still be
	subject to channel overriding.
- Re-added priority selection based on sound usage.
- Reduced the number of virtual channels to match the number of real
	channels.
- Added customizable rolloff, including Doom's standard linear gain rolloff.
	SNDINFO commands are:
		$rolloff <sound> <min distance> <max distance>          -- linear gain (like Doom)
		$rolloff <sound> linear <min distance> <max distance>   -- linear volume
		$rolloff <sound> log <min distance> <rolloff factor>    -- logarithmic
		$rolloff <sound> custom <min distance> <max distance>   -- use SNDCURVE lump
	Anything closer than min distance is full volume and anything further than
	max distance is inaudible. Logarithmic rolloff does not have a maximum
	distance; it has a scalar that controls how quickly the volume drops off
	instead.

March 21, 2008 (Changes by Graf Zahl)
- Disabled scrolling of 3DMIDTEX textures. Due to the special needs this
	cannot work properly.
- Added new Scroll_Wall special to allow more control over wall scrolling.
	Since it uses fixed point parameters it can only be used in scripts though.
- Added flags parameters to all wall scroller specials that didn't use
	all 5 args.
- Separated scrolling of the 3 different texture parts of a sidedef.
	While doing this I did some more restructuring of the sidedef structure
	and changed it so that all state changes to sidedefs that affect rendering
	have to be made with access functions. This is not of much use to the
	software renderer but it allows far easier caching of rendering data
	for OpenGL because the only place I need to check is in the access functions.
- Added Karate Chris's ThingCountSector submission.
- Made texture indices in FSwitchDef full integers. Since that required
	some data restructuring I also eliminated the MAX_FRAMES limit of 128
	per switch.

March 20, 2008
- Removed some debug output from SBarInfo::ParseSBarInfo().
- Fixed: Heretic linetype translations included the wrong file.
- Removed all 2D sound positioning code from s_sound.cpp. Everything uses
	FMOD's 3D engine now.
- Removed all the channel selection code from s_sound.cpp. FMOD has code to
	handle this sort of thing, so let's use it.
- Replaced S_StopSoundID() with S_CheckSingular(). There is no longer a limit
	on the number of copies of a particular sound that can be playing at once,
	aside from Strife's special singular sounds. (Sorry, Heretic and Hexen.)
	Consequently, the SNDINFO $limit command is now ignored.
- Removed ATTN_SURROUND, since FMOD Ex doesn't exactly support it, and it
	only worked as intended on stereo speakers anyway.
- Cleaned out ancient crud from i_sound.cpp.

March 20, 2008 (Changes by Graf Zahl)
- Fixed: A_CustomMissile with aimmode 2 ignored spawnofs_xy.
- Changed savegame versioning so that the written version is never lower
	than the minmum one reported as compatible.
- Added mirrored movement modes for linked sectors.
- Added Eternity-style initialization for linked sectors as a new subtype
	of Static_Init.
- Added linked sectors. The control sector determines how they move but if
	any one of the linked sectors is blocked, movement for all linked sectors
	will be affected. This will allow lifts consisting out of more than one
	sector without the risk of breaking them if only one of the sectors is
	blocked.
- Fixed: A_Mushroom created an actor on the stack.

March 19, 2008
- Fixed: lempar.c needs to specify the __cdecl calling convention for malloc
	and free under VC++.
- Fixed: The source no longer built with GCC.

March 19, 2008 (Changes by Graf Zahl)
- Added a new parameter to all crushing action specials that selects
	which crushing mode is used: 0 uses the game's default for compatibility,
	1 uses Doom's mode (crushers continue to move while damaging any actors ) and
	2 uses Hexen's mode (crushers stay at blocking actor's top until they die).
	Since Generic_Crusher already used all 5 args I created a second version for
	Hexen crushing mode.
- Added PICKUP flag to DECORATE.
- Integrated xlatcc into ZDoom.exe so that the linedef translation files
	don't need to be compiled and can be stored as text in zdoom.pk3.
- Removed thingdef_specials.h and thingdef_specials.gperf and replaced
	line special definition with something that automatically gets updated
	if new specials are added.
- Added copyright/license headers to a few files.
- Fixed: ACS SetMugShotState needs to check the StatusBar pointer for the
	proper object type.
- Move SBarInfo loading code in d_main.cpp into a static method of DSBarInfo.
- Removed dobject.err from the repository. It only contained a list of compiler
	errors for some very old version of dobject.cpp.
- Fixed: A_JumpIfCloser was missing a z-check.
- Added Blzut3's SBARINFO update #13:
	- Split sbarinfo.cpp into two files sbarinfo_display.cpp and sbarinfo_parser.cpp
	- Rewrote the mug shot system for SBarInfo to allow for scripting and custom
		states for different means of death.
	- SBarInfo now loads all SBarInfo lumps instead of just the last one.  Clashing
		status bar definitions will now be cleared before the bar is read.
	- Fixed: When using transparency with bars the new drawing method (bg over fg)
		didn't work.  In the case that the border value is set to 0 it will revert to
		the old method (fg over bg).
	- Fixed: drawbar lost any high res information it was given.
	- Added: ACS command SetMugShotState(str state) which sets the mug shot state
		for the activating player.
	- Added: keepoffsets flag to drawbar.  When set the offsets in the fg image will
		also be applied when displaying the bar.

March 18, 2008
- Added a cheap pitch shifting for underwater environments that should be fairly
	close to Duke's. It sounds okay for some sounds, but others like the BFG, where
	the timing of the sound actually matters, don't sound good. I shall have to
	replace it with a real pitch shifter DSP unit.
- Removed hardware 3D sound support, since software is cooler.
- Fixed the TArray serializer declaration.
	(Thank you for your warnings, GCC! ;-)
- Changed root sector marking so that it can happen incrementally.

March 18, 2008 (Changes by Graf Zahl)
- VC++ doesn't seem to like the TArray serializer so I added a workaround
	to be able to save the 3dMidtex attachment info.
- Fixed: The TArray serializer needs to be declared as a friend of TArray
	in order to be able to access its fields.
- Since there are no backwards compatibility issues due to savegame version
	bumping I closed all gaps in the level flag set.
- Bumped min. Savegame version and Netgame version for 3dMidtex related
	changes.
- Changed Jump and Crouch DMFlags into 3-way switches:
	0: map default, 1: off, 2: on. Since I needed new bits the rest of
	the DMFlag bit values had to be changed as a result.
- fixed: PTR_SlideTraverse didn't check ML_BLOCKMONSTERS for sliding
	actors without MF3_NOBLOCKMONST.
- Added MAPINFO commands 'checkswitchrange' and 'nocheckswitchrange'
	that can enable or disable switch range checking globally per map.
- Changed ML_3DMIDTEX to force ML_CHECKSWITCHRANGE.
- Added a ML_CHECKSWITCHRANGE flag which allows checking whether the
	player can actually reach the switch he wants to use.
- Made DActiveButton::EWhere global so that I can use it outside thr
	DActiveButton class.

March 17, 2008 (Changes by Graf Zahl)
- Changed P_LineOpening to pass its result in a struct instead of global
	variables.
- Added Eternity's 3DMIDTEX feature (no Eternity code used though.)
	It should be feature complete with the exception of the ML_BLOCKMONSTERS
	flag handling. That particular part of Eternity's implementation is
	sub-optimal because it hijacks an existing flag and doesn't seem to make
	much sense to me. Maybe I'll implement it as a separate flag later.

March 17, 2008
- Fixed: The botinfo field of DCajunMaster was improperly listed as an object
	pointer.

March 16, 2008 (Changes by Graf Zahl)
- Fixed: FreshThinkers's max. index is MAX_STATNUM so the code shouldn't
	to access FreshThinkers[MAX_STATNUM+1].

March 15, 2008
- Fixed: The only time bestslideline is ever NULL is before it ever gets set.
	That means my P_BounceWall() "fix" from March 6 wasn't really a working fix.
- Fixed: If an object is flagged for euthanization while it's in the gray
	list, it should just be ignored during the propagation stage.
- After sleeping on it and realizing what was really going in, I generalized
	the inventory fix from the 13th: The actor is flagged by Destroy(), then it
	is later inserted into the thinker list by DThinker::SerializeAll(). So
	rather than unlinking the skipped player from their inventory, just make
	sure any flagged thinkers aren't inserted into a list.
- Fixed: FCanvasTextureInfo::Viewpoint needed a read barrier, and the whole
	list should serve as a root.

March 14, 2008 (Changes by Graf Zahl)
- fixed: A_PainShootSkull was missing a NULL pointer check for the spawn type.
- implemented Vavoom's vertex height things (1504, 1505) that can explicitly
	define slopes for triangular sectors. The height is specified as the thing's
	z-coordinate.

March 14, 2008
- Reimplemented SPC playback as a custom codec for FMOD.
- Removed spc_frequency, because snes_spc only supports the SPC's native
	frequency of 32000 Hz.

March 13, 2008
- Fixed: When returning to a hub map, inventory belonging to the temporary
	copies of the players stored in the archive would be destroyed and break
	apart the STAT_INVENTORY thinker list. Now they aren't destroyed while
	loading the archive but are unlinked from the inventory list instead, so
	the garbage collector will get them later.
- Changed pointer substitution to return the number of pointers changed.

March 13, 2008 (Changes by Graf Zahl)
- Fixed: Pointer substitution changed the pointers for the thinker ring list
	resulting in a freeze.

March 12, 2008
- Fixed: DACSThinker::ActiveThinker was missing a read barrier.
- Loading a save game now initiates a collection.
- Added a finalization cost to the sweep stage.
- Fixed: D_dehacked.cpp/PatchThing() allocated an actor on the stack.
- Changed the sentinels in the thinker lists into proper thinkers. The old
	way wasn't playing well with the write barriers.
- Fixed: DFrameBuffer::WriteSavePic needs to fix the canvas in place while
	using it.
- Fixed: The sound system was updated every frame, which is a complete waste
	of time. Doing it only once each tic is quite sufficient, since nothing
	really moves between tics, even if the display makes it look otherwise.

March 12, 2008 (Changes by Graf Zahl)
- Fixed: The SimpleCanvas in FCanvasTexture must be declared as a soft
	root to the garbage collector.
- Changed DObject's pointer substitution so that the pointers inside an
	object are handled by a virtual function. This allows subclasses to
	implement their own handling if they need it.
- Bumped the minimum savegame version because the current version crashes
	each time an old savegame is loaded.

March 11, 2008
- Removed lots of spc_* cvars that are no longer meaningful and changed
	spc_amp from a x.4 fixed point number to a normal float.
- Switched SPC playback from the external SNESAPU.DLL to Blargg's LGPL
	snes_spc library. I've compiled it with the fast DSP rather than the
	highly accurate one, since I didn't notice a meaningful difference between
	the two in my limited testing. In short: SPC playback is now built in to
	ZDoom. You don't need to download anything extra to make it work, and it
	also works on Linux as well as Windows (though building with Linux is
	currently untested).
- Fixed: Stereo separation was calculated very wrongly when in 2D sound mode.

March 10, 2008
- EAX is a pain in the butt to get it to work reliably. Why? I can get the
	reverb to work just fine with software, but with hardware, I hear nothing
	special at all.
- Fixed: Sounds apparently don't default to location 0,0,0 so I need to set
	that explicitly for 2D sounds in 3D mode.
- Fixed: I had forgotten to actually set the head relative flag for 2D sounds
	played in 3D.
- Fixed: Reverb was applied to digital music in software 3D mode. I tried
	turning off reverb for 2D sounds too, but that turned it off for _all_
	subsequent sounds and not that specific channel.

March 9, 2008 (Changes by Graf Zahl)
- fixed: StreamSong::SetPosition required a NULL pointer check.
- fixed: The release build still linked to the old FMOD version.
- fixed: SPCSong only works for Win32 so its definition must be excluded for Linux.

March 8, 2008
- Fixed: If you wanted to make cleandep with MinGW, you had to specifically
	specify Makefile.mingw as the makefile to use.
- Added a normalizer to the OPL synth. It helped bring up the volume a little,
	but not nearly as much as I would have liked.
- Removed MIDI Mapper references. It doesn't work with the stream API, and
	it doesn't really exist on NT kernels, either.
- Reworked music volume: Except for MIDI, all music volume is controlled
	through GSnd and not at the individual song level.
- Removed the mididevice global variable.
- Added back support for custom streams.

March 7, 2008
- I think the new FMOD Ex code should support everything the old FMOD 3 code
	did, sans custom streaming sounds.
- Removed snd_midivolume. Now that all music uses a linear volume scale,
	there's no need for two separate music volume controls.
- Increased snd_samplerate default up to 48000.
- Added snd_format, defaulting to "PCM-16".
- Added snd_speakermode, defaulting to "Auto".
- Replaced snd_fpu with snd_resampler, defaulting to "Linear".
- Bumped the snd_channels default up from a pitiful 12 to 32.
- Changed snd_3d default to true. The new cvar snd_hw3d determines if
	hardware 3D support is used and default to false.
- Removed the libFLAC source, since FMOD Ex has native FLAC support.
- Removed the altsound code, since it was terribly gimped in comparison to
	the FMOD code. Its original purpose was to have been as a springboard for
	writing a non-FMOD sound system for Unix-y systems, but that never
	happened.
- Finished preliminary FMOD Ex support.

March 6, 2008
- Fixed: If P_BounceWall() can't find a wall when it does its trace, but it
	was entered because a line blocked the projectile, then it should still use
	that blocking line for the bounce.
- The full master volume SysEx is now always sent to the MIDI device, even if
	it seems to have a working volume control.
- Renamed music_midi_stream.cpp to music_midi_base.cpp.
- Moved the WinMM MIDI code into a new container class.
- Fixed: StatusBar and screen need to be barriered, because they are roots
	but can also change at runtime.
- Fixed: Objects that are forcibly deleted outside the GC need to be removed
	from the gray list too.

March 5, 2008
- Fixed: Thinkers needed write barriers when they were removed from their
	lists.
- Fixed: DLevelScript::Link() and Unlink() needed write barriers.

March 4, 2008
- Moved the identical code between the MUS and MIDI streamers into a new base
	class so that all the low-level details of MIDI streaming are kept in
	one place.
- Converted the SMF MIDI playback to use the same MIDI streams as MUS
	playback.
- Moved MUS playback back into its own thread so that it can continue
	uninterrupted if the main thread is too busy to service it in a timely
	manner.
- Fixed: The MEVT_* values are not defined shifted into their spot for a
	MIDIEVENT, so I need to do it myself.
- Fixed: Pausing a MUS and then changing snd_midivolume caused the paused
	notes to become audible.

March 3, 2008
- Changed MUS playback to use MIDI streams, like it did during the early days
	of ZDoom, except now the entire song isn't prebuffered in large chunks, so
	I can insert MIDI events into the playback with fairly low latency. This
	should offer more precise timing than the combination of low-level MIDI and
	WaitForMultipleObjects timeouts that it replaces.
- Fixed: PTR_BounceTraverse only checked for projectiles that were too
	high to pass through two-sided lines, but not ones that were too low.
- Fixed: SBARINFO couldn't detect the extreme death damage type for the
	player face animation.

March 1, 2008 (Changes by Graf Zahl)
- fixed: A_CountdownArg used 0 based indices although all uses of it assumed
	it is 1-based.
- added MF5_DONTRIP flag.
- added CheckActorFloorTexture, CheckActorCeilingTexture and
	GetActorLightLevel ACS functions.
- added IF_ADDITIVETIME flag to create powerups that add their duration
	to the one of the currently active item of the same type.
- fixed: bouncecount wasn't decreased when bouncing on walls.
- Added MF5_ALWAYSRESPAWN and MF5_NEVERRESPAWN flags that selectively
	enable or disable monster respawning regardless of skill setting.
- Prettified deprecated flag handling.
- Fixed: When starting a level while the music has been paused S_Start has
	to stop the old music so the new one always starts at the beginning.
- Fixed:: AActor::master was not serialized.
- Fixed: Sound targets pointing to dead players should be cleared before
	respawning the player.
- Fixed: When the DONTMOVE flag is set A_Chase must not call P_NewChaseDir.
- Changed PowerupGiver initialization so that the actual powerup class is looked
	up during postprocessing.
- Gave Strife's instant death sector type its own damage type.

February 29, 2008
- Changed the default GC parameters to make it run more aggressively.
- Added NULL checks to the GC::WriteBarrier() wrappers.
- Fixed: The DObject destructor set GC::SweepPos incorrectly if it pointed
	at that object being deleted.
- Added "soft roots" to the garbage collector. These are similar in
	purpose to setting the OF_Fixed bit, but they behave as full-fledged roots
	as far as the collector is concerned, so any objects reachable through
	them will not be collected.
- Added support for the OF_Fixed bit. This is ONLY for simple objects which
	do not contain pointers to other objects, because all it does is prevent
	an object that is otherwise dead from being freed. It does not include
	the object in the propagate stage if it is unreachable, so any objects
	that are only reachable through it will still be freed unless they are
	also fixed.
- Fixed: R_SetupAddClampCol() checked add4cols' memory instead of
	adclamp4cols' memory when deciding if it should skip modification.

February 28, 2008
- Fixed: The colormap changes by column, so the assembly rt_* routines need
	to be setup for every column group, not once per image.
- Fixed: rt_Translate1col() had a couple of bugs.

February 27, 2008
- Added assembly versions of rt_add4cols and rt_addclamp4cols.
- Added a read barrier to FArchive::SerializeObject() to make sure that
	objects that are being euthanized are not stored in the archive.

February 26, 2008
- Added an assembly version of rt_shaded4cols, since that's the main decal
	drawing function. The most improvement came from being able to turn some
	constant variables into immediate values with self-modifying code, but I
	also managed to reorder it to make it a little faster. It's about 9% faster
	than VC++'s code and 19% faster than GCC's code. That's not a huge
	improvement (for VC++), but at least it's measurable.
- Removed the solid fill "optimization" from rt_shaded4cols(), because in my
	testing, it didn't help any and in fact, hurt just a little bit.
- In the name of simplification, all the rt_tlate* drawers were changed to do
	the translation in one step and the drawing in another. This lets me call
	the untranslated drawer to do the real drawing instead of mostly duplicating
	them. Performance wise, there is practically no difference from before.
- Fixed: Using +stat from the command line caused a crash.
- More write barriers and pointer declarations. Here are rules I've come up
	with so far for when write barriers can be ommitted:
	* Initializing pointers for a newly created object: A new object can never
		be black, so none of its pointers that get set by the constructor (or code
		just following its creation) need to be  behind write barriers.
	* Creating a new thinker and storing it in a pointer: The thinker
		constructor already puts it behind a write barrier when it links it into
		the thinker list, so you don't need to do it again.
	* As a corollary of the above: No pointers to thinkers should need to be
		behind write barriers, because it is incorrect to have a thinker that is
		live but not in a thinker list. I realized this while I was going through
		the long list of actor target references, so there are some write barriers
		for those in place already, since they don't hurt to have them around.
	As a consequence of the last point, I think I'm done placing write barriers
	in all their necessary places without even touching most of the code. I'm
	going to let it sit like this for a few days to see if I can think of a
	counter-example where a live thinker wouldn't be in a thinker list, but it
	feels correct to me right now.

February 25, 2008 (Changes by Graf Zahl)
- Fixed: The DECORATE expression evaluator's random function could produce
	incorrect results for ranges > 255. Changed so that FRandom's default
	implementation is used instead.

February 24, 2008
- Fixed: DDecalFader::Tick() still referenced TheDecal even after destroying
	it.
- Added write barriers around the thinker list insertions in dthinker.cpp.

February 23, 2008 (Changes by Graf Zahl)
- Fixed: AWeaponPiece didn't declare its FullWeapon pointer as such.
- Fixed: Hexen's random player class skill menu was missing the '$' indicating
	a string table identifier.
- Fixed: DCorpsePointer::Serialize didn't call the super method.

February 22, 2008
- Moved DSeqNode's and its children's destructor code into their Destroy()
	methods.
- Moved DSectorEffect's destructor code into a Destroy() method.
- Changed the myoffsetof definition to match DECLARE_POINTER's because GCC
	started complaining about its use in p_setup.cpp, though I'm not sure why.
- Added a pointer list to DACSThinker so that the collector can find scripts
	instead of thinking they're all dead.
- Added read barriers to sector_t's pointers.
- Used the HAS_OBJECT_POINTERS macros to locate places to place TObjPtrs to
	form read barriers.

February 21, 2008
- Fixed: DThinker::SerializeAll() did not serialize any thinkers in the
	FreshThinkers lists. These thinkers would still be saved in the savegame if
	there were other references to them, but they would not go in any thinker
	lists when loading the savegame. An easy way to exercise this bug is to
	give yourself something new with the console and then save the game right
	away without closing the console by using the "save" command. The item
	would be stored in the savegame thanks to its presence in the Inventory
	list, but it wouldn't be in a thinker list when the game was reloaded
	because it was still in the FreshThinkers list when the game was saved.
- Fixed: PO_Busy() did not check for a NULL return from GetPolyobj().
- Fixed two problems with printfs from the net controller stuff: one of them
	is totally valid, and the other is GCC not being as nice as VC++.
- Fixed: The case for defining SAVESIG when SVN_REVISION_NUMBER == 0 did not
	work for GCC (and presumably VC++, though I never ran into that case with
	it) because it tried to stringify something that wasn't a macro argument.

February 20, 2008
- Changed the DHUDMessage deletions into destroys.
- Added read barriers to the pointers inside AActor.
- Split the AActor::LastLook union into its constituent parts.

February 20, 2008 (Changes by Graf Zahl)
- Added a modified version of Karate Chris's submission for killing specific
	monsters with the 'Kill' ccmd.

February 19, 2008
- Added a rough initial garbage collector, based largely on Lua's. There are
	no write or read barriers in place yet, so it's not a very close
	approximation of the pointer cleaning code that was in place before, but it
	does collect stuff. But guess what! Nuts.wad ran at 1-2 FPS before. Now
	it's way, way more and easily stays above 35 FPS. The performance hit when
	the GC is running is pretty minimal compared to the old way, which was in
	many ways like a full garbage collection every tic.
- Changed the status bars into DObjects.
- Fixed: FBaseStatusBar::Tick() deleted hud messages instead of destroying
	them.
- Changed the global Args object to a pointer to one.
- Changed several DArgs deletions into destroys.
- Removed DBoundingBox from the DObject hierarchy.

February 18, 2008
- Added vid_refreshrate cvar to override Windows' automatic refresh rate
	selection.
- Singleplayers maps using allowrespawn now filter respawn inventory like
	coop games, since that's essentially what they are.
- Fixed m_alloc.cpp compilation on Linux.

February 18, 2008 (Changes by Graf Zahl)
- Applied Blzut3's sbarinfo update #12:
* When the drawbar code was optimized border was accidently used as how many
	pixels to reserve from the background instead of the foreground.  I've
	reversed how the code works (bg over fg instead of fg over bg).
* Added armorclass to drawnumber.
* Added an interpolateArmor variable which acts just like interpolateHealth
	except the effect is applied to armor.
* Added armor flag to drawgem since we can interpolate armor now.
* Added a reverse flag to drawgem.
* Fixed drawgem didn't allow for '|' to separate the flags.

- Fixed: Menu texts for skill definitions unconditionally interpreted
	the given text as an index into the string table.

February 16, 2008
- Fixed AInventory::PickupFlash setting with GCC.
- Fixed: The MusicVolumes list was allocated with M_Malloc but freed with
	delete.
- Fixed: demobuffer was inconsistantly handled with new[]/delete[] and
	malloc/free.
- Added used memory tracking to M_Malloc() and M_Realloc(). This
	necessitated the addition of an M_Free() call to track frees.
- Removed M_Calloc since it was only used in one place, and can just as well
	be done with an M_Malloc/memset pair.
- Bumped DEMOGAMEVERSION for the new net controller codes.

February 16, 2008 (Changes by Graf Zahl)
- Added patch by Karate Chris:
	- The net arbitrator can add or remove players to an access list so they
		can or cannot control game settings:
	* net_addcontroller <player number> - Adds a player to the control list.
		Only net arbitrators have access to this command.
	* net_removecontroller <player number> - Removes a player from the control
		list. Only net arbitrators have access to this command.
	* net_listcontrollers - Lists the players who are able to control the game
	 settings.
	- Fixed: The 'Printf' occurrences in the 'addplayerclass' console command
		were all missing a '\n' at the end.
	- Enhanced the 'playerinfo' console command so more information about each
		setting is shown.
- Added customizable pickup flash.
- Added option to show shorter messages for save game and screenshot confirmation.
	Also added this to the 'Messages' menu.

February 14, 2008
- Version bump to 2.2.0.
- Disabled console alpha when the console is fullscreen.
- Re-enabled maybedrawnow for the software renderer. This should be replaced
	with a different progress bar implementation at some point that can work
	with hardware graphics.

February 14, 2008 (Changes by Graf Zahl)
- Added Karate Chris's patch for 0-tid == activator in action specials
	Thing_SetSpecial and Thing_SetTranslation.
- -moved BUG_FORUM_URL to version.h

February 13, 2008
- Removed most checks on vid_hw2d/test2d. This now gets checked only once per
	frame to avoid the remote possibility that it could change during the middle
	of drawing the frame and cause strange things to happen.
- Renamed test2d to vid_hw2d.

February 12, 2008
- Added the ACS script type "return". These are executed by players who return
	to a map they've previously been to. This is analagous to enter scripts, but
	whereas enter scripts execute only the first time a player enters a map,
	return scripts execute all but the first time.
- Improved map scrolling when rotation is on and follow mode is off.

February 11, 2008
- Fixed: Turning off follow mode with automap rotating enabled did not
	function in an easy-to-understand manner.
- Fixed: D_AddWildFile() blindly assumed that all matches were files.
- Added back the dead player check to CheckIfExitIsGood(), but now it
	applies only if the next map is part of the same hub. Otherwise, you can
	still exit the map while dead.
- Removed the SpawnedPuff global variable and made it a return value from
	P_LineAttack().
- Fixed: P_SpawnPuff() played sounds for temporary puffs.

February 9, 2008
- Fixed: G_StartTravel() inadvertantly removed players' TIDs.
- Modified FLAC/share/alloc.h to define SIZE_T_MAX if it isn't defined
	already. For some reason, a stock install of MinGW doesn't define it, but
	if you compile your own GCC, it installs headers that do.
- After thoroughly messing up my MinGW/MSYS installation, I deleted the whole
	thing and reinstalled everything using the latest zips. Much to my surprise,
	the MSYS-detection in the makefiles no longer worked because OSTYPE wasn't
	being exported to process launched by the MSYS shell. I've now switched to a
	different method I found through the power of Google that asks the shell
	what version it is to see if the version string contains "msys".

February 8, 2008
- Applied Blzut3's sbarinfo update #11:
	* SBarInfo will also accept a '|' between flags for those who are really
		bothered by the indefinite "arguments" in the middle of the statement.
	* Added: completeBorder. When set to true SBarInfo will draw the border where
		the status bar normally goes.
	* Fixed: I forgot to accept TK_None on "base" and "statusbar".
	* Fixed: "base" was apparently broken when the SBarInfo init code was moved to
		d_main.cpp. Also, if "base Strife" was used then it would not use the
		default log message of "find help".
- Fixed: D_ReadUserInfoString() parsed the final element of a compact string
	as the empty string. Since that was the player class, this meant that any
	games with more than one class would pick a random class in multiplayer.
- Fixed: FCanvasTexture::RenderView() should not have color 0 in its output.

February 5, 2008
- Updated the GCC-targeted makefiles to turn off two optimizations that cause
	fmopl.cpp to compile incorrectly: tree-dominator-opts and tree-fre
- Fixed: Morphed pig and chicken players made normal human *usefail sounds.
- G_DoSaveGame() now receives the filename and description from its arguments
	rather than global variables, so autosaves and manual saves can be done
	in close proximity to each other without overwriting the parameters for
	one of them.
- Fixed potential buffer overrun in G_SaveGame() and added a check so that
	you can't interfere with saves that are still pending.
- Fixed: P_LineAttack() creates temporary puffs to get damage types, but this
	had the side effect of creating particles for the puff.
- Fixed: The Heretic status bar tried to use the graphic "SELECTBOX" for the
	inventory selector. The correct name is "SELECTBO".
- Fixed: Using allowrespawn for a single-player map would fire off enter
	scripts instead of respawn script because the player wasn't assigned the
	state PST_REBORN.
- Fixed: P_CheckMissileSpawn() now passes the BlockingMobj to
	P_ExplodeMissile() so that it can select the appropriate death state.
- Added the manifest to MinGW-compiled builds of updaterevision so you can
	build under Vista with MinGW without needing administrative privileges.
	(But I still want to know why Vista thinks it needs elevated privileges
	without a manifest telling it otherwise.)
- Using four 0xFF bytes for the final note of an IMF song should signal the
	end of the song.

February 4, 2008
- Applied a modified version of Karate Chris's screenshot naming patch.
- Sbarinfo optimization: Creating and destroying bar textures every frame is
	a relatively expensive operation. We can skip the custom texture entirely
	and just draw the bars directly to the screen, using the clipping parameters
	for DrawTexture(). This also means bars are no longer limited to the game
	palette, and the bar itself has the same resolution as the screen.

February 2, 2008
- Removed support for numeric flags from sbarinfo's drawmugshot command since
	it was previously declared unrecommended and deprecated.
- Added Blzut3's sbarinfo update #10:
	* Fixed: drawmugshot now adjust to the player's max health like it should.
	* drawgem can now accept negative paddings.
	* Added: You can now specify a border on drawbar which will reserve x
		amount of pixels on each side of the fg image.
	* Added: weaponammo command which allows for determining what kind of ammo
		the current weapon uses.
	* Added: Drawkeybar to SBarInfo

January 31, 2008 (Changes by Graf Zahl)
- Fixed: The STYLEF_Alpha1 flag intended for STYLE_Normal was set for STYLE_Fuzzy.
- Fixed: The render style table for old decorations was missing STYLE_Stencil so
	STYLE_Translucent was mapped incorrectly.

January 30, 2008 (Changes by Graf Zahl)
- Added support for AttackZOffset to P_RailAttack.
- Fixed: ParseDrawTextureTags read DTA_RenderStyle as ERenderStyle, not FRenderStyle.

January 29, 2008
- Added pixel-doubled and -quadrupled screen modes to D3DFB so that users with
	recent NVidia drivers can still use resolutions below 640x480, since NVidia
	saw fit to remove all support for them.

January 27, 2008 (Changes by Graf Zahl)
- Added a PrecacheTexture virtual function to DFrameBuffer because it's the
	renderer which should decide how to precache a texture.
- Added SnowKate709's APROP_MaxHealth submission.
- Fixed: FTexture::GetScaledWidth/Height always rounded down which could result in
	imprecisions (e.g. when scaling from 128 to 96.)
- added a mastervolume CVAR for Timidity because for me its output is considerably
	louder than everything else.
- reverted removal of AddPatch call in crosshair initialization.
- Modified makewad.c so that it doesn't write file names with '[]^' to the
	dependency file. Apparenly make can't handle these names and an incomplete
	list is still better than something that doesn't work at all.
- Changed license for r_data.cpp because there isn't anything of id's original
	code left in that file.
- Cleaned up r_data.cpp.
- Fixed: FTextureManager::FindTexture should not print error messages if it
	doesn't find the texture.
- Added Karate Chris's patch for fixing Strife quit messages.

January 26, 2008
- Added preloading of fonts to reduce the chance that characters from a single
	font will require more than one hardware texture to display.
- Fixed: P_RailAttack() crashed if you didn't specify a puff for a rail.
- Decided that allowing arbitrary alpha values for color remaps isn't so hot.
	Changed it back the way it was.

January 26, 2008 (Changes by Graf Zahl)
- Got rid of most TexMan.AddPatch calls because they are no longer needed.
- Got rid of R_InitPatches because the new texture init code needs to preload
	everything to work correctly.
- Rewrote texture manager initialization to order textures primarily by WAD
	rather than by type. This way later textures will always override earlier
	ones. The only exception is that TEX_MiscPatch are only used as a fallback
	if nothing else can be found.
- Optimized the tryany case of FTextureManager::CheckForTexture. It is not
	necessary to scan the hash chain twice. The required information can be
	retrieved during the first pass as easily and even offers a little more
	control.
- Made FFont destructor virtual.
- Added 'Ice' translation to DECORATE.
- Added Karate Chris's patch for teamplay MAPINFO option.
- Added Karate Chris's patch for custom damage color per player class.
- Added Karate Chris's patch for respawnlimit skill property.
- Added Karate Chris's patch for Strife quit messages.
- Fixed: P_RailAttack ignored the puff's damage type.
- Fixed: ACS used incompatible values for APROP_RenderStyle. It needs to use
	the exact same values as previous ZDoom versions
- Added a DECORATE 'stencilcolor' property so that the stencil render style
	can be used.
- Added some NULL pointer checks to the font loading code.

January 25, 2008
- Undid some of the changes from lempar.c v1.30->v1.31, because it broke
	error handling.
- Fixed: dehsupp/scanner.re defined "}" as the token RPAREN. dehsupp/parse.y
	also defined action_list_def as needing a RBARCE. I'm surprised it worked
	at all before. I guess Lemon really was too accepting. I have verified that
	the lump it outputs is unchanged from before.
- Changed the way that xlatcc handles include statements so that I don't need
	to modify the logic of lempar.c. I also discovered that the grammar was
	improperly defined and only accepted the first statement. It worked before
	because Lemon used to accept multiple times before reaching the EOF token.
	I have also verified that it is still generating the proper lumps.
- Removed some unused wadsrc files from the repository.
- Fixed my re2c upgrade.
- Back to lemon.c v1.53 now. The bad change was v1.51: "Changes lemon so
	that the generated parser does not accept prior to seeing the EOF token."
	This seems like a valid change, which means I need to rethink my strategy
	for handling include statements, since this change breaks what I was
	doing before.
- Lemon is now producing parsers that don't accept anything, so I'm going
	back to v1.43 and trying each intermediate version to see where things
	went wrong.

January 24, 2008
- Updated Lemon to its latest versions as of today.
	(lemon.c: v1.53, lempar.c: v1.31)
- Added .txt files to the list of types (wad, zip, and pk3) that can be
	loaded without listing them after -file.
- Fonts that are created by the ACS setfont command to wrap a texture now
	support animated textures.
- FON2 fonts can now use their full palette for CR_UNTRANSLATED when drawn
	with the hardware 2D path instead of being restricted to the game palette.

January 23, 2008
- Fixed: Toggling vid_vsync would reset the displayed fullscreen gamma to 1
	on a Radeon 9000.
- Added back the off-by-one palette handling, but in a much more limited
	scope than before. The skipped entry is assumed to always be at 248, and
	it is assumed that all Shader Model 1.4 cards suffer from this. That's
	because all SM1.4 cards are based on variants of the ATI R200 core, and the
	RV250 in a Radeon 9000 craps up like this. I see no reason to assume that
	other flavors of the R200 are any different. (Interesting note: With the
	Radeon 9000, D3DTADDRESS_CLAMP is an invalid address mode when using the
	debug Direct3D 9 runtime, but it works perfectly fine with the retail
	Direct3D 9 runtime.) (Insight: The R200 probably uses bytes for all its
	math inside pixel shaders. That would explain perfectly why I can't use
	constants greater than 1 with PS1.4 and why it can't do an exact mapping to
	every entry in the color palette.
- Fixed: The software shaded drawer did not work for 2D, because its selected
	"color"map was replaced with the identitymap before being used.
- Fixed: I cannot use Printf to output messages before the framebuffer was
	completely setup, meaning that Shader Model 1.4 cards could not change
	resolution.
- I have decided to let remap palettes specify variable alpha values for
	their colors. D3DFB no longer forces them to 255.

January 22, 2008
- Updated re2c to version 0.12.3.
- Fixed: A_Wander used threshold as a timer, when it should have used
	reactiontime.
- Fixed: A_CustomRailgun would not fire at all for actors without a target
	when the aim parameter was disabled.
- Made the warp command work in multiplayer, again courtesy of Karate Chris.
- Fixed: Trying to spawn a bot while not in a game made for a crashing time.
	(Patch courtesy of Karate Chris.)

January 21, 2008
- Removed some floating point math from hu_scores.cpp that somebody's GCC
	gave warnings for (not mine, though).
- Fixed: The SBarInfo drawbar command crashed if the sprite image was
	unavailable.
- Fixed: FString::operator=(const char *) did not release its old buffer when
	being assigned to the null string.
- The scanner no longer has an upper limit on the length of strings it
	accepts, though short strings will be faster than long ones.
- Moved all the text scanning functions into a class. Mainly, this means that
	multiple script scanner states can be stored without being forced to do so
	recursively. I think I might be taking advantage of that in the near
	future. Possibly. Maybe.
- Removed some potential buffer overflows from the decal parser.

January 18, 2008
- Applied Blzut3's SBARINFO update #9:
	* Fixed: When using even length values in drawnumber it would cap to a 98
		value instead of a 99 as intended.
	* The SBarInfo parser can now accept negatives for coordinates. This
		doesn't allow much right now, but later I plan to add better fullscreen
		hud support in which the negatives will be more useful. This also cleans
		up the source a bit since all calls for (x, y) coordinates are with the
		function getCoordinates().
- Added support for stencilling actors.
- Added support for non-black colors specified with DTA_ColorOverlay to the
	software renderer.
- Fixed: The inverse, gold, red, and green fixed colormaps each allocated
	space for 32 different colormaps, even though each only used the first one.
- Added two new blending flags to make reverse subtract blending more useful:
	STYLEF_InvertSource and STYLEF_InvertOverlay. These invert the color that
	gets blended with the background, since that seems like a good idea for
	reverse subtraction. They also work with the other two blending operations.

January 17, 2008
- Added subtract and reverse subtract blending operations to the renderer.
	Since the ERenderStyle enumeration was getting rather unwieldy, I converted
	it into a new FRenderStyle structure that lets each parameter of the
	blending equation be set separately. This simplified the set up for the
	blend quite a bit, and it means a number of new combinations are available
	by setting the parameters properly.

January 16, 2008 (Changes by Graf Zahl)
- Fixed: The StatusBar pointer was not NULLed after being deleted.

January 15, 2008
- Plugged more leaks in SBARINFO.
- Spawned actors that have MF2_DORMANT set in their default instance now have
	Deactivate() called on them immediately after spawning.

January 15, 2008 (Changes by Graf Zahl)
- Fixed: Skip_Super didn't clear the current state label list.

January 14, 2008
- Fixed: ACS translations were loaded into the wrong slot after restoring a
	savegame.
- Fixed exploit: Dropping ammo at baby and nightmare skill levels would give
	you back more than you dropped.

January 13, 2008 (Changes by Graf Zahl)
- Moved A_Punch from Inventory to Actor. Apparently there are WADs that use it
	for monsters. The function works fine for monsters as it is.

January 12, 2008
- Applied Blzut3's SBARINFO update #8:
	* Fixed: Drawbar had a few memory leaks.
- Applied Blzut3's SBARINFO update #7:
	* Added drawstring to SBARINFO.
	* Added animatedgodmode flag to drawmugshot, also changed the flags to use the
		standard named arguments instead of numbers.  The old way is considered
		deprecated.
	* Added kills, monsters, items, totalitems, secrets, and totalsecrets to
		drawnumber.  Drawbar can also use kills, items, and secrets.
	* Added weaponicon to drawimage which will display the inventory.icon of the
		currently selected weapon.
	* Fixed: I apparently forgot to add the "rampage" face to drawmugshot.

January 12, 2008 (Changes by Graf Zahl)
- Moved renderer dependent part of savegame pic creation into DFrameBuffer
	as a virtual function so that it can be overridden.
- Fixed: M_SaveBitmap::prior was too small. It must be 3 bytes per pixel,
	not 1.
- Replaced INVGEM** graphics with PNG versions so that they have the
	correct colors when used on the AltHUD in Strife.

January 11, 2008
- Added support for 24-bit screenshots, so now accelerated 2D screenshots
	can work.
- Tweaked the box splitting algorithm for packed textures to hopefully
	produce less wasted space.
- For compatibility with the software renderer, D3DFB::DrawTextureV needs to
	truncate the coordinates to integers before sending them to the hardware.
	Otherwise, there can be one pixel gaps compared to the software renderer,
	because the hardware is rounding to nearest but the software renderer is
	simply truncating the fractional part of the coordinate. This is the real
	cause of the gap above the status bar at 1152x864 (and another gap to the
	left of the status bar at 800x500).
- Fixed: When D3DFB::DrawTextureV had to clip a tile, it adjusted the
	texture coordinates erroneously, still using the old calculations from
	before texture packing was implemented.
- Moved thingdef_codeptr.cpp into thingdef/ with the other thingdef files.

January 11, 2008 (Changes by Graf Zahl)
- Added Skulltag's pickup sprite and related information to the pistol. This
	will also double as the pistol's icon in the AltHUD.
- Added a generic log display that can show Strife's log messages in all games
	regardless of the current game, active status bar and HUD mode.
- Added GZDoom's alt HUD.

January 10, 2008
- Fixed: After loading a savegame, G_UnSnapshotLevel() destroyed the
	unmorphed versions of players because it thought they were extras.
- Fixed: Weapon positions were only adjusted in 1280x1024 if the status
	bar was hidden.
- Fixed: If you died in co-op and somebody else ended the map before you
	respawned, you would start the next map with only default inventory, no
	matter what dmflags was set to.
- Applied Karate Chris's TEAMINFO logo patch.

January 10, 2008 (Changes by Graf Zahl)
- Moved the code that renders the view from D_Display into a virtual function
	of the frame buffer so I can get rid of the last remaining renderer check
	outside the display code in GZDoom.
- made V_SetResolution a virtual function in IVideo. It's probably not a perfect
	solution but at least it allows overriding it (which I need in GZDoom.)
	Note: There's a lot of redundancy between hardware.cpp/h in the SDL and Win32
	folders so some cleaning up might be a good idea.
- defined a constant for the crosshair menu entry's index to get a direct
	reference out of the function code. In GZDoom the menu contains different
	information.
- Fixed: The BrainExplosions should not perform any collision detection. To
	achieve this their Damage value must be set to 0 when being spawned.

January 9, 2008
- Added Blzut3's SBARINFO update #6:
	* Fixed: A tutti-frutti like effect would occur if transparent images were
		used in bars.
	* Fixed: drawswitchableimage didn't count having 0 of an item as not having
		the said item.
	* Added alwaysshowcounter flag to both drawinventorybar and
		drawselectedinventory.
	* Added armoricon image type to drawimage.
	* Added low-on secondary coloring and high-on coloring to drawnumber.
- Added texture packing to D3DFB so that textures that are temporally related
	can share the same hardware texture. This greatly reduces the number of
	DrawPrimitive calls that need to be made when drawing text (or any 2D
	graphics in general), so now hardware text is much faster than software text
	all around. (As an example, one scenario went from 315 fps to over 1635 fps
	for hardware, compared to 540 fps for software.)
- Fixed: The mouse was being grabbed in windowed mode again.
- Modified M_DrawFrame() and R_DrawTopBorder() so that they call FlatFill() to
	draw the edges of the frames. This at least seems a bit faster for hardware
	2D.
- Implemented FlatFill() for D3DFB. It seems to be exactly as fast as the
	default implementation that just calls DrawTexture() to tile the pieces onto
	the screen, so I'm not sure it was worth the bother.
- Merged the separate line and quad vertex buffers in D3DFB back into a single
	vertex buffer, made line batching automatic, and added an index buffer for
	use when batching quads. The index buffer actually offered more of a
	performance boost than simply batching the quads alone did.

January 9, 2008 (Changes by Graf Zahl)
- Added a safety check to savegame versioning so that an invalid revision
	(reported as 0) will be handled without breaking savegame compatibility.
- Fixed: 'Painchance' in DECORATE failed when reading custom damage type names.
- Added Karate Chris's patch for menu opening console commands.

January 8, 2008
- Fixed: When starting a teamplay netgame, players who did not specify a team
	were not informed about which team they ended up joining.
- Added Skulltag's DF2_SAME_SPAWN_SPOT flags.
- Fixed: DF2_YES_DEGENERATION was pretty much guaranteed to go out of sync
	because it used gametic for timing.
- Added DoubleAmmoFactor as a skill property for the DF2_YES_DOUBLEAMMO flag.
- Renumbered the dmflags2 entries to match Skulltag's again.
- Added Karate Chris's infinite inventory patch.

January 7, 2008
- Added support for user-defined crosshairs in the Display Options menu. See
	xhairs.txt in zdoom.pk3. It's pretty simple.
- Fixed: P_BounceWall() cannot assume that BlockingLine is the line the actor
	should bounce off of. Since the order lines in a blockmap cell are checked
	for collision is essentially undefined, there could be another line closer to
	the actor that it should bounce off of instead.
- Fixed: Thing_SetTranslation still used a 16-bit word to hold the translation.
- Bumped the maximum resolution up to 2560x1600.
- Fixed: DCanvas::DrawTexture() only expanded virtual screen sizes for widescreen
	resolutions but left 5:4 modes alone. This fix neccessitated the addition of
	DTA_Bottom320x200 for the status bar to use so that it could be flush with the
	bottom of the screen rather than sitting slightly above it.
- Fixed: FConfigFile::ReadConfig()'s definition of whitespace was too broad.
- Fixed: Defining custom translation ranges in descending order and/or with gaps
	made for crashes.

January 7, 2008 (Changes by Graf Zahl)
- Added fix for Heretic IDKFA cheat by Karate Chris.
- Added fix for Strife's AlienSpectre obituary by Karate Chris.

January 6, 2008 (Changes by Graf Zahl)
- Re-converted icebreak.flac because the old version apparently didn't work.
- Added SBARINFO update #5 by blzut3:
		- Fixed: Playerclass still didn't work due to comparing of improper numbers.
		- Fixed: The arrows on drawinventorybar had a hard coded location instead of
			relative to the specified coordinates.
		- Added noarrows flag to drawinventorybar to remove the blue arrows drawn when
			there are more items to the left or right of the viewable bar.
		- Added forcescaled flag to the statusbar command.  This is ignored on the
			inventory and inventoryfullscreen types.
- Added obituary fix for Strife peasants by Karate Chris.
- Added fix for loading during demo playback by Karate Chris.
- Added scoreboard fix by Karate Chris.
- Added teamgame fix for menu by Karate Chris.
- Added GZDoom's Sector_Outside sector type which forces outside fog
	regardless of ceiling texture.

January 6, 2008
- Fixed: Since the minimum size for a texture is 2x2, FBarShader can't use
	a one-dimensional texture.
- Added back the code to allow some variation to the players' shades when
	players are on teams.
- Set TEAM_None back to 255. Since a player's team has already been accessible
	through ACS, needlessly redefining this is a bad thing to do, since it can
	break existing maps. 255 different teams should still be more than enough.
- Fixed: At certain resolutions, there was a one pixel row between the status
	bar and the rest of the screen, thanks to rounding error.
- Added automatic batching of quads to D3DFB. Screens with a lot of text are
	ever-so-slightly faster now, though still only about half the speed of
	sofware-only text. I suppose the only way to see a marked improvement is
	going to be by stuffing multiple glyphs in a single texture.
- Fixed: Crosshairgrow's animation was not framerate-independent.

January 5, 2008 (Changes by Graf Zahl)
- Added: Automap markers are stored in savegames now. Also moved the call
	to AM_LevelInit to its proper place in G_DoLoadLevel, right after
	the call to P_SetupLevel to make it work as intended.
- Changed savegame versioning to use the SVN revision number instead of
	an arbitrarily defined value. This reduces the amount of relevant values
	that have to be defined in version.h to 1 (the minimum compatible savegame
	version) instead of previously 3.

January 4, 2008
- Fixed: FBarShader::PrepareShader() set a member variable to point at a
	local variable just before returning. Then I made some more changes so that
	it can be a properly functioning texture. After doing that, I decided to
	rewrite the texture generation to be easier for me to read and hopefully
	faster, since this thing is getting generated every frame. (Please don't
	hurt me if I got it wrong. I'm basing this on the description in the wiki,
	since I couldn't wrap my head around what the code was doing by looking
	at it.) Then I realized that there's really no reason to have more than four
	of these ever, and they can be statically generated, so I simplified it some
	more.
- Added Blzut3's latest SBARINFO patch:
 * Fixed a massive memory leak in SBARINFO. The leak also lead to progressive
	 CPU usage.
 * Fixed: Playerclass didn't work in SBARINFO.
 * Fixed: Artiflash was improperly initialized causing it not to display the
	 first time.
 * Changed the variable SBarInfoScript to be a pointer to prevent more memory
	 leaks.

January 4, 2008 (Changes by Graf Zahl)
- Removed the patches for the Doom/Heretic E1 intermission screens from
	R_InitPatches. This isn't needed anymore because all these are loaded through
	an intermission script.
- Fixed: A_SpawnDebris read the third and fourth arguments from the first one's
	address.

January 3, 2008
- Moved the pixel shaders' color information out of the constant registers
	and into the vertex data.
- Added functions for doing line drawing with Direct3D, including a new pair
	of functions to do batched line drawing so that the map can actually be
	drawn faster in hardware than in software (instead of an order of magnitude
	slower).

January 2, 2008
- Tried adding bilinear filtering support for paletted textures, but the
	shader seems to be producing crappy output, so it's disabled for now.
	Specifically, it produces distorted output at regular intervals for
	textures that aren't power-of-2-sized, and it's still doing visible
	filtering when the texture is rendered at its original size, so
	obviously it's not doing something right.
- Fixed the use of power-of-2-sized native textures for smaller game
	textures again.
- Fixed: D3DFB did not restore all the state it needed to after resetting
	the device.
- Fixed: R_DrawTopBorder() must clip itself around the 3D view, since it's
	now drawn later.
- With full software rendering, palette flashes once again affect the whole
	screen.

January 1, 2008
- The mouse is no longer grabbed at all unless you're actually in a level,
	since I couldn't think of any reason why it should be grabbed at any other
	time. (This only applies to windowed mode, where it makes sense to let the
	OS have control of the pointer.)
- Moved the view border drawing into the 2D mode part. When using Begin2D()
	now, the only part of the software buffer that gets updated to the screen
	is the part with the actual 3D scene and only if you tell it to.
- Fixed a D3D memory leak on every frame in windowed mode and the same thing
	for the screen wipes. Note to self: If it's an interface, be sure to
	Release it, because it will be AddRef'ed before being returned to you.
- Moved the BlendView() call out of DBaseStatusBar::Draw() so that it can be
	applied before copying the 3D scene to the screen underneath the 2D parts.
- Restored the console's darkening level to its old table-based amount.
- Fixed D3DFB::SetColorOverlay()'s incorrect calculations.
- Fixed the D3D screen wipes for letterboxed modes.

January 1, 2008 (Changes by Graf Zahl)
- Fixed: A_JumpIfTargetInLOS had inconsistent parameter definitions.

December 31, 2007
- Removed the screenshot parameter from D_Display(), since it was a relic of
	a long-abandoned experiment to write directly to video memory instead of
	to a temporary buffer in system memory.
- Added Direct3D versions of the melt and burn screenwipes.
- Fixed the strip sizes for the melt screenwipe to match what Doom would have
	produced on a 320x200 screen, rather than producing more, thinner strips
	for wider screens.

December 29, 2007
- Started writing Direct3D-friendly wipe code. It's just a Q&D crossfade for
	now.

December 29, 2007 (Changes by Graf Zahl)
- Changed the FStatusBarTexture for Doom so that it can create a true color
	image.

December 28, 2007
- Fixed position of the Doom HUD selectbox as per SnowKate709's guidance.

December 28, 2007 (Changes by Graf Zahl)
- Changed FImageCollection so that it accepts a matching texture of any type.
	This is necessary to load hires sprite replacements for certain icons.
- Added a check to Wads.CheckNumForName to return -1 for names longer than
	8 characters which contain path separators.
- Fixed: Hires texture replacement must replace all matching textures, not
	just the first one found. This is particularly important for icons based
	on sprites.
- added a con_alpha CVAR to set the console's translucency.
- Added MartinHowe's submission for A_CustomBulletAttack aimfacing parameter.
- Added MartinHowe's submission for A_PlaySoundEx attenuation parameter.
- Fixed: Bots shouldn't target friendly monsters.
- Fixed a typo in sbarinfo.cpp (noatribox instead of noartibox.)

December 27, 2007
- Fixed cases where a larger power-of-2-sized native texture had to be
	allocated. (I wonder if D3D actually handles this automatically when you use
	D3DPOOL_MANAGED, because I'm pretty sure my laptops's x300 doesn't support
	non-power-of-2 texture sizes, yet it worked just fine before.)
- Fixed vertical positioning of 2D elements in letterboxed modes.
- Removed DCanvas::Blit(), as it's no longer used.
- Added a function to create a texture from a stand-alone PNG file. The save/
	load menus now use this to get their thumbnails.

December 27, 2007 (Changes by Graf Zahl)
- Fixed: DFrameBuffer::CopyPixelData copied data as RGBA instead of BGRA.
- Temporarily changed FPNGTexture and FDDSTexture to always create True Color
	native textures to preserve the original colors.
- Darkened the console background a little after finding out that on
	very bright title pics it became quite hard to read the console's contents.
- Fixed: PROP_Translation needed to be changed for the new value format.
- Added GZDoom's MAPINFO fog parameters as no op dummies so I can use
	WADs that contain them without constantly having to edit the MAPINFO.
	It also allows using them to optimize hardware fog for WADs that should
	run with ZDoom as well.

December 26, 2007
- Changed the way gamma works for D3DFB: In windowed mode, the display is
	drawn to a texture, then that texture is copied to the real back buffer
	using a gamma-correcting pixel shader. In fullscreen mode, SetGammaRamp
	is used.
- Fixed flashing of vid_fps display when fps > 1000.
- Fixed loading of RGB textures for native 2D mode.
- Changed the first rotozoomer's data because it just became too obvious when
	the backdrop is drawn with a full 256 distinct colors available.
- Set the player backdrop to update no more frequently than 35 FPS, so opening
	the player setup menu before starting a game won't produce a very fast
	moving backdrop.
- Changed the player backdrop into a texture so that it can be drawn like
	anything else.
- Enhanced TMap so that you can get at the iterator types by accessing them
	like class members.

December 26, 2007 (Changes by Graf Zahl)
- Fixed: The FSpecialFont constructor copied the untranslated colors directly
	from the source palette instead of the font's identity map.
- Split off the entire translation code from r_draw.cpp into r_translate.cpp.
- Moved the common code of ACS and DECORATE translation generation into the
	FRemapTable class.
- Fixed: The DECORATE translation code was not changed for the new data structures.
- Expanded range of ACS and DECORATE translations to 65535.
- Fixed: R_CopyTranslation was not altered for the new functionality.
	I removed the function and replaced the one use with a simple assignment.

December 25, 2007
- Fixed: The fullscreen console crashed when opened before starting a game.
- Discovered that Shader Model 1.4 clamps my constants, so I can't use
	palettes smaller than 256 entries with the shader I wrote for it. Is there
	a list of gotchas like this listed some where? I'd really like to see it.

	Well, when compiled with SM2.0, the PalTex shader seems to be every-so-
	slightly faster on my GF7950GT than the SM1.4 version, so I guess it's a
	minor win for cards that support it.

December 25, 2007 (Changes by Graf Zahl)
- Replaced 'C:\\ZDOOMDAT' with a #define in version.h.
- Moved screenshot code into DCanvas so that it can be overridden by
	subclasses with a different buffer.
- added a P_PointInSector function and replaced all calls to retrieve an
	actor's sector in the game engine code with it. This way there's a clear
	distinction between renderer-specific and game-specific calls.
- added UseInventory/UseActorInventory ACS functions.

December 24, 2007
- Fixed: ST_Endoom() failed to free the bitmap it used.
- Added the DTA_ColorOverlay attribute to blend a color with the texture
	being drawn. For software, this (currently) only works with black. For
	hardware, it works with any color. The motiviation for this was so I could
	rewrite the status bar calls that passed DIM_MAP to DTA_Translation to
	draw darker icons into something that didn't require making a whole new
	remap table.
- After having an "OMG! How could I have been so stupid?" moment, I have
	removed the off-by-one check from D3DFB. I had thought the off-by-one error
	was caused by rounding errors by the shader hardware. Not so. Rather, I
	wasn't sampling what I thought I was sampling. A texture that uses palette
	index 255 passes the value 1.0 to the shader. The shader needs to adjust the
	range of its palette indexes, or it will end up trying to read color 256
	from the palette texture when it should be reading color 255. Doh!
- The TranslationToTable() function has been added to map from translation
	numbers used by actors to the tables those numbers represent. This function
	performs validation for the input and returns NULL if the input value
	is invalid.
- Major changes to the way translation tables work: No longer are they each a
	256-byte array. Instead, the FRemapTable structure is used to represent each
	one. It includes a remap array for the software renderer, a palette array
	for a hardware renderer, and a native texture pointer for D3DFB. The
	translationtables array itself is now an array of TArrays that point to the
	real tables. The DTA_Translation attribute must also be passed a pointer
	to a FRemapTable, not a byte array as previously.

December 24, 2007 (Changes by Graf Zahl)
- added some functionality to FDynamicColormap to allow not creating
	the colormap data.
- also replaced the AM crosshair drawer by a DCanvas::DrawPixel function.
- moved the AM line drawer into DCanvas as a virtual function. While testing
	this code I discovered that the antialias precalculation was never used
	except for the very first frame of AM drawing. However, since I couldn't
	detect even a marginal performance improvement using this code on 2 computers
	I just disabled it completely because it severely complicates a more generic
	implementation. I also disabled am_ovtrans in the process because I couldn't
	see any positive effects of using this cvar. All it does is adding some
	ugly distortion to the lines it affects without any apparent benefits.
* Added fix by Karate Chris containing:
- Added a 'No team changing' DMFlag2 which prevents players from changing teams
	unless they are not on a team.
- Added a 'No respawn' DMFlag2 which prevents a player from respawning after
	they have died.
- Added a 'Keep frags gained' DMFlag2 which allows you to choose whether you
	want to reset the frags of each player next level or not.
- Added a small visual enhancement to the cooperative scoreboard to show
	if a player has died.
- Fixed: If the 'teamplay' console variable was set to 'true' in a cooperative
	game, the scoreboard would show team play related items as opposed to
	cooperative items.
- Fixed: The 'bot_observer' console variable should not work in network games.
- Fixed: Bots made intermission skip really fast.

December 23, 2007 (Changes by Graf Zahl)
- Fixed a few font related problems.
- Fixed: ASkyViewpoint::Destroy was missing the super call.
- Added SnowKate709's A_LookEx update.
- Moved M_DrawPlayerBackdrop into DCanvas as a virtual function. Since this
	directly accesses the frame buffer it must be overridable for rendereres
	that work differently.
- Added Blzut3's third SBARINFO update:
 * Added drawshader to draw Heretic style transparency gradients.
 * Added artiflash flag to drawselectedinventory.
 * Fixed: Drawgem used the wrong operator when determining the chain size.
 * Fixed: ZDoom would crash if an undefined font was used.
 * I also started cleaning up the source a little.  I have been informed that
 when checking for flags the "== flagname" is redundant.
- Added indexfont anf hudfont from GZDoom to zdoom.pk3 so that they are always
	available when defining custom status bars.
- Added Karate Chris's 'sv_losefrag' submission.
- Added Karate Chris's 'sv_degeneration' submission.
- Fixed: 'Bot joined the team' message was passing an FString to Printf.
- Backported GZDoom's true color font mappings for use with native textures
	when the time comes.
- Added Karate Chris's 'sv_doubleammo' submission.
- Added Karate Chris's 'Take' console command submission.
- Changed DTA_Translation parameter for DrawTexture to an integer to avoid
	passing renderer specific data to the function. Also added DTA_Font so
	that the renderer can fetch font translations from the proper font.
	DIM_MAP/ConShade had to be made a regular translation table to make it
	work.
- Added Karate Chris's fix for scoreboard displaying team play related data
	in non teamplay games.
- Fixed: The team selection menu didn't work.
- Fixed: UpdateTeam passed an FString to Printf.

December 22, 2007
- Modified DFrameBuffer::DrawRateStuff() so that it can do its thing properly
	for D3DFB's 2D mode. Before, any fullscreen graphics (like help images)
	covered it up.
- Had a look at sbarinfo.cpp and noticed a few places where it allocated
	character arrays and never freed them. Those have been replaced with
	uses of FString. (One of these was even an instance of a member variable
	being set to point at a stack variable.)

December 22, 2007 (Changes by Graf Zahl)
- Added Karate Chris's teamdamage in MAPINFO submission.
- Added Blzut3's second SBARINFO update.
- Fixed: The second flash state of the chaingun called A_Light1 instead of A_Light2.
- Added Blzut3's SBARINFO update.

December 21, 2007
- Added versions of Dim and Clear to D3DFB for use in 2D mode.
- Added a new color parameter to DCanvas::Clear() that specifies the
	ARGB value of the color. This is used if the old color parameter,
	which specifies a palette entry, is -1.
- Fixed: TEAMINFO broke bot parsing for bots with invalid team names by
	redefining TEAM_None from 255 to -1.

December 21, 2007 (Changes by Graf Zahl)
- Added Karate Chris's fix for TEAMINFO definitions with just one team.

December 20, 2007 (Changes by Graf Zahl)
- Added Blzut3's SBARINFO submission.
- Added SnowKate709's A_LookEx submission.
- Added Karate Chris's TEAMINFO submission.
- Added true color processing to FDDSTexture. This is untested so far
	because I don't have any DDS textures to check it with.
- Fixed: FTexture::~FTexture() must destroy the associated native texture
	if present.
- Modified GZDoom's true color texture copy functions and added them
	to generate 32 bit D3D textures. Paletted TGAs and PCXs are also handled
	this way but I don't think these 2 formats are worth some more special
	handling.
	(Question: Is it worth it to implement special handling for paletted PNGs
	 so that they are used as 8 bit textures internally?)
- Fixed: DCanvas::Blit unlocked the destination twice instead of unlocking
	both dest and src. Also changed this function so that it is owned by the
	destination canvas of the operation which is necessary if it needs to
	be overridden by subclasses.
- Fixed: The StrifePlayer defined the wrong color range for its translations.

December 19, 2007
- Added a framework for drawing the 2D screen elements with Direct3D textures.
	They are not actually drawn with it yet, nor is it complete, but it's
	something to start with. While doing this, I noticed the DTA_Shadow stuff
	doesn't do anything. I'll probably remove them rather than fix them, since
	it's easier to draw the shadow with a separate DrawTexture call.
- Split up DCanvas::DrawTexture() into more pieces to make it easier to
	virtualize.
- Removed support for non-32-bit palette textures from D3DFB. What kind of
	card supports pixel shaders but not 32-bit textures?

December 17, 2007
- Fixed: In the video modes menu, pressing Enter tried to change the screen
	mode, even if the cursor wasn't on one of the mode items.
- Fixed: Heretic's mace never respawned in deathmatch games.
- Fixed: At resolutions taller than 600 pixels or so, tall sky textures were
	drawn a row too low. This was quite visible on Hexen MAP06.
- Fixed: P_CheckSlopeWalk() must return false if floorsector != sector, or
	the actor will be yanked down to the floorsector by P_TryMove().
- Fixed: ClearActorInventory, GiveActorInventory, and TakeActorInventory
	only affected the first actor with the given TID.
- Fixed: The color boxes for the colorpicker menu items were drawn a little
	too low.
- Fixed: Clean scaling at 720x480 looked borked.
- New: When using the D3D9 framebuffer, palette blending is now applied only
	to the 3D area of the screen. This means the console and (the primary
	rectangular area of) the status bar are no longer blended. Maybe somedays
	when I'm feeling adventurous, I'll exclude all the 2D graphics from the
	blending.

December 17, 2007 (Changes by Graf Zahl)
- Fixed: When a skybox viewpoint is destroyed it should clear all
	sector references to itself.

December 14, 2007
- Fixed: G_QueueBody() should only change the translation to one of its
	private slots if the one currently used is a player range.
- Fixed: Changing the fraglimit during the middle of a game would not trigger
	a level change if somebody was already over the new limit.
- Added "\c" support to ParseCommandLine() when it parses quoted strings.
- Fixed: When changing your name from the menu, you got an extra " appended
	to your name if it ended with a backslash.
- Added escape sequences for user info strings, so now they can contain
	embedded backslashes.
- Fixed an array-out-of-bounds access when drawing the player setup menu with
	an invalid team number.

December 10, 2007
- Fixed: The MAPINFO flags that control jumping, crouching, and freelook,
	rather than overriding the dmflags values, actually overwrote the dmflags
	values, so they would continue to be in effect on later maps that didn't
	explicitly specify them.
- Fixed: Redefining a decal did not rebind any old references to the decal, so
	they would be left pointing at invalid data.
- Fixed some more GCC warnings.
- Updated project files for nasm 2.0, which is now named nasm.exe for the
	Windows version, rather than nasmw.exe. Also fixed the annoying new warnings
	it generated.

December 10, 2007 (Changes by Graf Zahl)
- Fixed: M_VerifyNightmare must use the selected skill level to start the
	game, not always 4.

December 9, 2007 (Changes by Graf Zahl)
- Fixed: There was no working means to pass 'no state' to A_Chase.
	Now 0 or an empty string will do that.
- Copied the empty string fix for SC_CheckNumber to SC_CheckFloat.

December 8, 2007
- Fixed: SECSPAC_EyesSurface and SECSPAC_EyesDive did not trigger due to
	crouching motion.
- Fixed: The keypress for nightmare mode verification appeared in the console
	if the fullscreen console was open while using the menu.
- Added support for scaling down large console fonts in the customize
	controls menu.
- Fixed: Joining a negative team was possible.
- Fixed: Skill level confirmation only worked with Doom. Also fixed parsing
	of MustConfirm: It looked for TK_String when it should have used TK_StringConst.
- Fixed: When travelling to a new non-hub map, any items being carried with
	amounts of 0 would be upped to 1.
- Fixed: When the game starts with the net pane open, the abort button
	receives the input focus. When the pane is closed, the focus doesn't
	return to any window, so even though the window is still active, it no
	longer has the focus and does not receive input events.
- Fixed: The network synch timer was still left running after the game
	started. (Windows only)
- Fixed: When a player leaves the game at the exact moment they are being
	damaged, the game could crash because their actor still had a valid player
	pointer, but the player's mo pointer had been NULLed.
- Fixed: MAPINFO is parsed before the text colors are read, so the TextColor
	option for skills wouldn't work.
- Changed the PowerTimeFreezer "blink" effect back to checking against
	EffectTics (now + 1), because I wasn't convinced of the correctness of
	using level.time.
- Fixed: SC_CheckNumber() considered the empty string "" as the number 0.
- Reverted the 'None' name change from r569.

December 6, 2007
- Fixed the PowerTimeFreezer, too. It got easier once I realized that I only
	need to be concerned about changing the flag on odd tics, since A_Tracer()
	is called every two tics, not four.
- Fixed: Using the freeze command would make the Revenant missiles switch
	their seekingness. The only sane way to deal with this seemed to be to
	sync the freeze changes with the timer check in A_Tracer(), so that's what
	I did: Freeze mode only changes every four tics now.
- Added IWAD-based [*.Autoload] ini support for games that have more than one
	IWAD. They are:
	* [Doom1.Autoload]
	* [Doom2.Autoload]
	* [Plutonia.Autoload]
	* [TNT.Autoload]
	* [HexenDK.Autoload]
	These are loaded after the more general game-specific [Doom.Autoload] and
	[Hexen.Autoload] sections if those are present.
- Changed the banner texts for the Final Doom IWADs to identify them as Final
	Doom rather than as DOOM 2. I know this differs from the original behavior,
	but they're marketed as Final Doom, not Doom 2.
- New: On Windows, the game now checks the registry to see if you have Steam
	installed. If so, it checks your SteamApps directory for any IWADs you may
	have purchased through Steam and adds any it finds to the list of available
	IWADs you can play. This means that if you bought your id games through
	Steam, you can just extract ZDoom anywhere you like and run it without doing
	any additional setup.
- Fixed: The FLAC/makefile.mgw should use md5.o as an OBJ, not md5.c.
- Fixed: The Linux makefile probably shouldn't be using the bundled zlib headers,
	either.

December 6, 2007 (Changes by Graf Zahl)
- Added Karate Chris's submission for scoreboard enhancement.
- Fixed: A_PainDie and A_DualPainAttack could fail to spawn the correct actor
	if the first spawned one died and executed some code in its death state.

December 5, 2007
- Fixed: The Linux makefile should use the include files for the system FLAC
	installation, not the bundled copies which might not match what is installed.
- Upgraded bundled FLAC from version 1.1.2 to version 1.2.1.

December 2, 2007 (Changes by Graf Zahl)
- Added Karate Chris's submission for 'allowrespawn' MAPINFO option.
- Added Karate Chris's submission for customizable skill confirmation text.
- Fixed: Doom's statusbar only checked for primary attacks, not secondary ones when
	setting Doomguy's face. (Thanks to Karate Chris for the fix.)

November 29, 2007 (Changes by Graf Zahl)
- added Skulltag's FORCEYBILLBOARD and FORCEXYBILLBOARD flags to the DECORATE parser.
	Even though the software renderer has no use for them it is necessary to support them
	so that mods can use these flags without becoming incompatible with ZDoom.

November 28, 2007 (Changes by Graf Zahl)
- after looking at the most recent Vavoom update I realized that A_FastChase should not
	use the multi-purpose special2 as counter for strafing so I added a new variable
	for this purpose.

November 24, 2007 (Changes by Graf Zahl)
- added Floor_MoveToValue and Ceiling_MoveToValue action specials.

November 19, 2007 (Changes by Graf Zahl)
- Changed first name from 'none' to ''. The internal constant is still NAME_None,
	though.
- Fixed: Picking up a backpack incorrectly set the maximum amount for any ammo
	type that didn't have a BackpackMaxAmount to 0.

November 18, 2007 (Changes by Graf Zahl)
- Fixed TableShit0 definition.

November 13, 2007 (Changes by Graf Zahl)
- Fixed Berserk pickup sound.
- Fixed: When the DONTMOVE flag for A_Chase was used, movecount was not decreased
	resulting in missile attacks not working.
- Fixed: Hitscan attacks used the puff's position to calculate the trajectory for
	weapon kickback.

November 11, 2007 (Changes by Graf Zahl)
- Fixed: The FMOD stream player must specify whether it wants to play the
	sound looped or not when playback is started, not when the stream is created.
- Fixed: A_Saw didn't use the puff's damage type.
- Fixed: The AxeBlood's death state was using the wrong sprite frame.

November 10, 2007 (Changes by Graf Zahl)
- Fixed: The Mancubus had an attack sound defined even though it shouldn't.

November 9, 2007 (Changes by Graf Zahl)
- Fixed: ACS's CheckWeapon must do a case insensitive string comparison to
	compare the weapon name with the ready weapon's type.

November 8, 2007 (Changes by Graf Zahl)
- Changed PowerFlight so that Hexen's infiniteness is not controlled by being
	in a hub but by a level flag instead.

November 7, 2007 (Changes by Graf Zahl)
- Fixed: Floor and ceiling huggers must set themselves to floor and ceiling each
	time they move.
- Added a LEVEL_NOMONSTERS flag so that G_ChangeLevel doesn't have to mess with
	the dmflags CVAR to start the level without monsters.

November 4, 2007 (Changes by Graf Zahl)
- Fixed: Backpacks didn't increase the ammo capacity to BackpackMaxAmount if
	an ammo type's BackpackAmount was 0.
- Fixed some minor bugs in custom skill code.

November 3, 2007 (Changes by Graf Zahl)
- Added text color options to menu code so that the skill definitions can set
	the color of the menu's text.
- Externalized skill settings to ZDoom.pk3

November 2, 2007 (Changes by Graf Zahl)
- Added skill definitions to MAPINFO.

October 29, 2007 (Changes by Graf Zahl)
- added two new things which can set a sector's color without the need of tags
	or scripts. ColorSetter (#9038) sets the sector's color and FadeSetter (#9039)
	sets the fog color.
- added new flags MF5_ALWAYSFAST and MF5_NEVERFAST. These flags unconditionally
	enable or disable fast movement logic, regardless of skill settings.
- added an abstraction layer for skill related settings. This is a preparation
	for implementing custom skill definitions but right now all it does is
	returning the original values but keeping the related information all in one
	place

October 28, 2007 (Changes by Graf Zahl)
- Fixed: The pointer cleanup code must also check a sector's sky box pointers.

October 27, 2007 (Changes by Graf Zahl)
- Fixed: Right after teleporting P_SlideMove could cause player movement.
	Added a check for reactiontime to prevent that.
- Fixed: PainChances and Damagefactors were never freed.
- Added option to A_Chase that prevents the monster from moving.
- Fixed: The stained glass shards were missing the HEXENBOUNCE flag.

October 20, 2007 (Changes by Graf Zahl)
- Added some NULL pointer checks to AActor::GiveAmmo.
- Fixed: The FSwordMissile was missing the special damage handling that
	reduces damage when hitting a player.

October 19, 2007 (Changes by Graf Zahl)
- Fixed: APlayerPawn::UpdateWaterLevel must check if the actor is still
	connected to a player.
- Fixed: POwered up weapons with a different ready state than their base
	weapon didn't change back when the powerup expired.
- Fixed: The powered up version of Heretic's Gauntlets missed the proper
	state assignments for Ready, Lower and Raise.

October 17, 2007 (Changes by Graf Zahl)
- Fixed: The Strife player was missing its pain state.

October 12, 2007 (Changes by Graf Zahl)
- Fixed: Revenant missiles couldn't home in on targets with a height lower than
	40.
- Fixed: The code which checked for hitscan traces hitting actors from above
	and below must test whether the calculated hit position is actually inside
	the actor being checked. If it crosses the top/bottom plane outside the
	bounding box there can't be a hit.
- Changed: State labels in code pointer calls must now be enclosed in quotation marks.
	This was done to ensure compatibility with parsers that will parse these as
	identifier-aware script code later.

October 8, 2007 (Changes by Graf Zahl)
- Fixed: The code that checked hitscans entering an actor from above and below
	calculated the hit position wrong.

October 5, 2007 (Changes by Graf Zahl)
- Fixed: Tne Imp's raise state sequence was wrong due to a typo.
- Fixed: The shotgun had spawn ID 21 instead of 27.
- Fixed: All 3 states in the DoomUnusedStates actor need to end with a 'stop'.

October 3, 2007 (Changes by Graf Zahl)
- Fixed: The DECORATE TakeInventory functions didn't check the IF_KEEPDEPLETED
	flag.

September 29, 2007 (Changes by Graf Zahl)
- Fixed: ClearInventory should leave ammo in the inventory because it might be
	referenced by undroppable weapons.
- Fixed: Several functions in a_artifacts.cpp were missing a check for a valid
	owner.
- Fixed: sc_man counted lines wrong when ungetting strings but getting tokens
	next.

September 27, 2007 (Changes by Graf Zahl)
- Fixed: When I changed the scaling of textures to full fixed point precision
	I forgot to change the call that draws the automap marker numbers.
- Fixed: The chaingun-flash-checking code always checked the first player,
	not the calling one.
- Fixed: Hitscan traces didn't hit actors when entering from above or below
- Fixed: The DECORATE expression evaluator was reading the operator token
	from the wrong variable in a few places resulting in incorrect calculations.
- Fixed: MP3/OGG music always looped because the looping flag was always
	set when FMOD was called to play it.
- Removed upper limit of 1 for an actor's gravity factor.
- Fixed: A_VileTarget spawned the fire at coordinate (target->x, target->x)
	instead of (target->x, target->y). (Old vanilla bug.)

September 26, 2007 (Changes by Graf Zahl)
- Fixed: F_StartFinale shouldn't get the information if the game is about
	to end from level.nextmap. For example, this check is wrong for a secret
	exit.

September 25, 2007 (Changes by Graf Zahl)
- Fixed: AActor::CopyFriendliness must not copy the target if it has the
	MF3_NOTARGET flag set.
- Fixed: Picking up weapons in deathmatch gives 2.5 times as much ammo as
	in other modes.

September 23, 2007 (Changes by Graf Zahl)
- fixed: The #include command in DECORATE always tried to look up the name
	as a normal WAD lump name. It only should do that if the name is not longer
	than 8 characters and doesn't contain any '/'-characters.

September 11, 2007 (Changes by Graf Zahl)
- fixed: The Timidity player didn't close its temporary files and left them
	behind because it couldn't delete them.
- added a $MidiDevice option to SNDINFO which can either set the preferred
	MIDI device for a song to Timidity or Windows' standard MIDI device.
	The reason for this: About 80% of my MIDI music collection sounds better
	with Timidity and the other 20% with Windows' standard synth and I'd like
	to be able to use each with the one that sounds better. For MUS files you
	can also force the use of OPL playback.

September 8, 2007 (Changes by Graf Zahl)
- added telefrag option to A_SpawnItemEx.

September 5, 2007 (Changes by Graf Zahl)
- Fixed: Several options while changing maps only worked for the regular exit
	but caused problems when used with the secret exit. Rewrote the code to
	set the next map at the beginning and removed all subsequent parts that
	tried to resolve it from the original data again.

August 19, 2007 (Changes by Graf Zahl)
- Fixed: dumpmap crashed when used outside a map.

August 10, 2007 (Changes by Graf Zahl)
- Exported A_DeQueueCorpse to DECORATE. It seems I forgot this when exporting
	A_QueueCorpse.

August 9, 2007 (Changes by Graf Zahl)
- Moved setting of gameskill from M_ChooseSkill to G_DoNewGame because it
	doesn't work in M_ChooseSkill when the full console is open.

July 28, 2007 (Changes by Graf Zahl)
- fixed: The BFGBall's explosion sequence was missing a state.
- fixed: The brown Chaos Serpent in Hexen had an incorrect sprite for its
	ice death sequence set.
- fixed: Ammo upon game start does not get multiplied when on easy skill.
	Implementing this as an inventory flag IF_IGNORESKILL also allows to create
	ammo/weapon/backpack types that don't multiply the ammo given when on this
	skill.

July 24, 2007 (Changes by Graf Zahl)
- moved Doom exit sounds into SNDINFO as $random definitions.

July 18, 2007 (Changes by Graf Zahl)
- Fixed: Dying Lost Souls could be reset to their see state if they slammed into
	something.

July 12, 2007 (Changes by Graf Zahl)
- Added DTA_TopOffset and DTA_LeftOffset values to the automap background drawer.
- Fixed: DECORATE color translations with explicit colors didn't work because the
	code treated byte values as fixed point.
- Fixed: LEVEL_NOALLIES must clear MF_FRIENDLY off any spawned actor except players.
	Otherwise it doesn't work properly.
- Fixed: Entering a backslash in the player's name box caused a crash because
	the code analyzing the string was missing a NULL pointer check.
- Fixed: Thing_Hate and Teleport_ZombieChanger unconditionally made state jumps,
	even for dead monsters.
- Fixed: The palette flash for item pickup was not reset upon a player's death.
- Fixed: P_DamageMobj tried to get damage multiplier information from the
	damage inflictor, not the attacker.
- Fixed: PowerTimeFreezer::DoEffect did not call its superclass method.
- fixed: When morphed monsters died they tried to set MF3_STAYMORPHED for the
	attacker, not themselves. This caused a crash when they were killed by a crusher.

May 28, 2007 (Changes by Graf Zahl)
- Split thingdef.cpp into several files so that the state and property code
	no longer gets in the way of the main parser.
- Changed A_MissileAttack, A_MeleeAttack and A_ComboAttack so that they use
	metadata. Now all the hack code associated with these functions can be removed.
- Fixed: deadthings.txt contained a superfluous ';' which created parsing errors
	with my changed code.
- Cleaned up DECORATE parser a little - moved the old style parsing code into its
	own file and rearranged a few things.
- Made ProcessStates non-static so that it doesn't need to be passed as an argument
	to all functions in the DECORATE parser.
- Moved DECORATE parser files into their own subdirectory.
- Optimization: SC_GetToken no longer sets sc_name for identifiers. In most cases
	this creates needless overhead by adding a potentially unneeded name to the name
	table and looking up the name. In almost all cases where a name is needed it's as
	easy to assign sc_String to the name variable.
- Added enum definitions to DECORATE.

May 27, 2007 (Changes by Graf Zahl)
- Fixed: Hirestex replacements for sprites didn't work properly due to some
	incorrect calculations in R_ProjectSprite.
- Fixed: The speed definition of PowerSpeed used PROP_SpeedFixed instead of
	PROP_SpeedLong.
- Fixed: The Chainsaw's kickback was initialized to the default - not 0.

May 26, 2007 (Changes by Graf Zahl)
- Fixed: Resurrecting a player must set mo->special1 to 0 because it is used
	as a counter by the Hexen fighter's fist weapon.

May 25, 2007 (Changes by Graf Zahl)
- Fixed: The Wraithwerge's spirits shouldn't attack friends.
- Fixed: The Heresiarch's balls must not adjust their z-position after the
	Heresiarch dies.

May 24, 2007 (Changes by Graf Zahl)
- Added damage type specific pain chances and an MF5_NOPAIN flag that can be used
	to suppress entering the pain state altogether.
- Changed font initialization so that you can define replacements for the default
	fonts in FONTDEFS.
- Removed the 'add a bot' menu option since bots are beyond repair and therefore
	mostly useless.
- Fixed: Hitscan attacks must always spawn a puff so that it and its properties
	can be used as damage inflictor.

May 20, 2007 (Changes by Graf Zahl)
- Copied railgun sound fix from Skulltag.

May 19, 2007 (Changes by Graf Zahl)
- Made infighting a level flag. The old method still exists but the level flags
	will take precedence if set.

May 13, 2007 (Changes by Graf Zahl)
- fixed: meleethreshold only has meaning when the attacking monster actually
	has a melee attack.
- copied a colormap fix from Skulltag.

May 12, 2007 (Changes by Graf Zahl)
- Added a compatibility option to restore the original behavior of the Invisibility
	powerup.
- Changed: Weapons are no longer checked for the EXTREMEDEATH and NOEXTREMEDEATH flags.
	For all damage related actions it will always be the projectile (or puff for hitscan
	attacks) that is treated as the damage inflictor.
- Fixed: Hexen's fourth weapons made extreme death depend on the weapon the player
	is holding, not the projectile that did the kill. The WIF_EXTREME_DEATH flag
	no longer exists as a result.
- Expanded PowerSpeed so that subclasses can be derived that alter the speed factor.
- Added an MF5_USESPECIAL flag that allows using things to execute their specials.
- added MF4_FORCERADIUSDMG flag so that exploding items can be created which
	are able to hurt boss monsters.
- moved ML_BLOCK_PLAYERS to the value 0x4000 to bring it in line with Skulltag's
	implementation.

May 9, 2007 (Changes by Graf Zahl)
- added Skulltag's custom F1 help screen MAPINFO option.

May 4, 2007 (Changes by Graf Zahl)
- Fixed: Resurrecting a player must restore all flags words, not just the first one.
- Fixed: APowerWeaponLevel2::EndEffect must check PendingWeapon for WP_NOCHANGE.

May 3, 2007 (Changes by Graf Zahl)
- added Skulltag's high jump rune as a powerup

May 2, 2007 (Changes by Graf Zahl)
- Added Skulltag's Drain and Regeneration runes as powerups and used specific player
	sounds for their sound effects instead of using misc/i_pkup.
	(If I ever decide to implement runes it will be in a way that can use the regular
	powerups instead of having to define specific classes for them.)
- Added Skulltag's PowerQuadDamage and PowerQuarterDamage as more customizable
	PowerDamage and PowerProtection. These new powerups allow free customization of
	the damage modification per damage type by inheriting from these classes and
	setting specific values. Such derived damage/protection powerups will be considered
	as separate powers so that for example a QuadDamage and a DoubleDamage item can be
	stacked which would result in 8x damage.

May 1, 2007 (Changes by Graf Zahl)
- merged player_t::cheats and player_t::Powers into one variable.
- Fixed: player_t::Powers was not saved in a savegame.
- Removed all unused PW_* player power flags.
- Added Skulltag's TimeFreezer powerup.
- Moved most of the menu strings (except options and player setup menu) into the
	string table.

April 30, 2007 (Changes by Graf Zahl)
- Fixed: GetLumpOffset must call SetLumpAddress when being called for uncompressed
	Zip entries.
- Fixed: Some of Doom's weapon obituaries didn't have the $-prefix that indicates a
	reference to the string table.
- Fixed: The check for a valid weapon's spawn state for weapon dropping was incorrect.

April 29, 2007 (Changes by Graf Zahl)
- Increased precision of texture scaling factors to full fixed point. In the process
	I got rid of the old tx and ty CVARs because they made the texture scaling
	much more complicated than it was actually needed (and besides, they were completely
	useless except for testing purposes anyway.)
- Added a simple check for abstract weapon classes so that I can properly define
	the DoomWeapon base class.
- Fixed: When the Tome of Power runs out it must also set any pending weapon
	back to their regular state.

April 27, 2007 (Changes by Graf Zahl)
- Added damage factors that allows to make monsters more or less resistant
	to specific damage types.
- Changed Dehacked parser to use the DECORATE symbol tables for code pointers
	instead of creating its own ones.

April 26, 2007 (Changes by Graf Zahl)
- Removed the HandleNoSector hack and changed A_Look so that it uses the sector's
	sound target for actors with MF_NOSECTOR regardless of compatibility settings.
- Moved initialization of weapon slots after the actor initialization.
	With default weapons exported to DECORATE it can't be done earlier.
- Converted Doom weapons to DECORATE.
- Changed backpack definition so that Doom's backpack is no longer the base
	class that implements its functionality. Now there is an abstract base class
	all backpack-like items derive from. Also moved the actual definition of Doom's
	backpack to DECORATE.

April 22, 2007 (Changes by Graf Zahl)
- added a CANUSEWALLS flag which allows a monster to activate 'use' specials
	like doors. This flag is on by default for any monster which was the
	previous behavior.
- Optimized the DECORATE flag parser so it can more efficiently handle
	the deprecated flags. As a side effect of this optimization the deprecated
	flags became usable in A_ChangeFlag again.
- Changed LONGMELEERANGE flag into a MeleeThreshold property.
- Changed SHORTMISSILERANGE flag into a MaxTargetRange property.
- Added Thing_Stop action special.
- Changed ACS's SetActorState so that it isn't limited to only one sublabel.
	This change also enables the implicit mapping of the old special death
	state names.
- Fixed: ShowErrorPane deleted the StartScreen instead of just calling
	NetDone.
- moved the DIM_MAP define into v_palette.h so that it can be accessed
	from outside the status bar code.
- Fixed: The check for non-swimmable water in UpdateWaterLevel checked for
	SECF_UNDERWATER instead of SECF_UNDERWATERMASK.

April 12, 2007
- Switched ACS world and global arrays to the TMap class instead of
	TAutoGrowArray. A map can handle a wide range of key values better than
	an array.

April 10, 2007
- Added a templated associative array class, TMap, that uses Lua's "chained
	scatter table with Brent's variation" algorithm. I had considered using
	hash_map until I discovered that it's not standard STL, and there are two
	major but incompatible implementations of it. So I rolled my own, and Lua
	seemed like a good place to go to for an efficient algorithm, since it
	makes heavy use of tables.

March 28, 2007
- Fixed some const char * -> char * conversions flagged by GCC 4.2.0 in the
	Win32-specific code.
- Fixed: The Win32 neterror() should return a const char *.
- Adding blinky text to the ENDOOM screen.

March 24, 2007
- Changed MakeKey's hash algorithm from a CRC32 to Paul Hsieh's SuperFastHash.

March 20, 2007
- Moved the implementation for the Thing_Damage special into another function
	so that I can create the ACS function Thing_Damage2. It's exactly the same as
	Thing_Damage, except the damage type is specified by name. When I did this,
	I noticed that it didn't do anything useful for a TID of 0, so I made it
	affect the activator in that case.

March 19, 2007
- Added a new SetActorState ACS function:
		int SetActorState (int tid, str statename, optional bool exact);
	If tid is 0, it affects the script activator, otherwise it affects all the
	matching actors. Statename is the name of the state you want to put the
	actor in. The final parameter, exact, specifies whether or not partial
	state name matches are accepted. If you don't specify it or set it to
	false, if you try to do something like:
		SetActorState (0, "Foo.Bar");
	And the actor has a Foo state but no Foo.Bar state, it will enter the Foo
	state. If you set exact to true:
		SetActorState (0, "Foo.Bar", true);
	Then the actor must have a Foo.Bar state, or it will not change state at
	all, even if it has a Foo state.
	The return value for this function is the number of actors that successfully
	changed state. Note that you should refrain from using this function to
	enter special states such as Death, or unpredictable results could occur.

March 13, 2007
- Fixed: Morphed players did not regain their innate armor when unmorphing.
	(Only Hexen has players with innate armor, under normal conditions.)

March 12, 2007
- Changed the default player.startitem amount from 0 to 1.

March 9, 2007
- Converted the TTY startup screen to a class for Linux.

March 8, 2007
- Increased the limit for the SorcererBallPop to 3 to be inline with the
	other Heresiarch ball sounds.
- Fixed: In Strife, using the shadow armor a second time while it is still
	active should make you completely invisible and your first-person weapon
	inverse grayscale.

March 7, 2007
- Changed P_SpawnPlayerMissile() to use the same height calculation as
	P_(Aim)LineAttack().
- Added an AttackZOffset to PlayerPawn. This is the offset from the
	center of the player at which their attacks are fired and scales
	according to their crouched height.
- Changed the version of P_SpawnPlayerMissile() that takes coordinates
	to use that location as an offset from the standard attack location
	rather than as an explicit attack location.

March 6, 2007
- Added an IF_KEEPDEPLETED flag for inventory items to keep them in the
	player's inventory even when they have been used up. If the item also
	has an inventory bar icon, it will be drawn darkened while it is
	depleted.

March 5, 2007
- Fixed: Thing_ProjectileAimed did not set the missile's speed correctly.

March 3, 2007
- The net start pane is now given focus when it is created, so it can
	receive keyboard input.
- Added playback of the "WeaponPickup" sound when a Hexen net game starts.
- Separated the different startup screens into classes for better
	modularization (which I should have done in the first place).

February 28, 2007
- Changed the net start pane to open underneath the existing window instead
	of scrunching the startup screen up to make room for it.
- Added the red net notches for Hexen's startup screen.
- Added hprintf and status simulation for Heretic's startup screen.
- Fixed: When I converted the P_Thing_Projectile() code for target leading
	to use the new vector routines, I had made dist calculate the squared
	length of the aim vector instead of the correct length.
- Fixed: When starting a new game from the menu while the fullscreen console
	was open, the game was frozen before its initial setup tick until the
	console was closed. The most obvious result of this is that your view was
	stuck on the floor until the console closed.
- Fixed: Pressing ESC while editing your player name completely cleared the
	menus instead of simply canceling the name change.
- Fixed: The status bar still showed the rampage face if you held the fire
	button down while frozen.

February 24, 2007
- Added << operators for FString that function exactly like +=, except they
	are left-associative, so you can use them like you would with an ostream
	and append to a string in a single expression without any overhead from
	allocating temporary strings as would happen if you used the + operator.
	In other words, instead of this:
		 string += "Some string " + "that is assembled" + " in parts";
	You can do this and be more efficient while still being just as readable:
		 string << "Some string " << "that is assembled" << " in parts";
- Changed PCD_PRINTBIND to include the command in its output if it isn't
	bound.
- Fixed: ACS_ExecuteWithResultValue could not be used inside a script because
	DLevelScript::RunScript() was not reentrant, thanks to having a global stack.
	The stack should be local to each instance of RunScript.
- Fixed: rt_draw4cols() could get stuck in rare situations where it thinks it
	should be drawing something but doesn't. Since long-term I plan to just
	replace all the masked drawing the variants of maskwallscan, I'm not going
	to try and find the real cause and fix it there. Instead, it just detects
	the situation and bails out when it finds it.

February 24, 2007 (Changes by Graf Zahl)
- Fixed: In the Doom2 cast finale it was impossible to toggle the console.
- Added APROP_Friendly actor property for ACS.
- Added a new flag, MF2_DONTREFLECT that prevents missiles from being reflected.
- Fixed: ALoreShot::DoSpecialDamage must check whether the shooter is still
	present. If it had been removed before the projectile hits its target
	a crash could occur.
- Fixed: GetPlayerInfo was missing breaks and always returned 0 as a result.
- Added Grubber's submission for printing key bindings in ACS.

February 19, 2007
- Fixed: $Ambient SNDINFO commands zeroed the AmbientSound structure, which
	is a no-no when using FString.
- Fixed: DEM_WIPEON/OFF commands should be ignored during demo playback and
	not pause the game, or the whole thing will be out of sync.
- Fixed: Playing a demo in windowed mode no longer grabs the mouse.

February 14, 2007
- Added two new net commands: DEM_WIPEON and DEM_WIPEOFF. They keep track of
	when a player is going through a screen wipe and act like a pause, so the
	game doesn't run several tics afterward to catch up with it.
- Fixed: EV_Teleport() did not set players to their idle state, so if they
	were running when the teleported, they would still be running afterward
	even though they weren't moving anywhere. Normally, P_XYMovement() does
	this when they stop due to friction.
- Fixed: AActor::TakeSpecialDamage() completely bypassed the standard rules
	for target switching on actors with MF5_NODAMAGE set.
- Changed the return values of the ACS spawn, spawnspot, and spawnspotfacing
	commands to be the total count of things spawned, rather than a pretty
	much useless reference to the actor spawned at the last map spot.
- Fixed: DLevelScript::DoSpawn() takes a byte angle, but DoSpawnSpotFacing()
	passed it a full-length angle.
- Fixed: When MF_SKULLFLY is removed because an actor slams into something,
	it was set to a see or spawn state, resetting its tic count and bypassing
	the effectiveness of the MF2_DORMANT flag. While I was at it, I decided
	dormant skulls shouldn't do slamming damage, either.
- Fixed: P_Thing_Spawn() returned success only if all thing instances were
	successfully spawned. As long as at least one thing was spawned, it should
	be considered a success.
- Fixed: Flipped single rotation sprites were only flipped every other 22.5
	degree interval.
- Fixed: S_ClearSoundData() did not stop any channels before freeing the
	samples, a problem for the alternate sound renderer if it happened to be
	playing any sounds at the time, since it would try to keep on playing them.

February 12, 2007
- Added two new cvars (win_x and win_y) that keep track of the window
	position when not playing in fullscreen mode.
- Changed the upper-left window positioning that was always used in debug
	builds into a command line option (-0), so debug and release builds behave
	the same.

February 10, 2007 (Changes by Graf Zahl)
- Changed earthquake code to not add all the intensities but use the maximum
	in DEarthQuake::StaticGetQuakeIntensity. The reason for this: Quakes were
	never supposed to be additive. Many maps, including Hexen's own have placed
	quake spots so that they cover a larger area but the areas covered by the
	single spots overlap. On such maps the view will shake like crazy and
	render the map nearly unplayable.

February 4, 2007 (Changes by Graf Zahl)
- Fixed: The powered up Mace was missing its HoldAtkState.
- Added: Using "*" with ACS's music commands will play the level's default
	music set in MAPINFO.

February 3, 2007
- Added two new MAPINFO flags to control what actor activates impact lines:
		* MissileShootersActivateImpactLines - the current behavior.
		* MissilesActivateImpactLines - the original Hexen behavior.
- Fixed: The changecamera special should remove "past viewer" information
	from the renderer in case the camera changed position or direction since
	the last time it was looked through. Otherwise, the renderer will
	interpolate from its previous view for one frame when it is switched to.
- Removed the 63-character limit on sound names.
- Reduced the rate at which drowning damage increases.
- Added more player water sounds:
		*dive - Played when your head goes below water.
		*surface - Played when your head goes back above water.
		*gasp - Played when you were drowning and get your air back.
	If your head surfaces and you were drowning, only *gasp plays, not both.
- Added damage-specific player death sounds, in the same fashion as the
	damage-specific player pain sounds. It looks for a sound with a name like
	"*death-damagetype" first and then "*death" if the first sound didn't exist.
- Removed the constraint that player sounds must be reserved before they can
	be assigned. Hence, the $playerreserve command has been eliminated, because
	it is no longer needed and it was never accessible from user wads, so I
	don't need to worry about breaking anything by removing it.

February 2, 2007
- Added a new fixrtext tool that sets the IMAGE_SCN_MEM_WRITE flag for
	.rtext sections in the assembly object files. Now I can avoid doing this at
	runtime, which means that ZDoom is now UPX-compatible if anyone wants to
	pack it.

	You will need to do a rebuild or manually delete the old assembly .obj files
	for the first build from this revision to succeed, since there are no
	changes to the assembly files themselves, and the build process will not be
	able to automatically detect that they need to be rebuilt.
- Fixed: The SafeDivScales used a signed shift for their if test. This fails
	when a == 0x80000000, because the result of abs will still be negative as
	long as we use signed math.
- Fixed: SafeDivScale31 performed DivScale32 instead.
- Fixed: R_DrawSpanP_ASM had a short jump into a different section.

January 30, 2007
- Fixed: When quiting from fullscreen mode, RestoreConView() did not ungrab
	the mouse.
- Fixed an old Doom bug: Firing the chaingun with only one bullet still made
	it play its sound twice.
- Added an operator += for FString that takes an FName as input, since GCC
	is unable to synthesize one.
- Converted xlatcc to use lemon during its build process. Now you don't need
	bison to rebuild everything anymore.

January 27, 2007
- Added support for damage-specific player pain sounds.
- Removed the constraint that all $playerreserve SNDINFO commands must come
	before the other $player commands.
- Fixed: TArray::Reserve did not construct its newly allocated entries.
- Changed the damage type for drowning from 'Water' to 'Drowning'.
- Fixed: Since FMemLump is now implemented on top of FString, it never
	contains a NULL point, so the GetMem() method should fake it by
	returning NULL when the string is empty. Reverted p_xlat.cpp to its
	old revision.

January 26, 2007 (Changes by Graf Zahl)
- Fixed: The rewrite of FMemLump broke the non-standard use of it in
	P_TranslateLinedefs.
- Fixed: ShowErrorPane can be called before ST_NetDone is valid so it has to
	check whether it is NULL.
- Fixed: The Megasphere had an incorrect pickup sound.

January 25, 2007 (Changes by Graf Zahl)
- Fixed: The new video initialization code could set the screen's Font pointer
	to NULL, causing a crash with levels that start in a secret sector.

January 24, 2007
- Fixed: If you called the FString assignment operator that accepts a
	const char * with a string inside its buffer, it released the buffer
	before copying the string.
- Added a new FString constructor that creates the string from a lump.

January 23, 2007
- Fixed: G_DoReborn() calls G_InitNew() with mapname set to level.mapname.
	G_InitNew() then copies it onto level.mapname, which is undefined
	behavior (although it does work as we want it to).
- Modified FMemLump to store its data using FString. That class provides
	a convenient method of storing reference counted data, so now FMemLump
	doesn't need to muck about sneakily using const_casts and possibly
	tricking its users into thinking that an old one is still valid after
	being assigned to a new one.
- Fixed: The IMGZ, PNG, PCX, and JPEG loaders assumed the files were
	large enough for their headers without actually checking.

January 22, 2007
- Fixed: The simulated palette blends when the menu or console are open
	were applied even when the status bar wasn't drawn. (In other words, even
	in situations where a real palette blend wouldn't have happened.)
- Added a range check for the PNG grAb chunks.
- Fixed: AddLine() could corrupt memory if the length of the text being
	added was longer than the console buffer.
- Fixed: FTexture::GetScaled(Left|Top)Offset returned the Width and Height
	instead when the scale values were 0.
- Removed the unnecessary "mov ecx,c" from mscinlines.h:Scale().
- Fixed: The simulated palette blend used when the console is down needs to
	force a full screen update the next frame.
- Fixed: LocalViewPitch could overflow and wrap around when a netgame stalls.
- Changed the vertheight and rounding-error-checking code in
	DCanvas::DrawTexture() to calculate off the actual bottom of the image
	instead of the height, improving precision. Now the scaled status bar is
	flush with the bottom of the screen at 1280x1024, for instance.
- Added a new WIF_NO_AUTO_SWITCH flag for weapons that should never be
	switched to automatically when the player picks them up.

January 18, 2007
- Added D3DCREATE_FPU_PRESERVE to the IDirect3D9::CreateDevice() call.
	Normally Direct3D sets the FPU to single precision. We don't want that,
	since it can mean going out of sync with machines that are using the
	standard precision. Additionally, the nodebuilder requires the extra
	precision that single precision lacks.
- Replaced the vector math routines with the ones I developed for the FP code.

January 15, 2007
- Added a summonfoe CCMD, which is analagous to summonfriend but forces the
	summoned creature to be hostile instead.
- Changed the default snd_output under Linux to OSS.
- Added a GTK+ version of the IWAD selection dialog box. That brings the
	Linux port one step closer to feature parity with the Windows version.

January 15, 2007 (Changes by Graf Zahl)
- added Grubber's submission for customizable gravity per actor.

January 14, 2007 (Changes by Graf Zahl)
- Fixed: A_Jump didn't work for weapons or CustomInventory items.

January 13, 2007 (Changes by Graf Zahl)
- Adjusted AlterWeaponSprite so that it properly handles multiple
	invisibility powerups at the same time.

January 13, 2007
- Integrated the fatal error display into the text logger.
	Next: Figure out how to do all this fancy new startup window stuff with GTK+
	so Linux users don't feel left out.

January 12, 2007 (Changes by Graf Zahl)
- Converted the StrifePlayer to DECORATE. Even though it requires exporting
	3 new code pointers without general use it was necessary to handle
	GiveDefaultInventory consistently for all players without the need to
	subclass this function.
- Added a Player.RunHealth property to expose the StrifePlayer's behavior of
	not being able to run when its health is below 10.
- Changed APlayerPawn::GiveDefaultInventory so that it always adds a HexenArmor
	and a BasicArmor item to the inventory. If these items are not the first ones
	added to the inventory anything else that might absorb damage is not guaranteed
	to work consistently because their function depends on the order in the inventory.
- Changed handling of APowerup's DoEffect so that it is called from the owner's
	Tick function, not the item's. This is so that the order of execution is
	determined by the order in the inventory. When done in the item's Tick function
	order depends on the global thinker table which can cause problems with the
	order in which conflicting powerups apply their effect. Now it is guaranteed
	that the item that was added to the inventory first applies its effect last.
- Fixed: Added checks for Speed==0 to A_Tracer and A_Tracer2 because this could
	cause a divide by zero.
- Fixed: P_MoveThing must also set the moved actor's previous position to
	prevent interpolation of the move.
- Fixed: APowerInvisibility and its subclasses need to constantly update
	the owner's translucency information in case of interference between different
	subclasses. Also changed Hexen's Cleric's invulnerability mode to disable
	the translucency effect if an invisibility powerup is active.

January 9, 2007 (Changes by Graf Zahl)
- Added Skulltag's REDMAP and GREENMAP.
- Fixed: The PlayerSpeedTrail must copy the player's scaling information
	(from Skulltag)
- Added r_maxparticles CVAR from Skulltag.
- Changed PCX loader so that it always loads the last 768 bytes of 8 bit graphics
	as a palette

January 8, 2007
- Added escape code support to the echo CCMD, so you can use colors with it.
- Changed the color scheme for the startup log to light text on a dark
	background and added color support to it.
- When a fatal error occurs, the log window is now scrolled so the final
	lines are guaranteed to be visible.
- Fixed: ShowErrorPane() crashed if it was called before the main window was
	created.
- Removed the game title banner for the ENDOOM display and replaced it with a
	short prompt at the bottom of the window.
- Halved the number of times the Strife startup screen updates the progress
	bar so that it spends less time drawing and gets done loading faster.
- Fixed: The quad FBD3D draws to the screen was one pixel too tall.

January 7, 2007 (Changes by Graf Zahl)
- Fixed: Sorting of files in Zips was broken.
- Ported GZDoom's deep water splash code so that splashes are handled properly
	in Boom maps with non-swimmable water.
- Changed ENDOOM CVAR so that there is an option to show only modified versions.

January 6, 2007
- Added simulation of Strife's startup screen.
- Switched from a 14-pixel tall VGA font to a 16-pixel tall one for the
	Heretic loading screen (and ENDOOM).

January 6, 2007 (Changes by Graf Zahl)
- Added ENDOOM screen. It will only be shown when the game is exited via the
	main menu and there is an option to switch it off for those who don't want
	to wait.

January 5, 2007
- Added simulation of Heretic's startup screen.
- Changed copyright notice for i_main.cpp, since none of it is really id's
	code.

January 5, 2007 (Changes by Graf Zahl)
- Added customizable border textures. They will be defined with the
	MAPINFO keyword 'bordertexture' and are settable per map.
- Fixed: When used in DECORATE A_Explode must use A_ExplodeParms.
- Added custom label support to A_Chase. To enable resurrection from the
	customizable version I also moved all A_VileChase stuff into p_enemy.cpp.

January 4, 2007
- Added simulation of Hexen's startup screen (currently minus net notches).

January 2, 2007 (Changes by Graf Zahl)
- Fixed: The ANIMATED parser must read the bytes for the speed as unsigned bytes.
- Fixed: The screen wipe must be disabled for Heretic's underwater ending. If
	not, the wipe will try to mix pictures with different palettes.

December 31, 2006 (Changes by Graf Zahl)
- Fixed: Several actors for Doom were missing their spawn ID.

December 29, 2006
- Fixed: APlayerPawn::GiveDefaultInventory() used two different variables
	both named item.
- Switched ddraw.dll to be delay loaded. With D3D9 now being the default
	display code, this avoids wasting time loading DDraw if it isn't needed.

December 28, 2006
- Fixed: The Win32 I_FatalError() did not set alreadyThrown, so it could get
	stuck in an endless fatal error loop.
- Fixed: The SDL input code must convert the event.data1 to uppercase.
- Added more resolution options when playing windowed under SDL.
- Changed SDL mouse handling to be basically identical to the (non-DirectInput)
	Win32 code. The mouse is polled periodically and constantly warped to the
	center of the window. Despite what the SDL docs specify, SDL_WM_GrabInput()
	is apparently no longer a reliable means of obtaining continuous relative
	mouse motion events.
- Fixed: The non-Windows implementation of I_FindClose() did not check for -1
	handles.
- Fixed all the warnings from GCC 4.2, including a handful that were present in
	older GCCs.
- Fixed: The VC++ project was not set up to redefine RM using del in
	wadsrc/Makefile, nor did it use the makefile for cleaning.
- Added ST_NetMessage() for mixing miscellaneous messages with the network
	startup meter, since they get mixed in the same space on the Linux terminal
	and must be handled properly to avoid looking bad.
- Fixed the new network status display for the Linux terminal.

December 25, 2006 (Changes by Graf Zahl)
- Converted the Communicator to DECORATE.
- Renamed the new armor properties to use the same names as Skulltag to avoid
	confusion. They still don't need a separate base class as in Skulltag though.
- Added Skulltag-type armor bonus that increases the max amount that can be given
	by other armor items.
- Separated all armor related code from a_pickups.cpp into a_armor.cpp.

December 24, 2006 (Changes by Graf Zahl)
- Replaced several calls to S_GetSoundPlayingInfo with S_IsActorPlayingSomething
	because S_GetSoundPlayingInfo cannot properly resolve player and random sounds.
- Fixed: S_IsActorPlayingSomething has to resolve aliases and player sounds.
- Took S_ParseSndSeq call out of S_Init. This doesn't work when parsing SNDINFO
	in D_DoomMain.
- Moved SNDINFO reading back to its old place after MAPINFO. This is necessary
	for Hexen's music definitions.
- Added new flag MF5_NOBLOODDECALS that prevents bleeding actors from spawning
	blood decals.

December 23, 2006 (Changes by Graf Zahl)
- Fixed: The Cacodemon doesn't have a melee attack defined as I mistakenly
	assumed when writing its DECORATE code.
- Fixed: Commander Keen's death sequence had one state duplicated.
- Fixed: Due to the changes for custom states the internal weapons shouldn't
	define a holdatk state unless it differs from the attack state.
- Fixed: The bot code tried to spawn ACajunBodyNode instead of CajunBodyNode.
- Changed: MF2_BLASTED doesn't work well for players so I had to take it out
	of A_BlastRadius.
- Fixed: When MF2_BLASTED was cleared MF2_SLIDE got cleared as well, no matter
	whether it was set by default or not. Now the MF2_SLIDE check checks both
	flags and the BlastRadius code doesn't set MF2_SLIDE anymore.

December 22, 2006
- Fixed: If anyone other than the most recently-connected player aborted
	during i_net handshaking, everybody who connected after them would have
	the wrong idea of what their player number was.
- Guests can now watch as other guests connect during i_net handshaking.
- Fixed: The host would let more than the desired number of players connect.
- Decreased the frequency of packets in ST_NetLoop() to two per second.
- Fixed: During the i_net handshaking, guests never verified that the messages
	they received were from the host.
- Removed the -net command line option. I'm not sure it even worked anymore.

December 20, 2006
- Turned on warning level 4 just to see what it would produce: a lot of
	warnings. At first, I was going to try and clean them all up. Then I decided
	that was a worthless cause and went about just acting on the ones that
	might actually be helpful:
	 C4189 (local variable is initialized but not referenced)
	 C4702 (unreachable code)
	 C4512 (assignment operator could not be generated)

December 19, 2006
- Fixed: D3DFB::Reset() also needs to restore the texture border color,
	otherwise it gets reset to black and unused.
- Fixed: I_SetWndProc() needs to be called before any of the DirectX
	interfaces are initialized, because DirectX subclasses the window itself,
	and I_SetWndProc() undoes that subclassing.

December 19, 2006 (Changes by Graf Zahl)
- Fixed: Inventory.Icon printed error message for all the missing icons in
	Strife's teaser.
- Fixed: st_start.cpp needed a
	#define _WIN32_WINNT 0x0501.
- Fixed a few uninitialized variables warnings for GCC.

December 18, 2006
- Reorganized the network startup loops so now they are event driven. There is
	a single function that gets called to drive it, and it uses callbacks to
	perform the different stages of the synchronization. This lets me have a nice,
	responsive abort button instead of the previous unannounced hit-escape-to-
	abort behavior, and I think the rearranged code is slightly easier to
	understand too.
- Increased the number of bytes for version info during D_ArbitrateNetStart(),
	in preparation for the day when NETGAMEVERSION requires more than one byte.
- I noticed an issue with Vista RC1 and the new fatal error setup. Even after
	releasing a DirectDraw or Direct3D interface, the DWM can still use the
	last image drawn using them when it composites the window. It doesn't always
	do it but it does often enough that it is a real problem. At this point, I
	don't know if it's a problem with the release version of Vista or not.
	After messing around, I discovered the problem was caused by ~Win32Video()
	hiding the window and then having it immediately shown soon after. The DWM
	kept an image of the window to do the transition effect with, and then when
	it didn't get a chance to do the transition, it didn't properly forget about
	its saved image and kept plastering it on top of everything else
	underneath.

December 16, 2006
- Added a network synchronization panel to the window during netgame startup.
- Fixed: PClass::CreateDerivedClass() must initialize StateList to NULL.
	Otherwise, classic DECORATE definitions generate a big, fat crash.
- Resurrected the R_Init progress bar, now as a standard Windows control.
- Removed the sound failure dialog. The FMOD setup already defaulted to no
	sound if initialization failed, so this only applies when snd_output is set
	to "alternate" which now also falls back to no sound. In addition, it wasn't
	working right, and I didn't feel like fixing it for the probably 0% of users
	it affected.

December 16, 2006 (Changes by Graf Zahl)
- Fixed: The smartaim logic was incorrect. Also added another mode: Autoaim only
	at monsters.
- Merged FActorInfo::FindStateExact and FActorInfo::FindState into one function
	because the differences are only minimal.
- Removed all the varargs FindState functions because they aren't really needed.
	The engine itself never explicitly checks for more than 2 labels and for the
	rest a function that gets passed a FName array is more suitable anyway.
- Changed state label storage so that each actor owns all the state labels itself
	and doesn't have to traverse parent lists to find them. This is required for
	Dehacked actors that inherit states (e.g. NonsolidMeat and Spectre) but it also
	makes the data much easier to handle.
- Merged the fallingdamage setting into one menu item and added Strife damage to it.
- Moved deathmatch options into their own category in the gameplay options menu.
- Added the sv_smartaim code from GZDoom which tries to avoid autoaiming
	at friendlies or shootable decorations if there are monsters that can be shot.
- Added: SetThingSpecial treats a tid of 0 as the activator.

December 15, 2006
- Fixed: The edit control used for logging output added text in reverse order
	on Win9x.

December 13, 2006 (Changes by Graf Zahl)
- Fixed: The particle fountains' names were different than before
- Fixed: FTexture::CheckForTexture should return NULL if the texture it
	finds is of type FTexture::TEX_Null. If this isn't done not all occurences
	of AASHITTY being used to silence an editor's error checker will be handled
	correctly. In particular the transparent door trick will break.

December 10, 2006 (Changes by Graf Zahl)
- Fixed: When a DehackedPickup replacement object is created it must copy
	the state labels of the parent object.

December 9, 2006
- Went back to the roots and made graphics initialization one of the last
	things to happen during setup. Now the startup text is visible again. More
	importantly, the main window is no longer created invisible, which seems
	to cause trouble with it not always appearing in the taskbar. The fatal
	error dialog is now also embedded in the main window instead of being a
	separate modal dialog, so you can play with the log window to see any
	problems that might be reported there.

	Rather than completely restoring the original startup order, I tried to
	keep things as close to the way they were with early graphics startup. In
	particular, V_Init() now creates a dummy screen so that things that need
	screen dimensions can get them. It gets replaced by the real screen later
	in I_InitGraphics(). Will need to check this under Linux to make sure it
	didn't cause any problems there.
- Removed the following stubs that just called functions in Video:
		- I_StartModeIterator()
		- I_NextMode()
		- I_DisplayType()
	I_FullscreenChanged() was also removed, and a new fullscreen parameter
	was added to IVideo::StartModeIterator(), since that's all it controlled.
- Renamed I_InitHardware() back to I_InitGraphics(), since that's all it's
	initialized post-1.22.

December 9, 2006 (Changes by Graf Zahl)
- Fixed: P_LookForTid should abort its search when it discovers that it has
	cycled through the entire list of actors.
- Reverted AActor::FindState to its R407 version because the change in R408
	doesn't compile properly with VC++.
- Changed FIXMAPTHINGPOS further so that it also affects objects that are
	not directly on a wall but closer than its radius.
- Changed FIXEDMAPTHINGPOS to move objects completely out of the wall and
	adjusted the radii of all affected objects to actually represent half
	the sprite's width.

December 8, 2006 (Changes by Graf Zahl)
- Fixed: The Acolyte's obituary wasn't printed.
- Fixed: The fighter player's attack state used the Cleric's sprite.

December 5, 2006 (Changes by Graf Zahl)
- Moved A_ThrowGrenade from Inventory to Actor because it can also be used by
	monsters
- Added velocity multiplicators to A_SpawnDebris.
- Changed: A_JumpIfNoAmmo should have no effect for CustomInventory items.
- Fixed: DECORATE jump commands must set the call state's result to 0
	even when they have to return prematurely.
- Added obituaries for Strife's and Hexen's monsters.
- Converted Strife's Bishop to DECORATE.
- Added momx, momy and momz variables to the DECORATE expression evaluator.

December 3, 2006
- Modified the trustInfo for updaterevision.exe so that it should be
	fine even with the buggy mt.exe that comes with Visual C++ 2005.
	(Note that the Platform SDK for Windows Server 2003 R2, and later
	versions of the Windows SDK also come with a working mt.exe that
	work fine with the old trustInfo.)

December 2, 2006 (Changes by Graf Zahl)
- Converted the Heretic sound sequences and the particle fountains to DECORATE.
- Added DECORATE support for setting an actor's args. If this is done
	it will also disable the actor's special that can be set in a map. This
	is for actors that want to use A_CountdownArg or similar functions
	that use the args for something different than the special's parameters.
- Converted a_sharedmisc.cpp to DECORATE.
- Added a new NActorIterator that can search for classes specified by name.
- Added a new constructor to TThinkerIterator that can search
	for DECORATE defined subclasses that are not represented by a real C++ class.
- Fixed: BuildInfoDefaults must set the parent symbol table so that
	all actors can get to the global symbols stored in AActor.
- Fixed some minor inconsistencies in the Arch-Vile's DECORATE definition.
- Fixed: A_VileAttack moved the flame without relinking it into the sector
	lists. It also forgot to set the z-position correctly. (original Doom bug.)
- Fixed: The Doom 2 cast finale didn't work with the dynamic state name handling.

November 30, 2006
- Finished the framework for specifying all action functions externally,
	including restricting them to particular classes.
- Removed all the "fast" and unused code from FColorMatcher. Today's
	computers are fast enough that the difference isn't even noticeable
	unless you're doing hundreds of thousands of matches, and I never had
	any plans to improve the algorithm the "fast" code used.
- Fixed: BestColor() should not by default return 0 as a possible match,
	since it's normally the transparent color.
- The DSimpleCanvas constructor now fills MemBuffer with zeros.
- Fixed: If the FBTexture wasn't exactly the same size as the screen,
	D3DFB::PaintToWindow() would still lock it with D3DLOCK_DISCARD. Alas,
	I saw no speedup for using a dirty region. (Side note: The Radeons are
	apparently slower compared to DirectDraw because they must do
	power-of-2 textures. If they ever add non-power-of-2 support like nvidia,
	I assume they will also see a speed gain.)
- Changed fb_d3d9.cpp so that instead of trying to compensate for Geforce
	off-by-one errors in the pixel shader, it automatically detects where
	the error occurs and modifies the way the palette is uploaded to
	compensate. Palette color 255 is then represented using the texture
	border color instead of actually being part of the palette. This should
	work correctly with all cards, since I had a report of an FX where the
	off-by-one occurred in a different spot from the place where I observed
	it on a 6 and 7 series cards. Since the shader now has one fewer
	instruction, I notice a very marginal speedup. (Interestingly, removing
	the flash blending from the shader had no perceivable performance gain.)

November 29, 2006 (Changes by Graf Zahl)
- Fixed: The DECORATE expression evaluator evaluated operators of same
	precedence right to left instead of left to right.
- Added global constants to DECORATE so that I can define meaningful flag
	names for some DECORATE functions. Technically these will be constants
	of the AActor class but that will make them accessible in all other actor
	classes.
- Made the constructor of PSymbolTable inline. Having this a real function
	adds 100kb to the EXE, mostly needless exception handling code.

November 28, 2006 (Changes by Graf Zahl)
- Fixed: The StrifePlayer couldn't obtain his default inventory because
	APlayerPawn::GiveDefaultInventory gave him some HexenArmor even though
	he doesn't need it.
- Added custom blood type properties to DECORATE.
- Converted Blood to DECORATE and made some minor changes to the code
	in preparation for custom blood types.
- Converted the bot helper things to DECORATE.
- Added damage type specific crash states.

November 28, 2006
- Started adding action function declarations to objects.
- Added integer constant declarations to objects.
- Added some new token-based functions to sc_man.cpp that know about keywords
	and record proper type information, so parsers don't need to treat
	everything as strings.
- Added a simple symbol table to PClass.

November 27, 2006 (Changes by Graf Zahl)
- Changed: When playing a shareware game no external WADs are loaded at all,
	not even zvox.wad or the skins directory.
- Minor improvement of Hexen's Demons: They now transfer the translation
	to the chunks they spawn so that they look correct if they are color
	translated. See Resurrection of Chaos for an example.
- Converted Key gizmos to DECORATE.
- Converted Heretic's Beast (Weredragon) to DECORATE.
- Added a randomness parameter to A_SpawnItemEx. This allows
	spawning objects with a random chance without the need to write
	complicated A_Jump constructs.
- Converted Heretic's Mummy to DECORATE.
- Converted Hexen's Demons to DECORATE.

November 26, 2006 (Changes by Graf Zahl)
- Converted Ettin and Centaur to DECORATE.
- Made the Ettin's and Centaur's howling sound an actor property.
- Added A_CustomComboAttack function to finally have something that can
	replace the old A_ComboAttack function.
- Added A_SpawnItemEx function that removes the problems with A_SpawnItem
	and which also should make most of the A_CustomMissile abuse unnecessary.
- Added A_QueueCorpse to the list of DECORATE code pointers.
- Made the size of Hexen's corpse queue configurable by CVAR
	(sv_corpsequeuesize.) Setting this CVAR to -1 will disable corpse
	queuing completely so that even in Hexen all corpses will stay forever.
- Added random2 function to DECORATE's expression evaluator. This is to
	better emulate some calculation of internal code pointers.
- Added named RNG support to DECORATE's expression evaluator. Just use
	random[name](min, max).

November 25, 2006
- Reverted updaterevision.vcproj to r385 and added a note as a build event
	explaining the need to use mt.exe 6.0 or newer. Here is the note:
	VERY IMPORTANT: You must copy the mt.exe from %VSINSTALLDIR%\Common7\Tools\bin
	on top of the version in %VSINSTALLDIR%\VC\bin or your computer may restart
	while building.
- Changed the ASecretTrigger::Activate() fix: There's no reason open scripts
	shouldn't be able to activate secret triggers; players just won't get
	credit for it in coop.
- Added a NULL actor check to R_SetupFrame().
- Fixed: The player sounds in DEHSUPP were defined incorrectly.

November 25, 2006 (Changes by Graf Zahl)
- Fixed: SecretTriggers that were activated in an OPEN script caused a crash.
- Converted Heretic's Clink (Sabreclaw) to DECORATE.
- Added MissSound parameter to A_CustomMeleeAttack.
- Converted Heretic's Snake (Ophidian) to DECORATE.
- Added an option to A_CustomMissile to jump to the see state if
	the caller's target is dead.
- Fixed: A_ThrowGrenade didn't play the missile's spawn sound.
- Added MF_SPAWNSOUNDSOURCE flag so that Raven's missile spawning code
	pointers can be recreated with DECORATE.
- Converted a_ravenambient.cpp to DECORATE.

November 24, 2006
- Fixed: The backpack didn't give extra ammo in baby and nightmare modes.
- Fixed: When P_SpawnPlayer() calls DObject::PointerSubstitution() to
	redirect player pointers, it affects the bodyque too. That meant that in
	multiplayer games, once the bodyque filled up, anybody was in danger of
	being rudely destroyed the next time somebody respawned.

November 22, 2006
- Added a manifest with a trustinfo section to updaterevision.exe so that
	the build process can run uninterrupted under Vista.
- Fixed: DIRECT3DCREATE9FUNC needs WINAPI added to its prototype so that it
	works properly in release build, which defaults to __fastcall.

November 20, 2006
- Fixed: Polyobjects are serialized before players, which means that a call
	to PO_MovePolyobj() from P_SerializePolyobjs() for a crushing polyobject
	that touches a player actor will not have a valid actor->player->mo chain
	for P_DamageMobj and crash if it happens to touch the player. Since the
	polyobject was presumably in a good spot when the game was saved, we can
	just skip this step entirely and let it take care of itself the next time
	it moves (by which time, the players will be valid).
- Fixed: When transitioning from fullscreen to windowed mode with D3DFB, the
	window kept the WS_EX_TOPMOST style.
- Slight correctness fix: When in fullscreen, the window should have WS_POPUP
	style.
- Added a NULL target check to P_SpawnMissileXYZ(), A_DemonAttack1(),
	A_DemonAttack2_1(), and A_DemonAttack2_2().

November 18, 2006
- Fixed: DFrameBuffer and related classes did not use DECLARE_CLASS macros,
	so there was no guarantee that they would allocate the proper amount of
	memory. This tripped me up when I was using D3DFB and it was writing beyond
	the end of allocated memory.
- Added a new D3DFB class that should be more compatible with modern systems
	than the 8-bit paletted DDrawFB.
	Pros:
		- Much cleaner code.
		- No performance penalty when running in a window.
		- Slightly faster fullscreen performance on Geforce 6 and 7 cards.
		- Vista ought to love it.
	Cons:
		- Requires Pixel Shader 1.4 or better.
		- Fullscreen on an ATI Mobility x300 is a little slower (but still faster
			than DirectDraw in a window).
	Note that this is not hardware accelerated rendering. The screen is still
	drawn as before by the CPU to an 8-bit paletted surface. The difference is
	in how that surface makes its way to the visible display. Here, the surface
	is copied to an 8-bit texture, and a pixel shader converts it to RGB when
	drawing it.

November 14, 2006 (Changes by Graf Zahl)
- Made AActor's xscale and yscale properties full precision fixed point
	so now larger scales than 4 can be done.

November 10, 2006 (Changes by Graf Zahl)
- Added a check to P_CheckMissileSpawn to decrease the monster counter
	if it was called for spawning a monster with A_CustomMissile.
- Added a ML_BLOCK_PLAYERS line flag.

November 5, 2006 (Changes by Graf Zahl)
- Converted Heretic's and Hexen's players to DECORATE.
- Made Hexenarmor factors configurable by DECORATE.
- Added support for selecting the invulnerability mode per item as well.
- Made Invulnerability and Healing radius behavior selectable by player
	class instead of hard coding the special behavior to the Hexen classes.
- Converted the DoomPlayer to DECORATE.
- Extended all A_Jump commands to take labels as parameters in addition
	to offsets.
- Removed the deprecation warnings for the state assignment commands
	in DECORATE. While it is still recommended not to use them anymore
	they will continue to work with custom state support and existing
	DECORATE code doesn't have to be changed. However, they will remain
	limited to the existing functionality, nothing more.

November 4, 2006 (Changes by Graf Zahl)
- Replaced the static string buffer in ProcessStates with an FString.
- After doing some tests with state label scopes I had to conclude that
	using '.' both for separating sub-state-labels and scope resolution
	identifiers does not work reliably unless all actor class names were
	prohibited from being used as state labels.  Since that is undesirable
	the only solution is to change the scope resolution operator. Fortunately
	no WADs so far have used it so implementing such a breaking change isn't
	a major issue. Now it uses '::', like C++ for this purpose.
- Converted Revenant, Mancubus and Pain Elemental to DECORATE.
- Converted Arachnotron, Archvile, Cyberdemon, Spidermastermind and
	CommanderKeen to DECORATE.
- Converted ExplosiveBarrel, BulletPuff and DoomUnusedStates to DECORATE.
- Added VSpeed DECORATE property so that an actor can be given an initial
	vertical speed.
- Removed the barrel check in P_DamageMobj. AActor::Die is doing the same
	operation unconditionally so this is redundant.
- Added A_BarrelDestroy to the list of DECORATE code pointers so that
	the same effect can be recreated for other items as well.
- Renamed A_BarrelRespawn to A_Respawn, changed it so that it works for
	monsters and added it to the list of DECORATE code pointers. Now Quake-style
	zombies should be possible. ;)
- Changed handling of MF4_RANDOMIZE so that it applies to all actors being
	spawned and not just projectiles.
- Converted Berserk and Megasphere to DECORATE.
- Fixed: HealThing should respect the stamina a player has and the Dehacked
	health compatibility flag if max is 0. To do that it calls P_GiveBody now.

November 1, 2006 (Changes by Graf Zahl)
- Fixed: The Cacodemon had a FastSpeed definition even though it shouldn't.
- Fixed: FastSpeed was used unconditionally when defined.

October 31, 2006 (Changes by Graf Zahl)
- Fixed: SetActorPitch with a 0-tid (i.e. affect the activator) set the angle
	instead of the pitch.
- Fixed: The check for special death states in AActor::TakeSpecialDamage didn't
	work.
- Fixed: The global WeaponSection string was never freed. It has been replaced
	with an FString now.
- Fixed: The music strings in the default level info were never freed and
	caused memory leaks when used repeatedly.
- Fixed: The intermusic string in the level info was never freed.
- Fixed: The default fire obituary should only be printed if the damage
	came from the environment. If it comes from a monster the monster specific
	obituary should be used instead.
- Added custom damage types from the floating point test release.
- Changed Pain Elemental's massacre check. Now A_PainDie checks for the damage
	type and doesn't spawn anything if it is NAME_Massacre. A_PainDie can also
	be used by other actors so a more generalized approach is needed than hard
	coding it into the Pain Elemental.
- Converted a few of Doom's monsters to DECORATE because I couldn't test the
	first version of the custom state code with the corpses inheriting from them.
- Added custom states from last year's floating point test release and fixed
	some bugs I found in that code. Unfortunately it wasn't all salvageable
	and it was easier to recreate some parts from scratch.

October 30, 2006
- Version bump to 2.1.7.
- Fixed: Placing a /* */ comment at the very end of a file without a
	terminating newline would not parse reliably.
- Added a NULL WallSpriteTile check to R_RenderDecal().

October 28, 2006 (Changes by Graf Zahl)
- Changed parameter storage for states to use a separate member variable
	instead of forcing it into misc1/misc2. Although this increases the EXE's
	size by 30k it has several advantages:
	* State parameters are no longer limited to 65535 for all states combined.
	* State parameters can be used with long durations.
	* Some special handling in the weapon state set functions can be removed.

October 26, 2006
- Removed A_JumpSet and merged its functionality with A_Jump by turning
	A_Jump into a varargs function.
- Fixed: P_MorphPlayer() should check that the desired type is actually a
	PlayerPawn.
- Added an optional parameter to the morphme ccmd that specifies the player
	class to morph into.
- Changed the SetActorPitch, SetActorAngle, Thing_Spawn*, Thing_Projectile*,
	and Thing_Move functions so that TID 0 affects the activator.

October 25, 2006 (Changes by Graf Zahl)
- Fixed: The MinotaurFriend's MF4_NOTARGETSWITCH was put on AMinotaurFX1.
- Moved the sector type translation for Doom format maps into a simple lump
	in zdoom.pk3.
- Changed Line_SetIdentification so that the fifth arg is a high-byte for the
	line ID.

October 23, 2006
- Added the A_JumpSet function for what seems to be a fairly common scenario.
	It is like A_Jump, except it accepts up to 20 jump targets. The jump
	probability is still the first parameter and controls whether any jump is
	taken at all; use 256 if you always want to jump. If a jump is taken, then
	one of the jump targets will be chosen at random, with each target having
	an equal chance of being chosen.
- Fixed: The unfreeze ccmd was not multiplayer-safe. And I renamed it to thaw,
	since it has nothing to do with the freeze ccmd.

October 22, 2006 (Changes by Graf Zahl)
- Added MF5_PIERCEARMOR flag that allows damaging objects that aren't
	affected by armor.
- Added an unfreeze CCMD so that frozen players can be unfrozen for testing.
- Added special death states for projectiles hitting actors.
- Added ACS SetActorPitch/GetActorPitch functions.
- Added cameraheight property for actors.

October 21, 2006 (Changes by Graf Zahl)
- Fixed: The yellow color range contained gaps in its definition which
	resulted in incorrect colors.
- Fixed: FFont::BuildTranslations didn't clamp the RGB color values. This
	can happen if some font colors overflow or underflow due to incomplete
	range specifications.

October 20, 2006
- Fixed: ExpData::EvalConst() did not NULL the children pointers for binary
	operators after deleting them, so ~ExpData() would try to delete them again
	later.

October 19, 2006
- Added a new MapMarker actor. Instead of appearing in the 3D view, it appears
	on the automap instead. If its first argument is zero, the map marker itself
	appears on the automap, otherwise it is drawn on top of any actor with a TID
	matching that argument. If the second argument is one, then the map marker
	will only be appear if the player has previously seen the sector it is one.
	You can use Thing_Activate and Thing_Deactivate on markers to turn them on
	and off. And if you subclass MapMarker with DECORATE, you can easily make
	your own custom markers.
- Fixed: Map markers could not be drawn partially off the map. They were
	drawn either fully or not at all.
- Fixed: Map markers appeared in the wrong place on a rotated overlay map if
	screenblocks < 10.
- Added the MF2_PASSMOBJ for P_Thing_Spawn() from January 4, 2003, to
	DLevelScript::DoSpawn().
- Changed VectorNormalize() (and VectorNormalize2) to use doubles for storing
	the vector lengths, fixing desyncs between GCC/VC++ games that happened
	because the two compilers produced slightly different results for some
	slopes. GCC kept them in registers, so they were never truncated to floats.
	VC++ stored them to memory and reloaded them in order to truncate them to
	the defined precision. Lesson learned: Floating point numbers in local
	variables should always be doubles to produce the best code with VC++ that
	has the best chance of matching GCC's default behavior.
- Removed netget and netsend function pointers. PacketGet and PacketSend are
	now called directly.
- Fixed: Watching a demo from the point of view of someone other than the
	first player could cause a crash when the demo ended.
- Removed invcount from the expression evaluator at Grubber's suggestion,
	because it doesn't work.
- Fixed: vid_nowidescreen should fire off setsizeneeded so that changes to it
	can happen immediately instead of at the next resolution change.
- Modified the way autosaves are done. Instead of setting gameaction to
	ga_autosave, write DEM_CHECKAUTOSAVE to the net stream. When this is
	processed, it will check if it's okay to do an autosave. If it is, it writes
	DEM_DOAUTOSAVE to the net stream, which the sets gameaction to ga_autosave.
	Essentially, about half of the functionality was moved out of G_DoAutoSave()
	and into Net_DoCommand().
- Minor changes to OS detection: The os_WinNT enumeration has been renamed to
	os_WinNT4, since every new OS coming out of Microsoft these days is
	essentially NT. NT 5.2 and 6.0 are now properly identified as "Windows
	Server 2003" and "Windows Vista" respectively, and any unknown NT versions
	Microsoft introduces in the future will now be displayed as "Windows NT"
	instead of "Windows 2000" if the minor version is 0 and "Windows XP" if the
	minor version is non-0. Win32s detection has also been removed. Presumably
	if somebody is foolish enough to try to run this on Windows 3.x with Win32s,
	it won't even load due to missing DLLs.

October 15, 2006 (Changes by Graf Zahl)
- Changed the rocket so that the FX_ROCKET flag is set in the actor
	definition and not in BeginPlay.
- Changed the special explosion behavior of the rocket to a flag
	(MF5_DEHEXPLOSION) so that its effects can be used on other actors
	as well without having to inherit from the rocket.

October 9, 2006
- Fixed: Demos with NETD chunks should not set netgame to true unless they
	have more than one player. And since netdemo is ignored if netgame is
	false, it doesn't need to set that either.
- Fixed: FTexture::GetScaled* functions did not check for scale values of 0.

October 7, 2006 (Changes by Graf Zahl)
- Fixed: PrintAlias passed FString objects directly to Printf.
- Added bitwise not (~) operator to ACS.

October 6, 2006 (Changes by Graf Zahl)
- Fixed: Hires texture replacements must call AddPatch if the texture
	isn't defined yet in order to replace lumps that are not in the
	list of preinitialized graphics.
- Changed font initialization to occur after textures have been completely
	initialized. This is necessary so that the font characters can be
	replaced with hires versions.

October 5, 2006 (Changes by Graf Zahl)
- Fixed: Hires texture replacements and auto-scaled flats require the
	bWorldPanning flag. Also added some NULL pointer checks to the
	hires texture loading code.
- Added Sector_SetFloorScale2 and Sector_SetCeilingScale2 line specials.
	They are mostly the same as Sector_Set*Scale but take fixed point parameters.
	This makes them easier to use and more precise than the old ones which
	offered very small fractional precision.
- Changed Thing_Deactivate so that passing a tid of 0 deactivates the calling
	actor.
- Added MeansOfDeath parameter to DamageThing.

October 4, 2006
- Added alias parameter substitution. Instances of %x in the alias command
	string will be replaced with parameter x when the alias is executed.
- Fixed: When FString::LockBuffer() had to create a new string because the
	RefCount was higher than one, the new string was not actually locked.
- FConsoleAlias now stores the commands in FStrings.
- BuildString() now returns an FString.
- Added the muslib license text to muslib.h.

October 4, 2006 (Changes by Graf Zahl)
- When exiting the level on a damaging floor the player could be in the pain
	state and make its pain noise at the start of the next level.
- Fixed: The FPS counter obstructed the key display in Doom's fullscreen HUD.

October 2, 2006
- Fixed: V_BreakLines() failed to produce output for the final line if it was
	only one character long.
- Fixed: When players respawned in multiplayer, scripts that started on their
	old body kept executing on that body instead of being transferred to the new
	one. I'm doing this with general pointer substitution now, so everything
	that pointed to the old body will use the new one; not sure if that's best,
	or if it should applied exclusively to scripts, though.
- Fixed: Hexen's delay ACS command actually waited one extra tic. Now if
	you're playing Hexen and an old-style ACS script delays it will wait one
	extra tic in ZDoom as well.
- Fixed: When G_FinishTravel() created a temporary player, P_SpawnPlayer()
	thought the old player actor was a voodoo doll and stopped its scripts
	and moved its inventory.

September 30, 2006
- Fixed: player_t::GetSpawnClass() always returned the spawn flags for the
	local player, so co-op games would spawn only the things relevant for the
	local player and not all the things relevant for all players.

September 30, 2006 (Changes by Graf Zahl)
- Fixed: Default flags for APlayerPawn and APlayerChunk were not defined.
- Fixed: The PCD_GETPLAYERINFO case in p_acs.cpp was missing a break.

September 27, 2006 (Changes by Graf Zahl)
- Fixed: Monsters should never target friends, even if the friendliness
	state has changed since the target has been acquired.
- Fixed: Multiplayer telefrag obituaries must be handled before weapon
	dependent obituary messages.

September 26, 2006
- PClass::StaticInit() now sorts the class metadata so that operations that
	iterate over it (such as the "give all" cheat) are compiler-independant.

September 25, 2006 (Changes by Graf Zahl)
- Fixed: ACustomInventory::CallStateChain couldn't be called recursively
	so any item that was giving another CustomInventory item didn't work
	as intended.
- Fixed: CustomInventory items didn't process A_Jump... commands properly
	for non-players.

September 23, 2006 (Changes by Graf Zahl)
- Fixed: Starting a new game didn't remove the deferred scripts.

September 22, 2006
- Fixed: FNodeBuilder::ShoveSegBehind needs to check that the result from
	Heuristic is positive, not just non-zero.

September 20, 2006 (Changes by Graf Zahl)
- Fixed: Summoned friendly monsters added to the total kill count.

September 19, 2006
- Added a dialog that gives the user the chance to fix things if the config
	could not be saved for some reason.
- Added the writeini console command to write the config file, optionally
	specifying a specific file name for it.
- Fixed: "Multiplayer" demos that only had one player were not played back
	properly because the demo playback code only checked the number of players
	to determine if it should be played as a netdemo.
- Assembly code is disabled when building with __APPLE__ defined, for now.
- If you aren't targeting x86, m_fixed.h only includes basicinlines.h now.
- Moved x64inlines.h into basicinlines.h.
- Replaced uses of __int64 with types from doomtype.h.
- The stop console command no longer ends single player games, just the demo
	that was being recorded.
- In C mode, the sc_man parser no longer allows multi-line string constants
	without using the \ character to preface the newline character. This makes
	it much easier to diagnose errors where you forget the closing quote of a
	string.
- Fixed: V_BreakLines() added the terminating '\0' to the last line of the
	input string.
- Added font as a parameter to V_BreakLines and removed its keepspace
	parameter, which was never passed as anything other than the default.

September 18, 2006
- Removed REGEXEPEEK. It was only there for a Dev-C++ project, and the Dev-C++
	project was long ago removed, thanks to that particular IDE being so agonizingly
	slow.

September 17, 2006 (Changes by Graf Zahl)
- Fixed: Texture scale calculations for HIRESTEX were incorrect.
- Fixed: The sky scrolling calculations caused an integer multiplication overflow.
- Fixed: Voodoo dolls should not start ENTER scripts.
- Fixed: ActorDamage must not parse the enclosing parentheses as part of the
	expression. That will produce an error if a flag set or clear command immediately
	follows.
- Fixed: P_DamageMobj ignored MF2_NODMGTHRUST if the damaging object had no
	owner.
- Added a 'font' parameter to A_Print.
- Changed A_CustomMeleeAttack to take one damage parameter only. Since expressions
	can be used this value is not used as a factor for a random value but as
	a direct damage value instead.
- Fixed: AActor::SetState must check whether a called action function resulted
	in the actor's destruction. A_Jump constructs to a 0-length terminating
	state will hang if this isn't checked.

September 13, 2006
- Moved the vid_fps display to the upper-right of the screen.
- The stat display can now show multiple stats at once.
- Fixed: cycle_t was still a DWORD and not a QWORD under GCC.
- The stat meters now return an FString instead of sprintfing into a fixed
	output buffer.
- NOASM is now automatically defined when compiling for a non-x86 target.
- Some changes have been made to the integral types in doomtype.h:
	- For consistancy with the other integral types, byte is no longer a
		synonym for BYTE.
	- Most uses of BOOL have been change to the standard C++ bool type. Those
		that weren't were changed to INTBOOL to indicate they may contain values
		other than 0 or 1 but are still used as a boolean.
	- Compiler-provided types with explicit bit sizes are now used. In
		particular, DWORD is no longer a long so it will work with both 64-bit
		Windows and Linux.
	- Since some files need to include Windows headers, uint32 is a synonym
		for the non-Windows version of DWORD.
- Removed d_textur.h. The pic_t struct it defined was used nowhere, and that
	was all it contained.

September 9, 2006 (Changes by Graf Zahl)
- Added support for scaled textures to DCanvas::DrawTexture.
- Changed deh.MaxHealth use to be consistent with other source ports.
- Added NULL pointer checks to APlayerPawn's state set functions. If these
	remove the player from the game a crash is the inevitable result.

September 8, 2006
- Fixed: Weapons did not give you double ammo at baby and nightmare skills.
- Fixed: SetTextureNoErr() in p_setup.cpp assumed that all color values were
	six characters. Although this was the intended way to specify colors,
	earlier versions did no error checking, so other lengths worked too.
- Fixed: FPatchTexture waited until MakeTexture() to call CalcBitSize(),
	so the width and height bit sizes weren't available when using it as a
	source for a warp texture.
- Fixed: R_InitSkyMap() should only warn about two sky textures not being
	the same height when they are used as part of a double sky.
- Added a NULL state check in AActor::Tick() before advancing the current
	state. Note that this should not happen, so there's an assert there for
	the debug build as well as a regular check for the release build.

September 1, 2006
- Version bump to 2.1.5.
- Fixed: P_LoadSegs() checked for invalid vertices too late.

August 31, 2006
- Changed: Starting a new game or reloading an old one reset the chasecam.
- Removed the r: ACS print cast. You can do it yourself with s: and an array.
- Replaced all the bool arguments to the ACS ReplaceTextures and SectorDamage
	commands with a single flags argument. SectorDamage also gained extended
	functionality: you can now make it hurt only players, only non-players, or
	both. Previously, hurting only non-players was not possible.
- Added the HUDMSG_COLORSTRING flag for ACS hudmessages. If you OR it in with
	the message type, the color will be treated as a string naming the color
	you want to use, so now you can use custom colors with hudmessages.

August 30, 2006
- Added the FNameNoInit class that is exactly like FName except it does not
	initialize its index, so it can be used from inside Actors without
	overwriting the runtime default value.
- V_BreakLines() now returns an array of FStrings instead of char *'s.
- Added support for custom text colors in messages like this:
		print (s:"\c[Chartreuce]This text is in the color 'Bleargh'");
	This also obsoletes some of the functionality of the r: print specifier
	before it even saw a release version, because you can do this with the
	standard colors too:
		print (s:"\c[Green]Some text");
- Added two new decorate functions: A_PlaySoundEx("sound_name", "channel"
	[, bLooping]) and A_StopSoundEx("channel"), where "channel" is "Auto",
	"Weapon", "Voice", "Item", "Body", "SoundSlot5", "SoundSlot6", or
	"SoundSlot7".
- Added a third parameter to S_IsActorPlayingSomething() to allow it to check
	if the actor is playing a specific sound.

August 29, 2006
- Moved the text color definitions out of the executable and into an external
	data file.
- Removed the setcolor CCMD. It's been obsolete for years, ever since color-
	aware cvars were added.
- Changed V_GetColorStringByName() to return an FString, because it did a
	copystring() call.
- Extended V_GetColorFromString() so that it accepts HTML-style #RRGGBB and
	#RGB color strings.

August 27, 2006 (Changes by Graf Zahl)
- fixed: callstatechain didn't check for NULL code pointers

August 25, 2006
- Fixed: Multiple-choice sound sequences could not be assigned IDs for use
	with polyobjects and the sound sequence selector things.

August 24, 2006
- Removed the 64 seg limit for polyobjects defined with Polyobj_ExplicitLine.
- Polyobj_StartLine and Polyobj_ExplicitLine can now set a line's ID. This is
	the fourth parameter for Polyobj_StartLine and the fifth parameter for
	Polyobj_ExplicitLine.
- Added support for DDS textures compressed with DXT1, DXT3, or DXT5.

August 23, 2006
- Fixed incorrect spawn ID for cell pack.

August 22, 2006
- Added Martin Howe's code for replacing environment variables in partial IWAD
	search paths.
- Added support for casting color names in ACS print-type statements. What that
	means is that instead of writing this:
		print (s:"\cDSome text");
	You can write this:
		print (r:CR_GREEN, s:"Some text");
- Added some new colors, based on the ones jimmy91 posted in the forum: cream,
	light blue, black, olive, dark green, dark red, dark brown, purple, and dark
	gray.
- Simplified FFont::BuildTranslations() and BuildTranslations2() to make adding
	new colors easier.

August 22, 2006 (Changes by Graf Zahl)
- Removed a few redundant calls to FTexture::GetWidth because all textures
	are now fully initialized when being created.
- Added GZDoom's HI_START/HI_END namespace and HIRESTEX support.
- Added sprite scaling support to the weapon drawing code

August 21, 2006 (Changes by Graf Zahl)
- Added support for PCX textures (1, 4, 8 and 24 bit variants.)

August 20, 2006 (Changes by Graf Zahl)
- Changed: Patch and IMGZ textures now initialize their dimensions upon creation.
	The lump is open anyway at that time so deferring this action until the information
	is needed doesn't give any speed improvements. Now GetDimensions and all its
	associated overhead is gone.
- Added support for TGA textures. It can handle all of the common variations
	of this format.
- Changed: GI_PAGESARERAW is no longer checked. It wasn't really necessary before
	because the chance of texture misidentification is absolutely minimal.
	But raw pages are now restricted to textures of type TEX_MiscPatch only.
- Changed the automap parchment to use a regular texture. The previous
	FAutomapTexture is only used as a last resort fallback now. If the code
	finds a recognizable graphic it will create a proper texture for it now.
- Fixed: Flats were only auto-scaled when in Doom flat format.
- Fixed: FMultiPatchTexture::CheckForHacks blindly assumed that all patches
	were FPstchTextures. Since the texture code does not have any type information
	I added a new flag bIsPatch for this purpose.
- Moved all texture classes into their own source files and created a new
	subdirectory 'textures' for that.
- Cleaned up the texture management code and added some stricter checks for
	the validity of Doom patches. The old code liked to crash when being passed
	some non-graphic data.

August 19, 2006 (Changes by Graf Zahl)
- Added custom fail messages to the puzzle items.

August 17, 2006 (Changes by Graf Zahl)
- Added a check to the map loader to check whether the map label
	is in the same WAD as the following lump.
- Did some minor reorganization of code in r_data.cpp (mostly to make
	handling of textures easier in GZDoom.)
- Did some preparations to allow loading folders on the HD into the lump
	directory.
- Took MF2_WINDTHRUST off AMorphedMonster. This is something that should not
	be a default setting.
- Moved a_artiegg.cpp to g_shared and renamed it to a_morph.cpp to better reflect
	its meaning.
- Fixed: AMorphProjectile's PlayerClass and MonsterClass members must be serialized
	as FNames. Serializing them as ints is not safe because name indices are not
	guaranteed to be the same each time the game is started. Same for APlayerPawn's
	MorphWeapon member.
- Converted EggFX, ArtiEgg, PorkFX and ArtiPork to DECORATE.
- Added a new parameter to A_FireCustomMissile. Previously it always aimed
	straight ahead and altered the projectile's angle according to the resulting
	direction. If the 6th parameter is 1 now it will aim at the specified angle
	directly.
- Changed custom morphing to be based on a new MorphProjectile class, not
	the Heretic specific EggFX. The EggFX properties are now prefixed with
	'MorphProjectile.'.

August 16, 2006
- Updated thingdef_specials.h for the new thingdef_specials.gperf file.
- Created a new MorphedMonster class that Chicken and Pig now derive from.
	This class automatically takes care of unmorphing the monster when its
	time is up.
- Made PlayerClass and MonsterClass properties of EggFX. You can override
	these in a subclass to create new kinds of morpher projectiles. Along with
	that, MorphWeapon is a new property of PlayerPawn that controls what type
	of weapon you have available while morphed ("None" means you have no
	weapons).
- Changed morphed monsters to record the time when they want to unmorph, not
	the time left until they unmorph. This simplifies calling
	P_UpdateMorhpedMonster() because you don't need to pass it a tic count.
- Added an optional second parameter to A_SpawnDebris and an optional
	fifth parameter to A_SpawnItem that both do the same thing: If you set it
	to 1, then the spawned actor will be assigned the same translation table
	as the actor that called the function.
- Moved the blood colorization in P_SpawnBlood() ahead of the SetDamage()
	call so that the blood color will available to the states of the blood
	actor.
- Extended the puke command so that giving it a negative script number will
	act like ACS_ExecuteAlways and always execute the script. (Ugh. Why did I
	use's Raven's cheat code to name this command?)
- Added action special support to the thingdef expression evaluator. Now you
	can use them like normal functions, which is probably most useful for
	ACS_ExecuteWithResult.
- Switched to IJG code for reading JPEG images. I have included a stripped-
	down version of the library with the ZDoom source. (It actually uses less
	space than zlib now.) Unix users probably ought to use the system-supplied
	libjpeg instead. I modified Makefile.linux to hopefully do that. I'm sure
	Jim or someone will correct me if it doesn't actually work.

August 14, 2006
- Added JPEG texture support, courtesy of Ken's Picture Library. I will
	probably switch to the IJG library once I pare it down. (Ken's code is 18K
	of C source but does not support progressive JPEG. The IJG library is over
	a megabyte of source and supports pretty much everything you would ever
	need ever.)
- Fixed endianness issue in FTextureManager::CreateTexture().
- Added support for interlaced PNGs. Now ZDoom is a mostly complete PNG
	reader. The only thing missing is 48-bit RGB and 16-bit grayscale support,
	which are just wastes of bits here, but also less likely to appear than
	an interlaced PNG. (However, if you are using interlaced PNGs for textures,
	then you are needlessly wasting space, since the image won't display
	progressively.)
- Fixed: Writing named screenshots didn't work.

August 12, 2006
- Added support for truecolor PNG textures. They still get resampled to the
	global palette, but at least they are visible now.
- Optimized UnfilterRow() in m_png.cpp a little.

August 11, 2006 (Changes by Graf Zahl)
- Fixed: P_CheckOnMobjZ returned the first thing an actor could stand on,
	not the highest possible.
- Added disintegration damage to SectorDamage.
- Bumped savegame version, min. savegame version, netgame version and
	demo version because the inventory and damage changes are incompatible
	with the old code.

August 11, 2006
- Added the ACS commands
	ReplaceTextures (str old_texture, str new_texture, optional bool not_lower,
			optional bool not_mid, optional bool not_upper, optional bool not_floor,
			optional bool not_ceiling); and
	SectorDamage (int tag, int amount, str type, bool players_only, bool in_air,
			str protection_item, bool subclasses_okay);
- Added the vid_nowidescreen cvar to disable widescreen aspect ratio
	correction. When this is enabled, the only display ratio available is 4:3
	(and 5:4 if vid_tft is set).
- Added support for setting an actor's damage property to an expression
	through decorate. Just enclose it within parentheses, and the expression
	will be evaluated exactly as-is without the normal Doom damage calculation.
	So if you want something that does exactly 6 damage, use a "Damage (6)"
	property. To deal normal Doom missile damage, you can use
	"Damage (random(1,8)*6)" instead of "Damage 6".
- Moved InvFirst and InvSel into APlayerPawn so that they can be consistantly
	maintained by ObtainInventory.

August 10, 2006 (Changes by Graf Zahl)
- Gave Strife's PhosphorousFire the MF2_NODMGTHRUST flag so that its
	damage is truly thrustless. The 'thrustless' parameter disabled all
	thrust done by PIT_RadiusDamage but not the one done by P_DamageMobj.
	Also gave Hexen's poison cloud the MF3_BLOODLESSIMPACT flag and made
	spawning of blood decals in PIT_RadiusAttack depend on that. Since with
	these changes the 'bombthrustless' argument to P_RadiusAttack is no
	longer useful I removed it.
- Fixed: CheckActorInventory stored the return value in the wrong address
	on the ACS stack.
- Fixed: Skin sounds weren't properly restored after a SNDINFO reset.

August 6, 2006 (Changes by Graf Zahl)
- Added a more flexible ACS ChangeLevel function. It gets passed a level name
	instead of a level number and has several additional options (e.g. changing
	skill, starting the map without monsters and clearing the players' inventories.
- Changed Thing_Activate so that passing a tid of 0 activates the calling actor.
- Changed Thing_Remove so that passing a tid of 0 removes the calling actor.
- Added DECORATE parameters to A_Saw.

August 2, 2006
- Fixed: The ACS VM made no checks for object files without strings, assuming
	that if it didn't have any strings, then it didn't matter what it calculated
	for the location of the string table because it would never be referenced.
	While this is true for a script all by itself, it means a crash if you have
	a map script without strings that imports a library with strings and the
	library tries to use one of its strings.

August 1, 2006
- It turns out that the Visual C++ 2005 runtime calls IsDebuggerPresent, which
	is not available under Windows 95. Since this is (or at least should be) the
	only thing preventing us from running under Windows 95, I added a stub that
	replaces __imp__IsDebuggerPresent@0 with a pointer to a function that checks
	for the real thing.

August 1, 2006 (Changes by Graf Zahl)
- Fixed: The pickup message for Hexen's fighter's axe was assigned to the
	AxePuff, not the weapon itself.
- Fixed: P_RunEffects used the consoleplayer's camera without checking its
	validity.
- Fixed: CopyFriendliness needs to copy target to LastHeard as well in order
	to make newly spawned monsters chase their spawner's target.

July 31, 2006 (Changes by Graf Zahl)
- Added a type check to Spawn(actorname,...) to allow it to print a
	meaningful message instead of the nondescript
	'Tried to spawn a class-less actor'.
- Converted AGlassJunk to DECORATE and made the spawn function a little
	more flexible so that replacing the shard is easier.
- Converted ABloodSplatter to DECORATE.
- Removed A_Jiggle because it never worked properly.
- Changed DECORATE parser to allow commas between arguments for multi-
	argument properties. For all newly added properties this format will
	become mandatory but for backwards compatibility it is optional for
	old ones.
- Added a check for negative indices to TAutoGrowArray::SetVal to prevent
	passing an index of -1 from crashing the game.
- Fixed: Morphing must clear the weapon's flash sprite.
- Fixed: Resurrecting a morphed player caused a crash.
- Fixed: Random sounds that recursively refer to themselves caused a stack
	overflow. Now they print a warning and get ignored.

July 30, 2006 (Changes by Graf Zahl)
- Added Grubber's GetPlayerInfo ACS function.
- Fixed: Starting a game without skill menu always started the first episode.
- Changed A_AlertMonsters so that it can be placed directly in a weapon state.

July 29, 2006 (Changes by Graf Zahl)
- Fixed: Frozen corpses of stealth monsters were invisible.
- Added: Calling Radius_Quake with a tid of 0 now uses the activator
	as the quake's center.
- Used the new explosion handling to clean up the old style projectile
	definitions. The SimpleProjectile class is gone and it uses the meta
	data and A_ExplodeParms instead now.
- Removed the deprecation warnings for explosion parameters again because
	the new system is fully inheritable and therefore useful again.
- Changed the explosion properties into meta data and adjusted A_ExplodeParams
	to use these when called without any parameters. Also removed all special
	parsing for A_Explode so now this function can be called with expressions
	like any other function.
- Changed DECORATE parsing so that functions with completely optional
	parameter lists don't create an empty list when called without parameters.

July 28, 2006
- Version bump to 2.1.4.
- Fixed: Friendlies would not turn to face you when you engaged them in
	conversation, nor would they reliably return to their original facing when
	you stopped talking to them.
- Added deprecation warnings for the DontHurtShooter, ExplosionRadius, and
	ExplosionDamage actor "properties." They were considered deprecated before;
	now this is explicitly stated when they are used. The problem with them is
	that they are not really properties and do not behave like other properties
	and cannot be inherited, because they are really just an alternate way of
	specifying parameters for A_Explode. (Anything that currently prints a
	deprecation warning will be removed completely in 2.2.0, which will be the
	version where custom state labels make their debut.)

July 26, 2006 (Changes by Graf Zahl)
- Changed player sprite translation for the menu so that it uses a regular
	translation table instead of a local custom buffer.
- Fixed: ResetBaggage must set MeleeDamage to 0.

July 21, 2006
- Made SafeReadMemory() in i_crash.cpp more readable.
- Here's something MinGW users will probably like: i_crash.cpp no longer needs
	dbghelp.h if you compile with GCC.

July 19, 2006
- Added some simple translucency map analysis for BOOM maps to more
	intelligently pick the value to use for TranslucentLine's second argument.
- Added a queryiwad_key cvar to control which key can force the IWAD selection
	to appear. It can be either "shift" or "control". Any other value will
	disable its functionality.
- Fixed: A_SkullPop() and A_FreezeDeathChunks() did not transfer the player's
	inventory to the new dismembered head "player".

July 18, 2006
- Fixed: C_midPrint() needs a NULL status bar check.

July 17, 2006 (Changes by Graf Zahl)
- Fixed: PClass::CreateDerivedClass forgot to NULL FActorInfo::Replacee.

July 16, 2006 (Changes by Graf Zahl)
- Fixed: S_ClearSoundData cleared PlayerClasses instead of PlayerClassLookups.
- Added NecroMage's submission for bitwise/shift assignment operators for ACS.
- Added replacement handling to A_BossDeath.
- Fixed: The check for no skill menu was incorrect when a custom player
	class menu was present so instead of starting the game specific skill menu
	it always started Hexen's.
- Fixed: When a non-player tried to play a player sound it tried to access
	the actor object as an APlayerPawn.
- Changed PlayAttacking2 to always use the melee state instead of different
	implementations per player and hard coding it to MissileState+1. Also
	changed PlayAttacking for the HereticPlayer to use the same animation as
	PlayAttacking2. Now the special handling for Heretic in the FireWeapon
	functions can be removed.
- Fixed: PlayerStartItem created a duplicate of the item's class name before
	converting it into an FName.
- Removed game check for Doom from P_BloodSplatter. The BloodSplatter actor
	is compatible with all games now so the explicit handling is no longer needed.
- Moved replacement handling back into AActor::StaticSpawn but controlled
	by a (mandatory) parameter. Also added replacement to most other
	instances in the game where non-inventory items are spawned. Replacement is safe
	nearly everywhere except for inventory related spawns.
- Fixed: Due to the player class inclusion A_NoBlocking never called
	NoBlockingSet for monsters.
- Changed: Sounds can be specified by full path now in SNDINFO and S_SKIN.

July 15, 2006
- Fixed: Makefile.mgw was mysteriously missing some targets. After fixing that,
	I also removed some of GCC's warnings.

July 14, 2006 (Changes by Graf Zahl)
- Fixed: Any kill in multiplayer games that could not be credited to a player
	didn't count at all - not even toward the global level statistics.
- ...and removed it again. It was not an accident. The only reason the PowerupGiver
	had its own RespawnTics was to account for the pickup flash delay.
	But that is better handled by checking the flag and adding the additional 30
	tics in AInventory::Hide because then it affects all items that have one -
	and only those. The AT_GAME_SET function didn't work anyway because it was
	called after parsing DECORATE.

July 13, 2006
- Restored the PowerupGiver AT_GAME_SET function. I assume its removal was an
	accident from merging in Grubber's custom player classes.

July 13, 2006 (Changes by Graf Zahl)
- Removed the game filter check from addplayerclass. If a player class is added
	here the game filter is irrelevant and there's nothing that should prevent
	the HereticPlayer being added to a Hexen game, for example.
- Changed: The addplayerclass CCMD was far too paranoid and needlessly aborted
	the game for any error being encountered. Since an empty player class list
	is checked for elsewhere outputting the messages to the console is sufficient.
- Generalized Hexen's class-based spawning to be a property of the player class
	so now it is available in all games.
- Replaced the call to A_FlameSnd in the HereticPlayer's burn death sequence
	with A_FireScream and defined *burndeath for Heretic.
- Added Grubber's custom player class support.

July 12, 2006
- Changed decorate replacement to be opt-in instead of opt-out. This allows for
	greater flexibility in what can be replaced (replaced actors need not be ancestors
	of actors that replace them) at the expense of not having universal actor
	replacement. Instances where replacements work:
	 - Line specials that spawn things (Thing_Spawn and related)
	 - ACS spawning commands (SpawnSpot and the like)
	 - Spawning mapthings at level load time in P_SpawnMapThing()
	 - Spawning items off of dead dudes in P_DropItem()
	 - The A_SpawnItem decorate function
	 - The summon and summonfriend console commands
	 - ThingCount will count both original actors and their replacements as the same
		 things.
	TBD: Should the ACS inventory functions use replacements too, or not?
- Fixed: The game would crash after informing you of a duplicate class registration
	because PClass::CreateDerivedClass() did not initialize everything before calling
	InsertIntoHash().
- Fixed: Forcefully removing a weapon from a player's inventory would not reset
	the player's refire counter.
- Fixed: FreeKeySections() was called before M_SaveDefaults() during shutdown,
	so all custom keys would go to a "(null)" section instead of their intended
	section.

July 11, 2006
- Restored the previous level flag values to avoid needlessly breaking some
	savegames at this point in time.
- Fixed: R_ClearPlanes() did not clear skybox planes for a full clear.
- Streamlined zip file loading by delaying the processing of the local file
	header until it is actually needed.

July 11, 2006 (Changes by Graf Zahl)
- Changed the additive scrollers option into a compatibility flag so that it can
	be changed from the menu.

July 10, 2006
- Fixed closed doors between the front sector's floor and ceiling the right way.
	I was just missing a non-null texture check.
- Removed references to texturewidthmask. What was that?

July 10, 2006 (Changes by Graf Zahl)
- Fixed: The earthquake code needs to check whether a quake's spot is still valid.
	Super Sonic Doom crashed due to this.
- Fixed: G_DoAutosave could divide by 0 if autosavecount was 0.

July 9, 2006 (Changes by Graf Zahl)
- Fixed: The calls to DCanvas::Dim in c_console.cpp were missing some type casts.
- Fixed: CCMD(dir) passes FStrings directly to Printf.
- Fixed: The defaultbind command still treated the bindings as char pointers and
	as a result didn't work.
- Added SpawnSpotFacing ACS function which is the same as SpawnSpot but it uses
	the map spot's angle.
- Added ThingCountName ACS function which is the same as ThingCount but it takes
	an actor's type name instead of a spawn ID.

July 9, 2006
- Fixed: If the sector behind a seg was closed, but it was closed between the
	ceiling and floor of the front sector, the renderer did not add it to the
	solid clip list.

July 8, 2006 (Changes by Graf Zahl)
- Fixed: Specifying 'strifefallingdamage' in MAPINFO cleared all other flags.
- Fixed: maxstepheight and maxdropoffheight were stored as ints instead of
	fixed_t's by the DECORATE parser.

July 7, 2006
- Blends created with the ACS fade commands now degrade to transparent overlays
	when the console is visible, just as they do for the menu.
- Added actor replacement for DECORATE. This works at a higher level than
	using duplicate DoomEdNums and will affect all attempts to spawn the
	replaced actor. However, because this happens for all spawns and not just
	at map load, the replacing actor must be compatible with the replaced
	actor, which means that an actor can only serve as a replacement for one
	of its baseclasses. For example, if you want to use a modified imp, you can
	use this DECORATE:
			actor MyImp : DoomImp replaces DoompImp
			{
					// Put changed properties here
			}
- New: The IWAD dialog now remembers the last IWAD you picked and
	automatically highlights it the next time you run the game. This also
	applies if you check "Don't ask me this again": The IWAD selected will be
	the one that gets automatically loaded, not the one located first. (Using
	the -iwad parameter will not change the default IWAD.) In addition, you
	can now bring the dialog up even if you disable it by holding down SHIFT
	during startup.
- Changed ExtractFilePath() and ExtractFileBase() to return FStrings instead
	of writing to a provided output buffer. ExtractFileBase() can also
	optionally keep the file's extension in the result.
- Removed the -heapsize parameter entirely. The informational message should
	no longer be needed.
- Removed -maxdemo parameter. There's no point to having it around since
	the demo buffer grows automatically.

July 3, 2006 (Changes by Graf Zahl)
- Fixed: Changed initialization of Weapon.Kickback so that it is only done
	for direct descendants of AWeapon and not for every weapon being defined.
- Changed parsing of actor names back to not use C-mode. This change breaks
	any definition that contains periods in their name and apparently there's
	more than anyone could expect. Also altered the parser to manually check
	for colons inside the parsed string so that placing spaces around them
	is no longer necessary.
- Fixed: Weapons could be picked up for ammo even if they gave none.
- Fixed: A_Beacon was missing a NULL pointer check for the beacon's owner.
- Fixed: The status bar tried to access CPlayer->camera without checking
	its validity. In spy mode there is a possibility that it is NULL.

July 2, 2006 (Changes by Graf Zahl)
- Fixed: G_NewInit destroyed the players' userinfo data.
- Changed the special radius damage handling for the barrel and boss brain
	into an actor flag.
- Added A_RadiusThrust code pointer for DECORATE and adjusted the radius
	attack functions accordingly.

July 1, 2006 (Changes by Graf Zahl)
- Fixed: In multiplayer games, when trying to change targets, A_Chase forgot
	to check whether the new target was the same as the old one and treated
	this case as a real target change.

June 30, 2006
- Changed the earthquake view shaking so that it works for anything and not
	just players.

June 29, 2006
- Added some hackery at the start of MouseRead_Win32() that prevents it from
	yanking the mouse around if they keys haven't been read yet to combat the
	same situation that causes the keyboard to return DIERR_NOTACQUIRED in
	KeyRead(): The window is sort of in focus and sort of not. User.dll
	considers it to be focused and it's drawn as such, but another focused
	window is on top of it, and DirectInput doesn't see it as focused.
- Fixed: KeyRead() should handle DIERR_NOTACQUIRED errors the same way it
	handles DIERR_INPUTLOST errors. This can happen if our window had the
	focus stolen away from it before we tried to acquire the keyboard in
	DI_Init2(). Strangely, MouseRead_DI() already did this.
- When a stack overflow occurs, report.txt now only includes the first and
	last 16KB of the stack to make it more manageable.
- Limited StreamEditBinary() to the first 64KB of the file to keep it from
	taking too long on large dumps.
- And now I know why gathering crash information in the same process that
	crashed can be bad: Stack overflows. You get one spare page to play with
	when the stack overflows. MiniDumpWriteDump() needs more than that and
	causes an access violation when it runs out of leftover stack, silently
	terminating the application. Windows XP x64 offers SetThreadStackGuarantee()
	to increase this, but that isn't available on anything older, including
	32-bit XP. To get around this, a new thread is created to write the mini
	dump when the stack overflows.
- Changed A_Burnination() to be closer to Strife's.
- Fixed: When playing back demos, DoAddBot() can be called without an
	associated call to SpawnBot(). So if the bot can't spawn, botnum can
	go negative, which will cause problems later in DCajunMaster::Main()
	when it sees that wanted_botnum (0) is higher than botnum (-1).
- Fixed: Stopping demo recording in multiplayer games should not abruptly
	drop the recorder out of the game without notifying the other players.
	In fact, there's no reason why it should drop them out of multiplayer at
	all.
- Fixed: Earthquakes were unreliable in multiplayer games because
	P_PredictPlayer() did not preserve the player's xviewshift.
- Fixed: PlayerIsGone() needs to stop any scripts that belong to the player
	who left, in addition to executing disconnect scripts.
- Fixed: APlayerPawn::AddInventory() should also check for a NULL player->mo
	in case the player left but somebody still has a reference to their actor.
- Fixed: DDrawFB::PaintToWindow() should simulate proper unlocking behavior
	and set Buffer to NULL.
- Improved feedback for network game initialization with the console ticker.
- Moved i_net.cpp and i_net.h out of sdl/ and win32/ and into the main source
	directory. They are identical, so keeping two copies of them is bad.
- Fixed: (At least with Creative's driver's,) EAX settings are global and not
	per-application. So if you play a multiplayer ZDoom game on one computer
	(or even another EAX-using application), ZDoom needs to restore the
	environment when it regains focus.
- Maybe fixed: (See http://forum.zdoom.org/potato.php?t=10689) Apparently,
	PacketGet can receive ECONNRESET from nodes that aren't in the game. It
	should be safe to just ignore these packets.
- Fixed: PlayerIsGone() should set the gone player's camera to NULL in case
	the player who left was player 0. This is because if a remaining player
	receives a "recoverable" error, they will become player 0. Once that happens,
	they game will try to update sounds through their camera and crash in
	FMODSoundRenderer::UpdateListener() because the zones array is now NULL.
	G_NewInit() should also clear all the player structures.

June 29, 2006 (Changes by Graf Zahl)
- Added a 'default' setting to all color selection menu items that leaves
	the font untranslated.
- Fixed: Heretic's monsters were missing the MF2_MCROSS flag.

June 28, 2006 (Changes by Graf Zahl)
- Fixed: Bouncing projectiles should not bounce off horizon lines. Now they
	vanish instead.
- Changed masses of ice chunks and glass shards to make small splashes
- Fixed: P_UndoPlayerMorph didn't properly transfer the inventory. It just
	copied the pointer instead of using ObtainInventory.

June 24, 2006
- Moved the version resource into the "compile-time directives" section of
	the resource script so that Developer Studio won't replace the version macros
	in it with their literal values. Now updating version.h is guaranteed to be
	enough to bump the version everywhere it's used.

June 24, 2006 (Changes by Graf Zahl)
- Fixed: PIT_CheckThing checked AActor::tid instead of TidToHate to determine
	whether a monster of the same species can be hurt.
- Added new ice chunk sprites submitted by Enjay.
- Replaced all occurences of 'ZDoom' in i_crash.cpp with a define from version.h
	so that this file doesn't need to be changed for altering the texts.
- Deleted the programmer death script from strifehelp.acs because it is no
	longer used.
- Fixed: strfhelp.acs and the PUMPUPS cheat need to give 10 UpgradeStaminas
	because that item is using Inventory::Amount now.

June 23, 2006
- Changed the archive format for crash reports from tar.gz to zip.
- Went back to a single process model for crash reporting. It appears there
	are some machines that don't like having another process collect the
	information and report it. I still feel that having another process do
	it _should_ be more reliable, because that process can execute in a known
	good state. Ah well. I haven't yet seen anything that left the main process
	in a totally unrecoverable state, so it's probably okay. Unlike before, this
	single-process version is still GCC-compatible.

June 23, 2006 (Changes by Graf Zahl)
- Fixed: The resurrect cheat didn't reset the player's damage type so
	if he died by being frozen the blue blend didn't disappear.
- Fixed: FWarpTexture::MakeTexture must be declared virtual so that
	the FWarp2Texture version of it can be called.

June 22, 2006 (Changes by Graf Zahl)
- Fixed: The check to prevent items from being given to dead players
	didn't work properly. It has to be done in the cheat code, not in
	APlayerPawn::AddInventory.
- Fixed: The medikit and stimpack used a MaxAmount of 100 so that
	stamina upgrades were ineffective.
- Fixed: Jumping and crouching at the same time created jerky results.
	Now jumping takes precedence and you can't crouch while pressing the
	jump key (which causes an uncrouch.)

June 21, 2006
- Fixed: DF_NO_COOP_WEAPON_SPAWN was handled backwardly.
- Fixed: G_InitLevelLocals() needs to OR in the crouching bits, otherwise it
	discards the jumping bits.
- ProcessActor() now sets C mode before retrieving the actor's name.
- Fixed: The new SC_GetString() scanner accepted slashes at the end of tokens
	when not in C mode, even if they were the start of a comment. Now if you
	want a slash at the end, you must quote it.

June 21, 2006 (Changes by Graf Zahl)
- Fixed: Decal actors with an invalid decal texture caused a crash.
- Fixed: Player could crouch while dead.
- Fixed: The sidedef loader could allocate insufficient memory if a map
	contained unused sidedefs.
- Fixed: Color control sequences were written to the log file. Since any
	entered console command contains such a sequence it was quite noticable.
- Fixed: The obituary code didn't use the attacker's name for kills caused
	by other players.
- Fixed: PIT_StompThing never checked for COMPATF_NO_PASSMOBJ.
- Fixed: COMPATF_TRACE returned true for all two-sided lines, not just for
	those with the same sector on both sides.

June 20, 2006
- Added grubber's thingdef_exp.cpp. I might not use it later, but I can still
	use it now.
- Unlimited the monster pain sounds in Hexen after I played as the Cleric a
	while and killed several centaurs with the flechette.
- Fixed: Moving to an old level in a hub caused the old player's inventory to
	spawn owned by the current player (but still hanging off the old player), so
	the game would hang when trying to delete it.
- Modified re2c so that it doesn't add a date to the file it generates. Thus,
	if it regenerates a file during a full rebuild, SVN won't see it as a change.
	Also updated it to 0.10.5.
- Fixed: SC_GetString() did not properly terminate sc_String when the last
	token in the file had no white space after it. Since I could not actually
	find the problem (it works fine in debug mode and I saw no logic errors),
	I decided to take this opportunity to reimplement it using an re2c-generated
	scanner. Now it's 1.6x faster than before and correctness is easier to
	verify.

June 19, 2006
- Fixed: FMODSoundRenderer::Shutdown() also needs to reset NumChannels.
- Added back the Manifest to zdoom.rc for non-VC8 Windows compilers.
- Fixed MinGW compilation again. Now it uses the same method as Makefile.linux
	to find all the source files so that it doesn't need to be manually updated
	each time source files are added or removed.
- Added the SVN revision number to the version string. A new tool is used to
	obtain this information from the svnversion command and write it into a
	header file. If you don't have the svn command line tools installed or didn't
	check it out from the repository, you can still build. I added some rules for
	this to Makefile.linux, and I assume they work because they do for
	Makefile.mingw.
- Fixed: MIDISong2 did not delete MusHeader in its destructor.

June 19, 2006 (Changes by Graf Zahl)
- Removed the unused sfx_ variables for the chainsaw sounds.
- Fixed map name checks in idclev, hxvisit, for +map and the titlemap.
- Changed handling of Zips so that the patches/, graphics/, sounds/ and
	music/ subdirectories no longer are placed in the global namespace. Instead
	new namespaces are defined. These namespaces aren't merged, however and
	searching in them either returns a lump inside it or one from the global
	namespace when it doesn't come from a Zip file. Proper order of files is
	still observed though. As a result proper use of the directories inside Zips
	is strictly enforced now so that for example anything used as a patch must be
	in the patches/ directory and won't be found anywhere else.

June 18, 2006 (Changes by Graf Zahl)
- Added another set of ACS inventory functions which take a tid for the actor
	and aren't limited to the script's activator.
- Added GetSectorLightLevel(tag), GetActorCeilingZ(tid) and
	SetActorPosition(tid, x, y, z, fog) ACS functions.
- Fixed: First initialization of camera textures should not mark the rendered
	lines as mapped.

June 17, 2006
- Finally implemented code to keep some or all of your inventory intact when
	respawning in coop. Now the new inventory code should finally be complete. :-)
- Fixed: PROP_Inventory_PickupMessage was improperly defined for non-VC++
	compilation.

June 17, 2006 (Changes by Graf Zahl)
- Converted a_doomhealth.cpp to DECORATE.
- Added a PickupMessage property to the internal actor parser, replaced
	most of the virtual PickupMessages with it and placed the code that
	reads the metadata into AInventory::PickupMessage. Now the
	PickupMessage method is truly virtual and I can do:
	 Added a Health.LowMessage property to define double message items like
	 Doom's medikit in DECORATE.
- Since defining Mana3 as an ammo type and then overriding the TryPickup
	method means that this item defeats all ammo checks in the game it might
	as well be defined as a CustomInventory item. At least this fixes the
	amount given in easy and very hard skills.
- Converted all ammo items to DECORATE.
- Changed internal property setting of ammo types and sister weapons
	to use fuglyname as for DECORATE definitions. This allows to export
	the ammo definitions into DECORATE definitions without doing it for
	the weapons themselves.
- Replaced obituary methods with actor properties.
- Fixed: The secret map check didn't work for maps inside Zips.

June 14, 2006
- Fixed loading of Build/Blood maps.
- FWadLump::Read() now handles Blood decryption directly.
- Fixed: A fatal error thrown during map loading after the sectors have been
	counted but before they are allocated crashed in PointerSubstitution().
- Removed my "backwards compatibility fix" for APROP_Speed. It turns out that
	in all the public versions where monster speed is not fixed point, you
	couldn't modify the monster's speed due to a bug in P_Move() anyway. So
	there's nothing to be backward compatible with.

June 14, 2006 (Changes by Graf Zahl)
- Fixed: Saving on maps that don't contain a MAPINFO definition didn't work.
- Fixed: The Zip loader loaded all WADs inside a Zip into the lump directory.
	This is only supposed to be done for WADs in the root directory.

June 12-14, 2006 (Changes by Graf Zahl)
- Complete restructuring of the map loading code. Previously the only way
	to put maps into Zips was to load them as embedded WADs which caused
	some problems, most importantly that the map's file name was irrelevant
	and the internal map label was used instead. With the new code there
	is now a properly defined way to add maps to Zips:
	* Maps are placed in a subdirectory called 'maps'.
	* Maps are stored as WADs that contain all map related lumps.
	* The first lump in the map's WAD directory must be the map label.
	* All lumps not belonging to the first map are ignored.
	* The map's file name determines the name the map is identified with.
		For maps stored this way the internal map label is ignored so with this
		method renaming maps is as easy as renaming a file and it is no longer
		necessary to manipulate the map label.
	With the new code it is also possible to load external maps without
	adding them to the WAD list. Type 'open mapfile.wad' in the console
	to start such a map.
	The new code also performs stricter lump name checks to prevent accidental
	loading of non-map data.

June 13, 2006
- Moved level scroller information out of G_InitLevelLocals() and into
	P_FreeLevelData() so that it also gets performed at shutdown.
- Fixed: In the past, ZDoom worked like Doom and used integral values for
	monster speeds. Now it uses fixed point so that an actor's speed property
	can always be considered is always fixed point. So DoSetActorProperty()
	should scale very slow speeds, just like dehacked's PatchThing() has done
	for some time now.

June 11, 2006 (Changes by Graf Zahl)
- Changed UpgradeStamina to use AInventory's Amount and MaxAmount to
	control the amount of upgrade and the maximum that can be reached.

June 10, 2006 (Changes by Graf Zahl)
- Fixed: The skin loader assumed that all skin textures are in Doom patch
	format. Now it calls FTexture::CreateTexture to do proper checks.
- Removed the PickupSound method from FakeInventory and changed it so that
	it uses AInventory::PickupSound to store its custom pickup sound.
- Removed the PickupMessage method from FakeInventory. This can be handled
	by the standard pickup message code now that it uses the meta data for the
	message.
- Fixed: The maximum indices for StrifeTypes were inconsistent. Now the
	allowed range is 0-1000 in all situations.
- Fixed: Setting a local SNDINFO for a map deleted all skin based sounds.
- Added a crouchsprite property to the skin info.
- Fixed: Crouching sprites must be checked each frame, not just each tic.
- Added an srand call to D_DoomMain in order to randomize the values returned
	by rand which is being used to shuffle the playlist.

June 10, 2006
- Fixed: Information added with addkeysection and addmenukey was never freed.
- Fixed: A classic decorate FakeInventory's PickupText was never freed.
- Fixed: Colored lights were never freed.
- Fixed: When a dehacked patch was applied, the dehacked StateMap was never
	freed.
- Removed termdone checks around atterm(S_ClearSoundData) and
	atterm(S_Shutdown) because atterm() already checks for duplicates.
- Fixed: S_ClearSoundData() should unload all sounds before it clears S_sfx.
- Fixed: AltSoundRenderer::LoadSound() didn't check if the sound had already
	been loaded and lost the old sound data if it had been.
- Fixed: FinishDehPatch() needlessly duplicated the new DehackedPickup's name.
- Fixed: PatchStrings() allocated a private string and never freed it.

June 8, 2006 (Changes by Graf Zahl)
- Changed music name handling in MAPINFO so that music can be specified by
	full path of a file in a Zip.
- Fixed: intermusic in MAPINFO was limited to WAD lumps and couldn't handle
	external data.

June 8, 2006
- Fixed: Trying to play a 0-length song from a wad inside a zip caused a crash.

June 7, 2006 (Changes by Graf Zahl)
- Fixed: A_CustomPunch didn't use the range parameter correctly.

June 6, 2006
- Integrated recent ZDBSP improvements into the internal nodebuilder:
 - ClassifyLine now chooses either SSE2 or regular x87 math depending on whether
	 or not SSE2 is available at runtime. Since most of the time is spent in
	 ClassifyLine, using SSE2 in just this one function helps the most.
 - Nodebuilding is a little faster if we inline PointOnSide.
 - Changed FEventTree into a regular binary tree, since there just aren't enough
	 nodes inserted into it to make a red-black tree worthwhile.
 - Added more checks at the start of ClassifyLine so that it has a better chance
	 of avoiding the more complicated checking, and it seems to have paid off with
	 a reasonably modest performance boost.
 - Added a "vertex map" for ZDBSP's vertex selection. (Think BLOCKMAP for
	 vertices instead of lines.) On large maps, this can result in a very
	 significant speed up. (In one particular map, ZDBSP had previously
	 spent 40% of its time just scanning through all the vertices in the
	 map. Now the time it spends finding vertices is immeasurable.) On small maps,
	 this won't make much of a difference, because the number of vertices to search
	 was so small to begin with.

June 3, 2006 (Changes by Graf Zahl)
- Added a StartConversation special that allows automatic activation of Strife
	dialogs.
- Added Thing_Raise special that allows Arch-Vile like resurrections from scripts
	or DECORATE states.
- Added a RadiusDamageFactor property for actors. This replaces the hard coded
	factor of 0.25 for Hexen's players.
- Added new SpawnProjectile function to ACS. It's the same as Thing_Projectile2
	but the projectile is specified by name, not spawn ID.
- Added MAPINFO option to set the compatibility flags. If this is done these
	explicit settings will take precedence over the compatflags CVAR.

May 31, 2006
- Merged in recent ZDBSP fixes:
 - Added code to explicitly handle outputting overlapping segs when
	 building GL nodes with ZDBSP, removing the check that discarded
	 them early on.
 - AddIntersection() should convert to doubles before subtracting the vertex
	 from the node, not after, to avoid integer overflow. (See cah.wad, MAP12
	 and MAP13.) A simpler dot product will also suffice for distance calculation.
 - Splitters that come too close to a vertex should be avoided. (See cata.wad.)
 - Red-Black Tree implementation was broken and colored every node red.
 - Moved most of the code for outputting degenerate GL subsectors into another
	 function.

May 31, 2006 (Changes by Graf Zahl)
- Fixed: Ammo items dropped by monsters that have a default amount of 1 didn't
	contain any ammo at all.
- Fixed: PClass::FreeIndices was declared as TArray<size_t> in the header but
	as TArray<unsigned int> in the cpp file.

May 28, 2006 (Changes by Graf Zahl)
- Fixed: PowerFrighteners must check Owner for NULL in InitEffect and EndEffect.

May 28, 2006
- Fixed: When building GL nodes for Deathkings MAP42, one polyobject had one
	of its segs thrown away, so the map could not start. This was because the
	nodebuilder assumed all subsectors would be 2D and could not handle the
	case where a degenerate 1D subsector is created. In this case, that happens
	because that map has three polyobjects in the middle of the void, so the only
	way to assign them to a subsector is to use a 1D subsector.

May 28, 2006 (Changes by Graf Zahl)
- Fixed: Monsters couldn't hurt other monsters of the same species if they
	were supposed to hate them.
- Since I was editing the file anyway I added checks for Heretic's and Strife's
	damaging floor types to DCajunMaster::IsDangerous.
- Added a NULL pointer check to DCajunMaster::TurnToAng because a crash log
	indicated that this can happen.
- Fixed: Strife's energy pod contains 20 units when dropped by monsters.
	To achieve this I added an Ammo.DropAmount property because there are
	no other means to control this from inside a conversation script.

May 27, 2006 (Changes by Graf Zahl)
- Fixed: FString::FormatHelper must not alter the null string.
- Fixed: FString::FormatHelper should use ReallocBuffer instead of directly
	calling Realloc. This caused crashes with the ACS print function.
- Fixed: The dummy player spawned in G_FinishTravel must not start any ENTER
	scripts.

May 26, 2006
- Changed makewad's zip routines so that it simply stores files that cannot be
	compressed smaller instead of using deflate anyway. Saves 133 bytes currently.

May 26, 2006 (Changes by Graf Zahl)
- Fixed: CallStateChain relied on CallingState being preserved across the
	call of the state's action function. This is not the case when a missile
	is being spawned and exploded right away.

May 25, 2006
- Fixed: The C code in AltSoundRenderer::CopyAndClip() did not shift the sample
	data enough (2 bits instead of 8), so it was super loud and aliased.
- Fixes for GCC 4.1: Several type-punned pointer warnings, but more
	importantly, declaring a friend function inside a class body is no longer
	enough to declare that function globally; you must declare it again outside
	the class.
- Upgraded FArchive::SerializePointer so that it can store 32-bit indices.
- ACS printing pcodes now build their string in an FSttring instead of a fixed
	sized buffer on the stack.

May 24, 2006
- Modified ccdv-win32 to show "Generating X" messages when running lemon and
	re2c instead of "Linking X".
- Updated lemon and re2c to the latest versions and ported dehsupp to use them
	for code generation. (Xlatcc is next.)
- Added function level linking for Makefile.mingw.
- Disabled RTTI generation and enabled function-level linking in the VC 2005
	zdoom project.
- Fixed: TAG_MORE now uses __va_copy to copy the taglist when building with
	GCC, so that should let it build under x86-64 and any other GCC targets.

May 24, 2006 (Changes by Graf Zahl)
- Fixed: A_SpawnItem performed an integer multiplication with fixed point
	values to calculate the spawn position.
- Fixed: A_SpawnItem tried to set the spawned actor's angle before checking
	the validity of the returned pointer.

May 23, 2006
- Added missing linker dependencies for Visual C++ 2005 Express Edition and
	fixed building of the assembly files when the source is located in a path
	with spaces.

May 22, 2006
- Fixed: The new sound pausing on menu open interrupted Strife conversations.
- Did some very preliminary support for x64 compiling.
- Now I see why makewad is using the __fastcall calling convention by default:
	Because the release zlib is built with it as well.
- Fixed: Conversion from 'const char *' to 'char *' in DEM_SAVEGAME case in
	Net_DoCommand().
- Updated the project files for Visual C++ 2005.
- Fixed: The new Thing_ChangeTID check would infinite loop if an actor
	scheduled for destruction was encountered.

May 22, 2006 (Changes by Graf Zahl)
- Fixed: Thing_ChangeTid must check whether the actor whose tid is about to
	be changed is scheduled for destruction.
- Fixed: G_FinishTravel added the player to the hash chain twice.
- Fixed: The animations for Doom's E3 intermission used incorrect patch names.
- Added a check for MF_NOLIFTDROP to PIT_CeilingRaise because the overlapping
	bridges in 007LTSD got moved by this function.

May 21, 2006
- Fixed GCC 4 warnings in FNodeBuilder::CreateSubsectorsForReal().
- Changed f_finale.cpp/atkstates[] into a static variable, since its
	anonymous type prevents it from being accessed from other files anyway.
- Fixed: The behavior of the eventtail advancement in d_net.cpp/CheckAbort()
	was compiler-dependant.
- Fixed warnings GCC 4 threw up while compiling re2c and lemon.
- Removed __cdecl from makewad.c again. This is already defined as a builtin
	for MinGW, and redefining it produces a warning. (Why is main explicitly
	declared __cdecl anyway?)
- Fixed building ccdv-win32 with GCC 4. GCC 4 creates a memcpy call, which
	won't work because it doesn't get linked with the standard C library.

May 20, 2006
- Fixed default.cbd and Makefile.mingw for current code state.
- New: Pausing the game (through any means, not just the pause key) now pauses
	sound effects as well as music. "PauseMusicInMenus" has been added as a
	MAPINFO flag to also pause the music when a menu or the console are open.

May 20, 2006 (Changes by Graf Zahl)
- Fixed: The automap code had the check for rotation reversed.
- Changed type PClass::FreeIndices to TArray<unsigned int> because that's
	the type of the indices.
- Fixed: makewad.c needs __cdecl for non-Windows builds.
- Fixed: FinishThingdef didn't check whether the WeaponClass pointer in
	AWeaponPiece was a valid name.

May 19, 2006
- Fixed: FloorAndCeiling_Raise/Lower did not work with slopes because they
	used ZatPointDist instead of PointToDist to calculate the destination
	distance for the plane equation.
- Fixed: Sky scroll positions could "jump" once they wrapped past position
	32767. An fmod now keeps them within range of the sky textures' real widths.

May 19, 2006 (Changes by Graf Zahl)
- Increased the StrifeTypes array to 999 entries so that custom WADs have
	more flexibility when defining dialogs.

May 18, 2006
- Added a check against rw_havelow in the "sky hack" part of R_NewWall().
	This prevents the front ceiling from being moved up if there has been no
	texture defined to draw on the wall. This makes various parts of The
	Darkest Hour render properly again while still allowing the crosses in
	heroes2.wad and lamasery.wad to render correctly.
- Added a NULL sector check to P_CheckFakeFloorTrigger() because there was
	a crash report indicating that an actor being pushed up by a moving floor
	had a NULL sector. Since this field should be valid for every actor, the
	debug build gets an assert here, and the release build just returns without
	doing anything.
- Fixed: Camera textures were not rendered properly when the underlying
	canvas's pitch and width were different (which, really, only happens if
	you use ridiculously large camera textures).
- Fixed: FCanvasTextureInfo's were never freed.
- Fixed: MAPINFO special action structures were not freed.
- Fixed: FSingleLumpFont::LoadFON2() never freed its widths2 array.

May 17, 2006 (Changes by Graf Zahl)
- Fixed: In case the path to strife1.wad didn't contain any '/' an
	incorrect path was created for voices.wad.
- Fixed: The code building the path for Strife's voices.wad called the
	wrong FString constructor.
- Fixed: LS_Thing_SetGoal set MF5_CHASEGOAL in flags, not flags5.

May 17, 2006
- Fixed: M_NotifyNewSave() needlessly created a copy of the filename.
- Fixed: Any touching_sectorlists for actors unlinked in G_StartTravel() were
	lost forever.
- Fixed: DLightningThinker::Serialize() did not delete the old
	LightningLightLevels array when loading from an archive.
- Fixed: Although I moved the correct polyobject freeing code into
	P_FreeLevelData(), I left the old wrong code there too, which just deleted
	the array without deleting anything hanging off of it.
- Texture animation improvements:
	* Animations are now millisecond-accurate, so delays in ANIMDEFS can have
		fractional parts.
	* Cleaned up the animation code and moved it into r_anim.cpp.
	* Blood's oscillating texture animations are now available for use by actual
		supported games by adding the word "oscillate" after a "range" definition
		in ANIMDEFS.
	* Not exactly texture animation, but it's handled in the same function as
		texture animations: Scrolling skies also have millisecond precision.

May 16, 2006
- Implemented Quasar's suggestion to use line flag 2048 as a "reserved" flag
	that, if set, clears all the non-original-Doom flags on a line. This is
	only for Doom format maps when playing Doom.
- Added support for automatically loading ACS objects (even for Doom-format
	maps). To use it, compile the ACS files as ordinary libraries placed
	between A_START/A_END markers. Then outside the markers, create a lump
	called LOADACS. This is just a plain text lump that lists all the libraries
	you want to autoload with every map. You can do this with as many libraries
	as you want, and LOADACS lumps are also cummulative.
- Fixed: ApplyActorDefault() must ensure that dataint is non-negative before
	calculating a non-NULL state. When compiling with Visual C++, states are
	stored in the defaults list as byte values, but when compiling with GCC,
	they are passed as 32-bit arguments to the function directly. So in VC++,
	using ~0 to specify a NULL state appears as 255, but in GCC, it appears as
	-1.

May 16, 2006 (Changes by Graf Zahl)
- Added a missing NULL pointer check to APlayerPawn::Tick.
- Fixed: The falling scream should not be played when the player is under
	water.

May 15, 2006
- Fixed: CopyPlayer() in p_saveg.cpp should use normal assignment, not
	memcpy to copy the player structures.
- Fixed compilation with MinGW again and removed most of the new warnings.
- Changed the memory management for FString. Instead of using a garbage
	collected heap, it now uses normal heap calls and reference counting to
	implement lazy copying. You may now use bitwise operators to move
	(but not copy!) FStrings around in memory. This means that the
	CopyForTArray template function is gone, since TArrays can now freely
	move their contents around without bothering with their specifics.

	There is one important caveat, however. It is not acceptable to blindly 0
	an FString's contents. This necessitated the creation of a proper
	constructor for player_t so that it can be reset without using memset. I
	did a quick scan of all memsets in the source and didn't see anything else
	with a similar problem, but it's possible I missed something.
- Fixed: Build tiles were never deallocated.
- Fixed: Using Build's palette.dat only got half the palette right.

May 14, 2006 (Changes by Graf Zahl)
- Added a show_obituaries option to disable obituaries without disabling
	other more important message types which have lower priority for some
	reason.
- Added a menu option for show_messages after accidentally switching it
	off far too often and wondering why no messages appear.
- Added crouching DoomPlayer sprites submitted by Enjay.
- Fixed DF_NO_CROUCH was not checked.
- Fixed: The intermission script parser had some of its cases in the
	keyword parser incorrectly sorted.
- Fixed: atterm was still defined to take a STACK_ARGS function argument.
- Added an AltFlash state for weapons.
- Turned FloatSpeed into an actor property and changed the value to 5
	for all floating Strife actors, as a comment in the source indicated.
- Added GZDoom's code for Vavoom slope things because I wanted to test
	something with a map from Silent Steel.
- Added nocrouch and allowcrouch MAPINFO commands and a DF_NO_CROUCH
	dmflag.
- Added GZDoom's crouching code after cleaning it up so that adding
	crouching sprites will be easier.

May 13, 2006 (Changes by Graf Zahl)
- Fixed: P_StartScript was missing a NULL pointer check for the error
	message. When trying to puke a script outside a map it crashed.
- Fixed: The random number generator for large numbers must mask out the
	sign bit before performing a modulo.
- Now that the conversation states are pointers there is no need to make
	AActor::ConversationAnimation virtual. No class overrides this method
	anymore.
- Replaced AMacil1::TakeSpecialDamage with MF5_NODAMAGE.
- Fixed: AMacil2::TakeSpecialDamage and AOracle::TakeSpecialDamage didn't
	check whether inflictor was NULL and crashed when used with 'kill monsters'.
- Fixed: Some Strife decorations didn't loop their animation
- Changed: The decision whether blood splatter sprites are spawned is no
	longer determined by game. Instead there's a new flag, MF5_BLOODSPLATTER
	which is deciding what to do. To keep backwards compatibility this flag
	is unset for projectiles in Doom and Strife and set for them in Heretic
	and Hexen. The same applies to DECORATE but of course the flag can be
	manipulated here.
- BLODxx sprites are now globally renamed to BLUDxx when not playing Doom.
	This allows using the same states in every game, including the
	Raven-specific blood actors.
- Gave the bullet puff and the axe blood masses of 5 so that the make small
	splashes.
- Added A_Light(value) code pointer for DECORATE to generalize the weapon
	light effect.
- Added 'noskillmenu' option to MAPINFO episode definitions. This is for
	WADs that want to implement a skill selection level.
- Added APROP_ChaseGoal and APROP_Frightened actor properties for ACS.
- Added MF5_CHASEGOAL flag that makes monsters to go after their goal even
	if they have a valid target.
- Fixed some issues with the changes to P_NewChaseDir I made to include
	MBF's dropoff logic.
- Added a PowerFrightener powerup class. It seemed like such a waste to
	have this cool feature but no means to use it in a decent fashion.
- Fixed: S_Init and S_ParseSndInfo should call atterm only once but not
	each time they are called.

May 11, 2006
- Merged a lot of these static destructor-only structs into regular
	functions added to the exit chain with atterm so that they can be called
	in a deterministic order and not whatever order the linker decides to put
	them in.
- Fixed: DCajunMaster did not free its getspawned.
- Fixed: P_FreeLevelData() did not free ACS scripts.
- Fixed: Level snapshots were not freed at exit.
- Fixed: The save/load menu list was not freed at exit.
- Fixed: FCompressedMemFile needs a destructor to free the m_ImplodedBuffer.
- Fixed: G_DoLoadGame() did not free the engine string.
- Fixed: M_ReadSaveStrings() did not free the engine string.
- Fixed: Processing DEM_SAVEGAME did not free the pathname string.
- Added a check for truncated flats to FFlatTexture::MakeTexture() because
	Heretic's F_SKY1 is only four bytes long.
- Added a dump of the offending state to the "Cannot find state..." diagnostic.
- Fixed: FCompressedFile did not initialize m_Mode in its default constructor.
- Fixed: Heretic and Hexen status bars did not initialize ArtiRefresh.
- Fixed: PNGHandle destructor should use delete[] to free TextChunks.

May 11, 2006 (Changes by Graf Zahl)
- Converted the stealth monsters to DECORATE.
- Added string replacement option to obituary strings.
- Changed lock and pickup message handling so that it is either a real
	string or a LANGUAGE identifier. The only reason I did the mixed format
	in the first place were Hexen's lock messages but they have been
	replaced by unique strings in the mean time so the feature isn't needed
	any more.
- Added a flags parameter to TranslucentLine.
- Extended the second arg of Line_SetIdentification to set not only
	ML_ZONEBOUNDARY but all 8 bits of the third byte in the flag word.
	This allows a relatively simple means of setting all the new flags
	directly.
- Moved ML_ZONEBOUNDARY to doomdata.h so that it is in the same place as the
	other line flags.
- Fixed: Strife's teleport swirl didn't loop its animation.
- Fixed: Strife's rat is not supposed to be shootable.
- Fixed: Strife's MiniMissile pickup amount was still incorrect.
- Moved Strife's random dialogs into the string table. Now it should also be
	possible to define dialogs for other actors as well.

May 10, 2006
- Fixed: When revisiting a map in a hub, the player could spawn at the wrong
	height if the floor had moved while they were there before. This was because
	the player was spawned on the original copy of the map before the changes to
	it were dearchived, so they didn't know about the new floor height.
- Fixed: Calling BaseFileSearch() and letting it fill in the file's extension
	didn't work because the space for the path was deallocated before it
	returned.
- Guess we're not leak-free yet. Try travelling around in a hub and see that
	it leaks. I don't have time to track it down right now.
- Yay! We now seem to be free of memory leaks! The next step will be to
	merge a lot of these static destructor-only structs into regular
	functions added to the exit chain with atterm so that they can be called
	in a deterministic order and not whatever order the linker decides to put
	them in. (Interestingly, the amount of memory used when repeatedly
	executing the same map command at the console varies up and down, but it
	now stays relatively stable rather than increasing unbounded.)
- Fixed: The list of resolutions in the video modes menu was not freed
	at exit.
- Fixed: mus_playing.name was not freed at exit.
- Fixed: SN_StopAllSequences() should be called at the start of
	P_FreeLevelData(), not just before the call to P_SetupLevel() in
	G_DoLoadLevel(), so it can run even at exit. And C_FullConsole() can
	call P_FreeLevelData() to free more memory too.
- Fixed: StatusBar was not freed at exit.
- Fixed: spritesorter was not freed at exit.
- Fixed: Bad things happened if FString's data pool was destroyed before
	all C_RemoveTabCommand() calls were made.
- Added an overload for FArchive << FString.
- Fixed: The players' log text was not freed at exit.
- Fixed: Bot information was not freed at exit.
- Fixed: doomcom was not freed at exit. But since it's always created,
	there's no reason why it needs to be allocated from the heap. My guess
	is that in the DOS days, the external packet driver was responsible for
	allocating doomcom and passed its location with the -net parameter.
- Fixed: FBlockNodes were not freed at exit.
- Fixed: Openings were not freed at exit.
- Fixed: Drawsegs were not freed at exit.
- Fixed: Vissprites were not freed at exit.
- Fixed: Console command history was not freed at exit.
- Fixed: Visplanes were not freed at exit.
- Fixed: Call P_FreeLevelData() at exit.
- Fixed: Channel, SoundCurve, and PlayList in s_sound.cpp were not freed at
	exit.
- Fixed: Sound sequences were not freed at exit.
- Fixed: DSeqNode::Serialize() did not resize the m_SequenceChoices array
	when loading.
- Fixed mvlineasm1 and mvlineasm4 so that they can be used with textures
	taller than 256 pixels. There was a very slight performance hit for this,
	but I was able to tweak mvlineasm4 to make it approximately as fast as
	before. Interestingly, maskwallscan manages to be nearly as fast as
	wallscan despite having to check every pixel for transparency. I'm
	tempted to dump all the old masked rendering code and use
	(trans)maskwallscan for everything for the sake of simplicity: Only
	two functions to maintain for each render style, and much less
	complicated supporting code. Currently, I need five different functions
	for each rendering style: One traditional column-at-a-time style like
	Doom did it originally, two for rt_draw4cols, and two for transmaskwallscan.
	(Right now, I have cheated, and just done the ones that can be used
	by walls for transmaskwallscan, so the actual number of different functions
	isn't quite so high.) For small textures, such as font characters and
	far-away sprites, I'm sure maskwallscan is faster than the current code.
	For large textures, it's probably still competitive even if it isn't faster.
	But considering how similar wallscan and maskwallscan perform, the
	difference is probably pretty minimal, and maskwallscan still might come
	out ahead due to its simpler overhead.

May 10, 2006 (Changes by Graf Zahl)
- Fixed: PClass::CreateNew didn't check whether the class had valid
	defaults and tried to copy data from a NULL pointer.
- Fixed: FireThing and BrassTorch were misspelled in hexendecorations.txt
- Changed A_ChangeFlag so that it doesn't need to alter the flag
	string. With strings being passed as names this is unsafe.
- Removed unused parameter types from the function parameter parser for
	DECORATE.
- Changed: All actor name parameters in DECORATE are now passed as
	FNames, not as strings.
- Fixed: The MAPINFO parser stored the RedirectType as a type pointer.
	But at this point DECORATE hasn't been read yet so this was limited to
	the internal classes.
- Fixed: TXT_NEED_IDCARD wasn't terminated with a ';'.
- Fixed: Strife's DeadRebel was missing its DoomEdNum.
- With names as type identifiers it is no longer necessary to remap
	the monster types to internal constants in A_BossDeath.
- Fixed: A_BossDeath got the string from a name - just to get a name from
	the string. Using the name directly is sufficient.

May 9, 2006
- Redid ClearLcoks() fix that I accidentally removed.
- Added a new setting for am_rotate: 2 will enable rotation only for the
	overlay map while leaving the regular map unrotated.
- Added a new setting for am_overlay: 2 will disable the normal automap and
	show only the overlayed version.
- Fixed?: WallSpriteColumn apparently needs to set dc_texturefrac. At least
	Valgrind seems to say so.
- Fixed: The FWadCollection destructor needs to use free to free the LumpInfo
	and Wads arrays.
- Fixed: The ColorMapKiller needs to use the delete[] form of delete.
- Fixed: FConfigFile::ClearCurrentSection() should be calling the delete[] form
	of delete to free the entry.
- Fixed: FPatchTexture::MakeTexture() does not need to blindly recreate the
	Spans if they already exist.
- Fixed: The FMultiPatchTexture destructor did not call its Unload() method.
- Restored the original padding calculation to FMultiPatchTexture::MakeTexture().
	I believe the Valgrind errors were caused by accessing off the end of the
	screen buffer, not from accessing off the end of a texture.
- Backported the classnames-are-names changes from the FP code.
- Backported the improved hierarchical dumpclasses command from the FP code.
- Updated Jim's Makefile.linux.
- Added support for wrapping midtextures vertically.
- Since zdoom.wad is now zdoom.pk3, the default mapinfos can use full pathnames.
	So now they do.
- Fixed: The DSimpleCanvas constructor used a pitch too narrow on screens wider
	than 640 pixels when using a non-AMD processor and the processor's L1 cache
	line size could not be determined. I think this should fix the issue of
	weirdly rendered 8 pixel wide borders on the left and right of the screen that
	some people experienced.
- Fixed: The secnodes were never freed.

May 9, 2006 (Changes by Graf Zahl)
- Fixed a few Strife ammo amount values.
- Fixed the ClearLocks function so it doesn't crash when called before the
	ActorInfos have been created.
- Fixed: The FSpecialFont constructor created the name string twice.
- Fixed: The animated door parser was still leaking memory when it encountered
	an invalid animation due to missing textures.
- Fixed: The music volume list wasn't freed.
- Fixed: The image for WADs that were loaded from inside Zips was never freed.
- Changed FDoorAnimation deletion so that the array takes care of it. The
	original destructor approach would have necessitated a lot more supporting
	code to work as intended.
- Fixed: Skin definitions were never freed.
- Fixed: Names in terrain definitions were never freed. Replacing them with
	FNames would have been a good idea anyway.
- Fixed: The lock definitions were never freed.
- Fixed: FDoorAnimation was missing a destructor.
- Fixed: animation and switch definitions were never freed.
- Replaced all other places where FindType was used with FNames with
	IFindType.
- Fixed: If you want to use a name as the missile parameter for the basic
	attack functions the type search in DoAttack must be case insensitive.
- Fixed: APowerup::DoEffect must do more thorough checks before resetting
	the fixed colormap.

May 8, 2006
- Fixed: The names in the Depths array in m_options.cpp were never freed.
- Fixed: FDoomEdMap needed a destructor.
- Fixed: Decal animators were never freed.
- Fixed: Colormaps were never freed.
- Fixed: Memory allocated in R_InitTranslationTables() was never freed.
- Fixed: R_InitParticles() allocated way more memory than it needed to. (And the
	particle memory was never freed, either.)
- Fixed: FMetaTable::FreeMeta() should use delete[] to free string metadata.
- Fixed: FConfigFile::ClearCurrentSection() must cast the entry to a char *
	before deleting it, because that's the way it was allocated.
- Fixed definitions of DeadZombieMan and DeadShotgunGuy in doom/deadthings.txt.
	Skip_super resets the dropitem list, so having it after "DropItem None" is
	pointless.
- Fixed: Decorate DropItem information was never freed.
- Fixed: FinishStates() allocated even 0-entry state arrays.
- Fixed: Default actor instances were never freed.
- Fixed: FRandomSoundList never freed its sound list.
- Fixed: Level and cluster strings read from MAPINFO were never freed.
- Fixed: Episode names were never freed.
- Fixed: InverseColormap and GoldColormap were never freed. Since they're always
	allocated, they can just be arrays rather than pointers.
- Fixed: FFont destructor never freed any of the character data or the font's name.
- Fixed: Fonts were not freed at exit.
- Fixed: FStringTable::LoadLanguage() did not call SC_Close().
- Fixed: When using the -iwad parameter, IdentifyVersion() did not release the
	buffer it created to hold the parameter's path.
- Blends created with the ACS fade commands now degrade to transparent overlays
	when the menu is visible, so they can no longer obscure the menu.

May 7, 2006 (Changes by Graf Zahl)
- Added a misc/secret sound definition for Heretic.
- Fixed: Powered up weapons were not properly deselected when the level ended
	and their ready state was different from the main weapon's.
- Made some improvements to A_CountdownArg.
- Removed the 'Yes', 'No' and 'Greetings' state assignment commands. They haven't
	been documented and thus haven't been used at all so far. Therefore they don't
	need to be handled considering that they will go away anyway.
- Changed the DECORATE state parser so that Stop can also be specified right after
	a label, in addition to goto.

May 6, 2006
- The game is now free of leaks up to the point just after the wads are loaded.
- Fixed: Although TypeInfos are now deleted at exit, their FlatPointers or ActorInfo
	data was not freed. I chose not to use a destructor to handle this, because then it
	would no longer be a POD type that can be statically initialized.
- Fixed: Aliases were not deleted at exit.
- Fixed: FWadCollection did not free its hash tables, lump info, full names, or the
	list of open files when destroyed.
- Updated Italian strings that someone kindly e-mailed to me.
- The CRT no longer detects any memory leaks when I run to the IWAD picker and quit.
- Fixed: The memory used to hold the path to zdoom.wad/.pk3 was not freed if
	the IWAD picker was cancelled.
- Fixed: Some implementations of cvar->GetGenericRep (CVAR_String) returned a
	statically allocated string and others returned a dynamically allocated string.
	To be consistant, they should all be static.
- Fixed: DObject also has three static TArrays that should not be explicitly
	initialized: Objects, FreeIndices, and ToDestroy.
- Added a new do-nothing constructor for TArray that can be used for BSS objects
	that are manipulated before startup. Specifically, this was added because
	C_AddTabCommand() is called before main, but the TabCommands constructor is
	called after the array already has over 100 entries in it, orphaning everything
	that was already inserted. And since the code is much nicer-looking now, I didn't
	want to revert to the old non-TArray version.

	This could also have been used to fix FName, but I consider the current
	implementation to be better than the old one, so I'm leaving it as-is.

May 6, 2006 (Changes by Graf Zahl)
- Converted a_zombie.cpp and most of a_strifestuff.cpp to DECORATE.
- Converted a_strifekeys.cpp to DECORATE and moved the pickup messages to the
	string table.
- Removed the WIF_HITS_GHOSTS weapon flag and replaced it with MF2_THRUGHOST.
	There is no need to keep two flags around with virtually the same meaning.
- Changed the ShadowArmor to use the VISIBILITYPULSE flag to change its translucency.
	It looks much better now than the cheap code pointer based blinking it used before.
- Converted most of a_strifeitems.cpp to DECORATE and moved the pickup messages
	to the string table.
- Converted a_strifearmor.cpp to DECORATE and moved the pickup messages to the
	string table.
- Moved the messages for killing spectres to the string table.
- Converted the quest items to DECORATE. Also changed A_GiveQuestItem to get
	the messages it prints from the string table instead of the quest item's tag
	string.

May 5, 2006 (Changes by Graf Zahl)
- Removed the hopelessly outdated thingdef_doc.txt file from the repository.
- Converted a_peasant.cpp and a_ratbuddy.cpp to DECORATE.
- Fixed: C_DoKey didn't treat an empty string as 'no binding' when checking for
	valid double bindings.
- Converted a_merchants.cpp to DECORATE.
- Added MF5_NODAMAGE flag to generalize the behavior of Strife's merchants which
	can be shot but take no damage from getting hurt.
- Converted a_beggars.cpp to DECORATE.
- Added an Inventory.GiveQuest property. This makes it possible to define all of
	Strife's original items that also give a quest item in DECORATE but it is also
	useful to define items like the ones in Day of the Acolyte without ugly workarounds.
- Added a Tag property and Strife teaser conversation IDs to DECORATE so now it is
	possible to define many of Strife's items.
- Added a FastSpeed property to DECORATE so that projectiles can finally be
	assigned a higher speed for fast mode.
- Added a ACS_LockedExecuteDoor special. It is basically the same as the existing
	ACS_LockedExecute but it uses the 'door' message instead of 'remote'. This
	cannot be integrated into ACS_LockedExecute because all its arguments are already
	in use.
- Added a fully customizable A_CustomMeleeAttack function for DECORATE.

May 5, 2006
- Fixed: Scanned IWAD paths were not freed if you exited without selecting one.
- Fixed: Dynamically allocated cvars were not freed on exit.
- Fixed: FConfigFile's destructor did not free space used for Values.
- Added "DropItem None" as a way for inherited actors to avoid dropping items if
	their superclass normally does. This is only needed if somebody dehacks
	DeadZombieMan or DeadShotgunGuy.
- Moved Doom's dead body actors into DECORATE so that I can finish and verify the
	implementation of "States { StateLabel: goto SomeOtherLabel }" constructs. The
	alternate method of overriding inherited states is now deprecated, since it's
	incompatible with the coming custom state labels.
- Changed TAG_MORE to pass a va_list pointer instead of a va_list because it's a
	non-POD type when targeting several non-ix86 targets with GCC. Hopefully this works.
	(Guess it didn't. Boohoo.)

May 4, 2006
- Rewrote FName to use only POD types for its static data so that it can be used
	without any explicit constructors being called.
- Fixed: ZTwinedTorchUnlit, ZWallTorchUnlit, ZFireBullUnlit, and ZCauldronUnlit
	were missing game filters.

May 4, 2006 (Changes by Graf Zahl)
- Added Poisondamage property for DECORATE. I first did this for one of the first
	DECORATE updates but the code seems to have gotten lost.
- Converted A_Puzzleitems.cpp and parts of A_HexenSpecialdecs.cpp to DECORATE.
- Converted A_Hexendecorations.cpp to DECORATE.
- Changed the lower decal spawning code to transfer the main decal's color if
	the lower decal's default color is the same as the main decal's.
- Changed the decal stretcher back to use the specified size parameters as a
	scaling factor and not a destination size because this is more consistent with
	the rest of the decal code. Also adjusted the blood smear definition in DECALDEF
	and the description in the Wiki for this.
- Added Jim's most recent fixes.

May 3, 2006
- Fixed: Conversion of c_bind.cpp to FString was incomplete.
- Fixed some functions that were declared as taking size_t's but defined as taking
	unsigned ints.
- Added a dummy object to delete sound environments on exit.
- Fixed: FWarpTexture did not delete its Spans when destroyed.
- Changed wadclusterinfos and wadlevelinfos arrays into TArrays.
- Added the TypeInfo::AutoTypeInfoPtr for TypeInfo::m_RuntimeActors so they can
	be automatically deleted.
- Changed TypeInfo::m_Types into a TArray so it will be automatically deleted
	on exit.
- Fixed: TArray::Resize() did not deconstruct entries when shrinking the array.
- Changed TArray::Push() so that it calls Grow() instead of duplicating the growth
	calculations itself.
- Calling TArray::Grow() for a small amount when the array is short should grow it
	a bit more than it was doing.
- Removed generational garbage collection from the string pool because it didn't
	actually work.
- Turned the list of TabCommands into a TArray because I saw lots of console
	commands in the memory leak report at exit. Then I realized those were actually
	key bindings, so I changed the Bindings and DoubleBindings arrays into FString
	arrays.
- Fixed: FStringCVar was missing a destructor.
- Added TArray::Insert().
- Fixed: TArray::Delete() used memmove().
- Renamed Malloc(), Realloc(), and Calloc() to M_Malloc(), M_Realloc(), and
	M_Calloc() so that the debug versions can be defined as macros.
- Enabled the CRT's memory leak detection in WinMain().
- Moved contents of PO_DeInit() into P_FreeLevelData().
- Removed "PolyBlockMap = NULL;" from P_SetupLevel(), because the P_FreeLevelData()
	call it makes next does the exact same thing, but also freeing it if needed.
- Fixed: Unneeded memcpy in UnpackUserCmd() when ucmd and basis are the same
- Removed -bpal parameter. Blood's blood.pal is loaded from blood.rff, and
	its tiles are loaded from the same directory.
- RFF files now load their entire directories into the lumplist.
- Added char * and const char * type coversions for FString, so FStrings can be
	freely passed to functions expecting C strings. (Except varargs functions,
	which still require manually fetching the C string out of it.)
- Renamed the name class to FName.
- Renamed the string class to FString to emphasize that it is not std::string.

May 3, 2006 (Changes by Graf Zahl)
- Converted A_Speedboots.cpp, A_HexenArmor.cpp and A_Hexenkeys.cpp to DECORATE
- Fixed a few memory allocation issues pointed out by Jim's Valgrind dump.
- Removed doom.x, heretic.x and strife.x from the SVN repository. These
	are generated files.
- Fixed: A_PainDie has to check whether a valid target exists before
	calling IsFriend.
- Fixed: FDecalLib::FindAnimator needs a signed counter to work properly.

May 1, 2006 (Changes by Graf Zahl)
- Added support for game specific pickup messages, if only to be able
	to define Raven's invulnerability item in DECORATE.
- Removed A_TreeDeath because it is no longer used.
- Fixed: When picking up a PowerupGiver for an active powerup the
	blend color and the duration were transferred to a temorary item
	and never took effect. They have to be trnasferred to the newly created
	powerup item before trying to give it to the player, not afterward.
- Made the colormap of the InvulnerabilitySphere item specific.
	The base power class still needs to have its color adjusted
	per game though and since Raven's invulnerability item is used in both
	Hexen and Heretic it can't define its own colormap/blend.
- Separated the invulnerability colormaps from the game being played
	and made them item specific. They can also be specified as regular
	blend colors in DECORATE now.
- Converted a_hereticarmor.cpp and most of a_doomartifacts.cpp,
	a_hereticartifacts.cpp and a_heretickeys.cpp to DECORATE.
- Changed the Soulsphere to be a real health item with the Dehacked
	modifications made in d_dehacked.cpp as for most other items which
	need to be adjusted.
- Added IF_BIGPOWERUP flag to AInventory to expose the RESPAWN_SUPER
	dmflag to DECORATE. Also removed the now obsolete ShouldRespawn methods
	from AInvulnerabilitySphere and ABlurSphere.
- Converted a_splashes.cpp to DECORATE.
- Converted most of a_debris.cpp to DECORATE.

May 1, 2006
- Made loading of Build's palette.dat automatic if it's found inside a loaded
	group file, but the -bpal parameter remains for now.
- Made loading of Build art tiles automatic if they are found inside a group
	file. Removed the corresponding command-line parameter.
- Added support for Ken Silverman's group files.

April 30, 2006 (Changes by Graf Zahl)
- Removed the DCorpseQueue class. It was no longer used and since
	the savegames it might have been used in have become incompatible
	a long time ago there is no reason to keep it around anymore.
- Fixed: level.maptime must be set to 0 every time a level is loaded.
- Converted a_doomarmor.cpp and a_doomkeys.cpp to DECORATE.
- Replaced all need key messages that weren't already in LANGUAGE with
	a LANGUAGE identifier. Also made the messages for Hexen's keys unique
	strings instead of constructing them at run time.
- Added: Pickup messages can now handle embedded localized strings - like
	the need key messages
- Converted a_hereticdecorations.cpp as well.
- Time to put the capabilities of Zip files to good use:
	Converted a_doomdecorations.cpp into a DECORATE lump to test my changes.
	(The EXE got 24 kb shorter by that - much more than I expected...)
- Added a 'game' property to DECORATE so that game specific IDs can be
	defined.
- Added an #include directive to the DECORATE parser.
- Also removed ABreakableDecoration. Using AActor and the metadata
	for the death and burn height gives the same results with less code.
- Removed the ADecoration class. It just inherited from AActor without
	adding any functionality of its own.
- Added functions to sc_man to save and restore the full script state.
	This allows recursive use of the script parser.
- Changed SC_Open to check for full names in a ZIP first.
- Fixed: Ammo2 no longer gets displayed when it is identical to Ammo1.
- Re-enabled the death camera due to public demand but made it switchable
	by a CVAR.

April 29, 2006 (Changes by Graf Zahl)
- ZDoom now loads zdoom.pk3 instead of zdoom.wad.
- Fixed: StreamSong::SetVolume should check the m_stream pointer. This can
	happen when a TimiditySong doesn't use FMOD and outputs the sound itself.
- Fixed: 'use' sector actions were using the incorrect sector on several
	occasions.
- Added a wi_noautostartmap CVAR and a noautostartmap intermission option
	that force the user to manually end the 'entering level' page.

April 23, 2006 (Changes by Graf Zahl)
- Added a clipmidtextures level flag which exposes the ML_CLIP_MIDTEX
	feature globally per level. Also moved the setting of this flag for Strife
	into MAPINFO.
- Added MBF's logic to move monsters away from a dropoff but changed it
	so that it doesn't require a general change in the movement code.
- Added: The Trace function needs a compatibility option to exclude
	two-sided lines with both sides in the same sector from being checked.
	Originally this wasn't done and some WADs (e.g. Alien Vendetta MAP15)
	need the original behavior to work.

April 22, 2006 (Changes by Graf Zahl)
- Removed ABossEye::Serialize because it didn't do anything.
- Fixed the issues with .96x's railgun code and added it to the current
	version.
- Fixed: Setting of the friendly Minotaur's angle was inconsistent and
	could cause it to move backwards in a f�w situation.
- Fixed: The minotaur did checks for type by checking for the MF_FRIENDLY
	flag, not by checking for the actor class. That made it impossible to
	spawn friendly 'normal' minotaurs.
- Moved a few virtual methods which are only applicable to the friendly
	minotaur to AMinotaurFriend.
- Fixed: The friendly minotaur checked the master's health instead of
	the target's when deciding whether to switch targets. Replaced with
	MF4_NOTARGETSWITCH.
- Fixed: maybedrawnow must not draw the console unless the background
	texture has been set up.
- Fixed: V_InitCustomFonts initialized lastlump to -1 instead of 0.
- Fixed: CreateTexture never checked whether it could read from the
	texture lump. Since the minimum valid length is 13 bytes for a
	1x1 pixel patch everything below that will now return with an error.
- Fixed a few occurences of mismatched free's for new'd memory.

April 21, 2006 (Changes by Graf Zahl)
- Fixed: To prevent the pointer cleanup code from crashing numsectors has
	to be set to 0 when the sectors array is deleted.
- Added Zloba's fix for Linux's I_FindFirst.

April 20, 2006 (Changes by Graf Zahl)
- Fixed: Doom's status bar assumed that STBAR was always in Doom patch format.
- Added MF3_DONTSPLASH to the newly created sound sequence things.
- Fixed: makewad.c used C++ syntax.
- Fixed: Strife's ending check included destroying the computer - an event
	that happens before the branch in the story.
- Fixed: The overloaded FRandom::Random2 function with mask parameter didn't
	use its parameter.
- Added Jim's latest makefile.linux

April 20, 2006
- Fixed: Crash when opening the player setup menu when you're so dead that
	your head has popped off your body.
- Fixed: When item respawning is on and you play on skill 1 or 5, picking
	up ammo would permanently double the amount of ammo received from that
	item the next time it gets picked up.
- Added a check to PlayerIsGone() for players who have already had their
	actors destroyed before calling it.
- Fixed: G_CheckDemoStatus() only restored your name, autoaim, and color
	settings after playing back a demo.
- Added DEM_SPRAY net command so that sprayed decals work in multiplayer
	and demos.
- Changed DEM_GIVECHEAT to use a word for specifying the item quantity.
	This is useful mainly for giving yourself more than 255 health at a time.
- Fixed: DEM_SUMMONFRIEND was not handled by Net_SkipCommand().
- Fixed compilation with mingw again.
- Added multiple-choice sound sequences. These overcome one of the major
	deficiences of the Hexen-inherited SNDSEQ system while still being Hexen
	compatible: Custom door sounds can now use different opening and closing
	sequences, for both normal and blazing speeds.
- Moved the TArray serializer into farchive.h so that tarray.h doesn't need
	farchive.h at all because GCC was much pickier than VC. Because of this,
	I don't need the FArchive change I made yesterday that hid FArchive's
	TArray uses behind pointers.
- Added a countof macro to doomtype.h. See the1's blog to find out why
	it's implemented the way it is.
		<http://blogs.msdn.com/the1/articles/210011.aspx>
- Added a new method to FRandom for getting random numbers larger than 255,
	which lets me:
- Fixed: SNDSEQ delayrand commands could delay for no more than 255 tics.
- Fixed: If you're going to have sector_t.SoundTarget, then they need to
	be included in the pointer cleanup scans.

April 19, 2006
- Added a serializer for TArray. This required I make a couple changes to
	FArchive in order to avoid circular references between farchive.h and
	tarray.h.
- Ported back newer name code from 2.1.
- Fixed: Using -warp with only one parameter in Doom and Heretic to
	select a map on episode 1 no longer worked.
- New: Loading a multiplayer save now restores the players based on
	their names rather than on their connection order. Using connection
	order was sensible when -net was the only way to start a network game,
	but with -host/-join, it's not so nice. Also, if there aren't enough
	players in the save, then the extra players will be spawned normally,
	so you can continue a saved game with more players than you started it
	with.
- Added some new SNDSEQ commands to make it possible to define Heretic's
	ambient sounds in SNDSEQ: volumerel, volumerand, slot, randomsequence,
	delayonce, and restart. With these, it is basically possible to obsolete
	all of the $ambient SNDINFO commands.
- Fixed: Sound sequences would only execute one command each time they were
	ticked.
- Fixed: No bounds checking was done on the volume sound sequences played at.
- Fixed: The tic parameter to playloop was useless and caused it to
	act like a redundant playrepeat. I have removed all the logic that
	caused playloop to play repeating sounds, and now it acts like an
	infinite sequence of play/delay commands until the sequence is
	stopped.
- Fixed: Sound sequences were ticked every frame, not every tic, so all
	the delay commands were timed incorrectly and varied depending on your
	framerate. Since this is useful for restarting looping sounds that got
	cut off, I have not changed this. Instead, the delay commands now
	record the tic when execution should resume, not the number of tics
	left to delay.

April 19, 2006 (Changes by Graf Zahl)
- Fixed: Hexen's ammo display in the status bar cannot be refreshed
	partially because the background patch has to be drawn always to
	overwrite the old display.
- Fixed: Giving a health item to a non-player caused a crash.
- Added a compatibility option to limit deh.MaxHealth to the health bonus.
	Originally this value wasn't used for health packs. Doing this was a bug
	in Boom but since there's quite a few maps out there which require
	Boom's altered behavior it has to be compatibility optioned.
- Fixed: The health bonus's max health must be defined by deh.MaxHealth,
	not deh.MaxSoulsphere. To achieve this deh.MaxHealth's handling had to
	be altered because it has to default to 100.
- Fixed: ZDBSP created incorrect side references with compressed sidedefs
	and both sidedefs of a linedef being the same. This only affects the
	external tool because the internal node builder is run after uncompressing
	the sidedefs.
- Added Jim's latest makefile.linux.
- Added a consistency check to the PNAMES loader because one crash log
	indicated that it crashed due to a corrupt PNAMES lump.
- Brought back the sector based sound target handling as a compatibility
	option. This radical change just broke far too many maps that depend
	on the original behavior. Strife's special AI functions are excluded
	though because they work better with the new method.
- Fixed: Hexen had no default sound sequence for doors and passed a NULL
	pointer to SN_StartSequence in DoorSound.

April 18, 2006 (Changes by Graf Zahl)
- Fixed A_CHolyAttack used linetarget to set the spirits' target actor.
	But it assumed that this variable was still valid from shooting the
	weapon. Not only is that not guaranteed. When used by the ClericBoss
	it is an unwanted effect because the linetarget is most likely the
	last thing the player fired at which normally is the ClericBoss itself.
	A_CHolyAttack now sets tracer to the intended target instead of
	relying on linetarget being preserved.
- Fixed: Strife's grenades only bounce twice off the floor. They also
	bounce off all actors and immediately explode when hitting liquids.
- Fixed: Strife's flame thrower gives 100 ammo as a pickup item but only
	40 when given in a dialog.
- Moved the sky change script starts for the Programmer into MAPINFO as
	special death actions.
- Changed the sky in MAP09 of Strife to the blue sky to make it more
	consistent. Now the sky change occurs when the player wakes up after
	fighting the programmer.

April 18, 2006
- Fixed: DBaseStatusBar::DrBNumber() should behave like Doom's
	STlib_drawNum(), and FDoomStatusBarTexture::DrawToBar() should add
	the textures left offset to the x coordinate before drawing.
	These fix Twice Risen's status bar.
- Changed: VPrintf now uses string.VFormat(), instead of vsprintf().

April 17, 2006 (Changes by Graf Zahl)
- Fixed: The Oracle Pass is an item, not a key. Strictly speaking the
	same applies to the Prison pass but having that as a key masks
	some bad design in Strife so it is better to leave it a key.
- Fixed: The spectral lightning spot used a weird combination of flags
	that made it act quite unexpectedly. After removing all flags except
	MF_NOBLOCKMAP it seems to do what it is supposed to do. I also had
	to add a new flag, MF5_NODROPOFF to prevent the spot from moving over
	tall ledges.
- Fixed: When giving an autoactivatable item to the player a copy is
	created to allow respawning. But when the item had been successully
	used the original was destroyed, not the copy.
- Fixed: dssiglup was misspelled as dssglup in SNDINFO so the Sigil's
	charging sound never played.
- Fixed: The sigil doesn't use the generic weapon pickup sound. It should
	use weapons/sigilcharge.
- Fixed: P_Move never checked whether a monster has the MF2_PUSHWALL flag.
	As a result everything using A_Chase was able to activate pushable
	walls and not just the monsters which are allowed to activate them.
- Fixed: P_Move must split the move if the step size is larger than the
	radius.
- Fixed: tmfloorpic was set in P_LineOpening. But this is not guaranteed
	to set the correct picture because the end result depends on the line
	ordering and not the sector heights. It must be set in PIT_CheckLine.
- Fixed: Due to the previously missing ceilingsector variable bouncing
	missiles could use the incorrect sector when hitting an edge between
	ceilings of different height.
- Fixed: Missiles exploding on the edge of a ceiling neighboring to a
	sky vanished instead of exploding if the missile's center was in the
	sky sector. To do this I added ceilingsector and ceilingpic variables
	to AActor, similar to the already existing floorsector and floorpic.
- Fixed: ZDoom now looks for ZDoom.wad in the program directory first.

April 16, 2006
- Fixed: After respawning in a singleplayer demo, demo playback went out
	of sync becase the RNG seed was being altered during recording but not
	during playback. This was caused by an inappropriate fix for a similar
	problem: -record calls G_InitNew() before it actually starts recording
	the demo, but -playdemo calls G_InitNew() after it starts playback. So
	the rngseed stored in the demo was already altered. The correct thing
	to do is not to prevent the rngseed from changing during playback but
	to move the call to G_InitNew() after the call to G_BeginRecording().
- Fixed: After respawning in a demo, demo playback was prematurely
	terminated.

April 16, 2006 (Changes by Graf Zahl)
- Increased the limit for the sound DoorCloseLight in Hexen to 4 because
	it got cut off in the polyobject crusher in MAP01.
- Fixed: A player that has no body (as in the head popped off in Heretic
	and Hexen) must not be resurrected.
- Fixed: Repeatable switches that are being activated while the switch
	animation was still running didn't react properly.
- Fixed: Not all paths in P_LoadSegs freed the vertchanged array.
- Fixed: With infinitely tall actors on P_CheckPosition must not
	check for stepping on things.
- Fixed: R_FakeFlat used the control sector's floor light level for
	ceilings of deep water areas.
- Fixed: Dormant floating monsters still adjusted their height to their
	target.
- Fixed: Invisible special things should never create terrain splashes.
- Changed: The Demon no longer reduces the actual state durations for
	fast mode. Now this is done by AActor::SetState and controlled by
	actor flags.
- Fixed: Friendly monsters are now completely excluded fron being counted
	as kills.

April 15, 2006 (Changes by Graf Zahl)
- Changed -warp for ExMy to use atoi to parse the parameters. This is
	more robust than reading the characters directly.
- Expanded thing and line args to 32 bit.
- Extended Makewad so it can write Zip files in addition to WAD files.

April 14, 2006 (Changes by Graf Zahl)
- Moved SC_CheckFloat into sc_man.cpp.
- Fixed several issues with the DECORATE parser:
	* Floating point parameters couldn't be parsed correctly
	* Some code pointers used parameters incorrectly.
	* Parameters with default value 1 didn't work as expected
- Added GZDoom's HI_START/HI_END lump namespace. Even though it doesn't do
	anything (yet) suppporting it allows to make WADs that use hires texture
	replacements but are able to run with ZDoom as well.
- Added GZDoom's Zip-support but changed it so that lumps are sorted
	alphabetically.
- Added the missing file 'flac/private/float.h' to the repository.
- Added: For Zip-support the sound code has to be able to load music data
	from memory, not just from files.
- Re-added I_SetMusicVolume to optionally reduce the music volume in Strife
	conversations.
- Fixed: The total game time must not be restored when loading a snapshot
	during a hub transition.

April 13, 2006
- Fix farchive.cpp swappers for GCC again. Now that they use entirely integer
	math, they should work with all GCC versions.
- Update FLAC readers to #define FLAC__NO_DLL to match the new FLAC builds.

April 13, 2006 (Changes by Graf Zahl)
- Made weapons/bowhit unlimited. With a limit of 2 it won't be played
	consistently.
- Fixed: 'Give' worked for dead players.
- Added checks for sectors without lines to all Find* functions in p_sector.cpp
- Fixed: Dehacked patches weren't loaded when not playing Doom.
- Fixed: Thing_Remove must not remove living players from the map.
- Fixed: Using $MAP in SNDINFO overrode music definitions in MAPINFO. This
	made it impossible to define music in MAPINFO for Hexen.
- Fixed: Resurrecting a morphed player must first restore the unmorphed
	version.
- Fixed: Resurrect must set the player's weapon to a valid state.
- Fixed: The decal stretcher is supposed to stretch the decal to a specifiable
	size but it used that size as a scaling factor instead. The old code allowed
	a maximum scaling factor of 4 which masked this bug to a large extent but
	with the increased precision the blood smears were stretched to abnormal
	proportions.
- Fixed: A non-spectral attack set any spectral target to its missile state.
	This is not supposed to happen.
- Fixed: The Prison Key was misspelled in the pickup message.
- Added missing lock messages for Strife.
- Fixed some ammo pickup values for Strife.
- Added the missing messages when killing a spectre in Strife.
- Fixed: DImpactDecal's default constructor called ChangeStatNum which caused
	a crash. Now it calls DBaseDecal's constructor that allows changing the
	statnum.
- Added additive translucency to the Ironlich's projectiles.
- Added a check for AInventory to PickConversationReply before giving an item
	to the player. This could crash if non-inventory items were given.
- Added a few console commands useful for map testing:
	* 'monster' lists all monsters and their position.
	* 'items' does the same for items.
	* 'changesky' changes the sky texture. Useful for trying out different skies.
	* 'linetarget' prints some information about the monster the player is aiming
		at.

April 12, 2006
- Fixed: Using printinv before starting a game crashed.
- Fixed: DMover::MovePlane() would not stop moving the plane when it exactly
	reached its target height unless it was a floor moving down.
- Fixed: Actors that can't attack should not be valid haters for Thing_Hate.
- Fixed: AArtiBlastRadius::BlastActor() should not set MF2_SLIDE for missiles.
- Fixed: sdl/i_input.cpp should check !iscntrl() before generating EV_GUI_Char
	messages.
- Added Jim's Makefile.linux.
- Changed: Decal scales now use full precision fixed point numbers.
- Changed: Keeping impact decals in their own statlist is enough to keep track
	of them for when one needs to be destroyed. There's no need to maintain a
	separate list for them.
- Fixed: Decal actors did not spread their decals across neighboring walls.
- Fixed: Decal groups did not initialize their IDs and could not be reliably
	used with the decal actor.
- Fixed: Decals on moving polyobjects were not interpolated. R_RenderDecal()
	now uses the decal's LeftDistance to calculate its visible location, so it
	always stays in sync with the wall's vertices. This also lets me dump some
	code from the polyobjects that maintained the decals' (x, y) coordinates.
	Also, the decals' x and y information is redundant and can be removed.
	Doing this revealed a bug with slider decals and horizontal sliding:
	That is, it didn't work at all. I have opted to simply remove the horizontal
	sliding support so that I don't have to worry about what happens when a
	decal slides across the edge of a wall.
- Fixed: DBaseDecal::LeftDistance was calculated as a 30.2 fixed point number.
	It should be 2.30 fixed point.

April 12, 2006 (Changes by Graf Zahl)
- Fixed: SAVEVER was still 231 although MINSAVEVER was 232.
- Fixed: Decal spreading used an incorrect z-coordinate. It has to use
	the one originally passed to DImpactDecal::StaticCreate.

April 11, 2006
- Fixed: GCC misoptimized the SWAP macros in farchive.cpp.
- Fixed: Compiling with mingw once again works.
- Fixed: ACS improperly calculated the address of local variables when
	returning from one function to another function when the function that
	was called was used as part of an expression.
- Fixed: Using Thing_Hate with arg0 (hater) set to 0 from an open script
	could crash.
- Fixed: Some items along ledges in Hexen's MAP32 (Orchard of Lamentations)
	appeared at the bottom of the ledge (and consequently inside it) instead
	of on top of it because the items were placed directly on the lines.
	AActor::LinkToWorldForMapThing() needs to use the original R_PointOnLineSide()
	code to handle situations like this. Previously, it just used the original
	code for straight horizontal/vertical lines and used the new code for
	diagonal lines.
- Fixed: FWadCollection::MergeLumps() used in incorrect realloc.
- Fixed: FPlayList::NextLine() did not properly handle blank lines in the
	playlist.
- Changed: Decals now use lightweight thinkers instead of actors. (76 bytes
	versus 396, so you save 320k if you have 1024 decals present.)
- Fixed: Wads added with pullin were loaded immediately after the IWAD.
	Exec files are now processed immediately before -file but after autoloading
	wads in D_DoomMain().
- Fixed: sdl/i_system.h unconditionally defined SHARE_DIR, preventing
	redefinition from the command line.
- Fixed: The standard way to include SDL.h is <SDL.h>, not <SDL/SDL.h>.
- Fixed: Returned FActiveInterpolation::HashKey()'s return type to size_t,
	avoiding a pointer truncation warning.

April 11, 2006 (Changes by Graf Zahl)
- Fixed: Strife's dialogs don't give weapons to the player he already has.
- Fixed: The INDIANA cheat in Hexen gives 25 of each item, not just 1.
- Fixed: The stair builder's compatibility mode must do a linear search
	for sectors. Searching the hash chain doesn't work here.
- Fixed: Any monster with a TakeSpecialDamage method should call the
	super class's method instead of simply returning the damage amount.
- Fixed: Hexen's mash monsters cannot be frozen. No matter how you kill
	them they just vanish. This means they need the NOICEDEATH flag.
- Fixed: Morphing a monster must also copy its translucency settings.
- Fixed: The first Macil must react to weapon fire, even though he
	doesn't get hurt by it.
- Fixed: Anything with a raise state needs the MF_CORPSE flag when dying
	because otherwise it can't be revived.
- Fixed: Player names in Heretic, Hexen nand Strife could only be 13
	characters because the input routine did an unnecessary font size check.
- Added: After saving the game the savegame should be checked
	and in case of an error an appropriate message be output.
- Fixed: The pig player had an initial health of 100, not 30.
- Fixed: Morphing a player removes the armor after transferring the
	inventory to the morphed version - but it tried to remove it from the
	unmorphed player instead.
- Fixed: Heretic uses Backspace to activate the Tome of Power by default.
- Fixed: 'Use all' should not try to use puzzle items.
- Made FileReader's methods virtual. Right now this isn't important
	but when ZIP support will be added it is needed. Also added a
	MemoryReader class that derives from FileReader.
- Added a pointer check to DI_Acquire and DI_Unacquire. GZDoom definitely
	had problems with that so it might be a good idea to always check these
	pointers.
- Added an engine signature to the savegame. The inability to distinguish
	between ZDoom and GZDoom savegames constantly forced me to use some ugly
	tricks which broke the versioning system. This may also be useful for
	other derivates that have to save additional data in a savegame.
- Due to the savegame version bump I removed all compatibility code.
- I had to bump the minimum savegame version because I got some strange
	effects with old savegames. On the positive side, this allows me to
	do a few more radical changes to the savegame code. ;)
- Fixed: CanvasTextures weren't saved in a savegame.
- Fixed: Multiple warp commands for the same texture were cumulative.
- Changed FPatchTexture::MakeTexture and FIMGZTexture::MakeTexture so they
	don't re-initialize the texture's size information repeatedly. This can
	cause problems if code was added that manipulates these values after loading
	the textures.
- Changed FPatchTexture::GetDimensions to use ReopenLumpNum instead of
	OpenLumpNum. Once ZIP handling is added the current code won't work anymore
	without adding a highly expensive copy operator to FWadLump.
- Added Transfer_WallLight special. This is similar to Transfer_Floor/Ceilinglight
	but affects walls instead.
- Fixed: P_TestActivateLine must check whether a valid actor is trying
	to activate the line.
- Added a check for MF2_NOTELEPORT to the special activation check for
	Booms generic triggers. This excludes most items from activating these
	lines that are not supposed to do that.
- Added a sv_dropstyle CVAR so that the way items are dropped is no longer
	dependent on the game being played.
- Added MF4_FRIGHTENED flag from .96x.
- Added a CVAR that disables the automap background graphic in Heretic
	and Hexen.
- Added more color options to the automap, including the option to show
	secrets.
- Added menu option for the monster movement interpolation CVAR.
- Fixed: Strife's grenades don't make bouncing sounds.
- Fixed: Strife's grenades lose 50% of their momentum when bouncing,
	not 30% like in Hexen.
- Fixed: HexenHack must be reset for each MAPINFO lump being parsed.
- Turned monster falling damage into a level flag so that it can be
	used in all games, not just Hexen.
- Added the map's lump name to the savegame information. This is useful
	for those who remember maps by their lump name and not the description.
- Added a total game time counter and made the total time display on
	the intermission screen operrable. Also added an optional total time
	display for the automap.
- Added support for full hub intermission statistics. To make this work
	properly level.time is now being reset after changing hubs.
- Added GZDoom's local SNDINFO/SNDSEQ code. This was supposed to be in
	.96x but that was cancelled before I had the chance.
- Made DCanvas::FlatFill virtual so it can be overridden by other
	types of canvases (e.g. OpenGL.)
- Fixed: CR_UNTRANSLATED was uninitialized for FON2 fonts
- Fixed: Hexen uses a view height of 48, not 41.
- Changed: Multiplayer weapons will be spawned in coop games now
	unless the player explicitly disables this. There are many WADs
	out there that need the additional weapons in coop games.
- Added code that remaps MF_NOSECTOR to RF_INVISIBLE for all items
	touched by Dehacked and for ABossEye. MF_NOSECTOR makes any
	item completely deaf so it is very dangerous to use with monsters
	or other things that depend on their sound target.
- Fixed: The Dehacked code cleared one of the translation flags.
- Fixed: The dehacked parser must set EnglishStrings to NULL after
	freeing the memory.
- Copied a fix for restoring the weapon slots from 2.1.0.
- Fixed: APathFollower::Interpolate needs some NULL pointer checks.
- Added MF2_NOTELEPORT to ABlood and AIceChunk. Teleporting blood can
	seriously mess up one-time teleporters - plus it looks just weird.
- Fixed: It was possible to use things through closed walls when the wall
	was further away than 64 map units.
- Added a check for MF3_BLOODLESSIMPACT to P_LineAttack so that bloodless
	hitscan attacks can be created.
- Added a check to P_CheckSlopeWalk that prevents sliding when hanging over
	a sloped dropoff.
- Fixed: The line id hash chains used signed shorts to link their elements.
	This completely broke line manipulation for linedef indices >= 32768.
- Fixed: Changed PL_SKYFLAT from 0x8000 to 0x10000 because otherwise it
	doesn't work with linedef indices >= 32768. Also expanded sector_t::sky
	from WORD to int to make this work.
- Added the flag parser fix from GZDoom. It was still incorrect.
- Added an escape flag to sc_man. This was necessary to parse the frame names
	correctly which can contain backslashes so they must be excluded from
	converting \" to ".
- Fixed: The 'ELVIS' cheat code wasn't terminated with 255.
- Fixed: When an object without any death state dies it has to be destroyed.
- Added 'nofog' parameter to Thing_Move
- Added a check for Teleport_ZombieChanger to P_TranslateTeleportThings.
- Fixed: Dumpmap crashed when the loaded map has GL nodes because it tried
	to access the linedef of a miniseg. Needless to say, the BSP that is
	written in this case is completely broken but at least it doesn't crash
	anymore.
- Fixed: z-momentum application in P_ZMovement was incompatible with
	the original method. Unless MF2_FLOATBOB is set it must be done before
	applying gravity to momz.
- Fixed: AActor::Massacre caused an infinite loop when it wasn't able to
	hurt the actor.
- Fixed: Due to movement interpolation the viewsector could be incorrect
	if the actual camera's position and the interpolated position were not
	in the same sector.
- Fixed: Assigning an empty string to a 'string' object NULLed
	the Chars pointer. This cannot be done because it makes the
	string object invalid.
- Fixed: Default intermission handling for E1-E3 should only happen when
	playing Doom 1 and Heretic.
- Fixed: 'Give all' cheat must not try to give an item of type 'All'.
- Fixed: In rare circumstances DBoundingBox::AddToBox could produce
	incorrect results.
- Fixed: The node builder still used NO_INDEX for initializing non-existent
	sidedefs.
- Added MaxStepHeight and MaxDropoffHeight actor properties to DECORATE.
- Added new code pointers from GZDoom: A_FireAssaultGun, A_FadeIn and
	the target inventory functions. Also added changes to several other
	code pointers.
- Fixed: The FlameThrowerParts were missing the IF_INVBAR flag.
- Added a third parameter to A_BFGSpray to customize the amount of damage.
- Added A_DualPainAttack code pointer submitted by Justin for GZDoom.
- Fixed: AFatShot must have a height of 8, not 32.
- Fixed: AFighterPLayer::DoHealingRadius initialized the armor item
	incorrectly so it was ineffective.
- Fixed: Strife's Brass Key needs a DoomEdNum of 39.
- Removed all the obsolete code and variables from the keys. With the
	LOCKDEFS lump the original key numbers were deleted anyway and the
	NeedKey messages are taken from the lump now.

April 10, 2006 (Changes by Graf Zahl)
- Fixed: The Teleporter Beacon was missing the pickup message.
- Made the IronLich's projectiles bright. Using them in non-bright state
	in dark sectors looks truly odd.
- Fixed: Using bot_observer cleared the FRIENDLY flag off the player.
- Fixed: Changed some decals from DecalScorch to DecalScorchLower.
- Fixed: Added the missing intermission lumps and LOCKDEFS to zdoom.wad
- Changed the damage formula for Strife's dagger. This change has already
	been added to the 2.1.0 source but not to the current version.
- Added a call to P_HitFriend to A_SentinelRefire to prevent it from shooting
	at friends.
- Fixed: The Inquisitor's grenades should not teleport.
- Fixed: The Inquisitor isn't supposed to be thrust by damage so its mass
	has to be increased.
- Fixed: Strife's Inquisitor can be hurt by radius damage as long as this
	damage comes from a non-Inquisitor.
- Fixed: AArtiDarkServant::Use must always report successful use of the item.
	This function cannot fail. It either spawns a Minotaur or a new artifact
	but never nothing at all.
- Fixed: Hexen's temp flames have two spawn IDs each. Since ZDoom doesn't
	support multiple spawn IDs per item I added copies of these objects
	to assign the second set od IDs.
- Fixed: Hexen's wall torch was missing the MF4_FIXMAPTHINGPOS flag.
- Fixed: A_CStaffCheckBlink must call A_WeaponReady because otherwise the
	weapon bobbing becomes slightly erratic.
- Fixed: AGoldWandPuff2 had incorrect values set for flags2.
- Clamped the vertical speed of Heretic's Mace's balls. When shot at a high
	vertical angle their movement becomes erratic.
- Fixed: Doom's corpses must clear the MF3_ISMONSTER flag inherited from
	their monster parents.

April 9, 2006
- Fixed: The strupr() implementation in w_wad.cpp relied on compiler-dependant
	behavior.
- Fixed fix: ParseActorProperties() still wasn't sending + or - to
	ActorFlagSetOrReset().
- Fixed: [GZ] An item without use state won't be removed when being picked up.
	The call to GoAwayAndDie is missing.
- Fixed: [GZ]  A_GiveInventory sets the amount to give to a value passed to
	this function. This is ok for everything except Health items. They should
	give their original amount multiplied with the passed parameter.

April 3, 2006
- Fixed: Potential buffer overrun when launching timidity.

March 13, 2006
- Fixed: ActorFlagSetOrReset() wasn't receiving the + or - character from
	ParseActorProperties().
- Fixed: The decorate FindFlag() function returned flags from ActorFlags
	instead of the passed flags set.
- Fixed: The CHT_CHAINSAW, CHT_POWER, CHT_HEALTH, and CHT_RESSURECT needed
	NULL player->mo checks.
- Fixed: The "give all" command didn't give the backpack in Doom, and it
	must give the backpack before giving ammo.
- Fixed: P_SetPsprite() must not call the action function if the player is
	not attached to an actor. This can happen, for instance, if the level is
	destroyed while the player is holding a powered-up Phoenix Rod. As part
	of its EndPowerup() function, it sets the psprite to the regular version,
	but the player actor has already been destroyed.
- Fixed: FinishThingdef() needs to check for valid names, because weapons
	could have inherited valid pointers from their superclass.
- Fixed: fuglyname didn't work.
- Fixed: Redefining $ambient sounds leaked memory.
- Added Jim's crashcatcher.c fix for better shell support.
- VC7.1 seems to have no trouble distinguishing between passing a (const
	TypeInfo *) reference to operator<< and the generic, templated (object *)
	version, so a few places that can benefit from it now use it. I believe
	VC6 had problems with this, which is why I didn't do it all along. The
	function's implementation was also moved out of dobject.cpp and into
	farchive.cpp.
- Fixed: UnpackPixels() unpacked all chunks in a byte, which is wrong for the
	last byte in a row if the image width is not an even multiple of the number
	pixels per byte.
- Fixed: P_TranslateLineDef() should only clear monster activation for secret
	useable lines, not crossable lines.
- Fixed: Some leftover P_IsHostile() calls still needed to be rewritten.
- Fixed: AWeaponHolder::Serialize() wrote the class type in all circumstances.

March 12, 2006
- Fixed: A_SpawnItem() should use CopyFriendliness().
- Fixed: AExplosiveBarrel should have MF2_MCROSS set.
- Fixed: Passing 0 numrays to A_BFGSpray should default to 40.
- Fixed: New A_JumpIfCloser() function.
- Future-proofing: thingdef.cpp/FindState() allows the 2.1 names for
	SwitchingDecorations.
- Fixed: ASwitchingDecoration declared itself as deriving from AActor instead of
	ASwitchableDecoration.

March 9, 2006
- Fixed: AWeaponHolder::Serialize() did not call its supermethod.

March 1, 2006
- Rewrote MusicVolumes handling so it's a list and not an array.
- Removed I_SetMusicVolume(). It isn't used.
- Moved P_IsFriend(), P_IsHostile(), and P_GetSpecies() into AActor.

February 18, 2006
- Various fixes for compilation with GCC/Linux.
- Various fixes from Graf Zahl: Wrong blood color with P_BloodSplatter2() and
	P_RipperBlood(). Wrong MF3_BLOODLESSIMPACT check in PIT_CheckThing().
	P_BloodSplatter() used R_PointToAngle(). A_CPosRefire() did not check for
	hitting a friend. A_CentaurDefend() did not clear the reflective flag.
	DHUDMessage::ResetText() did not check for con_scaletext==2. Wrong Raven
	scroller speeds for COMPATF_RAVENSCROLL off. P_Init() should call
	P_InitKeyMessages(). Missing decorate decal code from decallib.cpp. New
	FFontChar1 code only made it into 2.1.0 and not 2.0.x. Missing copy
	constructor for FMusicVolume.
- Fixed: ACustomInventory::TryPickup() failed to call the superclass
	implementation of the function.
- Fixed: Friendly pain elementals killed by a player shot friendly lost souls
	that attacked the player. Now those lost souls aren't friendly.

February 6, 2006
- Fixed: Except for A_Explode512, all of Strife's A_Explode functions also call
	P_RecursiveSound.
- SpectralLightningSpot's RenderStyle is now STYLE_Translucent. It isn't really
	part of the lightning itself, so it should probably not be additive.
- Fixed: Macil2 and the Oracle are invulnerable to the first stage Sigil, and
	the first Macil should be completely unkillable.
- Fixed: The FlameThrowerParts' spawn state was unset, and it used a generic
	pickup message.
- Fixed: Strife step heights vary depending on the type of actor: If it bleeds
	it can go up 16 unit steps, if it's a missile it can go up 4 unit steps, and
	everything else can go up 24 unit steps. And everything can stand over a 32
	unit dropoff. MaxStepHeight and MaxDropOffHeight are now actor properties.
- Fixed: Strife floating monsters are not blocked by monster blocking lines, so
	they all need to have MF3_NOBLOCKMONST set.
- Fixed: APowerCoupling::Die() should destroy the unbroken coupling.
- Fixed: AActor::TakeSpecialDamage() should allow damage if the actor has
	no death state at all. (Taken from GZDoom)
- Fixed: Killing something that drops an alarm with the second-stage mauler
	would not show the alarm text if it was directly hit by the main torpedo.
	Added a third argument to P_SpawnSubMissile() that indicates what the
	new missile's "target" should be, so if the missile dies right away, it
	has the correct target information.
- Fixed: Added Graf Zahl's fix for manually closing animated doors with
	something inside them.
- Fixed: The A key should be bound to +jump by default in Strife.
- Fixed: F_BunnyScroll() should fill the widescreen border with black, not
	the FinaleFlat.
- Fixed: Strife linetype 52 can be used to advance to the next map by setting
	its tag to 0. It should also be flagged repeatable.
- Fixed: A_Look2() is supposed to randomly choose self->SpawnState + 3 if
	MF4_STANDSTILL is unset, not + 4.
- A_AcolyteDie() now resets the acolyte's RenderStyle to turn off any shadow
	effects they may have.

January 24, 2006 -- First changes of 2006! 1.5 months later! :(
- Added a new level.maptime variable that keeps track of the time you've been
	on a single level and is unaffected by hubs.
- Fixed: ASoulsphere::Use() could reduce your health.
- Fixed: cht_Suicide() did not clear the MF2_INVULNERABLE flag.
- Increased the sidedef limit to 2^32-1.
- Fixed: Stacked sectors inside a skybox would be drawn from the player's
	origin instead of the skybox's origin, which would easily lead to infinite
	recursion because the engine would try to render the skybox again instead
	of the other side of the stack. In order to avoid any other infinite
	recursion problems, the maximum number of skybox visplanes per scene has now
	been capped at 100.
- Changed the inventory flag IF_CHEATNOTWEAPON to the weapon flag
	WIF_CHEATNOTWEAPON.

December 11, 2005
- Started integrating changes from 96x into 2.0.99.

December 10, 2005
- Fixed: GetFinaleText() did not null-terminate the string it retrieved.
- Fixed: When changing levels, sky1pos and sky2pos were not reset to 0.
- Removed the check for 26,26 at offset 33 in SPC files because somebody found
	a file that had them as 0,0 instead, and some players played it fine.
- Fixed: Before resorting to "Person", the dialogue code should use the actor's
	tag name as a default name.
- Increased the Entity's alpha value to 50% to make it more visible.
- Fixed: F_StartSlideshow() needs to reset any blending.
- When a Macil speech ends, the level's original music is now restored.
- Fixed: The music for Strife's slideshows is D_DARK and not D_SLIDE. Go figure.

December 4, 2005
- Removed the ancient and unused Fixed(Mul|Div)_(ASM|C) functions.
- Discovered the GCC outputs nice code for MulScale and friends, so I removed
	the assembly for those routines in gccinlines.h. Alas, the same cannot be said
	of DivScale's variants.
- Removed the assembly code for BigShort and BigLong and replaced it with
	compiler intrinsics provided by VC++.

December 1, 2005
- Backported miscellaneous sc_man.cpp fixes from 2.1.0.
- Fixed: P_BobWeapon() checked flags instead of WeaponFlags for WIF_DONTBOB.
- R_ProjectSprite() now checks for NULL things passed to it.
- Fixed: The game crashed if a slope thing of type 9500 or 9501 was placed
	directly on its target line. Now you get a warning in the console instead.
- Returned Berserk's behavior to giving you 100 health instead of 100% health.
- Changed: When no screenshot_dir is specified, the game now tries to save
	screenshots to the program directory instead of the current directory. If
	you really want screenshots to be saved to the current directory, you can
	do so by setting screenshot_dir to "."
- Fixed: StringFormat::VWorker cleared the zero flag for numbers. (I know I
	tested this, so I'm not sure when it went wrong.)
- Fixed: The game did not check if actors had pain states before putting them
	in their pain states.
- Fixed: The shazam cheat could not deactivate the Tome of Power, nor did it
	display any text informing you of its action.
- Added additional decals from Graf Zahl's DECALDEF.
- Updated the obituaries in english-us.txt for Heretic to reflect the published
	names of various Heretic monsters.
- Fixed: There is no reason why the Heretic and Hexen status bars should clamp
	the displayed health to a maximum of 100.
- Fixed: P_PlayerInSpecialSector() duplicated the damage done by
	P_PlayerOnSpecialFlat().
- Fixed: The actor serializer was off by one when checking the number of
	conversation nodes in a script.
- Fixed: In Strife dialogues, yes texts are printed even when it jumps
	immediately to another dialogue node. I think this is bad design, and the
	yes text should be part of the normal dialogue, but the person in the
	east room of MAP27 abuses this, so I need to support it too. This also means
	the notify text is no longer hidden when the menu is up. (Maybe they
	mistakenly made it jump, and you were really supposed to try talking to him
	again when he tells you the master doesn't like visitors.)
- Fixed: Anybody in Strife who does not have their name provided in their
	dialogue script should use the default name "Person".
- Fixed: P_RecursiveSound() did not consider closed split doors as closed.
- Fixed: MummyFX1 and Whirlwind should have the MF2_SEEKERMISSILE flag set.
- Fixed: A_VileChase() did not clear the MF3_CRASHED flag.
- Fixed: P_SpawnPlayer() should always attach the StatusBar if the
	consoleplayer is spawning.
- Fixed: HateTarget did not take damage due to its lack of a death state.
- Fixed: CheckInventory(), TakeInventory(), and GiveInventory need NULL type
	checks.
- Fixed: SC_GetString() did not understand escaped quote characters in strings.
- Fixed: There were synchronization issues while drawing the console. Calls to
	DrawTexture() can trigger input events to be processed, which can cause the
	contents of the console to change WHILE THE CONSOLE IS BEING DRAWN. So now
	any changes that would alter the contents of the console text buffer are
	deferred until after the buffer is drawn, and a copy of the command line is
	drawn instead of the real command line.

November 22, 2005
- Fixed: Dssswtchx and dspistol are obviously wrong choices for Strife menu
	sounds. I don't think it uses anything for those sounds, but I picked analogs
	for them anyway.
- Fixed: Merchants ignored attacks from "silent" weapons.
- Fixed: Strife humans did not play their "yeargh!" sound for their zap deaths.
- Added a new Travelled() method for inventory items. This is called each time
	an item travels to a new map and gives it a chance to perform any needed
	reinitialization. Specficially, PowerTargeter needs it to set the player's
	psprites again.
- Fixed: Dropping coins should do so in increments of 50 if you have enough, not
	increments of 1.
- Added IF_UNDROPPABLE to HealthTraining and GunTraining. Because HealthTraining
	also gives GunTraining when picked up, you could cheat by dropping the
	HealthTraining item and picking it up to get as many GunTraining upgrades as
	you wanted. GunTraining doesn't really need to be undroppable; the flag is just
	there for it for the sake of symmetry.
- Fixed: It looks like just about everything in Strife should have MF2_FLOORCLIP
	set. Strife probably applied floorclip to everything without MF_NOGRAVITY set.
- Fixed: The perfectly vertical missile movement fix was backwards with regards
	to damage values.
- Fixed: AddCommandString() scanned past terminating '\0's in unclosed
	strings while searching for semicolons that break commands. Thus, if the
	previous command added had a semicolon in just the right place, it could
	try to add it again.
- Fixed: The fly cheat did not check to make sure you had a body.

November 18, 2005
- Fixed: You could create a chain reaction where merchants would continually
	enter their pain state because there was a delay between the time when they
	alerted and the time they alerted others.
- Fixed: If the Inquisitor died while flying, it would continue to play the
	flying sound.
- Fixed: The LEGO cheat didn't check if the Sigil was successfully added and
	would set the player to the NULL weapon if it wasn't (which happens with
	the shareware).
- Fixed: Macil was alerted by water splashing.
- Reworded some of the compatibility options menu items so they fit on
	the screen when playing Strife.
- Fixed: The Oracle's Death checked the wrong quest item to determine if
	you had already killed Macil.

November 17, 2005
- Fixed: Various Strife actors had MF_COUNTKILL that didn't need it:
	Beggar, KneelingGuy, Macil1, RatBuddy, and AcolyteToBe.
- Fixed: PowerMask and PowerShadow both need the IF_HUBPOWER flag.
- Fixed: The Strife quest log should be initialized with the text "Find
	help".

November 14, 2005
- Fixed: ClientObituary() crashed if the killing player didn't have a
	weapon.
- Fixed: The Touch functions assumed the toucher was a valid player and
	crashed if it wasn't.
- Fixed: APlayerPawn::Die() assumed the actor was always associated with
	a player and crashed if it wasn't and you had weapon dropping turned on.
- Fixed: There were two pfile variables defined in R_InitTextures().

November 13, 2005
- Fixed: The user-configurable BOOM startup strings were always printed,
	even if they were empty.

November 8, 2005
- Fixed: APowerStrength::GetBlend()'s equation did not match Doom's.
- Fixed: If you have weapon sprites in a wad and try to use a frame from
	that sprite that does not exist, the game accesses might crash. Fixing
	this involves two things: Make the range checks in R_DrawPSprite()
	unconditional, so they exist in both debug and release builds. Also add
	a check for the Null texture to catch "holes" in the available frames.
- Fixed: Setmodeneeded is always true before starting a game, because it
	only gets cleared when the StatusBar is around. The most obvious
	manifestation of this problem is that you cannot move left and right
	in the video modes menu before starting a game.
- Fixed: The "give all" cheat did not give a backpack, and the non-console
	equivalents always gave you a backpack, even if you weren't playing Doom.
- Fixed: The "give armor" cheat gave you armor with a SavePercent of .5 in
	Heretic. This would be correct for the others games, but not for Heretic,
	where .5 is what the lesser armor provides.

November 7, 2005
- New: Games saved for different PWADs but the same IWAD now show up in
	orange on the save/load menu.
- Fixed: R_RenderViewToCanvas() did nothing if viewactive was false. Thus,
	savegame screenshots would be garbage if you saved while looking at the
	automap.
- To avoid potential conflicts with the Windows headers, the LONG and SHORT
	routines were renamed to LittleLong and LittleShort. BELONG and BESHORT
	were also renamed to BigLong and BigShort to match.
- Fixed: S_ChangeMusic() had a cast from 'const char *' to 'char *' that was
	missed by VC++ 7.1 and GCC, but not the latest VC++ 2005 beta.
- Fixed: Although bit 27 of the actor's flag is now used for something
	different than in Doom, it's okay to specify it by number in a Dehacked
	patch, because it's used to set the color translation. When the translation
	is set, it will be 0'ed then.
- Fixed: FActorInfo::ApplyDefaults() should initialize datastr to NULL.
- Fixed: TArray::Delete's parameter should be unsigned.
- Fixed: The fix for rotating polyobjects broke polyobject doors.
- Fixed: Using the IDBEHOLDS cheat did not give you full health.
- Backported the fix for scrolling Heretic/Hexen/Strife specials from 2.1.0.
- Increased KneelingGuy's height to 17 so that you cannot step on top of the
	projector without jumping.
- Added a confirmation screen for the menu choices that reset your options.
- Added a new automap menu underneath the display options menu. Moved all the
	automap options into it and added a few new ones.

November 2, 2005
- Fixed: WIF_NOAUTOFIRE did not actually do anything.
- Added zloba's save/load console commands.
- Adjusted Static_Init:Init_Color so that you don't have to specify both
	fog and color with it.
- Fixed: A_GenWizard() and A_SpawnBishop() did not decrement total_monsters if
	the monster spawned inside something and needed to be destroyed.
- Fixed: Hexen monsters also move faster in nightmare mode.
- Added a map color customization menu.
- Renamed the "Standard map colors" option to "Use traditional Doom map colors".
- Fixed: Switching the MIDI device after a one-shot song had finished would
	try to restart the song.
- Removed the BufferReturnEvent from music_midi_stream.cpp, since it was
	unused.

October 26, 2005
- Merged in Chris's Linux patch.
- Fixed: Redefining a decal that had already been assigned to an actor would
	not update the actor's reference to the decal.
- Fixed: CheckForPushSpecial() could pass a NULL actor to P_ActivateLine() if
	a missile did not have an "owner."
- Fixed: snd_reset assumed GSnd was valid, but it wouldn't be if you passed
	-nosound on the command line.
- Fixed: When a doll-spawned minotaur in Hexen died, it checked to see if any
	other minotaur were still up for that player. It assumed there were no free-
	standing minotaurs and crashed if there were.

October 24, 2005
- Added armor->BecomeItem() calls to ABasicArmorPickup::Use() and
	ABasicArmorBonus::Use(). AActor::AddInventory() no longer calls BecomeItem()
	itself.

October 22, 2005
- Fixed: FloorAndCeiling_LowerRaise would move one or the other but not both.
- Fixed: PIT_RadiusAttack() calculated negative distances for things exploding
	directly above other things.
- Fixed: Ripper missiles ignored MF3_BLOODLESSIMPACT and always sprayed blood
	onto the walls.
- Fixed: Firing a missile into a wall while standing right next to the wall
	would not cause any specials to activate on that wall.

October 18, 2005
- Changed: DThinker::DestroyThinkersInList() performed a pointer cleanup after
	destroying each and every thinker. The better thing to do is clean up in the
	functions that call it: DestroyAllThinkers() and DestroyMostThinkers().

October 17, 2005
- Fixed: BloodySkull and IceChunkHead are supposed to subclass PlayerChunk, not
	PlayerPawn.
- Fixed: Behaviors for Generic_Floor change types 2 and 3 were swapped.
- Fixed: Non-320x200 INTERPICs once again display properly.
- Changed drawing operations in F_BunnyScroller() so that non-320x200 background
	images should work.
- Fixed: The m_Dist member of DPolyAction was declared signed when it should have
	been unsigned.
- Fixed: SetScriptState() in p_acs.cpp did not check to make sure the ACS thinker
	actually existed.
- Fixed: Crashing when travelling between maps in a hub. For some reason the list
	of pointers for AActor used 12-byte-wide pointers-to-members. Every other class
	(including those that derive from AActor) use 4-byte-wide values. This left
	DObject::PointerSubstitution() and DObject::DestroyScan() able to identify only
	the first pointer declared in AActor. Rather than try to figure out why
	pointers-to-members of AActor are weird, I decided to revert to my original
	implementation: An array of offsets into the class. GCC complained about this,
	which is why I switched to a pointers-to-members implementation. But I found a
	way to make GCC compile it without warning, so yay!

	And since I was working with this code anyway, I decided to make a change that-
	is hopefully a speed optimization. Rather than walking up the chain of TypeInfos
	every time an object's pointers need to be checked, I now do this once and build
	an array of every pointer in a class instance (as opposed to just those pointers
	defined for that class and not any of its superclasses). This should mean fewer
	scattered memory accesses and hence, better cache utilization.

	(Question: Why did this problem show up in 2.0.97 and not 2.0.96? The only
	relevant change to the code was a macro to make the array const for VC++ but not
	for GCC, because some GCC optimizations tried to write to it at runtime despite
	its constness.)

September 26, 2005
- Released this old code as 2.0.97.
- Backported the text-based LANGUAGE and IMF code from 2.1.0.
- Updated to zlib 1.2.3.

February 21, 2005
- Provided alternate versions of the TArray-related friend template functions for
	the string and name classes. I have no idea which compiler is right, but VC++ is
	certainly nicer about it.

February 19, 2005
- Fixed: In C mode, SC_GetString() would not consider '-' to be a token.
- Added a global name table.

February 18, 2005
- Added lots of explicit casts and changed some types to turn off 64-bit compatibility
	warnings.
- Added a string class I've been playing with for a while now and made some
	adjustments to TArray so that it can work with non-basic types.

February 11, 2005
- Removed the MOD_FIRE hack in PIT_RadiusAttack and replaced it with a new thrustless
	flag to P_RadiusAttack.
- Removed the multiplayer check from AInventory::ShouldRespawn(). Now the dmflag is
	always respected, even without alwaysapplydmflags.
- Added a check for a NULL StatusBar to PlayerIsGone() in d_net.cpp.
- Fixed: ADehackedPickup::TryPickup() set the MF_DROPPED flag. This flag is now set
	by default, so it should clear it instead. This kept hacked weapons from staying
	and respawning, because the RealPickup it tests against was always flagged as
	dropped.
- Fixed: The MagePlayer used A_Scream instead of A_PlayerScream when he died.
- Fixed: The Heresiarch spawned new balls above its head after it killed its target
	and re-entered its SpawnState.
- Fixed: Using chasecam while spying on another player would not show that player.
- Rewrote the spy code to not need displayplayer.
- Switched to the combination of DirectDrawCreate/QueryInterface to obtain an
	IDirectDraw2 interface. That should be slightly more compatible, since
	DirectDrawCreate can create an IDirectDraw interface even if it isn't properly
	registered.

February 10, 2005
- Fixed: The screen fading ACS commands did not work when viewing through a camera
	because DBaseStatusBar::BlendView() did not think there was a player to get those
	values from. Now, the blend comes from either the player viewing from or the
	console player if the current view is not from a player.
- Fixed: Returning to a previously visited level in a hub with fewer players than you
	had when you left the level would result in "zombie" bodies from the former players.
	The fix is in G_UnSnapshotLevel(): After restoring the level, any actors that point
	to a player who is no longer in the game are destroyed.
- Fixed: P_ExplodeMissile() should zero the projectile's speed before putting it into
	its DeathState, not after. Strife's flamethrower needs it like this, and I'm not
	sure when or why it was moved to happen after the state change.
- Fixed: R_DrawSkyBoxes() needs to save and restore viewx and viewy as well as viewz
	for drawing masked items.
- Fixed: P_MorphPlayer() did not properly transfer ownership of inventory items, so
	when it destroyed the player's armor, it also unlinked anything after the armor in
	the player's inventory.
- Fixed: The Hexen players should call A_FireScream() on the first frame of their
	fire death, not the first shared frame of their fire death.
- Attached obituaries to the projectiles used by Doom's projectile weapons, so they
	can have obituaries again. This is just something I put off finishing when I changed
	from a means-of-death system to a damage type system.
- Fixed: Pain Elementals did not transfer their friendly flag to the Lost Souls
	they spawn. And since I've got the same code doing this sort of thing in several
	places, I replaced them all with a call to the new method AActor::CopyFriendliness.
- Fixed: Bots are idiots after co-op level changes because the CajunMaster forgets
	about them and so doesn't tell them to do anything different from what they were
	when the level change happened.
- Fixed: G_FinishTravel() needs to retrieve the next player before changing the
	current one's statnum.
- Made some fixes to SDLVideo's Lock() and and Update() synchronization.
- Fixed: DSimpleCanvas::Lock() and ::Unlock() did not properly use the lock count.
- Fixed: In Strife, the fastCrushAndRaise ceilings (line types 6 and 77) are twice
	as fast as their Doom counterparts.
- Fixed: Strife auto-uses the best ammo first, not the worst. I got confused because
	in Strife ARM1 is the best armor, but in Doom it's ARM2 that is best.
- Fixed: Strife does not double ammo at its highest skill level.
- New: Using Degnin Ore will drop it, similar to the Teleporter Beacon.
- Fixed: In nightmare skill, every actor is spawned with a reactiontime of 0. This
	make's Strife's HE Grenades explode immediately, because they use their reactiontime
	as a countdown timer. The solution: Only set the reactiontime to 0 for monsters.
	(Strife may not do this at all. I'm not sure.)

February 9, 2005
- New feature: Missiles with negative damage now give you health.
- Changed P_GiveBody so that it works with any actor, not just players.
- Fixed: Picking up a BasicArmorPickup without any existing BasicArmor gave you
	a new BasicArmor without calling BecomeItem to unlink it from the world. Since
	there are probably other areas where this happens, and it's kind of easy to forget
- Added a division-by-0 check to the very end of P_HitSlideLine for the very rare
	cases when inter3 ends up being 0.
- Clamped the upmove speed in P_PlayerThink() to avoid super fast speeds from
	joystick users.
- Fixed: A_SorcererRaise() did not transfer friendliness info to the new D'Sparil.
- Added: Trying to use actors that have the UsePuzzleItem special now works just
	like trying to use a wall with the same special: You use the item if you have it,
	and you say "hmm" if you don't.
- Fixed: APuzzleItem::Use() should not remove the item from the inventory but let
	the caller do it instead.
- Fixed: P_TranslateLineDef() should clear the ML_MONSTERSCANACTIVATE flag on lines
	with ML_SECRET set. Otherwise, monsters can open otherwise secret doors in Doom
	format maps.
- Renamed the Porkalator's missile sprite from EGGM to PRKM, so it doesn't have the
	same name as the Morph Ovum's missile.
- Fixed: The warp cheat was always applied to the local player and not the player who
	used it.
- TypeInfo::CreateDerivedClass() now initializes OwnedStates and NumOwnedStates for
	actors.
- Fixed: PrepWall and PrepLWall clamped the final texture column so that it was not
	visible unless it was fully visible.
- Fixed writing of RDosPlay raw songs. It was a very very very stupid mistake: I had
	the order of the register and data bytes reversed. Now it works fine, and since it
	took me a while to figure out the problem, ZDoom can now play raw OPL songs.

February 7, 2005
- Added the writeopl command to write a song in RDosPlay raw OPL format. Its usage is:
		writeopl [songname] <filename>
	If the currently playing song is a MUS song being played through the OPL emulation,
	then you just need to specify the filename. Otherwise, you need to provide the
	songname (such as D_E1M1) as well. Unfortunately, the result is unplayable with
	AdPlug, so I must be doing something wrong.

February 4, 2005
- Merged in Graf Zahl's Caverns of Darkness patch.
- Fixed: Using the screenshot command to specify a filename without any extension
	automatically adds the extension.

February 3, 2005
- Played around with polymost some more. The good: Wall projection is now totally
	independant of the non-polymost code, so walls don't get clipped to what would have
	been the screen boundaries without true look up/down. With the filled polygon mode,
	it looks awesome. The bad: I'm getting precision problems when clipping the left
	side of walls to SCISDIST. This problem is not present when clipping the right side,
	and it's not present in jfDuke, so what am I doing wrong? Setting SCISDIST to a large
	value like 128 makes the problem disappear, but that's much too large. Someday, when
	it can handle doing a second pass to draw behind you, SCISDIST needs to be as small as
	possible to avoid a visible gap between the front and back views.

February 2, 2005
- Added a damagetype parameter to AActor::TakeSpecialDamage(). The default implementation
	of this function now uses it to reject damage if the actor doesn't have a matching
	death state. (Meaning, you can leave an actor without a normal death state, and it will
	only take damage from special attacks.) Since this negates the need for A_TreeDeath,
	that function is gone.
- Fixed: The adjustment for negative y-offset, non-power-of-2-height textures is
	now only done for textures aligned at the top and not the bottom.
- Fixed: APowerFlight::DrawPowerup() did not check if SPFLY0 actually existed before
	using it.
- Fixed: P_SpeekerMissile() did not check for zero-speed actors, so you could get a
	division by zero error if it needed to move vertically.

January 30, 2005
- Threw together a quicx mock-up of a polymost-based renderer. It is essentially
	just the standard software renderer with some parts commented out and the clipping
	done with polymost instead of a few one-dimensional arrays. The display itself is
	just the standard view with the polymost view overlayed in wireframe.

January 29, 2005
- Fixed: BOOM-style carrying floors that use speeds values less than STOPSPEED
	no longer change the actor's momx and momy but are passed as extra parameters
	to P_XYMovement(). Faster speeds still change momx and momy, so conveyor belts
	can fling objects off of them.
- Fixed: Items in inventory would "scroll" on scrolling floors.
- Fixed: Every place that copies the friendly flag from one actor to another also
	needs to copy the FriendPlayer.
- Fixed: In A_Chase(), a friend's selection of target based on who last hurt the
	player did not take into consideration that a friend may have accidentally hurt
	the player.
- Fixed: P_NightmareRespawn() did not copy a monster's custom translation to
	its new body.
- Fixed: FMODStreamCapsule::Play() did not record the channel the stream was
	playing on, so you could not change its volume during playback.
- Added the sucktime mapinfo option. This is the time, in hours, that the
	player must play before the intermission tells them their time sucks. If this
	is 0, then they cannot suck. If they do suck, their time is still shown
	(unlike Doom) in the normal spot, with the suck above it. I had to shift the
	positions of the time displays in the Doom intermission a little so that there
	was room for the hour field. This is also retrievable with the GetLevelInfo()
	command by passing LEVELINFO_SUCK_TIME.
- Fixed: Using the suicide cheat on the "end of game hell hack" on E1M8 would
	infinitely loop because that sector type actually prevents you from dying,
	but the cheat code was waiting for you to die.

January 27, 2005
- Added mouse handling to the testpolymost screen so that I can actually drive
	it. That let me find a few more bugs in my port of the code that needed to be
	fixed.

January 26, 2005
- Changed the Puffy actor (used by Heretic's weredragon/beast's fireball trail)
	to do 0 damage. Similarly, A_LastZap() now sets the projectile it spawns to
	do 0 damage so it can be once again like Hexen.
- Fixed: Picking up an ammo item for the first time with more than the max
	amount for that ammo type would let you get more than the max.
- Fixed: Specifying a defaultmap in MAPINFO disabled lax monster activation
	checking instead of deducing it from the game's Hexen/not-Hexen status.
- Fixed: Mirrors were accumulated to the WallMirrors list while viewing the
	automap, so after you turned the map off, a few thousand mirrors could be
	processed, resulting in a noticable delay before the view became visible.
- Added support for using the Teleport_NewMap class of specials with title maps
	so that you can use more than one map as a title map. Using the gametype()
	ACS function will return GAME_TITLE_MAP if the map is being used for a title
	display instead of regular play.
- Added a fourth parameter to ThrustThing to accept a TID of something to
	thrust.
- Fixed: Deactivating an actor mover without activating it first reset its
	target's flags to 0.
- Fixed: Picking up two or more berserk packs only gave the red tinting for
	the first one.
- Fixed: Monsters following a path entered their see state whenever they
	reached a patrol point. I don't know what I was thinking when I did that.
- Fixed: Since pre-2.0.90 demos no longer play back, they should be rejected
	without even trying to play them. Similarly, new demos need to be
	recorded indicating they won't play back with earlier game versions.
	Unfortunately, I didn't bump the demo version between 2.0.63a and 2.0.90, so
	anything pre-2.0.97 won't play with 2.0.97, even though there's probably
	no changes that would cause desynching between 96 and 97. Oh well.
- Fixed DBaseStatusBar::DrBNumber(Outer) to work when some of the big number
	graphics are missing.

January 15, 2005
- Fixed: ACS cos and sin were using signed shifts when calculating the fineangle.

January 13, 2005
- Fixed: Instead of assigning the empty sound a basepriority of -1000,
	S_StartSound() should not even attempt to play it.
- Fixed: FCanvasTextureInfo::Add() did not change the FOV when reassigning an
	existing camera->texture mapping.
- Fixed: SetCameraToTexture did not check if the texture name actually existed as
	a texture. It just assumed it did.

January 10, 2005
- Fixed: P_MorphPlayer() needs to set the player's momx and momy to 0, because
	morphing doesn't maintain the player's momentum.
- Fixed: The Cyberdemon, SpiderMastermind, AlienSpectre*, Crusader, and
	Programmer need MF3_DONTMORPH set. Otherwise, morphing them and killing them
	before they unmorph will skip any of their special death actions. Technically,
	the Inquisitor doesn't need it set, but he's a boss monster, so it seems best
	if he can't be morphed. (For that matter, should any of the mechanical monsters
	in Strife be morphable, since they're not organic?)
- Redid: Invnext and invprev wrap around the inventory list.
- Unmorphing a player now removes the weapon(s) they received in their morphed
	form.
- Redid the dehsupp fix from March 22, 2002.

January 8, 2005
- Fixed: Dead players could still be morphed, at least with the morphme cheat.
	I'm not sure if morph projectiles did it or not, but now they definitely don't.
- Added a call to SN_StopAllSequences() inside S_StopAllChannels(). This
	prevents moving sector sounds from playing during the finale (and any other
	time when sound effects were supposed to have been stopped).
- Fixed: R_DetailDouble() must not do anything when viewactive is false.

January 7, 2005
- Ported the polymost visualization code from Ken's prototype so that I can
	verify the correctness of my C++ port. Which was not quite correct. :-(

January 5, 2005
- Fixed: R_SetupBuffer() calculated ylookup for the height of the screen, and
	not the height of the render target. This meant using camera textures taller
	than the screen would probably crash. But wait! There's more! new_visplane
	must also allocate top and bottom arrays wide enough for any view, not just
	the screen. So I decided to just make it allocate enough for MAXWIDTH.
- Removed some possible unused variable warnings spewed by GCC.
- Fixed: The parser for DEM_SUMMON(FRIEND) tested if type was NULL when it
	should have tested typeinfo instead.
- Changed the actor defaults for GCC to use a function to initialize the
	default actors instead of an initializer list. With newer GCC versions, I
	can no longer count on variables being emitted in the same order they are
	defined, so using an initializer list is impossible. This looks like it adds
	~300k to the executable, which I suppose isn't too bad.

January 4, 2005
- Changed the object pointer offset lists to not be const when compiling with
	GCC. Some versions and options cause GCC to try to initialize them at
	run-time, even though they are read-only and therefor protected from
	writing.
- Added Makefiles for building with MinGW. Since Chris did the hard part by
	posting a Makefile for the main exe on the forum, I only needed to make
	Makefiles for the auxilliary projects. And then I spent some time porting
	ccdv to Win32, so the make output will look pretty.

January 3, 2005
- Fixed: The self-modifying code in tmap3.nas was still in the .data section
	instead of .rtext, so it couldn't be used with data-execution prevention
	enabled.

January 1, 2005
- Fixed: ParseDecorate() needlessly allocated new TypeInfo objects.
- Fixed: The status bar constructor did not initialize CPlayer. Thus, when
	the Doom status bar's AttachToPlayer method was called it would not do
	the proper face initialization if the status bar was freed and then
	reallocated in the exact same spot. This bug didn't show up in the debug
	build, because the debug CRT automatically fills newly freed and allocated
	memory.
- Fixed: P_SpawnMapThing() does not need a special check for the Lost Soul.

December 24, 2004
- New: Instead of using a static image as a title, you can now use a map.
	Just create it as normal, being sure to do something interesting with
	scripting, and rename it TITLEMAP. It will load just like a normal map,
	but it will behave like a title picture.
- Fixed: The intermission did not compensate for non-4:3 aspect ratios.
- Fixed status bar border for widescreen ratios other than 16:9.
- Corrected clean scaling calculations for widescreens.
- Changed: Giving a BasicArmorBonus now also multiplies the original amount
	by the specified amount instead of just using the specified amount.
- Fixed: When P_SpawnPlayer() transfers a voodoo doll's inventory to the new
	player, it also needs to transfer the InventoryID property so that items
	picked up later won't receive the same ID as an item they already have.
- Fixed: ArtiPoisonBag::BeginPlay() did not call the superclass's version of
	the function.
- Changed A_FireScreamReplace to A_FireScream. Now it plays the sound itself.
	On a related note, moved A_ClericBurnScream to the start of the ClericBoss's
	flaming death and changed the old instance back to A_Scream.
- Fixed: Forgot to delete some old code in AActor::Tick().
- Fixed: The second sidedef-only constructor for DScroller did not set up an
	interpolation.
- Fixed: R_DrawSkyBoxes() initialized the clipping drawseg's siz values to
	1<<31, which is actually INT_MIN, not INT_MAX!
- Fixed: Some properties were not properly transferred when unmorphing an
	actor.
- Fixed: You got HOM around the status bar in widescreen mode if you didn't
	scale the status bar.
- Fixed: You could use the down arrow key to select blank entries on the last
	line in the video mode menu if that line was not full.
- Fixed: The backpack handled pickups for everything after you got one.

December 23, 2004
- Made the bottom of the viewborder visible when the status bar doesn't cover
	the full width of the screen and no border would normally be visible.
- Added SetAmmoCapacity (str typename, int maxamount) and
	GetAmmoCapacity (str typename) ACS commands. Also added the ACS log command.
	It is exactly like printbold, except it prints directly to the console instead
	of the middle of the screen. BTW, ACS has static local variables ala C now.
	They are exactly the same as map variables, except they can only be used in
	the script or function that defines them.
- Fixed some fullscreen pages to work properly with non-4:3 aspect displays.
- Fixed DCanvas::DrawTexture() so that all virtual sizes (not just 320x200wide)
	work with non-4:3 aspect screens. (So long as the virtual size is 4:3.)

December 22, 2004
- Fixed: The backpack was not added to the player's inventory, although there
	was code present to handle removing it from the inventory.
- Loading a BEHAVIOR without any scripts but with other content crashed.
- More revelations with the sprite splitting experiment: Drawsegs are not
	always created when you might think they are. Probably the biggest problem
	is when you look at a line straight-on, so you see the sectors on each side
	of it but not the line itself. I conceded defeat and stuck an #if 0 around
	the related code. If I or someone else want to revisit it later, it's still
	there but inactive. I don't think it's worth the effort to make it work
	properly. A z-buffer would be much easier, more reliable, and possibly even
	quicker when there are a lot of two-sided lines in view. So the solution
	seems obvious: Use hardware acceleration and let it worry about sprite
	clipping. Or stick with the way things are and ignore it. :-) (Community
	Chest 2, MAP15, building number 4 makes a great test-case for this, BTW.)

December 21, 2004
- Messed around with splitting sprites along drawsegs some more. This is far
	from being as straight forward as I had thought. One unexpected problem I
	realized: Most (if not all) of the sprites that stand on the ground are
	actually sunk into the ground, but splitting sprites is not a win unless you
	clip them to the floor and ceiling. So I tried bumping the sprites up so that
	they are aligned with the bottoms of their actor so I could clip them to the
	floor. Now it looks much better. When it works. Unfortunately, there are
	lots of cases that still don't work properly.

December 20, 2004
- Added some code to split sprites along drawsegs.
- Changed the sprite-in-front of drawseg calculations. Now it compares inverse
	Z values in screen space.
- Fixed: The MinotaurFriend targetted friendlies other than itself.
- Fixed: An actor's floorpic was not serialized by name.
- Fixed: Each piece of Hexen armor only gave you one AC.
- Fixed: Morphing a monster didn't copy the original monster's friendliness and
	TID hating to the morphed version.

December 18, 2004
- Fixed: Slideshows in Strife are supposed to change the music to D_SLIDE.
- Fixed: Merchants played their greeting animation in place of their "yes"
	animation. (Or rather, the greeting was played immediately after starting the
	"yes" one, so you only saw the greeting.)
- Fixed: The Strife health bar texture assumed that the vial level would always
	be non-negative. It can go negative if the player dies then cheats to give
	themself health, but not enough for their real health to go positive.
- Fixed: Creating a fade-in-out hudmessage with a fadetime of 0 crashed, because
	it assumed the fade-in time would always be positive.
- Fixed: Instead of calling G_StartTravel(), idclev should set the player's
	health to 0, so the player will do a complete spawn on the new level.
- Fixed: DrBNumberOuter(Font) and DrINumberOuter drew the shadow from one digit
	on top of the next digit.
- Fixed: The Doom HUD drew the selected inventory item on top of the secondary
	ammo if both were present.
- Moved the DrawPowerups() call out of DBaseStatusBar::Draw() and into
	DrawTopStuff(), so the Doom HUD key display won't cover them up
- Fixed: If you started flying and then pressed the land key, you wouldn't be
	able to fly again until the Wings of Wrath wore off. This was done by changing
	several checks for a player with MF2_FLY into checks for a player with
	MF_NOGRAVITY. MF2_FLY just indicates that the player is using the Wings;
	for the player to fly, MF_NOGRAVITY must also be set. If MF_NOGRAVITY is not
	set, but MF2_FLY is, then the pressing +moveup/down reactivates fly mode.
- Changed the receipt of BasicArmorPickup so that the SaveAmount is multiplied
	by the given amount (via the give cheat or ACS giveinventory) in order to make
	it compatible again with earlier versions of ZDoom.
- Fixed: Picking up an armor bonus after using up your armor left you with
	useless armor until you picked up a full-fledged armor item.
- Fixed: Even though voodoo dolls couldn't pick up items, they could still touch
	them without pretending to be a real player and mess things up in the player's
	inventory.
- Fixed: Strife's alien spectres did not execute specials attached to them upon
	death, because they have MF_SPECIAL set.
- Changed the inventory left/light gems (that indicate if you have more items in
	that direction) to blink with gametic instead of level.time, so now they can
	blink while the game is paused.
- Fixed: You could use items while the game was paused.
- I just noticed the fighter's fist doesn't meet the edge of the screen when you
	swing it. What's a good, clean way to handle this situation?
- Brought over the startup log viewer I had added for my Duke port. Unlike my
	Duke port, however, this window is normally hidden and only shows itself when
	a fatal error occurs. Now if something goes wrong during the startup
	sequence, you can review the console log to try and figure out why. I tried
	making it show up at startup as a sort of revival of the way the startup
	process worked once upon a time in DOS land, but too much of the code now
	requires the video to be one of the first things initialized and it just isn't
	practical to rearrange things to make it init later.

December 16, 2004
- New: ZDoom.wad is now managed along with the source code.

December 15, 2004
- Added support for letterboxing, so people without widescreen displays can still
	use widescreen modes without running in a window. Note that if the video card
	enumerates any widescreen displays, then the game will assume they are displayed
	as widescreen, even if they really aren't. Letterbox modes are automatically
	generated from the existing 4:3 modes, but if an existing resolution already has
	the same size, then that resolution won't be available in letterbox form. The
	video modes menu displays LB next to any modes that are letterboxed, so you can
	tell them apart without trying each one.
- Corrected widescreen displays for non-90 degree FOVs.

December 14, 2004
- Added support for 16:10 and (if vid_tft is true) 5:4 displays. Also rearranged
	the video modes menu, removing the depth choice and replacing it with an aspect
	ratio choice.

December 13, 2004
- Rewrote the interpolators to use a hash table instead of a linear array, for
	improved insertion and deletion performance.
- Added interpolation for scrolling floors, ceilings, and walls. Floors especially
	need it, because the lack of interpolation really sticks out when you're being
	carried along by a floor that only moves at 35 FPS.
- Resolutions are now sorted, and you can pick widescreen resolutions if you play
	in a window even if your don't have any fullscreen widescreen modes. (Yep, 16:9
	modes are now supported.)

December 11, 2004
- Decided it's time to bring the goodness of Polymost to ZDoom. Stage 1 complete:
	Convert the clipper to a stand-alone C++ class. Stage 2 to be completed some
	time in the indeterminate future. There's really other things that I should be
	doing right now, ne?

December 9, 2004
- Fixed: APlayerPawn::BestWeapon() did not know about the Tome of Power, so
	when you ran out of sufficient ammo for your tome'd weapon, it could select
	the untome'd version of that weapon, which would turn into the tome'd version
	when it was raised, so you would be stuck in a cycle until the tome ran out or
	you picked a different weapon manually.
- Fixed AMinotaur::Die() should have used a thinker iterator instead of an
	actor iterator to look for minotaurs that are still alive.
- Added Graf's deltaviewheight fix for climbing stairs made of actors.
- Fixed up the pickup ammo amount for the BFG. (Was 100, should be 40.)
- Merged in Jim's ACS character array printing support.

December 6, 2004
- Fixed: Fog boundaries flashed with gunfire. That's wrong because foggy
	sectors don't flash.
- Fixed: Masked textures in a skybox would determine their height from the
	viewz used for the last skybox drawn instead of the viewz for the skybox they
	belong to.
- Fixed: "*fistgrunt" was undefined, so A_FPunchAttack() was unable to play it.
- Fixed: Hexen players did not play their burn death sounds. Neither did the
	cleric boss.
- Fixed: Thingcount should not count items in somebody's inventory.
- Fixed: AInventory::BecomeItem() did not remove the item's TID, so it could
	still be manipulated by scripts even after being picked up.
- Fixed: CheckBossDeath() should consider frozen corpses as not dead, because
	A_BossDeath() is not called until the corpse shatters.
- Changed APlayerPawn::Die() to use P_DropItem() to spawn a new weapon when
	weapondrop is turned on instead of dropping the player's actual weapon.
- Fixed: P_DropItem() needs to clear the MF_NOGRAVITY flag because some Hexen
	items have it set.
- Fixed: ArtiTeleport::Use() called P_UndoPlayerMorph with its player instead of
	its owner's player.

December 4, 2004
- Updated the libraries and moved them out of src and into the base directory.
	Now zlib is at version 1.2.2, libFLAC is version 1.1.1, and src contains only
	the ZDoom-specific files.
- Updated to zlib 1.2.2.

December 3, 2004
- Fixed: 256 entries per column is not enough for dc_tspans. Each column should
	have MAXHEIGHT entries available, because a column that alternates drawn/not-
	drawn pixels each row will need one entry per row.

December 2, 2004
- Fixed playback of SPCs when spc_8bit is true. SNESAPU renders them unsigned,
	but we need them to be signed. Also fixed: Altering spc_stereo and spc_8bit
	while a SPC was playing could crash.
- Added new stuff to the alternate sound renderer: MMX CopyAndClip routine,
	interpolated mixers, FLAC sample loading, streams, and slightly tighter
	inner. So now it's a bit more of a realistic alternative to FMOD. All it
	really lacks is MP3, Vorbis, and MOD support. The snd_interpolate cvar can
	even select between linear (1) and quadratic (2) interpolation, so it can
	sound better than FMOD, which only does linear interpolation.

	I'd like to compare the performance of the new code with FMOD, but
	unfortunately, I can't seem to figure out a good way to calculate % CPU used
	by the mixer. My attempts lead to numbers that fluctuate quite a lot for
	relative constant environments. At least it ought to be attractive to the
	Linux folks if it gets modified to support SDL as well as DirectSound, even
	if I have no idea how well it performs.

December 1, 2004
- Reorganized the sound interface code to make it easier to target multiple
	sound renderers.

November 29, 2004
- Added the CTRL-X keypress for clearing the current console command line.
- Changed tab completion to be more Bash-like: When there is more than one
	possible completion, and they all have a common prefix longer than what
	has been typed so far, the full prefix will be filled in for you. (e.g.
	Typing "sn[TAB]" will append "d_" for you because every command that
	starts with "sn" also starts with "snd_".) Note that this only works if
	you have the completion list turned on (con_notablist is false).
- Fixed: Only the first berserk pack you picked up would give you health.
- Fixed: Soul sphere played the wrong pickup sound.

November 25, 2004
- Added render-to-texture support to the engine. Using it requires you do two
	things:
		(1) Define a texture that can be drawn into. You do this with a line in
				ANIMDEFS:

				cameratexture <texture name> <width> <heigth> [fit <width> <height>]

				e.g.

				cameratexture CAMTEX1 64 64
						Creates a texture called CAMTEX1.

				cameratexture CAMTEX2 100 50 fit 80 50
						Creates a texture called CAMTEX2. Its actual dimensions are 100x50,
						but it will be scaled to fit into an area 80x50 units large.

				cameratexture STARTAN2 64 64
						Replaces the existing texture STARTAN2 with a new one that can be
						rendered into. Since no fit size was provided, this new texture will
						be sized to occupy the same space as the old STARTAN2 texture, which
						is 128x128.

				cameratexture STARTAN2 64 64 fit 64 64
						Replaces the existing texture STARTAN2, but leaves the texture
						unscaled by specifying a fit size that matches the real size.

				Square textures use less memory than non-square textures. However, if
				you want to use a camera that can see the texture it renders into, you
				should use a non-square texture.

		(2) Use ACS to identify which camera renders to the texture:

				SetCameraToTexture (<camera tid>, <texture name>, <FOV>);

				e.g.

				SetCameraToTexture (100, "CAMTEX1", 90);

November 24, 2004
- Expanded the definition of local for such things as "localambientsound" so
	that players will still hear the sound if they are looking through a camera.
- Added the summonfriend command.
- Made P_RandomChaseDir() truely random. The only real randomness it had before
	was in deciding whether monsters preferred to go east or southeast.

November 20, 2004
- Fixed: AInventory::BecomeItem() must remove the actor from all the touching
	sector lists. Otherwise, you can get crashes if a floor or ceiling in a
	sector touching the item moves later.
- Fixed: Patrols only went to the first goal and then got stuck.
- Fixed: Recurssion when an unloading script tries to change to a different
	map. The map change is already under way, so the script cannot start another
	map change.
- Moved BasicArmor's PostBeginPlay icon fixing into Tick, so it can cope with
	the "give armor" cheat removing the icon when the player already has armor.

November 18, 2004
- New ACS stuff:
		bool playeringame (int playernumber);
				Returns true if the player [0..7] is in the game and false if not.

		bool playerisbot (int playernumber);
				Returns true if the player [0..7] is a bot and false if not.

		script <x> unloading
		{
				...
		}
				Executed by the level just before it unloads because the players are
				about to move to another one. Everything up until the first latent
				function will have a chance to execute. If the script needs to wait,
				it will continue execution when the players return to the map. Since
				this type of script is executed with the equivalent of ACS_Execute
				and not ACS_ExecuteAlways, it can block itself from executing the
				next time the level is unloaded if it hasn't finished with its
				business yet.

		script <x> (int playernumber) disconnect
		{
				...
		}
				This type of script is executed when a player disconnects in a
				multiplayer game (including bots). THIS SCRIPT IS EXECUTED BY THE
				WORLD, NOT BY THE PLAYER WHO LEFT. By the time the script is run,
				the player is already gone, so you can't do anything to that player.
				The number of the player who left is passed as the only argument to
				this script.
- Selecting a conversation choice that stays at the same dialogue node no
	longer moves the current selection.
- Added a gold display when talking to merchants.
- Fixed: Poison bolts shouldn't kill merchants.
- Fixed: An ActorMover didn't prevent the renderer from interpolating the
	actor when it was moved onto the path to start off.
- Fixed: AInterpolationPoint::ScanForLoop() got stuck if the path looped, but
	the initial point wasn't part of the loop.
- Fixed: Giving an interpolation point the ambush flag in an editor would
	cause it to not join a path.
- Added Graf Zahl's fix for shootable walls with invalid sector tags that
	some wads use to make things you can break. Also added a parameter to the
	GlassBreak special that you can set to 1 if you don't want it to throw out
	any shards.
- Fixed: MF3_NOTARGET should only be respected my monsters of the same
	friendliness.
- Fixed: D'Sparil and the Heresiarch always summoned hostile helpers even if
	they were friendly.
- Fixed: DCajunMaster::ThinkForMove() needed more NULL checks for the
	player's ready weapon.
- Fixed: When using the Tome of Power, only the first weapon in a slot could
	be selected with the slot command, because FWeaponSlot::PickWeapon() didn't
	consider the powered-up version as a match for the current weapon.
- Fixed: If a player is telefragged and drops a weapon (or anything else), it
	can mess up the floor/ceiling determination in P_TeleportMove() thanks to
	the heavy reliance on global variables in the physics code. Those make it
	very much non-reentrant.
- Fixed: Monsters did not activate player-cross lines when strict checking
	was turned off.
- Fixed divide by 0 in the Hexen status bar's DrawKeyBar() method when the
	armor slot increments are 0.
- Changed the ACS random command so you can specify the max and min as either
	parameter. This fixes a divide by 0 when the maximum is one less than the
	minimum (because now the maximum cannot be less than the minimum).
- Fixed PROP_FLY with SetPlayerProperty.
- Removed MF_NOBLOCKMAP from IceChunk, IceChunkHead, the Heretic imp chunks,
	Meat, and Junk.
- Removed LEVELINFO_START_TIME, since it's useless outside of timedemo.
- Fixed log HUD messages (and print statements) were logged to the console but
	not to the log file.
- Fixed scrolling bounds when automap rotation is on and follow is off. Issues
	remaining: The grid in rotation mode only works well if follow is on, and
	rotation is relative to the player rather than the center of the screen. I'm
	tempted to just rewrite the whole map package to be more rotation friendly
	(and be more modular so there could be multiple instances on the HUD, as was
	requested a couple of times in the past).

November 17, 2004
- Corrected movement of the automap background when map rotate and follow are
	turned on.

November 16, 2004
- Separated the drawing of HUD messages from the main status bar pass. Now HUD
	messages that are meant to be drawn on top of the status bar are drawn on top
	of the status bar.

November 13, 2004
- Fixed: Dehacked's PatchThing() needs to translate the old damage type flags to
	the new damage type value.
- Changed AActor::Die() so it doesn't reset the target if the source is NULL.
- Changed A_CustomBulletAttack() and A_BulletAttack() back to getting their damage
	type from the puff, like they (indirectly) did before.
- Added division/modulus by zero checks to all the PCD_DIV/MOD* p-codes.
- New SNDINFO command to deal with several Strife sounds: $singular <sound name>.
	Use this, and only one copy of the sound will play *anywhere*. This is different
	from $limit, which is distance based and can stop currently playing sounds. There
	are actually a lot of singular sounds in Strife. I only chose to make a few of
	them singular, in particular the alarm. TBD: Should new singular sounds cut off
	an already playing copy or not play at all?
- Klaxon tweaks: Now klaxons clear off the LastHeard property using the same
	recursion that sets it (with P_NoiseAlert).
- Fixed: G_DoReborn() could only fake as players 5-8 when playing Doom or Heretic.
- Fixed: P_SpawnMapThing() calculated the player number wrong for player starts > 4.
- Fixed: AWeapon::AttachToOwner() did not call the status bar's
	ReceivedWeapon method.
- Fixed: Even though I fixed the A_CallSpecial parsing, I broke its handling.

November 5, 2004
- Corrected the pickup sounds for Strife items.
- Added the MF3_NORADIUSDMG flag to the Inquisitor so he won't kill
	himself so readily.
- Fixed: Armorer hair color was wrong. (Cyan instead of gray.)
- Fixed: Starting the game from a fullscreen console with fullscreen false
	prevented anything from being drawn, becaues the primary surface would be
	lost by the time DDrawFB::PaintToWindow() was reached.

November 4, 2004
- Fixed: The C span drawers all drew 64x64 textures in row-major order
	instead of column-major order. (They were correct for other sizes, though.)
- Changed the Oracle's spectre (#3) to have MF_SPAWNCEILING and not bob in
	its spawn states. Now it behaves more like the Strife original despite
	being defined even less like it.
- Increased the opacity of alien spectres to 66%.
- Fixed: A_ExplodeParms() checked against the size of AttackList instead
	of ExplodeList, and it had the distance and damage type parameters to
	P_RadiusAttack() swapped.
- Fixed player morphing crashing when using the morphme command in a game
	that doesn't normally have morphed players.
- Made the Strife burning player more correct: You can run around for a bit
	before collapsing, and then you stop flailing your arms around.
- Fixed: I forgot to change the prototype for the Soulsphere's Use function,
	so it did nothing.
- Fixed: The AFourthWeaponPiece class destroyed the fourth weapon after giving
	it to you if weapon stay was off.
- Fixed: Picking up a torch or light amp while invulnerable cancelled out
	the special colormap for the invulnerability effect.
- Fixed: In Doom, you didn't raise your weapon at the start of a new game if
	you had neverswitchonpickup on.
- Added the ChangeSky ACS command so that I can remedy another slight Strife
	problem: The sky on all maps should become gloomy after killing the
	Programmer.
- Fixed: The post-closing Strife slideshow music should be D_FAST, not D_INTRO.
- Fixed: The opening Strife slideshow is supposed to play D_INTRO, not D_DARKER.
- Changed Ceiling_LowerAndCrush so that it uses the same speed for down and
	"up", so crushers that stay down can slow down when they hit something. Fixes
	the Templar crushers on Strife MAP12.
- Fixed: In Strife, crushing ceilings that don't go back up are supposed to
	go to the floor.
- Fixed: Strife linetype 180 didn't copy the sector properties.
- Fixed: Strife instant death sectors were not implemented for the player, and
	the damage done by sector type 4 (strobe and hurt) was wrong.

November 3, 2004
- Fixed: Talking to friendly PCs made them hate you.
- Fixed: When P_SpawnPlayer() moved a voodoo doll's inventory to the new
	player, it didn't fix the items' Owner links.
- Fixed: AAmmo::HandlePickup() didn't check for a NULL ReadyWeapon when
	picking up ammo that you had previously run out of.
- Fixed: New check in PlayerLandedOnThing() prevents both *grunt and *land
	from being played if they are defined as the same sound.
- Fixed: The minimum velocity P_ZMovement() checks against to decide if your
	view should be squatted should not vary with gravity. Same for grunting in
	PlayerLandedOnThing().
- Fixed: The Archvile and Boss Brain did not transfer their friendliness.
- Fixed: Animated door Open/CloseSounds were left uninitialized if the
	definition didn't specify them.
- Fixed: AMageStaffFX2::SpecialMissileHit() did the wrong damage type.
- Fixed: Forgot to change the prototype for the Megasphere's Use function.

November 2, 2004
- Added HUDMSG_FADEINOUT style HUD messages.
- Added the GetLevelInfo ACS command, which can be used to collect information
	before jumping to an intermission-style map.
- Added support for loading 1, 2, and 4 bit PNG images.
- Merged in Graf Zahl's customizable animated doors submission.
- Added the sound effect for Strife's mask powerup.
- Reimplemented water-breathing with the iron feet.
- Fixed: Closing doors made frozen corpses disappear instead of shatter.
- Added fire and disintegration deaths for the Strife player.
- Removed MF2_ICEDAMAGE, MF2_FIREDAMAGE, and GetMod() from AActor in favor of
	a DamageType property.
- Fixed: Masked textures visible through multiple skyboxes would be rendered
	multiple times.
- Fixed: Skybox planes were drawn in front of any masked textures behind them.
- Fixed: Strife's armor is auto-activated when you pick it up only if you don't
	already have some in your inventory.
- Fixed: The ACS ClearInventory command should leave undroppable items in place,
	but there is a special exception to zero out the armor slots for a HexenArmor
	item, which is almost the same as removing it.

November 1, 2004
- Fixed: ArtiBoostArmor didn't work in Hexen.
- Fixed: Hexen players need to start with HexenArmor in their inventory, or else
	they won't get their class-specific armor bonuses until they pick up other armor.
	Since each player must start with HexenArmor, that means I can make a fifth slot
	to hold their class armor and get rid of GetAutoArmorSave(), GetArmorMax(),
	and GetArmorIncrement() and make the armor handling somewhat more homogenous.
- Disabled left-right aiming when autoaim is 0.
- Added support for the newer version of the Strife Teaser that everybody but
	me seems to have downloaded.
- Changed rail handling to be closer to Strife's: If you approach the rail from
	the low side, you can jump "into" the railing. This is still better than
	Strife's approach, which lets you jump into rails from either side. It's needed
	to get out of an area on MAP04, and possible others as well. Unfortunately, it's
	really ugly behavior and will probably be reported as a bug by somebody who
	doesn't know why he got stuck in a rail.
- Fixed: P_ChangeSwitchTexture() did not set a value for *quest if no switch
	textures were found on the sidedef, so you could get random stat increases in
	Strife by breaking two-sided glass lines if only one side of the line had a
	"switch" texture.
- Improved the wandering behavior of friendly monsters. Now they use the actual
	chase states instead of the look states, so they animate naturally.
- Fixed: P_RandomChaseDir() thought angles were sorted in the wrong order, so it
	never picked a random chase direction.
- Fixed: I forgot to flag the DoomPlayer as friendly.
- Added the friendly flag for use in DECORATE.
- Fixed: AWeapon::CreateTossable() let you drop sister weapons independantly from
	each other. It should only create a tossable version of the primary weapon and
	make the other one go "poof."
- Fixed: Shadow Armor used the same invisibility powerup as Doom. It should be
	a separate one, because Strife doesn't have the fuzz effect.
- Fixed: Strife uses a LINEHEIGHT of 19 for its menus, not 16 like Doom. There are
	also a few other positional differences between the menus.
- ZDoom now offers the exact same translation tables as Strife, which change the
	colors for more than just the player's suit.
- Changed P_RadiusAttack() so that anything that does fire damage does not thrust
	the thing it hurts vertically. This fixes the phosphorous grenades' fire.
- Fixed: The Strife grenades should have MF3_CANBOUNCEWATER set so they can bounce
	off liquid flats. They're not like Heretic bouncers in this respect.
- Fixed: Strife liquid flats *do* clip sprites ala Heretic/Hexen. I did not
	know that. That means the StickInWater also needs to have MF2_FLOORCLIP set.
	That also explains why WaterfallSplash doesn't show up in Strife.
- Fixed: StrifePuff should use the same actor-hit animation as StrifeSpark. They
	only differ by their non-actor-hit animations.
- Fixed: The surgery kit ought to give you full health, not 100 health.
- Fixed: Flying mini-missiles used the wrong states from StrifePuff.
- Fixed: G_PlayerReborn() only gives the default inventory to the first copy of a
	player in a level, which means a voodoo doll can get the inventory, while the
	real player gets nothing. P_SpawnPlayer() must check if the player already had
	an actor spawned for it and if so, transfer the old actor's inventory to the new
	actor.
- Fixed: R_InitFuzzTable() is the wrong place to initialize fuzzviewheight.
- Fixed: The "give armor" cheat gave you the wrong armor.
- Fixed: The Dehacked ammo parser didn't calculate new BackpackAmount and
	BackpackMaxAmount values.
- Fixed: A_CheckReload() still had AltFire and PrimaryFire swapped.
- Fixed: The NULL weapon check in P_CheckWeaponFire() was in the wrong spot.
- Fixed: The give cheat gave you X number of item instances instead of just setting
	the item's Amount field. The same goes for ACS's GiveInventory command.

October 30, 2004
- Fixed: G_StartTravel() should only affect living players. Otherwise, the body of a
	dead player will replace the live body that was spawned on the new level and the
	player will stay dead.
- Fixed: Strife line type 188 needs to be repeatable so you can cross over it without
	QuestItem16 and then cross over it again later with the item for it to have effect.
	This opens the door to the castle.

October 29, 2004
- Fixed: The idclev cheat needs to call G_StartTravel().
- Added a BackpackAmount and BackpackMaxAmount to the Ammo definition, so the amount of
	ammo received with a backpack can differ from the amount picked up from a base ammo
	item, and so the max amount can be configured too.
- Fixed: If you already had enough of something a merchant tried to give you, you would
	get both the "enough" response and the affirmative response.
- Fixed: The Sigil was draining armor and not just health.
- Fixed: The Oracle's spectre wouldn't immediately chase after you if you killed the
	Oracle with a dagger, and it wouldn't aggressively attack until you attacked it.
- Fixed: Strife floater blocking lines were not properly translated.
- AActor::DropInventory() now clears the MF_NOGRAVITY flag, since several Hexen items
	had the flag set.
- Fixed: Not coop/deathmatch thing flags in BOOM maps did not work. MBF's friendly flag
	wasn't handled either.

October 28, 2004
- Fixed: The player's inventory was wiped out when switching levels in deathmatch. The
	player needs to be reborn every time they are spawned in a deathmatch game so that
	they can get the default inventory.
- Fixed: P_ThingProjectile() should set the spawned thing's speed only if it is truely
	a missile.
- Fixed: FindMostRecentWeapon() failed if a tome-ed weapon was ready.
- Fixed: AInventory::GoAway() returned false for items that should stay.
- Fixed: The flags for maplinedef2_t were signed. They were correctly unsigned for
	maplinedef_t.
- Fixed: Ripper didn't set its death state.
- Fixed: GoldWandPuff2 should inherit from GoldWandFX1, not GoldWandPuff1.
- Fixed: AWeapon::CheckAmmo() thought you had enough ammo to use a weapon's alternate
	fire mode if it didn't have an alternate fire. Hence, you could e.g. select the poison
	crossbow right after receiving Strife's crossbow, even if you didn't have any poison
	bolts.
- Fixed: The StrifePuff had the hit actor and hit wall states swapped.
- Fixed: APigPlayer::ActivateMorphWeapon() didn't check if you already had a snout.
- Fixed: The +moveup and +movedown keys only worked under water.
- Fixed: G_FinishTravel() needs to check for NULL duplicate players, which can happen if
	a start spot doesn't exist for the player on the new map.
- Fixed: Puzzle items did not define their own use sound.
- Fixed: Most of the Doom powerups were stackable.
- Fixed: The fuzzy column drawer did not correctly clip the bottom of the posts to the
	screen bottom of y-doubling was turned on.
- Fixed: The chainsaw's UpSound was mis-spelled as "weapos/sawup".
- Fixed: FindMostRecentWeapon() called P_SetPsprite to drop the old PendingWeapon.
	But since it was a PendingWeapon, this meant it wasn't actually visible, so doing so
	would change the weapon sprite. Worse, this function is only processed locally, so
	it could mess up multiplayer and demos. Now A_Raise() checks for a pending weapon and
	starts the current one dropping if it finds one.
- Added a NULL name check to FFont::FindFont() and FWadCollection::CheckNumForName() to
	fix Daedalus crashing immediately. To fix it for real, the FBehavior constructor needs
	to call UnencryptStrings() before calling FindLanguage(). Otherwise, none of the
	strings are available.
- Fixed: Weapons you dropped magically had ammo, so you could cheat by dropping your
	weapon and then picking it back up to give yourself more ammo.
- Fixed: DCanvas::DrawTexture() called NetUpdate() when a menu was open. This is bad
	because it can cause menu keypresses to be processed during the menu's drawer
	function. Specifically, the case that brought the badness of this to my attention
	was the Strife conversation menu. If a choice was made while the menu was being drawn,
	it would alter the data used for drawing the menu, and it could crash. This is probably
	also why the screenshot in the load menu would sometimes disappear after selecting a
	game.

October 27, 2004
- Fixed: AM_drawThings() drew bounding boxes in the wrong locations if am_rotate
	was false.
- Did some miscellaneous GCC 3.4 cleanup.
- Moved the project files out of the src directory and into the base directory.

October 26, 2004
- Fixed: AHealth should have a default MaxAmount of 0, not 100, so it maxes out at
	whatever the player's current max health is.
- Fixed: Using Dehacked to make an ammo-less weapon use ammo left the AmmoUse1
	property at 0.
- Fixed: A_CallSpecial() parsing was broken.
- Fixed: The peasants are not all the same speed.
- Fixed: A_AcolyteDie() was incomplete.
- Fixed: Light green and blue acolytes are supposed to have 60 health, not 70.
- Fixed: Changing Dehacked MaxArmor did not update ArmorBonus. Changing Dehacked
	MaxSoulsphere did not update HealthBonus.

October 25, 2004
- Fixed: A_KlaxonBlare() used threshold when it should have used reactiontime.
- Fixed: The KlaxonWarningLight from Strife should not have its initial tic randomized,
	so all the klaxons in a level can stay synchronized.
- Fixed: A_ItBurnsItBurns() didn't set the death sound to the burning death sound.
- Fixed: The "peasant/death" sound no longer links to all three death sounds, just the
	first one, because that's the only one Strife actually played.
- Fixed: AActor::DropInventory() needs to call P_TryMove() on the dropped item, or
	sector information might not be filled out correctly.
- Fixed: After changing item dropping to start the item out as not-pickup-able,
	A_Beacon() was no longer able to clear the MF_SPECIAL flag, because AInventory::Tick()
	would set it again. A_Beacon() needs to set DropTime to 0 as well.
- Fixed: The final frame for ExplosiveBarrel2 was fullbright.
- Fixed: If a powerup was blinking and you used an item to restore it, APowerup::
	HandlePickup() would restore the powerup without actually using the item.
- Fixed: AInventory::Tick() and AInventory::CreateTossable() now handle solid items
	(specifically, the Degnin ore).
- Fixed: ASigil::SpecialDropAction() now gives a Sigil piece to every player in the
	game. Previously, it tried giving it only to whoever the Sigil dropper was
	targetting. If the monster was killed quickly enough, it was possible for it to
	be targetting nothing at all. And there was also the possibility for it to be
	targetting a non-player.
- Added a NULL player check to AWeapon::AttachToOwner().
- Added IF_ALWAYSPICKUP for auto-activated items that you can have a maximum of 0 of
	(such as the armor bonus), so you can take them off the map even if you don't really
	need them. AHealth::TryPickup() also uses it for the Doom health bonuses.
- Fixed: Doom HUD crashed when trying to draw an inventory item without a valid icon.
- Fixed: ArtiBoostArmor tried to give the player BasicArmor instead of a
	BasicArmorBonus when not playing Hexen.
- Fixed: A_FireCGun() could crash if the weapon's state was before the first
	attack state.
- Fixed: Monsters always activated player-cross lines.
- Changed ArtiInvisibility to give you the newly added PowerGhost instead of
	PowerInvisibility. Now you can use both types of invisibility without being
	restricted by whether or not you are playing Heretic.
- Fixed: I forgot to make PowerupGiver's EffectTics do anything. Also added
	BlendColor to PowerupGiver at Graf's suggestion.
- Fixed: I forgot to add IF_PICKUPFLASH for the Speed Boots and Tome of Power.
- Changed P_DamageMobj() so that spectral entities are subject to non-spectral
	damage if the damage amount is one million or more. This lets P_Massacre()
	kill them.
- Fixed mobj_statenames[] array in thingdef.cpp
- Fixed: I forgot to add a case for ADEF_MinMissileChance in infodefaults.cpp.

October 21, 2004
- 2.0.91 time, just so people stop posting the same crash log.
- Added a pickup delay after dropping, but it still seems to be problematic.
- Fixed: Classic BEHAVIOR lumps weren't having their scripts sorted.
- Fixed: P_TestActivateLine() always returned false for SPAC_MCROSS lines if the
	ML_MONSTERSCANACTIVATE line was not set.
- Fixed: A_Wander() now clears the MF4_INCOMBAT flag, so you can talk to peasants
	after fighting in their vicinity. Strife does not clear this flag there, nor do
	I know if it ever cleared it anywhere.
- Fixed: AInventory::GoAwayAndDie() left the MF_SPECIAL flag set, so it was possible
	for a player to try to pick up the item in the next tic before it destroyed itself.
- Fixed: AHealthTraining::TryPickup() ignored its superclass's return value.
- Fixed: Intermission screen tried to show post-E3 maps in Heretic.
- Fixed: Now that FWadCollection::FindLump() ignores lumps outside the global
	namespace, skins couldn't be loaded.
- Fixed: PROP_Weapon_YAdjust used an unsigned byte, so negative yadjusts didn't work.
- Changed the size boxes around actors in map cheat view into a real feature instead
	of something I quickly threw in for debugging. It's now accessed with am_cheat 3
	and works properly with rotating maps.
- Fixed: FActorInfo::BuildDefaults() checked ADEF_SkipSuper as a byte instead of
	a word.
- Fixed: The artifact flash was not cleared from the Raven status bars when the
	last item was used.
- Fixed: A_CustomBulletAttack tried to use A_CustomMissile instead.
- Fixed: New flag4 names in thingdef.cpp.
- Fixed: Cyberdemon was MF4_LONGMELEERANGE instead of MF4_MISSILEMORE.
- Fixed: Fullscreen inventory bar positions were wrong in Doom.
- Fixed: Hexen armor was quite broken.
- Fixed: S_StartSound() no longer tries to play sound ids below 0.
- Fixed: Terrain splash sounds were initialized to -1 instead of 0.

October 20, 2004
- Time to release 2.0.90, I think?
- Added some Strife keys to the controls menu.
- Did more work on the Strife status bar. I think it's feature complete now.
- Finished reimplementing the Heretic status bar.
- Made cholycount, mstaffcount, and flamecount local to the weapons that use them
	instead of the players who fire them. The rain1 and rain2 members are now stored
	in the shooter's inventory instead, so it should be safe to use the rain with
	monsters.

October 19, 2004
- Added extrapolation for the Strife popscreen scrolling.

October 14, 2004
- Fixed: Using -warp with an ExMy game and only providing the map number only worked
	if -warp wasn't the last parameter on the command line.
- Updated some powerup-related code for the new inventory system.

October 12, 2004
- Fixed: Quitting a game and returning to the title screen would not zero the
	palette blend.
- Fixed: Missiles disappearing on horizon lines were still exploded.

October 8, 2004
- Added a scrolling effect for switching between pages in the keys pop screen.

October 6, 2004
- Fixed: Missiles with MF2_BOUNCE2 set did no normal damage.
- Added particle blood for the Heretic/Hexen blood functions.
- Added a fix for negative row offsets to non-power of 2 height textures.
- Continued my R_FakeFlat() fix from yesterday: It didn't copy the control sector's
	lighting either.
- LEVEL_SWAPSKIES is now ignored if LEVEL_DOUBLESKY is set.
- Fixed a possible crash in SC_GetString() if whitespace is the last character(s)
	in a script.
- Fixed the sliding along diagonal walls behavior in P_HitSlideLine() so that it
	uses correct math. (from code submitted on the forum)

October 5, 2004
- Removed MF_NOBLOCKMAP from ColonGibs, SmallBloodPool, BrainStem, and BloodPool. I
	can't see any good reason for them to have this flag set.
- Fixed: player_t::Serialize() set PendingWeapon to WP_NOCHANGE. I have no idea why.
- Added a playing of "minotaur/attack3" to A_MinotaurAtk3().
- Fixed: R_FakeFlat() did not set FakeSide to FAKED_BelowFloor when viewing a
	fake plane with SECF_CLIPFAKEPLANES and SECF_FAKEFLOORONLY set and the fake floor
	was above the real ceiling.
- Fixed: DArgs::GatherFiles() would hang on files with unexpected extensions.
- Autostarting games (i.e. co-op) of Hexen now use the map set as the first map,
	so you can play co-op Deathkings without knowing Deathkings starts on MAP41.
- Added range checks to C_DoKey(), C_ChangeBinding(), and C_GetBinding().
- Fixed integer overflow in P_SetSlope() for very extreme slopes.
- Stopped outputting the exception information to the crash log for an
	EXCEPTION_ACCESS_VIOLATION when run under a pre-NT kernel, because those seem to
	fill it with 0xFF instead of anything meaningful.

October 4, 2004
- Fixed: The mace death ball did full damage to teammates.
- Fixed: The font translation builders counted the transparent color as a visible
	color and erroneously included it in the calculations, making every range lighter
	than they should have been.
- Fixed: Giving the player a weapon when they were not already using one would not
	bring the weapon up. (Note: Not bringing the new weapon up if the player is
	already using a weapon is normal behavior.)
- Fixed: PickNextWeapon() and PickPrevWeapon() crashed when the player had no
	ready weapon.
- Changed MakeKey to return a value of 0xFFFFFFFF for NULL strings.
- Changed the centerview command to send a DEM_CENTERVIEW event instead of using the
	ticcmd_t structure to do it. Now it works while the game is paused.
- Changed particle visibility calculations so they use r_SpriteVisibility instead of
	a separate variable pre-multiplied by 2. So now there is no r_ParticleVisibility
	to overflow.
- Removed the 3-digit restriction on large fullscreen HUD numbers.
- Fixed: G_LoadGame() did not check for a NULL name.
- Added the -nojoy command line parameter to disable the enumeration of joysticks,
	effectively disabling joysticks regardless of the use_joystick cvar.
- Reduced the maximum FOV from 175 to 170.
- New: With the (non-overlayed) automap on, a cut-down rendering process is performed
	so that the automap can update while you move around.
- Fixed the switch and animation parsers so they can use overridden textures.
- Changed the warp command so that it gets sent across the loopback device.
- Changed the default item respawning behavior so that the dmflag is observed in all
	multiplayer games, not just deathmatch.
- Fixed: Thing_Projectile did not set the projectile's speed.
- Fixed: The banishment device did not work on non-monsters. Normally, that's okay,
	but it didn't work on players either.
- Fixed: Ambient sounds in Doom-format maps could prevent players from spawning.
- Fixed: The scripted version of Scroll_Texture_Both now checks to make sure the
	specified line side is valid.
- After P_SetupLevel() calls P_LoadThings(), it now sets the healths of the players
	to match their actors, in case their voodoo dolls were were fragged during the
	spawn process. (Plutonia MAP06)
- FindShortestTextureAround() and FindShortestUpperAround() now return the height of
	the null texture if none of the sector's side have a corresponding texture.
- Changed the minotaur drops so that (1) Minotaur always drops and (2) MinotaurFriend
	never drops.
- Added a dummy actor with doomednum 32000, so Doom Builder's camera won't show up
	in maps.
- Added a minimum screen size of 320x200 to the Win32Video mode enumerator.

September 29, 2004
- Removed the bStaticName texture flag.
- Added support for autoactivating items with a MaxAmount of 0. This lets me use the
	same armor classes for Strife (which can stack armor) and Doom/Heretic (which cannot
	stack).

September 28, 2004
- Merged in my the old Linux changes I made just after releasing 2.0.63.

September 7, 2004
- Stopped "*** SOUND DEBUG INFO ***"'s flashing.
- Changed the default resolution from 320x200 to 640x480.
- Added some sound precaching now. Sounds that are stored in an Actor's members
	are now loaded at level load time, and those that aren't are unloaded. Is this
	enough or should I also scan scripts for strings that could be sounds?
- Fixed a bug I added when I fixed the palette scrambling just after switching to
	fullscreen mode. The WM_PALETTECHANGED message could be received during a drawing
	operation, but it was still handled immediately anyway. So after doing that, the
	screen would no longer be locked, and drawing operations would be referencing a
	NULL pointer. Now the reosurce freeing and restoring waits until the next Lock call.

August 31, 2004
- Fixed: The vampiric mode of the serpent staff brought you down to 100 health if you
	were over it.

August 25, 2004
- Fixed: PIT_CeilingRaise would move overlapping things that did not have MF2_PASSMOBJ
	set.
- Fixed: Selecting an episode not present in the shareware Heretic told you you needed
	to buy Doom.
- Fixed: PTR_UseTraverse didn't consider ML_BLOCKEVERYTHING lines to be blocking.
- Fixed: PTR_AimTraverse didn't consider ML_BLOCKEVERYTHING lines to be blocking.
- Fixed: After pressing +use to load a save game after you die, +use would still be
	down after the load finished, and you could open doors immediately. Nasty if there
	was some mean thing behind the door all set to kill you.
- Fixed: Sector special transferring moving floors also copied a sector's secret flag.
- Changed the player setup menu to use the arrow cursor instead of the skull cursor.
- Changed FWarpTexture::MakeTexture() to allocate a temporary buffer instead of using
	a fixed sized 256-byte one.
- Changed sprite flipping so it flips the sprite's left offset too.
- Fixed: You could use items on the intermission screens between levels.
- Changed the ACS thingsound command to use CHAN_AUTO like the other ACS functions.
- Fixed: Flying things could get stuck inside rising floors.

August 14, 2004
- Fixed sign problms with door light tags.
- Fixed: PIT_CheckOnmobjZ()'s "under thing" check used < instead of <=. This
	is why falling stacks of monsters would get stuck and be unable to move.

August 10, 2004
- Added support for drawing masked and translucent flats that are part of
	a stack. The amount of translucency is controlled by the first argument
	of the 9077 and 9078 things. At the moment, this is only for unsloped flats.

July 29, 2004
- Added checks in AAmbientSound::(De)Activate so that you can't activate it
	when it's already activated or deactivate it when it's already deactivated.
- Fixed: addmenukey did not ensure that the ControlsMenu.items pointed to the
	first entry of CustomControlsItems, so if you added too many controls and the
	array needed to resize, the ControlsMenu would no longer point to valid data.
- Did some fullscreen palette work now that I somehow ended up with a program
	that _always_ blows up my palette within a second of switching to fullscreen
	mode. Now when the game receives WM_PALETTECHANGED messages from other windows
	while it's fullscreen, it immediately queues up a palette update event to
	undo what the other window did. Other programs shouldn't be messing with
	the palette when they don't even have the focus, but this obviously doesn't
	stop them from doing it anyway. :-( Hopefully, this makes vid_palettehack
	obsolete. Also added vid_showpalette cvar to draw the palette to the screen
	for debugging purposes. Thanks to that, I can see that the first and last 10
	colors are being kept at the standard system palette colors after some other
	program alters the palette in fullscreen mode, and no amount of
	IDirectDrawPalette::SetEntries() calls will change them. I need to release
	and recreate my surfaces and palette, or I won't be able to touch them.
- Added separate rgamma, ggamma, and bgamma cvars to control the gamma of
	individual color components in fullscreen mode. These are multiplied to
	with the gamma cvar, so that cvar still controls the overall gamma. I need
	this because my monitor is extra green, and the drivers don't gamma adjust
	paletted displays for me.

July 28, 2004
- Stopped using FSOUND_Sample_Upload for everything. It seems to be even more
	broken with the latest FMOD.

July 26, 2004
- Added a NULL pointer check to the main P_TraceBleed function that takes a
	target, because D-ONAHD can cause this to happen some times when the imps
	shoot their BFGs in A_BFGSpray. So linetarget also gets copied to a local
	variable before being used in A_BFGSpray, since P_DamageMobj apparently can
	change it.
- Updated the FakePickup and DehackedPickup classes so that they work with the
	new inventory system.
- Added coop starts 5-8 for Strife because they're on the Bishop's Tower map
	for some reason.
- Finally added the special deathmatch logic for the enemy-finding used by
	rebels spawned from a teleporter beacon.

July 22, 2004
- Fixed the default Heretic MAPINFO: The episode 5 maps are supposed to play the
	music from episode 2 (not 1), and the episode 6 maps didn't have any music at
	all.
- Fixed: The Heretic ambient sounds were off by one.
- Changed the default for opl_freqeuncy to 49716, since that's the rate the
	chip actually played at in SoundBlaster/AdLib cards, and the emulator performs
	very poorly when it needs to downsample. Also added new OPL frequencies to
	choose from in the menu.
- Fixed: OPLmusicBlock::ServiceStream could crash on non-looping songs, because
	the return value FALSE was never passed along to tell FMOD to stop the stream.

July 19, 2004
- Changed DDrawFB::LockSurf so that a result of DDERR_UNSUPPORTEDMODE when
	trying to recreate a surface is non-fatal. The game should now be able to
	survive a screen saver and power suspend.
- Reimplemented the key display on Doom's status bar.

July 16, 2004
- Reimplemented the Hexen status bar's key bar. Also improved the status bar so
	that it can show ammo from other games.
- Fixed the ammo and key displays for Heretic's status bar. Plus, now Heretic's
	status bar will properly update when you lose a key, which it didn't before.
- Reimplemented the invulnerability powerup.

July 15, 2004
- Fixed: Morphing a monster and then using the kill monsters cheat would crash
	because the original unmorphed version would be destroyed, then when the
	morphed one died, it tried to destroy the original again, because the
	pointer hadn't been set NULL yet. Since the actual crash is from unlinking the
	actor twice, AActor::Destroy() now sets MF_NOSECTOR and MF_NOBLOCKMAP after
	unlinking an actor.
- Fixed: Trying to use "-" as a sky with MBF's 271/272 linetypes crashed. Now
	it ignores the control line and just draws a normal sky.
- Fixed: G_DoReborn() needs to do a complete new game, not just a reload of the
	current map, if the player is dead and wants to respawn without a most recent
	save.
- Changed FWadCollection::FindLump() so that it only returns lumps that are in
	the global namespace. Now it won't return lumps that got moved into a skin
	namespace. On a related note, FWadCollection::SkinHack() now prints a warning
	when it thinks it finds a skin wad with maps in it.
- Fixed: The "you are here" marks on Heretic's inter-level maps were no longer
	drawn.
- Updated to FMOD 3.73.

July 14, 2004
- Moved the full-screen HUD coordinate logic out of DBaseStatusBar and into
	DCanvas::DrawTexture. This is so that powerups can draw their status icons
	themselves without needing to hook into the status bar.
- Reimplemented the Tome of Power.
- Removed DCanvas::DrawPageBlock().

July 13, 2004
- Fixed positioning of ML_DONTPEGBOTTOM for lower textures. Putting a sky
	ceiling on both sides of the line always makes unpegged positioning
	relative to the back sector's ceiling, not just when the back ceiling is
	above the front ceiling.
- Fixed: Saving a game would momentarily stop floatbobbers from bobbing.
	Since actors have a FloatBobPhase member, their height doesn't need to be
	adjusted when serializing them. (However, since the adjustment just gets
	undone, I'm not sure why it was a problem.)
- Fixed 16-rotation sprites so that the rotation boundaries are where you would
	expect them to be.
- Re-Fixed: CT_Drawer could try drawing the scoreboard when deathmatch is
	true, but you hadn't started a game yet.
- Added the inverse video flash when firing the Sigil.
- I don't know why the Oracle's spectre is able to teleport across its
	monster blocking lines, so I've given it the MF3_NOBLOCKMONST flag.
- Translucency of things in Strife has been corrected. Strife uses 25%/75%
	translucency. Walls are 75% and it's flipped to 25% for sprites. However,
	the spectres are really hard to see, so I've given them 33% translucency.
- Added genuine Strife falling damage. It is extremely unforgiving, so you'd
	better try not to fall too far while playing Strife.
- Added the yellow and red colors for the Strife health bar when your health
	drops to 20 and 10 respectively.

July 12, 2004
- Finished a play through of Strife, from beginning to end. (Woohoo! It works!)
	Now to finish the things that aren't quite right...
- Miscellanoues Strife bug fixing.

July 10, 2004
- The eight SPAC type has now been assigned: SPAC_PTOUCH, for when projectiles
	either impact or cross a line. Strife line type 182 needs this.

July 9, 2004
- Miscellaneous Strife fixing.
- Better support for not having a ready weapon at all.
- Changed the Sigil to use the normal weapon sprite instead of the flash
	sprite to show how many pieces you have.

July 8, 2004
- Fixed: Interpolations were not cleared when loading a brand-new level.
- Added support for snesapu.dll 2.0, which happened to be as simple as
	changing the version check, since none of the changes from 1.01 affect
	the functions I use.

July 7, 2004
- "Fixed:" Missiles that moved perfectly vertical would do no damage. Now
	missiles without any x/y velocity are given a very small x/y velocity so
	that they are not quite moving vertical.
- Added the GetSigilPieces() ACS command, which returns the number of Sigil
	pieces the activator has obtained.
- Added a third parameter to Teleport_NewMap that, when set to TRUE, will
	cause the player to keep their current facing when they move to the new map.
- Added the Hexen intermission text between hubs that I had forgotten about.
- Added map redirects, so if a player is carrying a particular item, they go
	to a different map instead. (Used for Strife maps 3 and 7.)

July 6, 2004
- Added support for the teaser version of Strife. It seems to be based on an
	older version of Strife than the one that was released to retail, so the
	mobjinfo list is different, the dialogues are slightly different, and some
	items have different names. The Teaser is fully playable.

June 30, 2004
- Added Strife's fire and disruptor deaths.
- Corrected the missile attack chances for the Strife monsters.

June 26, 2004
- Added Strife's breaking glass.

June 25, 2004
- Added a fix for Strife's LASERB01 texture. The Doom renderer ignored patch
	y offsets on masked mid-textures, so it got drawn as if the beam was at the
	top of the texture instead of the bottom. The "fix" is to adjust the rowoffset
	of the sides that it appears on.

June 24, 2004
- Made some corrections to the Strife blood and bullet puffs.
- Removed the global variable PuffType. It's now a parameter to those
	functions that use it. HitPuffType is also gone, because giving a puff a
	CrashState can make the same distinction.
- Added Strife's scanner.
- Added Strife's targeter, although it's kind of a useless item when the
	player can just go to the options menu and turn on a crosshair.

June 23, 2004
- Added th IF_INVBAR flag so that only selected items show up on the inventory
	bar.

June 21, 2004
- Removed the soundtarget sector property and made it an actor property. Now
	newly spawned actors won't wake up if you happened to make noise near their
	spawn point earlier.

June 20, 2004
- Fixed: A_FreezeDeathChunks could divide by zero for very small actors.
- Fixed: The EndPic "map" in mapinfo didn't work. It always tried to show the
	graphic "endseq" instead of what was specified in MAPINFO.

June 19, 2004
- Finished adding all of Strife's slideshows.

June 18, 2004
- Removed F_DrawPatchCol, since DrawTexture can do its own clipping.

June 15, 2004
- Added the Sigil, except for the inverse colors when shooting it. Does anyone
	else think its fourth mode really weak compared to the third and fifth?

June 10, 2004
- Moved the chicken speed mods out of P_MovePlayer and into
	AChickenPlayer::TweakSpeeds.
- Added a check for NULL cameras to the very end of CT_Drawer() where it checks
	to see if the scoreboard should be shown.
- Fixed: Trying to activate some manual types of specials would activate every
	tag 0 sector in the map if the back sector was already moving.
- Added support for paths with . in them to DArgs::GatherFiles when it checks
	if a file was specified with an extension or not.
- Added support for \ as a path seperator in DefaultExtension on Win32.
- Added the vid_displaybits cvar to control how many bits per pixel the
	fullscreen display gets created with. The game is still rendered in 8-bit,
	but this is for the benefit of cards that don't support that or work better
	with non-8-bit displays.
- The vid_attachedsurfaces cvar is now ignored unless you are running NT 4.

June 9, 2004
- Fixed: FDynamicColormap::BuildLights() did not check for a NULL Maps pointer.
- Fixed: Masked textures and sprites were not drawn correctly inside nested
	skyboxes because they would be drawn in the front skybox before drawing the
	second skybox, so the second skybox would cover up the ones in the first
	skybox.

June 2, 2004
- Removed all the other network commands related to managing weapon slots.
	Determination of which weapon to switch to is now done entirely on the
	local machine and sent using DEM_INVUSE, so the slots don't need to be
	replicated to the other players.

May 28, 2004
- Removed DEM_WEAPSEL as part of the inventory rewrite. DEM_INVUSE works
	instead. This also means the weapon console command is no more.

May 18, 2004
- Added division/modulus by zero checks to the ACS VM.
- Implemented the ACS_ExecuteWithResult special so the Strife specials
	implemented in ACS can function correctly.

May 17, 2004
- Removed the TeleportSide global variable and made it a line special parameter,
	which it should have been from the very beginning.
- Increased the limit for local script variables from 20 to 65535.

May 11, 2004
- Added Strife's delayed damage sectors.
- M_ActivateMenuInput now resets the state of the game buttons, so +use will
	work right away after talking to somebody.
- Added another validity check to FPatchTexture::MakeTexture to make sure the
	column doesn't go past the end of the patch when fed bad data.
- Added Strife's merchant conversation animations.

May 7, 2004
- Added Strife's animated doors.

May 6, 2004
- Added support for clipping midtextures on all lines, because I think Strife
	looks better that way. (Even though it looks like Strife does not do this.)
- Added Strife's railing and floater-blocking line flags.
- Add Strife's status bar popup screens.

May 5, 2004
- Moved artifacts to the new inventory system.

May 1, 2004
- Fixed: Build palette loading was unreliable after adding desaturation support
	to Sector_SetColor.

April 30, 2004
- Did some work on Strife's status bar.

April 25, 2004
- Added Strife's title sequence.

April 21, 2004
- Added Degnin Ore.

April 20, 2004
- Added lots of Strife line specials, ~30 done entirely through ACS.
- New ACS p-codes:
	PCD_CASEGOTOSORTED: Faster replacement for PCD_CASEGOTO.
	PCD_LSPEC5RESULT: Same as PCD_LSPEC5, but the result of the special's
		execution is left on the stack.
- New ACS internal functions:
	int GetLineRowOffset ();
		Returns the front side's rowoffset for the activating line.

	fixed GetActorFloorZ (int tid);
		Returns the highest floor point underneath the actor.

	int GetActorAngle (int tid);
		Returns the actor's angle. 65536 is 360 degrees.

	fixed GetSectorFloorZ (int tag, int x, int y);
		Returns the sector height (fixed point) at coordinates (x, y).
		(x, y) are not fixed-point, so you should specify (32, 16)
		instead of (32.0, 16.0).

	fixed GetSectorCeilingZ (int tag, int x, int y);
		Same as GetSectorFloorZ, except for ceilings.

	void SetResultValue (int value);
		Set's a script's "result value." Needs to be used before any
		functions that make the script wait. ACS_ExecuteResult and
		ACS_LockedExecuteResult will return this value.

April 12, 2004
- Changed the respawnmonsters flag into an int that holds the respawn
	interval, since Strife respawns at 16 second intervals, and Doom uses
	12 second intervals.

April 11, 2004
- Added Strife's Templar.

April 10, 2004
- Added Strife's Loremaster and Stalker.

April 9, 2004
- Added Strife's ceiling turret and fixed the alarm klaxon.
- Added the Strife quest items.

April 8, 2004
- Converted keys to the new inventory system and added Strife's.

April 7, 2004
- Added Strife door sounds.

April 6, 2004
- Added Macil.

April 2, 2004
- Converted the Heretic and Hexen artifacts to the new inventory system.

March 31, 2004
- Converted Doom's powerups to the new inventory system.

March 30, 2004
- Converted armor and health to the new inventory system.

March 26, 2004
- Fixed: The mauler's secondary fire had the wrong states.
- Started transitioning over to the Unreal-like inventory system, starting
	with the easiest first: Puzzle items (since they basically just sit in your
	inventory until used), then ammo and the backpack.
- Made the dialogues prettier with shadow boxes behind the text.

March 23, 2004
- More dialogue work: Now you can pick responses to the things NPCs tell you
	and drive the conversations along further. You can also get items from the
	responses. However, item checks aren't in yet, so no item-specific dialogue
	branches work.
- P_NoiseAlert now sets a new object flag, OF_IsSoundTarget, so that
	soundtarget clearing will work with non-players.
- Changed P_NoiseAlert( self, self->target ) in A_AlertMonsters() to
	P_NoiseAlert( self->target, self ), so monsters will target the player
	who shot the projectile instead of the projectile itself.

March 22, 2004
- Started work on the Strife conversation system. You can now +use things and
	they will say something to you, but you can't do any sort of conversing yet.
	Plus, Strife monsters now drop stuff when they die.
- Added autoloading of voices.wad when playing Strife.

March 17, 2004
- Changed COMPATF_NOTOSSDROPS behavior so that the items spawn at the monster's
	feet instead of on the floor.
- Changed the maximum thrust in P_DamageMobj() to 10*FRACUNIT. (Previously, it
	was only clamped to this if it was so large that it went negative.)
- Added AmmoPics for the Strife ammo types.
- Fixed: The phosphorus grenades used the HE grenades pickup message.
- Added some code from P_SpawnProjectile to P_Thing_Projectile so that it can
	support floor/ceiling huggers.

March 13, 2004
- Fixed: ARealGib's PROP_SpawnState was accidentally deleted.
- Fixed: P_Thing_Projectile always returned false when spawning non-missiles,
	and when spawning missiles, only returned the status of the last missile.
- Fixed: P_SpawnPlayerMissile used the original angle instead of the aimed
	angle to rotate the projectile in the X-Y plane.
- Fixed: AHolySpirit::SpecialBlastHandling() compared "< BLAST_FULLSTRENGTH"
	instead of "== BLAST_FULLSTRENGTH".
- Changed the parser for SS_CMD_VOLUME in s_sndseq.cpp to use a floating point
	division instead of an integer division. (Whoops!)
- Fixed: Pressing backspace on a file in the save game menu and then answering
	"no" when asked if you really want to delete the file would mess up the
	savegame menu.
- Removed the WeaponNames array from p_acs.cpp, because wpnlev1info provides
	the same information.

March 8, 2004
- Removed WIF_FIREDAMAGE, as it was unused.
- Changed AWeapon::OldStyleID() so that it is no longer virtual. Instead, it
	searches the wpnlev1info array to find the info that points to that class.
- Replaced A_CallSpecial and A_Script keywords in the thingdef parser with
	support for using specials by name. (e.g. Instead of using
	A_CallSpecial (80,...) or A_Script (...) you use ACS_ExecuteAlways (...)
	instead.
- Changed SC_ScriptError to be varargs, so passing parameters for the format
	string is more straight-forward.

March 3, 2004
- Eliminated the CustomActor class by moving some of its data into class
	metadata and the rest of it into function parameters. Now custom actors
	can properly derive from built-in classes.
- Replaced A_Explode in thingdef.cpp with A_ExplodeParms, so the explosion
	parameters can be a property of the state instead of a property of the
	actor.
- Renamed __BIG_ENDIAN__ to WORDS_BIGENDIAN to match autoconf's name for the
	#define.

March 2, 2004
- Added metadata support for TypeInfo, so classes can carry metadata around
	with them. This is intended to allow actors in DECORATE to properly derive
	from built-in actors. Whenever a scripting language for DECORATE gets
	implemented so that everything can be defined there instead of in C++, the
	metadata should no longer be needed.

February 10, 2004
- Upgraded to zlib 1.2.1.
- Merged in Graf Zahl's additions to thingdef.cpp.
- Fixed: Heretic wind specials would effect you while you were underwater.
	Also turned off the Heretic wind for noclipping things.
- Added a check for empty subsectors to P_LoadSubsectors.

February 6, 2004
- Fixed: DObject::IsKindOf used StaticClass instead of GetClass.
- Added Graf Zahl's thingdef.cpp implementation and modified it to work with
	a more C-like mode in sc_man.
- Fixed: P_CheckFakeFloorTriggers could crash if the action caused the player
	to teleport to a new sector without any sector actions.
- Fixed the Hexen armor depletion so that it doesn't overflow on very large
	damage amounts.
- Fixed: An extremely dead imp that crashes before executing A_ImpXDeath2 would
	get stuck floating in the air.
- Changed menuactive into an enum and merged WaitingForKey into it. Now closing
	the menu automatically disables the menu's key waiting mode. Also fixed,
	C_ToggleConsole so that the console can never be dropped down while the menu
	is open. Before, it was possible to do this by pressing Esc and ` during the
	same tic.

February 5, 2004
- Altered the BOOM pusher/puller/current effects to apply to anything with
	MF2_WINDTHRUST and removed the restriction that it doesn't apply to things
	with MF_NOGRAVITY. To make it work, I also had to remove MF_NOBLOCKMAP from
	all the wind-thrustable Heretic/Hexen projectiles.
- Fixed: Using the spray command with a non-existant decal crashed.

February 3, 2004
- Removed r_experimental.

January 29, 2004
- Added the -oldsprites command line argument to rename sprites in all
	wads instead of just sprites in the IWAD.
- Changed Heretic's knight sounds to be prefaced by hknight/ instead of
	knight/.
- Changed the Strife weapon names for the ACS inventory commands to match
	their actor names.
- Added Hexen's water drip (spawnnum 95). Changed the Hexen WATR->UWAT
	renaming to WATR->HWAT.
- Added a note to the map command that suggests you use changemap instead
	while playing a network game.
- Fixed: Chat mode could not be used outside of an actual level.
- Fixed: The automap still tried to draw teleporters with custom colors even
	when am_usecustomcolors was false.
- Fixed the Hexen armor saves so that it doesn't overflow on very large damage
	amounts.
- Put back the AKey::TryPickup restriction on picking up more than one key of
	the same type, but now it's restricted to multiplayer games only. Single
	player will still be able to pick up more than one.

January 26, 2004
- Fixed: FLOATRANDZ overflowed when the space between ceiling and floor was
	more than 297 units.

January 22, 2004
- Fixed: side_s::GetLightLevel() got the light of "sidedef" instead of "this".
- 2.0.61
- Optimized R_PrecacheLevel() so that it does not unload graphics that are
	definitely used on the level.
- Optimized the primary loop in P_GroupLines() so that it is much faster on
	large maps. It was previously O(m*n); now it is O(m+n), and Vrack 3 loads
	in well under a second.
- Changed the Heretic's imp's sounds to use the himp/ prefix instead of imp/.

January 21, 2004
- Fixed: The Heresiarch's spell balls above his head did not update their
	sector information as they rotated. Neither did his shield balls.
- Fixed silent teleporter orientation in EV_Teleport().
- Fixed calls to P_Teleport() in a_korax.cpp and a_teleportother.cpp that used
	weird parameters.
- Changed FDecalLib::GetDecalByName() so that it does not call GetDecal() on
	the decal it finds, so it can be used to get decal groups.
- Fixed: Saving a game on one version of a map, then adding a BEHAVIOR to it,
	then reloading would not fully invalidate the player when starting a new
	game after the resulting error message. (G_NewInit now initializes players
	to PST_DEAD).
- Added a screenshot_dir cvar to allow automatically-named screenshots to be
	saved somewhere other than the current directory.
- Fixed: M_ScreenShot left the display locked if it could not open the file to
	write to.
- Added decals for the marine hitscan weapons. (I think it's funny that the
	term "hitscan" has come to be used to describe Doom's instant-hit weapons
	even though it comes from Build. :-)

January 17, 2004
- Fixed: PIT_CheckOnmobjZ would not let things stand on corpses.
- Fixed a bug in A_MinotaurLook where I forgot to convert a special1 reference
	to a tracer reference.
- Fixed: Obituaries were shown when voodoo dolls died.
- Fixed: Light_Fade and Light_Glow divided by zero when using zero as the
	tics argument.
- Fixed: Killing a PlayerPawn that isn't attached to a player crashed.
- Fixed: Summoning before starting a game crashed.
- Fixed: Block everything lines did not block railguns.

January 13, 2004
- Fixed: +moveup and +movedown did not work with the fly cheat.
- Fixed: The Sentinel was missing the MF_DROPOFF flag. Also reduced its
	"bouncing" when it was in a float. I still wasn't satisfied with that, so
	I took its MF_FLOAT bit away.
- Fixed: The Strife flamethrower's refire state wasn't using frame B.
- Fixed: Acolytes only used frames A and B in their chase states because I
	forgot to change them when copying and pasting.
- Removed the nightmare warning when starting a bloodbath game in Strife.
- Fixed: Nightmare skill ignored the starting map defined with episodedef.
- Changed sv_fastweapon 2 handling so that it only applies to weapon
	psprites and not flash psprites.
- Changed Thing_Activate/Deactivate so they can be used to prevent frozen
	corpses from shattering automatically after a delay. (They can still be
	shattered by shooting them or pushing them off a ledge, however.)

January 12, 2004
- Changed AKey::TryPickup so that it doesn't fail if the player already has a
	key of the same type.
- Fixed: The TranslucentLine special could not used in a script if a line was
	used to activate the script.
- Changed the damage amount for automatic death from 10 thousand to 1 million,
	for people who like really strong monstres.

January 8, 2004
- Added some more player properties that let you add and remove player powers
	through ACS.
- Renamed pw_shield and pw_health2 to pw_unused1 and pw_unused2 because Heretic
	never used them. For the sake of savegame compatibility, they have not been
	removed.
- Changed the dragon skin bracers so that when they're used outside of Hexen,
	they add 50 points of armor. Also changed the armor bonus so that if you have
	more than 200 armor points, picking one up won't drop you down to 200.
- Added the WIF_AMMO_OPTIONAL flag so that the fighter's hammer and axe can be
	specified as using ammo so that they show up in Doom's fullscreen HUD.
- Changed masked texture drawing so that Y offsets behave like any other walls:
	by texel unless the texture requests otherwise.
- Changed APuzzleItem::ActivateArti() so that it always plays *puzzfail if the
	puzzle item could not be used.
- Fixed: Splashing on a fake floor with SECF_CLIPFAKEPLANES set would use the
	main sector's floor terrain instead of the control sector's floor terrain.
- Moved even more functionality out of A_WeaponReady so that weapon ready
	animations can use delays longer than one tic and still fire well.
- Fixed my September 25, 2003 "fix" of the massacre code so that it doesn't
	make already dead bodies shootable.
- Changed P_SightCheckLine() so that it also uses the absence of ML_TWOSIDED as
	an indicator to stop the search, as it did a long time ago.
- Fixed: A_M_Refire did not terminate the attack if the marine had no missile
	attack and the target had moved out of range.
- Fixed: DTA_VirtualHeight scaled the texture's y location by the display's
	width instead of its height.
- Added sprite renaming so that unique actors can use unique sprites. Only
	sprites in the main IWAD are renamed, so if you want to supply a new sprite
	in a PWAD, you need to use the sprite's new name instead of its old name.
	Sprites are renamed as follows:
	heretic.wad:	HEAD -> LICH

	hexen.wad:	ARM1 -> AR_1
			ARM2 -> AR_2
			ARM3 -> AR_3
			ARM4 -> AR_4
			BARL -> ZBAR
			CAND -> BCAN
			GIBS -> POL5	(this makes it the same as Doom's gib sprite)
			ROCK -> ROKK
			SUIT -> ZSUI
			TRE1 -> ZTRE
			TRE2 -> TRES
			WATR -> UWAT	(unused, but Strife also has a WATR)

	strife1.wad:	ARM1 -> ARM3
			ARM2 -> ARM4
			BAR1 -> BARC
			BARL -> BBAR
			BLST -> MAUL
			CNDL -> KNDL
			LOGG -> LOGW
			MISL -> SMIS
			PMAP -> SMAP
			POT1 -> MPOT
			SHRD -> SHAR
			SHT2 -> MPUF
			SPID -> STLK
			TLMP -> TECH
			TRE1 -> TRET
			TRCH -> TRHL
			VASE -> VAZE
- Fixed: The Doom Allmap powerup played the normal item pickup sound instead of
	the powerup pickup sound.
- Fixed: Fog boundaries were still drawn when using a fixed colormap.

January 6, 2004
- Fixed: R_InitTextures() did not ensure that the final TEXTURE1/TEXTURE2 lumps
	had not already been read, so it could end up loading them with the wrong
	PNAMES. The easiest example of this bug is to start the game with:
	-iwad doom2 -file doom doom2
- Fixed: You could take Heretic keys but you couldn't check them with ACS. Also
	added support for doing both with Hexen keys, since it was missing.
- Added some checks to A_SpawnFly to appease anybody who tries to break things
	by using dehacked patches where they don't belong.
- Fixed: If you used spynext/spyprev to look through another player's eyes and
	that player quit, the game would crash because it will still try to draw
	through that player's eyes.
- Added a DEM_SINFCHANGEDXOR message for flag cvars that alter server settings
	(i.e. all of them). The reason for this is because if you exec a script that
	alters multiple flags, only the last change would take effect, because they
	don't get processed until after the script finishes execution.
- Fixed: G_AddViewPitch() adjusted LocalViewPitch even when the dmflag
	DF_NO_FREELOOK was set.
- Fixed: PIT_StompThing was missing the MF2_TELESTOMP check for Heretic/Hexen.
- Fixed: Starting a game with the dmflag DF_NO_FOV set would set everybody's
	view to an FOV of 0 because the dmflags callback gets called before the
	arbitrator's DesiredFOV is initialized.

January 2, 2004
- Changed P_FinishLoadingLineDefs so that it rounds the wall length to the
	nearest integer when determining TexelLength instead of always round down.
- Fixed: Using an empty string with HUDMSG_TYPEON caused a crash.
- Fixed: A buried wraith could enter its pain state while rising from the
	ground and not properly finish raising, so its bottom portion would remain
	clipped for the rest of its existance.
- Fixed: Using a switch to start a script on another map would not make the
	switch switch.
- Fixed: Sliding along the backside of a blocking two-sided line was bad.
- Fixed: The second sky on a map defaulted to -NOFLAT- instead of the same
	texture as the first sky.
- Moved the key blocks from Heretic's fullscreen HUD so that they don't overlap
	the health vial.

December 13, 2003
- Added another case to ScanForFlatHack to fix darkhour.wad: F_START - flats -
	FF_END - more flats - F_END. I'm surprised it worked before, but it did, so
	I'm inclined to again make it work unmodified, even if the wad _is_ wrong.

December 12, 2003
- Added a hack check for Doom 1's BIGDOOR7 texture, which y offsets its patches
	at -4. (Doom clamped all negative patch y offsets to 0, which is why it shows
	up okay in Doom.)
- Added a fix to the blockmap tracers where all the blocks along the trace are
	crossed on their corners.
- Fixed a potential crash in DBaseStatusBar::DrawMessages() when a HUD message
	removes itself as part of its drawing process.
- Fixed: A few of the Strife weapons were erroneously defined with WIF_NOALERT.
- Fixed: Sky textures defaulted to 0 if a map had a MAPINFO that did not
	specify the sky. Now they default to -NOFLAT- so you don't have to worry
	about division by zero in R_DrawSkyStriped if the map tries to show a sky.
- Fixed: The floorLowerAndChange type for EV_DoFloor modified sec instead of
	a temporary, which could cause crashes at worst and odd behavior at best
	because sec is used again to determine whether a floor moved instantly.
- Changed a DivScale19 in R_RenderMaskedSegRange into a SafeDivScale19.
- Fixed: Trying to use the mdk command before starting a game caused a crash.
- Fixed: CreateFrameBuffer would not properly retry.
- Changed the maybedrawnow recursion inhibitter to use the current state
	of the screen object instead of a local static variable.

December 8, 2003
- Fixed: If a wad had TEXTURE1 and TEXTURE2 lumps, then any duplicates in
	TEXTURE2 took precedence over TEXTURE1. It is supposed to be the other way
	around, with TEXTURE1 taking precedence over TEXTURE2.
- Prefixed the names of the Strife grenade launcher actors with "Strife".
- Fixed: DDoor did not serialize m_LightTag.
- Fixed the P_TranslateTeleportThings rewrite so that it sets the Teleport
	special's TID to 1 instead of the tag.
- Added a check for MNTRZ0 to AT_GAME_SET(Minotaur).
- Fixed: The chaingun flash only showed frame one and not both frames one and
	zero.

December 6, 2003
- Rewrote P_TranslateTeleportThings() so that it only assigns TIDs to things
	in sectors with tag 0.
- Fixed: Teleporters by TID didn't work.
- Fixed: P_SpawnMissileXYZ spawned floor/ceiling huggers as if they could move
	with a vertical component to their velocity. They can't, so it could result
	in very slow moving projectiles when aiming at something nearby in the X/Y
	plane but far away on the Z axis, because most of the projectile's speed would
	try to go on the Z axis.
- Changed the Minotaur state fixup to be based on the presence of MNTRZ1
	instead of the game type.

December 5, 2003
- Fixed: When I went back to the blockmap-based sight code, I forgot to bring
	over the enhancements for block-everything lines I had made for the BSP-
	based sight code.
- Added a second argument to Teleport and a third argument to Teleport_NoFog
	specials. This is a sector tag to filter the teleport dests with. Only
	dests in a sector with a matching tag will be selected if the tag parameter
	is non-zero. If tid is zero and tag is non-zero, then the old (and slow)
	teleport dest based on sector tag is used so that Mordeth's trick can work.
- Added support for the BOOM local door light effect by adding an additional
	parameter to all the Door_* specials to serve as the lighttag parameter.
	The first argument still determines the door to open, so unlike BOOM, you
	can use the effect with remote doors if you like. In the case of the
	Generic_Door special, OR the type (the third argument) with 128, and the
	first argument will be used as the lighttag parameter instead of the tag
	parameter.
- Fixed two bugs with using the ACS setfont call to create fonts from images:
	GlobalKerning was left uninitialized, and they weren't added to the global
	font list, so they were recreated every time they were setfont'ed.

December 4, 2003
- Fixed: Voodoo dolls would also trigger the teleport zoom.
- Added 2048x2048 as the maximum size for a patch as a simple sanity check.
- Added a fix to the console's maybedrawnow() function to prevent recursive
	calls to it.

December 3, 2003
- Fixed: The transfer lights specials are supposed to copy the source sector's
	light level instead of propagating along changes from other transfer lights
	specials.
- Added an armor display to Heretic's fullscreen HUD to match Doom's.
- Added a check for a NULL spot to Earthquake::Tick() so that if somebody
	removes an earthquake's spot before the quake is over, it won't crash.
- Fixed: The Boom use-through flag was only being translated to SPAC_USETHROUGH
	for lines with generalized line types and not for lines with normal line types.
- Fixed: P_ActivateLine() did not consider SPAC_USETHROUGH lines when deciding
	if it should flip a switch texture.
- Fixed: In EV_DoCeiling(), ceilLowerToNearest made the ceiling go up instead
	of down.
- Fixed: PIT_AddThingIntercepts() did not add anything the trace started in,
	because none of the thing's sides faced the start of the trace.
- Added a check to A_FireCGun() to try to catch Dehacked patches that do
	naughty things to the chaingun's flash states.
- Fixed: The bNoDecals property was not copied to every texture in an
	animation range.
- Added the "range" keyword to ANIMDEFS so that it can be a true replacement
	for ANIMATED.
- Fixed: Crushers in Hexen made monsters disappear instead of turning them into
	piles of giblets.
- Changed P_SpawnPlayer() so that it doesn't telefrag *everything* inside the
	player. Only monsters and other players will be telefragged now.
- Fixed: Hurting a voodoo doll and then dying from something else didn't
	completely kill you.
- Fixed: mouse_sensitivity was no longer affecting mouselooking.

November 26, 2003
- Fixed: Ceiling type ceilRaiseToLowest (used exclusively by Ceiling_Generic)
	set the direction to -1 instead of 1.
- Fixed: P_TranslateLineDef() ignored the BOOM passthrough flag due to
	bad ordering.
- Fixed: A_WeaponReady did not center the sprites in case they had been
	repositioned earlier. (Only really an issue with Hexen.)
- Fixed kerning support in V_BreakLines.

November 24, 2003
- Moved the +mlook and +strafe button handling for joysticks into
	DI_JoyCheck().
- Changed bots.cfg loading so that it is relative to progdir instead of the
	current directory.
- Removed support for loading zdoom.ini from the user's profile directory
	under Windows.
- Added Strife's acolytes.
- Added Strife's rebel(s).
- Added Strife's beggar(s).
- Added Strife's zombie spawner.
- Fixed: No map names were shown for custom maps in the intermissions.
- Added simple default kerning for fonts so that DBIGFONT can use it to
	overlap the edges of two adjoining character cells. It does not support
	per-character kerning pairs and probably never will.
- Added error checks to invnext, invprev, and useflechette so that they won't
	crash if you try to use them before starting a game.
- Fixed: Picking up a DECORATE item would clear its special, so you wouldn't
	be able to pick it up again if it respawned.
- Added translucency to lots of Heretic and Hexen actors.
- In PIT_CheckThing(), any checks against a bridge will treat the moving
	actor as if it has MF2_PASSMOBJ set, even if it doesn't. This lets scrolling
	floors carry scenery items underneath a bridge without causing the chaos
	that removing MF2_PASSMOBJ globally would cause.
- Removed the dead player check from CheckIfExitIsGood() so that dead
	players can exit a level, as they could in Doom.
- Added god mode and invulnerability as things that can replenish your air
	supply, so you won't die almost immediately if you spend your time
	underwater with them on and then they go away before you surface.
- Added checks to D_PostEvent so that it won't turn the players head when
	the game is effectively paused.
- Added a new player flag, CF_WEAPONREADY, so that weapons which don't use
	A_WeaponReady (like the fighter's axe) can still bob.
- Fixed: The savegame version number for 2.0.54/2.0.55 didn't get bumped
	up. So the .55 update really only helps people who want to load pre-.52
	savegames. :-(

November 23, 2003
- Oops. Quick update from 2.0.54 to 2.0.55 to let old savegames load again.
	Hopefully nobody downloaded 2.0.54 in the hour it was available.
- The sector an actor resides in now gets stored in savegames, because
	different rules are applied for things spawned at level start than for
	things spawned afterward.
- Added calls to SetWindowLongPtr to take away the window's border in
	fullscreen mode and put it back in windowed mode.
- Fixed DBaseStatusBar::RepositionCoords() so that LilWhiteMouse's Chosen
	ammo icons appear on the fullscreen HUD again.

November 21, 2003
- Added Strife's "Becoming Acolyte".
- Added Strife's zombie.
- Added Strife's grenade launchers.

November 20, 2003
- Added Strife's merchants.
- Added a check for a NULL texture to the player setup drawer, even though
	that should never happen.
- Fixed: GiveInventory would not let you have more than one puzzle item of a
	certain kind because I thought Hexen restricted you that way.
- Fixed: Starting a non-deathmatch game, changing the deathmatch cvar to true,
	and then starting a new game would still show the ARMS graphic on the
	status bar because the status bar graphic was not reloaded.
- Changed the fast floor dropping behavior so that Hexen format maps use the
	Hexen behavior and Doom format maps use the Doom behavior.

November 19, 2003
- Added Strife's peasants.
- Added the Strife translation tables.
- Changed dehacked parsing so that the "Far attack frame" for players cannot
	be changed. Fixes insaned1.deh and insaned2.deh that come with insane.wad.
- Fixed: The intermission screen did not lookup level names.
- Added a check for a NULL target to A_FiredAttack.
- Fixed: Enter, respawn, and death scripts were run with the equivalent of
	ACS_Execute instead of ACS_ExecuteAlways, preventing them from executing
	for more than one player at once. This especially defeats the purpose of
	enter scripts, because those are always run at the same time for each
	player when the level starts, so only the first player would actually
	run any enter scripts.
- Fixed: The read-modify-write map array ops in p_acs.cpp took the array
	index from the world var store instead of the map var store.

November 18, 2003
- Added Strife's Sentinel.
- Adjusted P_SpawnMissileXYZ so that if a missile would normally shoot over
	the player's head, it will be aimed slightly lower.
- Added the first half of Strife's Bishop.
- Added Strife's Crusader (minus its special death action).

November 17, 2003
- Added a check for bad sidedefs to P_SaveLineSpecial.

November 15, 2003
- Added Strife's high-explosive and white phosphorous grenades (but not the
	grenade launchers).
- Fixed: AActor defined both reactiontime and ReactionTime.
- Moved weapon bobbing out of A_WeaponReady so that weapons can bob every
	tic even if A_WeaponReady isn't called every tic. (Such was the case with
	the mauler, and it looked really bad seeing it move jerkily only every six
	or seven tics.)
- Added Strife's mauler, minus the disintegration.
- Added a few of Strife's cheat codes.

November 14, 2003
- Added the Light_Stop line special to stop a currently running light effect.
- Changed the Door_Raise speed checks for monsters in P_TestActivateLine()
	so that they are consistant for cross, use, and push lines.
- Changed text lookups for map names and intermission text so that they
	happen each time they are needed and not just when the MAPINFO is parsed.
- Added a check for the null texture to R_RenderBoundWallSprite.
- Added a check for non-positive-sized patches, so if one tries to load,
	it gets replaced by the new -BADPATCH graphic I just added to zdoom.wad.
- Added support for flechette inventory graphics named ARTIPSB1, ARTIPSB2,
	and ARTIPSB3 that can be used in place of ARTIPSBG to differentiate
	between the different forms of the flechette when a script gives the
	player specific ones.
- Cluster infos now get created the first time they are referenced by a
	map. Without this, all Hexen maps were implicitly on the same hub (the
	"default" one), because Hexen didn't use clusterdef MAPINFO entries.
- Brought back the blockmap-based P_CheckSight and fixed the iterator in
	it and its equivalent in p_maputl.cpp so that it properly handles the
	case where a trace crosses the corner of a block.

November 12, 2003
- Added Strife's flame thrower.
- Added Strife's mini-missile launcher.
- Added Strife's assault gun.
- Added Strife's electric and poison crossbows. However, the poison bolt
	does not have any of its special properties implemented, so it currently
	acts like a super high damage projectile.
- Added all the Strife ammo pickups.
- Added Strife's scrolling sector type.
- Added the Strife weapon preferences to the WeaponPrefs array.
- Added placeholder weapon and ammo slots for the Strife weapons so that
	when/if I add more, I won't need to update the player_t serializer again
	to maintain compatibility with old save games.
- Added StepHeight to gameinfo_t to indicate the maximum height step a
	player can walk up. This is 24 in every game except Strife, which has it
	lower at 16.

November 10, 2003
- Fixed: ANIMDEFS animations animated every frame in the animation instead
	of just the base texture.
- Fixed: Texture animations defined in ANIMATED did not animate each frame
	in the sequence properly.

November 2, 2003
- Stopped using validcount to keep track of which Actors have already been
	checked by P_BlockThingsIterator. P_CheckSight and P_TraceBleed can both
	make validcount go up, so it is totally useless for P_RadiusAttack, which
	wound up doing damage to a thing for each block it touched that was in the
	blast area.
- Added DTA_ClipTop, DTA_ClipLeft, and DTA_ClipRight so that FlatFill can now
	use DrawTexture and draw the textures right-side-up again.
- Renamed negonearray to zeroarray to better reflect its contents.
- Changed PTR_TraceIterator() so that it will look at a line's flags and if
	it doesn't have ML_TWOSIDED set, then it will pretend it doesn't have a
	back side, even if it does.
- Fixed: BFG Marines could crash with a stack overflow during their refire
	pause because A_M_BFGSound() switches the marine back to its chase state,
	which tries to switch it back to its attack state. The solution: Make sure
	the marine's MF_JUSTATTACKED bit is set as long as its special1 is non-zero.
	Then A_Chase won't try to attack.
- Reduced the player's missile range from 20480 to 8192, because Doom's trace
	code is too inaccurate for long traces.

November 1, 2003
- Removed the missile attack from the chainsaw marine.
- Fixed: The cast finale ignored the player's gender setting because it didn't
	actually play the player's death sound from the player.
- Fixed: The Heretic episode 2 ending restored the palette in PLAYPAL instead
	of the one computed from PLAYPAL at the start of the game.
- Removed gamma stuff from FPalette, since Win32Video is responsible for
	handling gamma.
- Changed P_DoCrunch() so that it copies the render style from the crushed
	thing to the gib actor.
- Changed PIT_FloorDrop() so that only Hexen will let things fall with gravity
	when a floor quickly drops. The other games will yank them down.
- Changed missile attacks so that monsters behind block everything lines will
	try to shoot through the lines if they are set for impact activation and
	run a script. The assumption is that the script will remove the blocking
	flag so they can shoot past the line on their next attack.
- Changed back to the BSP-based sight checking for better accuracy.
- Changed the automap so that it uses 12 bits of fractional precision instead
	of 16 in order to display maps that are relatively close to the limits of
	the possible map extents.
- Changed the STCFN121 hack so that instead of discarding STCFN121 if it's
	in the IWAD, it will discard it if STCFN120 and STCFN 122 are not present.
	This should accomodate wads that provide their own fonts and copied it as
	an I instead of a y, and also wads that provide a real set of lower-case
	characters.
- Changed the sector soundorg calculation so that it can't overflow.

October 31, 2003
- Added Strife's Reaver. Aside from its unknown flag, it should be fully
	functional.
- Added Strife's dagger-wielding fist. It has a chance of doing 0 damage,
	which seems odd.
- Extended P_SpawnPuff() so that you can give a puff a crash state, and then
	it will use that state if something was hit.
- Added a simple status bar for strife.

October 30, 2003
- Moved SKYFLATNAME into the gameinfo structure.
- Added a bunch more Strife things.
- Restricted the use of SPAC_OTHERCROSS to just the BOOM generalized line type
	containers, since those are the only specials it's needed for.
- Fixed: Each level's intermission name was always drawn as text, even if
	it had a graphic that was supposed to be displayed instead.
- Rewrote the flat hack used to make the flats in Gothic DM 2 load and
	verified that it once again works.

October 29, 2003
- Added a few Strife things.
- Fixed another Doom bug/oversimplification: PIT_AddThingIntercepts() checked
	the trace against a line running through the middle of the thing. Now it
	checks against the thing's actual bounding box, so chainsawing big things
	like the Spider Mastermind is much easier now. This also means
	P_LineAttack() doesn't need to position puffs/bullet splats closer along the
	trace since the hit location won't be inside the thing anymore.
- Changed blockmap thing linking so that things link to every block they touch
	and not just the block at their center, fixing an old Doom bug.
- Changed the summon command so that it spawns things in front of you based on
	their radius rather than a fixed 64 units away.
- Fixed: The joystick read rate was determined by the framerate instead of
	being a constant 35 Hz.

October 28, 2003
- Changed: Decals are not allowed on warping textures by default. You can allow
	them by appending "allowdecals" to the warp statement in ANIMDEFS. (e.g.
	"warp texture foofoo allowdecals")
- Fixed: Bots whose teams were defined by name instead of numbers would always
	be on the red team (team 0).
- Fixed: Puzzle items need to stick around in multiplayer games.
- Fixed: Saving in multiplayer games would try to save to the same full path
	on all machines, even if the different machines had ZDoom installed in
	different directories. The only one who was guaranteed to be able to save
	because of this was the person who used the save command.
- Fixed: Poison damage in multiplayer games did not respect the teamdamage
	setting.
- Added a minimum size limit of 1024 bytes for MOD/stream songs to work around
	a bug in the current version of FMOD 3.70.
- Fixed: Sprites with weird rotation flipping (e.g. the Hell Knight) did not
	display properly.
- Fixed: Even things that are not monsters could activate monster-allowed
	lines in BOOM (and presumably DOOM).
- Fixed: Compat_useblocking also needs to block non-use lines with specials,
	not just use lines.
- Fixed: Assigning a special to a line that would normally block the use of
	lines behind it would enable those lines to be used.
- Fixed: If a texture had the bNoRemap0 flag set and it was part of an
	animation sequence, the flag would not be propagated to the other
	textures in the sequence.
- Added a check for a NULL SaveComment in the for loop that draws the comment
	on the save/load menus.
- Fixed: Hexen does not always pass the three ACS script arguments as the
	first three variables as a script. Instead, it looks at the number of
	used arguments and only copies the arguments that are used, initializing
	the rest to 0.
- Fixed the COLORMAP fixer so that it works correctly for palettes where
	an exact match for color 0 does not exist.
- Added a check for empty VERTEXES lumps to the map loader.

October 27, 2003
- Fixed: You could not override the levelnums of the IWAD maps with levelnums
	pointing to differently named maps because levelnums were search first to
	last, and there was no check done to make sure that previous matching
	levelnums were removed.
- Moved the R_Init() call before DecalLibray.ReadAllDecals() so that decals
	can use any textures (including the plasma ball sprite).
- Fixed Heretic intermission problems: The maps were not shown because the
	cluster numbers changed when I moved its MAPINFO into zdoom.wad, and the
	"Now entering:" and "Finished" texts were incorrectly centered.

October 25, 2003
- Increased MAX_ACS_TRANSLATIONS to 255.
- Added APROP_Invulnerable.
- Changed savegames so that they store textures by name and usetype instead of
	by index. Also removed support for loading save games created with ZDoom
	versions earlier than 2.0.43 just for the purpose of removing obsolete code.
- Fixed: Unscaled skies taller than 128 were positioned incorrectly.
- Fixed: Redefining a clusterinfo with MAPINFO would not zero out the old
	clusterinfo.
- Fixed: When a palette had no duplicate entries, it used the blue and green
	parts of color 255 to pick a replacement for color 0.

October 24, 2003
- Added MF4_ACTLIKEBRIDGE flag.
- Fixed: Inventory items would fall through invisible bridges.
- Changed the P_TeleportMove() call in P_SpawnPlayer() so that it uses ONFLOORZ
	instead of mobj->z, which fixes some stuckiness that can occur with start
	spots that are too near a wall.

October 23, 2003
- Fixed: Overlapping bridge things would stand on each other.
- Changed TX_START/TX_END loading to load textures from first to last instead
	of last to first, so ANIMDEFS animations that use them will behave as
	expected.
- Fixed: m_filter did not average the mouse input. It just cut it in half.
- Fixed: Mouse pitch only changed in increments of 16.
- Fixed: ZDoom set the display mode twice at startup: Once at the very
	beginning and again right after its initialization finished.
- Fixed: AImpactDecal::StaticCreate() checked the texture on a wall using
	translation, so it would stick decals on animated textures unless the
	first frame was showing.
- FMOD_File_SetCallbacks() does not seem to work with FMOD 3.70. Fortunately,
	FMOD 3.70 also makes it obsolete for my purposes, so I can work around it.
	(Okay, so it was fixed again in a later FMOD 3.70. But I already removed
	the use of FMOD file callbacks, so I won't undo my changes now.)

October 22, 2003
- Rewrote my TAG_MORE handling to use va_list and make GCC happy.
- Fixed the default Heretic/Hexen automap wall colors so that they look
	good on the parchment background.
- Fixed: FindShortestTextureAround() and FindShortestUpperAround() returned
	their results as ints (without a fractional part) instead of fixed_ts.
- Changed the mapthing position fixing so that it only applies to those things
	that request it (specifically, Heretic's WallTorch).
- Moved all the default MAPINFO out of the executable and into zdoom.wad.
	As a side effect, Dehacked patches can no longer change the music played
	on a map. (Do any patches actually do this?)
- Converted all the decals in zdoom.wad into PNGs. I was considering doing
	the same for the crosshairs, but XHAIRB2 was the only one that got smaller
	from the conversion from IMGZ to PNG.

October 20, 2003
- Added the CreateTexture() method to the texture manager. It checks the
	contents of a lump to determine what type of image it contains, creates a
	texture of the appropriate type, and adds it to the database. Everything
	that was previously hard-coded to use patches now uses this instead. The
	primary reason for this: PNG texture support. Just make sure your PNGs are
	paletted. They do not need to have the exact same palette as the one
	inside PLAYPAL, since they will be remapped to fit the game palette. ZDoom
	also supports two proprietary PNG chunks:
	grAb (8 bytes):
			SIGNED DWORD x
			SIGNED DWORD y
		grAb stores the offset information and works just like the
		equivalent information in a patch. The name is taken from the
		ILBM GRAB chunk, which does the same thing for ILBMs.
	alPh (0 bytes)
		alPh is valid for grayscale images only (colortype 0). Its presence
		signifies that the image data is really an alpha channel and contains
		no color information. This is used by all of the decals in zdoom.wad.
- Added the m_filter cvar (false by default) to smooth out mouse movement for
	those unfortunate enough to be stuck with a mouse sampling rate of just 40 Hz.

October 18, 2003
- Added super-preliminary support for playing Strife as an IWAD.
- Added fading "Read This!" screens.
- Morphed players are now allowed to predict their positions.
- Revisited the local player turning from October 10. My original
	implementation had the players transmit the direction they wanted to face.
	Unfortunately, this messes up the gauntlets and chainsaw, so I have reworked
	it so that the players again send deltas. Any amount that accumulates between
	packet sends is added to the player's local view angles. When they get sent,
	they are zeroed.

October 17, 2003
- Fixed: GetLightLevel() used some globals instead of this to get the sidedef.

October 16, 2003
- Fixed: Using a cycling alias to rapidly change the player's color would
	animate the player's status bar face at each color change.

October 15, 2003
- Updated to FMOD 3.70.
- Did more cleanup for GCC. Its "variable might be used uninitialized"
	warnings are very annoying. Oh well.
- Did some cleanup so that Visual C++ 6 will compile without warnings. Alas,
	it has some really weird errors where it complains about not being able
	to #include .h files that are excluded inside an #ifdef block. They do not
	effect the compilation any and seem to be generated before cl is even run;
	it just looks untidy. Trivia, since I now have the opportunity to check:
	When built with exactly the same settings, compared to the VC6 version, the
	VC7 version is ~100k smaller, marginally faster, and takes slightly less
	time to build from scratch.
- Added the MAPTEXF_WORLDPANNING flag to indicate that a maptexture wants to
	be panned by world units instead of texels, so you can create high-res
	drop-in replacements for existing textures.
- Fixed: The grid was not drawn properly on a rotated automap because the
	x or y coordinates of the gridlines were not reset after being rotated. It
	still looks bad if you turn off follow mode, but I'd rather not worry about
	that.
- Fixed: Movement prediction did not preserve the ordering of blockmap links,
	so the local player would always be the first entry in his blockmap cell.
	The effects of this were first noticed as Pain Elementals reliably causing
	the game go out of sync eventually. I imagine it probably caused desyncs in
	other cases, too.

October 14, 2003
- Fixed: You could push actors with the MF2_PUSHABLE flag while doing movement
	prediction, which would almost invariably make network games go out of sync.
- Uncommented the check that excluded the loading of STCFN121 only if it was
	in the main IWAD. Note to anybody modding ZDoom who loads a resource wad
	before the IWAD: This check in the FFont constructor assumes the IWAD is
	at position 1. You will need to change this for your mod.
- Fixed: Pig players could still change back to their original weapons.
- Replaced the use A_BeakReady with A_WeaponReady. A_BeakReady was basically
	just a stripped-down version of A_WeaponReady, so A_WeaponReady works just
	as well.
- Added the ActivateMorphWeapon method to APlayerPawn as a replacement for
	P_ActivateMorphWeapon().

October 13, 2003
- Improved the error-checking in FPatchTexture::MakeTexture() so that it will
	detect overlapping spans.
- Fixed: Scaled, lower unpegged masked textures were positioned incorrectly
	vertically.
- Fixed vertical positioning of scaled sky textures.
- Made MF_COUNTITEM actors dynamically counted like MF_COUNTKILL actors.
- Fixed: Morphed players returned to their player skin unless playing Hexen.
- Fixed: The chicken and pig players did not have MF3_NOBLOCKMONST set.
- Moved P_MorphPlayerThink() into an overridable method of PlayerPawn.
- Fixed: Colored sectors changed the color of the crosshair.

October 11, 2003
- Dropped MISSILERANGE back to its original value (2048 units) and added a new
	PLAYERMISSILERANGE for player weapons, which is still at 20480 units.

October 10, 2003
- Fixed: Using the last inventory item in a Doom game would not redraw the
	Doom guy's face on the status bar until the next time it animated.
- Fixed: The view was interpolated when switching in and out of chasecam mode.
- Changed player turning to be local. Also changed the mouse reading so that
	it happens every frame instead of every tic. Together, these two changes
	keep the mouse feeling responsive even when the framerate drops below 35 FPS.
	It also helps a lot when playing with vsync enabled.
- Modified the interpolation system so that it knows what it is interpolation
	(beyond being just a generic fixed_t *). Now it can be stored in save games.
- Fixed: Ceiling_CrushAndRaise and similar specials that passed a 0 height
	to EV_DoCeiling/EV_DoFloor did not interpolate.
- Fixed: Thing_Projectile2 did not pop its parameters off the stack.
- Modified tab completion slightly. Pressing tab once now displays a list
	of possible completions. Pressing tab multiple times will continue to
	function as it did before.
- Added the fading notify text I had written for my Duke port.

October 8, 2003
- Changed titlepic and conback drawing to always be unmasked, because
	2nd_enc.wad's TITLEPIC has holes in it.
- Stripped out a bunch of obsolete code from v_draw.cpp.
- Moved the state of the automap cheat into the am_cheat cvar.
- Changed P_TestActivateLine() so that monsters cannot activate Door_Raise
	lines with speeds of 64 or above, in order to mimic Doom.
- Fixed: Vertical view doubling crashed.
- Made the secret wall color on the automap configurable through the
	am_secretwallcolor cvar.
- Added a ga_togglemap gameaction, because the new parchment can cause
	commands to dispatch while the background is drawing. If one of those
	is togglemap and it gets handled right away, the mapback texture gets
	unloaded, and AM_clearFB will crash.
- Added the parchment background used by the Heretic and Hexen automaps.
- Added some support for console fonts that don't use 8x8 character cells.
- Fixed: A_WraithMissile was missing a NULL target check.
- Fixed: The player did not make any noise during the cast finale.
- Added the player's attack sound to the finale.
- Added a check to the cast finale for monsters that have been dehacked to
	have no attack states so that they won't crash the finale.

October 7, 2003
- Added DoomBounce, HereticBounce, and HexenBounce as valid properties for
	DECORATE projectiles.
- Fixed: Monster telefrags still reported that the monster had killed the
	player normally. (Note: The only time a monster will normally be able to
	telefrag a player is on Doom2 MAP30, although this can be changed with
	MAPINFO.)
- Made AM_changeWindowLoc scale the window movement so the automap will scroll
	at the same rate no matter what resolution you play at.
- Fixed: Reopening a door while it was closing would not play the opening
	sound.
- Fixed: You could still (de)activate dead monsters. Activating a dead monster
	would make it disappear, because dead monsters usually have their next frame
	set to NULL.
- Fixed an off-by-one error for the vertical positioning of the elements on
	the Hexen status bar.

October 3, 2003
- Fixed: Missing TAG_DONE is WI_slamBackground().
- Fixed: ZDoom no longer tries to read non-V3.0 Dehacked patch files. Earlier
	ones are apparently all binary, which has never been supported and could
	make it crash.

October 1, 2003
- Added support for specifying animated texture sequences in ANIMDEFS by name
	instead of by number. i.e. Instead of:
	texture x_water1
	pic 1 rand 5 12
	pic 2 rand 5 12
	pic 3 rand 5 12
	pic 4 rand 5 12

	You can write:
	texture x_water1
	pic x_water1 rand 5 12
	pic x_water2 rand 5 12
	pic x_water3 rand 5 12
	pic x_water4 rand 5 12
- Added a check for the front sky layers of parallax skies so that the front
	texture does not have color 0 remapped, because it really does use color 0
	as transparent. (Note that since color 0 is now the transparent color for
	everything, you can use normal transparent regions for front sky textures.)

September 27, 2003
- Changed the transparent color index from 255 back to 0. 0 is more convenient
	because:
	 1) Images that are used as alpha masks (primarily decals) already
			use color 0 as transparent, so they no longer need special processing.
	 2) PNG images need 255 fewer bytes to mark color 0 as transparent than they
			need to mark color 255 as transparent. But this won't really be important
			until I add support for PNG images (which will probably happen, but who
			knows when).
	The only reason I switched to 255 was because that was what BUILD used, so by
	using the same transparent index, I could memory map its tiles read-only and
	use them directly.

September 26, 2003
- Fixed: If a switch defined in a SWITCHES lump used the same "on" and "off"
	graphics, the game would crash. Now it gets skipped, because it's not really
	a switch if it doesn't change its image.

September 25, 2003
- Fixed: Using the MDK cheat always flung the dead things at you. Related, the
	maximum thrust to have something fall forward on death is now 10 units/tic.
- Fixed: ClearInventory always crashed because using GiveInventory to give a
	weapon afterward would not bring the weapon up, so the player's ready weapon
	would be left as something that doesn't exist.
- Fixed: The overlayed automap showed statistics when not viewing through a
	player's eyes.
- Increased MISSILERANGE to 20480 (was 2048).
- Changed the massacre code so that it sets the shootable bit for any monsters
	that have it cleared (such as Serpents, usually), so they die too.
- Fixed: Masked midtextures beneath a fake floor (or above a fake ceiling)
	only inheritted their light level and not their light color from the control
	sector.
- Added code so that when a map thing is spawned directly on a line, it will
	be moved 1/4 unit in toward the middle of the subsector so that it will be
	clipped reliably by the renderer. See the torch right in front of the player
	at the start of Heretic E1M1 for an example of this bad practice.
- Changed: MF2_FLOATBOB actors no longer splash on liquids.
- Fixed: P_AimLineAttack() clamped the player's vrange to 1 degree maximum
	instead of 1 degree minimum, so it would not aim past any two-sided lines
	if you were using 0 autoaim because the toppitch and bottompitch would be
	the same before even entering PTR_AimTraverse. This was the cause of
	chainsaw not always pulling you in and melee weapons sometimes missing
	monsters that were clearly in range.
- Fixed: P_SpawnPuff() used linetarget instead of its hitthing parameter
	to determine if it should play the puff's SeeSound or AttackSound.
- Improved(?) the Bloodscourge so that its initial target search only looks
	in front of the player.
- Fixed: MStaffSpawn used linetarget, but P_AimLineAttack was never called
	to set it.
- Fixed: P_CheckMissileSpawn would destroy ripping missiles if they spawned
	inside something.
- Fixed: Dark servants could not be morphed in Hexen.
- Fixed: MageWandSmoke was not translucent.
- Combined all the WeaponPrefs list for each game into a single list.
- Added text skipping for the Hexen chess ending.
- Fixed: The chessboard finale drawer looked at userinfo.PlayerClass instead
	of CurrentPlayerClass to decide which chess piece to draw, so random players
	would always appear as the fighter.
- Fixed: When V_BreakLines() inserted newlines for word wraps, the default
	text color was restored for the new lines. Now it adds color escape
	sequences after any soft line breaks, but it leaves hard line breaks alone.
- Added support for marking scripts that are "safe for multiplayer". To do
	this, add net after the script header but before the script body. e.g.:
	script 1 (void) net { ... }
	script 1 open net { ... }
	script 1 enter net { ... }
	etc.
- Added the sethudsize ACS command. It takes three parameters:
	sethudsize (width, height, statusbar). The width and height is the size
	of the screen that hudmessage thinks it's drawing on. If this is different
	from the real screen size, the hudmessage will be scaled to make it fit.
	If statusbar is 1, then the height parameter covers the status bar and you
	can draw on top of the status bar. If it is 0, then the hud message will
	be stretched differently depending on whether the status bar is visible or
	not, because the height available to draw in is shorter when the status bar
	is visible. (However, a value of 0 will still let you draw on the status
	bar if the hud message extends below the height you specified.)

	After using sethudsize, hudmessage coordinates also behave differently.
	You now need to specify actual pixel coordinates and not numbers in the
	[0.0, 1.0] range. However, they are still fixed point, so you need to keep
	the decimal point. e.g. If you used SetHudSize (320, 200, 1); and want to
	draw a hudmessage at the center of the screen, you should pass it the
	coordinates (160.0, 100.0) and not (0.5, 0.5).

	The fractional part of the coordinates effect what part of the hud message
	you are positioning:
	For x:	.0 = positions center of box
		.1 = positions left edge of box
		.2 = positions right edge of box
		.4 = centers text inside box
				 .4 can also be added to either .1 or .2 to get .5 or .6

	For y:	.0 = positions center of box
		.1 = positions top edge of box
		.2 = positions bottom edge of box

	e.g. If you used SetHudSize (320, 200, 1);, then the coordinates (160.1, 100.1)
	will position the upper-left corner of the hud message. The coordinates
	(160.2, 100.2) will position its lower-right corner instead.

	To make hudmessage behave as normal, use SetHudSize (0, 0, 0);.

	In summary, use sethudsize for hud messages that are really graphics, and don't
	use it for text (unless you want your text to appear the same size at all
	resolutions, such as a title with a special font or something).

- Added the getcvar ACS command. It returns the value of a cvar as an int,
	so scripts can alter their behavior based on cvars.
- Added the strlen ACS command. It behaves just like its C counterpart.
- Added support for loading compressed GL nodes when regular nodes are
	unavailable.
- Fixed: You could pick up items above your head because P_CheckPosition()
	added an extra 24 units of height to detect when you might step up inside
	another actor. It still does, but now PIT_CheckThing() takes this into
	consideration before touching it.

September 24, 2003
- Fixed a crash bug in A_SorcOffense2: It did not check for a NULL target.
- Added support for compressed nodes. Not only do they take up less space
	on disk than regular nodes, but the also remove the limits on number of
	segs, subsectors, and nodes that normal nodes have. They also store the
	extra vertices as 16.16 fixed point numbers like GL nodes, so split segs
	can have fractional end points.

September 23, 2003
- Finished switching from memory-mapped I/O to normal file I/O. Partly, this
	was done for portability, because some systems don't support MMIO, but
	mostly it was done because the in-memory format of textures no longer
	matches their on-disk format, so I can't use the wads themselves as a
	texture cache anymore. Since I can't do that anymore, there's not much
	reason to dedicate any address space to them.

September 13, 2003
- Added r_skyboxes cvar so that skyboxes can be turned off.
- Fixed: Using noinventorybar in MAPINFO still showed the selected artifact
	in the Doom status bar.
- Note to self: I am no longer using Whole Program Optimization because:
	1. It makes the executable around 200k bigger right now.
	2. Its performance improvements are debatable. In fact, ZDBSP is about
		 half a second slower on a big map when using it.
	3. It makes the linking stage of a release build take a lot longer
		 (which would be worth it if it actually helped, but I haven't seen it).
- Changed the PNG reader so that it caches all basic chunk information in
	memory the first time the file is scanned so that chunk searches can be
	much quicker. This means that when you have a lot of .zds files, the save
	and load menus should hopefully appear faster the first time you use them.
	In the process of implementing this, I discovered a glaring bug:
	G_DoLoadGame() never closed the file after loading all the data from it.
- Added a check to disallow predefined 2D images as textures on walls, floors,
	and ceilings at map load time. I purposefully left this check out of ACS
	because they *can* be useful, so it's nice to have some way to use them.
- Added TX_START/TX_END markers for new graphics. They can override existing
	wall textures and flats.

September 9, 2003
- Fixed: STFBANY was not added to the texture manager, so multiplayer Doom
	games crashed when the status bar tried to draw it.
- Fixed: Options menu titles were drawn using SmallFont instead of BigFont.

September 6, 2003
- Fixed: Trying to delay for 0 tics in a script would delay for 4294967296
	tics instead.

September 2, 2003
- Fixed relative lighting was never applied to masked midtextures because I
	had the check contingent upon the absence of a sector colormap. But every
	sector always has a colormap; I should have been checking for a black
	fade instead.

August 28, 2003
- Fixed: Spawning an item with ACS that was Dehacked would not transfer the
	special or TID from the original item to the dehacked item.
- Fixed: AnimType was left uninitialized when parsing ANIMDEFS.

August 14, 2003
- Fog boundaries alone are no longer sufficient to clip a sprite.

August 13, 2003
- Fixed mirror flipping in R_ProjectSprite(). I was treating tx as if it were
	in screen coordinates, but it's not. This was generally unnoticable because
	tx has 16 fractional bits, so subtracting it from viewwidth was vear near
	subtracting it from 0.
- Changed sprite clipping by slopes to be more like sprite clipping by unsloped
	floors and ceilings.
- Removed the check for MF_SOLID in P_TestMobjZ(). Nonsolid things should
	still be blocked by invisible bridges. (So no more corpses will fall through
	invisible bridges.)
- Added the ability for monsters to walk on invisible bridges. Note that the
	bridge's top must be below or at the monster's height. Bridges that require
	even a slight step up will still be impassible to monsters. (For now. Maybe
	some time in the future I will change that. Maybe.)
- Fixed: R_ProjectParticle() could project 0-width particles. This could cause
	a single column of a fog boundary behind the particle to be drawn more than
	once.
- Fixed a bug in R_RenderMaskedSegRange() that caused one-pixel wide ranges
	to not be drawn when using r_columnmethod 1.
- Added support for extended ID666 amplification tags in SPC files. Doing so,
	I discovered one change from snesapu 0.95 to 0.98: SetDSPAmp's scale has
	12 more fractional bits in 0.98 than it did in the earlier versions.
- Updated SPC support for snesapu.dll version 1.01, meaning that I allowed for
	a higher minimum version returned by SNESAPUInfo. Nothing else needed to
	change, so I'm not sure why the minimum version got bumped. I did need to
	change the mixer parameter of SetAPUOpt from 0 to -1, but 0 was also defined
	as no mixer in snesapu 0.95, so I'm not sure why it worked with the older
	DLL.
- Added a check for textures that try to reference a patch not in the PNAMES
	lump.

August 11, 2003
- Removed the +1 from the damage calculations in PIT_RadiusAttack(). I'm not
	sure what that was doing there.
- Changed the VirtualProtect() call that makes the self-modifying code
	writable from PAGE_EXECUTE_WRITECOPY to PAGE_EXECUTE_READWRITE after
	Timmie found out Win9x doesn't know what PAGE_EXECUTE_WRITECOPY is.

August 5, 2003
- Changed the ignoreInvisibility parameter of P_CheckSight() to a flags
	parameter so that I can pass another flag (2) to indicate that the sight
	check should see past "block everything" lines (the former default). By
	default, sight checks no longer see past "block everything" lines, so
	monsters will not be able to melee attack you through them, and explosions
	will not be able to do splash damage through them.
- Fixed: Hitscan weapons always triggered the front side of an impact line,
	even when they struck the back side.
- Added a fifth argument to Sector_SetColor to control how much the
	palette should be desaturated. 0=leave it alone, and 255=shades of
	gray. The palette is desaturated before it gets colored. The test color
	console command can also take this parameter now.
- Added a new polyobject start spot (#9303) that causes the polyobject to
	deal damage whenever it touches a player.
- Changed sprite loading so that you can have sprites with gaps in their
	defined frame ranges again. (e.g. create frames A-D and H-N but not E-G)
- Fixed: Minisegs were messing up the polyobject seg detection code when
	GL nodes were used.
- Fixed: Fullbright sprites would be drawn fullbright in levels with their
	own fadtable (IOW, every foggy Hexen map) because g_level.cpp never made
	a note for the renderer to look at discover that the level used a custom
	fadetable.
- Added separate floor and ceiling skyboxes. Set the sky picker's second
	argument according to what you want to set: 0=floor and ceiling,
	1=ceiling only, or 2=floor only.
- Fixed: Undefined sky textures are once again replaced by the default
	texture instead of the empty texture.
- Fixed: Shooting a railgun while standing on a ledge could make you fall
	through the ledge because the railgun invisible moves you to the hit
	point in case it needs to make a water splash, then moves you back to
	your start spot. However, when it moved you back, it did not restore
	some important variables like floorz.
- Changed the weaponless marines so that their spawn state does not cycle
	between frames A and B. This holds even if you give them a weapon later
	in a script, but it does not hold for marines that spawn with a weapon,
	even if you take the weapon from them later.
- Fixed: The Heresiarch's orbiting balls did not have their floorz updated
	when the Heresiarch's changed, so if the Heresiarch's head went below its
	original floor height, its balls would rapidly jump between its head height
	and the old floor height. Since it seemed relevant, I also did the same
	for ceilingz. I also did it for the SorcFX2 effect (invulnerability
	indicator).
- Added support for nested skyboxes. Now you can have one skybox look into
	another skybox. The changes required were surprisingly minor.

August 2, 2003
- Fixed: Returning from one function to another function failed to take into
	account the presence of the calling function's return info when it restored
	its local variable pointer.

July 31, 2003
- Fixed a crash when using path followers with incomplete paths.

July 30, 2003
- Added CheckModified() method to FTexture for the benefit of ZDoomGL.
- Added nonexistant texture check to the warping texture setup.

July 28, 2003
- Removed the ScaleCopy canvas from DBaseStatusBar, because everything is now
	drawn to the screen directly even when the status bar is scaled.
- Changed the pitch calculations in the DSimpleCanvas constructor to provide
	better wall drawing performance at all resolutions.
- Corrected ::ST_Y calculation so that a scaled status bar does not have its
	topmost line overwritten by the view window at certain resolutions.

July 25, 2003
- Added DTA_WindowLeft and DTA_WindowRight tags for DCanvas::DrawTexture
	to restrict the portion of the source texture that gets drawn to the
	screen. Changed doom_sbar.cpp to use these, keeping in mind that they don't
	clip the vertical range of the texture.
- Improved the behavior of R_DrawMaskedColumn(Horiz) so that when using
	non-integral scaling and drawing adjacent columns that end at different y
	locations, the shorter column lines up better with the longer one.
- Fixed: R_SetSpanSize_ASM had the x and y sizes swapped when called in a
	release build but not a debug build. To fix, I just removed its __regargs
	entry point.

July 20, 2003
- Disabled interpolation for sliding polyobjects that complete their movement
	in fewer than three tics. (The moving crate effect in Massmouth 2 this fixes
	needs two tics to reloop the crate.)
- Turned off interpolation of instant movement floors and ceilings so as not
	to ruin the fake moving sector effect used in a few wads.
- Added a call to R_SetupBuffer() at the end of R_RenderViewToCanvas so that
	the ylookup table will be correct if the game was saved while watching the
	automap.
- Fixed: Every two-sided line was storing midtexture information even if it
	didn't have a midtexture.
- Changed ylookup into an array of ints instead of BYTE*s so that I can still
	use the common column drawers for everything even when the viewwindow does
	not start at (0,0). If you were using "dc_ylookup[y]" before, now you need to
	use "dc_ylookup[y] + dc_destorg" to get the same value.
- Fixed: Skybox ceilings could sometimes be left undrawn if they were in the
	same sector as a skybox floor because I was missing a check for plane height
	in R_FindPlane. This only applies to skyboxes; the check was present for
	normal skies.

July 19, 2003
- Fixed spacing of the characters on the finale text.
- Fixed clipping of scaled sprites in deep water.

July 18, 2003
- Fixed: remove was uninitialized in ParseEpisodeInfo().

July 17, 2003
- Moved the P_LoadBlockmap() call so that it occurs after the nodes are
	processed, so if a node build is necessitated, the blockmap gets rebuilt too.
- Fixed detection of empty rejects.
- Stopped loading REJECTs that are too small. They're probably caused by an
	outdated node build, so there contents are invalid and using them it is wrong.
- Added more checks for seg validity in P_LoadSegs().

July 2, 2003
- Removed the FROMCEILINGZ128 #define in p_local.h. I'm not sure what that was.
- Added support for properly tiling wall textures whose widths are not a power
	of 2.
- Fixed: Heretic and Hexen status bars' artifact flash effect was tied to the
	framerate instead of the ticrate.
- Changed the IMGZ loader so that it maps color 0 to 255 and color 255 to 254.
- Changed the cast finale so that it draws "our hero" using the player's suit
	color instead of the default green.
- Changed the BOSSBACK drawing so you can make it some size other than 320x200
	if you want.
- Moved StringWidth() out of DCanvas and into FFont, where it really belongs.

July 1, 2003
- Changed FPatchTexture::MakeTexture() so if it is loading a patch used by a
	decal it remaps color 255 to 254 rather than to whatever is the closest
	matching color in the palette. This is because decals are usually shade
	maps rather than paletted graphics, so changing color 255 to something
	in the middle of the palette looks bad. I also changed it so that it
	contstructs spans from the existing column data instead of rescanning the
	image for the transparent color, so it should be slightly faster, although
	it probably doesn't matter, since each patch will only be loaded at most
	once per level.
- Added a fix for sprites that have some, but not all, of their frames
	defined. I found this one when I tried to play Doom Raider. Ironically,
	it worked in 2.0.47 because I had a bug in the code that detected
	undefined frames. To fix, any undefined frames are made into copies of
	the first defined frame.

June 30, 2003
- Added a check to P_TestActivateLine() so that doors faster than 32 cannot
	be opened by monsters.
- Fixed: If only the right-most texture column of a wall is visible, the
	left-most texture column would be drawn instead.
- Added the ability for the SetFont ACS command to load normal pictures as
	fonts. When used this way, it creates a new font with only the letter A
	defined, and the letter A is drawn as whatever the picture is. This
	effectively allows you to use HudMessage like a HudPic command. The
	drawback to this method is that you cannot use any color translations, as
	you can with real fonts.

June 28, 2003
- Removed i_remapkeypad cvar. The keypad is now always considered separate
	from the main keyboard. This was really just something I had left over from
	the very early days of ZDoom before it even had Quake-style keybinding.
- Added prioritization of HUD messages. Lower-numbered IDs are drawn in front
	of higher-numbered IDs. An ID of -1 is identical to 0, except it gets drawn
	behind everything else.
- Made the puke console command work across the network.
- Fixed a crash bug in the node builder when the back side of a line
	shares endpoints with another seg, but the front side does not.
- Reimplemented texture warping for the new texture system. You should
	even be able to warp sprites if you make their widths and heights
	powers of 2, but I did not bother creating any such sprites to test
	with.
- Added another BOOM fix I just now became aware of: Donuts in Doom would start
	even if the pool sector was already moving.

June 26, 2003
- Removed all the masked block functions, since they are no longer used.
- Changed fonts into collections of textures.
- Extended my CPUID code to gather more information.
- Spent enough time with a P4 to find out which of the vlinetallasm4
	routines works best with it. Answer: They are about the same, and both
	are about 20% slower than the Athlon version running on an Athlon.

June 25, 2003
- Moved all the self-modifying code out of the .data section and into the
	.rtext section. Unfortunately, NASM does not support creating writeable
	code sections (even though the object file format does support this), so
	I create them as regular read-only code sections in NASM and then modify
	them to be writeable using VirtualProtect() at run-time.
- Tried unrolling vlinetallasm4 to see if I could eek out some more
	performance from it. Unfortunately, it was slower at first and about the
	same at best, so I decided not to keep the unrolled version.

June 23, 2003
- Tried writing an optimized version of DFrameBuffer::CopyFromBuff() using
	prefetchnta and movntq, but it performed just as well as memcpy. Probably
	because video memory is much slower than system memory, so you don't really
	notice any of the inefficiencies of the rep movsd instruction that memcpy
	uses.
- Modified vlinetallasm4 slightly so that it executes in about 65%-81% of the
	time it used to take on my Athlon XP (depending on resolution) by reordering
	the instructions for parallelism. Note that this is the exact same
	optimization I tried earlier that reduced performance on a Pentium III-M.
	Also, the old version of the function still uses fewer cycles on a P3 than
	the new version uses on an Athlon XP. (7 cycles/pixel compared to 4.8
	cycles/pixel at 800x600). I am curious which version a Pentium 4 likes more.
	I will keep them both around and only select the new version for people with
	AMD processors belonging to family 6 or higher. The K6 might also like the
	Athlon version, but I don't have a K6 to test with, so I will leave it as
	it is now.

June 21, 2003
- Modified R_DrawColumnP_ASM() so that it has an alternate version of the
	inner loop without any writes to ch and hence, no partial register stalls.
- Removed the R_StretchColumn() function.
- Consolidated all the different patch drawing functions from DCanvas into a
	single DrawTexture() function. Amiga-style tag lists are used to pass it
	optional parameters to produce the same results as the old functions.

June 20, 2003
- Changed FImageCollection so that it is nothing more than an array of
	texture indices.

June 19, 2003
- Finished moving everything to the new texture system. There is still a
	little work yet to do, but at least the only place where patches are used
	any more is in the texture loaders.

June 13, 2003
- BTW, with the new texture system, you don't need to have every single texture
	defined in a single TEXTURE1 or TEXTURE2 lump. You do need to restrict
	yourself to just one TEXTURE1 and/or TEXTURE2 lump per wad, but they don't
	need to contain definitions for all the textures from the IWAD, since each
	wad's texture definitions are loaded separately.
- Fixed decals for the new texture system.
- Added support for the rotation information Blood added to the art files.

June 12, 2003
- Changed screenshot capturing slightly so that it does not need to redraw the
	screen, so now it can capture the framerate in the corner.
- Added support for animating Build tiles.
- Added a new thing to use for spawning sprites in Build maps.
- Got sprites working with the new texture system.

June 11, 2003
- Fixed X-Y scale of Build maps. I had it twice as big as it should have been.
- Fixed the assembly slope drawer to work with non-square textures.

June 10, 2003
- After putting it off for far too long, I finally started working on a unified
	texture system that will let me treat sprites, flats, and wall textures all
	the same. Sprites are not done yet, but now Build maps can be viewed with
	the correct floors and ceilings. One consequence of this change is that flats
	are now stored in column-major format instead of row-major format, so I had
	to changed the span drawers to account for this.
- Added a new MAPINFO flag: NoInventoryBar - prevents the inventory bar from
	ever appearing in a Doom map. Also changed the Doom inventory bar so that it
	won't be drawn if you have no inventory items, even if you press the inventory
	selection keys.
- Changed PTR_UseTraverse() to continue traversal when a backward-facing line
	is encountered.

June 9, 2003
- Fixed: Batman Doom no longer crashes during the cast finale.
- Made the texture error checking slightly more lax. It seems there is some tool
	that likes to write to unused areas of the texture directory meaninglessly.
- Fixed a prediction bug caused by moving between sectors with different friction
	levels. P_GetFriction() is sensitive to the ordering of the touching_sectorlist,
	so I need to preserve this ordering before and after prediction.

June 7, 2003
- Changed my transparent color from 0 to 255. An analysis of the original Doom,
	Heretic, and Hexen graphics revealed that this color was never used. It was
	probably going to be the transparent color before the Doom engine switched to
	using spans. But the real reason for the switch is because 255 is the color
	the Build engine uses for transparency, so I can draw its sprites without
	doing anything special.

June 6, 2003
- Made a slight fix to the frame interpolation: The time when the game tic is
	run is the base time I need to use for interpolation. Otherwise, the display
	could glitch if a tic passes between the time the gametic is run and the time
	it is displayed.
- Added a workaround for NT 4: Somebody goofed, and the default registry entry
	for CLSID_DirectInput under NT 4 has the wrong GUID. Two of the hexits are
	swapped so that it is stored in the registry as
	{25E609E0-B259-11CF-BFC7-444535540000} instead of as
	{25E609E0-B259-11CF-BFC7-444553540000}. You can fix this by running
	"regsvr32 dinput.dll" from a command prompt, or you can bypass it by loading
	dinput.dll and using DirectInputCreate to obtain an interface. Since I can't
	expect everybody running NT 4 to run regsvr32, I have to do the latter. :-(
- Fixed: Killing a morphed monster left an inert copy of the original monster
	around, so scripts that depended on being able to use thingcount() to determine
	when all the monsters of a certain type are dead would fail.
- Changed the Pig's and Chicken's MF_COUNTKILL bit to MF3_ISMONSTER, so morphing
	a monster does not add to the total number of monsters on the level.
- Fixed: FDoomStatusBar::DrawToSBar could create a partially transparent status
	bar because it left color 0 alone. I use color 0 as a transparent color for
	image blocks like this. (Though the status bar doesn't really need to be
	drawn with transparent parts, it was convenient to do it that way.)
- Changed the tid and TIDtoHate members of AActor from unsigned to signed, so
	that you can use negative tags with your teleporters.

June 2, 2003
- Fixed: Absolute lighting on walls was very dark. I don't think I have this
	feature accessable through Doom/Hexen maps, so you only notice it if you
	try to load a BUILD map.
- Added some command-line parameters to help make BUILD maps look better:
	 -art   Specifies the directory with the TILESxxx.ART files.
	 -bpal  Specifies the palette.dat file.
	So if I want to look at the Blood maps, I can do this:
	 zdoom -art d:\games\blood -bpal d:\games\blood\palette.dat -file d:\games\blood\*.map
	(assuming that I have already extracted all the maps from the RFF file).
	Unfortunately, the tiles only show up on walls. I need to create a unified
	texture system so that wall textures and flats can be used identically.
- Fixed: Bots would only move on the arbitrator's computer in a net game.
- Fixed: If foggy and non-foggy areas were visible simultaneously, gun
	flashes would sometimes light the foggy area.
- Fixed: R_ResetViewInterpolation did not actually work.
- Fixed: Line-to-line teleporters did net reset the view interpolation.
- Fixed: The super-fast projectiles in Heretic and Hexen with custom Tickers
	did not update their previous positions, so they could not be interpolated
	correctly by the renderer.

May 31, 2003
- Added support for loading Blood maps. They are no more playable than
	normal BUILD maps, but since I can already load Blood sounds and BUILD maps,
	it seemed like the thing to do.
- Fixed: Loading BUILD maps was broken because they did not initialize
	sectors' ZoneNumber.
- Changed the default for vid_vsync from true to false, because with the
	unlimited framerate, no vsync actually produces better control.

May 30, 2003
- Added interpolation for moving polyobjects.
- Optimized SpawnPolyobj() and IterFindPolySegs() so that they are loads
	faster.

May 29, 2003
- Fixed Dehacked support for patches that swap sprite names instead of
	changing them to something completely new.
- Fixed the new net code to recover properly in situations where there is
	high packet loss. Except for one instance: If a player quits with -netmode
	1, and the packet with that quit notification gets dropped, it never gets
	sent again, so any players left will hang waiting for tic updates for a
	player who is no longer there.
- Rewrote D_ArbitrateNetStart() so that all data passes through the host.
	This should allow computers on separate networks to play together as long
	as they can all talk to the host and you use -netmode 1.
- Bumped BACKUPTICS up from 12 to 36.
- Finally finished decoupling -dup from the game ticker. Getting it to work
	without consistancy failures was a lot more work than I expected.
	Fortunately, I think it was worth it. I can notice little difference now
	between -dup 5 and no -dup (aka -dup 1). Before, doing that would take
	your framerate down to 7 FPS, rendering the game practically unplayable.

May 28, 2003
- Started decoupling -dup from the framerate.
- Fixed an obscure crash bug caused by drawing past the bottom of composite
	textures whose heights are not powers of 2. If the composite texture was
	constructed at the end of a page of memory, the game could read into the
	next page, which is bad if the next page is not mapped in.

May 27, 2003
- Framerates above 35 FPS should now be done. Whether or not it's good in a
	net game, I'm not sure, since they require rather precise timing to play
	smoothly.
- Added interpolation for every actor in the game, after I watched a rocket
	flying and it was obvious that its position was updating less often than
	the view.
- Added functions from BUILD for interpolating floor and ceiling movement.
- Added some view interpolation to allow frame rates above 35 FPS. It looks
	very nice (and playing at 35 FPS now looks very bad), _except_ it sometimes
	misses a tic so you get an annoying hiccup that is worse than just keeping
	things locked at 35 FPS. This is despite my sprinkling NetUpdate calls to
	some of the most frequently used rendering functions. [edit: It seems the
	hiccups were because I had a background program running; even at idle
	priority, it still stole a little time away from ZDoom every now and then.]

May 23, 2003
- Got a crash in R_SetWindow() when it was setting the value of the r_viewsize
	cvar. After recompiling with the _CRTDBG_CHECK_ALWAYS_DF flag, I could not
	reproduce it to find out why it happened. Poo.
- Added player movement prediction to make network games feel more responsive
	when gametic is lagging behind maketic. You can turn it off by setting
	cl_noprediction to true.
- Fixed: Using -extratic with the packet server crashed because it tried
	to send tic -1, which doesn't exist. I don't know why it didn't cause
	problems with the regular peer mode.
- Stopped using all named RNGs to check game consistancy. I have too many
	named ones that aren't all used in the gameplay loop. Now I just pick a
	few key RNGs and use those.
- Added another byte to the packets sent from the master to the slaves that
	contains the master's maketic. This is so that the slaves speed up or
	slow down to match the master instead of each other.

May 22, 2003
- Corrected my misunderstanding of how the frameskip array is used in
	d_net.cpp.
- I found out how to make three player games perform fine on XP: Set the
	processor scheduling back from "Background services" to "Programs".
	Here's a link to an article that explains the values for the
	HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\PriorityControl\
	Win32PrioritySeparation key that this setting changes:
	<http://www.mcpmag.com/columns/article.asp?EditorialsID=405>. I think
	it's probably more the short time slices than anything else that makes
	it perform well. Why had I changed it from "Programs" in the first place?
	Because I was having trouble with background console programs sucking
	up all the CPU time, so I wanted to give everything equal time slices.
	I now have the registry key set to 0x20, which is short, fixed time slices.
	Not quite the same as the "Programs" setting. - Using the release build
	instead of the debug build obviously helps performance, too.

May 21, 2003
- Tried playing a multiplayer game on two machines for the first time in
	ages, and it went out of sync very quickly. It turns out that my laptop
	had genblockmap false, and my desktop had genblockmap true. Since this
	obviously makes it go out of sync, I'll have to make it a server var.
	Gennodes will need the same treatment, since it also implies genblockmap
	even if genblockmap is false. For ZDoomGL, however... I suppose I'll need
	to disable the blockmap regeneration if the nodes are only being built
	to get GL information.
- Wrote some code to let the net arbitrator function as a packet server. It
	makes everybody jerky, but that might just be because I'm running two
	clients on XP, and XP seems to do much worse at dividing processor time
	up equally between processes than NT 4. A two player game on one machine
	runs fine after a second or two, but three players is crap.
	[Okay, tried it on three separate machines, and it wasn't jerky, so that's
	a relief. Gametic was lagging behind maketic by 4 on the host, however, so
	it wasn't quite as responsive as I would have liked. That's opposite what
	I would have expected, since the host gets the ticcmds from the other
	players first. Maybe I need to investigate the code where it "speeds up
	time" some more. Or maybe I need to have the master send as many tics as
	it has for the other machines instead of the lowest common number of tics;
	e.g. If it has 1 tic from one machine and 2 tics from another, it should
	send all of them to a third machine instead of just 1 tic each from the
	first two machines. For comparison, a 2 player game (which is effectively
	always peer-to-peer even with packet server turned on), had gametic lag
	behind maketic by 2.]
- Removed the names from these RNGs: pr_chainwiggle, pr_afx, pr_decal, and
	pr_decalchoice. I don't know why it happens, but they can sometimes
	disagree with each other in a network game, particularly pr_decal. Since
	they don't have any real impact on game sync, removing their names keeps
	them from affecting the sync check, but it also means they won't be
	remembered across save games.
- Added DEM_EMPTYUSERCMD so that if a player's input doesn't change from one
	tic to the next, I can save one byte in the network packet. That makes the
	minimum packet size for one tic 5 bytes: 2 for the header, 2 for
	consistancy, and 1 for the tic itself. I'd call that a big improvement over
	the previous minimum size of 14 bytes (8 header, 2 to hold the list of
	players in that packet, 2 for consistancy, and 2 for the tic).
- Fixed: Damaging a monster would not reset its threshold value, so it would
	be more willing to switch targets than it should have been.
- Changed AActor::StaticSpawn() to not initialize the LastLook member for
	non-monsters. This caused the game to go out of sync when non-essential
	actors were spawned on one machine and not another (e.g. decals and bot
	aiming helpers).

May 20, 2003
- Beefed up the consistancy checking so that it now considers more than just
	the players' X positions.

May 19, 2003
- Optimized the size of the network packets some. The minimum header size is
	now 2 bytes instead of 10. Note that I removed the checksum from the header.
	The network transport should already be doing error checking and not provide
	us with any corrupt packets. In the highly unlikely event that somebody ports
	this back to DOS, they'll need to add a checksum in there. Also made some
	corrections to the packets that get sent around before the game begins.

May 16, 2003
- Made active powerup colors customizable via dehacked misc section.
- Changed the netbuffer checksum to use CRC32 (which gets used like a CRC28
	because the top 4 bits are chopped off to make room for some command bits).
	I could probably get rid of the checksum entirely, since UDP packets
	already include their own checksum field.
- Fixed: When one player in a network game unexpectedly quit, everybody else
	would bomb out with ECONNRESET. Now the i_net.cpp code pretends that those
	players sent out NCMD_EXIT packets. Why a connectionless protocol like UDP
	would return a connection-oriented error code, I do not know.
- Starting a network game with the -join parameter before the host started
	would fail with ECONNRESET. This is no longer an error, so you don't
	need to start the host first anymore.
- Added MF2_NOTELEPORT to TeleportFog.

May 5, 2003
- Fixed: P_Move() used the actor's default speed instead of the actor's
	speed.

May 2, 2003
- Added mousewheel support to the console.

April 26, 2003
- Uploaded 2.0.47.
- Added support for custom episode definitions (for all games, not just
	those that are already divided into episodes).
- Fixed: Doom Shareware does not have an ENDPIC graphic, so don't try to
	show it.
- Added a visible inventory bar for Doom.

April 25, 2003
- Added APROP_Ambush for Set/GetActorProperty.
- Added myasctime() function, which is equivalent to
	asctime(localtime(&time(NULL))), except it doesn't crash when the current
	time is before Jan 1, 1970 (which makes localtime return NULL).

April 20, 2003
- Added a NULL file check to M_NotifyNewSave(). I was sent a crash report
	where this appears to have been the cause.
- Fixed: Using teleporters with actor hits ceiling/floor triggers was
	problematic because the actor would still be clipped to its new ceiling
	or floor even if the teleport made it unnecessary
- Finished Thing_ProjectileIntercept so that it works in three dimensions.
	Big thanks to all those on the notgod phorum who helped me with the math.

April 16, 2003
- Extended my speedup trick for 1024x768 so that it also gets used for
	2048x1536 and 512x384. I can now play the beginning of MAP01 in 2048x1536
	at ~28 fps instead of 14 fps. 512x384 is so small that it doesn't really
	matter, but I think it is a few tenths of a millisecond faster now. What
	I think is going on: If the screen's pitch is a power of 2, then drawing
	columns (which Doom does a lot of in its renderer unless you're looking at
	the floor) will flush the cache lines a bunch and bring performance
	plummetting, as it has to transfer much more data to and from main memory.
	By making the pitch slightly larger so that it isn't a power of 2, the
	cache gets utilized better, so performance goes up.
- Started adding Thing_ProjectileIntercept special (175). It is identical to
	Thing_ProjectileAimed, except it leads the target.
- Fixed: Activating SoundEnvironment actors did not work, because I forgot
	to include the AActor * parameter in the prototypes.

April 14, 2003
- Uploaded 2.0.46.
- Added support for adding new projectiles to DECORATE.
- Changed the summon cheat so that it can be used to shoot projectiles
	and not just spawn them in place.
- Made the Lost Souls spawned by Pain Elementals inherit the Pain
	Elementals' hate information.
- Fixed the poison dart's poison application.
- Added a NULL-actor check to P_DisconnectEffect(), because I received a
	crash log where it was called with a NULL actor.

April 12, 2003
- Fixed: The calulation of secplane_t::ic was different in p_setup.cpp's
	slope spawners than it was in secplane_t's serializer, so if a demo was
	made on a level with slopes, and the game was saved during the course of
	the demo, the demo would desync if the player went on a slope after the
	save.
- Fixed: If a DirectInput 8 interface could not be obtained, the game would
	hang while trying to read mouse input using the DirectInput 3 interface.
	This is because DI8 has a DIDEVICEOBJECTDATA structure that is 4 bytes
	larger than DI3's. Unfortunately, IDirectInputDevice::GetDeviceData() does
	not do anything useful when passed a structure larger than it recognizes.
	It leaves the buffer alone, does not touch *pdwInOut, and returns DI_OK,
	which is quite misleading. I had to step into DirectInput before I
	realized what was going on, although I could have also discovered it by
	browsing dinput.h more thoroughly.

April 11, 2003
- Moved joystick reading out of I_GetEvent() and into I_StartFrame(). That's
	where it was in the original DOS Doom, because reading a traditional
	gameport can be an expensive operation (though I think USB is much faster).

April 9, 2003
- note to self: Remove BOOGA s
- Fixed: Thing_Projectile2 wasn't shifting the zspeed over.
- Fixed: The slopes created with P_SetSlope() had their orientations inverted.
- Time to upload 2.0.45.
- Made "cyborg" a synonym for the "other" gender, for compatibility reasons.
- Fixed: Forget "== 0" after stricmp (Line1, "No Ice Death").

April 8, 2003
- Uploaded 2.0.44.
- Changed A_FreezeDeathChunks() to not use S_FREETARGMOBJ. It just destroys
	the actor instead. I should probably get rid of S_FREETARGMOBJ globally,
	since it isn't really needed with my stale pointer cleanup code.
- Fixed lockups caused by changing the TID of an actor stored in another
	actor's LastLook member because of Thing_Hate.
- Made MF4_NOICEDEATH accessible through Dehacked as "No Ice Death".
- Added "No Autofreeze" as a misc Dehacked setting.
- Fixed the "Entering Unnamed" text that could be seen when finishing a game.
- Fixed: Frozen things could not be shattered with radius damage, because the
	thrust they got after the damage would reset their tic counters to 3 seconds.
- New: The marines now start with the same sprite scaling as the player, and
	AScriptedMarine::SetSprite() now copies the scaling of the actor it's taking
	the new sprite from.
- Added some code to check for fake floor/ceiling sector actions when an actor
	moves up or down because of moving floors and ceilings.
- Fixed: SetActorProperty for APROP_Health assumed you were working with
	players after I added the player fix for it.
- Fixed: The plasma ball still had MF2_ICEDAMAGE from my testing.
- Fixed: Gender selection in the menu was broken because I had changed to
	"cyborg" to "other" in m_menu.cpp but not in d_netinfo.cpp. Justification:
	You can have male and female cyborgs, so cyborg isn't a proper gender.
- Some files were missing from the VC6 and Dev-C++ projects, so fixed that.

April 7, 2003
- Uploaded 2.0.43.
- Fixed incorrect end-of-LevelInfos detection. Interestingly, it only crashed
	when compiled with GCC.
- Updated the crash logger to display the exception information for an
	access violation.
- Added Thing_Projectile2 ACS command. It's mostly a clone of the
	Thing_Projectile and Thing_ProjectileGravity specials, but it lets you give
	the projectile a TID.
- Added a newtid parameter to the Thing_ProjectileAimed special.
- Fixed flat warping so that it does not crash with flats smaller than 64x64.
- Fixed: The secondary frost shards shed by the mage's primary frost missile
	could damage the player who shot them.
- Made the randomization of the starting tic count for missiles an actor flag.
	This is so that Heretic and Hexen missiles can be better used in a Doom game.

April 6, 2003
- Added a check for NULL players to DCajunMaster::WhatToGet() because I got
	a bug report where that happened.
- Fixed: MF3_NOTARGET only worked if the attackers's TID was non-0 or you used
	Thing_Hate on the target.
- Fixed: The Heretic staff was able to damage ghost enemies, which it
	isn't supposed to be able to do.
- Fixed: In their charge attack, Minotaurs could only do damage to other
	monsters and not to players.

April 5, 2003
- Created a minimal FLAC distribution with just the parts ZDoom needs to
	compile, so the lazy people who want to build don't need to grab the
	library themselves.
- Changed A_FreezeDeathChunks() so that it spawns more ice chunks for large
	things than it does for small things.
- Added a generic ice death, so things can turn to ice and shatter without
	having a specific ice death. Now you can use bex to create a Doom missile
	that does ice damage and watch Hexen's cool ice death.
- Fixed: Radius damage did more thrust as your distance from the bomb
	source increased.

April 2, 2003
- Changed ripper projectiles to do damage per-tic and not per-step. This is
	more intuitive and also makes for better Heretic/Hexen compatibility,
	since those games don't adjust the step count with projectile size (unless
	the radius > 15, but none of their ripping projectiles are that big).
- Fixed some weirdness that can happen when the listener is positioned
	directly on a sound source in 3D sound mode by moving the listener
	back slightly from its true location. It was especially pronounced with
	the nForce but can also be heard with the Audigy depending on the
	environment settings.
- Fixed: Sector sounds always played at Z coordinate 0, so they weren't
	always audible when using 3D sound.
- Added all the EAX presets from UT2003 and verified that the SNDEAX parser
	actually works. Also tweaked the EAX editor a bit.

April 1, 2003
- Updated to FMOD 3.62.
- Fixed: Loading more than one dehacked patch (through some means other
	than an include statement) that altered state information would not work
	because only the first one would be able to find the correct locations
	of the original numbered states.

March 31, 2003
- Fixed: PCD_PRINTNAME with input values 1 through 8 did not work properly.

March 29, 2003
- Added support for normal, buring, and frozen deaths to decorations. Still
	need to test these.
- Changed P_SeekerMissile() to aim at the center of targets when seeking
	vertically, rather than at the targets' feet.
- Fixed: MF_ICECORPSE was not being set when things froze to death.
- Changed DCanvas::TextSWrapper() so that it can draw characters that are
	clipped, since that was fixed in the underlying block drawers a long
	time ago.
- Fixed: V_BreakLines() crashed if it encountered a character wider than the
	width of the box used to break the text in.

March 27, 2003
- Added support for playing SLIGE-generated maps without running them through
	a node builder first.

March 26, 2003
- Added support for FLAC music and sounds. See <http://flac.sourceforge.net>
	for more information about what FLAC is. Since it's a lossless codec, I
	don't really want to see people using it for music, but the option is
	there none-the-less. All the sounds in zdoom.wad (sans DSEMPTY) have now
	been compressed using FLAC.
- Added a fix for fonts that contain color 255 in their glyphs. LWM had some
	fonts like this, and it counts as a bug in imagetool (which I have now
	fixed).

March 22, 2003
- Made more flags available to decorations.

March 21, 2003
- Added Alt-Enter as a hotkey for toggling between fullscreen and windowed
	modes, as is customary for Windows programs. Also discovered that I can't
	seem to run fullscreen through the debugger anymore without the game
	window minimizing. [Must have been something screwy going on then; I can
	run it fullscreen under the debugger now.]
- Revamped the joystick menu to support axis mapping and multiple controllers.
	Under Windows versions that send DBT_DEVNODES_CHANGED broadcasts, it even
	updates itself automatically when you attach/detach USB controllers.
- Changed MF2_REFLECTIVE behavior so that missiles also get reflected
	vertically.
- Changed all the weapon state functions' prototyes from (player_t*, pspdef_t*)
	to (AActor*, pspdef_t*). Now they have the same first parameter as the
	standard state functions, so bex/dehacked patches should be able to use the
	standard code pointers with players, so long as they don't need a target
	or something similar that player's don't maintain. It also means that weapon
	functions that do very generic things like just playing a sound should work
	with non-weapons.
- Changed AActor::UpdateWaterLevel to accurately reflect when a player's eyes
	are underwater.
- Made setslot usable from KEYCONF lumps.

March 19, 2003
- Updated the joystick code to use DirectInput instead of the old multimedia
	system.
- Removed dxcrap.cpp. I am linking with dinput(8).lib again.
- Fixed: If Trace() did not hit a wall in a sector with a fake floor before
	the trace ran out, it would not set CrossedWater even if the trace crossed
	below the fake floor.
- Altered P_LineAttack() so that it doesn't spawn bullet puffs on lines
	using the Line_Horizon special.

March 17, 2003
- Added a check for a NULL lastenemy in A_LightningClip() because Mike B. had
	a crash where this was NULL.
- Gave the fist and chainsaw AmmoUse values of 1, so dehacked patches that make
	them ammo-using will use ammo without needing to specify a new AmmoUse.
- Added new sound sequences for the Heretic doors, because they don't have the
	same sound usage as Doom's.
- Fixed: The powered-up phoenix rod would use ammo when a Tome of Power ran out
	and infinite ammo was enabled.
- Added SpawnPoint initialization to AActor::StaticSpawn(), so things that get
	spawned during the game can respawn someplace other than (0,0).
- Changed projectile impact lines so that the projectile's owner activates the
	script instead of the projectile itself. Projectile cross lines will still be
	activated by the projectile.
- Fixed: The window drew over the video window when WM_PAINT was received while
	playing a movie in windowed mode.
- Fixed: Closing the window while a movie was playing would close the window
	without quitting the game.
- Fixed: Fake inventory items cleared their special after being picked up.
- Added support for setting the player's speed using SetActorProperty()
	and APROP_Speed. This speed gets multiplied to the player's normal
	speed.
- Changed A_BrainSpit() so that it does not rely on a pointer to the
	DBrainState in the BrainEye that calls it. This allows it to be used
	by actors other than the eye, which is necessary because of Dehacked.

March 13, 2003
- Fixed: Loading a FON2 font without a space or N character would read
	(essentially) undefined memory when calculating the width to use for the
	space character.

March 11, 2003
- Removed the old midiStream-based code.
- Wrote a SNDEAX lump parser.
- Fixed: Aliases defined in KEYCONF lumps were still saved to the ini. They
	could also override aliases stored in the ini. Now, if an alias is defined
	in a KEYCONF, it will not be saved to the ini, and if there is an alias with
	the same name already defined in the ini, the original alias will be kept in
	the ini when you quit.

March 10, 2003
- Fixed: Defining an animation for a non-existant texture could stomp on memory.
- Added support for different sound zones with individual EAX settings. To assign
	sectors to different zones, you either make them physically unconnected or you
	use a Line_SetIdentification with the second parameter set to 1.
- Fixed: Changed FindLevelByWarpTrans() search order to return later warptrans
	matches in favor of earlier ones, so you can start Hexen DK with the menu
	again.
- Fixed: AZShrub2::GetExplodeParms() and AZXmasTree::GetExplodeParms() were
	mis-named and had the wrong prototypes, so they were never called.
- Added a hack when playing Hexen so that the BLANK texture is permanently mapped
	to the empty texture. The standard Hexen maps use it as an empty texture,
	even though it isn't really empty.

March 8, 2003
- Changed sprite initialization so that TNT1 is always the first sprite. This
	is what I wanted a long time ago, and I think it used to be like this but
	got changed when I rearranged the sprite table initialization.
- Changed the TID target search so that it looks for actors in the same block
	before it searches the actor chains. Helm's Deep's AI seems a bit quicker once
	things get going now, but there are still bits of architecture (lots of masked
	mid textures) that are going to slow it down, and it's still slow at the
	beginning and when the second wave starts moving.

February 24, 2003
- Decided to take up the challenge and figure out how to load Strife textures.
	It looks like they just removed some unused fields from the texture
	directory. Now you can actually load strife1.wad and look at the maps, but
	there are still plenty of oportunities to make it crash if you try to use
	it as an iwad.
- Added a check for negative texture patchcounts to R_InitTextures(), just
	for the people who try to use -iwad strife1.wad.
- Fixed: The game would hang when trying to overwrite an read-only savegame
	for the same reason it used to hang when playing back a save operation
	recorded in a demo: The save itself was cancelled, but the request to save
	was not cancelled, so it would endlessly try to save the game.
- Fixed: P_BounceWall() would bounce every bounce type off of walls, but it
	shouldn't have done anything for MT2_HERETICBOUNCE.

February 18, 2003
- Changed: P_RadiusAttack no longer tries to apply damage when distance is 0.

February 15, 2003
- Changed P_SetSlope() to scale by ANGLE_90 instead of ANGLE_180. Silly me;
	Scale() works with signed ints, but ANGLE_180 is to big for that, so it
	could overflow.

Feburary 13, 2003
- Changed: When locating a map by its warptrans number fails, it can now try
	to locate it by map number instead. Apparently, an old version of the Hexen
	demo did not have warptrans.

February 12, 2003
- 2.0.42 time.
- Fixed: If weapon drop was on and a player respawned before their body went
	nonblocking, they wouldn't actually drop a weapon.
- Dehacked compatibility fix: MF3_ISMONSTER now copies the state of
	MF_COUNTKILL for any actors that get patched.
- BOOM compatibility fix: Lines with a type of 0 still need their ID set to
	their tag. P:AR's rotating light on E1M1 requires this for the teleport line
	its voodoo doll uses.
- Added code to set the MIDI output device's volume to full for devices that
	support it. That makes the full range of volumes available without having
	to set the volume with the Windows mixer.
- Fixed: The GiveInventory command would give one inventory item if the amount
	was 0.
- Fixed: Inventory items that were not present in a savegame were not reset to
	0 when the savegame was loaded.

February 10, 2003
- Added wildcard support to the cmdlist and cvarlist commands, so you can look
	at just a subset of the lists.
- Fixed: The total monster count reset when loading saved games so that it would
	no longer include monsters that spawned after the start of the level.
- Uploaded 2.0.41.
- Fixed: When a MIDI or MUS song stopped because it reached the end of the song
	(if it was nonlooping), the midiOut device would not be released.
- Removed the DirectMusic MIDI option because it wasn't working, and Timidity++
	is a better sounding solution if you can't do hardware wavetable MIDI.
- Fixed: ProduceMIDI() crashed because it had the wrong header check.
- Fixed looping problems with the new MUS player because I accidentally moved
	some code in the wrong place. The new MUS and MIDI players also had semi-
	random default channel volumes for the same reason.

February 8, 2003
- Uploaded 2.0.40.
- Added support for Apogee's EMIDI controllers.

February 7, 2003
- Wrote new MUS and MIDI player routines that do not use MIDI streams. Instead,
	they use a time critical thread and midiOutShortMsg to send MIDI messages to
	the playback device. I have not tried this with a lesser OS like Win98, so I
	hope it works okay there. I want to remove the old player code so I that I
	just have one method to use for playing MIDI data. This approach offers two
	advantages over the stream method as it was employed: 1) Minimal setup time,
	so music changes can happen faster. 2) Volume support for everything that
	supports channel volume controllers, which is everything I tried. I think I
	might also add support for the Apogee Sound System's EMIDI files just because
	I have some docs for it.

February 6, 2003
- Added mouse and joystick option menus. Also added an option not to
	prescale the mouse movements. I've done this all along because it
	feels like the vertical sensitivity is much higher than the horizontal
	sensitivity, so the prescaling compensates for that perceived difference.
	But it could be the reason some people gripe that "ZDoom's mouse feels
	different from Doom's! It sux0rz delux0rz!" So now they can turn it off
	with a single switch instead of messing with the various mouse sensitivities
	to decompensate.
- Fixed: The game did not give up the mouse if use_mouse was false.
- Changed the default ID for lines without a Line_SetIdentification or
	similar special to -1 instead of 0. This is so that you can use
	Line_SetIdentification to give a line ID 0 and still tell it apart
	from all the other lines on the map without IDs. This emulates standard
	Hexen behavior and also fixes a bug on caldera.wad, MAP10 where almost
	every line on the map would get set to a switch texture right after
	you entered it.
- Added support for Hexen's warptrans mapinfo command. I see now that it
	gets used to determine which map you start on for a new game.
- Changed MAPINFO parsing so that maps named ExMy will automatically get
	their levelnum set to xy unless you specify something different. MAPxx
	maps were already getting this treatment.
- Added a syntax error message if you don't specify a valid keyword for a
	block in ANIMDEFS.
- Added a non-player check to the A_DoomSkinCheck and A_HereticSkinCheck
	functions. I guess if somebody uses Dehacked to assign the player death
	states to something else, they could get called by something that isn't
	a player.

February 5, 2003
- Changed A_KeenDie() to search among whatever called it and not exclusively
	among Keens.

February 4, 2003
- I can now build a fully working version of ZDoom with MinGW. Perheps now it
	is time for me to turn my attention back to Linux.

February 3, 2003
- Fixed a stupid bug I added to the tl_tab calculations in fmopl.cpp.
- Fixed: Monsters that hated both players and monsters would crash if there
	was more than one player in the game.
- It's 2003 now, isn't it?

February 2, 2003
- Uploaded 39.cab.
- Fixed: Dormant actors still bled.
- Added a PatrolSpecial actor (doomednum 9047). It works like
	InterpolationSpecial, but for PatrolPoints instead of InterpolationPoints:
	When a monster reaches a PatrolPoint, it will execute the specials of any
	PatrolSpecials with the same TID as that PatrolPoint.
- Added a new ACS command: SetMarineSprite (tid, "otherClass"); You give it
	TID of the marine(s) to change and the name of an actor class to get the
	sprite from.

February 1, 2003
- Fixed a Heretic/Hexen bug: Actors with a crash state would not crash if
	they died on the ground.
- Changed I_InitInput to request a DirectInput 3 interface instead of
	whatever the header specifies. It should work with NT 4 again, now.
- Added checks to the marines' attacks to prevent crashes if their targets
	unexpectedly disappear.
- Fixed: Monsters could start targetting themselves if they blew up a
	nearby barrel (or pod).
- Changed A_VileAttack() so that the Archvile can't hurt itself with its
	own fire.
- Fixed: In Hexen you can queue scripts for maps on other hubs. They don't
	get cleared along with the world variables, as I had mistakenly believed.

January 31, 2003
- Removed the need to press D to set the default resolution at the video
	modes menu. This seemed to be a common point of confusion (despite having
	the directions right there in the menu), but more importantly it makes the
	menu fit on one screen when using 9 pixels per row of text instead of 8.
	Heretic and Hexen both look better with 9 pixels of room rather than 8.
- Fixed: Scrolling up past the top of the menu was hard-coded to assume
	the Doom font when finding the bottom of a menu, so it didn't work
	correctly for Heretic or Hexen.
- Fixed: When pressing up arrow to scroll the top of a menu, its scrollpos
	could get set to -1.
- Removed the limit on the number of frames that can assigned to an
	animation sequence with ANIMDEFS.

January 30, 2003
- Fixed: The old Thing_Hate behavior no longer worked.
- Added the Thing_ChangeTID(oldtid, newtid) special to change the TID of
	anything with oldtid to newtid. If oldtid is zero, then whatever activates
	it gets its TID changed to newtid.
- Added the ActivatorTID() ACS command to retrieve the TID of the actor
	that activated a script.
- Added the PlayerNumber() ACS command for finding out which player is
	executing a script. Returns 0-7 for an actual player and -1 for
	anything else.
- At GooberMan's request, added bool as a synonym for int to ACC.
- Added support for a KEYCONF lump. This is a limited console script that
	can only execute the commands alias, defaultbind, addkeysection,
	addmenukey, weaponsection, and addslotdefault. Now a wad with custom
	key and weapon bindings doesn't need a separate .cfg file to operate.
- Added weaponsection console command for specifying that the weapon slot
	assignments go to some ini section other than the default.
- Fixed: Processing an ACS object's MINI chunk initialized one map variable
	too many.
- Fixed: Map variables that were not stored in a savegame were not
	zero'd when the game was loaded.
- Changed: Include directives in Dehacked patches will now look for the
	specified file in the same directory as the patch they are used from
	before they look in the current directory.

January 29, 2003
- Changed: Just loading a game is no longer enough to assign a quicksave
	slot. You need to either save a game or quickload first.
- New: The pullin command now looks for wads in the same directory as the
	script that executed it before it looks for them in the current directory.
- Fixed: Switch definitions in ANIMDEFS with an on state that ends on the same
	texture it began on would crash instead of properly detecting the error
	and quitting with a useful error message.
- Changed: Voodoo dolls no longer affect a player's deltaviewheight.
- Changed: Voodoo dolls can now be pushed around by damage even when the
	player is invulnerable.
- Fixed a bug in P_DamageMobj() I introduced after some reformatting that
	prevented voodoo dolls from being pushed around.
- Changed the final output of the OPL2 synth to look like this:
			final_output = (chip_output * 1.5) - 18000
	This is because most of the instruments the Doom games use create
	waveforms that are primarily located in the upper half of the wave.
	(Because, of the four basic waveforms of the OPL2, all but one of them
	only use the upper half of a sine wave.)
- Fixed the assembly part of OPLmusicBlock::ServiceStream() to work with
	odd-sized buffers.
- Fixed: When the player does not have the invisibility power active, the
	weapon would always be drawn with STYLE_Normal instead of whatever style
	the player had.
- Added the cleric and mage Icon of the Defender behavior.

January 27, 2003
- Fixed the finetuning of double-voice OPL2 instruments, so now the Heretic
	musics don't sound like crap.
- Changed the OPL2 emulator to write data to the output buffer a voice at a
	time instead of a sample at a time. The speedup isn't as great as I would
	have liked, but it does let me avoid doing work for voices that aren't
	playing anything, and it should make it easier to optimize in the future.
- Just a note: I think the OPL2 outputs samples at ~49716 Hz.
- Removed the x2 amplification from fmopl2.c's output, because some of the
	Heretic songs made it overflow. Looking at sampled output however, it seems
	most of the data is going only into the positive half of the wave, so perhaps
	I could subtract some constant from the data and keep the amplification.
- Reduced the length of the OPL stream so that it gets filled fourteen times
	each second, so that it interrupts the main thread more consistantly and
	has less of an impact on the game's "smoothness".

January 25, 2003
- Changed the frequency calculations in the OPL2 player to match DMX's (or
	so I think).
- Fixed an amplitude problem with the OPL2 synth I inadvertantly introduced
	while trying to optimize it.

January 24, 2003
- Uploaded 38.cab.
- Added a fix to prevent you from becoming a zombie player when there are
	voodoo dolls on a level, and each accumulates enough damage to kill you,
	but none of the dolls receives enough damage individually to die.
- Changed monster patrols so that when a monster reaches the end of a path,
	it looks in the same direction as the final patrol point.
- Fixed: PIT_RadiusAttack() ignored MF2_NODMGTHRUST, so Hexen's poison cloud
	would push things away from it. I also used this to determine if that
	function will spray blood splats, but perhaps a poison damage flag would
	be better?
- Added the ACS commands SetPlayerProperty and GetPlayerProperty.
- Added different versions of the scripted marine that each use a different
	weapon. There's also an ACS command to let you change their weapons at
	any time.

January 23, 2003
- Added some more Thing_Hate types that can be used to make monsters that hunt
	both monsters and players or to ignore players that attack them.
- Made Bishops spawned by Heresiarchs and Wizards spawned by D'Sparil inherit
	their masters' hate preferences.
- Made Heresiarchs and Bishops ignore each other. I didn't check if this was
	original Hexen behavior or not, but it seems stupid for a Heresiarch to kill
	a Bishop it just summoned simply because the Bishop happened to hit it.
- Added a new invisible thing (#9076) that you can make monsters attack using
	Thing_Hate. It's probably best to place this next to something solid, since
	it blocks projectiles (including the player's) and affects the player's aim.
	The angle you give it determines how much health it has, 1 degree is 10 hit
	points, 2 degrees is 20 hit points, etc. Give it an angle of 0, and it never
	dies. The angle field is used for this instead of one of the argument fields
	so that it can still execute a death special.
- Fixed: P_NightmareRespawn() assigned the old body's spawn parameters to the
	teleport flash instead of to the new body, so when the new body respawned,
	it would respawn at (0,0) instead of its original location. Also set the
	respawn chance back to ~1.6% instead of the 100% I had been using earlier
	for testing.

January 22, 2003
- Uploaded 37.cab.
- Played with A_Chase() a bit more so that monsters that hate monster groups
	will look for closer monsters on their way to a monster they can't see.

January 21, 2003
- Improved Thing_Hate with a third parameter. Now we have Thing_Hate (tid1,
	tid2, type). If type is 0, it behaves just like before: Everything with tid1
	chases after the first thing with tid2 and then promptly forgets their hate
	once that thing dies. Set it to 1, and it's much like normal except instead
	of looking for players everything with tid1 looks for something with tid2.
	And if type is 2, it's just like type 1, except the monsters with tid1 don't
	actually need to see any monsters with tid2 before they start chasing after
	them, so it's somewhat closer to type 0 than type 1 is.
- Changed Hexen player jumping velocities from 9 to 9.75 because they weren't
	jumping as high as they should have been, even though 9 is the value Hexen
	uses. The 9.75 was arrived at by playing Hexen.exe, standing next to a wall
	to see how far up the texture the player gets when he jumps, and then
	tweaking until ZDoom was approximately the same. It is enough, at least, to
	make the clock gear in hexdd MAP57 accessible without the Wings of Wrath.

January 20, 2003
- Fixed: Dormant monsters should not enter their SeeState when Thing_Hate is
	used on them.
- Fixed: In Hexen, the Wings of Wrath do not expire at all in single player
	games. I had erroneously believed that landing on the ground would
	temporarily halt their timer until you started flying again (which is
	incorrect).
- Fixed: At the easiest difficulty, P_DamageMobj halves damage. If the damage
	was one, it would become zero. Now if the damage is one, it stays one.

January 18, 2003
- Added a PointerSubstitution() method to DObject to replace all pointers
	to one object with pointers to another object. This is so that when
	something morhps or unmorphs, enemies targetting that actor will be
	targetting the correct actor instead of the stale one.
- Added: In Heretic, killing a player as a chicken turns you into a
	"super chicken." ZDoom was missing this.
- Removed the redundant P_HealRadius() function.
- Fixed: Palette remapping isn't enough to make Doom skins work with Heretic
	because the two games also use different death animations.
- Fixed: The Icon of the Defender gave the name of the Ring of Invincibility
	when it was picked up.
- Fixed: The warp console command crashed if you didn't specify enough
	parameters.
- Added means-of-death as a third parameter to Thing_Damage.
- Fixed: Items that had been dehacked would not have their MF_DROPPED bit set.
- Added a ShouldStay() method to ADehackedPickup() so that it can get
	rerouted to the real pickup.
- Fixed: Single player demos played back with different RNG seeds than they
	were recorded with.

January 16, 2003
- Fixed assignment of partner segs in FNodeBuilder::FixSplitSharers().

January 14, 2003
- Added NULL-actor checks to P_CheckSight().

January 13, 2003
- Fixed: Advancing to a new level would subtract the number of live monsters
	on the old level from the total number of monsters on the new level.
- Fixed: The game tried to play the hall music when doing non-Hexen endings.
- Added world and global arrays for ACS. They are somewhat different from
	map arrays: They are one-dimensional and you don't specify a size when
	you declare them. Instead, they grow as-needed during normal use.
- Removed sp from DLevelScript, because the stack pointer is always 0 when
	RunScript() returns.
- Fixed: PCD_INCMAPARRAY and PCD_DECMAPARRAY used the wrong stack value for
	the array index.

January 11, 2003
- Assigned spawnid 154 to the Baron's fireball (to be added as T_BARONBALL
	to zdefs.acs).

January 10, 2003
- Changed sectorsound to use CHAN_AUTO instead of CHAN_BODY. Otherwise, not
	all the Hexen "puzzle" switches sound right.
- Fixed: The STREAM_ENUM macro in a_artifacts.h used call-by-value instead of
	call-by-reference, so artifact types could be written to an archive, but
	they couldn't be read back from it.
- Removed inventorySlotNum, as it was unused.
- Fixed: Reading strings with FArchive would never return NULL, and it left
	copies of all the strings read behind in memory.
- Fixed: When sprites were renumbered in a recompile, the sprite scanner in
	FArchive would find matching-named skin sprites instead of the real sprites.
- Added a "vapor" SaveVersion 205. This is a version 204 save written by
	versions 2.0.33-2.0.36 because arti_pork was added in 2.0.33 and I did not
	bump the version. There will be no savegames that are actually written as
	version 205, because I changed the way artifacts are saved so I won't have
	to worry about this particular problem again in the future.
- Uploaded 36.cab.
- Added a new player property for ACS (PROP_TOTALLYFROZEN #4). When active, it
	won't let the player do anything but press +use, which is what PROP_FROZEN
	was really supposed to be.
- Added MF_NOLIFTDROP flag for no-gravity things that should not move down
	with lifts if they are standing on the lift. This is only used with the
	various bridge actors because various ZDoom maps break if they move with the
	lift, and the Hexen bridge has visual glitches if it moves so I doubt
	anybody used this Hexen behavior.
- Got rid of the orbit table for Hexen's bridge balls. Now they move every tic
	instead of every fifth tic and use the finecosine/finesine tables directly.
- Fixed: When a monster was spawned through a script but there was no room
	for it, it would still count toward the total monsters on the level.
- Fixed: P_Thing_Spawn() set MF2_PASSMOBJ for flags instead of flags2, so it
	was really setting MF_NOCLIP, and the P_TestMobjLocation() check would
	always succeed.

January 9, 2003
- Added a new player property for ACS (PROP_FLY #3).
- Added a level flag to set monster death special behavior to the Hexen mode:
	The things that die activate the specials; not the things that kill them.
	You can use MAPINFO to turn this off in Hexen and turn it on in Heretic/Doom.
- Fixed: The Heresiarch used its death inflictor instead of itself as the
	activator of its death script.
- Fixed: DLevelScript did not have its activator member recorded in its list
	of object pointers.
- Fixed: Saving a game in a demo would cause the program to hang when that
	point was reached in the demo.
- Made the game recover from failures during dearchiving thinkers so that
	you can actually do more stuff without it crashing. Just needed to add
	a try/catch block so that it can undo what was done before it failed.
- Added the -savedir option to specify where savegames are stored.
- Fixed a bug in PIT_FindFloorCeiling(): It used tmthing even though
	P_FindFloorCeiling() didn't set it.

January 8, 2003
- Fixed: The hexen main menu showed the spinning skulls from Heretic instead
	of the fire bulls.

January 7, 2003
- Uploaded 35.cab.
- Fixed the node builder to successfully create GL nodes with >64k segs.
- And now the node builder is fixed point again. (Undo is nice.) Making it
	exclusively floating point made vrack2big3's BSP take 10 seconds longer to
	build. Since the goal was to avoid the cost of int-to-float conversions
	every time PointOnSide was called, I'd say it backfired miserably. With just
	the change to PointOnSide, it's only about 1 second slower than 2.0.34.
- Okay, the node builder now uses floating point for all its calculations.
- Changed FNodeBuilder::PointOnSide() to use floating point to avoid overflow.
	Methinks I should just change the node builder to use floating point
	exclusively. Then it won't have to do int-to-float calculations repeatedly.
- Changed A_Tracer() to set the puff type before it calls A_SpawnPuff().
- Fixed: P_RecursiveSound crashed if it encountered a line that was marked
	two-sided but lacked a second side.
- Fixed: The cursor in the Advanced Sound Options menu started one line too
	high.
- Added Hexen support to giveinventory/takeinventory/checkinventory and made
	them work with cross-game items.
- Fixed: Clock gear 3's inventory image was misspelled as ARLTIGER3.

January 4, 2003
- Fixed: findFreeChannel() in mlopl.cpp would try very high channels instead
	of the correct ones and access undefined memory.
- Fixed: The Thing_Spawn special would fail to spawn things without
	MF2_PASSMOBJ set if there was something already occuping their x,y space,
	whatever that thing's z coordinate. This was problematic with the Hexen
	bridges.
- Fixed: DDrawFB::PaintToWindow() can get called during the render process
	when a WM_PAINT message is received. If the framebuffer was already locked,
	this would overwrite the buffer pointer and pitch with those of the
	physical screen. This is not normally a problem, but one way to get a
	repeatable crash was to turn on any of the pixel doubling modes and switch
	from fullscreen to windowed. Simple fix: PaintToWindow() does nothing if
	the screen has a non-zero LockCount, and Update() zeros LockCount before
	it calls PaintToWindow().

January 3, 2003
- Uploaded 34.cab.
- Added a parameter to AActor::LinkToWorld() to tell it to use the original
	incorrect point-on-line side calculations of the Doom engine. This is just
	so that the map spots in the emerald key room of Hexen MAP01 will spawn in
	their intended sector and not the sector that is technically correct.
- Added a new compatibility option: compat_usewallblocking. Now I see that
	there are wads that used non-use lines to block the player from activating
	a use line.
- Changed AActor::StaticSpawn() again. When spawning map things, the floor
	and ceiling z's are taken from the actor's center point. When spawning
	things during gameplay, the true z's are found instead. So P:AR's player
	starts are still working, non-players placed in the map will be able to
	get stuck in the floor of a neighboring sector, and anything spawned
	during the game with ACS (or otherwise) will have the "correct" behavior
	and know what their true floor and ceiling z range is. TBD: Should this
	be players-only? Decided: Yes, otherwise bullet puffs will appear on
	window sills instead of the actual spot where the bullet hit.
- Changed P_FindFloorCeiling() to use different global variables than
	P_CheckPosition(), because it can be called within P_CheckPosition().
	Doom has too many global variables for its physics code.

January 2, 2003
- Uploaded 33.cab.
- Fixed A_RestoreSpecialPosition() for MF2_FLOATBOB actors.
- Fixed: Made the porkalator and morph ovum separate artifacts.
- Fixed: In Heretic and Hexen, MF2_FLOATBOB objects are always positioned
	relative to the floor. In ZDoom, they bob around a central z height, so
	they need to have gravity applied to them in order to best approximate
	the orginal behavior.
- Created a new function (P_FindFloorCeiling) to find the floor and ceiling
	for newly-spawned things. P_CheckPosition() has side effects, so I can't
	use it. This is also used by P_TeleportMove() now.
- Uploaded 32.cab.
- Fixed: EV_DoCeiling() only set the crush value for the moving ceiling if it
	had a crushing type, so BOOM generalized ceilings could not do crushing
	damage.
- More GCC 3.2 cleanup. Everything compiles now--except for zdoom.rc. Windres
	can't handle it so I had to settle with a precompiled version.
- Split off the system-specific code from w_wad.cpp into i_wad.cpp.
- Changed AActor::StaticSpawn() so that it uses P_CheckPosition() to get the
	real floorz and ceilingz to use in case the actor overlaps a line.
- Gave the fatso's fireball spawnid 153. In zdefs.acs, T_CACODEMONSHOT was
	incorrectly named T_MANCUBUSSHOT.
- Created one-parameter version of the W_MapLump functions that return pointers
	to const data so that the compiler can be issue warnings if they get assigned
	to non-const pointers.
- Added MF2_PUSHWALL to all the Heretic monsters.
- Put back MF2_PASSMOBJ because of the unexpected consequence removing it had:
	Overlapping things would push each other to the ceiling. This was most
	visible with the invisible bridges, which people have commonly overlapped.
	I have taken a different approach to the situation that caused me to remove
	it: Now you can't push anything without MF2_PASSMOBJ while riding a lift.

January 1, 2003
- Uploaded 30.cab. I hope I didn't break anything I haven't already caught by
	getting rid of the zone heap and switching to memory-mapped files.
- Made more input cvars global config (such as m_pitch and m_yaw).
- Changed the sound rolloff factors for Heretic and Hexen.
- Fixed: Unlike Doom and Heretic, Hexen crushers do not continue to move if
	there is something being crushed underneath them. Instead, they wait for the
	thing underneath to either die or move out of the way. The crushing pillars
	you find the first time you visit Hexen MAP03 do not actually kill you if
	they don't wait for you to die before fully closing.
- Added support for "fake" lumps so that the music system can continue to play
	on-disk music files without having to include them on the command line with
	-file. These "fake" lumps are automatically unmapped when they are done being
	used so that their memory can be decommitted, but their file handles remain
	open because I don't want to deal with also removing lumps at runtime.

December 31, 2002
- Changed FRandom::StaticClearRandom() so that different seeds produce more
	disparate results in the different RNGs.
- Fixed: FRandom::StaticClearRandom() was not being called after rngseed was
	set at game startup.
- Changed the wad loader to use memory mapped files, so now I have better
	caching than what the zone heap could hope for, since the VM system does all
	the work for me.
- Added a fixup in R_InitTextures() for the Doom E1 sky, which has its patch's
	y origin at -8 instead of 0.
- Added the F_EndFinale() function to clean up after the finale is over, since
	I can't let the zone heap do it automatically anymore.

December 30, 2002
- Removed the zone heap. Everything is done using new/delete and malloc/free
	now, so you don't have to worry about specifying a heap large enough.
- Fixed: The [.NetServerInfo] ini sections were still read in single player
	games.
- Fixed: The player class filter in P_SpawnMapThing() used SinglePlayerClass[]
	instead of player_t::CurrentPlayerClass.
- Put the FMUSIC loader back the way it was so that MODs in WADs work again.
- Changed EV_Teleport() so that if it can't find any teleport destinations,
	it looks for a matching map spot instead. This fixes the southern teleporter
	in Hexen MAP10.
- Added MF3_DONTMORPH to the Hexen boss monsters.
- Removed MF2_PASSMOBJ flag and made it standard behavior for all actors
	because of a test map I received: If an actor with MF2_PASSMOBJ rides up
	a lift underneath a non-MF2_PASSMOBJ actor, the top actor would fall inside
	of the bottom one once the lift stops.

December 28, 2002
- Changed the nodebuilder timer to use I_MSTime() instead of clock/unclock,
	because very large maps can make it exceed the 32-bit resolution of
	the clock/unclock macros.
- Uploaded 29.cab.
- Moved the R_ClearParticles() call out of G_InitNew() and into P_SetupLevel().
- Experimented with the 3D sound parameters to find a rolloff factor that
	best approximates the software sound.
- Updated to FMOD 3.61.
- Fixed: S_UpdateSounds() still multiplied the SoundCurve volume by 2, so
	things decayed twice as quickly as they should have. I would like to get
	rid of the SoundCurve use, but I'm not sure how Raven modelled the curve
	for Heretic and Hexen.

December 27, 2002
- Fixed: The FireDemon could not be perceived to move except when strafing
	because it still used PROP_SpeedLong instead of PROP_SpeedFixed. Because
	this was the only place where PROP_SpeedLong was used, I got rid of it.

December 26, 2002
- Changed the internal subsector_t struct to use 32 bits to keep track of
	segs instead of 16, and fixed the node builder up so that it works with
	>64k segs.
- Changed the internal node_t struct to allow for more than 32768 subsectors
	and nodes.
- Fixed: The fighter played PlayerFighterGrunt instead of FighterGrunt on his
	third punch because I didn't realize the two sounds had different names.
- Changed PIT_FloorDrop() to more accurately reflect Hexen's behavior. Things
	under gravity move down with the floor if the floor moves fewer than 9 units
	in one tic (not 24), and no-gravity things always move down with the floor
	(no matter how fast it drops) if they were standing on it.
- Changed forwardmove and sidemove scaling calculations in P_MovePlayer()
	so that they won't overflow.
- Changed server vars so that only compatflags and forcewater are archived.

December 24, 2002
- Fixed: Autosave still worked when the player was dead.
- Fixed: The Quietus pieces had the wrong spawnids, so they were overriding
	the stained glass shards. I'm not sure why they had the wrong numbers.
- Fixed: AZWingedStatueNoSkull and AZGemPedestal had their see and melee
	states swapped, so they wouldn't change their appearance when activated.
- Uploaded 28.cab.
- Fixed: When "Monsters Ignore Each Other" was set, monsters could not be
	hurt by ACS-spawned projectiles.
- Fixed: Underwater reverb did not work on Audigies anymore because FMOD was
	only reporting them as supporting EAX3 reverb and not also EAX2 reverb.
- Fixed: Empty console command lines are not added to the history list.
- Added a new ini section so that select ServerInfo cvars can be remembered
	across games. There is a different one for single player games and for net
	games, and the net game version is only saved on the machine that acts as
	host.
- Added useflechette command, which acts like "use ArtiPoisonBag1,2,or3"
	depending on the player that uses it.
- Moved the default +showscores key in Hexen to Scroll Lock, because \ is
	already used by "use ArtiHealth".
- Added the Hexen default keys for quick-use of inventory items.
- Added addslotdefault command to only put a weapon in a slot if it isn't
	already assigned to a slot.
- Changed P_FindNamedInventory() to use the same names as the actors that
	represent the inventory items, for consistancy.
- Gave the pod and explosive barrel MF3_DONTGIB flags so that if
- Changed the setslot and addslot commands so that you cannot have more than
	one copy of a weapon in a single slot.

December 23, 2002
- Did some cleanup for GCC 3.2.
- Added a fix for wads that have things like FF_END immediately followed by
	F_END.

December 22, 2002
- Fixed: ThrustFloorUp and ThrustFloorDown did not have spawnids, nor did they
	override Activate() and Deactivate().
- Fixed: P_LoadBuildMap() read numsectors out of the Build map before checking
	to make sure there was actually enough data for numsectors to be present.

December 21, 2002
- Changed pointer tracking in pointy classes to use pointers to members instead
	of offsetof, as per GCC 3.2's suggestion.

December 20, 2002
- Turned the vertex and linedef indices in the map data structures into
	unsigned words. Everything compiled without warning, so maybe big level
	support really is that easy.
- Fixed: Maps with >32k unpacked sidedefs could not be loaded because
	sidei_t::a.map in p_setup.cpp was still signed.
- Changed: REJECT lumps with 0 length won't even be loaded now. And REJECTs
	that have some length but are nothing but 0s will be freed.
- Fixed: The sprintf in the first case of D_WriteUserInfoStrings() had an
	extra comma, so it would crash, making demo recording impossible.
- Fixed: DArgs::CheckValue() did not check to ensure that value is valid.
	(That is, that it does not begin with + or -).
- Fixed: Trying to add more bots than there are starts in a coop game would
	leave the extra bots as "active", so you could not spawn them even after
	removing the existing bots.
- Fixed: Players could not choose their weapons if they loaded a savegame
	before starting a new game because weapon assignments were only transmitted
	at the start of a new game.
- Added separate translation tables for the player corpses so that when a
	player dies and comes back with a sprite that uses a different palette
	translation range (i.e. a mage dies and is reincarnated as a fighter),
	the corpse will retain the translation the player had at death. This also
	means you can't change the color of your corpses anymore.

December 19, 2002
- Uploaded 27.cab.
- Fixed: The internal node builder was not setting bPolySeg, so segs would
	be randomly marked as belonging to polyobjects if you used the internal
	node builder.
- Uploaded 26.cab.
- Fixed: TELEFOGHEIGHT was not being used everywhere it needed to be.
- Changed: P_DropItem() uses the standard Doom drop for items that don't
	have gravity (such as the Mage's lightning weapon).
- Changed: Dying puts you into chasecam mode.
- Fixed: The fighter's axe and hammer could not be picked up for mana by the
	other classes.
- Moved the assignment to waitingforspawn inside SpawnBot() past the checks
	to see if any bots are left to spawn.

December 18, 2002
- Fixed the "give armor" cheat for Hexen.
- Added artifacts and puzzlepieces as categories for the give cheat.
- Replaced Killough's blockmap builder with the one I had written for ZDBSP.
	The MBF one was found to be incorrect near vertex 0 of Doom's E3M6. There
	are probably other problem spots, but that's the one that was first
	noticed.
- Fixed: Hexen_sbar.cpp had WPIECEM1 misspelled as WPEICEM1, so the top
	part of the Bloodscourge would not appear in the status bar until you had
	the complete weapon, which causes a different graphic to be drawn.
- Fixed the elusive hub crashing bug introduced by my November 26 but/hub
	"fix". Parsing of NEW_PLR_OBJ and NEW_PLR_CLS_OBJ when m_HubTravel is
	true would wait until the object had been parsed before mapping it to
	an index. It needs to be mapped immediately after being created so that
	any references to it in its stored data will actually refer to it and
	not the next object in line.
- Fixed P_SetSectorFriction() so that using a friction amount of 100
	calculates the standard movefactor 2048 instead of 255.
- Changed Sector_SetFriction so that when it's used from a script, it will
	clear and set the sector's friction flag as needed.
- Fixed: The fighter's axe and hammer would still use mana when infinite
	ammo was turned on.
- Fixed: P_SpawnPlayerMissile spawned missiles with a facing direction
	slightly to the right of their real direction when there were no monsters
	for it to autoaim at. Among other things, this made the frost cone fire
	right of center.
- Fixed: Picking up a flechette would only give you the fighter's variety
	because I forgot to uncomment some code after adding the other two player
	classes.

December 13, 2002
- Uploaded 25.cab.
- Added a hack for 256-tall textures with patches that mark their post
	lengths as 0. This lets pleiades.wad and its skies work.
- Multiplied the output of the OPL chips by two so that they aren't so
	quiet.
- Gave opl_onechip a callback so that changes to it can take effect
	immediately.
- Fixed: findFreeChannel() in mlopl.cpp could crash when going from two
	chips to one, because it did not reset the value of last.

December 12, 2002
- Fixed an original Hexen bug: EV_RotatePoly() set the first polyobject's
	special data to a rotator, then it created a new rotator and assigned it
	to the mirror polyobject's specialdata, and then it also assigned the
	second rotator to the first polyobject. This left the first rotator
	forgotten, and if a player got in the way of one of the polyobjects so
	the other one destroyed the rotator, it could crash.
- Uploaded 24.cab. Why cab? Because LZX compression is better than ZIP, and
	I'm stuck uploading files with a 56k modem. That's why. The source code
	archive alone is almost 700k smaller as a cab than as a zip. That's at
	least four or five fewer minutes that I need to wait uploading it.
- Fixed: Bloodscourge projectiles would not pass through non-boss monsters
	because AMageStaffFX2::SpecialMissileHit() was incomplete. It is a much
	more dangerous weapon now.
- Fixed: ACircleFlame needed a GetExplodeParms() member function so that it
	would do the correct damage and not harm the player.
- Uploaded 23.cab.
- Fixed: Dehacked weapon patches did not set the new FWeaponInfo::givingammo
	field.

December 10, 2002
- Uploaded 22.cab.
- Fixed: If you had a bot with you in a co-op game and you switched levels,
	the bot would come with you as normal, and it would also spawn a new copy
	of itself later, so you would now have two bots instead of one.
- Moved the player name display for spying up slightly so that it isn't
	obscured by the Hexen status bar.
- Added support for terrain-defined friction, so the Hexen ice flat can
	behave like ice.
- Fixed: Weapon pieces were not behaving like weapons with sv_weaponstay on.
- Fixed: The spinning invulnerability and maulator icons that appear at the
	top of the screen when they are active were not right-aligned.
- Fixed: The maulator artifact had the wrong status bar image.
- Fixed: Using Dragon Skin Bracers to get more than 100% armor would mess
	up the armor display in Hexen's automap status bar.
- Now I know why I didn't direct hudmessage and print commands to the
	screen of spying players. Changed it back to the way it used to be, so
	it doesn't pay attention to the player's camera when deciding whether it
	should take effect or not. One solution for this would be to have
	separate status bars for each player and just route the messages to the
	appropriate status bars. Probably too much effort at this point.
- Fixed: The player faces showed up on the scoreboard even when not playing
	Hexen.
- Fixed: The extralight from your gunshots would be used if you weren't
	looking through the eyes of a player.
- Uploaded 21.cab.
- Fixed an accidental problem when travelling between levels because
	I mis-blocked some code in WI_End().
- Fixed: Using a flat as an intermission background instead of a full
	graphic would not print any text.
- Fixed: FWeaponSlots::StreamInSlots() only cleared the even slots,
	so weapnext/weapprev failed, and weapon selection in odd slots would
	work wrong.

December 9, 2002
- Fixed: Dormant monsters would respawn when monster respawning is
	enabled, losing their dormant state and any specials they were given.
- You can spy through your teammates' eyes in deathmatch now, and you
	can also see them on the automap.
- Added face icons to the Hexen scoreboard.
- Gave the bots some minor knowledge of Hexen weapons.
- Fixed: The fighter would not get any mana when he picked up his axe
	or hammer.
- Added the Hexen finale and intermission screens.

December 6, 2002
- Removed M_PBOX from zdoom.wad. M_DrawFrame() draws the box around the
	player in the menu now, since it works with all games and not just Doom.
- Added some more choices to the sound options menu.
- Added support for setting player sounds by their real names in skins
	(i.e. *xdeath instead of pspdiehi), and added a few more sound mappings
	for the Legacy names.
- Added simple palette remapping for skins so that Doom skins can be used
	while playing Heretic.

December 2, 2002
- Added software OPL2-synthesis for MUS music in order to mimic "the
	good old days." I haven't had a soundcard with an OPL chip in six years,
	so I don't know how accurate the sound is, but I think it's reasonable.
	Pity it takes around 10% of the CPU time on my Athlon XP 1600 (at 44.1 KHz).
	The MUS player part of it comes from Vladimir Arnost's MUS Lib, and the
	OPL2 part of it is from MAME.

November 28, 2002
- Fixed the player setup menu to work with scaled sprites, and added an
	option to skins so you can set the scale for more than just the base
	sprite.
- Gave each player their own set of weapon slots, so custom slots can be
	used in net games and demo playback.
- Added player translations for Hexen.
- Added player class filtering for the Hexen fourth weapon pieces.

November 26, 2002
- Added player class filtering for the Hexen weapons.
- Added the "Healing Radius" artifact.
- Fixed a hub travel bug when playing with bots. If there were more bots
	in the level being travelled to than the one travelling from, the load
	would fail.
- Fixed: ASorcBall::Serialize() did not call its super method.
- Fixed a hub travel bug introduced by the version tracking code:
	SaveVersion would not be set before a game was actually saved or loaded,
	so snapshots would not load back properly until that happened. Another
	related problem is that somebody could load an old savegame with
	multiple snapshots and then save it again without revisiting all the
	snapshots. Thus, a savegame could have snapshots created with different
	versions of the game, so each snapshot needs to carry version information
	around with it.

November 25, 2002
- Changed the ACS print and hudmessage commands so that if a projectile
	activates a script, they will print to the screen of whoever fired the
	projectile instead of failing because the projectiles don't have a screen.
	Also changed them so that they show up for anybody spying on the person
	who activated the script.
- Added the pig.
- Disabled skins in Hexen, and changed the player setup menu to show class
	instead of skin when playing Hexen.
- Added "random" as a choice in the Hexen class/new-game menu.
- Fixed: p_GiveArmor() gave the negative value of the desired armor, which is
	effectively the same as always giving blue armor.
- Fixed the weapon slots so that they can accurately determine if a weapon
	using both types of mana can be selected.

November 23, 2002
- Put Hexen's new game menus in place, although you still can't select a
	player class.
- Disabled blood splats for players using the god mode cheat.
- Added palette flashes for Hexen's poison and ice damage and the Wraithverge
	and Bloodscourge.
- Added the Bloodscourge and Wraithverge.
- Changed sound loading to use the heap instead of zone memory, so large sounds
	can be used (although it's probably a bad idea nonetheless). Also added a
	fallback mechanism so that sounds that are too big for hardware buffers will
	be created in software instead.
- Fixed the Doom status bar so that removing a key from the player's inventory
	will remove the key from the status bar without having to manually hide the
	status bar first.
- Added FloorClip as a property for use with DECORATE.

November 22, 2002
- Added WAVE loading to the alternate mixer.

November 21, 2002
- Added an alternate sound mixer that bypasses FMOD and and does all the sound
	mixing itself, feeding it to a DirectSound buffer directly. This is not
	meant to be a complete replacement for FMOD, so it's pretty basic. It's not
	even particularly optimized. I only wrote it in the hope that it alleviates
	the BSODs a very few people got without -nosound.

November 19, 2002
- Changed ThrustThing to mimic the original P_XYMovement() MAXMOVE clamping.
	Setting the third parameter 1 will let you use any thrust you want.
- Put back the maxmove restriction for underwater actors, but it should
	probably be handled differently.
- Fixed: Respawning in single player would execute respawn scripts instead of
	enter scripts, and travelling to a new map without being dead would not
	execute respawn or enter scripts.
- Fixed: Only the first entry in each DECORATE lump would be processed.
- Fixed P_XYMovement() so that startx, starty, onestepx, and onestepy are
	properly recalculated after sliding along a wall. This seems to have fixed
	the ability to go through walls at corners when moving very quickly. I hope
	there aren't any other bugs lurking in there.
- Fixed recording of compressed demos: The demobodyspot and democompspot
	pointers were not being moved when demobuffer would get realloced, so
	replacing the BODY chunk with compressed data would stomp on invalid memory.
- Fixed: P_SlideMove()'s stairstep case still used mo->momx instead of tryx.
- Fixed G_QueueBody() and the pointer cleanup in dobject.cpp so that it
	doesn't try to destroy bodies that were already destroyed outside of
	that function (such as by a crusher squishing the body).

November 15, 2002
- Added the Quietus.

November 13, 2002
- Hexen has a status bar now.

November 9, 2002
- Changed CheckIfExitIsGood() so that dead players cannot exit a level.
- Fixed: The ThrustThing special is supposed to add to the actor's velocity,
	not set it.

November 8, 2002
- Imported the node builder fix that splits segs collinear with a splitter
	with any events they cross. This is only necessary for bad maps that have
	overlapping linedefs.
- Changed dehacked text replacement so that if a pickup sprite's name is
	changed, the identification map used by DehackedPickup is also updated.
	This lets you pick up Strain's shotgun, plasma rifle, and BFG replacements.
- Changed bot_observer mode so that it does not set the player's MF_SHADOW
	bit.
- Changed P_LookForPlayer() so that it does not "find" players without the
	MF_SHOOTABLE bit set.
- Added floorclip adjustments for sectors that have their floorpics changed
	or move their floors.
- Fixed floorclipping so that it chops off the same amount of space for all
	vertical sprite scales (as opposed to chopping off x rows from the bottom
	of the source sprite).

November 6, 2002
- Removed the menu title graphics from zdoom.wad because they can just be
	drawn using BigFont.
- Moved "Player Setup" into the options menu and removed the last vestiges
	of the old fire effect for that menu.
- Extralights don't work with the release build. Oh well.
- #if-ed out the decal-out-of-range code again, because I think it should
	finally be fixed thanks to the recent changes to PrepWall.
- Made some changes to allow for loading earlier format savegames. Right now,
	that means ZDOOMSAVE200 games can still be loaded. Earlier versions won't be
	supported.
- Added Dehacked Gravity and LowGravity code pointers.
- Made demo_compress a global config cvar.
- Changed the ini's location to be "$PROGDIR/zdoom-$USERNAME.ini" because
	some people have multiple copies of ZDoom installed in different directories
	for different IWADs, and they might want to use different configs with them.
- Fixed sector triangle finding for area-less sectors.

November 4, 2002
- Added more correctness checks to PrepWall() and PrepLWall() to check for
	out-of-bounds texture columns. The very-near-a-decal-crashing problem should
	be solved now.

November 2, 2002
- Restored the menu_gameplay command I had accidentally removed.

October 31, 2002
- Added a check to A_Lower() to ensure that the pendingweapon is not
	wp_nochange.
- Fixed: The ACS SetWeapon command checked if there was enough weapon to use
	the current weapon, not the one being switched to.
- Fixed: The FFont* serializer could only use already loaded fonts. It could
	not load any new ones, so some FFont pointers could be initialized to NULL
	after reloading a savegame from a previous session.

October 30, 2002
- Merged the separate floorcolormap and ceilingcolormap sector members back
	into a single ColorMap member.
- "3D lights" can color floors and ceilings now.

October 29, 2002
- Decided to do something fun, so I added support for rendering "3D lights"
	on walls.
- Changed HealThing special so that it does nothing if the actor's health
	is already above the specified maximum.
- Fixed: The eyes crossing fake floor/ceiling special actions were only
	checked when moving vertically. They also need to be implemented for
	horizontal movement in case the fake floor/ceiling is sloped.

October 23, 2002
- Fixed: The MF3_GHOST flag was not cleared when the invisibility
	artifact wore off.

October 21, 2002
- Added Ceiling_Waggle as special 38.
- Added a check for a 0 maxmove to P_XYMovement() because P_DoCrunch() sets
	the gib's radius to 0.

October 15, 2002
- Restored the old x2 calculation in R_ProjectSprite and changed the
	iscale calculation so that it is based on the x1, x2 values instead of
	the inverse of xscale.

October 14, 2002
- Reenabled the error check in WallSpriteColumn() because it seems it can
	still happen. Now it has a bunch more debug spew and exits with
	I_FatalError().
- Changed the x2 calculation in R_ProjectSprite() because the old method
	could cause a sprite to be drawn one pixel too wide under rare
	circumstances.
- Fixed: R_ProjectSprite() did not add one to thing->xscale.
- Added a check to the node builder for maps without any lines so that
	it can exit gracefully instead of crashing.
- Made Sector_SetFriction work from inside scripts.
- Changed Floor_RaiseByValueTxTy so that if it isn't activated by a line,
	the target's sector type is set to 0, and its floor is left alone. This
	should be much better than crashing.

October 12, 2002
- Imported all the changes from the standalone node builder to increase
	accuracy and add support for GL nodes.

October 10, 2002
- Fixed the ordering of the WTSRegisterSessionNotification call so that it
	(again) occurs after the window is created, so the message loop can
	actually receive the messages.
- Replaced the %p and %I64x format specifiers I was using in i_crash.cpp to
	equivalent %x replacements, because the Windows 9x version of wsprintf
	does not understand them.
- Made MinotaurSpecial, DSparilSpecial, IronlichSpecial, and
	SpecialAction_KillMonsters accessable through MAPINFO.
- Changed message handling in P_CheckKeys() so that the correct Heretic key
	messages will show up even if you don't flag the keys as "either will do"--
	a rather pointless thing for Heretic since it only has three unique keys.

October 1, 2002
- Fixed a bug in P_XYMovement() that could cause you to move exponentially
	faster when running on a slope along a wall.

September 30, 2002
- Fixed the Doom status bar so that the ouch face will show up when it was
	intended to.

September 27, 2002
- Removed Infight from DehInfo so that monster infighting can be completely
	controlled by the cvar.

September 26, 2002
- Fixed FDoomEdMap so that it works with negative thing numbers without
	crashing.
- Fixed dehacked text substitution trying to compare against a null music name
	in the predefined mapinfos.
- Fixed "Monster Ignore Each Other" infighting mode so that player projectiles
	can damage monsters.
- Changed P_SlideMove so that it can use the smaller steps from
	P_XYMovement, so if something is moving very fast and slides along the wall,
	it shouldn't be able to pass right through small obstacles next to the wall.
- Fixed: If a move was split into multiple steps and you went through a
	teleporter, the remainder of the move would still be executed from your
	original position, rendering the teleport useless.

September 21, 2002
- Played around with a 140 Hz TICRATE for a while. The high framerate was
	nice, but there are too many places that implicitly depend on a 35 Hz TICRATE
	(physics in particular) for me to try and truly fix the game for variable
	TICRATEs before a final release.
- Removed the unused P_CalcSwing() function and its related global variables.

September 18, 2002
- Fixed the use of seg grouping in the node builder so it actually works as
	intended. The mechanism GroupSegPlanes() uses to group segs was also
	changed before I discovered the real problem with it: SelectSplitter()
	was using r = pseg->planenum & 7; instead of r = 1 << (pseg->planenum & 7);
	The new grouping scheme may not have been necessary, but it should be
	faster at least.

September 17, 2002
- Removed playernumber from DCajunMaster. The only time it was used for
	something non-local was in the ThinkForMove method, but its use there
	was inconsistant with its other uses. Apparently, ThinkForMove expected it
	to be the maximum player number plus one, but SpawnBot stored the most
	recently spawned bot there instead. This could crash ThinkForMove if
	the most recent bot spawned was player 0. Replacing its use in ThinkForMove
	with MAXPLAYERS seems acceptable.

September 14, 2002
- Added optional logging of ACS hud messages.
- Upped the number of local script variables to 20 to match ACC 1.25.

September 12, 2002
- Changed ACS function importing so that imported functions cannot be
	"chained" from one library to the next.
- Added code to properly tag string arrays.
- Fixed a hang that could occur when importing ACS arrays.
- Added a little more information to the crash report.
- Changed WndProc so that it only resets the language if the WM_SETTINGCHANGE
	message was sent as the result of a locale change.
- Figured out how to make the crash collector work with secondary threads:
	Using an UnhandledExceptionFilter, the information for that thread is
	collected, the thread is put to sleep, and an APC is queued on the primary
	thread. Once the APC executes, it raises a software exception that gets
	caught by the outer-most __try block, and the primary thread shuts down
	and shows the crash dialog. I think it would be better if I could raise
	exceptions in any thread I wanted, but this will suffice. As long as
	I_GetEvent() is called often enough to put the thread in an alertable state
	using SleepEx, the APC should be able to execute without much delay.

September 11, 2002
- Finished the crash information collection code.

September 9, 2002
- Changed "give armor" cheat to give armor equivalent to blue armor, even when
	Dehacked is used to modify the blue AC.

September 7, 2002
- Fixed: Imported libraries had their source libraries recorded wrong.

September 5, 2002
- Fixed hud messages so that they restore the screen's previous font instead
	of always assuming the previous font was "SmallFont".
- Changed the node builder so that segs with the same front and back sector
	can be a part of a subsector with segs from a different sector. Although the
	result is not a proper subsector, it is okay because such segs can only add
	masked mid textures to the scene, and those use the seg (not the subsector) to
	find out which sector they belong to. This fixes the area by the fence in
	tqtrust MAP04 when the internal node builder is used.
- Changed PTR_SlideTraverse so that blocking two-sided lines are treated like
	one-sided lines.
- Fixed the nodebuilder so it works again without crashing.
- Fixed: ExtractFileBase did not understand files with a drive specifier but
	no path. i.e. It would consider the base file name for d:myfile.foo as
	d:myfile and not myfile.

September 3, 2002
- Changed the "This map has errors that must be fixed" message to be more
	specific about what exactly needs to be fixed.
- Made MDK work only in non-deathmatch games, even if sv_cheats is true.
- Added the following contributions from Stevie-O:
	+ Fixed: AImpactDecal::CloneSelf() would cause ImpactCount accounting to mess
		up if the clone had to be destroyed because it hit the sv_maxdecals limit.
	+ Fixed: Using MDK cheat would print blank lines to the console.
	+ Fixed: Respawning monsters could spawn inside other things because
		P_NightmareRespawn() was not changed to account for thing-over-thing.
	+ Fixed: Telefragged players would still show the FX_RESPAWNINVUL effect if
		it was active when they died.
	+ When bot_observer is true, players can no longer fire their weapons.
	+ Added sv_fastweapons cvar.

September 2, 2002
- Fixed: New-style behavior lumps without any scripts would crash the game.

August 31, 2002
- Made R_InitTextures more forgiving of errors.
- Changed DrawWrapper to clip columns to the patch's height. This "fixes"
	malgnant.wad's corrupt titlepic that crashed the game.

August 26, 2002
- Added a workaround to the DObject::DestroyScan()s because the bglobal object
	is not showing up in the Objects list.
- Added whereisini command to make finding the .ini easier for users.
- Removed MBF torque simulation. It made the corpses fall off the bridge
	at the beginning of the Hexen MAP40, and it was also responsible for the
	"boogying" chaingunners in the last room of Doom2 MAP22. I haven't checked
	MBF to see if they do it in MAP22 there too, but I thought it best just
	to remove it, since it was causing so many reports of anomalies--enough
	reports that I probably copied something wrong. Okay, checking MAP22 with
	PrBoom, the chaingunners do slide perpetually but nowhere near as bad as
	they were doing with ZDoom before.
- Fixed: After drawing the underwater scene after Heretic E2M8, the normal
	game palette was not being restored.
- Changed ASoundWaterfall's gametype from Raven to just Heretic. Although it
	exists in Hexen, it cannot be spawned in a map because of conflicting
	doomednums.
- Removed Linux -cdrom support because it's not needed.
- Used the new run-time subclassing abilities to add support for pickup items
	that are identified by sprite instead of by class. For it to work, a
	dehacked patch needs to modify an actor (in any way) with the pickup flag.
	Any pickup items touched like this will cause a new class to be derived
	from DehackedPickup. This class will clone the defaults of the original
	actor, and the original actor will be modified so that it does nothing
	but spawn the clone. DehackedPickup implements the functionality to spawn
	a copy of the desired item just long enough to pick it up.
- Changed DDrawFB::LockSurf so that it retries the resource creation
	multiple times if the error DDERR_UNSUPPORTEDMODE is returned (presumably
	because the NT Security dialog was opened and then closed).
- Added a check for players without bodies to R_SetupFrame(). This should
	never happen during normal play, but a dehacked patch could cause it to
	happen.

August 23, 2002
- Added a console warning when multiple actors try to map to the same
	doomednum.
- Removed Printf_Bold. Use Printf with a level of PRINT_BOLD instead. The
	result is exactly the same.
- Fixed a demo sync bug. When the user alt-tabs away, the game is paused,
	but the demo continues playing anyway. The fix is to change G_Ticker() so
	that if the game is paused, and the demo didn't do it, don't fetch more
	tic commands from the demo until the game becomes unpaused. Unfortunately,
	hitting a breakpoint in debug mode will still mess up demo playback, so
	I avoid pausing the game at all when the window is deactivated and a
	demo is playing if _DEBUG is defined.
- Fixed: When a multi-step move is blocked in P_XYMovement, the move needs
	to actually stop right away. This seems to be what caused wallrunning: In
	the first step, the player hit the wall, so his movement got clipped to it.
	In the next step, the player would continue in his original direction and
	travel further along the wall. Since I know what causes wall running now,
	I added the compat_wallrun cvar to enable it as desired.
- Reduced maxmove in P_XYMovement from (mo->radius*2 - FRACUNIT) to just
	mo->radius. This brings back wallrunning (unexpected), but I'm hoping it
	stops things shooting through walls when they're very fast. The original
	maxmove I chose seems quite high. I don't know why I did that.
- Changed Megasphere back to being pickup-able even when you're already full
	on health and armor.
- Fixed: Automap powerup did nothing.

August 22, 2002
- Fixed: Heretic's gauntlets are supposed to have their kickback set to 0 so
	that they don't push monsters away.
- Updated the source for FMOD 3.60: Changed FSOUND_Sample_SetLoopMode to
	FSOUND_Sample_SetMode and removed A3D support.
- Gave PTR_BounceTraverse() knowledge of ML_BLOCKEVERYTHING lines.
- Moved the check for MF2_BOUNCETYPE to the beginning of P_BounceWall().
- Added support for custom inventory classes. These are actors that behave
	like an inventory item and execute their special when touched, but they
	don't actually go in the inventory.
- Added a new field to DObject to record the object's real type. Now derived
	types created at runtime can be detected. I am now one step closer to having
	the scripting language in place. :-)

August 20, 2002
- Added support for custom decorative classes through the use of a
	DECORATE lump. Currently, all objects generated like this are
	recognized as being type Decoration instead of their real type.
	This isn't really a problem, but I would like to figure out a way
	to easily support objects that are identified as being of a
	run-time-created type.

August 19, 2002
- Fixed: DumpHash would count all the aliases and commands, not just
	the ones it counted.

August 16, 2002
- Added some new initialization code that was missing for old Hexen
	behaviors.
- Fixed: World and global variables were not stored in save games.
- Changed sidedef indices to be unsigned, so now you can have up to
	65535 of them in a level.

August 14, 2002
- Added support for 8 mouse buttons using DirectInput and at least 5
	mouse buttons using standard Windows messages. I extrapolated from
	Microsoft's docs for WM_XBUTTONDOWN/UP, so it will probably work with
	up to 8 buttons if Microsoft ever releases a mouse with more buttons.

August 12, 2002
- Finished adding support for ACS libraries. Now I just need to test it
	some more.
- Fixed: ACS arrays were not serialized.

August 3, 2002
- Added compressed demo support.
- Fixed: PCD_ASSIGNMAPARRAY accessed ACS_WorldVars instead of level.vars,
	so storing to arrays was unpredictable unless you never touched any world
	vars. In that case, it would always store to the first array declared.

July 31, 2002
- Fixed some stuff with local doors already performing a ceiling action.
	In particular, if the ceiling was moving but not as a door, its thinker
	would be replaced with a door thinker instead of being left alone.
- Wallrunning seems to be gone. I don't know when it disappeared. I
	certainly set out trying to fix it.
- Fixed: The stairstep case for stepping along the x-axis in P_SlideMove()
	was the subject of some incomplete copy-and-paste, which is probably why
	it was so easy to get stuck on diagonal walls.

July 30, 2002
- Added a third parameter to the TranslucentLine special to select the
	translucency type. Currently it can be 0 for normal translucency or 1 for
	additive translucency. Also updated the translators to handle Legacy's
	284, 285, and 287 types.
- Made textures with patchless columns work.

July 29, 2002
- Finally did the math for the conversion of the SSG's vertical spread from
	slope to pitch and discovered that I had it slightly too small.
- Added COMPATF_SILENTPICKUP flag to play item pickup sounds locally only.
- Moved NO_PASSMOBJ flag from dmflags to compatflags.
- Moved sv_ihatesounds into compatflags as COMPATF_MAGICSILENCE.
- Removed SNDCURVE from zdoom.wad. Playing Doom will now generate a sound
	curve compatible with the Doom's original distance attenuation.

July 22, 2002
- Started work on an output class that using IDirect3D8 instead of
	IDirectDraw2, but then I found out IDirect3D8 can't do paletted output.
	I was hoping to get descent blitter support out of it, but if I have to
	translate the image every frame, it might not be worth it. I could try
	getting tricky with the hardware gamma ramp so that I need only copy
	pixels out to the back buffer without doing any format conversion, but I
	don't know if it's worth it.

July 17, 2002
- Fixed session notification mysteriously crashing the game with a release
	build. Because the default calling convention for the release build is
	set to __fastcall, I need to explicitly specify that the functions I
	retrieved using GetProcAddress are __stdcall. (But that doesn't explain
	why they worked with the debug build.)

July 11, 2002
- Fixed some bugs when I_MovieDisableSound() is called when there are
	repeating sounds playing.
- Added some support for XP's session locking and fast user switching. Now
	you can use either, and the window will be able to properly restore itself,
	and it shuts down the sound when the session is locked. For some reason,
	I cannot get MIDIs to play in my other account. I would blame stupid
	Audigy bugs, but it doesn't work with Microsoft's GS synth either.

July 9, 2002
- Changed the behavior of MF_SPECIAL actors so that non-inventory actors
	will execute their specials when touched.

July 2, 2002
- Changed sector_t::FindShortestTextureAround and ::FindShortestUpperAround
	to not consider texture 0 for height determinations, so now they can return
	lengths greater than 64 if any lines around the sector have an untextured
	side. The compat_shortTex cvar can be used to get the original Doom
	behavior back. These functions now know about scaled textures and always
	return the result in world units.

June 25, 2002
- Made the C versions of the plane drawers work with non-64x64 flats.
- Added automatic scaling of 128x128 and 256x256 flats so that they get
	treated as if they were only 64x64 world units in size. Also added support
	for 8x8, 16x16, and 32x32 flats, which are not automatically scaled larger
	to fit a 64x64 cell.

June 19, 2002
- Added support for 128x128 and 256x256 flats on slopes.

June 14, 2002
- Added support for 128x128 and 256x256 flats on normal planes.

June 13, 2002
- Fixed: When a player spawned, the local player's view would be reset to
	whoever they spied through last.
- Fixed positioning of scaled pegged upper textures. I was not compensating
	for the texture's scale.
- Fixed: Demo sequence would loop to DEMO2 instead of DEMO1.
- Fixed handling of PNG tEXt chunks. I misread the specs, thinking that the
	keyword always occupied 80 bytes, but that's just the maximum size for the
	keyword. It can be smaller and does not get padded with zeros.

June 12, 2002
- Fixed: When missiles destroyed themselves right away in their death state,
	the game would crash if it tried to move them again (because their movement
	was divided into multiple steps).

June 11, 2002
- Fixed: BestColor_MMX set ebx before saving it, and it did it after ecx
	had already been shifted. I don't know why it worked at all.
- Changed the project settings to statically link to the CRT under VC7
	because I don't want to redistribute MSVCR70.dll.
- Experimented with separating the various games into libraries but stopped
	when I found out that I had no easy way to bring all the actor definitions
	into the executable that I wanted.
- Removed lots of warnings when VC7 is set to look for 64-bit portability
	complications.
- Added MF_COUNTKILL to ALostSoul and changed the monster counting to
	happen in AActor::StaticSpawn instead of at map load time.
- Fixed stylization of console backgrounds that are derived from title pics
	that are not 320x200.
- Added named thread support to the FHelperThread class.
- Moved zdoom.ini to the CSIDL_APPDATA directory so different users can have
	different zdoom.ini files.
- Added -cdrom support under Linux courtesy of Hirogen2.
- Added the work-around to allow FBaseCVar::ToInt() to compile with GCC 2.95.
- Added XP visual styles support for the dialogs.
- Added more OS names to I_DetectOS().
- Removed PROP_STATE_BASE because I could not get it to compile with VC7.
	All state sharing must now be done using inheritance.
- Changed the ALavaSomke definition to set the default alpha using an
	AT_GAME_SET function. Aside from causing VC7 to gobble up all available
	memory and crash horribly, using the PROP_Alpha macro in this situation is
	incorrect because it depends on information that is not available at compile
	time.

May 6, 2002
- Fixed spawn(spot) so that they only set MF_DROPPED for items and not
	everything.
- Changed R_DrawColumnInCache() so that it correctly draws patches with
	a negative originy.
- Added Thing_Hate special.
- Added a name string ("Unnamed") to the default level info so that using
	changemap to switch between maps without an associated level info does
	not crash (although it does prevent saving on those levels).
- Fixed the stringlist utility to sort string names case-insensitively
	because the game uses a case-insensitive search to find them.
- Initialized air_finished in P_SpawnPlayer so that if you spawn underwater
	after drowning in a multiplayer game, you won't start drowning immediately.
- Fixed: AArtiEgg and AGibs did not have spawn states so they could not be
	placed on a map.
- Fixed: Say(_team) did not check that they were called with any parameters.

April 27, 2002
- Added more error checks when loading the BSP tree.

April 18, 2002
- Removed the bot things list because it couldn't handle items that had been
	removed from the level.
- Changed movie playback to only exit when escape is pressed. Also disabled
	Alt-Tabbing away from fullscreen movies so that I don't have to worry
	about the messed-up state that can put things in.
- Fixed: When a movie was not found, I_PlayMovie could try to restore video
	resources it never released because runningFull was not initialized right
	away.
- Added a new Thing_ProjectileAimed special (178).
- Added MF2_SEEKERMISSILE to the RevenantTracer.
- Added slopes and aligned flats to the BUILD loader.
- Changed P_GivePower() to not check if the player already has the power
	when playing Doom.
- Added pattern matching for the -file parameter.

April 17, 2002
- Added a loader for BUILD maps. It's not very useful since the Doom engine is
	so much more limited than BUILD, but it's fun to be able to load them anyway.
- Added a NoAlert flag for splashes that you don't want monsters to hear.
- Removed the option of specifying multiple footstep sounds for terrain
	because the $random SNDINFO command can do the job better. (And no, footsteps
	are still not implemented.)
- Made splash sounds work even without a corresponding splash actor.
- Removed the MF3_VERYFAST flag. Any missiles with a speed of 100 or more will
	automatically be offset closer to the originator than a normal missile.

April 16, 2002
- Changed P_XYMovement() to take smaller steps when moving faster than is good
	for the actor's size.

April 15, 2002
- Changed floor bounces so that they properly reflect off of slopes.
- Added the CVAR_NOSAVE flag so that I can use it with sv_gravity and
	sv_aircontrol to avoid archiving them with a savegame. If I do save them,
	then reading them back will override the real settings for those variables
	that are stored in the level structure.
- Added the Thing_Damage special (119). It's similar to DamageThing, except it
	hurts things by TID instead of whoever activated it.
- Removed the LEVEL_NOSOUNDCLIPPING flag. When sounds are at maximum distance,
	they are very quiet and hard to hear so it didn't seem worthwhile to keep
	the code around for this.

April 9, 2002
- Fixed: Particles were not drawn in the color of their containing sectors
	when using light amp goggles.
- Added code to make the pain elemental move down if it's too close to the
	ceiling to successfully launch a lost soul.

April 6, 2002
- Fixed: P_TestMobjLocation() should test the central z of an actor with
	float bob, not its current z.
- Fixed: Only the colormap stored in the wad was created with new. The rest
	were still on the zone heap. There's also no reason why they need to be
	aligned to 256 byte boundaries.

April 5, 2002
- Added SPC music support using snesapu.dll.

April 4, 2002
- Changed text scaling at 800x600 and similar resolutions to keep everything
	square.
- Added two rotozoomers on top of the plasma to make it look more interesting.
- Fixed: Colors set with setcolor now carry over to new maps.
- Removed the sv_friction cvar because it was never used.
- Added a few substitutions for chat messages. Set chat_substitution to true,
	and $health, $weapon, $armor, $ammo, and $ammocount will be replaced by
	appropriate strings.
- Added /me support for chat messages.
- Changed the setweapon ACS command to disallow switching to a weapon the
	player does not have enough ammo for.
- Changed S_ChangeMusic() so that an empty string will also stop the currently
	playing music.
- Changed the announcements for player team and name to be shown only if the
	new values are different from the old ones.

April 2, 2002
- Added another bounce flag so that the bounce type can be selected by actor
	instead of by game.
- Fixed the [*.Autoload] ini sections so that they work with wildcards for
	files that are not in the current directory.
- Replaced the fire in the player setup menu with a plasma.
- Moved thinkers off of the zone heap.

April 1, 2002
- Changed R_FreeTags to move the rover back to the beginning of the zone.
- Moved sprite frames off of the zone heap because they constituted a lot
	of small locked blocks. Did the same for texture column directories,
	colormaps, switches, terrain types, skins, sound sequences, msecnodes,
	and SNDCURVE. The only things left on the heap now that are unpurgable
	are the level data.
- Added a calling history to the zone heap when compiled with _DEBUG so I
	can see where all the zone memory is going.
- Changed Z_Malloc so that it only throws away purgable blocks if doing so
	will result in a block large enough for the requested allocation.

March 28, 2002
- Added an extra max parameter to HealThing. 0 will uses the creature's
	spawn health as max. 1 will use the max soulsphere health as max. Anything
	above that will be used as an absolute maximum.

March 25, 2002
- Made sky textures that are scaled vertically draw properly.
- Made the sky textures scalable horizontally.
- Verified that the PNG loader really can handle the different filters.
- Made the weapon slots configurable.
- Commented out the code that prevents people from using dehacked with
	Heretic and Hexen.
- Changed the decision of whether or not to spawn puffs when a line attack
	strikes an actor into an actor property.
- Added code to set PuffType for all the bullet attacks in Doom.
- Changed P_CheckMissileSpawn to not decrement the missile's first tics if
	the tics are less than one. Now the Centaur Leader can shoot his missile
	when spawned in Doom.
- Added the projectiles Hexen only spawns from scripts.
- Fixed: $pitchshift could not be used before defining a sound, so none
	of the Hexen sounds that don't want to be shifted stayed unshifted.
- Fixed: ZXmasTree, ZBell, and ZSuitOfArmor had undefined mass.
- Fixed: ZPoisonShroom had undefined health and mass, and it didn't spawn
	a poison cloud on death.
- Fixed: The Heretic snake did not have an attack sound.

March 23, 2002
- Fixed: PCD_SETTHINGSPECIAL fell through to PCD_THINGSOUND.

March 22, 2002
- Fixed: When the minotaur stops charging, he now properly turns off his
	invulnerability.
- Fixed: The dehsupp utility was case-sensitive when adding names but not
	when using them, so bex patches could not specify the NOGRAVITY flag by name
	because it has the same name as the NoGravity function, and both versions
	of the name were stored in the dehsupp lump.
- Using a dehacked patch to set the initial bullets to 0 will now cause the
	player to start with their fist raised instead of the pistol.
- Changed the error message for switches with invalid second texture names
	to a warning.
- Fixed: The fighter boss's extreme death crashed the game because it used
	A_SkullPop, which assumed that the actor's player member was non-NULL.
- Gave the bots some knowledge of Heretic weapons so they don't slow things
	down so bad in that game.

March 21, 2002
- Added a teamplay scoreboard.
- Added: Bots now join a random team if they aren't specifically assigned a
	team in bots.cfg.
- Added: When teamplay is true, players (finally) use their team colors.
- Added a sector action that gets triggered when an actor hits the sector's
	fake floor. (doomednum 9989)
- Added another flash state to the pistol so that if people want to use a
	patch to make it behave like a railgun or plasma rifle (and keep the flash
	states), it will work without crashing.
- Fixed: A_FireCGun() assumed that flash states were present. This is not
	normally a problem, but dehacked patches can make this precondition false.
- Fixed: Ambient sounds saved their NextCheck time in gametics, so you
	wouldn't be able to hear them after a load until the game had been running
	at least as long as it had been running when you saved.
- Added support for encrypting ACS strings, and added the ACS_ExecuteWait
	shortcut to ACC. ACS_ExecuteWait(x, ...) is equivalent to ACS_Execute(x,...);
	ScriptWait(x); It uses the existing p-codes instead of introducing more of
	its own. Think of it as syntactic sugar.

March 20, 2002
- Added code to the node builder to group segs by their line equations so that
	when there are several segs that would create the same partition line, only
	one of them needs to be checked to see if it is a good splitter.

March 19, 2002
- Changed polyobj container detection in the node builder to work the same
	way it does in the game: A polyobject's subsector is determined by its
	center after it gets translated to its start spot--not by the start spot
	itself. One case where this distinction is important is the polyobject north
	of the dining room in Hexen MAP33; its start spot is in a sector different
	from where it appears.

March 18, 2002
- Fixed: When I inlined the point-on-line-side functions, I messed up and
	counted being right on the line as being behind it, when it should count
	as being in front of the line.
- Changed polyobject container detection to just mark the segs that form
	a loop around the polyobject spawn spot instead of all the segs in the
	sector. This helps keep the BSP from getting too deep around containers
	in nonconvex sectors and is also necessary for Hexen, MAP39 to build
	correctly.
- Improved the polyobject container splitting avoidance so that splitters
	colinear with the segs of the container are valid.

March 16, 2002
- Added code to the node builder to detect sectors polyobjects appear
	within and try hard to avoid using splitters that touch their segs.
- Improved the node builder so that it can split up convex areas with
	segs from different sectors so that each subsector only references
	one sector.
- Added support for loading maps without nodes or a reject matrix.
- Tweaked the heuristic used by the node builder to give more weight to
	splitters that split few lines.

March 15, 2002
- Fixed the console ticker so the node builder can use it.
- Changed subsector_t's firstline and numlines members to be unsigned,
	doubling the maximum number of segs a map can have. The built-in node
	builder doesn't try very hard to minimize splits.
- Added an internal node builder so that if any 0-length lines are removed,
	the nodes will still be valid. This may or may not actually be necessary
	depending on the node builder originally used; it's just to be safe. I
	make no attempt to fix convex areas belonging to more than one sector, so
	it's still a good idea to fix the map and use a better node builder. At
	least this one seems pretty fast: I can rebuild Vrack2's nodes in just a
	few seconds using a debug build.

March 14, 2002
- Lines of 0 length are now removed entirely from the map. Massmouth had
	invalid front sector references only on its 0-length lines, so removing
	them conveniantly lets it run again despite the beefed-up error checking.
- Removed the angle member from seg_t because it isn't really needed.
- Undid Killough's relayout of R_PointToAngle2 so that I can actually read it
	and do some optimization. Its compiled size is now 256 bytes less than
	before.

March 11, 2002
- Added the mage's first weapon.
- Changed A_SpawnFly to play "brain/spawn" instead of "misc/teleport".
	Changed the spawn cube explosion sound to "brain/cubeboom".
- Changed $ambient point attenuation parsing to use IsFloat() to check if
	the attenuation is present.
- Changed SNDINFO parsing so that non-male players can use random sounds.
- Did some space tuning to R_RenderBoundWallSprite() and R_DrawVisSprite().
- Fixed R_ProjectSprite() to calculate the correct left and right edges for
	horizontally scaled sprites.
- Changed the sound limit for Heretic's horn rod.
- Added LEVEL_SPECKILLMONSTERS to the definitions for Heretic's ExM8, where
	x >= 2, so killing the boss monsters will kill the rest of the levels'
	monsters, as it should.
- Fixed: The minotaur would stay invulnerable if his charge was interrupted
	before his one-second charge time was up (i.e. he hit something or went into
	his pain state).

March 10, 2002
- Fixed: If you visited Doom E2M9, saved, and then reloaded after quitting and
	restarting, the game would crash at the intermission because it would try
	to draw the Fortress of Mystery without loading its graphic first. This
	would also happen if you started with -warp 2 9.

March 9, 2002
- Added the cleric's first three weapons and the mage's second and third
	weapons.

March 8, 2002
- Added the fighter's axe and hammer.
- Added Hexen's cleric and mage bosses and Korax.
- Fixed: PTR_AimTraverse crashed when non-players aimed at ghosts.

March 7, 2002
- Added Hexen's puzzle items, boots of speed, krater of might, and fighter
	boss.

March 6, 2002
- Added Hexen's armor, bat spawner, and teleport other and dark servant
	artifacts.

March 5, 2002
- Added Hexen's wraiths, fog patches, flames, disc of repulsion, and dragon.
- Changed EttinMace, CentaurShield, and CentaurSword to use a crash state
	instead of A_CheckFloor. Now I can get rid of A_CheckFloor.

March 4, 2002
- Fixed: SendWeaponSlot and SendWeaponChoice need to be initialized to 255 at
	compile time. If they're left at 0, then weapon switch commands will be
	generated for the very first tic run if the level has not been loaded yet.
	This happens when playing demos from the command line, because they tic
	before loading anything (including themselves).
- Changed the health bonus's spawn id to 152 so that it isn't the same as the
	scripted marine's.
- Fixed: GetWordSpace in d_dehacked.cpp only allocated half as much memory
	as was needed. (But since x86 processors are fine with unaligned accesses,
	I don't really need to allocate memory. Ah well.)

March 2, 2002
- Fixed TossChunks() to toss the demons' chunks out in the correct directions.
- Finished migrating the code to the new RNG system. In the process, I
	discovered that constructors for static objects local to a function will
	not be called until the first time the function containing it is called.
	So all FRandom objects need to have global scope or else loading a savegame
	won't find any RNGs that haven't been used yet.

February 28, 2002
- Changed the random number generator system to use objects to represent
	different generators instead of array indices. Why? Because it makes
	adding new RNGs quicker--I just create a new FRandom object, and nothing
	else that uses random numbers needs to be recompiled.

February 27, 2002
- Changed the PNG reader and writer to use zlib streams directly without
	wrapper functions in order to use less memory. As part of this, I was
	able to test the case where a PNG has multiple IDATs to ensure that it
	gets read correctly, and ZDoom might now write a PNG with multiple IDATs.
- Fixed problems with the impact decal serializing: 1) The list of impact
	decals was messed up when loading a game. 2) Too many impact decals would
	cause a stack overflow because each impact decal would cause the next
	decal to write itself out before it finished writing itself, because it
	had to follow the list maintained in the tracer field.
- Extended the changemap command so that it can take an optional position
	number for maps that have multiple player starts.

February 26, 2002
- Fixed saving games without savepics. (Technically, because PNG is now used
	to store savegames, setting storesavepic to false will still leave an image
	in the savegame, because we need to create a valid PNG--but the image is
	only a 1x1 black grayscale pixel, so it adds just a few bytes to the file.
- Made savepics slightly taller to 162 pixels so that they look right when
	viewed with square pixels and no stretching.
- Fixed CRC calculations for extra PNG chunks so IE can be used to look at
	savegames, and there shouldn't be any problems loading them into image
	editors.
- Changed sprite serialization to save the sprite names instead of indices
	so that simply adding more sprites won't break savegames.

February 22, 2002
- Renamed snd_dolby cvar to snd_matrix.
- Made a few more general-purpose action functions accessible through BEX.
- Changed particles' right and bottom edges back to being inclusive instead
	of exclusive.
- Fixed: Shadowed masked blocks that were clipped drew the shadow on top of
	the regular image. The window when the clipping versions of the routine
	were used was also slightly smaller than needed.
- Fixed: Network games didn't work because the game forgot it was running a
	network game before it even loaded the map.
- Fixed the spawn and spawnspot ACS commands.

February 20, 2002
- Changed the savegame format to use PNG as a container. The use of chunks
	for different types of data helps reduce the need for introducing a new
	savegame version every time I change some little thing in what the
	savegames store, but the primary purpose for the switch is so that you
	can load the savegame into a paint program and see the savepic without
	having to do any extra work (except possibly changing the file extension
	to .png). It also gives launcher writers a public standard to use for
	loading the savegame pictures if they want to do so.
- Added the png_gamma cvar to control the gamma saved to PNG
	screenshots. Setting it to 0 will use the same gamma as the screen.

February 19, 2002
- Added support for writing PNG screenshots. PCX is still available as an
	option because it takes longer to create a PNG even at minimum compression.

February 18, 2002
- Changed LeftOffset and TopOffset in FTileSizes to signed words so that
	they can handle negative offsets (like they're supposed to).

February 16, 2002
- Changed actors' active sounds so that they only play if the actor is not
	already playing something on its voice channel.
- Removed the MF3_SEEISALSOACTIVE flag. Random sounds do the job better.
- P_SpawnPlayer() now clears spreecount, multicount, and listkilltime.
- Fixed: Spying through a bots eyes and then removing the bot would crash.
- Added \movebob\.25 as a default for bots.
- Fixed: P_SpawnPlayer() could not use the Hexen player 5-8 starts.
- Fixed: The view could still bob when you were dead if stillbob was non-0.
- Fixed an NT 4.0 waveout heap corruption bug that appeared with FMOD 3.5.
	I don't know if it's FMOD's fault, NT's fault, or the Audigy's drivers
	fault, but I have to initialize FMOD with FSOUND_OUTPUT_DSOUND before
	using FSOUND_OUTPUT_WINMM, or a heap used by the sound card's drivers
	will be corrupted when FSOUND_Close() is called.
- Updated the reverb code for FMOD 3.5.

February 14, 2002
- Added the friendly minotaur for Hexen.
- Added Hexen's flechette.
- Changed the Heresiarch's bishops so that they will automatically target
	whatever the Heresiarch is targetting.

February 13, 2002
- Added Hexen's keys.
- Changed P_BounceWall to take advantage of the BlockingLine global and use
	that as the line to bounce off of, if non-NULL.
- Added support for loading hexdd.wad as an IWAD, which really just means that
	hexen.wad is automatically loaded before it.

February 12, 2002
- Added Hexen's Heresiarch (Sorcerer).
- Fixed: Decals on an upper side used the lower texture to determine if decals
	are allowed and vice versa.

February 11, 2002
- The player_t struct now serializes the camera. Before, it always set it to
	mo when loading. I'm not sure why I did that, because it meant you lost your
	camera view when loading a game saved from a different camera.
- Fixed: SetWeapon only worked if passed the name of a Doom weapon. Anything
	else would make it crash.
- Changed HealThing so that it can max out at 200 for players.
- Added error checks for loading maps that don't have their BSP built.
- Added back "Health" as an item for checkinventory and "Armor" for
	checkinventory, takeinventory, and giveinventory.
- Fixed: The status bar face background was not translated to the player's
	current color. If you were playing a botmatch, the colored background would
	also not appear until you changed your color or respawned.
- Fixed: Loading a game before starting one would reset the skill to 0.
- Removed mouse grabbing from the Win32 I_InitInput. That happens later
	when the in_input cvar's callback is executed. This solves the problem of
	the mouse still being grabbed when startup fails.
- Changed startup handling so that if the game gets into its loop in the
	GS_STARTUP state, it will switch to GS_FULLCONSOLE so that the console will
	be useable. This can happen, for instance, if you specify an invalid file
	for -loadgame.
- Changed -loadgame to automatically append .zds to the specified file if it
	isn't already present.
- Fixed: DamageThing(0) did nothing instead of killing the activator.
- Fixed a potential crash when an alias causes itself to be removed as part of
	its execution.
- Fixed: Thanks to some left-over code when I changed the realiasing of
	existing aliases, the alias would be realiased, deleted, and then recreated.
	It should have just been realiased and not deleted.
- Fixed: Respawning after getting your head blown off (in Heretic or Hexen)
	would crash multiplayer games and could occasionally crash single player
	games as well. Those games set special2 to 666 when the player pressed
	space to respawn, and the severed head used this as a signal to remove
	itself. Because ZDoom cleans up stale pointers, this would leave the player
	without a valid camera for at least one frame before the player actually
	respawned, and the game would crash when it tried to draw the view. Now the
	severed heads wait until their player field becomes NULL before they destroy
	themselves.
- Fixed: BloodySkull and IceChunkHead would appear using the player's sprites
	because they were attached to players and inherited the skin. The fix is to
	add a dummy first state with a different sprite so that SetState will use
	the correct sprite.
- Added snd_fpumixer cvar.

February 8, 2002
- Added a new line to the miscellaneous dehacked section: "Monsters Ignore
	Each Other" will cause monsters never to target other monsters.

February 7, 2002
- Fixed: deh.MaxHealth was unused.
- Fixed: Operator<< for podoortype_t was call-by-value instead of call-by-
	reference, so polyobject doors could not be loaded properly.
- Changed sound code again so that unpositioned sounds do not call
	S_StopSoundID.
- Added A_SetFloorClip and A_UnSetFloorClip action functions for use by the
	cacodemon when it dies/resurrects.
- Added MF2_FLOORCLIP to the HellKnight.
- Moved the P_RunEffects() call so that it can be frozen in freeze mode.
- Added some new SNDINFO commands. $limit controls how many copies of a sound
	S_StopSoundID will allow. $pitchshiftrange controls how much a sound's
	pitch can change when using pitched sounds. And $pitchshift allows control
	of pitch shifting for a single sound.

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 DBaseStatusBar::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 been 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 worth (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 DBaseStatusBar::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 PLANEF_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 its 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_t, 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 its 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 J�rg 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 its 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.
