Forts Ranked Multiplayer Season 2 Winners and Update 1.4

G’day, Forts fans!

Today we’re bringing you news of the result of the second season of Forts Multiplayer and a new update with a bunch of fixes, features and balance changes.

Season 2 Winners

Season 2 of Forts Ranked Multiplayer has just finished and it’s been another hard fought fight to the top, with millions of bullets fired, thousands of players experiencing the power of gravity, and, when it comes to nukes, more drunks than a bachelor party brewery tour!

And so to the winners. In the 1v1 arena we’re happy to announce that CNFT_DuskDawn has improved on his eighth place finish in season 1 to claim the top spot. Congratulations! In the 2v2 world, CNFT_LZjun has finished at the summit, adding the 2v2 gold medal to the 1v1 version he claimed in season 1. Well done!

As before, these players will receive an in-game gold medal for their heroics, with the second and third placed players receiving silver and bronze medals respectively. On top of this, all players who finished in the top 20 will receive a medal to reflect that. The top 20 of each leaderboards are as follows:

1v1 Leaderboard

  1. CNFT_DuskDawn
  2. KnuffigesPuffi
  3. CNFT_zhang502
  4. 信仰彼方的喵哟
  5. CNFT_LZjun
  6. CNFT_W11AWA
  7. Moon_Red
  8. 魔魇大大
  9. Trekjeft
  10. Bowser
  11. pudy248
  12. CNFT_BlackBird
  13. sgitkene
  14. Aerocraft
  15. Carrie
  16. 年糕糕糕
  17. stupid noob
  18. Da_Lao
  19. 趋光
  20. 0fred0m

2v2 Leaderboard

  1. CNFT_LZjun
  2. CNFT_zhang502
  3. KnuffigesPuffi
  4. Emile-wa
  5. Fumishow
  6. Vecro
  7. 二营长
  8. Romerolagus
  9. Trekjeft
  10. 浅黄色的里程碑
  11. CNFT_HouCan
  12. 寒风
  13. CNFT_东方延绪

  14. bananamilk233
  15. gostho29
  16. Gutenews
  17. pokekoper
  18. ignis_pluvius
  19. kayden en boaz

Season 3 and Random Maps

Along with the balance changes listed below, Season 3, which starts now and ends on January 31st, will feature random map selection. This is to ensure players don’t just sit on a favoured map with a favoured build order, but have to adapt to the battlefield they are given. Hosts can still chose between regular encounters and capture mode via a checkbox. In addition to this, we have made a few other changes to further streamline the ranked experience. Check out the changelist below to find out more.

Update 1.4

We’re bringing a whole host of new features, balance updates and bug fixes to Forts, including cloud saves for campaign progress and settings, fullscreen HUD, and map filters.

For modders a universe of possibility has been opened up with fully featured scripting support. Just add script.lua to the root of your mod, add dofile(“scripts/forts.lua”) to the top and then treat it much like a mission script. Tutorials will be coming, but for now we have removed compilation on maps/03-weapons/03-weapons.lua, maps/02-resources/02-resources.lua and ai/ai.lua to provide some samples. We’re also working on documentation of the scripting API. Alexc96161 has generously written a starter guide. Just remember to keep all of your state in the ‘data’ table, or you will cause errors and desyncs.

On top of this, weapons can now have multiple prerequisite combinations, multiple upgrades with customised context buttons, and material conversion buttons can be added to the context menu. ReloadTime has been simplified, just set ReloadTimeIncludesBurst = false and you’ll find weapons easier to balance.

To help manage the increasing complexity of mods, we’ve added support for source control within mod folders. Basically, the game will filter out anything it doesn’t recognise when updating, including any .svn or .git folders. These will not make it into the Workshop item, keeping size down for players.

Join us on The Forts Official Discord to get direct help from us and other modders.

There’s much more in this update that can’t easily be summarised, so please trawl through the changelist and see how much love we put into this update.

release 2019-12-01a changelist

