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 * 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 " @ " . Overridden asset shows "! " * 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 - Set color value with /color - 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: produces a custom by shell map - /shellmap:, produces a custom by shell map * /largemap takes optional parameters - /largemap produces a large map with 8 pixels per grid - /largemap: produce a large map with 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 1.5.2.27 (2014-12-16) * Debug ParameterDB logs misplaced properties - Writes output to parameterdb.log - Eventually I want to fix the ODFs... * Fixed LuaMission Command and Receive crashing when no script is loaded * Building unblocks terrain before generating scrap * Back out changelist 1881 - Move strategic AI setup back to PreLoad - The change broke some missions * Clean up terrain edit mode when switching to any other view * Updated libvorbis to 1.3.4 * Updated libogg to 1.3.2 * Improved how strategic AI reads from builder ODFs - Allow an arbitrarily large number of buildItem entries - Allow buildItem entries to refer to builder ODFs (e.g. "b_amcmbt") - IMPORTANT SAFETY TIP: don't let the builder ODFs form a loop! * Resaved VS2008 project files - VS2008 rejiggered a few things * Removed whole program optimization from the Lua project - Internal and Release builds no longer crash when Decoda connects to them * PathDisplay Find Path mode shows more info - Time: path planning time in milliseconds - Dist: straight-line distance between path endpoints - Len: total length of the path * Shell system chat messages show timestamps when timestamps are on * Fixed extra spaces in player-entered system messages * Fixed path version of BuildAt - It now generates a 2-point AiPath like other BuildAt functions - Fixes Armory launching powerups to infinity and beyond 1.5.2.27 Update 1 (2014-12-17) * Strategic AI setup tolerates ODFs that aren't builders or game objects * Craft removes itself before generating scrap - Fixes Gun Towers not dropping scrap properly * AiMission Fail and Succeed call a shared End method - Truncates the file name and prints an error if it is too long - Prevents a buffer overrun that would crash the game * Fixed file system warning/error messages for 16-character filenames - 16-character filenames are not null-terminated * Fixed a compiler warning in LuaMission * Unlimited armor (bzbody) protects against snipe