2009-10-15:
* Fixed all "backwards" FriendP/EnemyP uses

2009-11-16:
FIRST PUBLIC RELEASE
(Includes VC++ 2008 changes below, since I checked those in later)

2009-11-23:
* Switched to Visual C++ 2008 Express
* Replaced "afxres.h" with "winresrc.h" in resource files
* Updated compiler settings
- Optimized for size
- Enabled link-time code generation
- Disabled C++ exceptions
- Removed run-time type information
- Enabled COMDAT folding
- Removed unreferenced symbols
* Fixed iterator validation problems
- TO DO: check other code for this idiom
* Fixed divide-by-zero in Explosion animation when no frame rate is set
* ScheduleGlue fixes
- Clamped seeing range to 255 instead of wrapping around
- Replaced ObjectList::iterator with an index to prevent iterator invalidation

2009-11-27:
* Fixed frame rate dependency in camera rotation
* Timer upgrade:
- Added Get_TimeNow() wrapping the underlying timer function
- Added matching end to multimedia timer begin period
- Added optional support for high-resolution timers
- Converted external usage of GetTickCount() to Get_TimeNow()
* Updated RemoteDetonator to send "detonate" network events on deselection and deletion, not just manual triggering.
* Added 1D Perlin noise to random
* Clamped cinematic camera height before computing look-at
  (This fixes some of the cinematics, particularly mission 18)
* Switched EarthQuake simulation to Perlin noise
* Reduce camera descent rate in opening cinematic
  (Was not taking time step into consideration)

2009-11-30:
* Player can only select units on the same team (not allied teams)

2009-12-05:
* First release of the new D3D9 renderer

2009-12-07:
* Fixed some performance problems with the renderer
* Fixed seismic wave screwing up the terrain
* Fixed divide-by-zero error in the AI that could make things go haywire
* Simplified virtual memory allocations used by the terrain and high-level rendering system, which may or may not help with the DEPs. (It now commits the full amount instead of reacting to access violations and committing memory incrementally.)
* By popular demand, disabled CD check for the duration of testing

2009-12-08:
* Replaced MemDebug allocation with normal memory allocation
* Removed the virtual memory exception handler to allow "normal" crash reports
* Fixed faint alpha-blended sprites
* Forced Z-buffering on and Z-split off to fix rendering problems
* Added an emergency fix for bad geometry data
* Fixed an AI invalid floating-point operation that crashed the second NSDF mission
* Fixed slow mouse turning at high frame rates

2009-12-10:
* Fixed most of the application minimize/restore problems
* Eliminated the green tint on the target and sniper scopes
* Removed CPU speed check that used privileged instructions

2009-12-11:
* Added support for 32-bit frame buffer, enabled by default. Disable it in render.cfg "[D3D]" section with "Buffer32=0".
* Enabled dithering for 16-bit frame buffer.
* Fixed fog color not getting set properly (e.g. in first Soviet mission).
* Turned off base address randomization so I can get meaningful results from crash reports... :)
* Removed unused library dependencies.
* Fixed calculation of v_mag_inv for small v_mag, which may fix some rare collision issues.
* Fixed invalid floating-point operations in AI lateral movement, which should increase mission stability.
* Added support for setting vsync, enabled by default. Disable it in render.cfg "[D3D]" section with "Vsync=0".
* Re-added support for setting Z-buffer, since removing it broke software renderering. Hardware rendering is much faster with it enabled, almost 2x on my desktop computer.
* Switched seismic wave and explosion shake to Perlin noise. The explosion shake is currently very weak, so it'll get tweaked later.
* Dx sent a fix that makes 1600x1200 mode work again. It's pretty swanky. :)
* Forced anisotropic texture sampling for everything, so sky sprites (e.g. Earth on the moon missions) look a lot better.

2009-12-13:
* Increased maximum number of smoke sources to 256 (submitted by Dx)
* Skip allied silo for team strat (submitted by Dx)
* Fix for getting 5 pilots when one jumps out out of Barracks (submitted by Dx)
* Send out player pings (submitted by Dx)
* Fix buffer overflow when joining a game (submitted by Dx)
* Automatic configuration of Z buffer setting (off for software, on for hardware)
* Switched all "shake" effects to Perlin noise and ensured "round down" float-to-integer conversion
* Fixed occasional floating-point invalid operation in the clipper when submitting a zero-vertex polygon (probably harmless, but still...)
* Linked with latest Anet headers and libraries (submitted by Dx)
* Fixed uninitialized member variables in Weapon, which could crash AI
* Possible fix for visual glitches in the shell
* Prevent camera view change after player dies (untested)
* Fixed video mode switching (I think)

2009-12-16:
* Pilot hopping out of a Barracks no longer adds pilots (it deducts 1 for now, but that may change)
* Fixed SITE/Satellite camera rendering
* Fixed external view camera controls at high frame rates
* Changed shell controls to enumerate font once on creation
* Geometry system attemps to repair bad vertex and face normals
* Limited AIP update to 60Hz
* Made AIP parsing more tolerant, treating integer and floating-point equally
* Fixed invalid seeing range for non-Craft in AIP
* Set unit hit points value correctly (used to determine strength)
* Prevent changing camera views after player character death
* Fixed some asserts in Inst04Mission
* Fixed incorrect font in shell text areas (e.g. mission briefing screen)
* Fixed an invalid floating-point operation in nacelle code when Hovercraft explodes
* Fixed support for non-assembly routines in Math3D (currently unused)
* GunTowerAttack just aims instead of calling DoStand() (This greatly reduces the amount of work it has to do)

2010-01-12:
* Removed Anet cheat (submitted by Dx)
* Recycler spawns closer to player, preventing it from getting stuck on blocked slopes (submitted by Dx)
* Removed unused "to team" chat code (submitted by Dx)
* Fixed a buffer overrun in the shell (submitted by Dx)
* Fixed a copy-paste error in calc_poly_plane (submitted by Dx)
* Mission 18 sets transport objective name to "Fury Transport" (submitted by Dx)
* Reduced red out on craft and pilots (submitted by Dx)
* Fixed multiple snipes on a pilot. (multi-player) (submitted by Dx)
* Very Experimental: (submitted by Dx)
- Increased "FAR_CLIP" from 1000m to 1304m (Horizon)
- Increased "MAX_FAR_CLIPPING_PLANE" from 1280, to 1640m (Camera)
* Replaced "nk_1sun1.map" and "nk_1mon1.map" with "sprite_a.map" (submitted by Dx)
* Increased "SORTING_TABLE_SIZE" memory to allow larger view range (submitted by Dx)
* Disabled Thumper on "CLASS_TURRET" to prevents Gun Towers from flipping under terrain (submitted by Dx)
* Set angular velocity to zero on deployed turret to stops the wild flipping under ground (submitted by Dx)
* Restored original walker code (submitted by Dx)
* Enabled high-resolution ordnance matrix packing from trunk
* Made Pilots hopping out of the Barracks free to prevent a pilot-draining exploit in strategic multiplayer
* Experimental: increased depth buffer to 24 bit to fix rendering issues

2010-01-19:
* Stopped power ups from beeping in DM when thumped (submitted by Dx)
* Increased sniper scope visibility range (submitted by Dx)
* Added more anti-cheating measures (submitted by Tug)
* Fixed Tug crash when the target object has no hitch (submitted by Tug)
* Prevent powerups and nav beacons from falling under ground (submitted by Tug)
* Prevent tanks from getting stuck under ground (submitted by Tug)
* Restored original Turret and Gun Tower reaction to seismic wave
- TO DO: increase alphaTrack and alphaDamp in ODF files to prevent flipping
* Experimental: switched health and damage from integer to float
- TO DO: switch ammo and cost from float to integer as well
* Experimental: changed depth test to "<=", which may help with ground reticule
* Fixed height indicator lines appearing in front of radar icons
* Fixed a possible divide-by-zero error in UnitTask::GotoForce (spotted by Tug)

2010-01-21:
* Fixed engine flame disappearing when target cam is visible
* Fixed lines to command panel appearing in front of radar icons
* Cockpit and Map Radar indicate attack and show numbered icons for actual teammates instead of allies
* Fixed line and icon sorting order for Map Radar
* Fixed lava heat damage for Craft
* Fixed Person damage multiplier applying all the time instead of just for collision damage
* Fixed main view sky drawing into target cam view
* Application now sleeps when deactivated
* Experimental: Bullet collision update
- per-object test now checks collision type flags
- consolidated the two sphere tests
- removed now-obsolete "don't hit owner" check

2010-01-29:
* Updated cheat protection (submitted by Tug and Dx)
* Fixed sniped pilot anim (submitted by Tug)
* Fixed bug in respawn timer (submitted by Tug)
* Fixed stack corruption on whisper (submitted by Tug)
* Fixed firing through terrain (submitted by Tug)
* Fixed possible problem when a vehicle avi is missing (submitted by Tug)
* CTF Fixed crash when ship is destroyed (submitted by Dx)
* Experimental Bullet collision updates:
- Use bounding box when available
- Ignore sphere when starting inside
- (These fix vehicles shooting themselves, but may have gameplay ramifications.)
* Fixed Terrain intersection not restoring rounding mode
* Planar explosion properly rounds down frame number
* Fixed incorrect ground sprite clipping (e.g. ground reticule)
* Extensive video mode list update:
- Build list from D3D mode list
- HUD no longer depends on fixed resolutions

2010-01-30:
* Fixed rendering order in shift-F9 view
* Fixed gauge rendering in status display
* Fixed potential divide-by-zero error in UnitTask GoTowards
* Mouse sensitivity no longer depends on resolution
* Ignore (de)activation events not directed to the main window
Proper support for multisampling:
* Added MultiSampleType option to render.cfg
- A value of 0 disables multisampling entirely (the default)
- A value of 1 uses MultiSampleQuality to access AA modes
- Other values control the number of samples
* Added MultiSampleQuality option to render.cfg
- Value selects different settings for a given type
- Experiment and see!
* Fixed HUD elements that looked wrong with AA enabled
* Added MaxAnisotropy option to render.cfg
* Bullet collision changes:
- Restored code to avoid hitting owner
- Restored original sphere collision

NOTE: the AA change required turning off lockable back buffer and dialog box mode in-game.  This will improve performance (especially on older systems) but prevents dialog boxes from being visible.

2010-02-04:
* Fixed a spurious error in joystick code when reading registry
* Producer enemy kick-out changes:
- Uses the full bounding box instead of a sphere
- Applies only to vehicles instead of all enemies
* Skip dead/gray scrap player (submitted by Tug)
* Improved PathDisplay depth sorting:
- Paths and objects sort behind text
- Objects sort behind paths
* Improved video mode enumeration to fix missing resolutions
* Experimental: Damped AI steering and movement controls to prevent overshoot
* Limited height of lava damage to be more consistent with BZ 1.4
* Experimental Command interface update:
- Added attack commands to deployed Turret and Howitzer
- Ignore uninteresting neutral objects (versus "follow" or "defend")
- NOTE: skipping neutral objects may have unintended consequences (please test!)

2010-02-19:
* VisibilityScale max 150 on the internet (submitted by Tug)
* Fixed weapons "disappearing" from enemy tank when entered (submitted by Tug)
* Respawn pilot while in net escape dialog (submitted by Tug)
* Limit the sniper dot size and penetration (submitted by Dx)
* Removed physical and virtual memory size checks
  (New operating system requirement takes care of that)
* Fixed Beam doing negligible damage
* Experimental: Ordnance network data now includes owner id
- Seems to fix remote units hitting themselves

2010-02-26:
* Increased number of dust puffs to fix a runtime warning (submitted by Dx)
* Fixed intermittent crash on PowerPlant deletion (submitted by Dx)
* Experimental: FriendP and EnemyP both return false for team 0 (neutral)
  (This should fix various oddities involving neutral objects)
* Fixed external reticule and ground indicator appearing in target camera
* Improved AI get repair/reload behavior
- All units support repair/reload from base buildings
- Deployed units prefer launched powerups, but will pack up and drive if necessary
- Units resume normal behavior when fully repaired/reloaded
* Filtered out resolutions below 640x480
* Entities now simulate every frame even when off-camera
  (This may slightly reduce frame rates in single-player)

2010-02-28:
* Fixed alt-tab in network play (submitted by Tug)
* Fixed crash/malfunction in Construction Rig UnBuild task after loading
* Experimental: reset ally status when player leaves
* Reimplemented Bullet IntersectBox to avoid divide-by-zero
* Player preferences file now saved in user documents folder
- TO DO: move all commonly-written files (e.g. saves) there

2010-03-19:
* Experimental: DPI aware fonts. (submitted by Tug)
- TO DO: Test single player, declare that bz is dpi aware?
* Selections in chat windows. (submitted by Tug)
- TO DO: Better scroll back
* Fix bug in netnam2.txt reader. (submitted by Tug)
* Changed chat color to green for improved contrast
* Enabled D3D support by default
- NOTE: Force software mode with "/SW" on the command line
* Artillery and Turret AI auto-deploy when commanded to attack
* Set Comm Sat and Barracks toggles to "ON" by default (submitted by Tug)
* Set Sync Join to off by default (submitted by Dx)
* UpdateOptionBox Fix (submitted by Tug)
* Added Splinter Host Control (submitted by Dx)
- TO DO: Add "+ multi_three {Splinter}" to label.map
* Changed Default Player Lives to 3 (submitted by Dx)
* Unlock mouse pointer on pause
* Enabled close button in windowed build
* Fixed cursors being left behind after exit
* Added proper handling for missing cursor images
* Re-enabled custom cursors in non-internal build

2010-03-27:
* Encrypted session passwords (submitted by Tug)
* More anti-cheating (submitted by Tug)
* HideBox Fix (submitted by Tug)
* Set Splinter Host Control to ON (submitted by Dx)
* Mission version bump (submitted by Tug)
* Safe spawn in DM (submitted by Tug)
* Lobby uses map list to determine DM/ST icon
* CraftClass uses selectReadyMsg if missing selectOtherMsg
* Experimental: rebuild D3D if device reset fails (e.g. while recording with Fraps)
* TurretTank weapons start disabled
* Camera field of view compensates for wide-screen

2010-03-30:
* Add TransportMode for TCP/IP LAN (submitted by Dx)
* Added gsplint to PrjID (submitted by Dx)
* Splinter Host Control now disables the weapon in vehicles (submitted by Dx)
* Fixed camera view angle so it matches 1.4 for standard aspect
* Cleaned up some camera initialization code
* Fixed sniper interface positioning in wide aspect
* Sniper camera now draws behind the target camera
* Fixed shell keyboard input binding screen
* Experimental: prevent launched items from hitting the Armory
* Adjusted empty hovercraft physics to reduce sliding
* Fixed units interpenetrating buildings
- Point-box test now returns a collision when the point is inside
- Integrated movement into Craft collision check to prevent double-move
- HoverCraft simulation now checks collision after calculating acceleration

