BATTLEZONE 1.5.1 CHANGELOG

1.5.1.1 (2011-01-04):
* Strip extension (if any) from TerrainName
	- Some third-party maps have a TerrainName with extra '.' characters at the end
* Updated SubmitMissileLight
	- Moved it from Sprites.c to Rocket.cpp
	- Cached sprite index to avoid runtime lookup
* Fixed some units not recycling properly
	- AI processes not derived from UnitProcess needed updating
	- They use collision radii and assume a square footprint
* Recycling a Scavenger includes any scrap held
	- Their held scrap was previously lost
	- Players rarely recycle Scavengers so it rarely came up
* Receiving a state update for a deleted object no longer recreates it
	- This should fix "indestructible" objects appearing in multiplayer
* TargetingGun limits the shot timer while waiting for a leader round
	- It previously let the shot timer accumulate while waiting
	- Subsequent leader rounds used that value and jumped into the distance

1.5.1.2 (2011-02-14)
* TakeOwnershipFromPlayer checks for empty entries in the object map
	- This should prevent crashes on host migration
* MultDMMission::Respawn checks to make sure it has a valid spawn point
	- If it doesn't, it uses the net start location as a backup
	- This should fix an intermittent crash

1.5.1.3 (2011-03-31)
* Mono Debug system uses an 80x25 Windows console instead of writing to video RAM
	- It originally required a monochrome video card and a second monitor
	- Windows isn't keen on programs writing directly to video RAM these days...
* Disable internal adjustment of time scale in multiplayer
* Ordnance_Receive aborts if it can't find the ordnance class
	- This will prevent a subsequent crash in OrdnanceClass::Build
* Pilots skip empty vehicles that are tug cargo (submitted by Dx)
* Improved input map handling
	- Parser attempts to continue reading after errors
	- Error messages show correct filename and line
* FlagDisplay skips objects behind the camera
	- This should fix a rare divide-by-zero error
* PersonProcess cancels Glide/Straight/GetIn task if the target is occupied
* Tweaked IntersectGameObject to avoid a potential divide-by-zero error
* Fixed HuntTask crashing after loading a save game
* Added a post-load step to mark unreachable path cells as impassable
	- Should fix hitching and low frame rates on some maps
	- Should reduce units getting stuck trying to follow bad paths
* Updated intersection test in BuildingBlock
	- Based on circle-polygon intersection in Box2D
	- It now correctly handles corners of the footprint polygon
* Made recycle distance check more tolerant
	- This should fix semi-rare cases of units not recycling

1.5.1.4 
* CockpitTimer can show hours
* Limit ping time display to a maximum 9999
* Limit loss percent to a minimum of 0
* Removed redundant call to UpdateWeaponAim from HoverCraft::Simulate
	- This shouldn't affect anything
* Improved SAV physics
	- Ascent and descent work much better
	- Death works more like other craft

1.5.1.5
* Adjusted DisplayInterface colorBlue and colorDkBlue
	- Now map to the dedicated interface colors in the palette
	- This makes them a lot more saturated, like other UI colors
* Increased maximum teams to 16
	- Team fields in object flags and state packets had a bit to spare
	- Replaced a bunch of hardwired numeric constants while I was at it
* Deathmatch supports team play
	- Each player gets their own team number
	- Players can ally and unally as in Strategy

1.5.1.6
* Added Time Limit selections (submitted by Dx)
 - Changed Time Limit display to show hours and minutes, instead of minutes and seconds
* Reduced (arbitrary) 22-player limit to MAX_TEAMS-1
	- It's mostly just a sanity check...
* Prevent special weapon powerup from replacing the Armory object launcher
* Teams allied with the user always show up on radar (like BZ2)
	- It checks from the other team's perspective so the user can't exploit half-alliances
* Fixed a few hard-wired team constants that got missed earlier
* Allow remote objects to revive if state packets keep arriving
	- This ought to fix "invisible" units in MP
* Objects placed by PathDisplay work correctly in MP
	- This only affects Debug since PathDisplay is otherwise disabled

1.5.1.7 (2012-05-25)
* Fixed camera spin when switching between Shift-F3 and Shift-F4 views
	- Wrap the yaw value so its values are always reasonable
	- Restore the previous yaw when entering Shift-F4 view
* Added MakeMAP utility for creating texture files
* Added new texture type 2 (R5G6B5)
* Fixed terrain when using 16-bit MAP files
	- Extracting average colors from a terrain tile (which assumed 8-bit)
	- Attaching smaller mipaps to the mipmap chain (which assumed 8-bit)