Add: randomised map selection in ranked, selecting 1v1 or 2v2 maps depending on leaderboard, with button to select capture maps
Add: Steam Cloud support for campaigns and settings
Add: transition to steam id user paths to support cloud saves
Add: map list filtering
Add: expanded HUD for Material, Device, Weapon, Terrain and Prop selection
— Hold “Q” to display (can be switched to toggle in Options -> Game)
Add: fully featured dynamic scripting for mods (script.lua from base folder of mod)
Add: support for using source control in mod folders
Add: support for multiple upgrades with customisable context buttons
Add: support for multiple prerequisite combos for devices and materials
— e.g. Prerequisite = {{ “a”, “b”, “c” }, { “d”, “e” }, { “f” }},
— Upgrades can have Prerequisite independent of the base device
— An empty upgrade prerequisite means nothing required, even if base weapon has a
Add: support for secondary (barrel) structures allocated to players and AI in TDM
Add: SecondaryForts mission script table to associate primary forts with secondary forts by IdPos
Add: SecondaryForts.AllocateRemaining to decide what to do with unallocated secondary forts
Add: validate select game files on startup, flag Steam to verify and restart
Add: script checksum system
Add: support for ground weapons without a forced angle
Add: alternative destroy effect when expiring (defaults to destroy effect)
Add: Scale variable to CompositeSprite node
Add: open medal links in the Steam overlay if available
Add: an alias for shortened field identifiers (e.g. FI_D -> FIELD_DISRUPT)
Add: RAY_HIT_FIELD enum to CastRayFromDevice results
Add: draw anchor positions & directions and outlines of all composite sprite nodes in editor for selected device
Add: Additive variable to CompositeSprite node
Add: data desync logging for prerequisite and upgrade differences
Add: show repair area effects during replays
Add: logging during World construction to narrow down silent crashes
Add: SplashForceIsGravity flag to specify projectile splash force is gravity
Add: ‘Log’ function support for building_materials.lua and projectile_list.lua
Add: console error logging to mod.lua and script.lua loading
Add: customisable material conversion buttons, defaulting to DefaultConversions when Conversions is missing
Add: MergeLists Lua function to easily extend DefaultConversions for a material
Add: portal warmup times to context menu buttons
Add: weapon_pack_skirmish to balance weapon_pack outside of the Moonshot campaign
Add: material SplashMultiplier parameter to adjust general vulnerability to splash damage
Add: DoorSpeedClose so doors can close at a different speed to opening
Add: include uihelper.lua in sprites.lua for convenient modding
Add: GetTeamCount and GetTeamId functions to enumerate teams
Add: TEAM_ANY value to forts.lua
Add: script functions to change block texture
Add: toSelf parameter to SendScriptEvent so it can target its own mod scripts
Add: AddResources script function to spend or gain resources
Add: OnShowResult script notification to allow boss missions to disable the pause menu
Add: show device bounds when in debug mode, without circles
Add: red icon for Phantom device move
Add: allow one more game with a player in 2v2 before being match limited
Add: new Workshop tag “Capture”
Add: SetDoorState script function for instant door manipulation
Add: a frame rate counter to the main menu for testing UI performance (enabled by UI.MainMenuFPS)
Add: ReloadTimeIncludesBurst flag to weapon scripts (defaults to true) to maintain mod balance

Improve: move field identifiers to projectile_list.lua
Improve: change FIELD_BLOCK_ANTIAIR to FIELD_BLOCK_FIRING (doesn’t apply just to anti-air)
Improve: replace use of cos/sin/FastCos/FastSin with cosf/sinf for performance/accuracy
Improve: moved AddPrerequisite from DeviceManager to World for use by materials
Improve: move portal controls into the first row of the context menu for consistency with doors
Improve: HUD-Buttons-Blank*.tga context buttons for use as mod upgrade & conversion button template
Improve: make link and node debug text more readable but translucent to see what’s under
Improve: split settings.lua into settings.lua (cloud compatible) and settings_hardware.lua (local hardware config)
Improve: replace upgrade display name search with SaveName search in EnableDeviceUpgradeOfType script function
Improve: reorder Add*Control functions to appear next to each other in documentation

