BATTLEZONE 1.5.2 CHANGELOG
(Each release lists changes from oldest to newest, with descriptions pulled from the source control repository.)

1.5.2.1 (2013-02-28): 15th Anniversary Build!
* Misn09Mission: made turret setup around the CCA base reliable (submitted by Dx)
* Changed the horrible STRUCTURE2 audio to something better (submitted by Dx)
* Return focus back to the MapList for host selection (submitted by Dx)
* Updated Save/Load Shell (submitted by Dx)
	- Requires new "saveload.bmp"
* Updated Pop Up Shell window buttons (submitted by Dx)
	- Enabled WM_MOUSEMOVE
* NameDlgProc InvalidateRect IDC_EDIT_NAME (submitted by Dx)
* SaveDlgProc InvalidateRect IDC_EDIT_GAMEDESC (submitted by Dx)
* Made the selected paths a bit easier to read in the editor. (submitted by Dx)
* Improved game object selection
	- Uses the larger of bounding radius and collision radius
	- These correspond to the circles drawn around objects
	- Picks the object closest to the cursor
* Enhanced Edit Object mode
	- Show labels above objects that appear as an oriented box with circles
	- Highlight the object under the mouse cursor (rollover)
	- Reduced unintentional movement when clicking game objects
	- Use the point clicked on the game object as a "handle" when moving it
* Enhanced Edit Path mode
	- Show the path label over the first node (also with Show Paths)
	- Reduced unintentional movement when clicking path nodes
	- Use the point clicked on the path node as a "handle" when moving it
* Support getting team players
	- Assign remote players to TEAM_SLOT_PLAYER
	- Added GetPlayerHandle variant that takes a team
* Back-ported some ScriptUtils from BZ2
	- Set object team number
	- Modify and query team alliances
	- Get and set current health
	- Get and set maximum health
	- Get and set current ammo
	- Get and set maximum ammo
	- Add ammo
* Fixed up some scripting weirdness with Misn08Mission
	- AddObject was assigning objects to the wrong handles
* Updated ScriptUtil
	- Use TeamNum typedef more consistently for team numbers
	- Most functions taking a path name also take an optional point index
	- Added path variants of GetNearestObject, GetNearestBuilding, and GetNearestEnemy
* Preliminary implementation of LuaMission
	- AiMission framework for user-created mission scripts
	- Matches any mission file starting with "lua"
	- Reads the .lua script named after the mission (e.g. luatest.bzn reads luatest.lua)
	- Supported script functions: Load, PostLoad, Save, AddObject, Update
	- This has not been thoroughly tested yet...
* Revised LuaMission
	- Fixed problems with Handle lightuserdata
	- Now works with a real .lua mission script
* Added more ScriptUtils functions from BZ2
	- GetWhoShotMe
	- GetLastEnemyShot
	- GetLastFriendShot
* Added LuaCheckStatus to consolidate error reporting
* Added basic Lua serialization and deserialization
	- Supports nil, boolean, lightuserdata (handles), string, and table
	- Does not preserve complex reference structures like lua-marshal
* More LuaMission tweaks
	- Only call script Save and Load for save games
	- Added some comments to code
	- Debug build enables Lua os and io libraries
* LuaMission displays a message when it can't find a Lua script
* Switched to Lua 5.1.5
	- Lua 5.1 has better tool support than 5.2
* Spiffied up PathDisplay (Shift-F9 view)
	- Made it easier to click on small objects
	- Show menu item keys with sprites instead of [text]
	- Show item keys only for currently-selectable items
	- Show menu selection state using color
	- Use translucent backgrounds for unselected labels
* More PathDisplay tweaks
	- Hold right mouse button to rotate the selected object
. It turns to face the mouse position
. This was actually in the previous commit...
	- Placing a game object makes it the selected object
. This makes it easy to rotate
* LuaMission matches any mission with a corresponding .lua script
	- For example, it matches misn02l.bzn if misn02l.lua exists
	- This only applies when creating the mission in the first place
	- CAVEAT: it uses the msn_filename value (like Inst04XMission)
* Improved DistributedObject bandwidth throttling
	- Take reliable packets into account
	- Take UDP packet header overhead (40 bytes) into account
* SetAIP takes a team number argument
	- It defaults to 2 for backwards compatibility
* AIPs can control any team, not just team 2
	- This has not been thoroughly tested yet...
	- Controlling a player team will have unknown effects
* Fixed LuaMission::Save dropping the last data value
* Added more ScriptUtils functions from BZ2
	- GiveWeapon
	- IsDeployed
	- Deploy
	- IsSelected
* Made HasCargo safe to use with non-Tug units
	- Returns false in that case
* Improved how LuaMission gets and pushes Handle values
	- Push nil for a zero handle so Lua logic can test for it

1.5.2.2 (2013-03-02): emergency hotfix...
* Fixed AISchedule stuff crashing on starup in multiplayer
* Fixed incompatibility with older save games
* Howitzers check the flight path of their projectile

1.5.2.3 (2013-03-08)
* LuaMission updates
	- Call Setup from the constructor so it gets done in LoadDefaultMission too
	- Fixed the Lua script asset not getting unlocked when it failed to load or run
	- Made the absence of a Lua script a trace message instead of a dialog warning
	- Load but discard any saved Lua values when the script has no Load function
* Removed LuaMission::PostLoad since it was useless
	- Mission PostLoad functions only do handle conversion
	- Most script functionality didn't work when called from PostLoad
* Re-parented Inst04XMission, MultDMMission, and MultSTMission from AiMission to LuaMission
	- These are the three mission scripts that user-created maps are likely to use
	- They can now run Lua scripts in addition to their normal fixed-function logic
	- MP-related Init and Respawn functions have no Lua script hooks (yet)
* Added .odf and .lua to the misson extensions that crc32mission checks
* Display the Zoom Factor in the Editor (submitted by Dx)
* Strategic AI update
	- Replaced 32m "scheduler tiles" with standard 10m terrain grid
	- Manages the Construction Rig as an infinitely-reusable construction crew
	- Can build buildings in semi-reasonable locations
	- Doesn't know about power requirements yet :(
	- Continuously updates team base position
* Added all-in-one CMD_BUILD to Construction Rig
	- This makes it easier for the strategic AI to control
* Path Display (shift-F9) shows AI goals as colored borders
	- No goal: none
	- Defend base: bright green
	- Attack troops: dark red
	- Siege: bright red
	- Exploration: blue
	- Scripted (scrap): white
	- Perimeter: dark green
	- Recon: cyan
	- Resource: white
	- Other: black
	- Escort: dark grey
* More ScriptUtility functions
	- GetCurrentWho
	- HopOut
	- KillPilot
	- RemovePilot
	- HoppedOutOf
	- IsNetGame
	- IsHosting

1.5.2.4 (2013-03-13)
* PathDisplay updates
	- Show strategic AI goals and priorities for the build team if not default
	- Label resources as Team 1 and Team 2 instead of American and Soviet
	- Fixed build ODF teams beyond 2 appearing black
* Use aiName2 for any non-player team, not just team 2
	- This makes AI team production units go to geysers autonomously
* ParameterDB supports ODF sections like the BZ2 version
	- Prefer the label in the requested section
	- Look in other sections if it is not found
	- BZ1 ODF sections aren't always named correctly...
	- Debug build reports misplaced labels
