================================================================================
Changes since Eternity Engine v3.40.00
================================================================================
--------------------------------------------------------------------------------
05/01/11

Preparation for a new release is underway. Added a vapordemo utility to the
tools directory which can launch EE using CreateProcess with a specific command
line in order to give a professional interface to the "Blue Box" release.

--------------------------------------------------------------------------------
04/30/11

Added a "hal" folder to hold Eternity's system-agnostic low-level modules, or
what is otherwise known as a Hardware Abstraction Layer. We already use this
approach in i_sound.cpp, and it will soon be extended to i_video.cpp so that
Eternity can have an OpenGL-based 2D-in-3D video backend.

Added EX_ML_BLOCKALL ExtraData flag for linedefs at esselfortium's much-repeated
request. This is similar but not identical to ZDoom's BLOCKEVERYTHING flag, as 
it is lacking several hacks the latter has which allow things to see through 
block-everything linedefs under a set of haphazardly determined circumstances.
No thanks to that, I say.

--------------------------------------------------------------------------------
04/28/11

The videomodes list left over from before EE supported -geom has been removed.

--------------------------------------------------------------------------------
04/22/11

CSonicGo reported that the removal of status bar caching somehow even further
broke low detail mode, so effective as of now, Eternity no longer has support
for this. I have torn out all of the code and salted the earth where it once
stood so that it can never return :P This thing was unfortunately a thorn in my
side almost from day one, as it just kept accumulating more and more weird and
almost unexplainable problems.

CSonicGo also pointed out that GCC's strict standards compliance means you 
can't use unqualified names inherited from an unspecified template parent class.
Use of this-> to access data and method members is required because of a gaping
hole in the C++ standard that causes templates and inheritance to not work 
together properly otherwise. Bleh.

--------------------------------------------------------------------------------
04/17/11

M_ExtractFileBase will now truncate LFNs passed in, to allow the use of demo
files with names > 8 characters in base filename length. This was done to match
the logic earlier adapted in PrBoom+ and just recently in Chocolate Doom.

The PODCollection and Collection classes have been refactored so that they
derive from a common BaseCollection class which implements the portion of their
logic which can be shared. I also repaired a bad double construction problem in
Collection.

--------------------------------------------------------------------------------
04/16/11

Yet another massive round of recursive dependency removal has been undertaken,
but this is starting to seem like a never-ending chore.

I have finally gotten around to removing all caching of the DOOM status bar.
Impact on FPS determined to be infitesimal. In fact the game might even be 
faster.

--------------------------------------------------------------------------------
04/15/11

m_hash had a problem with a static array's declaration in MD5Hash which Visual
C++ ignored but upon which GCC predictably choked.

--------------------------------------------------------------------------------
04/14/11

Fixed some GCC warnings regarding the Thinker class, and fixed more instances of
string constants being assigned to char * members of structures.

Files are no longer mass-dependent on the d_dwfile.h header. This was a left-
over from years ago, back when d_io and d_dwfile were one header.

Also undertook another massive round of removing unnecessary inclusion of
headers through other headers.

Had to remove use of d_namlen in my adjustment to the base directory logic, as
POSIX states this to be an optional field of the dirent structure, and it seems
that GNU libc doesn't support it.

--------------------------------------------------------------------------------
04/13/11

The "wrotesound" hack has been removed from the I_SDLUpdateSoundCB post-mix
callback as it is unnecessary and incorrect to stop running the EQ when no
samples were written during the current mixing pass - this is due to the fact
that the EQ maintains a 3-sample buffer which needs to be pushed out to the
audio stream even if there's no new samples coming in. The chewing of CPU 
earlier observed was apparently due to Pentium IV denormalization problems,
which are now addressed with a "very small addend" factor adapted from the
original 3-band EQ code as found on musicdsp.org.

The d_inline define has been eliminated, since C++ supports "inline" natively.

Gez contributed a patch for mmus2mid.cpp which fixes a long-standing problem
with a message in TNT - Evilution's D_STALKS.

--------------------------------------------------------------------------------
04/12/11

