[Note: see Changelog_pb1.txt for items up to public beta 1,
Changelog_pb2.txt for items changed between pb1 and pb2,
Changelog_pb3.txt for items changed between pb2 and pb3,
Changelog_pb4.txt for items changed between pb3 and pb4a,
Changelog_pb5.txt for items changed between pb4a and pb5.1, and
Changelog_pb6.txt for items changed between pb6 and 1.3.6.2. This file
contains items changed since 1.3.6.2]

--

- Work on bugzilla #214. Added more logging to the "FIXME - local has
# players, gamestart has # players" message. Would have been nice to
have this tested with the public b89* hotfix releases. But, some
people chose poorly. [NM]

- Code cleanups in vertex/index buffer code. Checked all
Buffer::GetDynamicLock (thru meshent) for size in proper range. [NM]

- Minor optimization - found some cases of items creating dynamic
index buffers with the same content, refactored to share one large
buffer. Affected systems: PathDisplay (shift-F9 view), tiled sky
(medium), sky points, Splat (on ground, windshield). Do test. [NM]

- Minor optimization - found some code using a static lookup table for
sines & cosines. Probably good in 1999 (or good earlier), but
nowadays, I think the cache hit (and cache pollution) is going to cost
more than doing the transcendental functions on the CPU. Affected
systems: light lens flares, Shield_Control, Twirl particles,
TwirlTrail particles. [NM]

- UI tweak - now does an asynchronous query for server extra data when
on the list of all MP sessions. Before, it was a blocking synchronous
call, which could lead to pauses, especially if the server was not
responding.  Now, it updates in the background. This might lead to
some flickering as the info populates a little after the server is
highlighted, though once the data's retrieved, it doesn't have to be
retrieved again. [NM]

- Massive redo of the way game object classes are stored in memory.
Now, tries to treat them all as read-only. This meant changing ~690
files, so there's a chance I've fat-fingered something along the way.
As a plus, this did highlight that every time a walker was created in
the world (and in multiworld, once a second or two, every walker is
[re]created), it was trolling thru its animations to figure out foot
positions. Moved that to a 1-time init bit of code shared w/
walker/crig/land creature, which should help with framerate slight.
Also refactored some copy/paste code for detecting cloaking morphtanks
to have one utility function called from two dozen places.

   Things to test: <everything>. More risky changes include 1) the way
walkers have their animations set up (refactored common code from
walker, construction rig, land creature). 2) Morphtank physics
(renamed to make them distinct from hovercraft), 3) recy/factory panel
interactions, 4) Recy/factory save/load (or MP joins). [NM]

- Refactored AI fire cone size calculation code to be in 1 root class,
not copy/paste in a dozen places. [NM]

- Fix for bugzilla #217 (I think). Before a .bzn/.sav save, completely
deletes objects that are in the queued list to be deleted at a safe
point. [NM]

- For non-public builds, added in a lot more sanity checks that player
inputs compress/decompress identically. This has been in my debug
builds, but having private testers run this code too will help
coverage. [NM]

-- b91a released==============

- Even more work on bugzilla #214. Non-public builds have even more
likely to complain at the first sign of differences between the server
player list and local on a join/resync. Did also make it try and
recover from differences better, including [re]synchronizing all
ivars/svars on a join/resync. Also made sure that ivar cache is
identical to varsys items all the time, will spam on problems. Also
rewrote some ugly code used to cache network-related commandline
params to be more modern. [NM]

- Removed logfile complaints re "timed out trying to clamp position on
map."  Haven't really figured out what the best course of action is
anyhow. [NM]

- Found, fixed case of memory trashing in globals. Out-of-range access
in AIP support code. This change will make joins/resyncs properly
clean up all team's AIP global info before loading -- which could help
w/ resyncs, making sure that things are more consistent on all
machines after a join/resync. Do test. [NM]

-- b91b released==============

- Far more typesafety on all of the EntityClass::Find() derivations.
For non-public builds, ensures that if the caller requests a
gameobject, ordnance, weapon, and/or explosion that the ODF matches
that. [NM]

- Work on a case of 'client not ponging' printed out relative to the
server. Added logging, and debug spam if the local clock ever seems to
have gone backwards. [NM]

- Possible fix for bugzilla #226,228. Made sure to call NNThink() from
only one place in the code. Looks like a race condition brought on by
async calls to Gamespy. [NM]

- Copied my set of DevStudio warning/error tweaks -- things like
having the compiler stop on an unitialized local variable -- into
DLLBase.h.  Also fixed two less-serious code warnings in isdf06/isdf09
missions, though the isdf09 error might have made the mission harder
than intended. As a programming aside, the ScriptUtils.h paradigm of
calls that look like this:

inline Dist GetDistance(Handle &h1, Handle &h2)

   make it nearly impossible for the compiler to figure out whether h1
or h2 might be used uninitialized. Passing by reference, as done here,
require deep static code analysis to see how the caller and/or the
callee use the variables. It is perfectly legal (though it might be
unwise) to pass an uninitialized handle by reference like above.  Some
programmers expect the callee to do the initializing. Some expect the
caller to do the initializing. When all the programmers aren't
communicating on the paradigm to use, you get unitialized
variables. For example, in isdf09.cpp, around line 249, it did this:

  Handle temp;
  if (IsAlive(player))
    temp = GetNearestEnemy(player);
  if ((GetTime()>shab_message)
      && (GetDistance(temp,player)>100.0f))

   Even with code warning ramped up, due to the caller/callee
conventions that are possible, DevStudio cannot/will not complain that
temp is possibly unused.  True, it will only be unused when the player
is *not* alive, and in a singleplayer mission, what happens then is
pretty immaterial.  But, a similar bit of code could exist elsewhere.
Given that I can't easily change the DLL API in ScriptUtils.h to
something that'll reliably catch the problem. I did scan thru all the
places in the SP/MP DLLs that had local handle variables, and initialized
the handles on declaration, e.g.:

  Handle temp = 0;

[NM]

- Found some member variables in Walker/LandCreature that were not being
saved/loaded properly. Might help with resyncs, not sure. [NM]

- Fix(?) for bugzilla #225. Walker's neck controls are updated after a
visual world swap, before they're rendered. This seems to avoid a
visual pop. [NM]

- Tweak(?) for walkers. Added to .odfs:

[WalkerClass]
GroundInteractHeight = 0.2

   If a walker is no more than (terrain height) + GroundInteractHeight
off the ground, then it does normal interaction. If higher than
(terrain height) + GroundInteractHeight, just 'falls'. Might help with
occasional rising up problems. Construction rig/land creature have
similar code, but I'd like to try and test out changes in one place
before copying around. [NM]

-- b91c released==============

- Initial work on bugzilla #235. DLL authors, please refer to DLL
source release after b91c, and note the call to
GetNetworkListItem(). Use that when possible, like the source. Also,
with new DLLs, please verify that user choices under 'map options'
like starting vehicles, AIPs, Human/CPU Recyclers, StratCTF goals, DM
animals all still work as before. [NM]

- Work on bugzilla #242. If various important initial DirectX setup
calls fail, it pops up a messagebox reminding the user to get a real
DirectX device. [NM]

- Probable fix for bugzilla #241 - makes sure that ICCheckList and
ICListBox release member variables in their destructors. This is a
really rare crash, so I can't be certain this is a full fix. [NM]

-- b91d released==============

- Fix for bugzilla #243. Mismatch in load/save code introduced in
b91d. Also squelched message when inappropriate. [NM]

-- b91d2 released==============

- Fix for bugzilla #210. Vast optimization for twirl render
class. Before, it drew every item as one quad (two triangles).  Now,
it works by batching by texture and 'binned' distance from camera.
DirectX works far more efficiently this way, where it prefers draw
calls that submit as much data as is reasonably possible at once. [NM]

-- b91d3 released==============

- Tweaks to various error handling functions. Any calls to windows to
open a dialog should suspend the watchdog thread around the call,
avoiding false positives. Also made calls to exit asap tell Windows to
just terminate the process. [NM]

- More work on bugzilla #210. LightningFeature::RenderBoltSegs()
should also batch things up. Compiles, but is untested. [NM]

- Fix for bugzilla #231. UnitTask::DoRocketBlast() now always clears
out the strafe controls if it's called for a non-treaded
vehicle. Treaded vehicles will leave the parameter alone. [NM]

-- b91d4 released==============

- Work on trying to reduce the CPU hit of skinned objects. Much more
SSE code, adding inline assembly when needed. Added utility function
for sparse batch transforms of vertices, as it skips a lot of
verts. Reorganized loops to try and write data linearly, even if it
has a ton of L2 cache misses reading data from all over. Profiler
seems to agree that I've made things a little faster when using the
bugzilla #234 savegame. [NM]

-- b91e released==============

- Slight optimization to skinning - convinced the compiler to try a
little more loop unrolling. Avoids a little branch-happyness. [NM]

- Optimization to Quaternion interpolate code. Did some tests in the
bugzilla #234 savegame, and found that in roughly 88% of the calls, it
was doing a lot of work interpolating between two identical
quaternions. Made it do an early-out check for byte-identical values,
and if so, the interpolation is just that value. Seems to work
here. [NM]

- Fix for bugzilla #252. Reverted back to slightly slower code on mesh
creation, as the faster code is too dangerous. [NM]

- Back to predefined table of sines & cosines for particle effects.
Sin/cos show up as faily expensive here in the profile of the bugzilla
#234 savegame.  Doing research, despite x87's FSINCOS instruction that
calculates both sin & cosine at once (which is what the particles
need), MS DevStudio has decided to deprecate that in favor of a long
SSE/SSE2 optimized loop that varies by CPU, etc. And only calculates
one at a time. I'm not quite ready to break out the x86/x87/SSE
assembly yet for this code, as it really ought to end up on a shader
someday anyhow. Some day in 2017, at this rate. [NM]

- A whole bunch of optimizations for the interpolating of objects. In
addition to the quaternion interpolate code, now keeps track at an
object level if it's ever moved. If it hasn't, it can skip some large
pieces of somewhat expensive code. This will help most on maps with
large numbers of preplaced static props. Also added in more prefetches
as it trolls through the object hierarchy tree -- if I can guarantee
it's going to start using a data item later, then it's requested some
time before actual use. Profiler seems to agree that I've made things
a little faster when using the bugzilla #234 savegame. [NM]