* Use GlobalSetLocal for objects not belonging to a player
	- This fixes AI-controlled teams using the host's name and flag
	- This should also make them survive a host migration
* ParameterDB uses reference-counted shared data internally
	- Reduces redundant allocation, parsing, and freeing
	- Improves load performance
* Added int and bool ParameterDB::Get functions
* Fixed section validation for labels with no section
* Ported some GetODF functions from BZ2
	- OpenODF
	- GetODFBool
	- GetODFInt
	- GetODFFloat
	- GetODFString
* Don't run strategic AI on client machines
* Don't set up Lua if there's no Lua script
* Fixed Instant Action save games

1.5.2.5 (2013-03-14)
* ParameterDB no longer tries to resize its string pool
	- Its string pointers would become invalid if the pool moved
	- This fixes crashes when run outside the debugger
* Added more ScriptUtils functions from BZ2
	- GetPerceivedTeam
	- SetTarget, GetTarget
	- SetOwner, GetOwner
	- SetPilotClass

1.5.2.6 (2013-03-22)
* Fixed mistyped objective file name in misns1 (submitted by Dx)
* Removed AudioMessage for nonexistent sound in misns4 (submitted by Dx)
* Updated PathDisplay
	- Always show a label over the user object
	- Added a slight rollover effect for game objects
* Consolidated memory allocations in Numerical Recipes matrix creation functions
	- They were previously allocating a header and then one block per row
* Backed out revision 1404
	- GlobalSetLocal/GlobalSetRemote doesn't work well at runtime
	- It didn't solve the ownership problem for remote players
* Backed out GlobalSetLocal changes from revision 1403
	- These got rolled up into the big ParameterDB change
* Track team ownership based on team number instead of network player id
	- This works because each player is on their own team...
	- Disambiguates MPI AI teams from the host player
	- Non-player teams should migrate properly during host migration
* Destroying units on a non-player team counts as a kill
* Non-player teams display kill and death messages like player teams
* Removed unused team remapping feature from AiMission
	- Only MultDMMission ever used it
	- Increasing MAX_TEAMS made it obsolete
* 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
* GoodScrapPosition and GoodMinePosition take a region parameter
	- Updated RecycleTask (Scavenger AI) and MineLayerProcess accordingly
	- This lets them take region pathability into account
* Don't place scrap pieces in bad locations
	- ScrapField uses a non-region variant of GoodScrapPosition
* Try to make player-controlled APCs less exploitable
	- Only deploy when within 75m of a (potential) target
* Moved path spawn functionality into a shared PathSpawn class
	- Replaces separate copies in Inst03Mission and MultDMMission 
	- Added to Inst04XMission and MultSTMission
	- Fixed a few issues with it

1.5.2.7 (2013-04-07)
* Fixed a potential buffer overrun in PathSpawn
* Turned off DR_Debug memory allocation message spam
* Moved ParameterDB::FileData struct out of the header
* Turned off PARAMETERDB_REPORT_WRONG_SECTIONS
* Switched polygon collision to local space
	- Now works more like box collision
	- Fully supports animated models
	- Improves precision
	- Tested with buildings (though currently disabled)
	- Floor geometry still in world space
* Streamlined collision geometry structures
	- One memory allocation per collision geometry
	- Flat array of vertices, indices, and faces
* Added collision debug display
	- Toggle with cheat code "drawcoll" (type while holding SHIFT+CTRL)
	- Shows entity bounding box in grey
	- Shows other collision shapes in team color
	- Supports spheres (in theory), boxes, and poly
* Fixed crash when showing Goals or Priorities for a team with no strategic AI
* AI team checks relations when counting enemy buildings and units
	- It previously assumed all other teams were enemy :|
* BREAKING CHANGE: strategic AI requires opt-in
	- Single-player missions default to team 2
	- Multi-player missions default to none
	- SetAIControl function overrides default AI control
	- NOTE: this only takes effect during pre-load!
* Allocate strategic AI mapgrid goals from a memory pool
	- This speeds up initialization of large maps in Debug
* 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 material cost calculation
	- Derp de derp...
* Fixed cliff force for teams 3-15
* Fixed team ownership for team 15
	- SLAB_STRIP was stomping its ownership bit
* Fixed a crash in path editing
* Added new path editing features
	- Delete removes the selected path point instead of the last point
	- Holding control inserts points after the selected path point
* Fixed units on AI teams not counting towards kills
	- There's three different places keeping track of score...
* Prevent terrain access from reading outside the world
	- The world effectively "wraps around" at the edges
* Revised craft collision
	- Resolves interpenetration better
	- Reduce friction/stickiness of continous contact
* Reorganized how collision detection works
	- Simulation updates linear and angular velocity
	- Collision detection uses the updated values
	- PostSimulate applies collision response and sets final transform
	- This improves collision accuracy (especially continuous contact)
* Added GeomBox collision
	- Fixes some missed collisions
* BoxGeom doesn't assume that geom is stationary
	- It used to be but isn't any more :)
	- TO DO: make it more efficient
* Fixed CLASS_ID_VEHICLE not colliding with buildings
	- Collision previously required one entity use CLSN_TYPE_CAR
	- Vehicle load now preserves car collision data for CLASS_ID_VEHICLE
	- Collision will use that car collision data when necessary
* Combine identical vertices in the collision geometry
	- Ideally this would be done once as part of a shared structure
* Use GeomBox check for tall units in addition to CLASS_ID_VEHICLE
	- This is a hack to fix Walkers not colliding with per-poly buildings
* Fixed ConstructionRigProcess class crash in misn09.bzn
	- Handle CMD_STOP more like other producers
* Added extended teams (8-15) to the Build Team menu
* Fixed clients crashing when a player killed an AI team unit
* Inst03Mission supports Lua mission scripts
	- This allows play01.bzn to act as a Lua testing sandbox

1.5.2.8 (2013-04-09)
* Fixed editor setting the wrong build teams
* Fixed video mode switch changing camera settings
	- This particularly affected the terrain editor view
* Clamp visibility ranges to maximum far clipping plane
* Halved memory used by tile mix cache
* Updated terrain editor
	- Moved non-rendering functionality to Simulate
	- No longer changes view distance when switching views
* Deployed craft ignore collision and ordnance impulses
	- They are now as immovable as buildings :)
* Call PostSimulate for destroyed game objects
	- Updated PostSimulate to handle this
	- Fixes units "hanging" in midair when killed
* Fixed crash on exit when running a DM mission from the command line
* Fixed a crash in GotoTask when the path was NULL

1.5.2.9 (2013-04-14)
* SeismicWave can move floor-owning buildings
* Rolled back some terrain editor changes that broke things
* Updated terrain editor camera rotation
	- Turn rate is now independent of frame rate
	- Halved turn rate so the camera is more controllable
	- Reduced filtering so the camera is more responsive
* New ScriptUtils functions
	- IsValid: returns true if the handle is valid and false otherwise
	- IsDamaged: returns true if the handle is valid and the game object is damaged
* Scrubbed mission scripts of GameObjectHandle::GetObj and calls to GameObject methods
	- Replaced them with ScriptUtils equivalents (many of them new to 1.5.2.x)
* Clear out team-to-net-player map after the session ends