Eternity will now no longer adopt a path as its valid base directory unless that
folder is observed to contain at least the files startup.wad, root.edf, and
a folder named "doom". Entryway apparently had problems in the past with EE
seeing an unrelated directory called "base" in its current working directory
and then refusing to run because it wasn't the real base dir.

Trailing slashes are now stripped from paths in several places before they get
passed to the C stat function, as that function seems incapable of finding a
path if the provided path string ends in a slash of either type.

--------------------------------------------------------------------------------
04/10/11

I moved all the XL parser class methods' code outside of their class definitions
because it was giving me bad Java flashbacks :P

Security improvements have been made to qstring so that if virtually any method
of the class is called which requires the buffer to be allocated, but the buffer
has not been allocated yet, it will go ahead and allocate its own buffer then at
that point.

This allows qstrings to now be used without an explicit intializer method 
being called on them, which is extremely important for supporting their use as
members of classes which only have a default constructor.

I have eliminated the "boolean" typedef in preference for using the native C++
bool type directly, as this allows a lot of #include statements to be eliminated
and also ensures that the bool type gets proper syntax highlighting in IDEs.

SMMU dynamic musicinfo addition has been refactored to match sounds, such that
unknown musics being requested will be added to the hash table on demand if a
corresponding lump can be found in a loaded wadfile. This is in preference to
the old system of scanning for D_ lumps in WAD files when they were added.

Added a findSubStr method to qstring.

Added an audio_buffers setting to system.cfg, as setting this to a higher number
seems to at least partially alleviate some of the sound skipping I am STILL
experiencing.

Support for the $edfoverride keyword has been restored to the new 
XLSndInfoParser class.

--------------------------------------------------------------------------------
04/09/11

I have completed the new state-based parser for Hexen SNDINFO lumps. Volume
clamp checks in the low-level sound code should be RANGECHECK-only, since this
is a condition which should never happen under ordinary circumstances.

NULL-origin sounds will no longer cut each other off unless they are the same
sound. So for instance you can only hear one Cyberdemon MOO at a time, but a
Cyberdemon MOO will not cut off a Boss Brain's wake-up sound. I think this is a
very good balance between compatibility and sanity.

--------------------------------------------------------------------------------
04/08/11

SHA-1 hashes are now computed on the combined header and wad directory of all
wad files that are loaded by Eternity.

Two new command-line parameters have been added to support this:

* -nowadhacks : Disables the application of all wad directory hacks, in case 
  there is an astronomically unlikely SHA-1 hash collision that breaks an 
  unrelated wad file. This would be repaired in the next release after being
  found, of course, by finding an additional way to distinguish the colliding
  WAD files.

* -showhashes : Outputs the wad file's SHA-1 hash to the system console every
  time a WAD file is added. This is for development purposes, since in order to
  add a hack, I do have to be able to see the SHA-1 hash code for the WAD file 
  :P
  