-- b91f released==============

- Possible fix for MP issue introduced last build. Forces it to
rebuild matrices after load. Was caching a little too much. [NM]

-- b91f2 released==============

- Possible fix for MP issue introduced in 91f. On loading, some child
objects didn't have optimization flags that matched parents. Forced it
to resynchronize those flags at load time. Now, scavs work correctly
in MP here. [NM]

-- b91f3 released==============

- Fix for bugzilla #256 - dropship in isdf01 fixed. Didn't do a 100%
revert on some code. [NM]

- Re-enabled network.unsync, network.addlag to private builds. [NM]

-- b91f4 released==============

- More work on optimizing skinned objects. Now uses a shared index
buffer for all objects of the same mesh. Chromed non-skinned objects
use a slightly faster inlined loop, fewer function calls. Tried SSE
optimizing TwirlTrailRenderClass::Render(), as that was a hotspot in
the bugzilla #234 savegame, but that turned out to be a net loss,
oddly. [NM]

- Speex DLL should be compiled w/ SSE on in all cases. [NM]

- Fix for bugzilla #260. Shouldn't recurse infnitely causing a stack
overflow if a msh is malformed. [NM]

-- b91f5 released==============

- Fix for LAN scanning, broken between b91a and b91b. New code didn't
check for empty string the same way. Also made it successfully restart
a gamespy scan after a timeout. Also fixed some Winsock errors noted
in debug builds while doing LAN scans on my Win7/64 box that didn't
show up on my XP boxes. Was probably recovering and doing the right
thing in end-user release builds, but good to be more defensive in all
cases.  [NM]

-- b91f6 released==============

- Fix for bugzilla #272. Verifies attack groups and attack group
targets early and often, and tries to behave defensively if the target
or attack group disappears. [NM]

- Added new 3rd party library to code. Not hooked up yet. Probably
will leave no traces until hooked up. Wish it could be a DLL so its
footprint could be shared between bzone.exe/bz2edit.exe. [NM]

- Fix for bugzilla #255. Found case where the server could delete a
leaving remote player ahead of when it told clients it would do that,
leading to resyncs. Fixed. Now, all should agree on when to do the
deletion, and do that on the same turn. If you get a message like
"FIXME: killAtTS #### < worldTS ####. Not cool", then submit
chatlogs. [NM]

- Fix for bugzilla #263. Fixed case where the network.unsync command
could cause repeated resyncs. Now, should be once and only once. [NM]

-- b91g released==============

- Merge a number of post-b91g changes from trunk, including RakNet
networking, some optimizations, crash fixes, and security
changes. [NM]

-- 1.3.6.3 PublicBeta rc1 (1.3.63.93) released==========================================

- Fix for RakNet hosting not being visible to others. Their server got
stricter as to what data it accepts sometime after 1.3.6.3's release.
[NM]

- Also made Raknet packet sending failures trigger a battlezone.log
and possibly also an abort. Trying to dig into the server gamestate
corrupt crash. [NM]

- Fix for bugzilla #506. Needed larger buffers for some ODFs. [NM]

- Fix for fbspir not being able to hit targets. Added to ODFs:

[OrdnanceClass]
LifespanBeforeCollidesWithOwner = 0.2

   This is the ordnance life, in seconds, at which point it's allowed
to collide with its 'owner' object. (i.e. the one that shot it
off). If this value is 0, it will always collide with the owner;
default value (0.2 seconds) gives some time to get away from the owner
before colliding. If you never want a piece of ordnance to collide
with its owner, set this to a large value, say 1e6 seconds (~11.5
days). This applies to ordnance classes Bullet, Missile, LaserMissile,
LaserPopper, and their derived classes.  [NM]

- More work on bugzilla #505 (can't unpack state from server). Added a
bunch of logging to battlezone.log (so no *prefs.ini changes needed)
about what data it's sending/received. [NM]

-- 1.3.6.3a build

- Probable fix for bugzilla #515. Optimized ForwardSubmitMoves() to
handle late joiners better. [NM]

- Merge from trunk: DLL GetLabel()/SetLabel() actually exist like
ScriptUtils.h says they should. [NM]

- Probable fix for bugzilla #505 (gamestate corrupt). Made gamestate
transfer more like the way RakNet samples work. [NM]

- Make BZ2 a little more forgiving of shell mods from 1.3.6.2. Still
haven't found a way to make end users read and comprehend the 1.3.*.*
installer message that says "only install mods marked compatible with
the 1.3.*.* you just installed" :( [NM]

- (Merge from trunk) Mesh takes material alpha into account when
setting transparency.  This fixes translucent geometry like canopies
when read from an XSI file instead of a pre-existing MSH.  [Ken]

- (Merge from trunk) XSI -> .msh reader should be much more consistent
now in results, ensuring memory is paved before use. (Bugzilla #415
fixes) [NM]

- Flipped GamePrefs.ini::DoGuessAndTrueWeaponSims -> false. The extra
ordnance in flight might be causing some people to whine "lag." That
single word does not explain what went wrong versus what you expected
to see. Please use paragraphs, videos, or more. [NM]

-- 1.3.6.3b build

- Fix for bugzilla #7. Attempts to read in the userprefs file before
starting DirectX. This should get the screen resolution fairly close
to the desired resolution on startup, no dropping to 640x480 for a
second. [NM]

- Fix for bugzilla #514 (moving some fixes from trunk into this branch
first, then folding combined fix back to trunk). Was releasing vertex
buffers a little too early under some high-performance situations,
leading to corruption onscreen. [NM]

- Fix for bugzilla #270. Ground shadows should appear when shadows are
set to medium. [NM]

- Triggers a visual world rebuild asap if a remote player has blinked
or otherwise triggered a visual world issue. [NM]

- "Player has entered the world" should print a little less frequently
and hopefully accurately now.  [NM]

- Work on bugzilla #525. This bug has happened before manipulating
this data structure, just replaced it with some modern C++ STL
code. [NM]

- Fix for Bugzilla #15 (pathing forver). Switched pathing code from
floats to doubles, and that seems to have fixed long paths, as
floating point inaccuracies don't crop up quite as much. Once you get
to a float of about 300000, adding 1.0 doesn't quite work as intended.
Thanks to Commando for sticking on this bug.  [NM]

-- 1.3.6.3c build

- Work on bugzilla 523. Always recalculate whether joining is possible
before displaying the join game button. [NM]

- Work on late-game resyncs, including a little more on bugzilla #15 &
#520. Made pathing code clean out and reset more data every MP join
and resync, so that ideally things are the same on all machines. Also
cleared temporary calculations from the last path request before doing
a pathing calculation so that the results should be consistent. Also
made it try and clean up any leftover AI & AOI settings. [NM]

- Fix for bugzilla #528. Password column should have (p), (v), (x)
correctly shown once again. [NM]

- Fix for bugzilla #529 - shell/game state of over 250 minutes is
shown as "250+ minutes". [NM]

- Fix for bugzilla #527 - server browser list of games should show DM
subtypes correctly, and MPI type correctly. There's no distinguishing
factor to differentiate ST vs STCTF, so those will show as Strategy.
[NM]

- Move packet loss and throughput stats to RakNet. Packet loss (shown
in the ping column) is what RakNet reports. Game.histogram has one
line of packets out (Sent, Resent and Total, including overhard) and
packets in -- and these four numbers are updated every second. [NM]

-- 1.3.6.3d build

- Attempt to reduce false positives for the 'checking scores info'
message. Did rewrite/simplfy this code, and made the error messages
more verbose. I do want to get to the bottom of why this is
happening. [NM]

- Work on bugzilla #524, specifically trying to eliminate the resync
after a raknet connection drop - allow the rest of the netcode to
determine the best timestep for the disconnect and synchronize
that. [NM]

- Remove 'wants future moves' lines from chatlogs w/ extended network
logging on. Should help reduce the size of the haystack I'm searching
in. [NM]

-- 1.3.6.3e build

- More work on the 'checking scores info' message. Rewrote even more
chunks of code related to this. Seems to work on 2-4 player LAN tests,
with and without custom maps. [NM]

- Fix for bugzilla #271 - morphtank icons change as before. This is a
case of inheritance messing things up - it's really hard to track
overrides for derived classes. If there are issues with other things
under [MorphTankClass] not behaving when overridden, the most reliable
solution for the rest of these is going to be to just copy/paste the
specific params into the overridden odf's [MorphTankClass] chunk. [NM]

- Servers now send the statistics for packet loss to all other
clients.  Clients locally calculate their packet loss to the server,
which is shown in the ping column. But, a client's display of packet
loss for any other player is what the server told them. [NM]

-- 1.3.6.3f build

- Slight optimization to terrain rendering code. Now trusts some
other, more efficient clip functions to do all the work. [NM]

- Move alt-tab tolerate ticks out of GamePrefs.ini and into Userprefs.
This means that changes should be saved for the next run of BZ2. [NM]

- Work on orphaned and/or unattached sound effects. Tries harder to
clean up orphaned sounds after a worldswap or join. Reduced some
duplicated code & data related to sfx positioning. [NM]

- Work on the 'ghost' remote players. After resimulating remote
players, tries to make sure various data structures are immediately
updated as well. [NM]

- Work on bugzilla #526 - if player inputs wrap, need to kick that
player out of the game. Internal state is out of whack, and a quit to
shell and rejoin is the only way to fix. Need mp logging enabled as
noted on public forums and chatlogs to really determine how/why it got
to that state. [NM]

-- 1.3.6.3g build

- Fix for lockup seen in 1.3.6.3g. Didn't merge from trunk correctly.
[NM]

-- 1.3.6.3h build

- Probable fix for bugzilla #544 - position synchronization code (done
for ghost player fix) for tracked vehicles broke the physics. Did a
more targeted fix for tracked vehicles, doing some parts of that code,
but not all. [NM]