1.5.2.10 (2013-04-24)
* Fixed Torpedo double-speed movement
* Fixed ReticleDisplay when selectObj got deleted out from under it
	- It now uses a DeleteObject callback instead of DeleteEntity
* Added GetTarget accessor to Missile
* UnitTask evades ordnance at Very Hard difficulty
	- Sidestep incoming projectiles
	- Attempt to dodge homing missiles
	- Priority over line-of-fire evasion
* Added weaker line-of-fire avoidance at Hard difficulty
* Added random movement after being shot by an enemy
* Fixed SAV double-speed movement
* GroundCheck takes current time to impact into account
	- Now gets the earliest time to impact
* Updated PowerUp collision handling
	- Moved ground check into a protected method
	- Clamp time of intersection to a minimum of 0
	- Moved airborne collision landing to PostSimulate
* Updated Torpedo collision handling
	- Use PowerUp GroundCheck method
	- Clamp time of intersection to a minimum of 0

1.5.2.11 (2013-05-03)
* Updated UnitTask ordnance avoidance
	- Skip sniper shots since they're invisible
	- Take the unit's velocity into account
	- Take the ordnance's radius into account
	- Apply evasion properly in GotoForce
* SeismicWave sets its object radius to the wave radius
	- Units avoid its area of effect if they see it coming
* NetPlayer uses netPlayerByTeam to track used teams
* Fixed potential floating-point exception in PointVelPoly
	- If vd was denormalized, t could become infinity
* SelectionDisplay player name display skips negative team number
	- Units briefly have a team number of -1 after being cleaned up
	- This may fix the Font_Get_String_Dimensions crash seen in MPI
* ChunkEffect and Craft tolerate missing explosion classes
	- This happens when using content from the 0.7 beta demo
* Treat deploying and undeploying craft as immovable
	- Makes collision with them work better
* TurretTank and Producer have their own PostSimulate
	- Call HoverCraft PostSimulate while undeployed
	- Call Craft PostSimulate and discard collision otherwise
* PathSpawn handles save/load a bit better
	- Search for existing spawned items on startup
	- It still loses spawn delay timers, though
* TurretTank and TurretCraft update terrain ownership properly on team change
	- MAS Grenade revealed a flaw in the previous implementation
* Added MPI to the map filter list (use M in netmis.txt) [Dx]
	- Put map filter list in alphabetical order
	- Added new KOTH and MPI icons
	- Requires updated netmis.txt and the icons in the addon folder
* Turn off player smoke, dust, and engine effects while in edit mode
* 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
* Shell update
	- Renamed MPI-ST to "Mission" map type ('M')
	- Added MPI-DM as "Action" map type ('A')
* Updated project file with new mission type bitmaps
* Fixed SAV weapon pitch
* Added debug display showing hardpoint types and locations
	- Toggle with "showguns" cheat code
	- Color indicates slot: 1=red, 2=yellow, 3=green, 4=cyan, 5=blue
	- Letter indicates type: C=cannon, R=rocket, M=mortar, S=special
* Run simulation during a D3D device reset in MP
* Added cutoff distances for hardpoint and collision debug displays
* Disabled MP "death cam" view until I come up with something better
* Set KOTH icon back to king.bmp
	- Allows full backwards compatibility
	- Asset version can look different
	- Resource version is never used anyway
* Shell handles missing MPI icons gracefully
	- Use [D] if [A] is missing
	- Use [S] if [M] is missing

1.5.2.12 (2013-05-09)
* Changed multiplayer map filter names
	- Action to Action MPI
	- Mission to Mission MPI
* Compute damage-adjusted parameters on demand instead of caching them
	- Removing the object-local copies significantly reduces object size
* Fixed some compile warnings in HoverCraft
* Removed object-local copies of build item lists from Producers
* Streamlined Armory UpdateModeList
* Removed bumpers array from Craft and Powerup
	- Store a bounding box in the root object
	- Compute bumper positions on demand
	- Saves 6*3*4 = 72 bytes
* 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
* Changed how OBJ76 node hierarchy works
	- Use the more typical "parent" link instead of "back"
	- Advantage: getting the parent node is now a constant-time operation
	- Downside: detaching a node has to traverses the list of predecessor siblings
	- Speeds traversal up the tree (a relatively common operation)
	- Should allow a non-recursive implementation of tree-walk
* Streamlined obj_get_world_position and obj_rel_parent_position
	- Use vector transforms instead of matrix multiplies
* Moved some sound updates to PostSimulate (where position is up to date)
	- SAV inherits the HoverCraft version
	- TurretTank moves it to the non-UNDEPLOYED case
* HoverCraft uses (non-recursive) tree walk to process child nodes
	- Saved ~200 bytes by removing arrays of child object pointers
	- Update nacelles, fins, and flame and dust emitters in PostSimulate
* 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
* Fixed Lua library initialization
	- My homebrew version didn't work for some reason...
	- Exclude io and os libraries in linit.c instead
* Reduced GameObject memory pool slot from 1400 bytes to 1024
	- Enabled by size reductions committed in previous changes
	- Aligns with memory pages (4096 bytes) and cache lines (64 bytes)
* Properly NULL-terminate the LuaScriptUtils array
* Fixed damping constant in SAV
	- SAV rises and falls much faster (possibly too fast)
* Removed "deployed" check from DoCollision
	- Fixes Tug collision since it uses deploy for carrying cargo
	- TurretTank and Producer control their collision in PostSimulate
* Closing the window shuts down the network system properly
	- Fixes the player hanging around with 100% loss

1.5.2.13 (2013-05-11)
* Center mouse when switching control modes
* Fixed uninitialized variable in Producer::Load
* 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
* Producer and TurretTank save format compatible with 1.5.1.17

1.5.2.14 (2013-09-16)
* Player-controlled APC can deploy only within 75m of an enemy target
	- It could previously deploy within 75m of a friendly target too
* Fixed Scavengers crashing on non-player teams with no strategic AI
* Scavenger AI creates an escort goal in multiplayer
	- This should make AI-controlled teams work better in MPI
* Update GameObject color as part of ComputeVisibility
	- Ensures that team colors are always up to date
	- It's cheap enough that it's not worth being clever
* Workaround for assert when an object's team number is negative
	- These are removed GameObjects that have not been deleted yet
* LuaMission properly loads string and table types now
	- These never got tested properly... :P
* BuildingClass supports "portal" class label
	- Prevents an error when creating a portal building (e.g. cbport)
	- Doesn't actually implement portal behavior, though
* Added a Lua panic handler that shows an error dialog before exiting
* Lua error outputs a debug message in addition to showing a dialog
* Howitzer keeps Attack mode active when not deployed
	- Unit deploys immediately when told to attack
	- Lets mixed groups (deployed and undeployed) use the Attack menu
* Skip sending bomb to locked geysers (Dx)
	- Note: Should skip sending bomb to scrap
* Fixed Day Wrecker bug (Dx)
	- Skips Day Wrecker state update
* New ScriptUtils functions
	- AddMaxPilot
	- SetMaxPilot
	- AddMaxScrap
	- SetMaxScrap
* /largemap correctly handles 16-bit and 32-bit textures
* Added a cellTeamRef entry for team zero
	- Fixes crash when creating a team-hazard object on team zero
* New ScriptUtils functions
	- BuildObject taking a position vector
	- BuildObject taking a transform matrix
	- GetTransform/SetTransform
	- GetPosition/SetPosition
	- GetFront
	- GetVelocity/SetVelocity