* D3D texture system checks textures against device capabilities
	- The original restrictions were based on the 3Dfx Voodoo
	- Supports textures larger than 256x256
	- Supports non-square textures
	- Supports non-power-of-two textures
* Reticle gets pitch angle from Craft instead of recalculating it
	- This will eventually allow different pitch ranges and behaviors
* Extensive MakeMAP update
	- Print usage information if no arguments provided
	- Read image files using stb_image.c
	- Added new processing options:
. flipx: flip output image horizontally
. flipy: flip output image vertically
. diff: apply error diffusion
* Further updates to MakeMAP
	- Supports 8-bit palettized output (MAP type 0)
	- Simplified error diffusion logic
	- Can set how much error diffusion to apply
* Added support for 32-bit texture formats
	- Translucent: A8R8G8B8 (MAP type 3)
	- Opaque: X8R8G8B8 (MAP type 4)
* Fixed up a few issues with R5G6B5 textures
* Another MakeMAP update
	- Added support for undoing premultiplied alpha
	- Added support for chromakey color
	- These allow MakeMAP to process effects textures
* Near-final(?) MakeMAP update
	- Added support for colorization curves: mul * (value ** pow) + add
	- Added support for reading a color remap table from an image
	- It can now process all textures used by the game
	- Cleaned up the code a bit
* Fixed problems on maps with units that start outside the play area
	- Fixed a crash in FindPath when deep inside a blocked area
	- Unreachable cells retain their original cell type
	- Path-finding treats unreachable cells as blocked
. This retains good pathing performance
	- Units treat unreachable cells as normal
. This allows units to follow designer-placed paths
* MakeMAP supports transparency index
	- This works well in conjunction with chromakey
	- This emulates behavior of the original toolchain
* Got 8-bit hardware mode working correctly
	- Set it in render.cfg with Texture16=0
	- There is not much point in using this :)

1.5.1.8 (2012-05-26)

* Set D3D_Remap_Palette back to 16 bit
	- This was for 8-to-16 blits but isn't used any more
	- ...that I know of
* Moved pitchAim calculation to Simulate
	- This fixes aiming problems with unarmed vehicles
	- UpdateWeaponAim only gets called when the craft has weapons...
	- This also simplifies things slightly...
* Revised how NetPlayer tracks team number
	- Update the stored team number if the Anet team value changes
	- Update the used team bits if the stored team number changes
	- This may help with alliances getting reset when a player leaves

1.5.1.9 (2012-05-27)
* Fixed clear_events() when paint event processing is turned off
	- This should fix the shell getting stuck when something goes wrong during MP mission load
* Apply a Perlin noise-based camera jitter in response to hard collision
	- This is an attempt at a D3D equivalent to the SW "wiggleburger" effect
* Consolidated damage values in OrdnanceClass and ExplosionClass
	- This completes the process that started with the DAMAGE structure

1.5.1.10 (2012-06-01)
* Fixed MP flags sorting behind terrain
	- They were being set as transparent (no depth write)
* Added support for up to 64 sound channels
	- Audio options lists 1, 2, 4, 8, 16, 32, and 64
* Added basic Ogg Vorbis music playback
	- Based on Nathan's version from BZ2
	- CD audio takes precedence when found
	- Plays files 02.ogg through 16.ogg
	- The implementation is pretty sketchy...
* ScrapField objects no longer block terrain
	- Fixes cells incorrectly marked as unreachable
	- Allows Scavengers to collect scrap there
	- Eliminates unnecessary navigation mesh changes
* Fixed footprint calculation for buildings
	- This should fix units getting stuck on buildings
* Use player location as a reachability seed in SP
	- This fixes pathing on maps without normal seed objects
. Missions freshly created from a TRN file
. Missions started with /nobodyhome

1.5.1.11 (2012-06-07)
* Fixed faulty cliff test in Forbidden terrain check
	- It was triggering for sloped and steep too
* Fixed music trying to play an unlocked resource
	- I'm surprised this didn't crash outright...
* Adjusted audio system settings a bit based on BZ2
* Disabled crc32zix debug output
	- This reduces the noticeable "hang" in the shell
	- This also fixes music skipping in the shell
* Set Ogg Vorbis DirectSound buffer channels and rate from the file
	- It previously assumed two channels and 44100 Hz
* Fixed navigation mesh not being rebuilt after editing terrain
* Updated PathDisplay
	- Changed Draw Height to use a broader grayscale ramp
	- Added Draw Slope to visualize terrain slope
* Allow oriented build template in satellite view
	- It shows a more accurate building footprint
* Completely changed how nationality works
	- Uses the first letter of the ODF as a nation code (like BZ2)