- More work on the 'ghost' remote players. For remote players, should
trust their current interpolated world position. All other objects get
the 250m cutoff for interpolated vs true position that's been in the
code for a long time now. [NM]

-- 1.3.6.3i build

- Fix for bugzilla #118 - bad assets message now exists in long
(dialog) and short (title) form. [NM]

- Merge from trunk - more runtime sanity checks. [NM]

- Probable fixes for bugzilla #543, 549, 518. Extra work to update
remote players positions within the worlds. [NM]

- Probable fix for bugzilla #547 - limit how often helper function can
be called. [NM]

- Delete terrain lodding on/off buttons fron Options -> Graphic. The
distance slider for terrain lodding now controls this. [NM]

-- 1.3.6.3j build

- Fix lockup on startup caused by not completly deleting all the
terrain lodding on/off code. [NM]

-- 1.3.6.3k build

- Work on bugzilla #556. If local player collides w/ remote player,
requests a visual world update asap -- might be sooner than
scheduled. [NM]

- Mods list is transmitted over RakNet, so that clients trying to join
a server requiring NatNeg (i.e. they don't have full info) should
still get the popup saying they're running a different set of mods and
probably shouldn't join. Compiles, but untested, as there's no NatNeg
on my LAN. [NM]

- Tweaked some asset check code to be more scalable over time. [NM]

- If no games are found when asking RakNet, it pops up a dialog
reminding users that some antivirus apps have an webshield component
that eats BZ2 session list requests until they're manually
reconfigured to allow bzone.exe. [NM]

-- 1.3.6.3m build (Yes, skipping 'l', as that looks like a 1 in BZ2's font)

- Fix false positive in asset checker as reported on forums. [NM]

- Spam of bad asset autokicks shouldn't cause a spam of
messages. Compiles, but is untested. [NM]

-- 1.3.6.3n build 

- Undo Delete terrain lodding on/off buttons fron Options -> Graphic. [NM]

-- 1.3.6.3p build (Yes, skipping 'o', as that looks like a 0 in BZ2's default font)

- Partial work on bugzilla #235. MPVehicles.txt and StratStarting.txt
(and similar files) must now be properly formatted .odf files. All
stock MPVehicles* and StratStarting.odf are converted over. Mods will
need to be updated to match; if a mod still tries to refer to a .txt
file, it'll complain to the pregame chat box that the full build
installer reminds users to make sure they're only installing mods
marked as compatible. [NM]

- Revert ivbomb.odf to 1.3.6.2 form. Had a change from trunk that is
unnecessary. [NM]

- Attempts to reduct explosion jolt local view popping in multiworld.
Synchronizes random # seeds extensively in this code so that it should
be the same in lockstep & visual worlds. [NM]

- Giblet upgrades: zlib v1.2.8. [NM]

- Tweaked RakNet server browsing. Now will show duplicate entries for
the same IP address, as long as they've got different ports and/or
NatNeg entries. [NM]

- Fix up some ivar3 inconsistencies complained (usually debug builds
only) about after leaving some games. [NM]

- Fix 1.3.6.3p AV noted on private forums. [NM]

- Full build installer should leave a stub Battlezone.log file in the
same directory as bzone.exe telling players that the file is over in
My Docs/My Games/Battlezone II/ . If that stub file is overwritten
(e.g. XP or running as admin), no big deal. If that stub isn't
overwritten (e.g. Vista, Win 7/8) then people who go looking for the
log file ought to be a hint to look elsewhere. [NM]

-- 1.3.6.4 PublicBeta rc1 (1.3.64.94) released==========================================

- Construction rigs can upgrade once again. Was bit by false positives
from a security check added. [NM]

- Extra work to ensure out-of-syncs are noted and reported. [NM]

-- 1.3.6.4a build 

- Move score CRCs into per-timestep state checks. This simplifies
items to track, is a net deletion of code, and should hopefully fix
the issues seen with false positives on scores out of sync. [NM]

- Slightly better cleanup of AttackGroups() when a unit is destroyed.
Shouldn't ever allow a dead object to be chosen for a group
leader. [NM]

- Fix root cause of score desyncs; was switching tracking of kills and
deaths for clients. [NM]

-- 1.3.6.4b build 

- If *Prefs.ini::VerboseLagInfo is on, then denied joiners (e.g. game
full, in banlist) will have a reason printed to the ingame message
box.  The message to battlezone.log has been expanded, but it was
always there. [NM]

- Publishes to RakNet master servers more frequently when in shell.
This will give more reliable info about the game to prospective
clients when the server is behind a NAT. [NM]

- Tweak for bugzilla #564. Tweaked MPVehicles/autoreg code to use more
modern strings. Can't seem to repro #564 anymore -- enabling both
Thunderbolt and Default ISDF, and choosing each one spawns the correct
ODF in a DM. Did also put a warning on the thug commander recy variant
description that it is best played with people one knows and
trusts. [NM]

- Banlist.ini now populated with list of proxies from
http://en.wikipedia.org/wiki/Wikipedia:Database_reports/Range_blocks .
That's 770 entries. Parsing that at startup and on joins ought to be
fast enough; if not, let me know. [NM]

- Fix for bugzilla #568 - function signature for DLL SetLabel()
function in code matches header.  [NM]

- Fix for exploit in thug recy variants. Added to ODFs:
[BuildingClass or TurretCraftClass]
CanAlliedCommanderDemolish = true  // Used when MP teamplay is on & controlling unit is commander
CanAlliedThugDemolish = false // Used if MP FFA is on, or teamplay is on & controlling unit is thug


   If this is set to false (default), then construction rigs should
not be able to demolish something on an allied team. They should still
be able to demolish something on the exact same team, or on enemy
teams.  Compiles, but is untested. [NM]

- Bumped the height of the full build installer window by 16 pixels.
Some were complaining that the window contents were offscreen. Never
seen here -- probably some custom Windows font/window sizing options
that I don't use -- but it was a trivial change. [NM]

- Allowed DLLs to pick what happens on a snipe. New behavior for
Strategy02 / StratCTF / MPI DLLs: if friendly fire is off (i.e.
ivar32 == 0), then snipes of a same/allied team unit will not kill the
pilot. 

   This friendly fire snipe fix involved creating new optional
callbacks to the DLLs so that DLLs can subscribe to notices of
ordnance hitting objects and/or notices of snipes. Both callbacks
should expose the exact odf of the ordnance involved, etc. These
callbacks are always set up by DLLBase, so derived classes just need
to implement the virtual fuctions as desired. Right now, calls are
made to DLL in lockstep and visual worlds; if this proves to be a
performance hit, I might make it lockstep only.

   Also added, to ODFs:
[CraftClass]
CockpitSniperRadius = 1.0

   This should allow modders to tune how snipeable each craft is.  If
the sniper shell lands within CockpitSniperRadius of the target point
(in 3 dimensions), it is treated as a snipe. Smaller values for
CockpitSniperRadius will make it harder to snipe - do test to see that
it is still possible to snipe after tweaking this value. [NM]

- Fix for bugzilla #564 - delete Default ISDF/Scion entries from
MPVehicles.odf, as they're now dupes. DMVehicles.odf is where the
Default ISDF/Scion entries still live. [NM]

-- 1.3.6.4c build 

- The alt-tab tolerate setting set by a server shouldn't be stored for
later use by a client. Noted on forums. [NM]

- Added a few more DLL -> exe callbacks. Also made same-team snipes
allowed in MPI/Strat/StratCTF. [NM]

- Additional error handling and logging in the
registration/searching/deleting of sessions with RakNet master
servers. This should make it more resilient in case of outages or
other problems. The extra logging (to battlezone.log) in case of
issues might be sufficient to try and diagnose why various "web
shield" programs break BZ2 searches for games. Any testers want to try
and install such a program (Avast Web Shield is one such culprit) [NM]

- More variation in respawn position in strategy/stratctf/MPI
DLLs. This might help prevent repeated spawn kills in MP. Let me know
how this works out. [NM]

- In strategy/stratctf/MPI, if an allied AI pilot gets into a craft,
then the craft should remain on the same team, not switch to the
pilot's team. This should prevent craft steals from allied teams by AI.
Done with a new DLL callback. [NM]

- Tweaked scoring system for strategy/stratctf, recommended by Zero
Angel: Players get a death if they died as a pilot (and nothing
else). Players get a kill if they personally killed the opposing
unit. Score should be the Scrap cost of all objects (including
structures) the player has personally destroyed, subtracted by the
scrap cost of any ships that the player has personally lost. Let me
know how this works.

- DLL Callback changes: 1) there should now be an exe -> DLL
ObjectKilled() callback when a building is destroyed. 2) For all
ObjectKilled() calls, the killers handle should be the handle of the
unit that got the last shot in, NOT the human controlling the team
that got the last shot in. DLL authors - if you want to go back to the
old behavior and get the owning human player handle for a killers
handle, do this:

Handle playerHandle = GetPlayerHandle(GetTeamNum(killersHandle));
[NM]

-- 1.3.6.4d build 

- More work on this: in strategy/stratctf/MPI, if an allied AI pilot
gets into a craft, then the craft should remain on the same team, not
switch to the pilot's team. Compiles, but is untested. [NM]

- Giblet upgrades - RakNet to version 4.08. Change notes include
mention of possibly more reliable NatNeg joins. [NM]

- Possible workaround for RakNet server browsing not working when a
'web shield' type piece of software is present. RakNet developer noted
that a request to the server (w/o looking for matchmaking) first then
the real request for matchmaking data fixed it on his end. So, trying
such an approach here. [NM]

-- 1.3.6.4e build 

- Tweak the RakNet temp then real request code. Does not recycle
connection or socket, and only does the temp request if a regular
request has failed recently. [NM]

-- 1.3.6.4f build 

- Even more exe -> DLL callbacks, one for powerup pickups, and one for
target changed. Compiles, but untested. [NM]

- Better behavior in asset checker when there are loops in the ODF
reads. [NM]

- More work on this: in strategy/stratctf/MPI, if an allied AI pilot
gets into a craft, then the craft should remain on the same team, not
switch to the pilot's team. (i.e. now, pilots will switch to team of
craft they get into, if that craft is allied). [NM]