* LuaMission supports vector and matrix types
	- All the new vector and matrix ScriptUtils functions
	- SetVector for building a vector from numbers
	- SetMatrix for building a matrix from numbers
	- Various operators for matrices and vectors
	- SaveValue and LoadValue handle vector and matrix values
* Continued scrubbing mission scripts of old-style calls (Dx)
	- GameObjectHandle::GetObj
	- Direct calls to GameObject methods
* In-game UI supports custom object and weapon names
	- Use (localized) sprite-based names when available
	- Use (currently non-localized) text-based names otherwise
* Mission files don't load or save unlabeled (AI-generated) paths
	- Eliminates a bunch of useless clutter
	- Mission files exclude AI state so these paths are never referenced
* Added IsCraft and IsBuilding script utility functions
* Added GetBase script utility function
	- Returns the base config of the object
  (which actually represents which model it's using)
* Person starts the "standing" animation when created
	- Should fix the randomly-occuring rotated first-person gun
	- Applied the same change to Walker for consistency
* ASCII string read no longer stops at the first space
	- It now reads to the end of the line
	- Fixes nav names getting truncated in misn04
* Misn11Mission fixes (Dx)
	- Fixed typo for camera
* Misn12Mission fixes (Dx)
	- Show Objective after the camera scene finishes
* Misn17Mission fixes (Dx)
	- Fixed 3 BuildObject typos "eggiezr1"
	- Fixed missing mines [MINE {10, 54, 55, 56}]
	- Fixed Damage on MINE[53]
	- Fixed Tower 7 name 
	- TODO: Fix in Sprite table
* Misn05Mission fixes (Dx)
	- Fixed Mine 16 and 24
	- Changed boltmines to team 2
* Misn06Mission and Misn07Mission fixes (Dx)
	- Fixed a crash if player died during the camera scene
* Added filtering and adjusted strength of AI evasion maneuvers
	- Should make it less unfair for players

1.5.2.15 (2013-09-30)
* Rolled back mission save/load culling unlabeled paths
	- It turns out that mission files DON'T exclude AI state...
	- Fixes crash when loading maps with AI state like Capt. Chaos
* New Vector Lua functions
	- DotProduct: dot product of two vectors
	- CrossProduct: cross product of two vectors
	- Normalize: scale vector to unit length
	- Length: length of a vector
	- LengthSquared: squared length of a vector
	- Distance2D: 2D distance between two vectors
	- Distance2DSquared: squared 2D distance between two vectors
	- Distance3D: 3D distance between two vectors
	- Distance3DSquared: squared 3D distance between two vectors
* New Matrix Lua functions
	- BuildAxisRotationMatrix: build matrix from angle and axis
	- BuildPositionRotationMatrix: build matrix from rotation angles and position
	- BuildOrthogonalMatrix: build matrix from up vector and heading vector
	- BuildDirectionalMatrix: build matrix from position and direction vector
* Split reliable broadcast messages into separate sends
	- The reliable broadcast queue can fill up if a player is unreachable
	- Subsequent reliable broadcasts would then fail
	- ...and a lot of important things use reliable broadcast
* Fixed a hang when using Texture32=1 in render.cfg
	- Did this ever actually work?
* Player list shows grey "?" for ping time of zero
	- When ping hasn't been done yet
	- When ping got 100% packet loss
* Keep Anet alive when leaving game and returning to shell
	- Only destroy Anet if quitting by closing the window
	- Fixes the shell blacking out
	- Problem was introduced back in revision 1540
* Fixed crash in UnitTask::UpdateWeapon when the unit has no active weapon
* Updated Load/Save dialog code
	- Fixed filter strings, which needed an extra zero byte at the end
	- Allow directory change for both missions and savegames
* Clear and rebuild player lists on entering the screen containing them
	- Should flush out any leftover player list entries
* Turned off per-polygon collisions for bullets
	- Should fix AI missing some buildings from some directions
	- Ideally targeting would use something besides the geometric center
* Damage no longer affects Person physics parameters
	- Restores the original and expected behavior
	- Person had code for it but never used it
* Detonate Torpedo when close enough to its target building
	- Prevents it from riding up over its target
* Turned off DEP on Dx's recommendation
	- Should allow the original Anet DLLs to work
	- Newer Anet DLLs don't time out disconnected players properly
* Many ScriptUtils functions accept position vector or transform matrix
	- SetPosition
	- GetDistance (second argument)
	- GetNearestObject
	- GetNearestVehicle
	- GetNearestBuilding
	- GetNearestEnemy
	- Goto
	- Mine
	- Dropoff
* Added BuildAt function for building at a specific location
	- Armory and ConstructionRig use the location
	- Recycler and Factory ignore the location
* Added some scrap management functions
	- GetRidOfSomeScrap: reduce global scrap to a set limit (default 300)
	- ClearScrapAround: remove scrap within range of location
* ConstructionRig SetConstructionMatrix cleans up input values
	- Snaps position vector to the floor height
	- Flattens facing vector to eliminate pitch/roll
	- Cleans up a lot of code
	- Should fix the satellite view "sinkhole" bug
* Added Start method to AiMission
	- Can use this instead of doing one-time start in Update
* Added matrix version of Dropoff
	- Only the Construction Rig can take full advantage of it
* BuildPositionRotationMatrix also accepts a position vector
* Added support for locking (and unlocking) team alliances
	- Allows mission scripts to preserve pre-set alliances in multiplayer
* Added Lua functions for getting terrain/floor height and normal
	- TerrainGetHeightAndNormal
	- FloorGetHeightAndNormal
* Use strrchr instead of strstr to find extension
	- Technically it should use splitpath...
* Remove extension from filename before opening mission save dialog
	- Prevents double extension (e.g. usrmisn01.bzn.trn or usrmisn01.trn.bzn)
* Ported GetCircularPos and GetPositionNear from BZ2
* Added variants of Find that take a config string
	- GameObjectClass, WeaponClass, OrdnanceClass, and ExplosionClass
	- Makes them less annoying to use
* Ported more ScriptUtility functions from BZ2
	- GetPilotClass: get pilot config from a game object
	- SetCommand: general-purpose set command for power users
	- GetMapTRNFilename: get name of TRN file for use with OpenODF
* Added Lua AiCommand table
	- Convert between command names and numeric values
* SetCommand uses a default priority of 1 like other command functions
* MultDMMission AddObject skips forwarding for neutral objects
	- Prevents neutral vehicles from getting an AI process
	- Fixes Z Monolilth's Revenge and other maps that spawn empty vehicles

1.5.2.16 (2013-10-05)
* Fixed an assert (and possible crash) in the net game dialog
	- Trying to call Timer to update the player list before Init is bad :)
* Fixed a stupid crash in Inst03Mission
	- It was creating a new pathSpawn every frame :|
* Fixed repair/reload for groups of deployed units
	- Queue repair/reload request if the armory is busy
	- Avoiding repeated VO message took some trickery

1.5.2.17 (2013-10-07)
* Pilots don't get stuck when the vehicle they're going towards gets destroyed
	- This time for sure!
* Fixed a dumb crash in ClearScrapAround :P
* Reorganized how the shell handles of map types
	- Now driven by a couple of data tables
	- Shuffled around the type list