The one and only current wad hack is for Gothic DM 2, and it repairs the 
incorrect position of the FF_START lump in that wad by exchanging it with one of
the patch graphics (the lumpinfo_t's are swapped in the directory). Code for
wad hacks lives in the new w_hacks.cpp module.

--------------------------------------------------------------------------------
04/07/11

w_sound_update_type has been removed as it was no longer used, and I have merged
the three different Add*File methods of the WadDirectory class into one single
method, which reduces the code duplication that was going on there. The logic
does get a bit messy however and could use some revisiting to clean up later.

Added a Collection template class which is similar to PODCollection but can
store non-PODs, as it does placement construction and explicit destructor calls.

In preparation for adding the ability to have SHA-1-based hacks that can be
applied to the directories of certain well-known broken WAD files such as Gothic
DM 2, I rewrote the m_hash module into a series of HashAlgorithm and HashData
classes.

--------------------------------------------------------------------------------
04/04/11

I have added a PODCollection template class derived from ZoneObject which can
store POD objects and intrinsic C++ data types. This acts as a generalized
reallocating array, and efficiency is maximized as it does no unnecessary
constructor or destructor logic on these objects which explicitly do not need
it.

The MobjCollection structure has been refactored into a class and made to 
inherit from PODCollection<Mobj *>. It should be possible to replace almost all
use of reallocating array logic with the PODCollection class eventually.

--------------------------------------------------------------------------------
04/03/11

Added a toLong method to qstring which calls strtol.

MetaObject::toString has been reimplemented, as mentioned earlier, to use the
new getZoneSize and getBlockPtr methods that it inherits from ZoneObject. Used
together, these allow the entire MetaObject to be output as a hex dump instead
of only the parent class data, which isn't interesting at all - just a bunch of
linked list pointers.

The z_zone.cpp module has been permanently disabled with #if 0, and the 
ZONE_NATIVE define is no longer required to compile Eternity.

I eliminated all instances of ENCStringHashKey being accidentally passed into
varargs functions under the incorrect idea that this would invoke their implicit
conversion to const char * - obviously it does not.

--------------------------------------------------------------------------------
04/02/11

All metatable-related classes are now based on ZoneObject instead of defining
their own operator new and delete.

--------------------------------------------------------------------------------
04/01/11

It is now possible to reflect properties of the zone heap memory block into the 
object itself, and as a result there are methods to get the zone block pointer 
(an alternative to using dynamic_cast<void *>), and to return the true allocated
size of the object, which sizeof is not capable of doing (it returns the size of
the immediate type when given a dereferenced pointer - it is not polymorphic).

This latter facility can be used later in the MetaObject class to print out the
full object when doing the default hex dump behavior - currently only the base
class memory gets printed.

I have also fully revamped zone instrumentation so that it does not call
doom_printf but instead is drawn directly to the screen by code in d_main.cpp
using V_FontWriteText and the console font, which gives better formatting.

Bug fixes:
* P_CheckPosition3D shouldn't error out if it gets called during an old Heretic
  demo, which enable 3D object clipping even though the implementation is not
  the same and therefore they're not going to sync anyway ;)
  
* XLParser must return if root->index is equal to -1. This caused an I_Error 
  from W_CacheLumpNum if there were no SNDINFO lumps.

--------------------------------------------------------------------------------
03/31/11

Finally concocted a solution which allows non-POD Eternity classes to utilize 
zone allocation and tags and still have destructors called on them when 
Z_FreeTags is called. The ZoneObject class acts as a polymorphic base class to 
any class that wishes to be allocatable on the zone heap in this manner. 

--------------------------------------------------------------------------------
03/30/11

Started work on a finite-state automaton tokenizer for the XLParser class to use
after Randy Heit pointed out that treating the scripts as line-based wouldn't be
fully compatible, which really, I knew already, but I was being lazy ;)

--------------------------------------------------------------------------------
03/28/11

Rudimentary support for SNDINFO lumps is now complete. The parser is ZDoom
compatible via ignoring anything that isn't currently implemented, which means,
for now, almost everything :P  Currently the $MAP command is recognized but
doesn't do anything, and sounds can be successfully defined and then played back
using e_playsound or ACS.

Major milestone:
Korax is now audible in Hexen!

WORSHIP ME... and I may yet be merciful.

Then again, maybe not.


Linedefs in Hexen shouldn't have started out with their alpha set to 0, though.
This caused all 2S midtextures to mysteriously vanish. The fault for this bug
is the duplication of code between P_LoadLineDefs and P_LoadHexenLineDefs in
p_setup, something that needs to be rectified ASAP...

(Later)
I have extracted all the duplicated code out of the two linedef loader functions
and put it into a new shared routine, P_InitLineDef, which both call after 
parsing their specific map-format-dependent information into the line_t
structure. Yay!

--------------------------------------------------------------------------------
03/26/11

The deferred sound queue, a legacy bit of awfulness created as a workaround to
keep SMMU's implicit wad sounds feature working with EDF, has been removed and
replaced with a vastly simpler system - if S_SfxInfoForName requests a sound
from EDF which does not exist, and the mnemonic passed in matches an existing
DS lump, then it will create the wad sound using E_NewWadSound right there on 
the spot, in an on-demand system.

--------------------------------------------------------------------------------
03/21/11

SDL video centering should not be conditioned on the _WIN32 symbol in i_main,
since this functionality is supported just about everywhere SDL can run, even
including primitive non-windowing "window managers" on Linux which run every
application as a rect pasted to the screen without further adornment.

--------------------------------------------------------------------------------
03/20/11