-- 1.3.6.4g build 

- Updated permissions for construction rig demolishing. Commanders (in
teamplay games, not FFA) now have the rights to demolish items. Thugs
do not, by default, though this can be changed by ODFs. Renamed one
parameter, and edited comments above. Compiles, but is untested. Summary
of what the flags are, and when each is used.

[BuildingClass or TurretCraftClass]
CanDemolish = true // Used when MP is off, or MP for same team or enemy team
CanAlliedCommanderDemolish = true  // Used when MP teamplay is on & controlling unit is commander
CanAlliedThugDemolish = false // Used if MP FFA is on, or teamplay is on & controlling unit is thug
[NM]

- More work to deregister MP games from RakNet servers if the game is
exited, or if it crashes. [NM]

- Scanning for RakNet games on master server is now done from a
background thread. This may make the UI a little more responsive.  LAN
games are scanned from the main thread; this should be a non-blocking
broadcast that runs quickly. [NM]

-- 1.3.6.4h build 

- Added PetWatchdogThread() DLL callback. See comments in ScriptUtils.h.
[NM]

- Added some additional tracking of recently re-sent move packets to
players.  If a move has been re-sent within the past 3-4 seconds, it
will not be re-sent. This should reduce bandwidth usage when a cluster
of move packets were lost, and generally bundle things better. Code to
do things like this was present in BZ2 at one point, but apparently
lost in some of the networking rewrites. [NM]

- Possible fix for AV in Utils::Ansi2Unicode(), noted on public
forums.  [NM]

- Added throttling for chat messages in MP. Will reject messages it
considers spam. [NM]

- Canceling joins to servers should be handled properly once again.
[NM]

- Created ProxyList.ini, which contains the list of anonymous
proxies. Banlist.ini is now much smaller, and contains suggestions for
ranges to ban as found on the forums. Updated ProxyList.ini with latest
from http://en.wikipedia.org/wiki/Wikipedia:Database_reports/Range_blocks [NM]

- Possible fix for AV in ~Bitmap noted on forums. May be more bugs
hiding behind this. [NM]

- Tweak to session join code. If it got a full set of info from that
server, assumes a direct join is possible, and ignores
NatNeg. (I.e. hosting computer has manually forwarded ports.) If it
doesn't have a full set of info, uses NatNeg if that was
provided. [NM]

-- 1.3.6.4j build 

- Reduce size of RakNet installed DLL by removing some unused (to BZ2)
pieces.  [NM]

- Even more NULL pointer checks in DR2 code. Earlier checks weren't
fully sufficient; thanks for the logs on the private boards. [NM]

- Fix for AV noted in bugzilla #578 logs. More sanity checks on
ranges.  [NM]

- Fewer type I errors in chat spam detection. [NM]

-- 1.3.6.4k build 

- Eliminate terrain height editing from visual worlds. Found that
terrain-owning buildings could modify terrain heights in visual
worlds. Now, only lockstep world updates will actually modify terrain.
This change did *remove* the SeismicWave ordnance's ability to modify
terrain with MW on. I'm not willing to pull in the MW-aware terrain
code modifications from the 1.3.7.* codebranch that might help with
this.

   Changes to terrain height (i.e. deploying buildings flattening
terrain) are saved and loaded in MP joins/resyncs. This might help
with MP resyncs, especially with late joiners. [NM]

- Added to PRIVATE builds only, 'network.monkeymoves' command. This
toggles replacing user inputs with random chaos. [NM]

- Fixed a case of clients doing an extraneous load/save on a resync.
This should make things a bit smoother for the client as it avoids
unnecessary work. This change might also reduce resyncs, not
sure. [NM]

-- 1.3.6.4l build 

- Work on AV in RecentlyReSentMoves::ContainsMove() noted on boards.
More sanity checking of parameters. [NM]

- Reduce tolerance for possible chat spam. [NM]

- Fewer false positives on the "no sessions found, check if you've got
webshield" especially if connecting took some time. Note: I don't
believe that this will fix 'web shield' type programs (AVG is reported
to have a particularly oversensitive one) that completely block BZ2's
requests for matchmaking data. [NM]

- Session type filter for 'mpi' works reliably. Tries slightly harder
to get a game type for sessions without a direct information
connection (e.g. shows ??? for ping), such as those behind a NAT. But,
if there is no direct connection, then the map may appear only in the
'All' filter type. [NM]

- Fix for bugzilla #558 - fixed some errors in MPVehiclesGH.odf [NM]

- Fix for bugzilla #585, 587 - unified FF rules in all game
modes. Now, if friendly fire is OFF, then human and AI units should
not be able to damage same or allied team units. Hitting enemies
should cause damage. This simplifies a bunch of rules for friendly
fire logic, explosion damage, etc and may produce more expected
results. [NM]

-- 1.3.6.4m build 

- Fix AV when a non-gameobject is entered in the editor. Non-public
builds had some checks to ensure an odf was of the correct type
(GameObject, Weapon, Ordnance, Explosion, etc). Now enabled this for
all builds -- should not be a noticeable speed hit. [NM]

- Fix for possible infinite loop in NextJoinOrResyncFrame() when
multiple resyncs are queued up. Also made it batch up resyncs more--
when one's already scheduled for 'soon', will join up with that. [NM]

-- 1.3.6.4n build 

- Fix for bugzilla #591 - should be able to damage items on team 0
once again, even with friendly fire disabled. [NM]

- Fix for spurious multiply by 255 in what sun.ambientcolor with no
arguments reported. Console "sun.ambientcolor 12 34 56 78" should be
able to set that to r=12, g=34, b=56, a=78, for example. (Merge from
1.3.7 build, might not be complete) [NM]

- Fix for bugzilla #572 - CUT: from next full build, the "1.2" style
hovercraft recycler variant. They don't work very well, and from what
I've seen, I'm not willing to pull in mods. There's a tech tree in
stock, and the game design was for that to be used by humans and
AI. If people want to go back to a monoculture where the tech tree for
humans basically begins and ends with scouts, simply because the
scouts are way overpowered with physics bugs, I feel sad for people
whose game experience is basically the equivalent of eating only coke
and cheetos, when there's better things. (And, it leads to a spiraling
set of further changes trying to fix everything else to match, rather
than simply fixing the one thing that's the cause of all the
problems.) But I won't make their experience stock -- and I also
refuse to cater to any griefing on behalf of the overpowered scouts in
strategy crowd that attacks and/or griefs any other BZ2 experience.

   For those of you who don't like the current 1.3 patch, I give you
full permission and my blessing to go back to 1.2-actual as long as
you let those who prefer anything else -- another patch, another game
mode, another way of playing -- to live in peace. But, keep up a
scorched earth campaign against games you don't like, and it's not
going to be fun for anyone. Those on the sidelines - I urge you to
start denouncing these griefers and don't tolerate them an
inch. Because if this keeps up, I'll very happily cut the code for
1.2-ish hovercraft physics and you can go back to 1.2-actual. Or get
over your monoculture and learn to experience the rest of the
game. [NM]

- More work to properly multiworld users switching between teams, and
verify MP players are on the correct teams, and spam if not. This
might help with the occasional powerup pickup being misreported to the
local user when it was a remote player that should have earned it. If
you see these UHOH messages, please try and detail out how it
happened.  [NM]

- Fix for bugzilla #570, #595 - switched server registration &
browsing to RakNet's HTTP libraries. This necessitated a switch from
RakNet DLL to static linking inside bzone.exe. This might be more
reliable on slower connections, etc. The emergency deregistration from
master server on crash is still using the old, direct, code. Do test,
if possible. The version check is still using Gamespy http libraries
(for now?). [NM]

- Reduce some battlezone.log file entries on joining games. Deleted
logging messages that aren't needed anymore. [NM]

- Defaulted autolevel preference to off, but only for newly created
pilot profiles. Existing profiles will not be touched by this change.
[NM]

- Possible fix for bugzilla #588 - in visual worlds, AI and remote
humans won't be able to blink anymore.  Instead, if AI/remote human
blinks near the user in the lockstep world, a MW swap is requested
soon. This isn't a perfect solution -- proper solution would be to
make all weapon code replay properly across visual world resimulations
and do work only when absolutely trustworthy, but there's too much
different in the sim code between 1.3.6.5 branch and trunk for me to
want to embark on a sweeping change like this. But, this fix should be
better than what the current situation is. Compiles, but is
untested. [NM]

- Now saves the network session list filter preference to disk. If you
happen to be a user offended by the presence of some sessions in a
game mode you dislike, you can set your scan preference once and not
get so annoyed that others enjoy other parts of BZ2. Compiles, but is
untested. [NM]

-- 1.3.6.4o build 

- Fix for more MP misbehavior. Added to ODFs:

[TurretCraftClass]
CanAlliedThugUseTerminal = false

   This new parameter defaults to false, and should effectively lock
out any allies from using a gun tower terminal. Someone can make a
recy variant with all these lockouts re-enabled, if they want. [NM]

- Backport SSE-optimized chroming of objects from 1.3.7 branch. Should
help with framerate, even if slightly. [NM]

- Fix for bugzilla #603 - make game.cheat bzview respond only in
bz2edit.exe. If you try and use it in bzone.exe, it'll send a message
to the console asking you to run bz2edit.exe instead. [NM]

- MotionSensor clears objectified targets when removed, not just
when killed.  [Ken]

- If friendly fire is disabled, then successful snipes in
DM/MPI/Strat/StratCTF will set the target craft to team 0. Requested
on forums. [NM]

- Probable fix for bugzilla #601, maybe also #598 - did additional
work to ensure that when a recy/factory is (re)built in lockstep world
to reset any units customized at its factory panel to stock. Added in
a lot more validation and logging (debug builds only) in case this fix
isn't sufficient. [NM]

- Fix for bugzilla #589 - NULL pointer check in pathing code. This may
indicate an pathing too complex situation, not sure. Don't care to dig
into that code at the moment. [NM]

- Fix for tracked vehicle collisions being off. When trying to avoid
dividing by zero (or very small values), wasn't tracking the sign of
the resulting division correctly. [NM]

