FORTS – Update 1.15

G’day Forts fans! We’re happy to announce a massive update to the game. We’ve been slogging away in the background making many improvements to the experience. A long list of fixes address common issues, and we’ve added some new features for modders to take advantage of.

Headline items:

  • Greatly improved performance
  • Fast initial battle loading
  • Multi-monitor support
  • Monitor refresh rate support
  • Overhauled windowed mode
  • Featured replays
  • In-game crash and desync reporting
  • Automatic deletion of old files

We’ll be using the featured replays to highlight competitive or otherwise entertaining battles. New players are encouraged to watch these to get useful tips on how to up their game. If you want to submit a replay for consideration, contact us at the Official Forts Discord server.

As with any update there may be some teething issues. Let us know if you come across any problems. The Discord is the best way to talk to us, or post in the bugs discussion.

Special thanks go to Romerolagus, Ximsa, 42 scientist, BoberetoGaming, Joepocalypse, KingBenjai, Endo, and General Miau for their invaluable assistance in testing this update.

Build 2018-12-06a Changelist

Add: target monitor can be selected (primary by default)
Add: moveable, resizeable windowed mode
Add: preload textures in background to reduce initial load period
Add: refresh rate selection included in resolution list
Add: featured replays are downloaded automatically, with notification on main menu
Add: options to automatically delete old files (default to 4 weeks)
Add: allow reflection to be modified on a material per projectile basis
Add: hide news items if the ‘start campaign to learn’ tip is visible to avoid overwhelming new players
Add: DamageMultiplier applies between projectiles in air-to-air collisions
Add: resume button to campaign instant replay
Add: a weapon script ProjectileAngle function for predictable angle offsets
Add: Replace WeaponRequiresSpotter and WeaponIsSpotter with dynamic queries to automatically handle new weapons
Add: SmallArmsPrioritiesExclude and HeavyArmsPrioritiesExclude to prevent some weapons being targeted by AI (e.g. sandbags and derrick)
Add: save window position into settings (save config on exit to retain this)
Add: checkbox to center window on start
Add: non-sequential tab stops can be used to support lists
Add: invisible and disabled tab stops are skipped to support duplicate ids on different tabs
Add: tab stops for resolution, key binding, language and keyboard list items
Add: allow difficulty levels to be set in the mission script:
AIDifficulty = { Easy = 0.1, Normal = 0.4, Hard = 0.8 }
Add: HUD buttons to force weapon placement left, right, or auto
Add: update Fmod version to 1.10.09
Add: DeflectedByTerrain for projectiles and beams to reflect off terrain
affected by VariationFactor and SpeedLossFactor
Add: allow a projectile to execute an action on reflecting from a specific terrain/material surface
if the reflection fails then return a value and perform damage and impact effect instead
Add: allow beams and projectiles to trigger EMP on intersecting doors and devices, including when EMP radius is 0
Add: support EMP beams disabling missile guidance
Add: support projectiles having a preferred up (FlipSpriteFacingLeft flag)
Add: allow projectiles to survive under the world bounds
Add: crash files can be send to devs from within the game
Add: dynamic main menu for news, links and featured YouTube videos
Add: enable edge scrolling in windowed mode when Direct Input is in use
Add: lasers blocked by shields open doors at the reflected angle
Add: hotkeys for weapon facing (Ctrl + Q, Ctrl + W, Ctrl + E)
Add: performance stats after game: fps, tick time, physics time, AI time, checksum time
Visibility can be controlled with Performance.LogLevel in db/constants.lua
Add: ReflectDamage factor to allow projectiles to impart damage to structure upon reflection
Add: uncomplied commander.lua scripts to ease modding of commanders
Add: Mods.VerboseLogging constant to allow modders to see what files are being searched for
Add: AI.DebugLevel to control when AI shows config and detailed logging from constants
Add: Performance.LogLevel to control where to log profiling to
Add: AntiAir damage multiplier for beams to adjust damage applied to projectiles