2010-04-13:
* Fixed Editor black screen (submitted by Dx)
* Clamped MDM shot timer to prevent multiple shots firing at once
* Reduced empty hovercraft "friction" back to 1.4 levels
* Fixed units getting stuck in buildings
* Fixed TAG leader round adding ammo instead of deducting it
* Tug fixes
- TugProcess properly uses the Tug's hitch object
- Tug no longer collides with its cargo (and vice versa)
- Dropping a non-vehicle object snaps it to the ground
- Moving an object properly updates its entity bounding box
* Fixed crash when target dies during APC deployment
* Fixed crash in "Bio-metal Scavenging" when the player kills the drone prematurely
* Experimental: prevent collision raycasts from tunneling through terrain
* Experimental: network ordnance synchronization
- Quantized ordnance direction on sender side to match remote side
- Added support for sending ordnance state updates (not just create)
- MDM and Splinter shells to send state update on bounce
- Popper shell sends state update on launching sub-munition
- Aligned mortar shells with flight path since state update assumes it
- Ordnance send expiration network events

2010-04-17:
* Reduced pilot "stickiness" (submitted by Dx)
* Changed Splinter button helpLabel (submitted by Dx)
* Ordnance "catch-up" on receive will terminate if expired
* TugProcess improvements:
- Switched to common Say function, which features repeat delay and ODF configurability
- Copied support for "get repair" command from ScavengerProcess
* Fixed spurious collision sounds
- RegCollision returns whether the objects "should" collide
- Collision sounds trigger only when RegCollision returns true
- Tug copies its linear and angular velocity to the cargo
* Craft death/ejection improvements
- Ejection marks craft as destroyed instead of exploding immediately
- Reduced secondary explosions from one per frame to around five per second
- Experimental: made craft owner of explosions
* Explosion shake only affects dynamic objects
* Person counts as a multiplayer kill only if has a positive pilot cost
* Switched from Terrain_GetHeightAndNormal to Floor_GetFloor where possible
* Floor_GetFloor now takes a double-precision position vector
* Reduced cutoff altitude for dust effect
* Bullets expire when leaving valid terrain
* Tweaked AI targeting rules
- Skip neutrals that haven't shot the AI unit
- Skip empty vehicles
* Extended player's valid region to the full play area (it was previously inset by 10 meters)
* Experimental: player "death view" preserves original camera settings

2010-04-18:
* Fixed units not collecting powerups (!)
* Reverted craft ownership of explosions due to unwanted side effects
* TugProcess properly approaches and withdraws from cargo
- TO DO: hide cargo in first-person view
* CanCommand returns false for destroyed objects
* Greyed out destroyed objects in the command menu

2010-04-24:
* Fixed Sync off strat crash (submitted by Dx)
* Disabled Splinter Host Control from working in DM (submitted by Dx)
* Initialized the variable buffer in EndEnum() (submitted by Dx)
* Fixed sniper field of view
* UnitTask Goto improvements
- Skip cliff repulsion when pathing fails (e.g. trapped)
- Apply boost when climbing a steep incline
- Consider a unit stuck only if not making progress
* Death view now preserves the camera stack so it doesn't affect Shift+F4 view
* Reimplemented ordnance remote detonation
- Sends a list of ordnance identifiers
- No longer depends on owner object
* Skip non-commandable units when broadcasting commands
* Network Timer fixes
- Toggle only works in net games with no time limit
- Moved toggle function to CockpitTimer
- MultSTMission now updates the timer properly

2010-05-05:
* Fixed memory leak by preventing respawn while in net escape dialog (submitted by Dx)
* Restored 1.4-style Bullet behavior
* Fixed sniper shell not penetrating through some units
* Fixed a buffer overrun in the /version chat command
* Mostly restored original terrain behavior
- Added some "thickness" to tolerate floating-point limitations
* Improved craft collision with terrain and buildings
- Prevents interpenetration
- Reduces dragging/hanging
* Remote bullet hitting local object sends expiration notice

2010-05-08:
* Restored original PointBox behavior of setting time and normal only when there is a collision
* Increased packet buffer size for RemoteDetonator detonation (because Anet adds data to the end)
* Producers kick enemy pilots in addition to vehicles
* Added open/close digitalvideo per Microsoft documentation
* Flush D3D textures on cleanup (fixes missing terrain tile mipmaps)
* Removed apparently-unnecessary device reset from D3D_Restore

2010-06-10:
* Made Player Information labels more clear. Todo: Edit get_info, mail, url description in label.map (submitted by Dx)
* Fixed netnam2.txt Player Information character length. (submitted by Dx)
* Changed barrack, comm sat and sync labels (submitted by Dx)
* Temporary change to override help labels in label.amp (submitted by Dx)
* Mission version by build date. (submitted by Tug)
* Mission version checks more files (submitted by Tug)
* Reduced remote ordnance expiration network traffic:
- Added notifyRemote ODF property to control remote expiration
- Restricted remote expiration to rockets and shells by default
- Only send notification when hitting a movable object
* Disabled TurretTank attack commands
* AI units will attack empty enemy vehicles if there are no higher-priority targets
* Skip sending empty lines in the multiplayer lobby chat
* Disabled save/load hotkeys in multiplayer
* Force mode change when switching to and from shell mode
* Reset the D3D device when restoring the window
* Improved handling of application activation and deactivation
* Cleaned up a few D3D initialization and reset issues
* Chat messages no longer fade out
* Added drop-shadows for better contrast
* Color-coded messages based on source
- sent by the system: white
- sent by the player: green
- sent by ally: blue
- sent by enemy: red
- broadcast: purple
* Skip sending empty chat messages in multiplayer

2010-06-12:
* Re-enabled code to look for movies in the local path
* Shell uses modeless child dialogs instead of modal popup dialogs
- Application window drag, minimize, and close now work properly
- Increased reliability of shell animations in full screen
- Improved D3D handling of window restore
- Hide shell dialogs "behind" full-window pages instead of just disabling input

2010-06-13:
* Fixed enter key processing in the shell dialog message handler
* More shell tweaks
- Fixed close button handling
- Cleaned up some unused extern references
* Fixed excessive CPU usage in shell dialog message handler
* Fixed invisible map filter popup
* Fixed "ding" when entering a chat message
* Fixed spontaneous shutdown when leaving a net game

2010-06-15:
* Fixed invisible error dialog box
* Shell now uses mciSendCommand instead of mciSendString
* Fixed movie player popping up (usually hidden) windows
* Fixed lobby disappearing when showing the create room dialog
* Shell loads button labels from (updated) labels.map
* Restore input focus after returning to the application
- Fixed input configuration screen
- Fixed multiplayer chat edit boxes
* Fixed load save game shell dialog

2010-06-19:
* Fixed join net game shell dialog
* Improved in-game chat display
- Added word wrap to scroll region
- Added automatic scrolling to input region
- Reduced width so it doesn't cover the middle of the screen
* Collision system fixes and enhancements:
- Fixed reversed collision result when a craft hit the edge or corner of a box shape
- Added time step parameter to various collision functions
- Recursive check searches for lowest time to intersection instead of stopping on first hit
* Added pre-build event to generate a build identifier
* Updated CRC mission hash to use the new identifier

2010-07-11:
* Removed SetCapture from net game dialog boxes to fix cursor rollover problems
* NOTE: the main window can now be moved while a pop-up dialog is open
* Net ally/enemy utility functions now take deathmatch team rules into account
* Disabled ally/unally in deathmatch since team numbers are meaningless
* Don't print matching files when performing /version
* Fixed minor bug with syncBox (submitted by Dx)
* Implemented sun occlusion in hardware renderer
* Cleaned up glare effect calculation
* ProximityMine scans every searchPeriod seconds (default 0.1) instead of every frame
* Mine and ProximityMine record their state in save games
* Size message handler does not change window position in Device structure
* Restored support for multiple glare sources (not currently used)
* Removed commented-out glare fade since it was inconsistent with software path
* Moved occlusion query code from LensFlare to D3D renderer
* Improved device reset handling to reduce errors and avoid full destroy and recreate
* Display mode switch tries to keep the window as close as possible to the previous location
* Calibrate occlusion query to correct for multisampling
* Added render.cfg HardwareClip option to let D3D do polygon clipping
* Treat remote sniper shells as normal bullets

2010-07-12:
* Fixed bug when reading HardwareClip option from render.cfg
* Added viewport clipping to sniper scope and target camera
* Clear ordnance identifiers and mapping table on cleanup
* Missile pack/unpack now includes ordnance identifier
* Experimental: send sniper shell to remote players
* Disabled hardware clipping by default since it has too many problems
* Restored old lens flare behavior when occlusion query isn't supported

2010-10-19:
* Fixed MiniMap bottom border (submitted by Dx)
* Fixed ShellButton height for "Forward" and "Back" (Input configuration screen) (submitted by Dx)
* Only lock vertex and index buffers once per batch
* Producers cancel build in progress when destroyed
* PointCarCheck takes a "fat" parameter (normally zero) like related collision methods
* Avoidance never skips the player on the AI unit's team
* Added creation timestamp to GameObject
* DoCollision takes impact time into account
- Apply original velocity until the impact time
- Apply new velocity for the remainder of the time step
- Negative impact time backs the unit out of the collision, resolving interpenetration
* Added a short time delay between soldiers exiting the APC
* APC sets itself as the owner of the soldiers
* Soldiers will return to their APC instead of hiking all the way back to base
* HACK: craft don't collide with other entities for one second after creation
- This gives units a chance to escape the collision geometry of the unit that built them
* Unit recycle now uses the go-to-object form of GotoTask
* GotoTask takes unit radius and target radius into account
* This fixes large objects not being able to satisfy the done condition
* Fixed net game smap list disappearing after showing options menu
* Producer blocks terrain based on its entity bounding box
- This improves coverage by taking animation pose into account
* Fixed divide-by-zero error when adjusting window rectangle on resolution change
* Added child dialog for LicenseDlgProc (Fixes black screen when /edit is used) (submitted by Dx)
* Renamed original Path system to Path_Original for reference
* Imported pathing system from BZ2
- Divides map into 32x32 cell "zones"
- Allows adding and removing path obstacles at runtime

2010-10-21:
* Fixed problems with recycling units
* APC uses an ODF property (soldierDelay, default 0) instead of a hard-wired constant
- Fixed crash on completing the recycle process
- Fixed units parking at a distance instead of recycling
* Reverted changes to GotoTask since they caused problems
* Cleaned up window initialization a bit
* Fixed position adjustment when the width or height was larger than the screen

2010-10-23:
* Reverted to original unit recycle behavior since it works better
* Disabled soldier return to APC
* Soldiers pick closest Recycler, Factory, Armory, or Barracks
* Fixed D3D_Flip returning a possibly-uninitialized value
* Fixed mouse input after returning to application via Alt-Tab
* Removed redundant UnlockMouse from InputErrorOkOrCancel

2010-10-24:
* Fixed an uninitialized value in the AI scheduler
* PlanExists sets pathing type
- This fixes some asserts and a crash on misn16b.bzn
* Occlusion query calibration doesn't try to clear the z-buffer when there isn't one
* Added memory pool class from VideoVenture
* PathPoint and PathPlan now use memory pools
* Fixed a memory leak in PlanExists
* Fixed a memory leak in FindPlan when find path failed
* Fixed support for "building" cell type
- CellType return values match what the pathing system expects
- Paths navigate around buildings but can end on a building footprint (unlike cliffs)
* Restored original Soldier base selection
- Only go to Factory if there is no Recycler
- Only go to Armory if there is no Recycler or Factory
* Soldier will go to a Barracks if it is closer
* Pilots can return to barracks like Soldiers
* GotoTask returns done if the unit physically touches its destination object
* Recycling uses "go to object" form of GotoTask again
- This allows recycling to commence if the unit touches the dropoff point
* Fixed a buffer overrun when reading a PrjID with 8 characters from an ASCII .bzn file
* D3D_Restore always resets the D3D device in full screen
- This fixes the shell not returning to full screen after Alt-Tab
* Can select and command units with no team slot
* Units will try to grab a free team slot if they need one:
- The unit has an AI process
- The unit does not have a team slot assigned
- The unit has a valid team slot category
* Made some unreliable network messages reliable:
- Host stopping the game (STOPGAME_PACKET_ID)
- Snipe event (SNIPE_PACKET_ID)
- Spawn point selection (SPAWNPOINT_PACKET_ID)
* Improved team slot assignment
- Added a new AssignTeamSlot method to GameObject
- Assign slot if the object has zero pilot cost
- Assign slot if the unit has an AI process (piloted)
- Clear slot if the unit lacks an AI process (empty)
* AiUtils BlockCells uses entity world bounding box
* Added CLASS_ID_SIGN (e.g. pylons) as path obstacle
* Removed redundant BlockCells from Producer

2010-10-25:
* Fixed multiplayer pre-game player list and chat window after alt-tab
* Reverted ability to command units with no team slot
* Reverted changes to team slot assignment
* Path display uses a precomputed color instead of looking it up all the time
* GotoTask end condition uses unit collision radius instead of a hard-wired 5m radius
- This fixes large units (>5m) not being able to reach the end of the path if it abuts impassable terrain
- More specifically, this allows large units like Walkers to recycle themselves
* Another round of pathing updates...
- CellType uses BZ2-style terrain flags internally so I can mix and match
- BlockCells marks the collision radius as water (since BZ doesn't use it)
- FindPlan treats water as an impassable obstacle (like cliffs)
- So: units can enter building cells, but will stop at the edge of the inner core
* Non-player pilots set vehicles local on entering
- This should fix pilots vanishing on entering vehicles in MP
* Chat messages fade, but reappear while text input is visible
* Cancel chat message input with the escape key

2010-10-28
* Collision clamps time-to-impact to +/- one time step
- This prevents extreme collision responses (e.g. teleported, thrown into orbit, and so forth)
* Collision treats objects with zero mass as immovable
- This fixes problems when running into Gun Towers
* Walker collision also treats zero-mass objects as immovable
* GotoGeyser compensates for unit collision radius
- This should fix producers sometimes not quite reaching geysers
* GoPoints compensates for unit collision radius
- This fixes Minelayers only laying one mine and then stopping
* Prevent Scavengers from considering scrap on lava
* Treat building area as traversible
* Treat building core exclusion as cliff instead of water
* Completed support for BZ2-style pathing types
- Hover units use the default path type
- Walkers, Soldiers, and Pilots will not try to cross lava
- TO DO: use flying path type for airborne SAVs?
* Turned off showPathSteps since it doesn't do anything
* TargetCam uses sphere center for objects without an eyepoint
- This fixes the camera view intersecting the ground
* Made Geysers untargetable and unlockable when in use
* Experimental: GetCommand ignores friendly CLASS_ID_SIGN objects
- This eliminates the "defend" command for mines, seismic waves, and splinter shells
- NOTE: this does not apply to the Tug
* Restored some code in GotoTask that got lost
* More path system tweakage...
- Mark cells within CollisionRadius as "building" (like BZ1)
- Mark cells within entity world box as "perimeter"
- This seems to fix the residual pathing problems

2010-10-30:
* Fixed goal distance check GoPoints::DoStateProlog
- This should fix the Minelayer (again)
* Clip paths entering building tiles
- This fixes paths going around buildings to enter on one side
* Loosened GotoTask restart condition
- It now compensates for source, destination, and grid sizes
- This fixes cases of units not being able to recycle
* Experimental: clip paths ending on any too-expensive terrain
* /kick works against players in-game and in the escape screen

2010-11-03:
* Added a flag to GotoTask to override normal "done" behavior
- This fixes issues with GoNear and GoPoints end conditions
* Fixed a (spurious) floating point exception when clipping polygon lighting
* Experimental: use edge path instead of terrain extents for pathing cells
* Huge improvement in shift-F9 rendering performance
* Experimental: perform common drawing setup operations only once
- This improves frame rate slightly (a few percent)
* MultSTMmission respawns players 100m in the air
- This should help reduce spawn-camping
* Synchronized PowerUp pack and unpack network state
- Pack sends JAMMING flag (read by Unpack)
- Unpack reads DEAD and DYING flags (written by Pack)
- This probably doesn't fix any major problems, though...
* Disable map boundary while in edit mode
- Note: turning off edit mode while outside the play area may lead to hilarity ensuing :)
* Softened the boundary effect
- Player retains full vehicle control
- Reduced the intensity of the push-back force
* Increased chat text width to 240 pixels (40 characters)
- This reduces the worst-case messages to three lines
* Changed PathDisplay "[SHIFT] Cancel" to "[TAB] Cancel"
- This reflects the actual key-binding