. No longer limited to American ('a', 'b'), Soviet ('s'), and Alien ('h', 'o')
. Special case: player.odf is assigned to American
	- Determine pilot, user, Recycler, sounds, etc. from nation code
. Fall back to 'a' or 's' when nation-specific assets don't exist
	- Allow Chinese and Black Dog factions from Red Odyssey
* Added Scavenger-specific message properties
	- deployMsg: default avscav1.wav or svscav1.wav
	- foundMsg: default avscav5.wav or svscav5.wav
	- notFoundMsg: default avscavh.wav or svscavh.wav
	- noDropMsg: default avscavi.wav or svscavi.wav
	- These were previously hard-coded
* APC no longer reloads at an undeployed Recycler
* Completely rewrote reachability test
	- Uses a two-pass connected component labeling algorithm
	- Assigns valid region id to regions containing "interesting" objects
. It uses the exact same objects that flood fill used as seeds
	- Goal is reachable only if its start and goal regions are valid and match
. This fixes performance problems on maps with disconnected regions
* Updated PathDisplay
	- Added "Draw Cell Region" visualizer
	- Show plan path in red if it isn't valid (e.g. disconnected)
* OggManager threads use a critical section
	- The BZ2 version used Boost::mutex
	- This should fix any multithreading strangeness
* Updated file system
	- Read contents of ZFS files in addon
. They work like folders for the most part
	- Print ZIX file list to debug output
. Prefix used paths with @
. Prefix overridden paths with !
* Tweaked OggManager worker threads
	- Don't set processor thread affinity
	- Fixed threads exiting after resuming from a debug break
* Use points of all named paths to mark regions as interesting
	- If a designer put a path somewhere, it's probably interesting
	- Exception: edge_path
* Set primary audio buffer to 44KHz and 16-bit
	- This should improve quality when mixing a lot of channels
	- Modern hardware should handle this just fine
	- Technically it should be an audio option...
* Removed old mouse speed functionality
	- It was setting the system-wide mouse speed (!)
* Use raw mouse input when available
	- This bypasses system mouse speed settings
	- Mouse input device applies sensitivity internally

1.5.1.12 (2012-06-08)
* Recompiled anet libs from the CtP2 Source Code Project (submitted by Dx)
	- Includes Windows XP hosting bug fix
	- Added the current header files
* Choose a safe default pilot if there isn't a faction pilot
	- This fixes Black Dog units missing pilots
* Made raw mouse input a command-line option
	- /rawinput enables it
	- /norawinput disables it
* Improved raw mouse input precision at low speed
	- It matches enhanced pointer precision fairly well

1.5.1.13 (2012-06-09)
* LabelConnectedRegions allocates temp storage from the heap
	- Large maps were too big to fit on the stack and crashed
* Fixed FindPath when the goal on a building
	- Check for blocked since building cells aren't an invalid region
	- This fixes units not being able to recycle themselves
* Improved pathing performance
	- Enable intrinsics so distance measurement can use FPU sqrt
	- Allocate path points all at once instead of pushing them into a queue one by one
* Added a function returning whether a plan is possible
* Use all craft as region labeling seeds
* Added multiplayer option to enable extra nations
	- Enabled: use netveh1.odf and allow nation-specific pilots and Recycler
	- Disabled: use netveh.odf and force American or Soviet pilots and Recycler
* Stop adding diplay modes if the list fills up
* MultSTMission tries several different Recycler versions:
	- Nation multi-player (_vremp) - only if allowing any nation
	- Nation single-player (_vrecy) - only if allowing any nation
	- Fallback multi-player (avremp/svremp)
	- Fallback single-player (avrecy/svrecy)
* PathDisplay shows unlabeled (AI-created) paths in a different color
	- This makes them easy to tell apart from labeled (designer-created) paths
* UnitTask::InitGoto separates goalPoint from gotoPoint for replanning
	- gotoPoint: saved target location; replan if the target moves >100m
	- goalPoint: path plan goal point; replan on reaching this point
	- This fixes constant repathing when the two were separated by >100m
	- This solves severe framerate problems on some maps
* Check to make sure netveh1.odf exists before trying to use it
* Lobby Updates (submitted by Dx)
	- Full name lengths
	- Matched "Players in Room" button click color 
	- Required assets: multi2.bmp
* Pre-game screens (submitted by Dx)
	- Full name lengths
	- Matched "Player Status" button click color
	- Changed Player Name color to Green 
	- Required assets: multipc.bmp, multipj.bmp
* Post/Escape game screens (submitted by Dx)
	- Full name lengths
	- Matched "Player Stats" button click color
	- Changed Player Name color to Green 
	- Required assets: multipe.bmp, multipeh.bmp