- Fix for bugzilla #596 - don't give bad data to DirectX in certain
editor modes.  Also made sure to set up lighting fields correctly for
DirectX for those edge cases. [NM]

- Tweak - if escape screen is up in MP when the local player is
killed, it doesn't close anymore. This should make kicking/banning a
little easier. [NM]

- Fix for bugzilla #147 - went with a standard addAmmo value for
isuser*.odf, ispilo*.odf, fsuser*.odf, fspilo*.odf. This should now
have the same values before and after dying in MP. [NM]

- Made it so that anyone (client or server) can ban (chat command or
via GUI) any other player at any time. This is stored for later use;
sessions hosted by banned players (banlist.ini, proxylist.ini or the
new userbans) are automatically hidden. If you are in a game and a
(locally) banned player is playing, a warning is printed on their
joining. [NM]

- Fix for bugzilla #427, #606. Was possibly running off end of normals
array when rendering a falling plant. Simplified the code a bit and
should end up closer to how 1.3pb4a ran. However, if lighting is
suddenly rather wrong for falling plants, let me know. [NM]

- Tweak - in Strat/MPI, when a player leaves (voluntarily or not), all
craft belonging to them are auto-regrouped (if possible) to a friendly
ally's team. This should make it easier to continue on if there's no
warm body ready to quickly replace that player. [NM]

- Added a GetPerceivedTeam DLL callback. Was trivial to do so. [NM]

- Possible fix for bugzilla #599 - does not re-run DLL's AddObject
call during a player join or resync. [NM]

-- 1.3.6.4p build 

- Work on bugzilla #614, #615 - AVs noted after snipes. Added some
more range and pointer checking. [NM]

- Fix for bugzilla #610 - allow snipe of item on team 0, even though
it is technically an allied team, unless it's a human. Other tweaks:
Bugzilla #609 - After a snipe, mission DLLs now sets the perceived
team of victim to 0. Base team # is left alone.  If DLL attempts to
set the base team # of a local or remote player in MP, this is now
disallowed and logged to Battlezone.log. Also allowed human-controlled
units to damage items on same team once again when friendly fire
protection is on. If this gets abused, will yank it. [NM]

- Compile RakNet code with SSE (original) instruction set, turning off
SSE2 instructions. Don't think RakNet needs this. Rest of BZ2 (1.3pb4a
thru 1.3.6.*) is SSE (original) as a requirement, so this was the
anomaly. [NM]

- Better logging and crash avoidance if a targetinggun has a bad
ordnance class. This change has been required since 1.3pb4, over 5
years ago now. And yet people are not noticing the message with every
1.3 patch installer that says to only run mods marked as compatible
with that 1.3 patch. If you don't have the technical skills to fix
these errors, then maybe you shouldn't run ancient mods. [NM]

-- 1.3.6.4q build 

- Partial fix for bugzilla #220 - merge over sky.ambientcolor
reporting from main branch. Also found some possible divide-by-zeros
in rain code, added sanity checks in for that. The bug as written is
invalid - the rain.scalefactor for isdf09.* is 0.8, meaning that when
it's raining, the map's lighting is at 80% normal. The code to fade in
rain was ignoring the rain.tranperiod (length of time, in seconds, for
rain to fade in/out). Fixed, though this might make rain fade in
slower than before for maps with rain.tranperiod over 2 seconds.  [NM]

- MP escape screen chat history window should scroll correctly now --
possibly for time ever after launch? The cfg's UseVar for that listbox
was a string, not an integer, so scrolling that made everything
confused. [NM]

- UI enhancement - scales up in-game UI by x1.5, x2, x2.5 or x3 if the
screen has enough pixels to do the scaling. The logic for this is in a
.lua file, which should make end-user logic tweaking fairly
trivial. (Except for the selection of console/loadbar/system font, and
messagebox size, which is exe-side, now.) The 'tiny' font and console
font are now using the 'Droid Sans' font for their larger sizes,
freely available from
https://github.com/android/platform_frameworks_base/tree/master/data/fonts
Also tweaked bz2dxtgen to allow non-power-of-2 textures, which
virtually all modern cards support. [NM]

- Work on bugzilla #611 - even more uhoh checks for players, teams,
etc.  Also made FactoryPanel do more range checks on teams. And, also
made FactoryPanel more multiworld aware. This might fix the bug, but
without solid repro steps, I can't check my work here. [NM]

- A little more work to ensure that all Direct3D render states used by
BZ2 are reset on startup and/or after device reset. This might fix the
occasional black ships in the shell bug seen by some; I've never seen
it or be able to repro it. [NM]

-- 1.3.6.4r build 

- Merge from trunk - a fix to try and sort water and other transparent
items a bit better. Also tried to batch transparent items in the sky
along with other transparent items -- if the sky had any different
ambient color, had to flush that. Now is able to switch ambient color
for the sky only w/o forcing a full flush. [NM]

- Applied an emergency quick fix for pathing system crashes. [Ken]

- Pathing gives up as soon as it discovers that the start and goal are
not connected.  It track of the number of open nodes going forward
from the start and nodes going backward from the goal.  If either drops
to zero, which means that the node is trapped inside a disconnected
region, it immediately terminates with "bad path". (Imported from BZ1's
branch of the BZ2 pathing system) [Ken]

- Added more verbose output when path trace is enabled.  (Imported from
BZ1's branch of the BZ2 pathing system) [Ken]

- Fix false positive factorypanel invalid user team # message after an
alt-X. Added last build, didn't test this condition. [NM]

- Up-scaled game UI doesn't try and expand base_icon_bg*.tga in the
.cfgs anymore. Only colorize.tga has gotten the 4 additional sizes
treatment. [NM]

-- 1.3.6.4s build 

- Fix for bugzilla #619 - added, to .trn files:
[NormalView]
RenderTransparentSkyWithWorld = false

   If true, then the transparent polygons in the sky are sorted and
rendered with transparent items in the world, i.e. after the opaque
parts of the world are completed. False is the default behavior from
1.3ta5 thru 1.3.6.4n.

   Also, did work to ensure that skydomes with more than 1 chunk of
geometry should render correctly. And, added to .trn files:

[NormalView]
DomeFogging = -1 // Valid values are -1, 0, or 1, illegal values clamped to range
DomeLighting = -1 // Valid values are -1, 0, or 1, illegal values clamped to range

   For these, the default of -1 means use the default based on the
current dome type. (A dome type value that is even defaults to NOT
lit, but fogged. A dome type value that is odd defaults to lit, but
NOT fogged). If you set the corresponding Dome*ing to 0, it will NOT
be lit/fogged, overriding the dome type.  If you set the corresponding
Dome*ing to 1, it will be lit/fogged, overriding the dome type. [NM]

- Made in-game UI scaling an option on the graphics options (page #2,
bottom right). This will allow people to pick a UI scale up to what
will fit on their screen. Changes need to exit BZ2 to windows and
restart to take effect. Also created the additional 4 scales for the
ingame editor UI to fit; this also uses the same scale. The reticle
and SelectionDisplay should also take the UI scaling into account as
well now. 

   Also fixed bugzilla #618 - game.debugaip view shouldn't overlap at
big UI resolutions; other items with positions in GamePrefs.ini
(e.g. audio, AIP, etc) have their onscreen position now in a 640x480
coordinate space, so that if you are running (for example) a 1280x960
resolution (windowed or fullscreen), all the values entered are
doubled. Also merged over the dropshadow code so that the text
rendered through these systems is a bit more visible against bright
backgrounds. 

   Also moved the Gameprefs.ini Play_MapRadar* and Play_CockpitRadar*
values out of Gameprefs.ini, and onto console commands
only. bzgame_init*.cfg needs to modify these based on the resolution,
so mods will need to copy from the approach taken by those files. [NM]

- Added, to .trn files:
[NormalView]
FogMode = 3 // D3DFOG_NONE = 0, D3DFOG_EXP  = 1, D3DFOG_EXP2 = 2, D3DFOG_LINEAR = 3
ExponentFogDensity = 0.01 // Exponent to be used in exp/exp2 modes, must be in [0.0 1.0] range

   These can also be adjusted in realtime with the console sky.fogMode
& sky.fogExponentDensity commands, which will remind you to edit the
.trn to save. After experimenting, I cannot seem to get exp/exp2 fog
modes to begin anywhere but at the camera position, severely lessening
their usefulness. Maybe someone will want a map where they can see fog
begin right away, rather than respecting sky.fogrange's parameters.

   Also, added to render*.cfg:
PixelBasedFog = 1

   See comments above it. [NM]

-- 1.3.6.4t build 

- Added Battlezone 1 style tracer render:

renderBase = "draw_tracer"
textureBlend = ... // blend mode
textureName = ... // texture to apply to the tracer
startColor = ... // color of the front end of the tracer
finishColor = ... // color of the back end of the tracer
startRadius = ... // radius of the front end of the tracer
finishRadius = ... // radius of the back end of the tracer
tracerLength = ... // length of the tracer in meters

The tracer render is simpler and cheaper than the full trail render
and allows precise texture alignment with the object it's attached to.
It works particularly well for bullet tracers and rocket flames.

It currently uses the whole texture, with the left edge of the texture
at the front end and the right edge at the back end.  [Ken]

- Added Battlezone 1 style control smoothing, turned off by default.
It uses the "options.play.smoothing" console variable and gets saved
to the player profile.  When enabled, the input system applies low-pass
filtering to the steer and pitch controls so aiming is smoother.  [Ken]

- Added Control Smoothing to Play options.  [Ken]

- Message boxes aren't upscaled in the shell, and in game, they use
the ingame UI scale that was set at mission load time. This should
make them fit with the rest of the interface pieces. Also fix bugzilla
#623 - shift-F9 view should be upscaled better ingame. [NM]

- Upscaled the shell UI too -- I got tired of looking at fonts that
were blown up way past any reasonable limit. This uses a different
function in the uirescaler.lua file, one that just looks at the screen
size and tries to do the largest fit within that. This ***IS*** a
breaking change -- MP mods with custom Extra Options pages will need
to have four additional resolutions converted in order to place that
page onscreen in the correct place. I've posted batch file (using
Strawberry Perl) and Cygwin bash script file that expand the stock UI;
modders should be able to figure out how to run that locally.Also
made the 'Create Game' button blink by default to help steer people
towards using it. [NM]