2010-11-06:
* Fixed units wandering off when getting repaired or reloaded
* GotoGeyser skips the normal GotoTask done condition
- This allows it to use the original distance checks
* Craft, Seismic, and Walker apply velocity in double-precision
- This fixes precision problems on maps with large offsets
* Experimental: delay deletion after receiving an ordnance-expired network event

2010-11-08:
* Fixed BlockCells and BuildingCells potentially writing outside the cell array
* Cell array uses map boundary instead of terrain boundary
* Fixed cell array boundaries so all cells outside the boundary are impassable
* Repair and Reload use GoNear and SitTask so they park near the building instead of spinning around inside it
* Fixed producers overshooting geysers and having to back up

2010-11-19:
* Fixed multiplayer pre-game and post-game screen redraw after returning from options (submitted by Dx)
 Pre-game screen:
  - Removed playersInSyncGame.Redraw() (Had no effect)
  - Added InvalidateRect List Player Status
  - Added InvalidateRect Edit Chat Line
 Post-game screen:
  - Added InvalidateRect Edit Chat Window
  - Added InvalidateRect List Player Status
  - Added InvalidateRect Edit Chat Line
* Allow straight-line pathing when airborne regardless of terrain cell type
- This allows pilots exiting the Barracks to navigate to their destination
* Experimental: increased remote ordnance expiration time
* PathDisplay picks object whose center is closest to the cursor
- This helps in cases where two objects overlap
* Fixed Pilots and Soldiers not reaching their destination
- Use destination collision radius plus some padding
- Override GotoTask normal ending condition
* Updated AttackTask state machine with changes from BZ2
- Blast transitions to Goto instead of Slide when unable to hit a building
- Slide transitions to Goto after 10 seconds
- Slide transitions to Attack if able to hit (which fixes the "dancing")
- Stand transitions to Flee instead of Slide after 8 seconds
- Goto transitions to Blast instead of Slide if able to hit
* Tweaked AtomicAction "ring" ranges a bit
- Close distance is now 10m instead of 9m
- Mid distance is now 25m instead of 24m
* Use terrain boundary for pathing in single-player
* Renamed low-level BlockCells to PerimeterCells since it affects that terrain flag
* Removed some redundant code from FindPlan
* AddCliffForce includes building cells (like BZ2)

2010-11-20:
* Prevent reticle command when pointing off-map
* Brought over some FireAt improvements from BZ2
- FireAt takes target size and distance into account
- Attack tasks use a much smaller angle tolerance value
* Further AttackTask enhancements
- Blast actively evades its target's line of fire
- Flee actively evades its attacker's line of fire
- Flee points at the target instead of turning away
- Flee transitions to Blast after a three-second delay
* Increased radar object count to 512
* Prevent satellite cursor command when pointing off-map
* Reverted path system to always use terrain boundaries
* Experimental: Person sends ammo and health over the network

2010-11-29:
* Experimental: disable normal bullet hit when sniper shell hits eyepoint
- This should prevent double-kills when sniping units with low health
* Application window now has a real icon :)
* Experimental: Constructor no longer halts after selecting an item to build
* Brightened the dark interface colors from 40% to 60%
- This should make health and ammo gauges in the command panel easier to see
* Experimental: treat zero health as dead instead of barely alive
- Units now die if they take exactly as much damage as they have health
- Game logic was somewhat inconsistent about this...
- In practice, it won't make all that much difference (less than a hull point)
* Removed unnecessary code from Bullet::Init that rebuilt the transform matrix
* More attack task refinements
- Adjusted fire cone values to reduce shooting into the ground
- Fixed frame-rate dependency when computing pitch value
* Improved PathDisplay task edit mode
- Removed "CMD_" prefix from command text
- Fixed SEND, GET_IN, and LAY_MINES command text
- Hide task display if no subject is selected
- Cleaned up subject information text
- Command list wraps to the next line if necessary
- Hide object line if no object is selected
* Added "/startedit" option to start in edit mode
* Fixed crash when using "/nobodyhome" option
* Updated PathDisplay menus
- Added "[Tab] cancel" to menus that lacked it
- Fixed the tenth item of the build menu
* CarRecurse pre-test uses bounding sphere center
- This fixes collision with producer units
* Craft::DoCollision treats deployed craft as immovable
* Increased movement force in ScavGotoScrap::DoNear
- This reduces Scavengers overshooting scrap and having to back up
* Minelayers no longer attempt to lay mines on blocked terrain cells
* Experimental: added "sloped" terrain type to pathing
- Cliff terrain (impassable) at 100% grade instead of 70%
- Sloped terrain (double cost) at 50% grade
- This should allow units to navigate rough terrain better
* Unit repair and reload commands will use the "who" parameter if set
- This doesn't do much on its own, but allows a new usage pattern in the future:)
* Person::DamageAlloc doesn't apply damage to remote people
- This should fix the health "snap back" in multiplayer
- This also makes it consistent with Craft and Building :)

2010-12-27:
* ConstructionRig doesn't change state on CMD_BUILD
- This allows the Rig to keep doing whatever it was doing
* Gun Towers now block terrain like other buildings
* Set health ratio to 1 for objects with zero max health
- This should prevent indestructible objects from dying
* Split steering logic out into separate functions
- LookAtPos: steer towards a point in world space
- LookAtLocalPos: steer towards a point in local space
- LookInDir: steer towards a direction in world space
- LookInLocalDir: steer towards a direction in local space
- TO DO: include pitch control?
* Steering PD controller incorporates desired turn rate
- This should help when tracking fast-moving or circle-strafing targets
* Updated shift-F9 editor view
- Updated "New Object" menu builder list
. Use human-friendly names from builder ODF files
. Color-code names based on default team
- Added "Build Team" menu to override default teams
. NOTE: override doesn't affect first-person edit view (yet!)
- Shortened some overly-verbose text strings
* /version prints build date and CRC of check.odf files only locally
- This eliminates a source of chat spam and network flooding
* Updated unit GetCommand for objects:
- Return "Get Repair" for a friendly Hangar if the unit needs health
. Exception: Armory does not do this since it handles "Get Repair" differently
- Return "Get Ammo" for a friendly Supply if the unit needs ammo
. Exception: Armory does not do this since it handles "Get Ammo" differently
- Return "Go To" for a friendly building
. Exception: Scavenger returns "Follow" to keep it from wandering off
* Experimental: flag objects to prevent multiple death messages
* Experimental: attempt to repair bad Craft transform matrix
* Prevent divide-by-zero in DoCollision when applying force at the object's origin
* Experimental: reduce maximum simulation step time to 0.1s
* Cleaned up simulation step time accumulator logic

2010-12-31:
* Added GetAmmoGauge method, separate from GetAmmo
- Default version returns ammo (as expected)
- Scavenger version returns scrap
- APC version returns soldiers
* Control panel and status display use GetAmmoGauge
* Fixed broken "0" item in first-person build menu
* Strategy help counts as "inspect" for missions that care
* APCs only return to friendly (not neutral) Barracks
* Disable "isShot" target indicator when the target is dead
* Fixed some minor compile warnings

2011-01-08:
* Invalidate D3D texture cache on changing brightness setting
- This ensures that textures use the newly-updated palette
* ArtilleryProcess improvements
- Can tell if it's out of range before firing
- First shot is as accurate as subsequent shots
- TO DO: figure out how to handle moving targets
* Adjusted Mission 11 script to make it more reliable:
- Trigger last attack wave 15 seconds after escape begins
- No longer relies on transport reaching the launch pad nav beacon
* Scavenger looking for scrap checks one path per update
- This spreads out the cost over time, preventing "hiccups"
* Greatly improved pathing performance
- Much more efficient method for finding strip neighbors
- Pathing aborts when it detects that there is no connected path
- Set compiler to optimize for speed

2011-01-16:
* InitRepair uses the current command "who" parameter (like it was supposed to)
- This should make units go to the right place when sent to a Hangar or Supply
* Send score reliably
* Restored original "on-demand" linking of path strips
- This saves a lot of unnecessary work and memory usage
* Reverted special handling in GetCommand for Hangar and Armory
- State-dependent commands break some assumptions in the command menu
* Reverted to original implementation of IsStuck
- Higher slope threshold means "cliff" tiles are rarely passable, so it's not worth being clever
* Allow combined vehicle kill and snipe kill
- It's equivalent to destroying the vehicle and killing the ejected pilot, minus the ejection part :)
* Restored "isShot" target indicator when the target is dead
* AssignColor uses pre-defined colors from DisplayInterface
- This fixes target markers turning white on dead objects  (of all things)
- TO DO: make CockpitSelection sprite index mapping more robust
* Reverted Scavenger looking for scrap to original behavior
* Terrain uses ZFS file operations instead of memory mapped files
- HGT and MAT files can now be included in ZFS files
- Editing terrain no longer modifies files behind your back
* Save terrain data as part of the mission file save (ctrl-S)
- Modifying terrain in the editor marks it as changed
- If saving to an existing BZN, write HGT and MAT only if changed
- If saving to a new BZN, copy the original TRN and write HGT and MAT with the new name
* Experimental: don't mark scrap as destroyed when deleting NetPlayer
* Walker UpdateWeaponAim compensates for hardpoint orientation
- This fixes the CCA Golem firing ~4 degrees to the right.
* Fixed texture preload crash when not using mipmaps
* Pathing supports team-specific "hazard" cells
- Path cost is greater than sloped but less than lava
- "Hazard 1" is costly to team 1
- "Hazard 2" is costly to team 2
* Streamlined rendering of pathing cells and strips
* Added Gun Tower, Proximity Mine, and Weapon Mine as pathing hazards
- This makes units navigate around those hazards when possible
- TO DO: make Scavengers aware of hazard when selecting scrap?

2011-01-17:
* Fixed Gun Towers not blocking terrain cells
* Show scores in MP by default
- Now that the minimum resolution is 640x480...
* Hide engine flames, dust kick-up, and shadow while invisible
* UnitTask FireAt knows how to trigger Launcher and ChargeGun
- For Launcher, hold until locked on
- For ChargeGun, hold until minimum charge, full charge, or a random charge level
* RocketTankAttack uses normal FireAt instead of of custom logic
* Fixed CalcRange range result for ChargeGun
- This fixes units equipped with only MAG (versus MAG and some other cannon)
* Launcher resets itself when it runs out of ammo
- This fixes units accidentally firing after getting ammo

2011-01-20:
* Allow player to change difficulty during a mission
* RemoteDetonator updates
- Detonate automatically clears the "armed" flag
- Moved declaration into a header so other files can use it
* Mortar weapons firing on a low arc attempt to lead moving targets
* Fixed major bugs in world-space LookAtPos and LookInDir
* Folded pitch control into LookAtPos and LookInDir
* Units can use Remote Detonator (MDM) effectively
- Fire normally, and detonate the shell near the target if it misses
* Howitzers can use all mortar-hardpoint weapons
- Pop Gun: wait until the target is within scan range
- MDM: fire normally, and detonate the shell near the target if it misses
- Mortar/Howitzer: fire in a low arc against moving targets
* Fixed Comet missile not locking on
- (It was using the wrong ammo cost value)
* Two new difficulty options: Very Easy and Very Hard
* Replaced damage/health adjustment in single player with a new mechanism
- Very Easy: no damage to or from friends, 50% less damage from enemies, 50% more damage to enemies
- Easy: 50% damage to or from friends, 25% less damage from enemies, 25% more damage to enemies
- Medium or higher: normal damage
* Difficulty setting affects enemy AI skill level in single-player
- Very Easy: highest aim scatter, strong aim lag, no attempt at evasion
- Easy: high aim scatter, weak aim lag, no attempt at evasion
- Normal: normal aim scatter, no attempt at evasion
- Hard: low aim scatter, improved tracking, evade only when fleeing
- Hardest: no aim scatter, best tracking, evade at any time

2011-01-27:
* Disable blocked terrain for the Spawnbuoy (NONCOLLIDABLE) (submitted by Dx)
* Use terrain extents for pathing area in single-player
- Single-player missions often place units outside the edge path
- (I thought I had done this already, so I must have lost it)
* Removed ArtilleryProcess pitch limit
- This got added accidentally in a prior update
* Reverted RemoteDetonator clearing armed flag in Detonate
- This fixes the weapon unexpectedly firing another shot
* UnBuild increases near distance threshold on deploying
- This fixes the Construction Rig sometimes getting stuck when recycling an object
* HoverCraft, Person, and TurretCraft compensate for hardpoint orientation like Walker
- This should fix Pilot and Minelayer aim
* CalcRange handles weapons whose ordnance is actually a GameObject
- This fixes mine dispensers in particular
* GetClosestEnemy includes player-controlled pilots
- Player pilots are often more dangerous than AI vehicles :)
* BuildObject automatically calls SetLocal on the host
- This simplifies a bunch of MP script code managing powerups
- This might help catch some cases where SetLogic isn't called
* UnitTask performs steering before movement
- Movement sets limits based on steering, so that needs to be done first
- This should help units track fast-moving targets
- (Units typically have much higher omegaSpin than omegaTurn)
* Tweaked UnitTask throttle/strafe limit
- Allow units to maneuver more when not using 100% steering