* Fixed AiPath flavor of BuildObject not using terrain height
	- Nothing seems to use this function, though
* Fixed ClearScrapAround when called from Start
	- The Scrap range search structure hadn't been set up yet
* Added some script utility functions for wrangling AI units
	- CanCommand: the unit can be commanded
	- CanBuild: the producer is able to build
	- IsBusy: the producer is currently busy
* Armory properly handles BuildAt command
	- Internally works like the Construction Rig
	- Builds immediately when given a "where"
	- Otherwise waits for a Dropoff command
* Fixed a major buffer overrun in the map list
	- Triggered when a line in netmis.txt was over 100 characters
	- Overwrote global shell state causing all kinds of problems

1.5.2.18 (2013-10-17)
* Fixed NetGameDlgProc invalidating the rect of a nonexistent mapLabel
	- Why wasn't this crashing all the time?  :P
* Non-airborne PowerUps send state while moving
	- Covers sliding downhill and moving with a seismic wave
	- Keeps remote copies in sync
* Wait for the device reset thread to exit before continuing
	- Prevents its simulation from clashing with the main thread
	- Thread skips simulation if done waiting for reset
	- Should fix random crashes when switching between game and shell
* Imported AiMission DeleteObject from BZ2
	- Called whenever a game object gets removed
	- NOTE: it isn't quite symmetrical with AddObject
* Added ObjectsInRange Lua iterator
* Added more game object class script utility functions
	- GetClassSig: returns class signature string (e.g. "WING")
	- GetClassLabel: returns class label (e.g. "wingman")
	- GetClassId: returns class id
	- IsPerson: returns true if the object is a person
* Rolled back the Simulate/PostSimulate physics split
	- It caused too many problems with network code
	- Collision response doesn't seem particularly different
* Fixed remote objects sometimes exploding when they shouldn't
	- Particularly affected pilots and powerups
	- Send and receive code didn't match up
* Added a few more Lua script utility functions
	- GetLabel: returns the label of the object (e.g. avtank0_wingman)
	- AllObjects: iterator returning all game objects
	- AllCraft: iterator returning all craft (and pilots)
* Mission load errors out if the mission class can't be found
	- It previously crashed with no explanation

1.5.2.19 (2013-11-26)
* Select bzone16q.zix with Texture16=1 and LargeAssets=2
	- Eliminates the need to throw bzhw16q.zfs into addon
	- Prevents the HQ texture pack from crashing software rendering
* Use SetEvent to notify the device reset worker thread that the reset is done
	- Should fix the worker thread sometimes never exiting (and hanging the game)
* Person handles negative time of intersection properly
	- Fixes crash when two Person objects spawn on top of each other
* Core BuildObject function validates position
* Fixed "zombie" powerups sometimes respawning every minute
* Producers only update nacelles/fins/whatever while undeployed
	- Fixes CCA Recycler fins being in the wrong position
* ConstructionRig GetCommand uses SetConstructionMatrix
	- Ensures that the matrix gets properly sanitized
	- Reduces code redundancy
* Shell can tolerate maps with 10 character long filenames
	- The map itself may act up but the shell won't crash or fail
* Remove seismic wave when it departs valid terrain
	- Makes them work more like other ordnance types
	- Fixes a crash in Goomba's "Mystery Tower" map
* Fixed AI controller handling of longer mission names
	- Total filename can be 16 characters
* Improved raw mouse input handling
	- Should mouse acceleration be an option?
* Show an error instead of crashing
	- When a DM or ST map has no spawn points
	- When setting an AIP that doesn't exist
* Fixed SAVs not moving
* Construction blob draws properly with multiple camera views active
	- Submit was clearing the draw list so it only showed up on the first camera
* Converted ColorFade and LensFlare to GameFeature
	- They now show up in no-HUD (Shift-F5) view
* BounceBomb expires if its owner goes away
	- Should eliminate most cases of "ghost" tanks
	- This is "backup" when other mechanisms fail
* Fixed SAV moving at double speed
	- DoCollision also applies velocity
* Added ALLIE_IsLocked accessor function
	- returns value set by ALLIE_Lock
* MultGMMission doesn't mess with Net::Team
	- This mission type is currently unused
* Net game clients load the mission in parallel with the host
	- Greatly reduces startup delay for complex missions
	- Reduces chance of the client timing out if loading takes too long
* Improved team assignment in multiplayer
	- Value assigned in the pre-game lobby is only tentative
	- Assign permanent team number from spawn point packet
* Made player names in score system more reliable
	- Should fix spurious "Team <#>" in kill messages
* Walker AI "ShouldAttack" works more like other combat units
	- Should make them better able to defend themselves
* Fixed crash when restarting after saving a mission file
	- Restore the current working directory after saving
* Pilots launch from the Barracks properly
* Improved Scavenger handling of "pick up scrap" command
	- Skips straight to starting a ScavGotoScrap task
	- Lets the Scavenger pick up "locked" scrap pieces
* Added "GoD" cheat code (Non-Internet games only) (submitted by Dx)
	- for ease of development testing :P
* Fixed BounceBomb disappearing for the local player in multiplayer
	- It was pointing straight down into the ground
* Disable damage and lava heat in edit mode (Ctrl+A)
* Tracer doesn't switch to colored line LOD in hardware rendering
* Fixed file system sometimes returning the wrong version of an asset
	- It made LargeAssets=2 use the version of check.odf from bzone.zfs
	- How did this ever work?

1.5.2.20 (2014-04-07)
* Fixed file system sometimes returning the wrong version of an asset
	- It made LargeAssets=2 use the version of check.odf from bzone.zfs
	- How did this ever work?
* Fixed Trace message for faces missing textures
	- Was crashing due to a malformed format string
* CheckBoundary updates euler v_mag and v_mag_inv after changing velocity
	- This fixes HoverCraft probing an off-map position the next frame
* PathSpawn checks that the ODF is a GameObject
	- Filters out non-GameObject ODFs (e.g. build.odf)
	- Eliminates some assertions in debug
* FlagDisplay only draws flags for player-controlled teams
	- It no longer draws colored squares for AI-controlled teams
* Apply brightness gamma to 16-bit and 32-bit textures
	- Makes them consistent with 8-bit textures
	- Upconvert 16-bit to 32-bit if Texture32=1 in render.cfg
* Fixed minor typo seen in output window [Dx]
* Editor for MultiPlayer (DEBUG build only) [Dx]
	- Enabled Ctrl-A, F9 modes
	- F10 mode (use god cheat code)
	- SIM_APPNAME shows Debug
* Fixed crash when using 32-bit textures
* RemoteDetonator doesn't need permission to detonate :)
* SeismicWave uses sequence numbers to vary up shake
	- Prevents units from all moving the same way
* Fixed editor data from going off screen [Dx]
	- Edit Task data is easier to read
* Added UnitTask Follow Distance [Dx]
	- Removed Dir.x
* Added engage range for the Gun Towers [Dx]
	- Edit Task shows white circle around Gun Tower when selected
* Restrict engage range to sig == CLASS_TURRET [Dx]
	- only Gun Towers show the engage range
* LoadSaveGame functions handles file paths with '.' in them
	- Filename would be truncated at the first '.' after the first save
* Fixed a minor compile warning in GechProcess
* Mission Archives screen shows planet description
* Renamed Score.cpp class Player to ScorePlayer
	- Debugger confused it with the Shell.cpp class Player