Balance: increase range of mortars to be viable on long range maps (MaxFireSpeed +30%)
Balance: increase reload period of warheads by 4s to 25s (+19%)
Balance: increase shootdown radius of warhead from 10 to 14 (+40%)
Balance: increase charge period +10% and reduce active period of Overdrive -30% (~36% reduction overall)
Balance: shotgun sprays projectiles evenly
Balance: increase hitpoints of shotgun to withstand one sniper shot
Balance: increase hitpoints of smoke grenade to withstand one sniper shot
Balance: smokebomb projectiles can’t be shot down
Balance: shields immune to 20mm splash damage
Balance: portal receives only 25% of normal splash damage to make return to senders more viable
Balance: increase repair station radius from 200 to 270 (+35%)
Balance: reduce repair station energy upkeep from 16 to 10 (-37.5%)
Balance: increase firebeam firing cost from 1500 to 2000 (+33%)
Balance: increase firebeam reload period from 14 to 17s (+21%)
Balance: reduce protruding door caps when fully open by half
Balance: increase open speed of doors from 50 to 70 to combat warheads at close range
Balance: tightened up human assist anti-air AI to react faster to threats
— AntiAirPeriod reduced from 0.4 to 0.3
— AntiAirMinTimeToImpact reduced from 1.8 to 1.5
— AntiAirReactionTimeMin reduced from 0.375 to 0.2
— AntiAirReactionTimeMax reduced from 1 to 0.8
Balance: reduce phantom move time from normal deconstruction of the device time to 3s
— Can be modified with the DefaultMovePeriod rule
— Can be overridden using the MovePeriod variable in device_list.lua or weapon_list.lua
Balance: reduce Phantom dummy weapon metal cost from 30 to 20 (-33%)

Optimise: replace RotateAboutAxis in SparkSet::EmitSparkAtIndex with GenerateRotationMatrix/RotateVec
Optimise: PhysicsManager::GetLinkCount counts primary links, rather than using visited flags
Optimise: Control::EvaluateLayoutScript avoids double recursion if current control has no scripted layout
Optimise: HUDItems::Initialise prevents re-evaluation of HUD item layout during runtime
Optimise: reduced size of file cache lookup key for workshop maps (stripped off local path prefix)