Started knocking out some of the newest GCC's deprecation warnings with respect
to the assignment of string constants to variables or structure fields of type
char * (vs const char *). Some of these are a real pain in the ass to properly
fix however, as they cause const_cast to be necessitated in a couple of places
where these fields can also point to heap-allocated runtime-defined values. I
want to eliminate those eventually by introducing secondary fields which hold
the runtime value in addition to the normal const char * fields, but this is
very low priority.

Russell Rice discovered the /MP setting of Visual Studio 2008, and it sped up
Eternity compiles by over 50% via making proper use of my Intel Core 2 Quad's
four logical CPUs to do builds in parallel.

P_StartLineScript, which was previously only for Small scripts, can now defer
to running an ACS level script if there is no Small levelscript defined, With
the EE_NO_SMALL_SUPPORT symbol defined, the invocation of ACS through these
line types becomes unconditional.

In addition, the A_StartScript codepointer can now perform an ACS_ExecuteAlways
action if it is passed the new keyword value "acs" for the target virtual 
machine.

--------------------------------------------------------------------------------
03/19/11

By request of essel, ACS can now be loaded for DOOM-format maps by specifying 
the script lump to use for the map in MapInfo, with the new acsscript setting.

I have also implemented four new ACS specials:
* Thing_Projectile
* Thing_ProjectileGravity
* Thing_Activate
* Thing_Deactivate

Winnowing Hall now spews Imp fireballs if you walk up to the place where the
polyobject spinning walls should be ;)

Finally, I fixed an ominous warning from GCC concerning some undefined use of
va_arg in libConfuse which it claimed would cause the program to abort. This
was due to the odd promotion behavior which occurs in variadic functions in C
and C++, and was triggered by C++'s different treatment of enumerations.

--------------------------------------------------------------------------------
03/17/11

Catoptromancy once again comes to the rescue with a fix for EE's autoconf build
system, so it can once again be used by those who prefer it to the newer CMake
script.

--------------------------------------------------------------------------------
03/12/11

I changed the IWAD and resource wad tracking variables into static members of
the WadDirectory class and changed them to track the source IDs corresponding to
those wads instead of exposing their internal FILE handles for no good purpose.

--------------------------------------------------------------------------------
03/09/11

Continuing at last with EE's gradual conversion to a proper C++ architecture, I
have converted the waddir_t structure into a full-blown WadDirectory class, and
have refactored all the code in w_wad.cpp as a result into methods of this
object (excepting the non-"InDir" functions from the original code, which, for
now at least, persist as "convenience" functions for invoking methods of the
wGlobalDir object).

--------------------------------------------------------------------------------
02/14/11

Catoptromancy found a bug (or more of a "logic hole" really) in the low-level
app state maintenance code whereby EE could keep the mouse grabbed while in a
minimized state. Turned out the fix was as simple as adding a call to UpdateGrab
when an SDL_APPACTIVE event is received.

--------------------------------------------------------------------------------
02/09/11

Made an adjustment to the interim behavior of the PIT_StompThing3D function, by
user request, which will stop the ability of non-player objects to telefrag the
player if they occupy the same space during transition through a linked portal.
Players now "win" and will telefrag monsters instead. If two players pass 
through at the same time, *both* players will be telefragged. Hey, you gotta be
fair with this kind of thing! :P

--------------------------------------------------------------------------------
02/02/11

I added a parser for ZDoom-format translation strings to the EDF library module,
although it isn't used anywhere yet.

--------------------------------------------------------------------------------
01/29/11

Failure to write the configuration file should not be a reason to call 
I_FatalError; instead a message is now output to the console and the function
returns. This keeps Eternity from issuing an interesting error message about
terminating in an "abnormal fashion" for something so mundane as not having
write permissions to a directory.

I also had to restore some translucency checks that I removed earlier when 
adding linedef alpha support which were causing a crash for essel.

--------------------------------------------------------------------------------
01/22/11

Undertook a couple rounds of attempted optimizations, aimed mostly at trying to
improve cache performance, which is known to be the primary bottleneck inside
the renderer, to the point that NO change made to R_DrawMasked can affect the
framerate in any positive manner except by improving cache performance (or in
other words, the engine is completely cache-bound):