* NetPlayer::SetTeam rebuilds the netPlayerByTeam array
	- Allows recovery from team number collisions
* Updated AdjustedScrapCost and AdjustedPilotCost
	- Affect only the player's team in single-player
	- AdjustedScrapCost reduces scrap cost by 2 for Very Easy (versus 1 for Easy)
* Fixed a potential divide-by-zero in Targeting
* Disabled "drawcoll" and "drawguns" in non-Debug multiplayer
* Updated AI utility functions finding enemies/threats
	- Exclude "not enemy" instead of "friend"
	- Restores pre-1.5 behavior of ignoring neutrals
	- Also exclude indestructible objects
* RKillMessage gets player names from NetPlayer instead of Score
	- Non-player teams will appear as Team <number>
* Defined out the "new" Score system implementation
	- It wasn't used for anything except player names in kill messages
* Host sends an "assign team" packet to joining players
	- Host has more complete information about player teams
	- Should help prevent players ending up on the same team
* Use defined constants for launch, no-launch, and host-launch packets
* Shell chat edit boxes allow up to 241 characters
	- That's the longest message that fits into a chat packet
* In-game chat edit allows up to 240 characters
* Snipe packet sends shooter team
	- That's what HandleSnipe wants anyway 
	- Fixes a (rare) crash where the shooter can't be found
* Added [BounceBombClass] bounceRatio property
	- Defaults to 0.5 (like stock)
* Added angular velocity accessors
	- SetOmega sets angular velocity
	- GetOmega gets angular velocity
* Fixed Lua GetPosition for path/point arguments
	- It was trying to read from the wrong argument "slots"
* Main loop saves and restores the current working directory
	- This is a bit of extra protection
* SetObjectiveName on SAV at mission start [Dx]
	- Overrides "Data Disk"
* Forced ccaturret2 to deploy [Dx]
* Removed float from GetScrap [Dx]
* Integrated AudioSys changes from BZ2
	- Shut down all sound channels before cleaning up OggManager
* Integrated OggManager changes from BZ2
	- Each Ogg stream thread gets its own critical section mutex
	- ...not that this makes any difference for BZ1
* Added [AnimatedScrounge] Type4, Type5, Type6, and Type7
	- There's 8 slots so there might as well be a way to set them all
* Increased vertex limit per face to 32
	- Allows some of the more complex custom models to work
* FlareMine emits projectiles in a radially symmetric pattern
	- The original emitted projectiles in a distinct "fan" pattern
	- This is more noticeable with high shotVariance
* Changed POINT_3D Vertex to 32 [Dx]
	- Prevents a crash in software mode
	- Note: Face is out of position except when looking at the edge of the FOV and needs fixed
* Cache_Render_Bsp_Poly uses MAX_VERTICES_PER_POLYGON
	- Better to use a symbolic constant than a numeric constant :)

1.5.2.21 preview 1 (2014-05-10)
* Fixed psychedelic colors at lowest monitor brightness
	- The value was off by one so the lowest value was out of range
	- Colors used part of the default palette as a gamma table (!)
* Fixed crash when aborting a mission and jumping to another mission
	- Post-load was using positional audio while waiting for load VO to finish
	- The camera owner wasn't set up properly yet so the listener crashed
* Reset "drawguns" and "drawcoll" cheats during Init
	- Prevents them from carrying over into multiplayer
* Fixed a potential divide-by-zero in Reticle::FindReticleObject
* Removed the artificial 100 FPS cap in net play
	- It was added to work around problems at high frame rates
	- Those problems have been fixed so the cap isn't needed any more
	- TO DO: make the cap an option in render.cfg?
* Producers and animated buildings update their entity bounding spheres
	- Helps prevent bullets from missing the collision geometry
* SupplyDepot and RepairDepot can play a deploy animation
	- It works just like PowerPlant :)
* Box collision works better in PointHierarchyCheck
	- Skip the bounding sphere pre-test since it fits the geometry, not the box
	- Avoids bullets passing through box collision outside the bounding sphere
* Revised per-child collision in IntersectGameObject
	- Handled separately from simple (sphere) collision
	- Uses AABB pre-test instead of sphere to reduce chance of missing box collision
	- Seems to eliminate cases where bullets pass through collision geometry
* Fixed ordnance bounding box calculation
	- Sorts minimum and maximum values properly
	- Moved the calculation to a utility function
* Added support for showing chat message times
	- Enable with /times or /times on
	- Disable with /notimes or /times off
	- Disabled by default
* Added in Game Controls to cheat code [Dx]
	- Hold Ctrl+Shift & Type
	- Reverse Mouse   flip
	- Target Lead     aim
	- Auto Level      level
* Fixed building area coverage in BlockCells 
	- Building terrain cells should fit a lot better now
* GoNear task (and its derivatives) shows its radius in shift-F9 view
* Updated the Go Near distance of several AI tasks
	- Scavenger GotoDrop and GotoRepair
	- Construction Rig UnBuild
	- Should reduce chances of those units getting stuck

1.5.2.21 (2014-07-10)
* Automatic leveling works properly for remote players
	- Fixes remote Flash cannon not aiming properly 
* Added a Lua package loader that uses the Battlezone asset system
	- Scripts can now import modules from files in addon or pack files
	- Standard Lua package loaders should still work
	- See http://lua-users.org/wiki/ModulesTutorial 
* Support maps larger than 80 zones
	- NOTE: especially large maps can take a long time to initialize 
* Fixed incorrect references to Wil Stahl and Willie Rosas' dedications
	- This has been broken since at least version 1.3
	- FEARTHEMANOX - IAMWILLIEROSAS 
* Added GetAIControl
	- Returns true if the team is AI-controlled
* NetPlayer destructor uses GetAIControl instead accessing AI teamdata directly 
* Don't perform automatic team slot reassignment for producers
	- Should improve compatibility with 1.4 Instant Action maps
	- This will need testing... 
* Poppers only attack enemies
	- Restores original 1.4 behavior
* Craft GetCommand no longer excludes neutral objects
	- Disables changes from revision 124 and 725
	- This restores most 1.4 behavior for those objects 
* Fixed crash in UnitTask AbleToHit if the weapon was NULL 
* Improved shell pre-game lobby for non-host players
	- Fixed map list showing "Unknown" after leaving and rejoining
	- Fixed excessive mission CRC checks on entering 
* Delay "waiting for network" phase until after post-load
	- Should fix a rare crash when receiving an ordnance packet before simulation was ready 
* Added more debug trace for crc32game and crc32mission
	- Helps identify the cause of Check CRC and Mission Version mismatches
* Pre-game lobby shows Version and Mission CRC up top 
* Renamed bzone.log to debugcrt.log - It contains output from the debug C runtime 
* zixBuildIndex logs to zixindex.log
	- Show active ZIX file (e.g. bzone16q.zix)
	- List asset files and their sources
. Active asset shows "<name> @ <source>"
. Overridden asset shows "! <source>" 
* Use plain strcmp for zfs name comparisons
	- This method produces results sorted in normal alphanumeric order
	- The "fast" method produced results sorted in byte-scrambled order
	- Modern machines are fast enough that it doesn't matter 
* CRC32 functions support logging to file 
* Shell logs asset CRC checks
	- Check CRC logs to crc32game.log
	- Mission CRC logs to crc32mission.log
	- Helps diagnose asset mismatches mismatch
	- Tip: look for entries with unusual locations