Balance: increase Firebeam aiming arc
Balance: reduce build cost of 20mm from 650/4500 to 600/4000
Balance: some additions and reordering of AI targeting priorities
Balance: decrease stddev of cannon by 30% and remove drag of cannon and 20mm cannon
Balance: remove splash damage of repair station
Balance: reduce running cost of repair station by 20% (20 -> 16)

Optimise: calculation of min and max fire radius
Optimise: remove temporary string parameters from GetProjectileBlueprint*
Optimise: remove redundant GetType calls from Device::GetCentre*
Optimise: PhysicsManager::IntersectBeam only needs to do PointInGround test for first segment
Optimise: Vector3D::DistTo and DistSq ignores z coordinates
Optimise: TerrainManager::PointInGroundGroup does circle test first
Optimise: don’t update bracing plate sprite in PhysicsManager::DrawNode
Optimise: coarse bounding circle test for projectiles intersecting with beams
Optimise: cache AimingDisruptionMax rule for Weapon::GetMinFireRadius and Weapon::GetMaxFireRadius
Optimise: only preload ambient environment effect on World start
Optimise: DeviceEditor::AimSlave avoids unnecessary call to IsAbleToFace if the slave is facing the same direction as master
Optimise: AimWeapon doesn’t recalculate can face left/right if noPanning is true
Optimise: Weapon::FindDoor operates progressively, storing state in FindDoor
Optimise: Weapon::FindDoor uses LinkFilter team to limit the search
Optimise: added mMaterialReplacement to avoid searching for standin link to discover new material in PhysicsManager::DrawCladding
Optimise: removed checksum on fire segment temperature
Optimise: reduce outer loop of ReactorsClaimForts::Apply when looking for ground device needing conversion
Optimise: combine search for specific team and any closest device in ReactorsClaimForts::WithinRangeOfMarkedGroundDevice
Optimise: avoid recalculating up and right vectors in SpriteEdging::Draw
Optimise: DeviceManager::PreviewStructureOverlapInBackground and PhysicsManager::RecessOverlappingStructure intersects with other teams
Optimise: build lists for each structure/material to streamline rendering of struts, cladding and fire
Optimise: CladFoundations enumerates links of fromNode instead of testing every node
Optimise: remove unnecessary calls to UpdateCladBothSides
Optimise: DeviceManager::AddDeviceObstructions only needs to add edges facing the source
Optimise: TerrainManager::AddTerrainObstructions only needs to add edges facing the source
Optimise: PhysicsManager::GetVisibleAngles uses mPrimary flag instead of mVisited to add struts only once
Optimise: PhysicsManager::AddObstruction exits early if there are no angle brackets
Optimise: DeviceManager::DeviceInGround detects intersection with specific ground block before testing it in detail
Optimise: remove Device::mPositionGraphical from simple data area
Optimise: TerrainManager::DoesCollisionBoxIntersectWithGround remove PointInGround center point test
Optimise: TerrainManager::DoesLineSegIntersectWithGround remove PointInGroundGroup test
Optimise: bake IsLineSegOutsideExtents epsilon addition into extents, and pass in block reference
Optimise: bake static ground filling and edging into display lists
Optimise: don’t calculate teamIndex in DeviceManager::DrawDevices unless necessary
Optimise: build lists of fixed and dynamic nodes, and use in DrawNodes to simplify inner loop
Optimise: minor improvements to DrawNodes and DrawNode
Optimise: minor improvement to DrawCladding
Optimise: spotters in Weapon::UpdateSpotter() aren’t updated for AI or when spotter efficiency is 100% already
Optimise: multi-threaded physics, structures and projectile updates are dispatched to cores as work completes
Optimise: move mMicroStepForce into complex data, as it doesn’t need to be serialised
Optimise: move projectile oversamples into the inner loop to reduce cache misses
Optimise: remove over sampling from projectile physics
Optimise: remove mGravity from PNode, no longer necessary
Optimise: UpdateTemporaryBraces uses HasRealLinks instead of RealLinkCount
Optimise: UpdateCladBothSides can use mPrimary flag instead of clearing/setting visited flag
Optimise: PaintStructures and UpdateStructureState can be called after AI update to avoid extra call to UpdateStructureStruts
Optimise: PhysicsManager::UpdateLinkState and UpdateDoors can use mPrimary flag instead of mVisited
Optimise: reduce the number of ray casts from missiles to turn
Optimise: PhysicsManager::DrawLink doesn’t need to look up native material in most cases
Optimise: calculate checksum progressively (except first one to quickly flag data desyncs)
Optimise: use Hash instead PrimeHash for game state checksum
Optimise: SnapLink can use structure bounds to disregard many links
Optimise: SnapLink tests platform angle before PassesLinkFilter for faster device placement testing
Optimise: SnapToNode uses circle/rectangle test against structures
Optimise: use MarkStructureBreadthFirst for marking structures instead of DFS MarkStructure
Optimise: MarkStructureBreadthFirst can defer search for parallel link
Optimise: MarkStructureBreadthFirst can avoid calls to GetAttachedDevice
Optimise: FindDevicePlatform can reject nodes that aren’t of the correct team
Optimise: FindDevicePlatform doesn’t need to use GetAttachedDevice
Optimise: SnapDevices reject non-matching teams early
Optimise: UpdateNodeMass caches table pointers, defers getting parallel link until necessary uses HasRealLinks
Optimise: DumpWorld drag and door state