2011-01-29:
* AdjustedMaxHealth always returns normal health
- Health adjustment didn't get adjusted properly last time
* ArtilleryProcess low-arc fire checks terrain intersection and friendly fire
* Experimental: Scavengers skip scrap on lava or in hazard zones
* Fixed a crash in FireAt when checking splash damage radius
* Experimental: AddCliffForce applies (smaller) force for hazard and lava too
- This should help units avoid dangerous terrain cells better
* Experimental: mark cells adjacent to lava as hazard
- This better matches the damage-causing area of lava

2011-01-29 update:
* UnitTask FireAt can use lock-on cone angle for Launchers
- This makes units much more likely to lock on and fire
* Improved UnitTask aim controller
- Uses relative velocity for more accurate tracking
- Adjusted controller tuning parameters for better response
- This fixes eternally-circling behavior for heavier vehicles
* Updated unit debug info text in schematic (shift-F9) view
- Moved it over so it doesn't overlap the "Build Team" menu
- Rearranged entries and made them more consistent between units
* Fixed a path node counting bug that would make pathing abort unexpectedly
- This should fix units not finding paths to places they should

2011-02-05:
* ArtilleryProcess will use high arc if the low arc is blocked by terrain
* Initialize pathing system immediately after loading terrain
- This allows game object initialization to access pathing cells
- This fixes a crash on load in misn15.bzn when objects add hazard cells
* Yet another revision of LookAtPos aim controller
- Added a new term proportional to desired turn rate
- This fixes circling/dancing without large tuning values
- Restored original tuning parameters
- Fixed turreted units overcompensating for target movement
* Experimental: AI avoids shooting at Artifacts regardless of team
- This fixes units firing on and destroying artifacts by accident
* Experimental: fixed AI scheduler sending units to invalid locations
- This should reduce the number of units getting stuck against cliffs
* Fixed Soldiers not entering Barracks
* Can now reload APC at a Barracks
- reloadRange (50m): how close the APC needs to be to reload
- reloadDelay (2s): delay time between soldiers
- reloadReset (10s): cooldown time after deploy to begin reloading
* Allow APC to reload at the Recycler too
* APCProcess uses the new APC reload instead of "cheating"
* Handle automatic leveling for remote players
- This makes physics and weapon aim more consistent
* Always generate pathing for the entire terrain area
- Initializing pathing just after terrain crashed in MP :P
- Clipping reticle/cursor commands should be enough
* Gave Bolt ordnance an effect duration
- This makes it more visible at high frame rates
* Missile Pack/Unpack inherits from Ordnance version
- This should makes it easier to maintain
* Gave WeaponMine a Carrier for its weapon
- This allows proper tethering for BeamGun
* Experimental: reimplemented Beam and BeamGun
- BeamGun creates a tethered Beam when it fires
- BeamGun expires the Beam when it stops firing
- Beam tracks the weapon direction while it's alive
- This allows the Flash Cannon to work properly in MP
* Reimplemented GameObject curPilot
- Now stored as a GameObjectClass pointer
. This ensures all pilot classes are loaded before runtime
. (Incidentally, BZ2 works this way internally...)
- GameObjectClass assigns pilot class based on nation and user/non-user
. This consolidates half a dozen instances of the same code
. TO DO: allow ODF to override the default assignment
* ScrapField pre-loads GameObjectClass for scrap pieces
* Simplified the Ordnance Pack/UnPack methods
- Ordnance_SendNew and Ordnance_Receive do most of the heavy lifting
- Pack and UnPack now just handle Ordnance-specific data
* Improved CockpitRadar and ControlPanel object coloration
- Attacked friendlies flash red instead of turning solid red
- Menu modes show non-commandable (or dead) state properly
* Added lead position for TAG Cannon
* Improved APC reloading
- Split reload out into its own state
- Soldier reload replaces normal ammo-based reload
- Automatically issue a reload command when empty
- Do the range check every 0.2s instead of every frame
- Fixed a bug with the reload delay timer
* Added a variant of FindPlan to find a path to an object
* Added a method to AiPath that returns its total length
* Added a variant of GoNear that also takes a path
* New APC reload logic
- Picks its destination based on shortest path length
- Uses the new path-based version of GoNear
- Switches to SitSpinTask once it arrives
* GotoTask can use a path as a plan if:
- 1. it has no label, indicating it was generated by FindPlan
- 2. it starts near the unit's current position
- TO DO: find a better way to distinguish plans from loaded paths
* ScavengerProcess update:
- Removed RELOAD state since it's not relevant
- Fixed code in Verify_Or_Request_Escorts
* New Unit/Tug/Scavenger repair/reload logic
- Picks its destination based on shortest path length
- Uses the new path-based version of GoNear
- Switches to SitSpinTask once it arrives
* Thin down the Bolt effect over the effect duration
* Switched Scavenger escort back to CMD_FOLLOW
- CMD_DEFEND is for stationary objects like buildings :)

2011-02-06:
* Fixed a case where ChargeGun wouldn't get selected as the active weapon
- This fixes a crash when a NSDF Gun Tower is equipped with a MAG Cannon
* Fixed ArtilleryProcess aiming
- I accidentally removed the Normalize_Vector :)
* Reduced APC reloadDelay from 2s to 1s
* Producer uses ammo gauge as build progress bar
* MultDMMission sets generated objects as local
- This fixes powerups only appearing for the host
* Experimental: show health and ammo gauges for base units

2011-02-06 update:
* Fixed APCProcess when attached to a non-APC unit
- The transports in misns2.bzn and misns7.bzn are Tugs
- How did this ever work?  :)

2011-02-10:
* Actually fixed ArtilleryProcess this time
- I thought my fix looked a bit off...
* CommandPanel no longer draws black rectangles for missing names
* Fixed Soviet units using American player ODF
- Stupid copy/paste error... :P
* Increased packing of reduced no-roll matrix
- The compiler introduced padding between bitfield elements
- Doing it manually shrunk it from 16 bytes to 10 (!)
- This should allow more ordnance to be sent at a time :)
- TO DO: expose bitfield utility functions for use by other code
* Simplified some overly-complex reduce/expand functions in NetUtil
* TargetCam Init clears its target and eyepoint pointers
- This fixes a restart crash on misn15b.bzn
* Added more ordnance types to the compact cfg list
* Fixed bolts not appearing in MP (I think...)
- Submit now updates the effect timer instead of Simulate
- TO DO: split effect out into a separate object?
* Experimental: play credits after finishing Soviet campaign
* New format for reduced matrix with roll
- Replaced floating-point positions with fixed-point (accurate to <1cm)
- Simplified rotation encoding and made it more uniform
- Doing this shrunk it from 20 bytes to 14
* BeamGun removes any tethered Beam on deletion
* Fixed WeaponMine crashing when it explodes
* Split Torpedo and TorpedoClass out into separate files
* Fixed FireAt crashing when using RadarLauncher
* FireAt now knows how to check TorpedoClass xplBlast
- This should reduce units blowing themselves up by accident
- TO DO: make units stay away from Torpedoes
* Fixed APC constantly restarting its reload state
- I hadn't set the AI process target object handle, so reload kept quitting
* Fixed AvoidObject test for moving non-player objects with higher sequence number
- I had the player test backwards :)
- This ought to reduce units plowing straight into the player
* SoldierProcess allows soldiers to strafe in combat
- This helps them spread out and avoid obstacles
* Improved compatibility with older hardware
- Check a wider variety of pixel formats
- Check depth buffer formats instead of assuming 24-bit

2011-02-12:
* Fixed Bolt effect turning "inside out" while in edit-pause
* NearestVehicle (used by avoidance) includes Torpedo
- This makes units sort-of-try to avoid Comet/WASP
* Joystick supports discrete versions of analog controls
- X: HorizNeg, HorizPos
- Y: VertNeg, VertPos
- Z: ThrottleNeg, ThrottlePos
- R: RudderNeg, RudderPos
- U: USliderNeg, USliderPos
- V: VSliderNeg, VSliderPos
* Replaced Space Orb with Xbox 360 controller
- NOTE: requires new giddi/xbox.std
- Left Stick: strafe/throttle
- Left Thumb: jump
- Left Trigger: command
- Left Bumper: alt-command
- Direction Pad U/D: navigate menu
- Direction Pad Right: menu select
- Direction Pad Left: menu back
- Right Stick: steer/pitch
- Right Thumb: toggle target
- Right Trigger: fire weapon
- Right Bumper: cycle weapon
- B Button: deploy/crouch
- Y Button: hop out
- B+Y Button: eject
* AttackTask adds instead of replacing strafe it may hit friends
* FollowTask can aim and fire at enemies without breaking formation
* "Follow Close" keeps units in follow mode all the time
- This prevents them from taking off after enemies
- TO DO: allow units to evade while following
* Fixed missing APC deploy message
* Added GoNearAndSit task
- Combines functionality of GoNear and SitSpinTask
- Handles case where a unit gets pushed out of range
* Converted units from GoNear/SitSpinTask to GoNearAndSit
- Units should now move into range again if pushed out of range
* Craft clears controls on snipe/abandon/eject
* BeamGun detaches Beam instead of directly expiring it
* Beam broadcasts reliable notification when it expires
- Maybe these will help with the stuck Beam?
* Person auto-levels while ascending during a jump or ejection
- This fixes pilot orientation after ejecting from a large explosion

2011-02-15:
* CockpitRadar draws height indicators only if they're more than 2 pixels
- This reduces render state changes, improving performance
- The start of play01.bzn went from 180 render batches to 110
* Fixed text buffer overflow in Alt-F framerate display
- Triangle count and batch count now print properly
* Replaced half-texel shift with half-pixel shift
- This fixes text when forcing MSAA in the graphics driver
- This also fixes blurry edges on HUD elements
* Fixed a restart crash in BeamGun
* LoadDefaultGame now works properly
- This fixes a crash when loading from MakeTRN-generated data
* TurretCraft sets itself to DEPLOYED state
- This makes Howitzer use high-arc against it
* Improved APC behavior when it has no reload site
- Enters WAIT state for a second instead of pilot hopping out
- Most importantly, it doesn't crash any more :)
* Added a quick fix for the Soviet turrets in misn03.bzn
- They were saved with a Reload command set to themselves
- This most likely used to be a different command...

2011-02-28:
* Updated crc32game asset check
- Checks some additional files based on the ODF
* /version command now generates the check CRC with crc32game
* Host auto-kicks any player launching with an invalid vehicle
* Divide rotational kick from ordnance by moment of inertia
- This should prevent extreme spin and high bounces
* Explosions inherit team flags like Ordnance
* Fixed a crash when the damage owner dies before the damage source hits the player
- TO DO: find a better way of marking damage as player or player-friend
* Tweaked ordnance rotation kick
- Now uses bounding sphere radius instead of collision radius
* Added support for new mouse controls
- X1 and X2 buttons (Windows XP): X1Btn, X2Btn (
- Vertical wheel (Windows 2000): WheelDown, WheelUp
- Horizontal wheel (Windows Vista): WheelLeft, WheelRight
* Added direct access to Special hardpoint
- Input: added weapon_special control
- Carrier: added TriggerSpecial method
- UserProcess: connected the two :)
- TO DO: update input.map
* Renamed Carrier UnTriggerSelected to UnTriggerAll
* Show join-game error messages before hiding all the dialog controls
- This should fix the blank black screen behind the pop-up
* D3D initialization calls set LastError
- This should make the D3D error dialog show meaningful information
* Slightly tweaked palette lookup of scroll-text colors
- If anyone cares, it divided by 256 instead of 255 like it should have
* Added support for switching between windowed and full-screen
- This only works in-game; I couldn't get the shell to behave
* Carrier stores the special hardpoint index
- This greatly simplifies TriggerSpecial
* Reduced damping and tracking for ascending airborne Person
- Pilots flying upwards after ejecting gradually level out
- Pilots jumping or hopping out of a vehicle don't level enough to notice
* SetDamageFlags sets playerCollide and playerShot for remote players too
* Experimental: toggle SpecialItem with the trigger
* Craft death deletes carrier after ejecting pilot
- This allows AI to reference weapons during cleanup
* AI uses RED Field and Phantom VIR semi-intelligently
- when attacking or attacked by a player
- when attacking or attacked by someone with an affected weapon
- when attacking or avoiding a torpedo (RED)
- TO DO: make RED and VIR affect AI unit aim?
* Experimental: compute chat color like score color
- This may fix cases where the chat colors are wrong

2011-03-09:
* Fixed D3D device creation for systems without HW vertex processing
- The previous capabilities check didn't work as expected
* FollowTask only checks for targets when weapons are enabled
- This fixes Howitzers (and presumably Turrets) flailing around
* Tug shows cargo in its ammo gauge
* Adjusted the ordnance network-reduced matrix
- XZ: 14 bit range, 6 bit fraction (was 7)
- Y:  9 bit range (was 8), 6 bit fraction (was 7)
- V:  12 bit angle (was 11)
- This should fix ordnance disappearing on some maps
* WeaponMine checks for terrain and friendlies in the way
* Moved edge-path boundary check to AiMission
- SP: apply only to the player
- MP: apply to all craft and pilots
* Alt-Enter full screen switch works in the shell now
* Position window in the top left corner in full-screen mode
- This fixes some rendering problems with the shell