- Fix for bugzilla #624 - added to GamePrefs.ini :

// Whether kills by AI units on AI units are reported to the ingame
// messages box.
ShowAIonAIKillMessages = false

   AI-on-AI kills have not been reported to the messages box for some
time now. This allows users to turn it back on if desired. [NM]

-- 1.3.6.4u build 

- Fix for bugzilla #486 - Remove Gamespy branding from
multip_*.tga. Will be in next full build.  [NM]

- Properly expand IA maps's Extra Options in expanded shells. Also
made iface files triggered from DLL go thru the ingame expansion as
well. [NM]

- Work on bugzilla #616 - makes sure to re-push more camera state
through to DirectX after an alt-tab or device loss. Compiles, but is
untested. [NM]

- Fix for bugzilla #621 - IA/MPI DLLs will only build one item at a
pathpoint. Doubled-up objects makes the collision system act weird.
To be fair, doesn't take much of anything to get that result, but
that's no reason to poke it unnecessarily. [NM]

- Fix for bugzilla #620 - remove one group from StratStarting.odf (the
service trucks) to make it fit in a game w/ 4 thugs. Adjusted
comments. [NM]

-- 1.3.6.4v build 

- TracerRenderClass uses texture clamp (like SpriteRenderClass).  This
should fix texture weirdness at the edges.  [Ken]

- Fix for bugzilla #626 - shell UI being over-expanded after an
alt-tab. [NM]

- Included the mpvehicles.odf that's been in my development assets for
a while. Forgot to copy it over for sub-builds. [NM]

- Fix for bugzilla #583 - Tug skips collision with its cargo (and
vice versa).  [Ken]

- Fix for bugzilla #625 - added an option for a periodic kick to re-attack
the offending units. Added to .aip files:

[section "ClearArea" or "DefendArea" or "Defender"]
ResendAttackersTimeout = 60.0 // number of seconds between re-orders to attack, use 0 to disable

   This allows a re-send of attackers on a periodic frequency and can
be disabled as desired. This change did break compatibility with
savegames with one of those AIP chunks, sorry. [NM]

-- 1.3.6.4w build 

- Clamp pitch accumulator value to limits, which fixes a control problem
introduced by my input changes.  [Ken]

- Fix for bugzilla #602 - compute cur_pitch based on min/max weapon pitch
so it matches what turrets use.  [Ken]

- Fix for bugzilla #476 - apply effect enable/disable rules whenever 
effects get updated.  This eliminates a brief effect pop when swiching
worlds.  [Ken]

- Fix for bugzilla #207 - preserve headlight setting across multiworld
swap.  The switch was forcing them on.  [Ken]

- Fix for bugzilla #593 - weapon mine calls SimSetState on its weapon
to make sure it points the right way for the first shot.  [Ken]

- Fix for bugzilla #576 - raised light limit to 8 and made it a define
instead of a numeric constant.  [Ken]

- Retreating non-fearless scavengers use GoNear instead of GotoTask.
This fixes them getting stuck against their target building.  The BZ1
Scavenger used GotoTask but had an extra check that would abort the
goto once it got within 40m of the destination.  GoNear achieves the
same result.  [Ken]

- Command Panel "Pickup" menu allows any object that can be tugged, so
Artifact objects now show up.  It previously rejected anything that
wasn't vehicle or building, which Artifacts aren't.  [Ken]

- Command Panel "Attack" menu excludes objects marked as unscannable
to the player team with ScanTeamLimit.  [Ken]

- Scrap obeys the canInteract ODF property like any other game object.
Setting canInteract = 1 allows BZ1-like behavior such as inspecting
scrap pieces.  [Ken]

- Selection display hides the health gauge for indestructible objects
(MaxHealth zero).  It already does something similar for ammo.  [Ken]

- Made mouse acceleration an option, turned off by default even when
using control smoothing.  It uses the "options.play.mouseaccel" console
variable and may eventually get an entry in play options.  [Ken]

- Fix for bugzilla #628 - try and keep shell messageboxes fitting
onscreen.  Multiple competing systems makes this harder to achieve all
of the goals at once. [NM]

- Tweaked fix for bugzilla #625 - the AIP "ClearArea" / "DefendArea" /
"Defender" chunks tended to had their units look at a target when
trying to claim them. Problem is, such units aren't treated as idle,
so if they were ever skipped, it could never be claimed again by the
"ClearArea" / "DefendArea" / "Defender" chunks. Did a minimal fix
where those three chunks will treat a unit in "LookAt" as idle. This
may cause a pile of side effects, not sure. Not quite ready to make a
bigger fix to make more/all AIP chunks also treat LookAt as idle. [NM]

-- 1.3.6.4x build 

- Fix for bugzilla #629 - code defaults for various ex-GamePrefs.ini
items for map/cockpit radar now match what GamePrefs.ini had defaulted
to. [NM]

- Work on the message of the form "UHOH: GameObj desynch: team #2 !=
userTeam# 3, OR user 0x22358370 != 0x22358370 player." Added lots of
logging on all changes to the user team #, trying to figure out
who/what is setting it incorrectly. [NM]

- bz2edit.exe should show shell better. bzshell_editor*.cfg didn't have
the native resolution command settings present. [NM]

- Tweak banning code to be a little more understandable (to me) and
reduce duplicated code. Also updated banlist.ini to cover recent DDOS
attacks on BZ2 games. [NM]

-- 1.3.6.4y build 

- Much more validation of .bmf files being read in. Should error out
if file seems truncated or corrupted. [NM]

- Work on bugzilla #633 - if 4 players in shell on same team, should
be able to give up command more reliably. [NM]

- Tweaked code reading/writing UserBanList.ini to ensure that the
netmask is read and written correctly when the file is update from run
to run. Added additional comments to the top of that file. As the old
UserBanList.ini may have had a corrupted netmask set if the file was
updated multiple times by different copies of bzone.exe, made BZ2
read/write UserBannedList.ini instead to ensure less corruption. Users
should be able to copy over entries to UserBannedList.ini after
verifying the netmask per entry. [NM]

- Possible fix for Bugzilla #310. Added, to odfs:

[WeaponClass]
MinOwnerLifetimeSeconds = -1.0 // If >= 0, used as a minimum time for weapon triggering
MaxOwnerLifetimeSeconds = -1.0 // If >= 0, used as a maximum time for weapon triggering
AllowedOwnerStateMask = 15	// Used as mask for owner state (mask 1=undeployed, 2=deploying, 4 = deployed, 8 = undeploying). If owner state & mask == 0, then can't trigger

   Set igsnip_a.odf & sgsnip_a.odf's MinOwnerLifetimeSeconds to 0.5 to
prevent triggering of the sniper rifle in the first 0.5 seconds of a
pilot's lifetime. This should prevent accidental sniper rifle misfires
when busy switching weapons in combat and dying. Perhaps the time
should be increased to the sniper animation deploy time, but so far
this is a change that shouldn't affect normal players. Also updated
*gjetp.odf to have the 0.5 second delay to also reduce misfires when
busy deploying in combat and dying.

   The other two new parameters compile, but are untested.  [NM]

- Merge over tread rendering optimizations, including prefetching
memory, from trunk branch. Seems to drop this function in the
profiler. [NM]

- Add in CRC32 with slicing-by-8 algorithm, freely redistributable
under BSD license from http://sourceforge.net/projects/slicing-by-8/ .
This is used to accelerate the CRC32 code in BZ2, and seems to
accelerate some torture tests here -- Instant.DLL spawning 75 units
every 1/10 second, and cleaning that up after spawning 525 total. And
repeating, so a net of 750 objects spawned per second with 75-525
extra units alive every frame. And with all that running windowed
(i.e. vsync on, 60fps cap) bridges2i.bzn, my Core i5-2405S & AMD 6950
2GB doesn't even max out a single CPU core. [NM]

-- 1.3.6.4z build 

- Fix for bugzilla #274 - also updated *gjetp.odf to have the 0.5
second delay to also reduce misfires when busy deploying in combat and
dying. Included all five odfs with this parameter in this
sub-build. [NM]

-- 1.3.6.4z2 build 

- Editor overflows of command buffers are now silently ignored, rather
than an app-ending event. [NM]

- Added an ODF property to control UnitTask::SelectWeapon:

[CraftClass]
UseSelectWeapon = 1	// If > 0, enable SelectWeapon

Disabling SelectWeapon restores the original weapon selection and firing
logic that carried over from BZ1.  The unit aims with a representative
weapon and fires every weapon in its weaponMask.  [Ken]

- Scavenger AI responds properly to CMD_PICKUP so it can be directed to
pick up specific scrap pieces.  [Ken]

-- 1.3.6.5 PublicBeta rc1 (1.3.64.95) released==========================================

- Fix for bugzilla #644 - Late client joins who switch teams to a team
of a different race before launching shouldn't confuse the pilot
respawn code. [NM]

-- b95a released==============

- Fix the misplaced ability to snipe allies AI units with FF
off. Parentheses misplaced in DLL source.  [NM]

- Probable fix for bugzilla #647 - if a powered building loses power
with a user at the terminal, it should kick them out better. [NM]

-- b95b released==============

- Reduce skydome invalid # of verts battlezone.log message to an INFO
line that prints at most once every 5 minutes. [NM]

- Fix BZC crash by upping # of reserved handles to 512. Ken gets
credit for finding, fixing. [NM]

- Work on bugzilla #647 - tweak to powered buildings getting hit by
EMP in multiworld. Now, always unfreezes player inputs on switching
visual worlds. But, powered building and commvehicle should re-freeze
immediately afterwards if they're in a state that should freeze
inputs. Also fix possible AV reported on bug - could not seem to
locally repro it. If it happens again, please note which craft was
being tweaked, and what base buildings were present (for weapon
unlocks). [NM]

- Better clearing of internal RakNet server state info if posting
session info has an error. [NM]