Fix: AI getting stuck on some missions: 205, 208, 305 (remapped nodes)
Fix: Some campaign mission replays desync (removed ropes)
Fix: Escape then resume during campaign replay desyncs
Fix: pressing esc doesn’t bring up the pause menu during intro cutscene
Fix: Hurricane build speed nerf not applied to weapons
Fix: Player’s faction is incorrect in campaign third part
Fix: time limited games don’t show the duration exactly when timed out (4 seconds short)
Fix: extrusion tip shows frequently when building rope
Fix: teams can get out of sync
Fix: player can be ready on return if they were toggling ready before start
Fix: changing team just before joining can cause a crash
Fix: Hurricane, Firebird and Warthog weapon mods not applied correctly
Fix: unnecessary init.dat missing error
Fix: standalone device costs are out (ap sniper, swarm)
Fix: going to map selection screen while host starts game breaks loading
Fix: client can rejoin when host quits, and gets stuck waiting
Fix: don’t execute UpdateWeaponCursorScaling when using windows mouse
Fix: UpdateAutofire uses different angles to open doors and fire
Fix: crash when colliding non-projectile nodes
Fix: target painting inconsistent when cursor is in front of and behind the terrain
Fix: missiles can target own structure and devices if the last chance spotter targets them
Fix: paint target fights when two players are trying to use the same spotter
Fix: don’t allow allied spotters to be used to paint targets in TDM
Fix: some console logging is hidden at start
Fix: terrain join command doesn’t work
Fix: weapons make hurt effect and break out of repair when hit by a zero-damage projectile
Fix: main menu in 4:3 aspect ratios is not centered vertically
Fix: mousewheel zooms view when cursor is outside of window
Fix: cursor doesn’t slow down when inside an aiming arc
Fix: two cursors show at top of window
Fix: Canyon background cloud tiles clipped in 4:3 aspect ratios
Fix: some screen resolutions missing due to frequency filtering
Fix: enumerate screen resolutions for current monitor
Fix: campaign screens not centered vertically (4:3)
Fix: Swap mouse buttons, LMB + RMB to repair, lift RMB, then LMB -> stuck in pan mode
Fix: host can resume finished game after they have paused, increasing chance of problems
Fix: crash when mission scripts List value is invalid (now shows error)
Fix: always enable pause menu when showing result, and prevent disabling afterwards
Fix: mTrailEffect disappears if projectile velocity is zero
Fix: a laser won’t reflect off the same shield twice
Fix: memory leak in Monitor::Update (clobbered std::string)
Fix: secondary beam damage vs materials is not modified
Fix: client is able to hide pause menu if they bring it up before the host
Fix: config not saved after dismissing the ‘start campaign to learn’ tip on main menu
Fix: add extra slots to the lobby to compensate for Steam leaking slots
Fix: lobby.dat can be deleted while network connectivity is lost
Fix: crash in DeviceManager::CanTypesBeGrouped when types are invalid
Fix: lobby is not left before clearing in Multiplayer::OnSteamServersDisconnected
Fix: CompositeSprite & operator= was not performing a deep copy of mRoot Node
Fix: ProjectileParams setup and use can corrupt CompositeSprite
Fix: Explosion::SparksEffect::Update strcat_s could crash if string was too long
Fix: DetonateOnExpiry team passed to SpawnEffect is invalid, causes crash
Fix: DetonateOnExpiry does not have inter-frame precision
Fix: Esc doesn’t bring up menu when watching a replay in campaign
Fix: minigun damage multiplier vs bracing and laser overwritten by weapon_pack mod
Fix: AI can build through player’s structure
Fix: reactor health must be rounded down in the stats panel
Fix: cycle HUD item effects and other sounds not triggering
Fix: crash when a weapon or projectile action can’t find a projectile type
Fix: replay desyncs due to use of GetLocalTeamId in mission scripts for disabling weapons, etc.
Fix: weapon_pack projectile_list.lua shows error ‘damagedmissile2 missing’ if skirmish mod not active
Fix: if there are no replays the open replay in explorer button is still visible and crashes when pressed
Fix: weapon reloading and HUD item cycle sounds are audible when sounds muted
Fix: length of space character is incorrect around string substitutions
Fix: tip show, hid and lobby alert sounds played when fx is muted
Fix: AI FindTarget only falls back to structure targeting for heavy weapons
Fix: AlienFX is disabled the next time around if it fails to initialise
Fix: ai.lua exception when a new weapon is added and not included in some tables
Fix: new (unknown) devices which are not added to SmallArmsPriorities and HeavyArmsPriorities are not targeted by the AI
Fix: move data.AttackHintMaterialPreference into static data for keyframe efficiency
Fix: In DeviceEditor::AimSlave, if slave can’t face either direction it doesn’t aim at all
Fix: unbinding a key isn’t permanent after restarting
Fix: duplicate actions (e.g. FireWeapon) give warnings for their key after rebinding one
Fix: duplicate actions warning colouring unecessarily applied (e.g. FireWeapon)
Fix: key navigation is enabled when binding the key
Fix: tab stop is centered on the control, not the bottom left
Fix: Weapon::FindDoor only finds doors at weapon’s horizontal angle
Fix: door/background preview glitches briefly when cycling weapon previews in place
Fix: ApplyMod doesn’t allow mods of mods to mod original files if the file wasn’t found in the mod
E.g. to mod new weapons for a commander
Use path such as modssandbags_largemodscommander-bpo-scattershotmodssandbags_largedevicessandbags_large.lua
Fix: Negative mass devices cause instability when linking
Fix: AI can connect to neutral joints that are falling, preventing further progress
Fix: step/long forts have ropes that fail to connect on Wingman 4v4
Fix: script exception when creating a flaming version of a projectile with WeaponDamageBonus not set
Fix: temporarily braced nodes can float indefinitely if they are attached to a node deleted by PhysicsManager::DeleteNode
Fix: shrapnel can penetrate terrain at close range to flak detonation
Fix: can’t build neutral structure close to player teams in map editor
Fix: map editor node preview doesn’t obey ownership and support rules when nothing selected
Fix: Different players, including AI, can connect to a neutral structure at the same time as player
Fix: some foundation cladding is missing
Fix: foundation cladding can cross from one side of a tunnel to the other
Fix: temp braced node left floating after break
Fix: remove debug message from Warthog
Fix: Sleep(8) in Main::Execute is unnecessary and can reduce performance
Fix: classic forts are being selected, matchAllForts was true
Fix: valid TDM forts are being missed
Fix: AI-TDM test doesn’t run with TDM teams on side 2
Fix: missing sprite console error; load ui arrow sprites before initialising the console
Fix: extrusion can snap to the same node, causing a node to link to itself
Fix: being out of focus when the game starts may freeze the game and cause replays to freeze during seeking
Fix: AI closes doors on weapons too soon
Fix: invalid enum passed to texture mag filter
Fix: negative values passed to scissor test
Fix: Debug object could possible enter critical section and never leave it
Fix: crash or physics explosion when loading out of date campaign fgs
Fix: crash or physics explosion when pasting out of date structure clipboard
Fix: beams don’t respect the DeflectedByShield flag
Fix: disabled doors make open/close sounds
Fix: some out of date maps cause errors for using dofile
Fix: damaging an ignited missile or igniting a damaged missile extends its lifetime
add KeepLifespan flag to limit created projectiles’ lifespan to that of their parent
Fix: screen shaking with world extents that are wider than they are tall
Fix: slaves on sloping platforms have incorrect aim when refired
Fix: Workshop mods can be of different versions, causing desyncs
Fix: Workshop item downloads can get stuck
Fix: replacing a device platform with armour attempts to use backbracing
Fix: visible angles drawn out the back of a weapon when facing wrong direction
Fix: visible angles are not drawn through existing doors when previewing a weapon
Fix: laser is not blocked by self when reflected
Fix: laser shoots through self when reflected
Fix: explore replay file button visible without a selection
Fix: mission 104 doesn’t have terrain skirt on the left side
Fix: spelling of amendment in Black Gold campaign
Fix: mortar power text shrinks relative to aiming arc when zoomed out
Fix: Mission completion achievement can fail to be awarded
Fix: Mission 308 “Hydra” able to get “top or bottom” fort achievement by destroying middle fort
Fix: fog and line width OpenGL errors
Fix: tab stops/list key navigation broken on options screen key ListBoxes
Fix: list key navigation doesn’t support two simultaneously visible ListBoxes
Fix: key navigation in editor menu, replay select, map select, and multiselect
Fix: strut replacement can be used to overlap struts sharing a joint
Fix: world dump of ropes shows link progress as inf
Fix: preloading textures to different degrees causes desyncs
Fix: Catacombs has blank terrain surfaces
Fix: solar panel splits in half at full length
Fix: crash if there is no impact effect for projectile
Fix: shield states get out of sync when an emp hits when in warmup
Fix: when a weapon recesses a FG strut, the next time it’s replaced the strut is permeable to projectiles
Fix: letterbox shows in replay of resumed linear missions
Fix: replacing the material starting struts allows projectiles to pass and shows holes