. Example: abhqcp.odf b3a1697f (addon\testluadev) 
* Fixed AI scheduler initializing twice when loading default mission
	- It would pop up an error dialog, halting the loading process
	- Cases where this came up: loaded .TRN, missing .BZN, /nobodyhome option 
* Added centralized system for console output
	- Mono Debug now uses the centralized system
	- /console command line option shows debug output console 
* LuaMission prints to the console window
	- White for print output
	- Yellow for error output (+ warning dialog)
	- Red for panic output (+ error dialog) 
* GiveWeapon can remove a weapon from a slot
	- Must provide a valid slot index
	- C++: pass NULL or "" as the weapon name
	- Lua: pass blank, nil, or "" as the weapon name
* Fixed "Target Drone" moving too early in training mission 2
	- Code that built an AI command but never sent it got turned into a Goto call
* Use aiName for team 0 instead of aiName2
	- Prevents neutral producers from seeking geysers automatically
	- Should fix with CCA mission 7
* Added new objective-related script utility functions
	- UpdateObjective: change the color of an existing objective
	- RemoveObjective: remove an existing objective
* Added [SprayBombClass] bounceRatio property
	- Defaults to 0.5 (like stock)

1.5.2.22 (2014-07-20)
* LuaMission Save/Load update
	- Properly handle nested tables
	- Added debug trace messages
* Upgrade LZO library from 1.08 to 2.08 [Dx]
	- Removed unused files
	- Updated Project file
	- define LZO_ALIGN in lzo.h
* Fixed compile error in MakeZFS with the new LZO 2.08 lib
* Eliminated flickering/flashing in the shell
	- Handles WM_PAINT and WM_ERASEBKGND messages correctly
	- Multiplayer pre-game lobby benefits the most
* Fixed Tug DEPLOYING animation
	- Don't wait for the animation to finish before loading the cargo
* Cleaned up multiplayer shell layout
	- Adjusted rooms, players, and games list box sizes
	- Right-justify numeric values (ping, loss, players, maximum)
* Support chat text colors
	- Feature disabled by default
	- Enable with /colors or /colors on
	- Disable with /nocolors or /colors off
	- List color values with /color
	- Get color value with /color <name>
	- Set color value with /color <name> <r> <g> <b>
	- Save color values to shell.ini with /color save
	- Load color values from shell.ini with /color load
* Shell remembers settings
	- System messages on/off
	- Message times on/off
	- Message colors on/off
	- Stored in shell.ini
* Fixed a logic error in the NetPlayer destructor
	- Introduced in revision 1759
	- Was removing objects on AI-controlled teams instead of player
* Shell handles custom cursors properly
	- Set cursor image in response to WM_SETCURSOR events
	- Disabled code setting system cursors in release build
* Fixed satellite view crashing when the user entity went away
	- This could happen even if the view had never been opened
* TargetCam shows unit first-person view only when mutually allied
* Mission Version checks custom mission assets listed in a .dep file
	- Asset filenames separated by commas, spaces, tabs, and/or newlines
	- Same general format as check.odf
* Added TraceWarning function
	- Logs to console window in yellow
	- Indicates something unusual but generally safe
	- Geometry repair
* Added TraceError function
	- Logs to console window in red
	- Indicates something that will cause problems
	- Missing class ODF or class ODF with unknown classLabel
* Print errors for missing VDF/SDF
* Print warnings for missing chunk or ordnance GEO
* Print warnings for missing assets
	- These are also logged to symlog.txt
* New script utility functions
	- GetWeaponClass: returns the ODF name of the weapon in a given slot
	- GetNation: returns the single-character nation code
	- StartSoundEffect: play an arbitrary sound effect
	- StopSoundEffect: stop an arbitrary sound effect
* Fixed looping sounds getting incorrectly discarded if too far away
	- Distance check was being done before the looping flag was set

1.5.2.23 (2014-07-26)
* Fixed rendering in shell multiplayer pre-game screen
	- Important safety tip: hide old controls before showing new ones
* /color load prints the correct message
* Fixed MultGMission crashing when one team scores
	- Anet dpSent added data after the packet, corrupting the stack
* Made team and odf parameters optional in CountUnitsNearObject
* Fixed invisible OK and Cancel buttons on the Load/Save screen
* MapList updates the Mission CRC label
	- Fixes client seeing the CRC as 00000000
* Vehicle name label updates properly
* Fixed memory corruption when using Modem transport
* Window title includes the build number
	- e.g. "Battlezone 1.5.2.22"
* Fixed potential use of uninitialized var in AIP parser
* Fixed crash in AttackTask after loading state with no attackGroup
	- Not sure how it got into that state, though... :|
* Fixed /help commands in MP chat
* Revised Net user-defined message handler
	- Added dpid "from" parameter
	- No longer receives system-defined packets
	- Updated MultGMission to work within the new limitation
* LuaMission supports network Send/Receive
	- Send: send user-defined packet to recipient(s)
	- Receive: called when a user-defined packet arrives
	- From/to values are player team numbers
	- Packet type is a single-character string
	- Packet data is an arbitrary string up to 241 characters long
	- Lua converts non-string values to strings for transmission
	- Lua string library can create arbitrary strings from numbers
* Mission game object events
	- CreateObject: called for any new game object
	- AddObject: also called for game objects loaded from a mission file (BZN)
* Mission net player events
	- CreatePlayer: called when a player joins the session
	- AddPlayer: called when a player finishes loading and starts running
	- DeletePlayer: called when a player leaves the session
	- Lua versions get called with player id, player name, player team
* Lua networking functions
	- Send: "to" parameter takes a network player id (nil or 0 for broadcast)
	- Receive: "from" parameter gets a network player id (0 for system)
* New Lua script utility function
	- DisplayMessage: appends a system message to the chat window
* Create the Net system after PostLoad
	- Mission script accepts CreatePlayer events by then
* Do PostLoadGame after creating the Net system
	- Fixes an assert caused by the previous checkin

1.5.2.24 Preview (2014-08-10)
* Fixed more net-related asserts
* Integrated LuaBitOp 1.02 into Lua
	- Automatically enabled as part of Lua
	- Provides a variety of bit operations (hence the name)
	- http://bitop.luajit.org/index.html
* New Lua script utility function
	- SetLabel: change the label of a game object
* GameObject GetLabel and SetLabel use const char *
* Fixed Building::DamageAlloc rounding damage down
* Building::DamageAlloc works like Craft version
* Health-related ScriptUtils functions use float values
* DayWrecker supports direct-impact damage
[DayWreckerClass]
damageBallistic = 0
damageConcussion = 0
damageFlame = 0
damageImpact = 0
* Torpedo supports direct-impact damage
[TorpedoClass]
damageBallistic = 0
damageConcussion = 0
damageFlame = 0
damageImpact = 0
* Tweaked PowerUp landing logic slightly
	- Check terrain height, not floor height
	- This makes DayWrecker collision work properly
* Remote damage packet supports damage types and team
	- Not used for anything (yet)
* Added support for team-based spawn points
	- Zero team allows any player team to spawn there (like before)
	- Other team allows only that player team to spawn there