2011-03-19:
* WeaponMine skips line-of-sight for dispenser and radar launcher
* Removed unused GameObject first/last/next/previous pointers
* Added EnoughAmmo method to Weapon and derived classes
* WeaponMine skips line-of-sight test for dispenser weapons
* WeaponMine now uses Weapon EnoughAmmo method
* Experimental: added some player info to the damage structure
- dmg_player: did the damage come from a player?
- dmg_player_id: network id of the player (or dp_ID_NONE)
* RecordDeath and KillMessage now use network id from damage
- This makes damage credit work even when the damage owner goes away
* Experimental: disabled damage scale compensating for packet loss
* Fixed window being stuck in topmost mode after switching from fullscreen
* AiMission::Update skips player boundary check when there is no player object
- This should fix the single-player crash when the player dies
* Preliminary implementation of a new MakeZFS utility
- Treats zfs files like an archive format
- a: add files to zfs (applies LZO compression)
- d: delete files from zfs (does not remove the original data)
- x: extract files from zfs (to current working directory)
- l: list files in the zfs
- u: update files in zfs (does not replace the original data)
- NOTE: writes can't modify existing data, only add to the end
- TO DO: add a "rebuild" option to clean/compact a zfs?
* Preliminary implementation of a new MakeZIX utility
- Takes a descriptor file as input and generates the ZIX file
- Descriptor files look like this:
0 D:\bzone BZONE 'Battlezone CD
---
DIR: bzhw16l.zfs
DIR: bzhw16.zfs
DIR: bzhw.zfs
DIR: bzsw.zfs
DIR: bzone.zfs
---
* Added support for mouse sensitivity setting
- Minimum setting is 50% of normal
- Maximum setting is 200% of normal
* Producer enemy kick now hurls objects away from the center
- This works much better for the Soviet units :)
* Reduced APC cooldown delay to 5 seconds and reload delay to 0 seconds
* Don't let a sniped pilot enter a vehicle
- This fixes a rare but annoying vehicle "lockout" bug
* Limit scrap value in multiplayer to half the scrap cost
- This eliminates "scrapmaking" without requiring new assets
* Tweaked Craft collision to avoid reading from the collided object
- This should avoid some crashes where the object got deleted
* Changed how the Craft explosion timer works
- Set to a constant 5 seconds
- Ignore health status
- Ignore additional damage
- Explode immediately on collision
* Increased vertical "kick" on death
* Dead HoverCraft uses "chunk" physics
* Experimental: Tweaked AI avoidance
- Don't skip moving non-player units with higher sequence numbers
* Adjusted end condition in GotoTask
- This might help fix an occasional crash
* Doubled rotational kick for ordnance impact
* Adjusted Craft terrain collision to work more like the original
- This greatly reduces vertical bounce (by as much as 90%)
* Restored some of the original mouse input code
- Read the cursor position right before using it
- Use client area instead of viewport
- This shouldn't make much difference in practice...
* Scavengers drop their cargo when they explode
- It's only fair, and I've wanted them to do that for years :)
* Moved unbuild logic from ConstructionRigProcess to ConstructionRig
- ConstructionRig shows unbuild progress in its ammo gauge
* Experimental: SpawnPoint GetClosestEnemy takes teams into account
* Experimental: Only show base gauges when they are "interesting"
- Health: when less than full
- Ammo: when more than empty (e.g. showing a progress bar)
* Made ZIX file name indexing more reliable
- It expected names to be padded out to 16 characters with null bytes
- Searching for a name not matching that requirement would fail
- It now does that internally and places no restriction on the caller
- This fixes some CRC checks that weren't being done
* Simplified shell vehicle list loading a bit
- This system is a terrible mess... :D

2011-03-28:
* Properly set damage dmg_player flag
- This should fix the target hit indicator
* Updated Craft rotation caused by ordnance impact
- Original way: no scaling
- Previous way: scale by (5 * 5) / (radius * radius)
- Current way: scale by 5 / radius
- This reduces spin on large units, but by less than before
* Silo and Producer drop excess scrap when they explode
- This keeps scrap in the world instead of letting it evaporate
* Fixed some effect list overflows when in the MP escape screen
- This was mostly harmless but spammed trace messages in debug
* Destroying a team-affiliated building counts as a kill
* Restored original death threshold behavior
- Objects die when their health is negative (not zero)
* Added a "remote" flag to the damage structure
* Restored the 7/6 damage scale for remote damage
* Fixed collision damage setting perceived team
- This fixes the player blowing their cover when bumping into things
- This got changed by accident as part of another change :)
* Fixed some Ordnance collision problems
- Bullet collision handles some edge cases better
- Bullet collision gets the surface normal from what it hits
- Ornance hit takes that surface normal as a parameter
- BounceBomb uses that surface normal to bounce
- This fixes MDM and Splinter (not) bouncing
* Fixed a crash in InitSpecial if UnitTask had no valid target
* Checked in some changes that were in the previously-released build
- Added a safety check when reading vehicle list data
- Added support for wildcards in MakeZFS
- /startedit implies /edit
* Experimental: fixed switching to windowed mode when starting in full-screen

2011-03-30:
* Fixed beams and bolts passing through targets
* Revised fix for UnitTask InitSpecial crash
- Again?  But that trick never works...
- This time for sure!  :D
* Not accepting level editor agreement cancels /startedit too
* Disable /startedit in a net game
* Fixed missing window border when switching from full-screen mode
* Only give kill credit for CLASS_ID_STRUCTURE1 buildings
- This fixes mines and other minor objects counting as kills
* Allow Launcher target lock even without enough ammo to fire (like 1.4)
* MapList Add loads the map description text instead of Load
- This simplifies things a bit...
* Fixed GotoTask trying to use the goto command "where" as a full path
- This should make units navigate properly instead of getting stuck

2011-04-21:
* Deployed craft (including Gun Towers) explode immediately
* Use original building and perimeter area when unblocking
- This fixes blocked cells getting left behind
* GameObject sets up OBJ76 game object pointer
- The constructor sets the value
- The destructor clears the value
- This makes GameObject_GetFromObj work much sooner
* Fixed a crash in Dispenser::EnoughAmmo
* AI keeps RadarDamper and ImageRefract enabled if they don't cost ammo
- AI is still conservative about using them if they do cost ammo
- This is mostly useful for mods
* Fixed MakeZIX crash when not given an output filename
- It now generates an output filename from the input filename
* MakeZFS and MakeZIX projects deploy to a shared folder
- They use the same destination as the game executable
* Major revision to ParameterDB
- Stores values in a hash table
- Looks up values with label hashes
- This is faster and eliminates a bunch of strings
* Reverted pilot auto-leveling to 1.4-style behavior
* Possible fix for crash in pathing FindStrip
- Returns no strip instead of accessing invalid memory
- Also removed unused useTunnel parameter
* Added command-line options for saving BZN and SAV files
- /asciisave saves in ascii format (default for debug)
- /binarysave saves in binary format (default for non-debug)
* Fixed a potential buffer overrun in to_zfsname
* Increased Craft and Building scrap drop limit a bit
- Odd scrapCost: allow up to scrapCost+1 (versus scrapCost-1)
- Even scrapCost: allow up to scrapCost (same as before)
* Adjusted avoidance "blocking" behavior
- Set blocking if unable to proceed for 10 seconds (versus 5)
- Reset blocking after not blocking for 1 second (versus 30)
- This should reduce units plowing into obstacles
* Update to TransportMode TCP (submitted by Dx)
* zixBuildIndex includes files in subdirectories of addon
- It has a limit of 256 paths so don't go too crazy...
* Experimental: load AIP using ZIX functionality
- AIPs can now be in ZFS files or addon subdirectories
* Fixed Person using invalid sound names
- Damage could read past the end of the painSound array
- Dumb typos in PersonClass screwed up burnSound and dieSound
* Fixed incorrect searchTimer save for ProximityMine

2011-05-05:
* Fixed missing damage smoke on vehicles loaded from a save game
* When tracking who shot it, GameObject ignores self-inflicted damage
- This fixes units attempting to flee from themselves :)
* UnitTask uses charge weapons a lot better
- Start charging on entering combat
- Continue charging if not able to hit
- Choose charge level based on damage rate and ammo efficiency
* TurretBlastAttack can use special weapons
* FollowTask fires on enemies only while following normally
- It breaks off when it needs to catch up with its follow target
- This restores 1.4 behavior when it get too far away
* Restored player spawn while in net escape screen...
- ...but only in strategy games, where it's an exploit
- Letting players take a break in DM games should be fine
* Increased Craft and Building scrap drop limit to +2 total
- Odd scrapCost: allow up to scrapCost+1 (1->2, 3->4, etc.)
- Even scrapCost: allow up to scrapCost+2 (2->4, 4->6, etc.)
* Fixed a crash in multiplayer with sniper off when a weapon was missing
* Asset check in release build includes the game executable
* Replaced game input key codes with virtual keys
- This streamlines keyboard input quite a bit
* Revised in-game text input
- Gets keyboard messages from the main message handler
- Handles multiple events per frame for better response
- Allows key repeat like a Windows edit control
- Gets fully-processed character values from Windows
- Should fix input problems on non-US keyboards
* Restored UnitProcess "defend" behavior during repair/reload

2011-05-06:
* Fixed crash in read_gamekey_table for non-US input mappings
* Fixed uninitialized key value when keyboard input is disabled

2011-05-09:
* BlockCells uses an oriented bounding box for buildings like 1.4
- This fixes problems with buildings that have small collisionRadius
* Fixed a potential invalid operation in NetUtil_ExpandMatrix
- This would result in a completely-b0rked matrix and hilarity
* Fixed uninitialized member values in Mapgrid_Goal
- This was occasionally tripping a floating-point exception
* Restored the original key mapping for game keys
- This ought to fix problems with non-US keyboard layouts
- Everything else still uses virtual keys
* Restored original gamekey processing with only minor changes
- The MapVirtualKey case is still baked into the VK-to-GI table
* Fixed collision damage not giving credit for kills
- GameObject fills in the damage structure and includes player id
* Fixed incorrect usage of UnlockItem in several places
- They were using the item data instead of the asset name (!)
- This should fix occasional crashes in the shell lobby
* Preload shadow texture instead of looking it up each time
- This eliminates a bunch of UseItem calls at runtime
* Switched compute_hash to a more modern hash function
- Specifically: FNV-1a with XOR-folding
- Also made handle a NULL pointer instead of crashing
* Fixed lava and terrain-impact deaths awarding kills to all players
- Damage now initializes dmg_player_id to dp_ID_NONE instead of zero

2011-05-14:
* Mission cleanup now clears out the terrain editor state
- This fixes stuck controls in MP after leaving SP with the editor on
* Fixed a crash on starting a SP map after playing MP
- Network system clears hosting and networking flags on leaving
* In-game chat /kick uses the same functionality as the shell
- The kicked player gets a notification and returns to the lobby
* Added shell /lock and /unlock commands to control player joins
* Allow shift-F9 view to zoom in further
* Units treat (blocked) building cells like cliffs
- This makes pathing more consistent with 1.4
* Rewrote DoStuck to handle obstacles better
- Searches in 8 directions instead of 4
- Checks for collisions in those directions
- This helps units escape semi-enclosed areas
* Cleaned up all compiler warnings in UnitTask
* Show kill message for destroying a building
* Updated spawn point selection
- Host player starts at a completely random spawn point
- Non-DM maps spawn players at the safest location
- DM maps spawn players at a weighted random location
* Enabling text input clears pending key-down and character messages
- This stops the game key activating the input from affecting input
* Walker converges shots at the distance to its target
- This makes the NSDF Sasquatch much more effective in combat
* Prevent players from launching into an ended game and crashing
- Host auto-locks the session when the game ends 
- Client in the pre-game shell disconnects when the game ends
- Shell lobby game list hides locked sessions

2011-05-19:
* Grey out locked sessions instead of hiding them entirely
* Check for a locked or full game before attempting to join
* Show a "Game Locked" message if the session is locked
* Un-launched client gets a clear notification when the game ends
* Fixed an exception in the shell when a map had no description
- Shell uses the description file name if that file is missing
- This makes it more obvious what needs fixing
- TO DO: reimplement all this :)
* Don't apply bullet impact scaling for objects smaller than 5m radius
- This should restore "classic" strength for most user-pilotable units
- As an added bonus, it solves that divide-by-zero error
* More changes to DoStuck
- Increased maximum search range to 50m
- Checks for terrain collision in addition to geometry
- Reduced false-positives in the collision check
* In the 4th NSDF mission, mark the Lemnos factory as an objective
* GetCommand treats objective-marked neutral objects like friends
- This restores 1.4 behavior for those objects
* Rebuilt the lower-right shell button bitmap
- Fixed bad dithering
- Fixed missing transparency
* Added more color coding for game sessions
- Red: unavailable map
- Dim Green: full
* Added an error message for unavailable map
* Misn14Mission switches the team of the CCA power plants too
- This fixes CCA Gun Towers not firing on the Furies
* GunTowerProcess updates hazard region after switching teams
* Fixed "Camera Stack Overflow" assert in Misn17Mission
* Fixed crash on losing last life in strategy MP with sync off
- This was a stack overflow caused by a recursive respawn loop (!)
* Exit the simulation more cleanly after leaving a game
- This prevents view update asserts in non-release builds
- This also prevent an unnecessary resolution change :)
* Shell commands support referencing players by id number
- Added /players command listing players by id and name
- Other commands can take an id in place of a name

2011-05-25:
* Fixed a problem with SP campaign screen once the campaign is done
- It was setting up mission info screen with bad data before jumping to the mission archive
* Restored "/system on" and "/system off" commands
* Adjusted the message displayed for a missing map
- "Mission <filename> not found" (multi_error/missing_map)
* NetPlayer iterator returns a dpid instead of a name pointer
- This fixes chat not handling players with the same name
* In-game whisper prompt shows numeric id in addition to name
- This disambiguates players when they have the same name
- For example, "To Ultraken (#1):" and "To Ultraken (#4):"
* Added checks to the mission archive to prevent scrolling past the end
* Allow pilots to strafe like soldiers
- Now they can sidestep the player's line of fire too :)
* Improved AI support for minimum safe range
- CalcRange calculates minimum range based on blast radius
- DoBlast and DoStand try to stay outside that range
- UpdateWeapon won't fire while too close, but:
. Slowly reduces the distance threshold over time
. Quickly reduces that distance threshold when getting shot
. Resets the distance threshold once it fires
* In-game chat supports mute/unmute and system on/off
* In-game chat supports lock/unlock commands
* Added shared Net_KickPlayer, Net_LockGame, and Net_UnlockGame
* Added system messages for kick, lock, and unlock
* Fixed empty player list in the lobby after returning from a game
- The net shell dialog resets all its lists and rebuilds them
* Reorganized player info (I), email (E), and web page (P) code
- It now looks up localized text as needed
- Eliminated some temporary buffer allocations
- TO DO: revise the localized text in label.map?
* Howitzers will aim high to shoot over friendlies in the way
* MayHitFriends ignores signs, mines, and spray bombs
- This will make AI fire over or around these things
* Added more protection against some divide-by-zero errors
- Normalizing a zero-length vector was a common problem
- Explosions with frameCount or frameRate of zero was another
* Added /system and /nosystem as alternates to /system on and /system off
* Adjust desired range in DoBlast
- Add unit and target radius to the set value
- Clamp the value between the close range and weapon range
* UpdateWeapon now checks if the projectile will actually hit
- This fixes AI's first shot(s) at some buildings going wide
- This was most noticeable with tall, thin buildings
- This especially benefits slow-firing weapons like the Rocket Bomb
* CommandPanel shows gauges for producers only when health or ammo changes
* Fixed a crash in WeaponMine on first simulation
* Inst04Mission no longer asserts when startVoice is set to nothing
* Adjusted SpawnPoint selection
- Ignore teams in DM since everyone is an enemy
- GetWeighted ignores things further than 300m away

2011-05-26:
* Moved bullet collision test into a new IntersectGameObject function
- This function handles "simple" collision (e.g. sphere) properly
- This fixes AI units not shooting at deployed turrets