Remove: map editor Copy tab (collapsed into Edit tab)
Remove: various console spam

Release 2018-12-12a hotfix Changelist

Add: RefreshRateSelection to settings.lua to allow disabling of refresh rate feature
Fix: crash on startup for some video cards (glGenerateMipmaps missing)
Fix: some players appear to have their refresh rate incorrectly selected
Fix: desync when igniting projectiles with firebeam
Fix: material gets replaced when selecting adjacent nodes
Fix: shield background doesn’t show during construction or destruction
Fix: infinite loop when deleting the middle node of a three node structure in the editor
Fix: infinite loop when deleting a node connected to another node in editor, both temp-braced
Fix: if a weapon becomes neutral autofire will continue to work, without costing resources
Fix: swarm missile can be reloaded instantly by disconnecting it mid-launch
Fix: HUD items sometimes move such that the selected item isn’t visible
Fix: weapon player name text too small or not visible
Fix: start sound cutting out sometimes
Fix: TDM fort ownership indicator effects can get out of sync
Fix: A Workshop mod can’t mod other Workshop mods, including for specific commanders
Fix: scroll speed of HUD item list is too slow
Fix: releasing the HUD item list scroll left/right buttons does not stop the scrolling
Fix: all mods are unsubscribed on Linux/Proton
Fix: shield can be turned on near instantly by deleting then undoing
Fix: spawning game_start.lua and tdm_highlight.lua on the first frame can cause timing issues

See this post on Steam