Fix: beams can collide with the same field or projectile more than once
Fix: beam segments drawn to field graphical position are incorrectly drawn when the beam survives
Fix: projectile types can collide that wouldn’t normally when fired from different weapons
Fix: non-DisruptionBlocksFire Anti-air weapons are blocked
Fix: AI can shoot DisruptionBlocksFire weapons offensively through a blocking field
Fix: use of FastCos and FastSin adds error to sprite anchors and aiming gizmo
Fix: CompositeSprite nodes are drawn with invalid dimensions if frame image isn’t found
Fix: munitions plant has an incorrectly set Scale value in its sprite
Fix: upgrade centre has a gap in the sprite
Fix: DeviceExists doesn’t check for fully built, disabled or dummy (check existing usage)
Fix: potential crash when reading excessively long upgrade SaveNames
Fix: upgrade params are not included in device checksum
Fix: basic mesh projectile sprites don’t have their Scale and Additive values set
Fix: background terrain surfaces are drawn in foreground in the map editor
Fix: struts on fire can be converted to other materials
Fix: fire can spread to bracing while being replaced
Fix: team extents not updated correctly when converting or mirroring a fort
Fix: device positions are not updated during structure mirror, affecting structure extents
Fix: weapon angles are not updated during structure mirror, causing aiming at strange angles
Fix: interleaving dynamic ground blocks (e.g. energy field) can corrupt edge sprite rendering
Fix: ambient.lua effect desync after player uses set_background in map editor (loaded permanently instead of temporarily)
Fix: maps that don’t set a FortGroup table are limited to 4 AI forts on each side
Fix: World::AllocateFortsToAI unnecessarily loops through all structure states
Fix: rope peg isn’t included in cost of building a new rope to the ground
Fix: artificial increase to default FortGroups causes map flag caching to slow
Fix: device facing is mirrored with structure in map editor
Fix: desync when placing device on a perfectly vertical strut
Fix: shockwave ‘construct’ effect misplaced for sloping devices
Fix: desync when firing structure weapons with fixed angle
Fix: Weapon::AimWeapon has obsolete, incorrect and inefficient behavior
Fix: default Russian keyboard layout is JCUKEN which is less clear than QWERTY
Fix: desync when standin links connect to a bouncing node
Fix: weapon RoundsPerBurst, ReloadTime and RoundPeriod can be zero or negative
Fix: portal orientation desync: aiming depends on prior aim of weapon
Fix: auto portal orientation weapon aiming fails when weapons are in auto fire/reloading
Fix: effects within environment mods cause replays to desync
Fix: desync when connecting to a single floating node (e.g. in zero gravity)
Fix: incorrect structure breaks when connecting to isolated nodes
Fix: crash when alt-tabbing during shell initialisation
Fix: “rank” string in Chinese
Fix: math.random can be used to produce non-deterministic numbers
Fix: allow use of math.random in effects scripts only
Fix: blank mod is activated for built-in environments
Fix: memfile leak in ReadEnvironmentName when terrain file is the wrong version
Fix: the failure to load some textures goes without error message
Fix: ReadProjectileEffectMap crashes if non-string table keys are present
Fix: secondary projectiles can never collide
Fix: corrupt base2.pack can cause memory allocation crash
Fix: projectiles with IgnitesBackgroundMaterials = true pass through materials with a certain configuration
Fix: Splash defaults to true for Deflect effects
Fix: crash when spawning a secondary projectile that doesn’t exit
Fix: Shockenaugh’s explosive barrel can overlap devices
Fix: shockenaugh explosive barrel uses battery detail panel
Fix: base of cannon has factory colours during construction in some circumstances
Fix: commander Buster error messages for impact_howizter and impact_howizter_big sprites when dlc1_weapons is off
Fix: crash in HUD::AddToContextMenu2 if row exceeds the maximum
Fix: SetDamageMultiplierSpecific sets AntiAir multiplier only, instead of type parameter passed
Fix: cannon detail panel not updated with munitions colours in weapon_pack
Fix: crash when switching team in editor without a selection
Fix: door caps can be drawn beyond the link when fully open
Fix: AI can build devices up-side down (AttachDevice accidentally using direct attachment)
Fix: weapons facing backwards when seeking in replays
Fix: OnKey can cause Lua exceptions during cutscenes when advance button is mashed
Fix: on start up game doesn’t load when not in focus
Fix: SetControlText doesn’t use parent to disambiguate the requested control
Fix: GetChildName does no bounds checking
Fix: GetDeviceType returns NULL, potentially causing exceptions or crashes
Fix: MapOriginalNode logs nodeTeam when node doesn’t exist
Fix: game switches to terrain edit mode in CreateBlock
Fix: teamChecksum[0] was not cleared after structure checksums
Fix: repair breaks weapon reload animations
Fix: devices can protrude slightly and suffer projectile impacts
Fix: pause menu shows in final Black Gold mission victory cinematic, UI can become unresponsive
Fix: F1 or ESC on final victory banner causes the video cutscene to be missed, and can lock controls
Fix: crash when right clicking on terrain with a unknown texture or edge type
Fix: crash when opening maps with the indo environment
Fix: AI keeping doors open, blocked by door cap but opens door any way
Fix: door cap collision in DeviceManager::FireWeapon and Weapon::OpenDoorsInFrontOf ignores modification
Fix: generated file caches break if no language is set up (i.e. release builds)
Fix: gData.UseEnglishMapNames inconsistencies (used in FileSelect::GetMapDisplayName, but not used in some other cached places)
Fix: Mod Moonshot icon issue wrt a circular status check when refreshing items
Fix: updated workshop items can have versioning issues if the itemversion.lua script is modified or rolled back
Fix: Prevent F2 re-opening HUD if force closed by GameOver or script call
Fix: Prevent mousing over bottom of screen re-opening HUD if force closed by GameOver or script call

Remove: dynamic screen files from old system
Remove: compiling of tutorial mission scripts so they can be used as scripting references
Remove: obsolete upgradeDisplayName in UpgradeParams
Remove: obsolete BeamImpactProjectile on magnabeam
Remove: isolated nodes after fire burns out the last strut
Remove: obsolete clouds layer and texture from desert environment
Remove: map selection, AI control and game mode control from ranked lobbies
Remove: host configuration grace period, to prevent “shopping” for favourable maps
Remove: compilation of ai.lua, 03-weapons.lua, and 02-resources.lua for use as scripting examples
Remove: dummy sandbags for Phantom
Remove: AI deliberately keeping doors open between shots (looks buggy)

Thanks for playing Forts.


See this post on Steam