2011-06-06:
* Fixed shell problems after finishing the training and USSR campaigns
* SoldierProcess will use the target of CMD_GET_IN
- This fixes engineers not going to the APC in Soviet mission 7
* Audio system rounds volume to nearest instead of down
- This fixes the engine idle dropping out at effect volume 1
* Treat neutral collision or shot like friendly
- This should fix spurious attack warnings
* Weapon properly initializes its last fire time
- This fixes an occasional invalid operation on startup in MP
* Fixed missing player stats in net escape screen
* User vehicle with no pilot works without errors:
- BettyVoice can use vehicle nation as a fallback
- Disable eject control
- Enter "death cam" view and start respawn on death
* Moved common player death operations to Net_KillPlayer
- Deducts a life in strategy games
- Sets the respawn timer
* Moved common respawn operations to mission Respawn
- Restores camera to cockpit view
- Enables player input
- ST only does this when the player has a life left
* Net escape dialog monitors scores and win/lose conditions
- Refresh the score display when something changes
. TO DO: fix the visible redraw?
- Pop up the appropriate message on win or lose
. "You won" (multi_common/you_won)
. "You have been eliminated!" (multi_common/you_lose)
- Remove the back button when the game is over
* Player numeric ids increase by 1 instead of 4
* Fixed issues with /mute and /unmute commands
- In-game versions work :)
- Shell versions work when using numeric id
* Combined SyncGame (pre-game and in-game) and SyncPostGame (escape and post-game) player lists
- This makes player state consistent throughout the game session
- Mute works between pre-game, in-game, escape, and post-game
* Updated ConstructionRig power check
- Now includes ShieldTower (for custom IA maps)
- Uses the same distance check as powered buildings
* Remove AI process when a self-piloted Craft dies
- This fixes an assert
* Preliminary implementation of high-ping auto-kick
- Default threshold is 2000ms
- Override with AutoKickPing in net.ini
* Increased Entity limit to 768
* Reduced the size of the Entity structure by 80 bytes (!)
- Eliminated unneeded values (PosVel and half of shadowPoly[])
- Compacted some values (lodFlags and animFlags)
* Fixed object Y position "wrapping around" in MP
- This particularly affected launched powerups
* Improved synchronization of airborne powerups in MP
* Prevent DayWrecker from hitting the Armory on the way out
* Don't send "local hit" notification for deployed craft
* Reduced matrix sends height as offset from minimum terrain Y
- This eliminates height range wasted below the ground
* WIP: reformatted net logging output to pack.txt
* Host waits to send out spawn points until after it has picked one
- This fixes players ending up at the same spawn point
* Reduced the size of PowerUp net state
- It now uses the same compression as HoverCraft :)

2011-06-11:
* Fixed problems with per-polygon collision:
- Stack corruption and uninitialized values in BoxGeom
- OBJ_CLSN_STATIC_ALLPOLY case in SetObjCollision
- Broken inside_poly check in PointVelPoly
* Added support for CLASS_ID_STRUCTURE2 buildings
- classLabel = "i76building2"
- Defaults to static per-polygon collision
- Supports floor geometry (e.g. bridges)
* Bullets use shared PointEntityCheck for hierarchical collisions
- This allows per-polygon collision and eliminates some redundant code
* Adjusted the Seismic Wave
- Restored the vigorous shake effect for movable objects
- Damped and leveled Gun Towers and Walkers so they don't flip around wildly
- Replaced hard-wired constants with ODF parameters
. waveRadius: size of the wave in meters (default 50m)
. waveHeight: height of the wave in meters (default 6m)
. rampUpTime: time to ramp up to full strength (default 5s)
. rampDownTime: time to ramp down to zero strength (default 2s)
. sweepOmega: how hard to sweep object rotation (default 100)
. sweepVeloc: how hard to sweep object velocity (default 50)
. shakeOmega: how hard to shake object rotation  (default 1)
. shakeVeloc: how hard to shake object velocity (default 5)
. buildingScale: damage scale for buildings (default 1)
- Gave it a distinct "wave" profile with crest and trough
- Adjusted its falloff curve to have a wider, flatter peak and narrower fringe
* Rewrote Floor_GetFloor to treat terrain as the absolute minimum
- This prevents submarining/tunneling when the floor goes underground
* Treat floor collision like any other collision
* AdjustDamageValues uses dmg_player and dmg_source instead of damager
- This should fix damage not getting adjusted if the damager dies
* SprayBomb transfers player ownership to the created bullets
* Popper transfers player ownership to its launched projectile
* Initialize pathing in LoadDefaultGame
- This fixes an AI crash after loading terrain with no mission
* Clear collision range search pointer on cleanup
* Don't call DoNetEscapeFrame if there's no current AI mission
- This should help prevent an occasional crash
* DistributedObject clearly separate local IDs and player data keys
- Local IDs are 32-bit and based on owner player ID and sequence number
- Data keys are 16-bit and based on global/local and sequence number
- This fixes local IDs for later players wrapping around and conflicting
* Added a player data value for the local object count
- This fixes joiners not seeing some objects a long-running game
* Ordnance now sends its owner object as a data key
- This fixes ordnance ownership for the 8th player and beyond
* Fixed players being unable to join after a host migration
- Net::HandleSpawnPoint wasn't clearing the player wait for spawn
* Fixed unit voice messages not playing at volume level 1
* Tweaked SeismicWave some more
- Start half a wave radius ahead to avoid shaking launcher
- Don't move around floor-owning objects (e.g. bridges)
* Fixed AIP parser passing large string buffers by value
* AIP_load_AIP now stops scanning the AIP name at the beginning
- It previously kept going until it found a backslash somewhere in memory
- This fixes an occasional crash due to stack overflow
* Yet more SeismicWave tweaks
- Scale shake effect by the time step again...
- Added walkerScale and towerScale properties to the ODF
- Added dampOmega and levelOmega properties to the ODF
- Adjusted default tuning parameters

2011-06-14:
* Fixed mission names not appearing in the Mission Archives in full-screen
* Fixed up SAV attack
- Fixed attack timing out while descending
- Fixed weapon aiming too high
* AI considers Torpedoes important friends
- This fixes units accidentally shooting down WASP/Comet
* Fixed AI choosing a Dispenser as its primary weapon
- This fixes SAV/SAT not firing its lightning gun
* Yet another SeismicWave adjustment
- Reduced the overpowered shake effect
- Set effect falloff with distance closer to BZ 1.4
- Added shakeFrequency ODF parameter (default 3Hz)
* Fixed the "Mission Misson %s not found not found" dialog in the lobby
* Updated Ordnance_Receive
- Create and update use the same time adjustment code
- Streamlined handling of large time adjustments

2011-06-19:
* AI Scheduler prints error messages instead of exiting silently
* Set default SeismicWave parameters to emulate "classic" behavior
- This also means units get flipped underground again :(
* Experimental: invalidate the window rectangle on mode switch
- This might help with blank escape and post-mission screens on Vista 64
* Combined PlayerList DeletePlayers and Clear
- This may fix cases where players don't appear in the player list
* Updated high-ping auto-kick
- autoKickStart: how long after join to start checking (default 10000ms)
- autoKickTime: how long to allow high ping before kicking (default 1000ms)
* Updated CD audio system
- Reliably plays music from a virtual CD drive
- Uses the audio mixer so music volume works on modern systems
- TO DO: stop CD playback at zero volume
* Auto-kick start and time actually work now :)
* Fixed network debug display not appearing
* Network debug display also shows stats for reliable messages
* Moved Network debug display draw to RenderHUD
* Added an in-game measurement of average loss based on ping packets
- autoKickLoss: how high a loss to tolerate (default 50%)
* Raised default auto-kick time to 10 seconds since pings get sent 1-3 seconds apart
* Moved auto-kick mechanism to NetPlayer::SendOutPings
- This makes the timing more consistent
* Made lag notification less verbose
* Fixed BettyVoice stopping notifications after a while
- This would happen when it couldn't play the VO sound
* Defer chat messages when they can't be sent
- This prevents the "<error> Send buffer full, message not sent."
- NOTE: exiting a shell page cancels any deferred messages
* Fixed some cases where IntersectGameObject was being used wrong

2011-06-25:
* Switched back to the original volume setting code for CD audio
- The mixer set the volume for the entire application (!)
* Adjusted formatting for strategic AI logging
* Initialize strategic AI attachments to zero
* Workaround for invalid unit type in AI_Match_Get_Unit_Strength
- It still asserts but won't crash
- It also tries to print the name of the offending unit
* Set the SeismicWave falloff to match the original version
- I had made this change before but managed to lose it somehow
* Auto-kick start time begins when a player first spawns
- This should prevent spurious auto-kicks while loading
* Rollback: invalidate the window rectangle on mode switch
- It didn't help, unfortunately
* Reverted: Allow straight-line pathing when airborne regardless of terrain cell type
- Instead, units don't get stuck on blocked terrain while airborne
- This fixes ejected pilots getting stuck while going straight to their target after landing
* Fixed some memory copies in VehicleList and SimpleVehicleList Load
* Pilot going for an empty vehicle locks it
- This prevents other pilots on that team from going for it too
* Shell WM_PAINT cases return 0 to indicate they handled the message
- Maybe this will help with the black screen problem...
* Barracks starts pilots as airborne so they can maneuver on the way up
* Multiplayer shell fixes
- Fixed some potentially uninitialized values
- Fixed memory corruption in PlayerInfo constructor
* Net game dialog now loads map description and vehicle list "on demand"
- The dialog works correctly even if the map is not listed in netmis.txt
- NOTE: it shows the map's filename instead of its label in that case
* Fixed an exception in the net game dialog on exiting the application
* Net error dialog runs the networking system if necessary
- This fixes players lagging out if they don't click OK fast enough
* Update networking thread more frequently while loading
- This should reduce high ping times while players load
* Enable C runtime library debugging features in the debug build
- Log warnings, errors, and asserts to bzone.log and debug output
- Show a dialog window for errors and asserts
- Check for memory corruption if started from a debugger
- Check for memory leaks if started from a debugger
* File cache improvements
- Read file data into the cache buffer directly without a memcpy
- Add a null byte after the data so UseItem can be used as a string
* Took advantage of the new null-terminated UseItem
- Unfortunately, there were only two places that could use it
- Other places modify the data buffer using strtok
* Cleaned up memory leaks
- Enabled full memory allocation tracking in debug
- Fixed a bunch of places using delete instead of delete[]
- Fixed a bunch of allocated objects that were never freed

2011-07-02:
* Fixed the load screen image disappearing prematurely
* Final (?) SeismicWave revision
- Restored original "hump" shape
- Restored original effect falloff
- Removed the start offset by default
* Fixed FindPath sometimes not moving the end point off blocked cells
- This was the cause of severe frame rate problems in some cases
* AiUtil and Path use terrain grid extents instead of computing their own
* Restored original drag effect for empty HoverCraft
- This should fix empty units from sticking to walls
- It now uses a variant of Tug's fix to units getting stuck underground
* Strategic AI clears all allocated memory
- This fixes a bunch of uninitialized values

2011-07-10:
* Allow sprite depth closer to near clipping plane
* Fixed status display getting overdrawn by the sniper rifle in widescreen resolution
* Offset position when spawning an object at a vehicle or building
- This fixes units getting stuck inside the Recycler or Factory
* Allow units to ignore collision in Stuck state
- This allows them to escape bad situations
* Erase unused entries from DistributedObjectMap
* Ordnance uses 32-bit object identifier for its owner
- This should fix cases where remote ordnance couldn't find its owner
* DistributedObject generates keys for permanent state from game object indices:
- eliminates conversions between object identifiers and keys
- limits the range of possible keys to 512
- reduces memory use by reusing permanent state blocks
- unifies permanent state for "global" (loaded) and "local" (created) objects
- fixes objects created on a remote system (e.g. sniped vehicles)
* BlockedCellClean cleans up any leftover building and perimeter areas
* DistributedObject network updates
- Send all state updates in combined update packets
. It previously sent one combined packet and then single-object packets
. This cuts out a lot of UDP packet overhead
- Added support for data compression of combined state packets
. This reduces packet size up to 40%
. More object state fits in one packet, further reducing overhead
UPDATE:
* In-game chat uses its own setting for system messages
- They're on by default in-game
* Network data compression update
- Added UseCompression option to net.ini, disabled by default
- Send compressed packets with uncompressed time stamps
- Shell handles compressed packets
* Network shell update
- Can read time stamps from compressed state packets
- Added build date and check crc above the lobby chat window
- Disabled system messages by default
* Seismic wave limits time step like it did in 1.4

2011-07-16:
* Added %loss to the stats in the score display
- In-game measurement of loss isn't very accurate right now
* Map/Cockpit radar toggle is now a normal game key
- This means it can now be changed in gamekeys.map
* If no text input is active, intercept the caps lock key
- This prevents radar toggle from engaging caps lock
- When text input is active, caps lock works normally
* DistributedObject displays an error if it can't find the game object class
- It previously crashed :P
* Check device format when looking for a depth buffer format
- This fixes a D3D debug error
* Moved D3D_Flush_Texture_Cache ahead of D3DAppDestroy in D3DAppIResetDevice
- That's the order Close_D3D_App does it

2011-07-24:
* Allow the shell chat window to get focus when clicked
- This makes Ctrl-C (copy) work correctly
- This also enables keyboard navigation and selection
* Return focus back to the chat edit box by pressing Tab
* Shell zeroes out all pointers after deleting them
- This fixed a crash when re-entering Combat Exercises after finishing the series
* Minelayer checks for good positions using GoodScrapPosition
- They now avoid hazard areas (e.g. Gun Tower coverage) and lava
* Added experimental support for setting IP ports in net.ini
- ConnectPortInternet: port to use for Internet (winets2.dll)
- ConnectPortLAN: port to use for TCP/IP LAN (wudplan.dll)
* Added more cases to re-enable collision after getting stuck
- Maybe this will help with cass of units being uncollidable
* Fixed a potential divide by zero in FindPath
- This happened when the start and goal were on the same spot on blocked terrain
* Fixed a floating-point conversion error in Precompute_Matches
- It was trying to convert a value larger than the maximum integer value
- Solution: make max_priority a double like the min_priority :)
* Cap scrap drop to 75% of remaining game objects
- This prevents a crash when trying to drop too much
* Fixed large-radius bullets (e.g. MAG) sometimes not colliding
* Fixed a potential divide-by-zero in Terrain_GetIntersection