1. All redundant and unused fields were eliminated from core rendering structs
   including vissprite_t, drawseg_t, and seg_t. This rendered an average 2 FPS
   improvement in Sunder MAP12.
   
2. Tweaked all Visual Studio 2008 project settings toward maximum optimization,
   including the following amongst others I am probably forgetting:
   
   * Inline wherever compiler judges best practice
   * Prefer speed over accuracy for floating-point math
   * Enable compiler intrinsic functions
   * Whole program optimization / LTCG
   * Omit frame pointers
   * And most importantly, use SSE2 instructions.
   
   Altogether these optimizations render an average 10 FPS improvement in Sunder
   MAP12 on top of the 2 already gained from the tweaks forslightly improved 
   cache performance. Note that this means however that VC2008 builds of EE
   will no longer run on CPUs prior to the Pentium IV, however. I have since
   verified with IDA Pro that the SSE2 opcodes are used pervasively in the
   binary code, and apparently to great effect.

--------------------------------------------------------------------------------
01/20/11

I added a new P_LastEnemyRoar routine which gets called, outside old demo comp 
and if the option is set, whenever a monster changes targets due to BOOM's
lastenemy feature (the one controlled by option monsters_remember). It has 
always bothered me that this change removed the roars you would get every time
a monster finished off its current target and then became angry at something
else. These were often useful for guaging the progress of infighting in distant
areas of the map involving boss characters, such as the Cyberdemon - MOOOO!

I also finally got around to adding a proper Visual Studio 2005 project for
Eternity. Our main build is with 2008, but 2005 should be useful for maintaining
Windows 9x support for as long as it remains practical.

Started fixing the old automake script to work with the new C++ codebase as well
but this is unfinished and untested.

--------------------------------------------------------------------------------
01/18/11

essel noticed that I had inadvertently nerfed the edf-intername MapInfo option
back while working on MapInfo prototypes and changed the name of the command to
edf_intername.

--------------------------------------------------------------------------------
01/17/11

Adjustments made to FindIWADFile for the previous release left a situation where
a NULL pointer could be dereferenced. Really this function is a mess and should
probably be rewritten to use a qstring or a PU_AUTO string buffer instead of
malloc'ing and freeing strings over and over. But that's for later I guess.

DOOMWADPATH should only use ';' as the path separator on Windows, because ';' is
a valid filepath character on POSIX systems apparently. On those, ':' is the 
expected delimiter.

Additionally, upon user request, I coded a function called M_CheckMultiParm that
can check for an aliased command line parameter, and then used it to allow
-play and -recorddemo aliases to the -playdemo and -record commands, since their
syntax has historically been inconsistent.

--------------------------------------------------------------------------------
01/16/11

-vanilla was semi-broken due to the fact that G_SetOldDemoOptions needed to be
invoked *before* the call to G_InitNewNum. Otherwise it would setup the level
under current-version behavior, and the RNG would usually be totally off. I was
probably just extremely lucky back when I tested -vanilla initially. I also
noticed that the "basename" variable was starting out uninitialized in the
G_DoPlayDemo function.

--------------------------------------------------------------------------------
01/15/11

SoM fixed a bug which caused 1S linedefs to not generate portal overlay planes.
This was bugging essel in one of his vapormaps.

--------------------------------------------------------------------------------
01/13/11

Small scripting (deprecated though it may be) was entirely non-functional in the
old startmap due to my having moved GS_LEVEL set below the call to 
SM_LoadLevelScript.  Chasecam initialization should also not be done before
GS_LEVEL set.

--------------------------------------------------------------------------------
01/12/11

Finished support for heredoc-format sound sequences in EDF. This will also make
it dead simple later to pass in Hexen SNDSEQ entries and have them parsed by the
same code.

I have also, while working on sound sequences, added the ability to set a 
property on the sequence which will play ALL non-volume-specifying commands at
a randomized volume, which properly matches the behavior of the vanilla Heretic
executable with its built-in ambient sequences. Also followed up on a really
old idea of mine to have a volume scaling ability for global ambient sound
sequences, which is now controlled via the s_enviro_volume cvar. One reason this
is needed badly is because the sequences seem too quiet if played at vanilla-
compatible volume levels over the blaring Windows native MIDI synth instead of
the demure serenity that was Heretic's music rendered in OPL.