* Fixed Version and Mission CRC labels overlapping "READY TO LAUNCH" label
* Call GameFeature and DisplayInterface PostLoad after Net setup
	- Net setup creates the player unit (and Recycler in ST)
	- CommandPanel shows Factory, Armory, Constructor, and Satellite entries again
* Fixed current working directory when saving terrain
	- The file requester modified it and made the save fail
* Show an error for missing mission, save, or terrain file
	- Provides better feedback about which file is missing
* Added Lua "warning" function
	- Works like "print" but outputs yellow text to the console window
	- Changed error messages to red
	- Changed panic messages to magenta
* Added Lua GameVersion global variable
	- Contains current build version (e.g. "1.5.2.23 Preview 2")
* New script utility functions
	- IsLocal: returns true if the game object is local
	- IsRemote: returns true if the game object is remote
* Removed LuaMission "started" flag from mission save (BZN)
	- Missions by definition have not started when loaded from BZN
* Bumped save verson to 1045
	- BZN format is equivalent to 1043
* Use LuaMission as a substitute for missing mission classes
* Allow loading of of TRO mission files (BZN)
	- Mission versions 2000-2004
	- Skip over Craft cloak values
	- Skip over Portal state values
	- Skip over ConstructionRig lastRecycled value
	- Don't read Scavenger scrap held
* Backed out revision 1264
	- APC can reload at an undeployed Recycler again
	- Restores original 1.4 behavior
* DEBUG_systemWarning and DEBUG_systemError also output to console
	- DEBUG_systemWarning outputs red text indicating an error
	- DEBUG_systemError outputs magenta text indicating a fatal error
* Fixed MonoDebug page switch pushing additional consoles onto the stack
	- This prevented it from restoring the debug console
* Cleaned up mission class fallback
	- Print a console error message instead of showing an error dialog
	- Create LuaMission directly instead of searching for it
* Clear user_controls game key on entering escape screen
* Added LuaMission script utility functions
	- GetTimeNow: get local system time in milliseconds (good for profiling)
	- GetTimeStep: get the simulation time step in seconds
	- SelectedObjects: get iterator returning selected objects
* Added LuaMission supports game keys
	- GameKey: called when a game key gets pressed
* Added LuaMission global variable
	- LastGameKey: holds the most recently pressed game key
* SetCurHealth and SetMaxHealth update healthRatio
	- Only AddHealth did this before
* SetCurAmmo and SetMaxAmmo update ammoRatio
	- Only AddAmmo did this before
* Disabled code in Building constructor snapping it the ground
	- It's redundant and interferes with some custom maps
* Fixed some issues with DEBUG_systemWarning and DEBUG_systemError
	- Both append a newline to the message string
	- DEBUG_systemError was writing output before generating the text (oops)
* Removed now-redundant print in LuaCheckStatus and LuaPanic
	- DEBUG_systemWarning and DEBUG_systemError handle that
* Fixed LuaMission not calling Start for earlier mission versions
* Missing transparency and alpha table messages include file names
* Added /help command to in-game chat
* Prevent Day Wrecker and Torpedo from doing direct damage more than once
* Added team slot script utility functions
	- If not given a team number, these use the local player team
	- GetTeamSlot: get the handle of the object in a team slot
	- GetRecyclerHandle: get the Recycler handle
	- GetFactoryHandle: get the Factory handle
	- GetArmoryHandle: get the Armory handle
	- GetConstructorHandle: get the Constructor handle
* Added Lua global table for TeamSlot values
* Fixed up GetTeamSlot functions
* Fixed a typo in the "GetFactoryHandle" Lua binding

1.5.2.24 Updated (2014-08-11)
* Fixed Mines not snapping themselves to the ground
	- Turns out the Mine constructor had never done it right...

1.5.2.24 Re-Updated (2014-08-12)
* Added SetLocal script utility function
	- Sets the specified game object as local
	- Transfers ownership if the object was remote
* Update Mine position after it snaps itself to the ground
* Removed redundant set position from Building constructor
* Enhanced LuaMission Send and Receive
	- Can send an arbitrary number of data values
	- Preserves data types instead of converting to string
	- Converts game object handles

1.5.2.25 (2014-09-17)
* New script utility functions
	- GetAIP: get the name of the current AIP for a team (default team 2)
	- GetObjectiveName: get the player-visible name of a unit
* Added chat command script event handler
	- Shell and in-game chat system pass unknown commands to the script
	- Command function receives the command and parameters (if any)
	- The function should return true if it handled the command
* Extended gamma table to 11 entries
	- Brightness slider covers 11 values (0 to 10)
	- Fixes glitchy rainbow colors at maximum brightness
	- Gamma scale 1.0 is at slider setting 3 again
* Zone manager handles missing HGT and MAT files
	- HGT: fill terrain with height value from TRN
	- MAT: fill terrain with unrotated solid material 0 variant A
	- Show a recoverable error dialog when not using /edit
* /shellmap and /largemap work again
	- Initialization order again... :|
* Weapons set their owner's carrier in the constructor
	- Avoids a brief window where the carrier pointer is NULL
* New Lua script utility functions
	- GetIndependence: get the independence level of a unit (0=low, 1=high)
	- ObjectiveObjects: get iterator returning objects with objective markers
* Reduced size of BSP_POLYGON struct from 68 to 48 bytes
	- Changed member values to BYTE where appropriate
	- Changed texture name to a pointer to the geometry texture name
* Fixed an invalid floating point exception in EvadeOrdnanceForce
	- Triggered by a projectile with zero damage and a unit with zero health
	- Most likely culprit was a TAG Cannon leader round
* Added a hack to make AI units avoid the TAG Cannon leader round
	- Treat it as a projectile that does a lot of damage
* TOGGLE_OBJECTIVES_DISPLAY game key works in multiplayer
* /shellmap takes optional parameters
	- /shellmap produces a standard 108 by 89 shell map
	- /shellmap:<N> produces a custom <N> by <N> shell map
	- /shellmap:<X>,<Y> produces a custom <X> by <Y> shell map
* /largemap takes optional parameters
	- /largemap produces a large map with 8 pixels per grid
	- /largemap:<N> produce a large map with <N> pixels per grid
* Snap scrap pieces to the ground
	- Also align scrap with the surface normal
	- Fixes floating scrap in Canyon Madness
* Added safety checks to TeamSwitcher (MAS Grenade)
	- Don't affect game objects with invalid team (-1)
	- Don't affect game objects marked as destroyed
	- May fix an occasional crash reported on the forums
* Chat supports "to allies" destination
	- Sends whisper packet to all allied players

1.5.2.26 2014-10-26)
* Removed obsolete mission scripts from the project
	- Mult01Mission, Mult03Mission: replaced by MultDMMission
	- Mult02Mission, Mult04Mission: replaced by MultSTMission
* Fixed problems when switching vehicles in the pre-game shell
	- Vehicle description redraws itself properly
	- Eliminated flash/glitch in the upper left corner of the screen
* Don't get a kill for destroying an ally or yourself
* Fixed NetPlayer issues in non-DM multiplayer
	- Start time was getting set continuously
	- AddPlayer was getting called continuously
* EXPERIMENTAL: defer strategic AI setup to PostLoad
	- Should improve handling of non-standard Recyclers
* Fixed objects moving too fast in multiplayer above 500 FPS
* Added coeffDrag to HoverCraftClass
	- Defaults to the original hardcoded value of 0.01