2011-07-31:
* Exiting stuck state properly clears the non-collide flag
- This time for sure!
* ApplyCliffForce takes object size into account
- This should fix large units getting hung up on steep cliffs
* Fixed Gun Tower leaving hazard cells behind
* Fixed a crash in AIP_Load_Force_Matching when it can't find a unit
- This would happen in a save game where all AI producers have been destroyed
* Don't destroy objects created during mission load when the host leaves the game
* Improved assert message for missing ODF files
* Added error check when decompressing compressed packets
* Added assert in decode_odf when the input value is out of range
* Fixed state packet compression so it's safe to use now
- State packets past the first were malformed when the first held ordnance data
* Don't add sloped/perimeter cells around proximity mines
* Added a separate GoodMinePosition function for use by Minelayers
- It rejects locations in cells adjacent to hazard, lava, or cliff
- This gives Minelayers a larger safety margin
* GoPoints makes the unit sit while "thinking" instead of letting it drift
- This fixes Minelayers sailing past their targets into hazards or off cliffs
* Added GoPoints::DoArrived virtual function called when it reaches the next point
- This fixes Minelayers laying several mines at the same spot when it gets not-OK paths
* Grenade and Missile set notifyRemote by default instead of Rocket
- This should fix disappearing shots for AT-Stabber and SP-Stabber
- NOTE: this might cause issues with the Rocket Bomb weapon
* PreloadTextures checks to make sure mipmaps are properly sized
- If not, it disables mipmapping for that texture
- This fixes a crash in D3D
* Exclude edge_path from powerup spawn paths :)
* Experimental: AddCliffForce extends area based on object velocity
- This should give units more time to react when approaching obstacles
* Ordnance_Receive calls Control in addition to Simulate when advancing ordnance
- This should sync Missiles better at high network latency
* Restored shell support for King of the Hill
- Use K as the mission type in netmis.txt
* Moved King of the Hill item in the map filter list
* Update scores more often so King of the Hill time looks better
- It previously udpated once every two seconds
* Added separate packets and messages for auto-kick
- System message: "Host auto-kicked <player>"
- Error dialog: "You have been auto-kicked due to lag"
* Fixed some problems with MakeZFS
- Check return value from zfsReadRecord to prevent a crash if it returns NULL
- Free buffer allocated by zfsReadRecord to reduce excess memory usage
* BounceBomb/SprayBomb send an ordnance update on bouncing
- I added the code long ago but it was never triggered properly

2011-08-09:
* Fixed default file extension for mission save dialog
- It was "msn" when it should have been "bzn"
* Fixed terrain save when the path had a period in it
- It was chopping off everything after the first period (!)
* Use strrchr to find file extension instead of strstr
- It finds the last period instead of the first
* Bullet simulation records a hit if it starts the frame underground
- This fixes shots falling through terrain moved by SeismicWave
* Torpedo gives proper kill credit when its owner dies mid-flight
- The implementation is a bit sketchy but it works
* Limit cliff force to 100% of the base value
- This prevents unnecessary avoidance of sloped cells
* Add sloped cells at the foot of sheer cliffs
- This keeps unit paths away from walls
* Terrain distance check in DoStuck takes object radius into account
* Shell rendering update
- Removed ValidateRect from WM_PAINT since BeginPaint already does that
- Fixed flicker when drawing TextWindow and TabTextWindow contents
- Net escape dialog draws the stats display instead of triggering WM_PAINT
* Fixed a crash in ZFS when the file name was longer than 16 characters
* MakeZFS now supports the ZFS encryption feature
* Fixed MakeZFS version of crc32
- This fixes the -p option
* Another MakeZFS update
- Don't add a file if it already exists in the ZFS
- Fixed formatting of the file list
* Increased target cam visibility range to 250m
- This fixes views of especially-large objects like Launch Pads
* Prevent multiple calls to Net_KillPlayer from deducting more than one life
* Clamp visible player lives to a minimum of zero
* Fixed wildcard matching in MakeZFS
* Added some checks in the shell for Net::dp being set
* UnitTask DoGoto checks for straight path to the current target node
- This prevents it from "snapping" a path segment when it would then cross a pathing obstacle
* DistributedObject functions reading permanent state use the passed-in buffer
- They previously ignored it and used dpGetPlayerData
- This may help with the "breakdancing units" problem
* Fixed area threshold in FindShortPath being too low
* FindPath no longer tries FindShortPath first
- It would sometimes generate strange or problematic paths
- In particular, it could return a path going straight off a ledge (!)
* Added high-cost "steep" cell type at 70% grade
- Unit will cross "steep" areas only if they have to
- This should makes pathing work more like 1.4
* Path BuildZone combines strips into slabs based on material, not cell type flags
- Material is what actually matters to path planning :)
* Added ReadyToFire method to Weapon
* CellTypeChange allows masking
* IsStraightPlan ignores friendly hazard cells
- This cleans up unit paths passing through a friendly hazard area
* Fixed CellIsBlocked treating sloped and steep as blocking
* Improved Mine Layer
- Lay mines in a tighter pattern to reduce navigation problems
- Wait at a destination point only until the weapon is ready

2011-08-21:
* Fixed bouncing ordnance sticking or bouncing oddly from steep walls
- The bullet underground check didn't test whether the shot was incoming
* Pathing tries several directions when moving the goal off building cells
- This improves the chance of generating a good path on complicated maps
- In particular, this fixes pilots getting stuck while trying to return to base
* Adjust the size of the info/objective display if the text is too large to fit
- This fixes some player-made maps that are unusually "talky"
* Fixed state packet decode when ordnance state was 128 bytes or longer
- It read the size as signed, which would "wrap around" to negative
- It then tried to read ordnance state and random garbage as object state
* Mission-loaded (global) objects now use a separate range of keys
- This fixes destroyed objects not being destroyed for players joining late
* Mission-loaded (global) objects belong to no player
- This fixes the host's flag appearing over them if they were not neutral
- This fixes the host getting credit for kills made by mission-loaded units
* Fixed input configuration dialog not getting arrow keys
* String form of ParameterDB::Get takes buffer size into account
- This prevents it from writing past the end of the buffer
* GoPoints no longer generates plans crossing lava
- TO DO: handle this in a more general way...?
* Changed how lava damage works
- Apply damage only when touching or directly above a lava cell
- Damage depends on the number of surrounding lava cells
. 25% on an outer corner cell (3 neighbors)
. 50% on an edge cell (5 neighbors)
. 75% on an inner corner cell (7 neighbors)
. 100% on an interior cell (8 neighbors)
- Fixed position rounding so it's consistent in all directions
* Reduced MultST spawn height to 50m
* Fixed strategic AI not building units after a while
* Fixed window minimize/maximize when clicking in the Windows taskbar
* Add a more visible screen effect when taking lava damage
* Changed object repulsion force calculation
- Uses a simple a linear falloff instead of inverse-square
- Works properly when using much smaller repulsion forces
. LATERAL_AVOIDANCE_MULTIPLIER: 20.0 (versus 600.0)
. REPULSIVE_COEFFICIENT: 20 (versus 1200.0)
- Allows cliff repulsion forces to take precedence

2011-08-22:
* Fixed units not being able to recycle
- The pathing system wasn't generating the path properly
* Reverted application activate/deactivate changes
- This should fix the blank-screen problems
* Don't try to restore the window on activation in windowed mode
- Windows handles this on its own just fine :)
* Fixed cases where ScheduleGlue could generate bad destinations
* Fixed build effect when a producer has excess build time
- This was most noticeable during the opening cinematic of misn14.bzn
* PersonProcess supports independence
- Will only try to get into vehicles or retreat when independent
* Misn14Mission sets pilots waiting for rescue as not independent
- This fixes those pilots retreating towards the Recycler
* Fixed a potential divide-by-zero error in FindPotentialField
* TurretTank aim converges and compensates for hardpoint orientation

2011-08-31:
* TurretTank aim converges and compensates for hardpoint orientation
* Added drop-shadow to multiplayer score display
* Fixed a crash in InfoDisplay
* Armory AI waits to launch repair/ammo until it's done building the previous item
* Increased pathing "long search" threshold from 200 strips to 1024
- This should improve pathing quality on complex maps
* Buildings don't drop scrap in DM
- Vehicles already behave this way
* Phantom VIR hides damage smoke too
* Skip the local player when getting permanent object state from Anet
- This is done at sync start and "checking for powerups"
* Fixed some host migration problems
- Fixed joiners not seeing destroyed global objects as destroyed
- Fixed global objects getting the new host's identifier
* Read permanent state of global objects only from the host player
* New host takes ownership of global objects and the previous host's local objects on host migration
- This fixes global objects becoming indestructible
- This fixes powerups double-spawning
* UnitTask DrawState draws the force vector in yellow instead of green
- This makes it visible for friendly units with a large collision radius
* Made DoRecycle more tolerant for large units
- It's done when the unit gets within the sum collision radii plus 5m
* Set shell to single-buffered
- This might help with some of the shell rendering problems...
* Fixed problems in the shell when repainting the window
- Redraw the whole background bitmap to fix the black/glitched image
- Fixed missing Combat Exercises and Load Saved Game icons
* Reverted object avoidance changes
- TO DO: add MicroPlan functionality from BZ2?
* IA and DM missions don't try to use "path_" paths for powerups
* Fix the Armory launching the wrong item to a unit requesting a repair/reload
- This would happen after selecting a weapon powerup from the menu but not launching it

2011-09-01:
* InfoDisplay will ignore a missing objective text file
- This fixes the empty objective box on defeat in "Red Arrival"
* Reverted changes from revision 989 ("Set shell to single-buffered")
- This should fix the "Create D3D device failed" error
* Rebuild pathing after editing the terrain
* Added support for saving terrain without saving a mission file 
- Added "Battlezone Terrain (*.TRN)" to file types in the save dialog
- When saving only terrain, write terrain data even if it hasn't changed
* Scavengers now save how much scrap they're holding
* UnitTask properly saves and loads the stuck check timer
- This fixes units sometimes triggering stuck behavior on load
* Fixed window paint in mission archive, net game, and joystick dialogs
- TO DO: use off-screen compositing to fix flicker
* DayWrecker uses a building explosion if destroyed in midair
- TO DO: use a punchier explosion
* Barracks only sends a pilot to an empty unit if it won't overfill the category
- ...a teammate that has been abandoned or sniped (grey in the command menu)
- ...a non-teammate in a category with an available slot

2011-09-03:
* Joystick dialog clears the background area again
* Fixed compression in TempStateSendAll failing in optimized builds
- It would end up with an uncompressed data packet too large to send
- This should fix the "breakdancing units" glitch
* Uproot deployed TurretTanks and set their death timer when destroyed
- They now  get tossed into the air and knocked back like other craft
* Removed weapon convergence from TurretTank
- It wasn't necessary and may throw off the aim of Howitzers
* Fixed some uninitialized values in GotoTask
- This fixes producers not deploying at a geyser when loaded from a save game
* Fixed recycling units and retreating pilots and soldiers not arriving
- They now compensate for the target building's square footprint
* UnitTask GotoForce only applies velocity damping for the last point
- This ensures units normally use full throttle
* Removed the player path hack in "Red Arrival"
- I changed the path in the editor to clear all the obstacles

2011-09-08:
* Don't apply cliff force to airborne units
- This lets pilots hopping out of a Barracks escape properly
- They still take cliffs into account when path planning
* Pilot only goes to an empty unit if it won't overfill the category
- ...a teammate that has been abandoned or sniped (grey in the command menu)
- ...a non-teammate in a category with an available slot
* Added network debug statistics for outgoing DistributedObject temp state
- Packet: number of state packets sent out last update
- Comp: compressed size of the packets sent out last update
- Orig: uncompressed size of the packets sent out last update
* Disable EXIT_SIM_FAIL (Ctrl+X) in multiplayer
- EXIT_SIM_SUCCEED already worked this way
* Fixed the "breakdancing units" bug (finally!)
- dpSend wrote data after the packet, overwriting the next object's orientation
* Added object count to the DistributedObject statistics
* Producer checks to make sure its geyser power source is valid
- This should help with constantly deploying/undeploying producer units in multiplayer
- The producer would choose the wrong geyser before getting moved into position
* TurretCraft manages hazard cells instead of GunTowerProcess
- This makes terrain hazard work properly for remote Gun Towers
* Reduced calculated range of Proximity mine to 50m (like 1.4)
* FollowTask won't try to fire using a dispenser weapon
- This prevents Minelayers from dropping mines while following

2011-09-12:
* Fixed "ghost" objects hanging around when an object slot got recycled
- DistributedObject tracks what identifier is associated withe each slot
- Remove the object with the old identifier when the identifier changes
* Fixed some issues with remote copies of Person
- ...vanishing instead of exploding when killed (broke in revision 412)
- ...hanging around for a bit after the original entered a vehicle
* Shell update
- Mute button toggles mute status instead of only setting it
- Chat queues the message for any send error, not just "full"
* Fixed the net game shell when no map was selected (e.g. everything filtered out)
- Clear out the map icon and description
- Hide the launch button and ignore any attempt to launch
* Fixed some issues in Producer::HasPower
- Unlock the Geyser before giving up on it as too far away
- Reduced the auto-deploy radius so the Producer won't coast out of range
* Disable strategy game victory condition when sync is off
- This fixes players in the escape screen getting the notification
* Non-host players stop simulating when they get a game-stopping event
- This fixes players returning to the (now-disconnected) game after clicking OK
* Shell prints the number of pending outgoing messages when they start to pile up
- This usually indicates a connectivity problem
* Show system messages in the net escape screen
- ...assuming /system or /system on
* Reimplemented system messages in the escape screen
- It now uses a similar mechanism to regular chat messages
- This is only marginally less hacky... :)
* Net::Execute checks for stop game before doing anything else
- This should fix some Anet-related asserts due to the session being lost
* Disable the /lock command after the game ends
- /unlock already worked this way
* Don't spam stop-game packets after ending the game
- Sending them reliably should be more than sufficient
- This fixes a spurious Pending count in the post-game screen

2011-09-18:
* Person delays deletion in multiplayer only until it gets sent
- It vanishes instantly in single-player
- It previously used a fixed 0.1s timer in both single- and multiplayer
* Suppress "Pick Me Up" command for unpiloted vehicles
- The player can never enter those vehicles so it was misleading
* Added sanity checks to Craft
- If the position is invalid (NaN), teleport to the center of the map
- If the position is outside the world, teleport to the edge of the map
- If the velocity is invalid (NaN), set to zero
- If the velocity is higher than 1000 m/s, clamp it to that value
- TO DO: figure out why units sometimes leave the world in multiplayer
* Fixed object temp state packets not having their time stamps set
- They were using whatever garbage was on the stack
- Receivers got a floating-point exception if the value happened to be NaN
- This should fix the crashes that sometimes happen when a player leaves
* Reverted some of the changes to shell stop-game handling
- Recent changes may have caused some of the post-game problems
* (Re)fixed players returning to simulation after being disconnected
- It now uses SetRunnning(RUN_WAS_QUIT) to stop the simulation directly
* Fixed the "you won" message not appearing for a sync-on strategy game
* Keep simulation running after defeat in strategic multiplayer
- The player's base and units remain functional until the player leaves the game
- This is how 1.4 worked
* Reduce the send priority of empty, stationary hover vehicles
- This works similarly to a deployed Producer
* Remote powerups explode on death
- This uses very similar logic to Person