--------------------------------------------------------------------------------
01/10/11

I started work on a long-planned ability to specify EDF sound sequences in an
alternate heredoc-based format which matches the way they're defined in Hexen
exactly, aside from the "end" command still not being required since it can be
implicitly added at the known end of the sequence.

--------------------------------------------------------------------------------
01/09/11

SoM was able to figure out the problems that plagued portal overlays in the
previous release version.

I had to remove the I_FatalError calls from the default quad flush handler
functions, as EE actually calls them for some reason now, without any apparent
ill effects.

================================================================================
Changes since Eternity Engine v3.39.20
================================================================================
--------------------------------------------------------------------------------
01/08/11

Merged cpp-branch into trunk for 10th anniversary release. Eternity is now 
officially a C++ port, and the most compatible one in existence :)

See cpp-branch-changes.txt for information on changes that took place during
the branch development process.

--------------------------------------------------------------------------------
12/23/10

Removed a bizarre and incorrect toggle-on of the comp_zombie variable for demo
versions 200 through 202 which was either adapted blindly - or incorrectly -
from an early PrBoom version many years ago, and prevented all suicide and death
exits from functioning during -complevel 9 demo playback. 

This allows 30sdx2556.lmp to sync up until MAP11, at which point the player 
takes a sudden dive into a nukage river and then dies near some blue key bars 
after hurting himself with a rocket. I am told an Arch-vile jump is supposed to 
take place at the point where he falls into the river, so we probably have some
enemy behavior or clipping engine differences yet to be accounted for.

--------------------------------------------------------------------------------
11/20/10

Due to continuing and probably only worse-in-the-future issues with the C99
standard's refusal to provide ANY mechanism for structured type punning, 
something that Eternity had come to rely heavily upon to allow object-oriented
techniques to be applied in C, we have made the decision to move to C++.

This effort has begun with a new cpp-branch. Development on that branch will be
logged to a separate changelog file on that branch, which will eventually be
merged back into trunk once it is sufficiently stable.

--------------------------------------------------------------------------------
11/11/10

Again by request I've added an alpha field and ADDITIVE extflag value for
ExtraData linedefs, which enable use of flex translucency and additive blending
with lines. This has been technologically possible for years but I never got
around to adding a good way to access it, partly for lack of ideas.

--------------------------------------------------------------------------------
11/08/10

We have merged portal-clip branch into EE prematurely in order to pull in 
support for portaly overlays.

--------------------------------------------------------------------------------
11/06/10

Invalid subsector references will now be cleansed from the BSP tree, in order to
prevent access violations that will otherwise occur. This stops the long-noted
segmentation violation/venetian blinds crash in DEEPCRE.WAD's E1M1, which has an
invalid BSP tree in only one subsector, which consists of a single seg making
up a door track (glitchy node builder I suppose, probably didn't properly handle
degenerate subsectors).

Fixed a control path not returning a value in stopchan, which I recently rewrote
to help stop sound stuttering.

--------------------------------------------------------------------------------
11/05/10

Essel also found Cardboard glitches with respect to splitting visplanes and
drawing of segs across which the only differences were the angles of flats.
Somehow these checks got left out.

EE has hit r1337!

Added support for an MF4_BRIGHT flag by request. This flag can turn an object
fullbright on all of its frames without requiring the entire set of frames to
be manually altered to use the "bright" flag.

--------------------------------------------------------------------------------
10/31/10

Happy Halloween! Level-error-related console error messages have been improved
to include the numbers/indices of offending structures in the map in most cases.

I removed dependency on host ability to perform unaligned reads from the
GetLevelWord/DWord routines for additional portability.

I was getting severe stuttering in the sound engine and I suspected that it 
might be related to the recent d_fastrefresh tweak - possibly the main thread 
running in such a tight fast loop is pre-empting the sound update thread too 
often.

I moved reclamation of stopped sound channels, which can block the sound update
loop explicitly, out of the main loop and into I_StartSound, so that sound
channels are reclaimed when they are actually needed, and not constantly polled
for having been stopped. It seems to have stopped the stuttering.