- Fix for bugzilla #12 - don't allow bomber (or anything with
GameObjectClass->m_IdenticalGroup) to be grouped with something that
doesn't have that. [NM]

-- b95c released==============

- Reduce max command packet size slightly to ensure assert/abort noted
in 1.3.6.4z shouldn't happen. Also reduced the max # of AI units that
can be given a command simultaneously (by the local player) in a MP
game from 63 -> 60 to help ensure things fit. In limited testing,
though, things seem limited to 50 units selectable at once in MP on my
LAN. [NM]

- BZ2 now keeps the five most recent Battlezone*.log files, and the
ten most recent Battlezone-Crashed*.log files. This is tunable in
GamePrefs.ini:
NumBZ2LogFiles = 5
NumBZ2CrashLogFiles = 10

   BZ2 should automatically rename the logfile on a crash. Now, people
should have crash logs readily available for upload.  [NM]

- EMP lockdown weapons should no longer apply to allied units - but
should still work on same team or enemy team units. This fix should
also make the DLL GetTeamRelationship() callback properly return items
if one or both handles is ordnance, a weapon, explosion, or the
like. [NM]

- Added in support for MyDocs\My Games\Battlezone II\UserWhitelistList.ini
If this file is present, it functions like 
MyDocs\My Games\Battlezone II\UserBannedList.ini , but with a
difference-- any IP in UserWhitelistList.ini will never be banned. If
you wanted to whitelist out only a few IPs to join, put them in
UserWhitelistList.ini, and put an entry of "0.0.0.0/0" in
UserBannedList.ini to ban every other IP. Compiles, but is untested.

Note: UserWhitelistList.ini is NOT created or written to by bzone.exe.
Any creation or manipulation is left as an exercise to the user. [NM]

-- b95d released==============

- If there is a BZ2 crash file present, BZ2 will prompt the user on
entry to the pregame shell to report it at
http://bzforum.matesfamily.org/ .  The user will be prompted until
they follow the ingame link to the forums. [NM]

-- b95e released==============

- Alternate release as 1.3.6.4z6

- Added/enabled 'Thundering Herd' for servers & clients. Now, if a
client's moves have not arrived within a 1/2 second of when they
should, the server will go ahead and just fake their moves for them
and rebroadcast them as trustworthy. This should keep the game --
including other clients -- from getting affected by a misbehaving
client. These are the same faked moves as the rest of the multiworld
code uses to interpolate visual worlds, i.e. an average of the past
few turns. However, weapon fire and any commands to AI or players will
be lost if the server has to fake moves.

   Also tightened up the timeskew to adjust a little faster when it
notices client/server time differences.  You can see when this is
being applied by the pause | ingame stats lag column blinking purple
and a "!" appended to the number. Servers will show this blink
indicator for clients being affected; clients will only see theirs and
server rows blinking if affected. [NM]

-- 1.3.6.4z7 released==============

- Fix for bugzilla #661 - crash introduced by thundering herd changes
above. Wasn't fully checking for valid players. [NM]

-- 1.3.6.4z8 released==============

- Switch to an alpha-beta filter for interpolated future moves for
other players. This seems to track controls a bit tighter. [NM]

- Joins blocked are now logged to both chat and battlezone.log. The
message now includes the IP of the blocked player. [NM]

- Servers are much more aggressive at faking late moves for clients.
Now has different throttling for client vs server in looking at
requesting remote moves or faking them. [NM]

- Added more throttling to timeskew code to make an applied timeskew
take effect over a longer period. [NM]

- Fix for bugzilla #657. Added to GamePrefs.ini:

// For a player that has been locally banned, but you're in a game
// that the server has allowed that player, whether they're
// automatically text & voice muted. Default is true (i.e. quiet them
// down)
AutoTextMuteBannedPlayers = true
AutoVoiceMuteBannedPlayers = true

   Compiles, but is untested. [NM]

-- 1.3.6.4z9 released==============

- Merge over floating-point time manager system from 1.3.7 branch of
code. This is likely to be smoother overall because the integer-based
time manager system in 1.0-1.3.6.4 has a minimum resolution of 1
millisecond. The floating point system has much more precision, with
an absolute starting point time and everything measured since
then. [NM]

-- 1.3.6.4z10 released==============

- Tuned timeskew code to apply more from the server, and not move time
as far forward when the server is ahead of the local player. [NM]

-- 1.3.6.4z11 released==============

- Merge over 1.3.7's code to allow for threaded work while waiting for
vsync. Also merged over the code to update visual worlds in a separate
thread while waiting for vsync. This should ideally help smooth out
long frames caused by multiworld work. Also made watchdog thread log
out the multiworld update thread's callstack in case there's any
lurking threading errors. From past experience, there always is
one. [NM]

- Default max ping is now lowered from 1500ms to 750ms (i.e. 3/4
second). Asking BZ2 to guess at up to 3/4 of a second of remote player
moves is going to be pretty warpy at best. [NM]

- Try and update network code more than once per frame, from both main
& MW update thread. This should help BZ2 put timestamps on incoming
move packets more accurately -- and thus help get a more accurate
picture for timeskew calculations. [NM]

- Fix bug where timeskews could be miscalculated with duplicated data
after change to thundering herd. This would confuse a number of
systems. Also added network.adjusttimeskew console command to private
builds ONLY to help test adjustments to this system. [NM]

-- 1.3.6.4z12 released==============

- Possible fix for armory-launched powerups showing different results
in multiworld. Found improperly initialized member variables that
could result in different positions per world. [NM]

- Various minor code fixups caught by Visual Studio 2013 Pro static
code analysis at default MS recommended level. A bunch of possible
array out of bounds issues, new/delete scalar/array mismatches, loops
going the wrong way, etc. [NM]

-- 1.3.6.4z13 released==============

- Fix for bugzilla #660 - skinned objects now have normals (used for
lighting) also transformed before rendering. This will be a (hopefully
slight) speed penalty on rendering skinned objects. [NM]

- Move packets are resent a few more times by clients/servers, and
with slightly higher priority. This may help a little over lousy
connections. I would note some research studies such as
http://caia.swinburne.edu.au/reports/031205A/CAIA-TR-031205A.pdf which
note packet loss as a worse game killer than latency. [NM]

-- 1.3.6.4z14 released==============

- Added, to console and bzgame_init*.cfg, some variables for moving
the target view window around onscreen. The multipliers are like other
UI repositioners that multiply onto the current screen height or
width, and then the 'Diff' is added to the result of that.

Cmd("gameprefs.TargetViewWidthMult 0.25");
Cmd("gameprefs.TargetViewHeightMult 0.25");
Cmd("gameprefs.TargetViewXMult 0.75");
Cmd("gameprefs.TargetViewXDiff -10.0");
Cmd("gameprefs.TargetViewYMult 0.0");
Cmd("gameprefs.TargetViewYDiff 60.0");

   Got only minor testing here. [NM]

- Probable fix for bugzilla #635. Console dome.ambient and dome lighting
was being applied, but the (slightly) delayed rendering with DX9 meant
that it was re-acquiring the ambient color and searching for local lights.
Added, to .trn files: 

[NormalView]
ApplyDomeLights = true

   If this is true, it forces a render flush when drawing the dome to
ensure that the ambient/lighting applied takes effect. (And, doing so
might make .trn::[NormalView]::RenderTransparentSkyWithWorld ignored
because the sky has been flushed and can't be rendered with the
world.) If set to false, uses the same behavior as 1.3ta5-1.3.6.4
release. I left this in as an option in case the early forced
rendering tweaked the way parts interact with the rest of the
world. Accurate transparency needs all items delayed and sorted for
back-to-front rendering. [NM]

- Probable fix for shell 3D objects (i.e. using ICViewer control)
being washed out -- turned off specular highlights in shell, no matter
what. Cannot seem to repro this, so this is a sledgehammer fix for a
fly. [NM]

-- 1.3.6.4z15 released==============

- Darkened up ingame chat background color. Made a new colorgroup, used
only there. Does not apply to escape screen. (yet? ever?) [NM]

- A little more info on callstacks in functions noted in an odd crash
report on startup from the forums. [NM]

- Fix graphical glitch while morphing - copy/paste error copying
transformed normal into vertex slot, and using un[der]initialized
memory for the normal. Fixed that in the one case that looks to have
been wrong - morphing and chroming. And took the opportunity to merge
over my SSE-optimized chroming code to the same function, so that it
should be faster. [NM]

- When BZ2 runs windowed, window title has the version identifier in
its title. Probably useful for me only. [NM]

- More early and often checks in animtypes.cpp. A few builds ago,
Visual Studio 2013's code analysis pointed out some possible reading
un[der]initialized memory, going off the end of arrays. This actually
happened in the wild, and I took another pass at detecting problems
and logging them. May go off a few more times before I really get to
the root cause. [NM]

- Undo change that tried to make specular highlights only happen in
pregame shell. Didn't seem to actually solve the pregame shell issue
(may only happen on nvidia cards). [NM]

- Tweak to fix for bugzilla #660 - skinned objects should have normals
transformed more correctly before rendering. Last fix assumed that the
number of vertices and normals was the same, but items like scion
guardian (fvturr), the count varied, and garbage data came in making
one arm brighter. Now accounts for different counts of verts/normals. [NM]

- When multiworld is on, moved unit order acknowledgment voiceovers to
the lockstep world. This will be a hopefully very slight delay under
normal circumstances. If orders are lost in transit due to the server
waiting over a half second for moves, then this should mean no command
is executed in the lockstep world, and no voiceover either. Do test
that voiceovers (including unit talkback with or w/o chatty units in
MP, the betty voice system, etc) do still play as before when units
are commanded. Multiworld off (i.e. SP/IA default) should behave as
before. [NM]

-- 1.3.6.4z16 released==============

- Tweaked move interpolator for a run of one or two missing moves
between confirmed moves to use the older linear interpolator rather
than the alpha-beta filter. All other runs of missing moves use the
alpha-beta filter. Also, faked moves don't decay towards neutral (i.e.
hands-off controls) quite as quickly as before -- need about 0.8
seconds of no data from a client before the decay-to-neutral kicks
in. [NM]