2011-09-20:
* Emergency fix for "infinite Torpedoes" bug
- Torpedo wasn't responding properly to the new DEAD powerup flag
* Don't print death notices for non-player-owned buildings and units
* Fixed potentially uninitialized stuck state values in RecycleTask

2011-09-21:
* Added Catapult animation for armories (submitted by Dx)
* Strategy mission no longer quits the simulation on defeat
* Run simulation while the escape screen error dialog is visible
- This fixes remote copies of buildings and units going inert
* Info display ignores cloaked and dead objects
- This should hide not-quite-removed-yet pilots in multiplayer
* Craft ignore collisions with deceased pilots

2011-09-23:
* Restored the team check for recording deaths
- This fixes players getting kill credits for empty vehicles
* When (auto)kicked, close the session before showing the message pop-up
- This fixes the host kicking repeatedly until the kicked player clicks OK
* Don't relinquish spawn points in strategy games games
- This prevents joining players from spawning in another player's base

2011-09-24 (RC1):
* Assign the host's spawn point so joining players can't pick it
- This should prevent players from spawning in the host's base
* Armory starts catapult animation in LaunchItem
- The pause at the start of the animation exactly matches the build time

2011-09-25 (RC2):
* Fixed some minor issues with the net escape dialog
- Fixed the "NULL" appearing at the bottom
- Give the chat edit box focus on startup
* Restored the original Producer auto-deploy radius (10m)
* Getting (auto)kicked while in the options menu no longer breaks the shell
* Added support for removing a player from the game when kicked
- Added RemovePlayerOnKick option to net.ini, disabled by default
- Auto-quit when receiving a delete player for yourself
* Clear the user team list on quit
- This fixes an occasional crash when starting another game
* ReceivePermState won't create an object if DESTROY is set

2011-09-26 (RC3):
* Fixed the crash when a player died in multiplayer
* When going to a powerup or scrap piece, GotoTask uses the original 5m distance
- This fixes Producers stopping short of nav beacons placed on geysers

2011-09-26 (RC4):
* Lifted category restrictions on empty units for non-player teams
- Barracks will create pilots for empty units even if the category is full
- Pilots will go for empty units even if the category is full
* Retreating pilots don't get absorbed by a Barracks when starting
- This gives them a chance to seek an empty vehicle 
* SetLocal only writes Anet player data for objects saving permanent data
- This is how 1.4 worked so it's best to revert to that behavior
* Ignore packets from players no longer in the session
- This fixes "ghost" objects when kicking players using RemovePlayerOnKick
* Fixed a crash in Set_Cockpit_View when dropped from a net session
* PowerUp RegCollision ignores collision when marked as DEAD
* Zero out memory when building a remote-delete packet
- Destroy and BroadCastGrabObject already work this way (as of revision 1021)
* Powerup GetRank no longer depends on velocity
- This may have been causing the powerup "respawn" right after being collected

2011-09-29 (RC5):
* Fixed Music Volume not playing at volume level 1 (submitted by Dx)
* Read BZPLYR.DEF from the application's install folder like 1.4
* GetEmptyVehicle and Barracks use a shared "team has a free slot" check
- This fixes pilots sometimes not going for vehicle they should
* Adjusted default settings for a new player profile
- Sky Detail: FULL
- Terrain Detail: HI RES
- Object Detail: HI RES
- Automatic Leveling: ON
- Target Lead Position: ON

2011-10-01 (RC6)
* Restored original PersonRetreat behavior
* Fixed in-game chat echoing commands like normal messages
- Other players didn't see it but it was confusing
* Provide human-readable messages for chat commands
- /system on or /system: "Show system messages" (multi_message/system_on)
- /system off or /nosystem: "Hide system messages" (multi_message/system_off)
- /mute: "Muted <name>" (multi_message/muted)
- /unmute: "Un-muted <name>" (multi_message/unmuted)
- /kick (host): "Kicked <name>" (multi_message/kicked)
- /kick (client): "Only the host can kick" (multi_message/only_host_kick)
- /lock (host): "Game locked" (multi_message/locked)
- /lock (client): "Only the host can lock" (multi_message/only_host_lock)
- /unlock (host): "Game unlocked" (multi_message/locked)
- /unlock (client): "Only the host can unlock" (multi_message/only_host_unlock)
- TO DO: update label.map
* Set focus on chat edit box as part of creating the net escape dialog
- I had accidentally put it in the window paint event handler
* Simplified how the network system tracks player lives
- It now uses the value in Anet player data exclusively
- This should reduce the chance of the value getting out of whack
* Fixed a crash when the D3D occlusion query fails to initialize properly
* PerimeterCells leaves non-flat terrain alone
* TurretTank and Howitzer update pathing cells when deployed
- They mark their collision radius as perimeter (like a Pylon)
- They mark their engagement radius as hazard (like a Gun Tower)
- This makes units navigate around them more intelligently
* Synchronize player list on entering the net escape dialog
- This should fix players names left behind in the list

2011-10-02 (RC6a)
* Fixed a potential invalid floating-point operation in the scoring system
- The "time in zone" case was messed up
* Skip over yourself when selecting a chat destination in-game
- Whispering, muting, and unmuting yourself are useless
- Kicking yourself can break the networking system

2011-10-05 (RC7)
* Reduced the delay time in the net escape screen when running simulation
- It now uses a 10ms delay plus however long the simulation takes
- This also applies while the message pop-up is active
* Reorganized shell code that creates or joins a game session
- It now does this before actually going to the net game dialog
- This fixes the blank screen with an error dialog when things go wrong
* Updated FlagDisplay
- Fixed flags sorting in front of HUD elements
- Fixed flag colors sometimes being wrong
* DistributedObject state updates include a size value
- This ensures receivers can skip objects without getting misaligned
- This should fix the randomly-appearing units
* Object deletion messages indicate whether an object should explode or not
- Person and PowerUp now use this mechanism instead of waiting to send

2011-10-08 (RC8)
* Holding Caps Lock no longer makes the radar flicker
* Fixed Tug grabbing a Tug that was (possibly indirectly) holding it
- The physics would freak out at that point...
* Added Teams 3-7 to the Build Team menu in the Shift-F9 view
- These teams are hostile to all other teams except 0 and themselves
- NOTE: mission scripts don't set up strategic AI for these teams
* Moved DistributedObject permanent state update to its own function
* PowerUp updates its permanent state when it lands
- This fixes late joiners seeing it in the wrong place
* Network system clears the respawn flag and timer on startup
- It previously left whatever value it had from the last game
* Respawn checks for a specific value (1) instead of any non-zero value
- This may help with the "sniped by the system" bug
* Made code for dropping scrap consistent between all objects
- Remote object or Deathmatch game: drop no scrap
- Single-player mission: drop normal scrap
- Strategy game: compensate for scrap-doubling
* Buildings use the new "explode" flag
- This ensures buildings only explode when actually killed
- Remote buildings no longer explode when recycled by a Construction Rig
- Joining players no longer see destroyed global buildings explode on startup
* Display "<Player> has been defeated" message only when a player loses their last life
* Wait 5 seconds before popping up the "You won" message

2011-10-13 (RC9)
* Fixed a crash on receiving a chat message before the player entity got created during load
* Only draw the reticle if it's in front of the camera
- This fixes a potential divide-by-zero error
* Added a kick button to the host's net escape screen
- This uses a new background image, multipeh.bmp
* Kicking with a kick button displays the "Kicked <player>" message
* Removed redundant ammo value from HoverCraft and Walker state packets
* Cleaned up TurretCraft state packet
- Removed unused data values and reduced the rest
- This makes each state update 36 bytes smaller
* Fixed localization key for auto-kick message in shell Timer function
* Re-fixed "Infinite Torpedoes" bug :P
* Added a play option for special item trigger
- Off: by selection (BZ1 style)
- On: by fire (BZ2 style)

2011-10-14 (RC9a)
* Fixed ReceiveTempState freezing if it got a block with zero size
- TO DO: find out where the zero-size blocks came from

2011-10-19 (RC10)
* Clamp send rank of empty HoverCraft to a minimum of zero
- This may help with remote units having the wrong position
* Fixed problems with compression in TempStateSendAll
- Removed LZO optimization since it wasn't necessary and sometimes failed
- Always clear compressed data after a send, even if it wasn't used
- This fix objects randomly appearing in multiplayer games
* Cleaned up how DistributedObject reads state data
* Added some basic runtime validation
* Send shell chat to players individually instead of broadcasting
- This fixes chat failing when one player has 100% loss for a while
- This also fixes the perpetually-increasing Pending count (Anet bug?)
* Fixed "Pending: 0" message
* Check to make sure the player team is valid when deleting a net player
- This should fix an occasional crash
* Fixed some airborne powerup collision issues
- Ignore collisions with other airborne powerups
- Cancel airborne state if it collides with something

2011-10-26 (RC11)
* Fixed /nobodyhome and reading from a .trn file on the command line
* Fixed error message spam when the send buffer is full
* When flattening terrain, Constructor clamps the height to the legal range
* Fixed special item trigger option in play options showing the wrong value
* Shell uses the local map list to limit the maximum player count
- This helps when the host sets the limit higher than the map supports
- NOTE: the implementation of this is not very clean

2011-10-29 (RC12)
* Clear pending commands when a pilot gets into an empty unit
- This prevents it from resuming the unit's previous action
* Removing an AI process also clear the next command
- It previously cleared only the current command
* Strategic AI treats units with no AI (e.g. sniped) as destroyed
- It should no longer command units that have been sniped and captured
* Prevent the host from kicking themselves with the shell kick button
* Fixed a crash in FlagDisplay when it can't find the user's net player
- This sometimes happens when getting kicked
* Reverse animations now play all the way to the end
- They previously stopped about a frame short
* Strategic AI now sets the squad team properly
* Escort_Goal and Squad_Send_Units check unit teams
- They remove units from squads if their teams doesn't match

2011-11-04 (RC13)
* Fixed the player limit in the shell when the session has too many players
- It now checks if the current count is greater than or equal to the limit
* Pilot entering a vehicle only clears the command if the unit was an enemy
- This fixes a design idiom used on a number of IA maps
- (Designers place neutral units with pre-set commands and activate them by spawning pilots nearby)
* SeismicWave uses GetZonePtr for terrain height instead of its own custom version
* Allow Scavengers to collect scrap in hazard areas
* Allow Minelayers to lay mines in hazard areas
* When switching the user entity, update views in the camera stack
- This should fix the camera following the wrong entity after returning from a cinematic if the user changed in the meantime
* Building perimeters use a "perimeter" cell type instead of "sloped"
- 5x path cost (versus 2x for sloped)
- 0 avoidance force (versus 1 for sloped)
- This fixes units getting stuck while trying to drive between buildings and adjacent impassable terrain

2011-11-12 (RC14)
* Made GameObjectClass, OrdnanceClass, and WeaponClass destructors virtual
- It's proper form for classes with virtual methods
- This won't affect anything in practice, though
* Increased size of SeismicWave height offset buffer
- It was previously too small by one column and one row
- I'm surprised the memory checker didn't catch it...
- This may fix some random crashes
* Pathing system allows off-map paths like 1.4
- Does not clamp positions to map boundaries
- Treats off-map areas as flat instead of cliff
- This fixes several Instant Action maps
* UnitTask DrawState for Goto takes skip object into account
* Fixed ally/unally staying visible after entering invalid input
* Pilots use a "glide" task to reach empty vehicles within the Barracks footprint
- It uses an approach similar to how PowerUp flies
- TO DO: clean this up a bit

2011-11-23 (RC15)
* Added missing Arrow Down CheckRollOver code for "Players in Room" window (submitted by Dx)
* Added safety checks to the AIP loader
- Reject non-units in the force matching section
- Reject non-buildings in the building matching section
- PROTIP: strategic AI classifies producers as buildings
* Fixed message box popups getting stuck behind the main window
* WeaponPowerup checks for UserProcess instead of assuming the user game object has one
- Under normal circumstances, this should make no difference...
* Added a ShellPlaySound function for playing sound in the shell
- It encapsulates the repeated UseItem/ShellStartGASEvent/NextGAS/UnlockItem block
- This cleans up the code and will make it easier to add new sounds
* GameObject constructor no longer enables all weapons
- Instead, it lets AiProcess do it
- This fixes SpecialItem triggering on respawn in DM with "Special Item Trigger" off
* Unit recycle and soldier/pilot retreat use the original 1.4 distances as a minimum
- This should fix cases where they almost-but-not-quite arrive at the goal
* Reduced perimeter cost back to 2x since 5x was too high
* PathDisplay shows objects as oriented boxes when large enough on screen
- This gives a better indication of size and orientation
- It shows the object's collision radius as a circle
* PathDisplay shows bounding sphere radius too
* Major revision to BlockCells
- Refactored the PerimeterCells and BuildingCells functions
- Mark building cells only if they overlap the object's oriented box
- Removed perimeter around buildings and deployed producers
* Pilots can now enter vehicles on building cells
- Pathing gets them to a nearby good location
- Cross building cells if there is no obstruction
* Adjusted several go-to tasks to better compensate for the target's size
- GotoTask, ScavGotoDrop, SoldierRetreat, SoldierReturn, DoRecycle (cleaned up code)
- NOTE: these use the original (1.4) distances as a minimum
* FindPath checks to make sure the moved goal location is reachable
- This should fix some cases where units get stuck
* Fixed the implementation of IsKindOf
* Craft sends "destroyed" flag across the network
- This may help with the occasional "infinite explosion"
* Properly initialized last scrap position in Scavenger AI task
- This fixes a semi-rare crash on startup in IA missions
* Fixed other uninitialized values in RecycleTask

2011-11-27 (RC15a)
* Restored the original GameObject weapon selection
- A few things relied on the original behavior and the change broke them
* Fixed the special item selected trigger logic
- It triggered on respawn because the carrier and user object were both NULL and matched
- It now checks that the carrier is not NULL first :)

2011-12-04 (RC16)
* Revised unit recycling again
- GotoTask doesn't retry if the destination object is on blocked terrain
- This should eliminate (or at least reduce) units not recycling
* Revised how pilots and soldiers interact with scanners
- People are no longer marked as "hidden" by default
- Scanners specifically exclude pilots and soldiers not on the player's team
- This lets players see pilots and soldiers on their team
- Custom pilots can use a RED Field to avoid showing up on radar
* Fixed radar lines disappearing when a terrain point went too high or low
- The point still disappears but the line draw can continue past it
* Radar draws grey icons for non-commandable team units in non-menu mode
- This matches various menu modes and makes it more obvious when a unit is empty

* 1.5 Final Release
- ...assuming nothing goes wrong :)
- Added a proper VERSIONINFO resource to the executable
- Replaced the date stamp with a version number (currently 1.5.0.120)
- Removed the _d3d9 suffix from the executable names