esselfortium's ExtraData test map also uncovered a bug with skies and colormaps
which caused the last sector drawn's colormap to apply to all skies.

--------------------------------------------------------------------------------
10/25/10

An ugly bug surfaced today - when I rewrote cvars to support defaults properly,
I forgot that ct_constant cvars have value pointers. This was causing an access
violation if you tried to display the value of any constant, such as ver_name,
ver_date, or creator.

--------------------------------------------------------------------------------
10/24/10

Adjusted some ExtraData keywords for readability. Added proper support for 
multiple-level PWADs to the Master Levels / managed wad directory system, so 
that TEETH.WAD is now fully playable. Along with this tweak I added an optional
parameter to the w_startlevel command that allows starting a specific map from
a managed wad directory. So for example one can use the console command 

$ "w_startlevel teeth.wad MAP31"

and proceed directly to the secret level. The file named has to be in the 
directory currently enumerated by the Master Levels directory setting, of
course. Perhaps in the future Eternity can maintain additional enumerated
directories?

--------------------------------------------------------------------------------
10/19/10

Some problems with inputting blank values into the menu system that have existed
since the SMMU rewrite of the mess in MBF were resolved by adding a 
cf_allowblank console variable flag. Variables with that flag receive special
treatment in the menu system.

You can now escape or backspace out of the Master Levels menu after finishing a
level, and you will return to the title screen.

File paths are now displayed in the menu using "smart" truncation. While viewing
the item, the right-hand side of the string will be truncated to a fixed margin
and a ... will be appended. While editing the string, the input caret will not
pass beyond the same margin, and instead, the displayed portion of the string is
ran forward, and the left side is truncated with an ellipsis. This keeps your
typing in view no matter how long the string is.

--------------------------------------------------------------------------------
10/17/10

ExtraData sectors have now been completed with addition of support for 
overriding the TerrainTypes of a sector on a per-surface basis. I also repaired
a long-standing bug in the routine used to retrieve a terrain given an mobj_t
which considered only the thing's subsector, and not the floor it was standing
on. Because of the need for a demo comp check for this, I have bumped up the
version to 3.39.21. I also created some new macros, maek_full_version and
full_demo_version, that resolve long-standing problems with being able to 
easily compare demo versions down to the subversion level (not to be confused
with Subversion, as we do not track SVN revisions in the source currently).

--------------------------------------------------------------------------------
10/12/10

I decided to break up the various p_?enemy modules into smaller a_ modules that
contain various types of codepointers, some by game, and others by specific
ranges of functionality. The breakdown is as follows:

* a_counters.c - contains Eternity 'counter assembly' pointers
* a_common.c   - contains basic pointers shared by all games like A_Chase
* a_decorate.c - contains ZDoom-inspired, DECORATE-compatible pointers
* a_doom.c     - DOOM gamecode
* a_general.c  - Eternity generalized/parameterized pointers
* a_heretic.c  - Heretic gamecode
* a_hexen.c    - Hexen gamecode (very tenative; do not use!!!)

Yagisan has completely revamped the CMake system so that it is operational with
his automated compiler farm. This has extended support to some additional
platforms and brought in some additional warning and error fixes.

--------------------------------------------------------------------------------
10/11/10

Finally got back around to work on ExtraData sectors, possibly one of the most
put-off-after-being-started features in Eternity's history. I can't even 
remember when I started writing the code for these, but more and more things
just kept getting in the way. esselfortium needs flat offsets and rotation for
his uber-detailed slopes, though, and doesn't want to wait for UDMF to start
using them, so I'm pushing it through.

Started off by getting the parsing of sector flag fields functional, and loading
up offsets and floor/ceiling angles into the mapsectorext_t structure, which is
right where I left off before. I have also written a routine which will reverse
the angles into a clockwise orientation, in order to match ZDoom, which for
some reason I simply don't understand, considers flat rotation angles in the
opposite direction of DOOM's natural 3D coordinate system... so don't blame me.
I figured it would cause the least headaches in the future with UDMF 
interoperability if I chose to do it the same way in ExtraData.

================================================================================
EOF
================================================================================