* Increased resolution mode limit to 128
	- That ought to be more than enough...
* Changed "%loss" to "Loss"
	- Needs a new label.map to make it stick, though...

1.5.1.14 (2012-06-14)
* Fixed time limit box position
	- I somehow managed to screw it up during the shell merge
* Fixed Soviet units using American pilots with Any Nation turned off
* Reapply map vehicle list (.vxt) after switching Any Nation
* Units, pilots, and soldiers recycle when they reach their goal
	- This should reduce cases where they don't recycle
* Centered all POPUP windows (submitted by Dx)
* Added defaultFontSize3 (submitted by Dx)
 - Used for Map and Vehicle description text
 - Fixes "W" from being clipped
* Allow ODF to override pilot and user classes
	- pilotName: pilot to use for non-player unit
	- userName: pilot to use for player unit
* Allow Barracks ODF to override pilot class
	- pilotName: pilot to create
* Geometry tolerates face texture names with extensions
	- This may help with texture problems on some objects
* Recycler sets itself as the owner of created powerups
	- This prevents them from colliding on the way out
* Handle blank pilot name as no pilot class
* Added soldier class fallback to APC
	- Use 'a' or 's' version when Any Nation is off
* Made TurretCraft more tolerant of unusually-named turret geometry
	- It assumes an unknown name is a Y turret
* New build menu system
	- Populates top-level menu from build.odf
. Falls back to "classic" menu items when not found
	- Build items can be sub-menus
. Allows arbitrarily-deep menus
. New build.odf takes advantage of this
* Disable Any Nation button on client

1.5.1.15 (2012-07-03)
* Fixed some shell text windows using the wrong font size
	- TextWindow uses the original font size (14) by default
	- Map and vehicle description windows use a smaller font size (13)
* Fixed units not being able to pass between deployed craft
	- Disabled radial avoidance force for deployed craft
	- Added avoidance force to perimeter cells around turrets
* Fixed a crash in FindPathStart when the player is dead
* Render_Bsp_Mesh supports multiple textures with hardware rendering
	- Some polygons previously used the wrong texture
	- This fixes cockpit geometry (especially in avtank and svtank)
* TurretTank PackTempState sends ammo
	- This fixes remote copies having the wrong ammo amount
* Scheduler initializes all members to sensible values
	- Debug logging code was tripping over them
* ScheduleGlue no longer populates its unit list from the builder menu
	- It ended up with more entries than it could handle
	- This should fix crashes and other strategic AI problems
* Fixed strategic AI breaking when there were more than 127 prereq types
	- It was casting the prereq type to a signed 8-bit value (-128 to 127)
* StopMusic doesn't attempt to reset the streaming sound
	- This may help an intermittent crash
* Fixed TurretTank::UnPackTempState using (raw/encrypted) maxAmmo
	- It now matches the equivalent in Craft
* MakeZFS preserves file modification date
	- Add/replace use file modification date as the timestamp
	- Extract sets file modification date to the timestamp
* MakeMAP supports desaturation
	- desat: amount of desaturation (0=none, 100=full)
* Increased pathing cost of "perimeter" cells
	- This should help with units getting stuck on turrets
* MakeZFS update
	- Adding/updating files using wildcards (e.g. *.ini) works
	- Adding/updating files sets the correct timestamp
	- Listing files using wildcards shows matching record count

1.5.1.16 (2012-07-08)
* Fixed issues with music playback when the volume was off
	- Start playing when the volume gets turned back on
	- Don't check for looping when the track hasn't started
	- StopMusic releases the requested track properly
* Fixed ally/unally with teams 9 through 15
* Strategic AI adds the default builders (avrecy and svrecy)
	- This fixes problems with some missions (e.g. NSDF mission 2)
* Fixed multiplayer lobby showing negative loss %
	- The previous fix affected the pre-game shell

1.5.1.17 (2012-08-29)
* ScheduleGlue collects build items from Constructors too
	- This fixes a few single-player missions (e.g. misns4.bzn)
* Added deployName property to SprayBombClass
	- This allows mortars deploy any game object