- More logging about servers faking moves to chatlog file, if
LocalPrefs*.ini::VerboseLagInfo = true. Private testers should
generally have that on, period. [NM]

- Updated player limits for maps, and removed the "we recommend
a 4 player limit for modem servers" text.
 - DM FFA maps: 10 players
 - DM Team maps: 8 players
 - ST/STCTF/FFA: 8 players

   Please note: the default player limits are set so that users can
safely swap commander/thug roles, etc. If you persist in breaking
these limits, then sub-par behavior will likely show up. Don't say I
didn't warn you. This change will be in the next full build. [NM]

- After a resync, if a client is significantly behind the server,
clockskew is instantly applied, rather than gradually. The gradual
approach is better once the the clocks are close, but it's possible to
get further apart after a resync. 

   If you are a client that takes a significant amount of realworld
time to receive and unpack gamestate from the server, that's what the
"pause join" option is recommended to be on for that session. Pause
join ON waits for all clients to send a "Ready!"  message to the
server after a join/resync, and then they should start their clocks
off more in sync. With Pause join OFF, the server will just start
playing after handing the gamestate off to the networking code,
allowing the server's clocks to get ahead of clients. [NM]

-- 1.3.6.4z17 released==============

- Fix for bugzilla #672 - split water rendering into buckets based on
distance from camera, like bugzilla #210 above. Before, it was
accumulating all water chunks and drawing at once, which could pull it
into a closer transparent render bucket. This change will do a few
more draw calls to DirectX, based on what water is onscreen. Accurate
transparency is a juggling act between fewer calls to DirectX (which
is a performance win, as the calls are expensive) and better sorting
of transparent items into different calls to DirectX. This fix seems
to be an acceptable compromise -- perfection will be really hard to do
with a reasonable framerate.

   On the plus side, did find that when reflections were on, and
building up the stencil mask in the reflected-world, it drew every
water chunk as a separate draw call to DirectX per quadrilateral. Made
that code use the same batching as normal-world batching, which should
make DirectX much happier. [NM]

- Fix for some slowdowns in importing large block files. Disabled
memory check for buffer overruns after loading block files, same as
1.3.7 branch. Credit goes to Ken for noticing this. [NM]

- Unit/betty voiceovers in MP should work once again. This may double
up some voiceovers, not 100% sure yet. Do test. [NM]

-- 1.3.6.4z18 released==============

- Probable fix for bugzilla #679 - chatty units in MP should work once
again. Not sure if this is going to break anything. [NM]

- Fix for bugzilla #592. Added an additional class to the default-true
value of this flag:

[CraftClass]
SitAttackCheckAbleToHit = false // == true for all tracked vehicles and turrettanks

   See ChangeLog_pb4.txt, around line 4855 for the description of this.
My writeup there is oddly very close to the bug reports. /sarcasm [NM]

-- 1.3.6.4z19 released==============

- Simplified the logic for ally team to F# binding in code. Seemed
overly complicated for what it was doing. This simpler code should be
more robust. Also added battlezone.log entries (look for "F7 bug?") if
there ought to be a teammate in F# slot that's selected (F7,
control.team.toggle4) and/or sent units (control-F7,
control.team.moveto4) that might contain more info. If you get this,
then submit the whole battlezone.log file. Thanks.  [NM]

- Removed RakNet DLL bindings left over from when it was a DLL. This
ought to shrink things slightly, especially for bz2edit.exe. [NM]

- Switched ping time tracking to Raknet's average and minimum seen (of
a few recent samples, not ever). Shows both in game -- lowest is the
green number, average is blue, though if average goes over server's
max ping, it shows in red. Won't kick immediately if average goes over
server's set max ping, but that player is on short notice. Bad ping
kick messages will also contain a bit more info. [NM]

- Fix for construction rigs getting stuck after losing orders under
heavy packet loss conditions.  Now, if the order does not get verified
by the lockstep world within a few seconds (several multiworld swaps),
then the order is canceled and the crig can be given new orders. A
hack workaround would have been to tell a stuck crig that can't build
to follow you, which should clear its build orders. [NM]

- Imported some SeismicWave changes from BZ1:
1. Shake uses Perlin noise so it doesn't depend on simulation rate.
2. Buildings update over a larger area than the terrain wave itself.
The main benefit is that buildings return to their original positions
and orientations when multiple waves overlap (such as from the Day
Wrecker explosion).  [Ken]

- Fix for load/join/resync time crash in AdjustedMaxHealth(). Reported
on boards, bugzilla #521.[NM]

- Fixed spurious "YouNeedToGetLocalize_Odf" assert when the localized
text was one character long.  [Ken]

- Probable fix for crash/abort in TRANSLATION_TABLE::Next_Index. Does
more clamping of values to sane ranges on entry and exit. This might
affect crig/walker/landcreature walk cycles, especially when bumped or
the like. [NM]

- Glow textures and bumpmaps are turned off when an object is morphing
(i.e. with the chrome look applied). Was getting spurious noise in the
appearance; the current look should be more like 1.3pb4a. [NM]

-- 1.3.6.4z20 released==============

- Fix for crash in Carrier::TriggerSelected, noted on boards. [NM]

- SSE-optimized the calculations of normals on skinned objects, which
should help the framerate slightly. Also made it precalculate which
(of up to two) matrix is more influential on the output normal, and
picks the more influential one. Did some work to eliminate
intermediate temporary memory buffers and unrolled a SSE-enabled loop
to copy vertices & normals. Also found some SSE optimizations to
slightly optimize chroming - masks out the w component directly, no
need to copy to temp space on the stack. [NM]

- SSE-optimized particle position calculation in
TwirlTrailRenderClass::Render(), which was showing up fairly high on
my mantis-2038 save. This is used by pool smoke, other items. Also
switched TwirlTrailRenderClass from a list/dequeue to flat arrays,
expanding as needed and collecting dead items for later deletion. This
makes the code more cache-friendly. [NM]

- SSE-optimized the color interpolation used by all particle renders,
and hand-inlined the color constructor in that interpolator function
as it was a top-10 function on the profiler. Resulting function now
seems slightly faster than the *three* functions it replaces on that
hot path. [NM]

-- 1.3.6.4z21 released==============

- Fix bugzilla #695 - crash with reflections on introduced last
build. Now that struct Plane uses SSE, it must be aligned. No more
braindamage of treating a byte array on the stack as castable to
aligned-16 types. [NM]

- Implemented a better calculate-and-scatter algorithm for the
calculations of normals on skinned objects, which should help the
framerate slightly. [NM]

- Inlined more functions into TwirlTrailRenderClass::Render() to avoid
branches and calls. Total CPU time seems a wash before and after. Most
expensive part is now rotating the particle in 2D. [NM]

-- 1.3.6.4z22 released==============

- Merge over optimized FamilyNode::RenderSetState()/
FamilyNode::RenderSetStateWithParent() from trunk. This trades some
additional memory for reduced quaternion->matrix conversions when the
quaternion is unchanging. On my profiling runs, it is now sometimes
fast enough to overrun cache loads of child FamilyNodes so that it's
waiting on memory rather than on calculations. Can't fix that w/o huge
restructuring of data in memory. [NM]

- Person-out-of-world check takes terrain grid size into account; this
fixes problems with larger maps featured in the EPIC mod.  [Ken]

- Probable fix for bugzilla #697 (and probably others) - crig
build/upgrade/demolish code now checks if it's too far away to do the
build, and if it's too far away and also deployed, forces an
undeploy. [NM]

- Construction rigs shouldn't time out in the build stage, behavior
added in z20. As long as the build menu is open, will never time out
in visual worlds. Once that build menu closes, the clock starts
ticking to possibly time out if it's not confirmed in lockstep
world. [NM]

- Toned down the color flashing of ping times. Lowest ping shown in
white, average ping shown in a bluish-white. Until ping time gets too
low, then it'll be more noticeable. Also, if average ping time for a
player is too high, will spam chat message box noting that the network
code is not to blame for a sub-par experience while such player(s)
have bad pings. [NM]

-- 1.3.6.4z23 released==============

- Any struct Matrix passed to/from is re-aligned to the 16 byte
alignment required by SSE and its optimizations. Affects BuildObject()
overload, Get/SetPostion(). Speed hit of recopying matrices to ensure
alignment should be negligable. Credit goes to Ken for diagnosing the
problem. [NM]

- When a BZ2 crash report is promised to be uploaded -- by visiting
the forums; hitting OK will keep bugging you -- then it sets the
internal timestamp of when a crash was reported to "now" and force
writes the current pilot profile to disk. The precision of Windows
file times is 100ns, though less on FAT/FAT32 drives. I'm still not
seeing all that many crashes reported compared to complaints that BZ2
is bugging the user to upload. [NM]

- Work on bugzilla #686, probably others. Tweaked .ogg playback code
to more aggressively lock for safety, but moved it from one global
lock for all ogg threads to a lock-per-thread. Added a few more sanity
checks and extra logging. Also bumped max # of ogg sounds
(i.e. threads) from 8 to 12. [NM]

-- 1.3.6.4z24 released==============

- Added to GamePrefs.ini : SessionListFilterOutPasswordProtected,
SessionListFilterOutLockedGames, SessionListFilterOutDifferentVersion,
SessionListFilterOutMissingMaps, SessionListFilterOutNattedServers.
See comments above them for how to use them. Note that these do not
apply to the current game version session. [NM]

- Per
http://www.gamedev.net/topic/433837-are-there-known-issues-with-directsound---multithreading/
removed the threading restriction on DirectSound8 calls for streaming
Ogg sounds. Now can be played from any thread, which in practice will
be either main thread or the vblank work helper thread. [NM]

- Fix for bugzilla #702 - in satellite view, selecting the recycler/
factory/armory via mouse click on their icon should work much more
reliably.  It was interpreting long (to code, not humans) as a
drag-select starting from the top-left, which would cancel the opening
of recycler/factory/armory. Now tracks where mouse went down more
reliably and should avoid these false positives on quick clicks. [NM]

-- 1.3.6.4z25 released==============