* NSDF Mission 09 Updates (submitted by Dx)
	- Fixed misn0900.otf (wasn't shown)
	- Switched to Howitzer Cams
	- Changed relic from team 3 to 0 (neutral object)
	- Adjusted CameraPath CCATug pitch roll
	- Fixed Factory deployed check
	- Note: Turret fortification set up is unreliable and should be fixed (starting at line 890)
* Fixed MultSTMission Recycler selection when MP variants are unavailable
	- In particular ,Soviet units should get svrecy.odf as expected
* Moved build menu initialization to PostLoad
	- This fixes (of all things) Net::bSplint from affecting units in DM
	- It preloaded game object classes before the mission could set the DM/ST flag
* Only initialize build menu in debug build or with /edit enabled
	- This should improve load times a little
* Fixed MakeTRN crashing when compiled with Visual C++ 2008
	- Modern compilers place code and constant data in write-protected memory
	- The INI reader tried to modify constant section and label names and crashed
	- Replaced the offending strupr/strstr with a case-insensitive string find
* Reduced spamminess of "repaired geom ..." debug messages
	- Consolidate vertex repair messages for a geometry piece
	- Consolidate normal repair messages for a geometry piece
* Added leaderName property to TargetingGunClass
	- Defaults to the weapon's ODF name so existing assets work
	- Allows the weapon to use a leader round from a separate ODF
	- IMPORTANT: ordnance MUST have classlabel="targeting" or the weapon will crash!
* Barracks falls back to 's' or 'a' equivalent 
	- ...if the Any Nation setting is off
	- ...if the nation-specific pilot doesn't exist
* Fixed buffer overrun when reading extra-long fields from netnam2.txt

1.5.1.18 (2013-04-14)
* ArtilleryProcess checks projectile flight path
* Remove the oldest scrap piece when out of game object slots
	- This is a last-ditch recovery attempt to avoid a crash
* Don't show a health bar for indestructible objects
	- This fixes geysers showing a health bar when targeted
* Try to make player-controlled APCs less exploitable
	- Only deploy when within 75m of a (potential) target
* Added Team::GetAllies method returning the allies bitfield
* Track team ownership of terrain cells
	- Replaces "team hazard" mechanism
	- Works correctly for all teams
	- Takes team alliances into account
* Fixed cliff force for teams 3+
* Prevent terrain access from reading outside the world
	- The world effectively "wraps around" at the edges
* Fixed ConstructionRigProcess class crash in misn09.bzn
	- Handle CMD_STOP more like other producers
* Fixed video mode switch changing camera settings
	- This particularly affected the editor view
* Clamp visibility ranges to maximum far clipping plane
* Halved memory used by tile mix cache
* Fixed a crash in GotoTask when the path was NULL

1.5.1.19 (2013-05-19)
* Fixed ReticleDisplay when selectObj got deleted out from under it
	- It now uses a DeleteObject callback instead of DeleteEntity
* SelectionDisplay player name display skips negative team number
	- Units briefly have a team number of -1 after being cleaned up
* ChunkEffect and Craft tolerate missing explosion classes
	- This happens when using content from the 0.7 beta demo
* TurretTank and TurretCraft update terrain ownership properly on team change
	- MAS Grenade revealed a flaw in the previous implementation 
* Fixed uninitialized values in Scheduleglue buildingtype 
* Pilots don't get stuck when the vehicle they're going towards gets destroyed
* Units ignore enemies carried by a Tug 
* Build menu can read the name of a weapon powerup from the weapon it gives
	- This is how the weapon powerup itself gets its name 
* Fixed SAV weapon pitch
* Fixed floating-point exceptions in Make_Poly and AddTerrainPoly
	- Tripped when a LIGHTING struct mapped to a float NaN
	- Copy LIGHTING structs instead of floats to avoid this
* Disable preload while loading the build menu
	- Prevents geometry cache from overflowing 
* ProximityMine ignores destroyed craft 
* Spread out MineLayer dispersal pattern
	- Spaces them 60m apart instead of 30m
	- Somewhat closer to the original 1.4 pattern
	- Reduces mine "fratricide" 
* Recenter mouse when switching to satellite view
* Added VO when the Minelayer starts and finishes laying mines
* Fail mission if the player vehicle gets sniped
* Don't let the player switch views during a cineractive
	- Prevents switching away from the post-death orbit camera
	- Avoids crashes in views that require a valid player entity
* Minelayer uses selectUser1Msg message while laying mines
* Improved how deployed units handle get repair/reload
	- Try to request the item without interrupting the current action
	- Don't spin around while waiting for the item 
* ArtilleryProcess uses direct fire whenever possible 
* Tug no longer drops cargo when going to get repair
* Center mouse when switching control modes
* Skip non-commandable units when selecting
	- Category (Ctrl-1, Ctrl-2, Ctrl-3)
	- Group (F1 through F10)
	- Avoids non-commandable units disabling commands
* Scrub non-commandable units from unit selection 
* Player-controlled APC can deploy only within 75m of an enemy target
	- It could previously deploy within 75m of a friendly target too
