After 10 betas releases this major update is finally out. Thank you for all the help from modders and testers. This update as been focused on major under the hood changes that greatly expand the mods that are now possible.
Update Highlights:
Shaders (enable in settings) ---Team coloring shaders - Used to greatly reduce memory use of mods with large images, and eliminates lag when applying team color ---Shader effects - Right now adds displacement/shockwave effects such as teleport, water ripples, nuke shockwaves. Use [effect]drawType:displacement to access in your mods. Will be expanded with more effects in future.
Teleport shader effect:
Wave shader effect:
-New unit - Heavy AA Ship (by uber)
-New unit - Spy Drone - Can not attack/Can see further through fog/Decent health and speed/Self repair. Built in the T2 air factory.
-Stats --Game history shown with graphs on post game win/lose screen --Stats/leaderboard button in replays
-Mods can now create resource streaming style systems like in TA, C&C, etc. And better customize the layout, display of new resources including creating image icons
Example of custom resources in 1.15 mods:
-Added new decal drawing system - Can be used for a lot of new things from selection interfaces, custom health bars, fake 3d effects, 3d voxel units, animations, etc
Modded sprite stacking fake 3d tanks with custom decal health bars:
Quick example of modded fake 3d tank with a custom selection indicator:
-Overrides for each players in multiplayer and advanced skirmish ---AI difficulty can now be set differently for each AI player ---Starting units can be different for each player, useful for faction selection in mods. ---Unit color can be overridden for each player
-Over 100% faster rendering on PC with high numbers of small units on screen (runs smooth in tests with 10,000+ units all on-screen)
-Big dynamic logic improvement for modding, with new dynamic numbers, unit and string types, dynamic text, arrays, memory, unit references, messages sending, events, etc.
-Search/filtering by unit title / internal name added to sandbox
-Mod list filtering options added to mods screen. And newly added workshop mods are detected and show dynamically with download status
-Added new blink and speed modules to the Modular Spider -Nautilus: Launch scout bot ability added and can now build anti-nukes missiles (with shorter range and more expensive than normal)
-Host can now return all players back to the battleroom to setup a new game with the same settings, without setting up a new game and requiring players to reconnect.
General Airon has made a break down on some of the main 1.15 features:
Balance changes
-Anti-nuke launcher shows an indicator on battlefield when empty (only visible to player with control) -Outpost $2500->$1500 T2 upgrade: $3000->$2000 -Combat engineer $4500 -> $3500, nanoSpeed 1.5->2, added turret T2 & mech factory T2 to build list and can be built from the experimental land factory -Nautilus can be built from the experimental land factory -Tesla Mech speed changed from 0.5->0.7 so they can chase down minigun mech, and price $5500->$5200 -AA beam gunship base speed changed from 0.85->1, afterburn 2.10->2.3 -Heavy anti-air mech $10,000 -> $8500 -Missile airship $4200 -> $3900
Other new modding features
-Moddable resource streaming style systems like in TA, C&C, etc. ---[core]streamingCost - Like price but paid for overtime while this unit is being queued or built. Construction or queue is paused if resources run out while building. ---[action]streamingCost - Like price but paid for overtime while action is queued, queue is paused if resource runs out. Flags can be used to pause and unpause from triggers. ---[core]switchPriceWithStreamingCost:boolean/[action]switchPriceWithStreamingCost:boolean shortcut to set streamingCost to price value and clear price. ---Add [core]switchPriceWithStreamingCost to all-units.template to quickly switch a mod over to streaming resources. -Mod list filtering options added to PC mods screen -Workshop mods are detected and added dynamically, and with download status -Dynamic logic boolean overhaul, with new dynamic number, unit, string types -Comparison support added to logic booleans: == != < > >= <= ---Instead of “autoTrigger: if self.energy(greaterThan=100)” it's possible to do: “autoTrigger: if self.energy > 100” -Logic boolean/number maths: - + * / --Eg: “autoTrigger: if 2*self.energy + parent.energy-10 > 50” -Dynamic text, eg: [action]text: Team:%{ self.teamName } has %{ parent.resource('gold') } gold remaining --Dynamic text support has been added to [action]text, [action]description, [action]setUnitMemory, [action]showMessageToPlayer, [action]showMessageToAllPlayers, [action]showMessageToAllEnemyPlayers, [action]showQuickWarLogToPlayer, [action]showQuickWarLogToAllPlayers, [action]debugMessage -Multi line support has been added and can be used on any key with 3 quotes to start and end. Eg: copyFrom:""" ROOT:a.ini, ROOT:b.ini, ROOT:c.ini """ -Added [attack]shootDelayMultiplier default 1 -Added [action]setUnitStats allows changing of a select number of fields dynamically without converting. Supports =/+=/-=, with dynamic maths/logic. Changeable fields: maxHp, hp, selfRegenRate, maxShield, shield, shieldRegen, maxEnergy, energy, armour, mass, shootDelayMultiplier, shootDamageMultiplier, moveSpeed, maxTurnSpeed, maxAttackRange, nanoFactorySpeed, targetHeight, fogOfWarSightRange, nanoRange Eg: setUnitStats: maxHp+=self.energy+100, hp+=50, shieldRegen=0.5 -Added [action]resetUnitStats (boolean) -Added [action]convertTo_keepCurrentFields - Don't change these fields when converting, useful with setUnitStats (Allowed fields: maxHp, maxShield, shieldRegen, maxEnergy, armour, mass, shootDelayMultiplier, moveSpeed, maxAttackRange, etc.) -Added [action]whenBuilding_temporarilyConvertTo_keepFields - Don't change these fields when using whenBuilding_temporarilyConvertTo (both to and from), useful with setUnitStats. -Fix whenBuilding_temporarilyConvertTo flickering between unit types -Fix temporary tags being reset on sandbox unit reload -Fix Trigger Debug showing on all sandbox tabs -[core]defineUnitMemory creates variables for custom storage unique to each unit. --Eg [core]defineUnitMemory: boolean nukeActive, boolean laserReady, float experience, unit nextTarget, unit homeBase, string customText --[action]setUnitMemory: """ customText=memory.customText+'hello', nukeActive=true, experience=experience+attacking.hp, nextTarget=self.attacking.nearestUnit(withinRange=300, withTag='x', relation='enemy') """ -New logic boolean function: readUnitMemory(name:string, type:string{boolean,unit,float,string}, [default]) eg: parent.readUnitMemory('nukeCountdown',type='float'). Default is used if that unit memory doesn't exist or the type in the saved data is wrong. -New logic boolean function: memory(name) which is a shortcut to read the current unit with current defineUnitMemory types. -Fix teamColoringMode when using the same image with different modes -New resource shortcuts. eg: self.resource.credits and self.resource('credits') -Added [action]switchToTeam: {logicNumber} New logic boolean/number/unit/string functions: --self.maxHp() --self.teamId() - Return team id of unit or market. Starts at 0. (but -1 for a neutral team) --self.x() - Return x location on map. Available on units and markers. --self.y() - Return y location on map. Available on units and markers. --self.z() - Return z/height on map. Available on units and markers. --self.dir() - Return direction. Available on units and markers. --self.priceCredits() - Credits this unit cost --distance(x1,y1,x2,y2) - Distance between points. Slower than distanceSquared. --distanceSquared(x1,y1,x2,y2) - Faster distance, but result is squared --distanceBetween(unit1, unit2) - eg: distanceBetween(self, activeWaypointTarget) < 100 --distanceBetweenSquared(unit1, unit2) - Bit faster than distanceBetween --int(x) - Removes decimal places from a number. int(4.2) == 4 --select(bool, textA, textB) - returns textA if bool is true otherwise returns textB --debug(logicBoolean) - Returns a text string helping to explain the reason for the current result. Can see into nested logic, comparisons, and operators. --str(x) - Convert a number, unit or boolean into a string: eg str(self.energy)+'x' == '100x' --substring(text,start,end) - eg substring('hello',0,2) == 'he' --length(string) - Returns string length as number --squareRoot(num) - Requires square root of a number --min(num, min2) - Returns the smallest number, eg: damage = min(self.hp, self.energy) --max(num, min2) - Returns the biggest number, eg: max(5, 10) == 10 --createMarker(x,y,[height],[teamId],[dir]) - Returns a temporary unit marker. Can be saved in memory or used as a reference for move orders, etc. Doesn't affect game state. Automatically removed if not referenced anymore. --globalSearchForFirstUnit(withTag=x, relation) - Returns first unit found matching the filter --null/nullUnit - A null/missing unit. Useful in comparisons eg: self.customTarget2 != null -New logic boolean/unit reference system: ---Chaining those all functions is supported eg: self.attachment(withTag='x').lastDamagedBy.getAsMarker() ---self - This is the existing reference for the current unit (was the only option in past versions). Eg autoTrigger: if self.energy > 100 ---attachment([slot], [withTag]) ---attacking - Current target this is attacking, might not be the current waypoint target. ---lastDamagedBy - Last unit that attacked this. ---parent - The transporter or attachment parent. Eg autoTrigger: if parent.energy > 100 ---activeWaypointTarget - Current active waypoint target. Includes attacking, transporting, repairing, etc. ---customTarget1 - Custom memory, defaults to the unit that created this unit. ---customTarget2 - Custom memory, defaults to null ---nearestUnit(withinRange=500, withTag='x', relation='any') - Search for a unit, slow, not recommended in autoTriggers ---getAsMarker() //creates a temporary marker at the position a unit is right now. Markers are fast to create and automatically removed when no longer needed. Is not linked to any unit and still exists when the unit dies, and stays the same when source moves. Eg: lastDamagedBy.getAsMarker() - to remember location of last attack. Markers store x/y/height/dir/team data. ---getOffsetAbsolute([x],[y],[height]) - Returns marker with absolute offset ---getOffsetRelative([x],[y],[height],[dirOffset]) - Returns marker with relative offset ---thisActionTarget - Used in inside actions to get action target, location, auto trigger event source, etc. Will be set as a unit, marker, or null depending on the action trigger source. Note: Will always be null when used on UI text fields, etc as it's only valid on the action event. Save the value to memory if you want it shown in the UI. ----thisActionTarget examples: ----fireTurretXAtGround: mainGun (thisActionTarget==Marker with ground location) ----autoTriggerOnEvent: tookDamage (thisActionTarget==Unit that caused damage) ----autoTriggerOnEvent: killedAnyUnit (thisActionTarget==Unit that was killed) ----autoTriggerOnEvent: transportingNewUnit (thisActionTarget==Unit that was transported) ----autoTriggerOnEvent: transportUnloadedOrRemovedUnit (thisActionTarget==Unit unloaded) ----autoTriggerOnEvent: queuedUnitFinished (thisActionTarget==New unit made) ----autoTriggerOnEvent: touchTargetSuccess (thisActionTarget==Target touched) ----alsoTriggerAction: x (thisActionTarget==Same as original action) ----[turret]onShoot_triggerActions: x (thisActionTarget==Target that was shot at) ----takeResources_triggerActionIfAnyCollected: x (thisActionTarget==Target with resources) ----addWaypoint_triggerActionIfMatched: x (thisActionTarget == Marker for move/Target for attack, etc. Note: use addWaypoint_maxTime:0 if you want to search only) -customTarget1/customTarget2 added to all units. Can store a reference to another unit. customTarget1 defaults to the unit or building that created the unit. Useful for things like aircraft carriers, infantry squads, teleporter links, etc. ([core]defineUnitMemory can also be used to add more) --Added [action]takeResources_excludeUnitsWithoutCustomTarget1EqualTo --Added [action]takeResources_saveFirstUnitToCustomTarget1 --Added [action]takeResources_saveFirstUnitToCustomTarget2 --Added [action]setCustomTarget1 - unit ref --Added [action]setCustomTarget2 - unit ref --Added [action]swapCustomTarget1And2 - boolean --Added self.customTarget1 in dynamic logic --Added self.customTarget2 in dynamic logic -Added [action]setResourcesWithLogic/[action]addResourcesWithLogic --eg: setResourcesWithLogic: hp=self.parent.hp - 10, energy = self.energy / 2 --eg: addResourcesWithLogic: hp = select( self.parent.energy>5, 10, 20 ) -Added [core]autoTriggerCheckRate and [action]autoTriggerCheckRate - with the options everyFrame (default), every4Frames, every8Frames ---Note: all triggers regardless of check rate are checked when first created and after an auto trigger cooldown. Checks rates every4Frames/every8Frames are randomly spread out between units so they don't all happen on the same frame, making it smoother. Adding [core]autoTriggerCheckRate:every8Frames to all-units.template could have a large performance boost for mods with complex autoTriggers. Often x8 better performance from autoTriggers. In rare cases some triggers might still require checking every frame so this is not a default. -New unit produce/spawning parameters: ---Added spawnSource(unitRef) - Effects location and team eg: [action]spawnUnits: tank(spawnSource=memory.lastLocation) ---Added copyWaypointsFrom(unitRef) - Copies all waypoints on target to created units. Eg: spawnUnits: tank(copyWaypointsFrom=self) -Modulus operator (%) added to ${} template blocks -Added [action]setHeight - dynamic number -Added [action]teleportTo - Marker/unit reference -Added [action]transportTargetNow - Unit reference - Transports this unit from anywhere on the map -Added [action]id to allow actions to be more easily connected when converting between units. -Added [action]fireTurretXAtGround_showGuideDecals that takes a list of decals to render while picking a target -Added [action]autoTriggerOnEventRecursionLimit. With a default of 1 -newMessage event trigger now has a default recursion limit of 4 (up from 1) -Added [action]takeResources_triggerActionForEach - Calls this action for each unit found by takeResource with the unit as the action target, and action index counting up from zero. -Added [action]takeResources_searchOnly shortcut (takeResources_maxUnits=200, takeResources_discardCollected=true, takeResources_keepResourcesOnTarget=true) -Added [action]takeResources_includeReference - unit ref - eg: [action]takeResources_includeReference: self.lastDamagedBy -Added [action]addWaypoint_target_fromReference - unit ref -[turret]unloadUpToXUnitsAndGiveAttackOrder - Now unloads units at turret location (testing needed) -Added [core]borrowResourcesWhileBuilt - like [core]borrowResourcesWhileAlive but doesn't take effect till built. Mostly useful for buildings like houses that have negative resources to add to a unit cap, etc. -Added [attack]shootDamageMultiplier -Added [projectile]ignoreParentShootDamageMultiplier -Added [action]switchToTeam: {logicNumber} (wasn’t in 1.15p1 to start with) -Mech minigun changed from H:800/S:800 -> H:600/S:800 -Players kicked by host are also IP banned for 1 minute by default -Added [decal]layer - enum - shadow, beforeBody, afterBody, onTop, beforeUI -Added [decal]order - float - Order with other decals, defaults 0 and uses order it appears in ini -Added: [decal]onlyWhenSelectedByOwnPlayer - Only draw if the viewing player is the same as this unit. -Added [decal]onlyWhenSelectedByEnemyPlayer -Added [decal]onlyWhenSelectedByAllyNotOwnPlayer -Added [decal]onlyWhenSelectedByAnyPlayer - Show when any player selects this unit. -Added [decal]includeParentsSelection - bool - onlyWhenSelected* also check parents selection -Added [decal]onlyPlayersWithUnitControl - bool - Only draw if viewing player could control this unit -Added [decal]onlyTeam - TeamRelation - Only draw when this relation between unit and viewing player - own|notOwn|neutral|allyNotOwn|ally|enemy|any -Added [decal]onlyWithZoomLevelOrMore - float - Eg 0.7 - Would hide decal when zoomed out a bit. Useful to reduce draw calls for performance when a lot of units might be onscreen. Recommended to be set on decals for 3d voxel style units, small details or small shadows. -Added [decal]onlyWhileActive - Only draw when unit has been completed -Added [decal]onlyWhileAlive - (If beforeUI layer default true, else default false) -Added [decal]onlyInPreview - Only show in sidebar, and building placement preview -Added [decal]onlyOnNonPreview - Only show on real unit, not action sidebar, etc -Added [decal]imageScale - dynamic float -Added [decal]imageScaleX - dynamic float -Added [decal]imageScaleY - dynamic float -Added [decal]image - image -Added [decal]teamColors - bool. Enable team coloring on image and imageStack -Added [decal]imageStack - list of images - recommended for 3d voxel style units as images can be batch drawn when using the same sprite sheet. -Added [decal]stack_hOffset - for 3d voxel style units. -Added [decal]stack_frameOffset -Added [decal]stack_drawInReverseOrder -Added [decal]stack_indexStart - dynamic int (Starting image of the image stack) -Added [decal]stack_indexCount - dynamic int (Number of images to draw. Could be set to 1 to use stack_indexStart as an image picker) -Added [decal]total_frames - Use total_frames or frame_width/frame_height -Added [decal]frame_width -Added [decal]frame_height -Added [decal]frame - dynamic int -Added [decal]isVisible - dynamic bool -Added [decal]xOffsetRelative - float - (note use basePosition with createMarker/etc for dynamic use) -Added [decal]yOffsetRelative - float -Added [decal]xOffsetAbsolute - dynamic float -Added [decal]yOffsetAbsolute - dynamic float -Added [decal]hOffset - float - height offset -Added [decal]dirOffset - float -Added [decal]pivotOffset - float - only effects xOffsetRelative/yOffsetRelative without rotating image -Added [decal]alwaysStartDirAtZero - bool - Useful for UI -Added [decal]alwaysStartHeightAtZero - bool - Useful for UI on air and hover units -Added [decal]basePosition - unit or marker to draw from as the base -Added [decal]basePositionFromLeg - leg ref - Use a leg/arm position instead of unit body as base -Added [decal]basePositionFromTurret - turret ref - Use a turret position instead of unit body as base -Added [decal]drawLineTo - unit or marker - Draws a line to this location affected by color and width -Added [decal]image_shadow - image -Added [decal]shadowOffsetX - float -Added [decal]shadowOffsetY - float -Added [decal]color - color - affects image and line. -Added [decal]alpha - dynamic float (0-1). Stacks with alpha in color. affects image and line. -Added [decal]lineWidth - float -Added self.speed() - Current unit speed -Added self.builtAmount() - How much this unit is built. 1 when complete. Note only events trigger on incomplete units, not autoTrigger -Added self.completed() - Shortcut for checking built is 1 -Added self.maxMoveSpeed() -Added self.teamDefeatedTech - boolean -Added self.teamWipedOut - boolean -Added self.teamVictory - boolean -Added [graphics]image_floatingPointSize - Fixes off by 1 pixel sizing for odd sized images -Added [graphics]image_offsetH - height offset -Added [leg/arm]liftingHeightOffset -Added [leg/arm]targetHeight -Added [leg/arm]targetHeightRelative -Added [leg/arm]image_middle_teamColors -Added [turret]height - to help placement on 3d style units -Added [resource]displayDigitGrouping: none/comma/space -Added [graphics]showSelectionIndicator -Added [core]allowCaptureWhenNeutralByAI -Added [action]tags - Used with queueSize(withActionTag=x) and queueItemAdded(withActionTag=x), etc -Added [action]alsoTriggerOrQueueActionWithTarget - Changes target of the other triggered action, defaults to the current action target. Effects things like fireTurretXAtGround, spawnUnits, thisActionTarget(), etc -Added [effect]trailEffect -Added [effect]trailEffectRate -Added self.maxShield -Added self.maxEnergy -Added self.isEnergyRecharging -Added [core]updateUnitMemory - works like [action]setUnitMemory but with better performance and easier timing than triggering an action. -Added [core]updateUnitMemoryRate - How often to call updateUnitMemory, defaults to 1s. At zero would trigger every frame. -Added notOwn to team relation types - eg in addWaypoint_target_nearestUnit_team -Added withActionTag parameter to self.queueSize that checks action tag -Added ‘attachmentRemoved’ to autoTriggerOnEvent -Added withActionTag to queueItemAdded and queueItemCancelled in autoTriggerOnEvent using tag of action -Added numberOfUnitsInAllTeams() -Fix delay when spawning lots of building type units on map load -Added 'eventSource' for use with autoTriggerOnEvent. (The thisActionTarget with autoTriggerOnEvent examples in 1.15p1 changelog are incorrect. Use eventSource instead for those.) -Added a @memory shortcut in [core] for defineUnitMemory to create a single memory variable. This should work better with templates and copyFrom logic as a single defineUnitMemory gets overridden. Example: @memory customText:string -Added array types to memory. Supported types are bool[], number[], unit[] --Define array: @memory numArray:float[] --Set array: setUnitMemory: numArray[0]=2 --Add to array: setUnitMemory: numArray[memory.numArray.size]=5 --Read array: text: %{memory.numArray[memory.targetIndex] } --Read on another unit: %{ parent.readUnitMemory('numArray', type='float[]')[0] } --Check if array contains value: memory.unitArray.contains( self.attacking ) --Alt read on another unit: %{ self.readUnitMemory('numArray', type='number', index=0) } --Delete array: setUnitMemory: numArray=null --Arrays automatically expand but have a hard size limit of 10,000 --Reduce array size with [action]shrinkArrays: arrayName - Will remove any null or dead units, and 0s from number arrays. Will shift over all indexes after the deleted entries. --Arrays use requires minVersion of 1.15p11 to be set in the mod -Added [action]alsoTriggerActionRepeat - Dynamic number (Repeats the alsoTriggerAction call, index changed on each repeat) - Useful to create loops or work with arrays -Added thisActionIndex / index for use with alsoTriggerActionRepeat -Added [action]fireTurretXAtGround_withTarget (Takes unit or marker reference) -Added [effect]pivotOffset - like dirOffset but also rotates all relative keys, and child effects spawned -Added [effect]pivotOffsetRandom -Added [projectile]trueGravity that affects heightSpeed. [projectile]gravity only affected height directly so it had no acceleration. -All random logic is more random and a shared random seed is created for each match, for random starting spawns, resource placements, etc. -Added rnd(min,max) logic boolean which generates a synchronised random float. eg: [action]requireConditional: if rnd(0,1)<0.6 (for a 60% chance of action working) -Added lowercase(string) and uppercase(string) logic functions -Added cos() and sin() logic booleans -Added direction(x1,y1,y2,x2) and directionBetween(unit1, unit2) logic functions -Added enteredTransport, leftTransport events to autoTriggerOnEvent. With eventSource being the transport. -Fix unloadUpToXUnitsAndGiveAttackOrder not working well with attachments -Added aggressiveTeam option to unit spawn -Added [action]sendMessageTo:unitRef , [action]sendMessageWithData:variableList, [action]sendMessageWithTags:tagList ---Use autoTriggerOnEvent:newMessage(withTag=x) to read these messages on the targeted unit, and the logic function eventData(name, type, [default]) to read the sent data. ---Use autoTriggerOnEvent on tookDamage supports optional (withTag=x) parameter, which reads projectile tags. Eg: autoTriggerOnEvent:tookDamage(withTag=fire) -readUnitMemory/eventData with a type string will now auto convert any non-string data for easier debugging -nearestUnit() now has a default range of 500 (instead of 0) -takeResources_includeReference, setCustomTarget1/2 supports dynamic references (eg from memory, logic, etc) -substring function now supports dynamic start and end numbers -Added [core]nanoReclaimSpeed - how fast a builder reclaims a normal unit (defaults to nanoRepairSpeed*5.1 to match behaviour of older versions) -Added [core]resourceReclaimMultiplier - how fast a builder reclaims a resource (defaults to 1) -Added [core]nanoUnbuildSpeed, how fast a builder reclaims an incomplete building (defaults to 1) -Added [action]refundAllQueuedItems (boolean) -Added [action]removeAllQueuedItemsWithoutRefund (boolean) -getOffsetAbsolute() and getOffsetRelative() now support dynamic parameters -Added self.isInMap() -Added game.mapWidth() and game.mapHeight() -Added [resource]iconImage - Show an image with this resource in HUD and text -Added [resource]iconImageUseInText (default true) - Shows resource icon in action description -Added [resource]displayNameHideWhenIconShownInText (default false) - Useful to shorten description text -Added [resource]displayNameHideWhenIconShownInHUD (default false) -Added [resource]displayColorUseInText (default true) - Shows resource color in action description -Added [resource]appendResourceInHUD - will stack another resource after this on in HUD. Uses the colors and icons of the target resource and can be stacked. -Added [resource]displayPrefixInHUD - text to show before resource value, replaces resource name and removes ‘: ‘ useful with appendResourceInHUD -Added [resource]displayPostfixInHUD - text to show after resource value -Added [graphics]showShotDelayBar (default true) - Used to hide calldown of slow firing turrets -Added [resource]displayTextAppendResourceWithGap - default false. Adds space between resources when putting unrelated resources on the same line. -Added [resource]appendResourceInHUD_whenThisZero - default true. False to allow appended resources like max values to be hidden with the parent resource. -displayTextAppendResource now automatically breaks lines if they are too wide for the screen. Useful for small displays or phones in portrait mode. -Added support for modulus in dynamic numbers -[action]setBodyRotation now supports dynamic numbers -Added self.isReversing() -Support CORE: in copyFrom -'custom:' is now optional on effect names
Other fixes and features
-Large mod loading speed ups for all platforms, especially with heavy copyFrom use -Fixed DPI scaling issue on the window 64 bit version -Caching mod-info.txt data to avoid zip extraction in disabled mods to speed up load times -Crash fixes for android experimental opengl mode -Fix newlines in ${} static blocks -Fix horizontal scrolling of multiplayer game list on android -Fix: DamagingBorder hurting transported units -Fix: Ships unloaded underwater now don’t stay underwater -Fixed empty color fields in mods showing confusing error message -Fixed desync bug caused by convertToNeutralIfNotTransporting -Fixed custom projectile imageShadow not showing on android -Android: Fixed dropdown map not picking right map in battleroom or advanced skirmish in 1.15 -Android: Attempted fixes for audio glitches when lots of sounds are playing on some devices (Let me know if it helps.) -New support for Storage Access Framework on Android to help make mods with API level 30 required by the Google Play store. --Android API 30 removes all normal direct file access between apps without SAF. eg a text editor editing an ini file in a mod. Which would make Android modding much harder as an .rwmod would need to be created and imported for every change. --SAF is a way to return external file access on Android but completely changes how files are handled internally, so please test all file related systems (saving, custom maps, importing files, replays, reading mods, etc) and let me know about any issues. --Unfortunately Storage Access Framework (SAF) performance is much slower than direct file access which could make loading large mods quite slow so added a ‘Quick Reload’ button to sandbox to try and work around this issue on android. This reloads data only for units that are active on the map. (but this might miss some transitional units right now.) --Note load times for imported .rwmod mods should be mostly unaffected, and in some cases faster, this is mostly an issue for Android mod makers with unpackaged mods. --Note once the beta has been updated to API 30, I’ll not be able to revert to API 29 so testing this as an Alpha first. -Fix PC experimental teamshaders for some devices -Fix sandbox replay mode not using modded units -Fix add/setResourcesWithLogic lowercasing all input -Fixes for copyWaypointFrom not working for self with unitsSpawnedOnDeath -Fix bug with setCustomTarget2 -builtFrom_x_isLocked now works on old style units like land factory, etc -Fixes for projectiles passing though units when moving down at high speed -Show warnings to modders if canNotDirectlyBeAttacked starting unit causes instant defeat -Fix crash with showActionsWithMixedSelectionIfOtherUnitsHaveTag used with attack ground UI and different numbers of turrets. -Guard order ends if target is an enemy and becomes stealthed -Fixed issue with teamTagDetect map trigger throwing missing team error -Fixed nearestUnit logic boolean not finding neutral units -globalMessage in map scripts now supports globalMessage_LANG -Fixed addWaypoint_target_randomUnit missing some targets -Stealthed units can be seen by spectators and in replays -Fixed building placement guide in some cases helping showing enemy locations through fog -Stop queueItemAdded and queueItemCancelled triggering when item fails to add/remove. -Make fogOfWarSightRange unit stats changes refresh fog -Added ’save logs’ debug option on Android -Clearer error message when dynamic logic is used on a static function parameter -Fix battleroom on PC when using UI scaling (already hotfixed) -Fixed sendMessageData not having the right scope to access things like memory, etc -Error if keys in sendMessageWithData contain spaces -Allow string variables to be set and compared to null -Fix reclaiming with new streaming system allowing resources to be gained -Fix cooldowns not showing on actions from [attachment]showAllActionsFrom -Fixed sandbox editor map export on android when using SAF -Fixed external custom maps not streaming to other players in multiplayer on Android using SAF -Stopped aggressive neutral team capturing neutral 119 more fixes... (but I hit the text limit on steam update posts)
v1.15p8 beta released
To try it out right click on the game in steam go to 'properties' then pick the 'beta' tab and pick 'beta' in the dropdown (make sure the game is not running first).
Over 100% faster rendering on PC with high numbers of small units on screen (runs smooth in tests with 10,000+ units on-screen)
New unit - Heavy AA Ship (by uber)
Overrides for each players in multiplayer and advanced skirmish ---AI difficulty can now be set differently for each AI player ---Starting units can be different for each player, useful for faction selection in mods. ---Unit color can be overridden for each player
Desktop version: Experimental -teamshaders commandline switch will use shaders for team coloring reducing memory use of mods with large images, and lag when first applying coloring.
Moddable resource streaming style systems like in TA, C&C, etc.
Modding features and changes:
Moddable resource streaming:
--[core]streamingCost - Like price but paid for overtime while this unit is being queued or built. Construction or queue is paused if resources run out while building.
--[action]streamingCost - Like price but paid for overtime while action is queued, queue is paused if resource runs out. Flags can be used to pause and unpause from triggers.
--[core]switchPriceWithStreamingCost:boolean/[action]switchPriceWithStreamingCost:boolean shortcut to set streamingCost to price value and clear price.
--Add [core]switchPriceWithStreamingCost to all-units.template to quickly switch a mod over to streaming resources.
Dynamic logic boolean overhaul, with new dynamic number, unit, string types
Comparison support added to logic booleans: == != < > >= <=
--Instead of “autoTrigger: if self.energy(greaterThan=100)” it's possible to do: “autoTrigger: if self.energy > 100”
Logic boolean/number maths: - +
/
-Eg: “autoTrigger: if 2*self.energy + parent.energy-10 > 50”
-Dynamic text support has been added to [action]text, [action]description, [action]setUnitMemory, [action]showMessageToPlayer, [action]showMessageToAllPlayers, [action]showMessageToAllEnemyPlayers, [action]showQuickWarLogToPlayer, [action]showQuickWarLogToAllPlayers, [action]debugMessage
Multi line support has been added and can be used on any key with 3 quotes to start and end. Eg: copyFrom:""" ROOT:a.ini, ROOT:b.ini, ROOT:c.ini """
[core]defineUnitMemory creates variables for custom storage unique to each unit.
-Eg [core]defineUnitMemory: boolean nukeActive, boolean laserReady, float experience, unit nextTarget, unit homeBase, string customText
New logic boolean function: readUnitMemory(name:string, type:string{boolean,unit,float,string}, [default]) eg: parent.readUnitMemory('nukeCountdown',type='float'). Default is used if that unit memory doesn't exist or the type in the saved data is wrong.
New logic boolean function: memory(name) which is a shortcut to read the current unit with current defineUnitMemory types.
New resource shortcuts. eg: self.resource.credits and self.resource('credits')
Added [action]switchToTeam: {logicNumber}
New logic boolean/number/unit/string functions:
-self.maxHp()
-self.teamId() - Return team id of unit or market. Starts at 0. (but -1 for a neutral team)
-self.x() - Return x location on map. Available on units and markers.
-self.y() - Return y location on map. Available on units and markers.
-self.z() - Return z/height on map. Available on units and markers.
-self.dir() - Return direction. Available on units and markers.
-self.priceCredits() - Credits this unit cost
-distance(x1,y1,x2,y2) - Distance between points. Slower than distanceSquared.
-distanceSquared(x1,y1,x2,y2) - Faster distance, but result is squared
-distanceBetweenSquared(unit1, unit2) - Bit faster than distanceBetween
-int(x) - Removes decimal places from a number. int(4.2) == 4
-select(bool, textA, textB) - returns textA if bool is true otherwise returns textB
-debug(logicBoolean) - Returns a text string helping to explain the reason for the current result. Can see into nested logic, comparisons, and operators.
-str(x) - Convert a number, unit or boolean into a string: eg str(self.energy)+'x' == '100x'
-createMarker(x,y,[height],[teamId],[dir]) - Returns a temporary unit marker. Can be saved in memory or used as a reference for move orders, etc. Doesn't affect game state. Automatically removed if not referenced anymore.
-globalSearchForFirstUnit(withTag=x, relation) - Returns first unit found matching the filter
-null/nullUnit - A null/missing unit. Useful in comparisons eg: self.customTarget2 != null
New logic boolean/unit reference system:
--Chaining those all functions is supported eg: self.attachment(withTag='x').lastDamagedBy.getAsMarker()
--self - This is the existing reference for the current unit (was the only option in past versions). Eg autoTrigger: if self.energy > 100
--attachment([slot], [withTag])
--attacking - Current target this is attacking, might not be the current waypoint target.
--lastDamagedBy - Last unit that attacked this.
--parent - The transporter or attachment parent. Eg autoTrigger: if parent.energy > 100
--activeWaypointTarget - Current active waypoint target. Includes attacking, transporting, repairing, etc.
--customTarget1 - Custom memory, defaults to the unit that created this unit.
--customTarget2 - Custom memory, defaults to null
--nearestUnit(withinRange=500, withTag='x', relation='any') - Search for a unit, slow, not recommended in autoTriggers
--getAsMarker() //creates a temporary marker at the position a unit is right now. Markers are fast to create and automatically removed when no longer needed. Is not linked to any unit and still exists when the unit dies, and stays the same when source moves. Eg: lastDamagedBy.getAsMarker() - to remember location of last attack. Markers store x/y/height/dir/team data.
--getOffsetAbsolute([x],[y],[height]) - Returns marker with absolute offset
--getOffsetRelative([x],[y],[height],[dirOffset]) - Returns marker with relative offset
--thisActionTarget - Used in inside actions to get action target, location, auto trigger event source, etc. Will be set as a unit, marker, or null depending on the action trigger source. Note: Will always be null when used on UI text fields, etc as it's only valid on the action event. Save the value to memory if you want it shown in the UI.
---thisActionTarget examples:
---fireTurretXAtGround: mainGun (thisActionTarget==Marker with ground location)
---autoTriggerOnEvent: tookDamage (thisActionTarget==Unit that caused damage)
---autoTriggerOnEvent: killedAnyUnit (thisActionTarget==Unit that was killed)
---autoTriggerOnEvent: transportingNewUnit (thisActionTarget==Unit that was transported)
---alsoTriggerAction: x (thisActionTarget==Same as original action)
---[turret]onShoot_triggerActions: x (thisActionTarget==Target that was shot at)
---takeResources_triggerActionIfAnyCollected: x (thisActionTarget==Target with resources)
---addWaypoint_triggerActionIfMatched: x (thisActionTarget == Marker for move/Target for attack, etc. Note: use addWaypoint_maxTime:0 if you want to search only)
customTarget1/customTarget2 added to all units. Can store a reference to another unit. customTarget1 defaults to the unit or building that created the unit. Useful for things like aircraft carriers, infantry squads, teleporter links, etc. ([core]defineUnitMemory can also be used to add more)
-eg: setResourcesWithLogic: hp=self.parent.hp - 10, energy = self.energy / 2
-eg: addResourcesWithLogic: hp = select( self.parent.energy>5, 10, 20 )
Added [core]autoTriggerCheckRate and [action]autoTriggerCheckRate - with the options everyFrame (default), every4Frames, every8Frames
--Note: all triggers regardless of check rate are checked when first created and after an auto trigger cooldown. Checks rates every4Frames/every8Frames are randomly spread out between units so they don't all happen on the same frame, making it smoother. Adding [core]autoTriggerCheckRate:every8Frames to all-units.template could have a large performance boost for mods with complex autoTriggers. Often x8 better performance from autoTriggers. In rare cases some triggers might still require checking every frame so this is not a default.
New unit produce/spawning parameters:
--Added spawnSource(unitRef) - Effects location and team eg: [action]spawnUnits: tank(spawnSource=memory.lastLocation)
--Added copyWaypointsFrom(unitRef) - Copies all waypoints on target to created units. Eg: spawnUnits: tank(copyWaypointsFrom=self)
Modulus operator (%) added to ${} template blocks
[turret]unloadUpToXUnitsAndGiveAttackOrder - Now unloads units at turret location (testing needed)
Added [core]borrowResourcesWhileBuilt - like [core]borrowResourcesWhileAlive but doesn't take effect till built. Mostly useful for buildings like houses that have negative resources to add to a unit cap, etc.
Added [action]takeResources_includeReference - unit ref - eg: [action]takeResources_includeReference: self.lastDamagedBy
Added [action]addWaypoint_target_fromReference - unit ref
Added [attack]shootDelayMultiplier default 1
Added [action]setUnitStats allows changing of a select number of fields dynamically without converting. Supports =/+=/-=, with dynamic maths/logic. Changeable fields: maxHp, hp, maxShield, shield, shieldRegen, maxEnergy, energy, armour, mass, shootDelayMultiplier, moveSpeed, maxAttackRange. Eg: setUnitStats: maxHp+=self.energy+100, hp+=50, shieldRegen=0.5
Added [action]resetUnitStats (boolean)
Added [action]convertTo_keepCurrentFields - Don't change these fields when converting, useful with setUnitStats (Allowed fields: maxHp, maxShield, shieldRegen, maxEnergy, armour, mass, shootDelayMultiplier, moveSpeed, maxAttackRange.)
Added [action]whenBuilding_temporarilyConvertTo_keepFields - Don't change these fields when using whenBuilding_temporarilyConvertTo (both to and from), useful with setUnitStats.
Added [attack]shootDamageMultiplier
Added [projectile]trueGravity that affects heightSpeed. [projectile]gravity only affected height directly so it had no acceleration.
setUnitStats can now dynamically change shootDamageMultiplier
setUnitStats can now dynamically change maxTurnSpeed
Added [action]switchToTeam: {logicNumber}
Added 'eventSource' for use with autoTriggerOnEvent. (The thisActionTarget with autoTriggerOnEvent examples in 1.15p1 changelog are incorrect. Use eventSource instead for those.)
Added a @memory shortcut in [core] for defineUnitMemory to create a single memory variable. This should work better with templates and copyFrom logic as a single defineUnitMemory gets overridden. Example: @memory customText:string
Added [action]fireTurretXAtGround_withTarget (Takes unit or marker reference)
Added [effect]pivotOffset - like dirOffset but also rotates all relative keys, and child effects spawned
Added [effect]pivotOffsetRandom
Make fogOfWarSightRange unit stats changes refresh fog
All random logic is more random and a shared random seed is created for each match, for random starting spawns, resource placements, etc.
Added rnd(min,max) logic boolean which generates a synchronised random float. eg: [action]requireConditional: if rnd(0,1)<0.6 (for a 60% chance of action working)
Added lowercase(string) and uppercase(string) logic functions
Added cos() and sin() logic booleans
Added direction(x1,y1,y2,x2) and directionBetween(unit1, unit2) logic functions
Added enteredTransport, leftTransport events to autoTriggerOnEvent. With eventSource being the transport.
Fixes for copyWaypointFrom not working for self with unitsSpawnedOnDeath
Fix unloadUpToXUnitsAndGiveAttackOrder not working well with attachments
--Use autoTriggerOnEvent:newMessage(withTag=x) to read these messages on the targeted unit, and the logic function eventData(name, type, [default]) to read the sent data.
--Use autoTriggerOnEvent on tookDamage supports optional (withTag=x) parameter, which reads projectile tags. Eg: autoTriggerOnEvent:tookDamage(withTag=fire)
readUnitMemory/eventData with a type string will now auto convert any non-string data for easier debugging
nearestUnit() now has a default range of 500 (instead of 0)
takeResources_includeReference, setCustomTarget1/2 supports dynamic references (eg from memory, logic, etc)
Added [core]nanoReclaimSpeed - how fast a builder reclaims a normal unit (defaults to nanoRepairSpeed*5.1 to match behaviour of older versions)
Added [core]resourceReclaimMultiplier - how fast a builder reclaims a resource (defaults to 1)
Added [core]nanoUnbuildSpeed, how fast a builder reclaims an incomplete building (defaults to 1)
Show warnings to modders if canNotDirectlyBeAttacked starting unit causes instant defeat
setUnitStats can now dynamically change fogOfWarSightRange
setUnitStats can now dynamically change nanoRange
Added self.isInMap()
Added game.mapWidth() and game.mapHeight()
Added [resource]iconImage - Show an image with this resource in HUD and text
Added [resource]displayColorUseInText (default true) - Shows resource color in action description
Added [resource]appendResourceInHUD - will stack another resource after this on in HUD. Uses the colors and icons of the target resource and can be stacked.
Added [resource]displayPrefixInHUD - text to show before resource value, replaces resource name and removes ‘: ‘ useful with appendResourceInHUD
Added [resource]displayPostfixInHUD - text to show after resource value
Added [graphics]showShotDelayBar (default true) - Used to hide calldown of slow firing turrets
Clearer error message when dynamic logic is used on a static function parameter
getOffsetAbsolute() and getOffsetRelative() now support dynamic parameters
Added selfRegenRate to setUnitStats
Added onlyIfEmpty to unitDetect map trigger
Added [resource]displayTextAppendResourceWithGap - default false. Adds space between resources when putting unrelated resources on the same line.
Added [resource]appendResourceInHUD_whenThisZero - default true. False to allow appended resources like max values to be hidden with the parent resource.
displayTextAppendResource now automatically breaks lines if they are too wide for the screen. Useful for small displays or phones in portrait mode.
Added support for modulus in dynamic numbers
Added self.isReversing()
Made [resource]displayPos work with global resources. Defaults to 0. (It didn’t do anything before, wasn’t meant to be documented)
Fixed [resource]displayWhenZero so it shows for resources that haven’t been used yet
Changes and fixes:
Fix displayWhenZero was still not working if player had no custom resources of any type
Better minVersion mod checks - fix messages and edge cases
Fix setUnitStats selfRegenRate being rounded
Fix crash importing files that are still downloading in browser
Fix crash loading save file
Fix crash starting game from save file that fails to be read
Fix crash on game start in some cases if replay file fails to be created (normally from SAF)
Fix some properties of modular spider unit
Clearer error message if thumbnail missing on workshop steam upload
Show progress popup importing mods on android and avoid UI freeze
Importing changed rwmod file now refreshes data without needing to restart game
Fix imported changed rwmod files with SAF duplicating instead of replacing existing mod
Fix android screen rotation in opengl mode sometimes causing half the screen to cut off
Some file reading speed ups
Some android menu improvements
Show current attachment in sandbox debug mode
Made unit flags in sandbox debug mode human readable
Show warning popup for overlapping key binds on PC
Fix issues restoring game rules like no nuke, income multiplier, etc from save files (only fixed in new saves for old saves load them in advanced skirmish as a workaround)
spawnUnits gridAlign is now applied after offsetRandomX/Y instead of before
Skip any __MACOSX temp folders in mod data from mac os
Reverting to using legacy direct access storage on Android 9 or less to avoid OS bugs and missing file managers in these android versions, should be possible as scoped storage isn’t forced on those devices.
New android debug option ‘saf force off’ to test direct access, not recommended as this will likely fail in odd ways on newer Android versions, with the OS hiding files from the game.
New android debug option ‘saf force on’ to test saf on older Android versions
New android debug option ‘share logs’ - shortcut to save game logs then show share popup
Message for minVersion in mod-info.txt shows build numbers and current version.
Clamp turret delay and recoil when changing shootDelayMultiplier with setUnitStats
Fix for logic boolean type error on first load
Fix blank screen with android opengl after context loss
Fix rendering of unit help screen on PC
Fix issue with rwmod mods with extra folders not able to be deleted or shared
Fix appendResourceInHUD icons showing up too small
Fix threading crashes reloading mod data on android
Fix debug language overrides not affecting some strings like map triggers
Fix changeCredits map trigger showing incorrect warnings about add/set
Fix v1.15p6 regression with texture atlas causing rendering artifacts
Fix v1.15p6 regression stopping live reloading of textures when using texture atlas
Fix mid path pause when high speed units take a long path
Fix crash when invalid map thumbnails or images are loaded in GUI on PC
Fix rare resume crash on android
Fix crash when importing files fail to send file data on android
Fix crash when import fails to write to target file
Fix crash when maps have invalid floats properties
Fix crash if maps have no tiles defined
Fix crash in UI with fireTurretXAtGround limits and converted/reloaded unit
Fix crash when music fails to list an internal folder
Fix crash running out of memory creating some bitmaps
Fix crash when creating directory over SAF fails
Fix crash in experimental opengl renderer on android
Fix crash rendering too many circles on iOS
Fix race condition threading crashes on iOS
Fix battleroom on PC when using UI scaling (already hotfixed)
Fixed sendMessageData not having the right scope to access things like memory, etc
Error if keys in sendMessageWithData contain spaces
Allow string variables to be set and compared to null
Fix reclaiming with new streaming system allowing resources to be gained
Fix cooldowns not showing on actions from [attachment]showAllActionsFrom
Fixed sandbox editor map export on android when using SAF
Fixed external custom maps not streaming to other players in multiplayer on Android using SAF
Stopped aggressive neutral team capturing neutral
Lots of crash fixes
New support for Storage Access Framework on Android to help make mods with API level 30 required by the Google Play store.
-Android API 30 removes all normal direct file access between apps without SAF. eg a text editor editing an ini file in a mod. Which would make Android modding much harder as an .rwmod would need to be created and imported for every change.
-SAF is a way to return external file access on Android but completely changes how files are handled internally, so please test all file related systems (saving, custom maps, importing files, replays, reading mods, etc) and let me know about any issues.
-Unfortunately Storage Access Framework (SAF) performance is much slower than direct file access which could make loading large mods quite slow so added a ‘Quick Reload’ button to sandbox to try and work around this issue on android. This reloads data only for units that are active on the map. (but this might miss some transitional units right now.)
-Note load times for imported .rwmod mods should be mostly unaffected, and in some cases faster, this is mostly an issue for Android mod makers with unpackaged mods.
-Note once the beta has been updated to API 30, I’ll not be able to revert to API 29 so testing this as an Alpha first.
Large mod loading speed ups for all platforms, especially with heavy copyFrom use
Fixed DPI scaling issue on the window 64 bit version
Fixing UI scaling regression on PC with last 1.15 beta
Caching mod-info.txt data to avoid zip extraction in disabled mods to speed up load times
Crash fixes for android experimental opengl mode
Fix newlines in ${} static blocks
Fix horizontal scrolling of multiplayer game list on android
Fix deleting and renaming of saves and replays on android beta
Fix PC experimental teamshaders for some devices
Fix sandbox replay mode not using modded units
Fix add/setResourcesWithLogic lowercasing all input
Fix bug with setCustomTarget2
Fix regression crash with builtFrom_x_isLocked and no message
builtFrom_x_isLocked now works on old style units like land factory, etc
substring function now supports dynamic start and end numbers
Fixes for projectiles passing though units when moving down at high speed
Fix crash with showActionsWithMixedSelectionIfOtherUnitsHaveTag used with attack ground UI and different numbers of turrets.
Guard order ends if target is an enemy and becomes stealthed
Fixed issue with teamTagDetect map trigger throwing missing team error
Fixed nearestUnit logic boolean not finding neutral units
globalMessage in map scripts now supports globalMessage_LANG
Fixed addWaypoint_target_randomUnit missing some targets
Stealthed units can be seen by spectators and in replays
Fixed building placement guide in some cases helping showing enemy locations through fog
Stop queueItemAdded and queueItemCancelled triggering when item fails to add/remove.
Added ’save logs’ debug option on Android
Android: Fixed beta bug with save files not able to be deleted in 1.15
Android: Fixed beta bug with save files not able to be renamed in 1.15
Android: Fixed dropdown map not picking right map in battleroom or advanced skirmish in 1.15
Android: Attempted fixes for audio glitches when lots of sounds are playing on some devices (Let me know if it helps.)
Fix: DamagingBorder hurting transported units
Fix: Ships unloaded underwater now don’t stay underwater
Fixed empty color fields in mods showing confusing error message
Fixed desync bug caused by convertToNeutralIfNotTransporting
Fixed attacking unit ref missing in 1.15p1
Fix delay when spawning lots of building type units on map load
Internal storage option on Android to allow saves/mods/custom maps to work without needing any storage permissions. Note that internal app storage is deleted by Android when uninstalling.
Fix whenBuilding_temporarilyConvertTo flickering between unit types
Fix temporary tags being reset on sandbox unit reload
Fix Trigger Debug showing on all sandbox tabs
Fix teamColoringMode when using the same image with different modes
Fixed custom projectile imageShadow not showing on android
Lots of other fixes
Rusted Warfare Major Update 1.14
Rusted Warfare Major Update 1.14
A new update to Rusted Warfare is out!
New Unit: Modular Spider
-A walking mobile base -Starts with no weapons but has 6 slots where turrets, or modules can be built and upgraded. -Is a Starting unit only, picked from the Game Options (cannot be built normally unless using mods) -Possible add-on modules: ---Shield Gen, Anti-Nuke, Fabricator T1 & T2, Laser Defense, Lightning, Flak, Artillery, Sam T1 & T2, Gun T1 & T2, Plasma T1 & T2 -Very heavily armored but slow -Base speed is reduced if any weapons are attached -Can build units and buildings -Auto repairs nearby units -Can move over water -Built-in Fabricator -Goes nuclear on death (if nukes are enabled)
New Turrets and buildings
-Lightning Turret T1 & T2 - Upgraded from basic land turret -Artillery Turret T2 - Upgraded from artillery turret -Watch tower - Sees through fog in a large range, built from T2 builders
Extractor T3 upgrades
New optional upgrades, only one can be picked at a time: -Overclock: Much less health. Generates credits faster. Can be reverted back to T3 for a 50% refund. -Reinforce: More health. [Adds shield. Self-repair. But generates same credits. Can be reverted back to T3 for a 50% refund.
New Unit: AA Beam Gunship
-Anti-air particle-beam weapon -Beam weak vs shields -Can not attack land -Slow speed unless using afterburner action -Balance wise this unit is meant to counter Amphibious Jets but be countered it's self by Heavy Interceptors (creating a triangle)
New Unit: Heavy Anti-Air Mech
-Strong and long range air attack -Area affect anti-air -Weak land attack
New servers
-Relay servers for easier hosting of games (useful when mixing in Android/iOS clients that cannot use steam invite) ---To setup a relayed game use 'direct join' to one of: us1.relay, us2.relay, asia1.relay ---Other players will be able to join your game by entering the shown Room Code into direct join. ---Games aren't public yet, so share your room id with friends or on the discord server. -Modular Spider FFA battle royale servers (with up to 100 players!) ---Closing borders to force battles between players ---Crates randomly drop around the map that can be reclaimed ---(This was setup before AoE also did this lol)
Releasing on iOS very soon
-Store page here: https://apps.apple.com/au/app/rusted-warfare-rts/id1514329124 -Cross-platform multiplayer between Windows, Linux, Mac, Android, and iOS -Any support on release would be great. (Pre-orders would be helpful too but I know people don't like to do that.)
Other major changes.
-New maps: Hills (2p), Manipulation (4p), Two Large Islands (10p), Wetlands (10p) -Spectator support, players can be set as spectators to just watch games. And all players can be set as spectators from team layout. -Borderless fullscreen option on Windows/Linux -PC version uses a lot less memory loading images from mods so it can support bigger mods -Can create replays in sandbox (and play them back within the editor) useful for creating videos, trailers or machinima -Can hide the interface in sandbox and replays for screenshots and videos -New background map added to menu rotation -Nicer map rendering when zoomed out -Afk players players get shared control turned on to their allies as if they disconnected -Much faster rejoins and resyncs in multiplayers, with less impact on replays -Adds 1.5x, 2.5x income multipliers to the existing 2x setting -The host can pause multiplayer games by typing ‘-pause’ -The host can type ‘-roomlock true’ in battle room to stop new players joining -Android: Now has export as map in sandbox -Fix attack move on bombers, etc -Defeat stats screen -Flying fortress can be picked as a starting unit -Carrier $38000->$30000, x5 factory speed to x2 factory speed. To help make this a more general purpose unit. -Fabricator $1500->$2200 (as well as upgrades), to promote more extractor focused gameplay. -Android: Much faster map and fog rendering (27x faster in extreme benchmarks, yes really) -Android: See-through interface from PC, can be switched back to classic style in settings -Android: Unit cap can be changed in settings, up to 10,000 units per team -Lots of new map scripting features for creating custom missions -A bit of a tutorial help added to mission 1 -Improved pathfinding with better performance -Fix fog not being restored when loading saves -Fix streaming maps from compressed .rwmod files in multiplayer -Better performance on units with large numbers of actions -Much faster unit/mod loading times -Better handling of out of memory while loading mods -FPS cap upped to 300fps for high refresh rate screens -Fix xOffsetAbsolute, yOffsetAbsolute, xOffsetAbsoluteRandom and yOffsetAbsoluteRandom weren't working on [effect], this might cause issues for mods that expect them to be broken. -New 500x500 pixel map thumbnail image limit, recommended is 100-200px (note: this is just the preview image, not the map size) -Fix false positive warning message with addTeamTags/removeTeamTags map scripts -Fix income multiplier and no nuke option not working in single player skirmish
Lots of new modding features
-See: Rusted Warfare: Beta Modding Reference for complete 1.14 reference -Added: [graphics]isVisibleToEnemies and [graphics]showOnMinimapToEnemies - allows creation of stealth systems when used with canOnlyBeAttackedByUnitsWithTags, and converting to revealed versions -Added: [ai]lowPriorityTargetForOtherUnits and [ai]notPassivelyTargetedByOtherUnits - Allows better wall buildings that units don’t target by default. -[action]addActionCooldownTime, [action]addAllActionCooldownsTime and [action]clearAllActionCooldowns - Player cannot use action again till timeout expires -[animation]effect_Xs: { x, y, name } - Spawn effects while playing an animation -Added: [action]convertTo_keepCurrentTags -Added: [core]disableDeathOnZeroHp -Added: [action]takeResources_directTransferStoppingAtZero -Per unit leg limit is now 20 -Added %{self.playerName}, %{self.teamName}, %{self.resource.X} to showMessageToAllPlayers, etc actions to create dynamic messages -Added: [turret]aimOffsetSpread -Added: [action]addWaypoint_position_relativeOffsetFromSelf -Added: [action]whenBuilding_rotateTo_aimAtActionTarget and [action]whenBuilding_rotateTo_rotateTurretX (BETA NOTE: is broken in some cases) -Added: [attachment]showAllActionsFrom (logic boolean) - shows actions from the attachment when parent is selected, when clicked actions will be applied to the attachment as if they were selected. Can be used to create inventory systems, or control subsystems of a unit, etc. -[action]isAlsoViewableByEnemies and [action]isAlsoViewableByAllies - Allows other players to see actions from this unit, useful for showing stats to other players (eg missile count, items collected) -transportedUnitsToTransfer=X option added to unitSpawn fields - Moves units from the source unit into the newly created unit. Can be used to create parachutes from planes, teleport effects, etc -Added: [movement]heightChangeRate -Added: [movement]fallingAcceleration, [movement]fallingAccelerationDead -New logic function: self.height() -Added: [effect]alsoEmitEffectsOnDeath -Added: [effect]lifeRandom -spawnPoint_eachActiveTeam option added to [core]onNewMapSpawn -Added: [action]addWaypoint_triggerActionIfMatched -Added: [action]showMessageToAllEnemyPlayers (need test) -Added support for ranges in flag ids (eg: unsetFlag=1-5) -Note unit flags are now unset before new flags are set -unitRef feature with functions: self, self.parent(), self.transporting(slot=x), self.attachment(slot=X) - eg: [action]textAddUnitName: unitRef self.attachment(slot="1") -Added: [action]textAddUnitName: unitType or unitRef -Added: [action]descriptionAddFromUnit: unitType or unitRef -Added: [action]descriptionAddUnitStats: unitType or unitRef -Changed: [action]unitShownInUI: now also supports as unitRef -Added: [action]unitShownInUIWithHpBar - (boolean) default true, Only used when unitShownInUI is a unitRef -Added: [action]unitShownInUIWithProgressBar - (boolean) default true, Only used when unitShownInUI is a unitRef. Replaces HP bar if active -Added: [action]attachments_unload -Added: [action]forceUnloadTransportNow_onlyOnSlot -Added: [resource]displayRoundedDown -Added: [projectile]wobbleAmplitude -Added: [projectile]wobbleFrequency -Added: [projectile]turnSpeed -Added: [projectile]spawnProjectilesOnEndOfLife (projectile types) - eg: spawnProjectilesOnEndOfLife: torpedo_split(offsetDir=90), torpedo_split(offsetDir=-90) -Added: [projectile]spawnProjectilesOnExplode (projectile types) -Added: [projectile]spawnProjectilesOnCreate (projectile types) -spawnProjectile options: spawnChance, maxSpawnLimit, recursionLimit, offsetX, offsetY, offsetRandomXY, offsetRandomX, offsetRandomY, offsetHeight, offsetRandomDir, offsetDir -Added: [turret]canAttackMaxAngle -transportUnloadedOrRemovedUnit added to [action]autoTriggerOnEvent -Changed: [projectile]pushForce / pushVelocity now working on all units -Added: [turret]barrelOffsetX_onOddShots -Added: [core]canReclaimUnitsOnlyWithTags -Added: [core]canRepairUnitsOnlyWithTags -Added: [placementRule_X] section - allows creation of -[placementRule]anyRuleInGroup:X (Only require 1 of the rules in this group pass, instead of all. Use the same group name on other placement rules to create a group.) ---[placementRule]searchTags:X ---[placementRule]searchTeam:[TeamRelation] defaults to own ---[placementRule]searchOffsetX: defaults to 0 ---[placementRule]searchOffsetY: defaults to 0 ---[placementRule]searchDistance:X ---[placementRule]excludeIncompleteBuildings: [true/false] ---[placementRule]excludeNonBuildings: [true/false] ---[placementRule]minCount:X ---[placementRule]maxCount:X ---[placementRule]blocksPlacement: [true/false] ---[placementRule]cannotPlaceMessage: Message shown to player if this rule fails (will be first failing rule in mergedRuleGroup) ---[placementRule]checkEachTile: [true/false] defaults to true (set to false to only test unit center) -Added: [projectile]mutatorX_addResourcesDirectHit -Added: [projectile]mutatorX_addResourcesAreaHit -Added: [core]exitHeightIgnoreParent -Added: [core]ignoreInUnitCapCalculation (defaults to true for buildings) -Added: [action]iconExtraImage -Added: [action]iconExtraColor -Added: [action]iconExtraIsVisible (logic boolean) -Added: [core]explodeTypeOnDeath - (options: verysmall, small, normal, large, largeUnit, building, buildingNoShockwaveOrSmoke, verylargeBuilding) -Added: [core]fogOfWarSightRangeWhileNotBuilt -Added: [projectile]moveWithParent -Added: [projectile]sweepOffset -Added: [projectile]sweepSpeed -Added: [turret]idleSweepAngle -Added: [turret]idleSweepDelay -Added: [turret]idleSweepSpeed -Added: [turret]idleSweepCondition -Added: [turret]idleSweepAddRandomDelay -Added: [turret]idleSweepAddRandomAngle -Added [turret]altProjectile (Projectile) and [turret]altProjectileCondition (LogicBoolean) -Added numberOfUnitsInAggressiveTeam() logic boolean (for the special 'aggressive to all' team) -Added logic boolean self.numberOfUnitsInAllyNotOwnTeam -Added: [attachment]keepWaypointsNeedingMovement -Added: [core]effectOnDeathIfUnbuilt -Added: [action]setBuilt (float 0-1) -Added: [action]offsetSelfAbsolute: x,y,[height] -Added: [action]alwaysSinglePress (default false) - No confirmation needed on mobile, use with canPlayerCancel: false and allowMultipleInQueue: false to also hide the queue interface. -Added: [action]addActionCooldownApplyToActions (actions) -Fix requireConditional on queue items causing false positive desync message to show -Added [core]isUnselectableAsTarget (boolean) and [attachment]isUnselectableAsTarget (boolean) (defaults to the isUnselectable's field) -Added 'tookDamage' to autoTriggerOnEvent -Added [effect]animateFrameLooping (boolean) -Added [projectile]hullDamageMultiplier (float) - can be used to create EMP weapons that affect shields only -Added [turret]onShoot_triggerActions (actions) -[attack]canAttackFlyingUnits/canAttackLandUnits/canAttackUnderwaterUnits no longer required if [attack]canAttack is false -Added: [attached]redirectDamageToParent (boolean) and [attached]redirectDamageToParent_shieldOnly (boolean) -Added [graphics]image_shield -[action]resourceAmount, [action]convertResource_* now also support built-in types like: energy, ammo, credits, hp, shield -Added [action]addWaypoint_target_randomUnit_tagged (needs testing) -Added [action]addWaypoint_target_randomUnit_team (needs test) -Added [action]addWaypoint_target_randomUnit_maxRange (needs test) -Added 'teamTagDetect' map trigger type (parameters: team, teamTag) -Added 'setPassiveTarget' waypoint type (needs test) -Added 'techLevel' to unit spawn parameters, mostly for built-in units and setting damagingBorder size. -Added 'alwayStartDirAtZero' to unit spawn parameters -Added 'xOffsetRelative' and 'yOffsetRelative' to projectile spawn parameters -Fix: newly captured buildings don't reveal fog -Added [projectile]beamImage (image) -Added [projectile]beamImageOffsetRate (float) -Added [projectile]beamImageStart (image) -Added [projectile]beamImageEnd (image) -Added [projectile]autoTargetingOnDeadTargetRange -Added [projectile]autoTargetingOnDeadTargetLead -Added [projectile]retargetingInFlight (needs test) -Added [projectile]retargetingInFlightSearchDelay (time) -Added [projectile]retargetingInFlightSearchRange (float) -Added [projectile]retargetingInFlightSearchLead (float) -Added [projectile]retargetingInFlightSearchOnlyTags (tags) -Added [projectile]sweepOffsetFromTargetRadius (note: shielded hovertank uses 0.4 for it's attack) -[projectile]moveWithParent now locks with turret instead of unit body for smoother beam effects -Added[projectile]instantReuseLast_alsoChangeTurretAim - Make turret's aim include last projectile's spread and sweep offsets, useful for beam weapons -Added [projectile]instantReuseLast_keepAreaDamageList - default false. Keeping the list was the normal behaviour in 1.13 making area damage not apply a second time but this is not useful. Use this only if you want the old behaviour. -Added [projectile]targetGround_includeTargetHeight for area affect AA weapons -Added [graphics]showShieldBar and [graphics]showQueueBar -Added [projectile]beamImageEndRotated and [projectile]beamImageStartRotated -Allow built-in resources with self.resource() and self.isResourceLargerThan() -Added moveCamera map trigger -Added [projectile]targetGroundHeightOffset for shooting over or under a target. Might be useful for projectiles that split and rain down. -Added [projectile]teamColorRatio_sourceRatio default is (1-teamColorRatio)
Update - v1.13.3
New map: Many Islands Large (10p)
New unit: Mech Engineer - T2 Mech builder with AA attack
Path finding system has 2x-3x better performance and uses less memory.
Team layout changer when hosting a game or in advanced skirmish. (eg easily switch to 5v5, 3v3v3, FFA and shuffle players)
Better AI that is more aggressive late game.
A new mod importer on android to make installing mods easy
Support for loading compressed mods
Game handles more mods installed at the same time
Significantly reduced texture memory use on PC version
Game doesn’t load data from inactive mods by default to save memory
Running out of memory loading a texture replaces it with a placeholder and warns instead of crashing
Running out of memory loading mod audio just warns instead of crashing
Long list of new modding features for people to make cool mods with including creating their own custom resources, attaching units together, and controlling unit behaviour
Advanced sandbox game setup
New 'modded' tab in sandbox to sort through a large number of modded units
Fixing desyncs playing multiplayer survival
Any required mods now shown before joining a server in server list
Lots of bug fixes
== Balance Changes ==
Experimental Tank - Larger damage AoE, slightly slower attack
Tesla Mech - Removed air attack
Artillery Mech price changed $1700 -> $1400
Heavy Artillery price changed $3800 -> $3100
Artillery Turret - Larger AoE and slightly more damage
Minor update - v1.13.2 (New maps, surrendering, context map pings, new features)
Main new features: -Surrender voting system added to multiplayer
-Map ping with context (eg ‘attack here’, ‘build here’), extra useful when playing with people from other languages
-Allow players to change their own teams in multiplayer even if they aren’t hosts
-New map: Valley Arena (10p) [by uber]
-New map: Kingdoms (10p) [by Vulkan]
-Start advanced skirmish from a custom map screen
-Double click to attack-move setting added
Other changes: -Units better follow paths and take a wider gap around obstacles when in a group
-Fixed replays and saves played on maps that were streamed to you from a server
-Fixes for map vibration on some zoom/resolutions
-Preview which units will be selected by box selection before releasing
-Better interactions with dedicated servers, battleroom interface improvements
-Show colored HP bars by team
-Fix useless T2 upgrade showing on mech factory
-Random values are more random
-Fixed attack-move melee units pushing targets
-Fixed attachedTo and effect shadows
-Smarter ally / enemy team starting locations in skirmish
-AI now starts building immediately on game start
-Remove blur from map at some zoom levels
-Fix client ids if game with preferences.ini copied to another machine
-Fixes for setting teams on dedicated servers
-Resync and rejoins are now much faster
-French and Dutch translations
-Keep current unit selection after resyncs
-Don’t make screen blank while resyncing
-Fix for ‘unit cap reached’ shown at multiplayer start
-Fog revealer is now unselectable
-Capture neutral in multiplayer
Balance: -Flame turret damage: 3 -> 4
-Fire Bee: Hp 5400 -> 4900, Build speed: 59.5s -> 83s
-Fabricator: Build time 11.9s -> 27.7s
--Fabricator T2 Upgrade time: 41.6s -> 55.5s
--Fabricator T3 Upgrade time: 55.5s -> 83.3s
-laser tank: Added track animations, more HP but higher cost
-Scout and Light gunship build times increased
New modding features: -Added numberOfUnitsInTeam(withTag, withinRange, incompleteBuildings=true/false, factoryQueue=true/false, ...) logic boolean - Useful for building prerequisites, tech unlocks, hero respawning, etc.
-added self.kills() and self.isOnNeutralTeam() logic booleans
-[leg/arm]hidden now allows a logic boolean
-[turret]invisible now allows a logic boolean
-New effects on victory screen
-added [turret]image_applyTeamColors
-added [turret]image_drawOffsetX / Y
-added [effect]teamColorRatio
-added isUnselectable and canNotBeDirectlyAttacked
-added IGNORE ini value, to skip keys and not load key in [core]copyFrom target
-[action] text and description support multiple languages
-[action] iconImage added
-[graphics]icon_zoomed_out added
-[action] deleteNumUnitsFromTransport added
-[core]canBuild_X_isVisible added (logic boolean)
-[core]canBuild_X_isLocked added (logic boolean)
-[core]canBuild_X_isLockedMessage added (text)
-[leg] drawLegWhenZoomedOut, drawFootWhenZoomedOut (boolean) - for performance
-[core]extraBuildRangeWhenBuildingThis (float)
-[core]disableAllUnitCollisions - (boolean)
Major release - v1.13 (Huge performance boost, 100s of new modding features, 8 new units, smarter AI, ...)
Main new features:
A new set of units
Light gunship - Very weak but cheap
Underwater probe - weak scout
Plasma tank - Strong land attack, Shield weak vs lightning
Heavy Interceptor - Heavily armed with shield, Shield weak vs lightning
Telsa Mech
Fire bee
Nautilus - Amphibious submarine
Aircraft carrier Heavily armed and armored, Builds air units (at x5 speed), Laser defence & repairbay, Anti-air, Can build anti-nuke missiles
Better smarter AI. Better able to defend itself, expand, smarter experimental spider usage, etc
Large performance improvements and much better at handling large maps (like the 1500*1500 crazy maps in the workshop)
3 new maps
1 new mission
Patrol order - will move between points forever, or guard an area will help repair/build any nearby units, will move to attack any nearby targets or anything that damages it.
Guard order - will follow a target, repairing it and helping it build. Will move to attack any nearby targets or anything that damages target.
Cloud effects
Lightning attacks now bypass shields allowing many units to be countered
Music and sound system (with faster startup speed and reduced memory usage)
Improved effects and graphics
Converted over many core units into the mod ini format for people to change and use in mods
Lots of bugs fixes.
Main new modding features:
Around 250 new options and systems added
Keyframe animation system (including arm/leg animations for smooth opening blast doors, etc)
Automatic action triggers (eg convert unit when it’s over water, low HP, etc)
Ability to embed images into maps to include your own custom tileset graphics
Custom price system.
Custom sounds (with custom sounds on order)
Multi-Targeting/Target per turret system
Teleporting, units spawning
Pre unit turret limit upped to 30
Reduced memory usage of each mod and inactive mods
Ammo variable, and 32 boolean flags for misc mod usage
Turret angle restrictions
Starting units can be added to with custom units
Many many more new features - see full list in the Modding Reference doc
Try the 1.13 beta for the next version now.
Beta for the next update is live for steam under 'beta - 1.13' in game properties under the beta tab. (The game must be stopped when switching.)
Please report any problems, no dedicated servers for 1.13 are up yet, and android beta should be up in a few days.
Use this build to fix and update your mods but please don't upload any 1.13 only features to the workshop yet.
Main new features:
A new set of units
Light gunship - Very weak but cheap
Underwater probe - weak scout
Plasma tank - Strong land attack, Shield weak vs lightning
Heavy Interceptor - Heavily armed with shield, Shield weak vs lightning
Telsa Mech
Fire bee
Nautilus - Amphibious submarine
Aircraft carrier Heavily armed and armored, Builds air units (at x5 speed), Laser defence & repairbay, Anti-air, Can build anti-nuke missiles
Better smarter AI. Better able to defend itself, expand, smarter experimental spider usage, etc
Large performance improvements and much better at handling large maps (like the 1500*1500 crazy maps in the workshop)
3 new maps
1 new mission
Patrol order - will move between points forever, or guard an area will help repair/build any nearby units, will move to attack any nearby targets or anything that damages it.
Guard order - will follow a target, repairing it and helping it build. Will move to attack any nearby targets or anything that damages target.
Cloud effects
Lightning attacks now bypass shields allowing many units to be counted
Music and sound system (with faster startup speed and reduced memory usage)
Improved effects and graphics
Converted over many core units into the mod ini format for people to change and use in mods
Lots of bugs fixes.
Main new modding features:
Keyframe animation system (including arm/leg animations for smooth opening blast doors, etc)
Automatic action triggers (eg convert unit when it’s over water, low HP, etc)
Ability to embed images into maps to include your own custom tileset graphics
Custom price system.
Custom sounds (with custom sounds on order)
Multi-Targeting/Target per turret system
Teleporting, units spawning
Pre unit turret limit upped to 30
Reduced memory usage of each mod and inactive mods
Major release - v1.12 (Workshop modding for units/missions/maps! Also new units, faster performance and extra shrapnel)
Large performance boost handling lots of units and large battles. Up to 10x the framerate in some special test cases
More efficient pathfinding and prioritization of path solving threads
Steam workshop support for units and maps!
Mods and workshop items can be added or uploaded from mods screen
Thank you to the modders who have already added content!
Maps will be automatically streamed from the host, but units require everyone to have them installed right now
Placing lines of buildings by click dragging (very useful)
New Heavy artillery - T2 artillery with limited laser defence
New Heavy Missile Ship - powerful long range
New T3 anti-air sam, and flak anti-air
Many old units have been converted into the newer moddable format
Added reload unit data button to sandbox - Modders should now never need to restart
Logic bug causing AI to get stronger on very easy & easy settings (I'm so sorry!!)
Game statistics now show on victory screen
Translation files are now under 'assets/translations' for people to add their own translations. Send them in for official inclusion
Mobile turret nerf, now cannot move over water
Missile tank renamed to AA Missile tank, buffed for anti-air but cannot attack land
Faster rendering code for minimap, selections, image drawing
The 'Live Reload' option is now multithread to remove any freezes
Fixed cleared key binding being reset
Fixed crashes loading save with missing modded units
Fixed crash bugs
Lots of little details (that most of people might not notice)
Most unit turrets have recoil
New trees of different types
Leaves when trees fall
Better graphics on lots of projectiles
Dust on reversing units
Better water waves on ships
Shrapnel bits fly of units when they explode
Better laser effects
Nicer render of the map when zoomed out
Major release - v1.11 (Replays, new mechs, lots of optimisations, etc)
-New Multiplayer Replays!
--Watch recorded multiplayer games at up to 64x speed
--You can create saves at any point in a replay to start a new multiplayer game from or edit in sandbox
-3 new mechs
--Mobile Turret - Deploys for extra range and a shield
--Artillery Mech - Long range, can move while firing
--Minigun Mech - Fast firing, speeds up as it fires
-New mission: 'Spider battle' (Note: this is a fun setup in multiplayer!)
-List of all selected units showed in the side bar (left click: select only that type, right click: unselect that type)
-Lots of path finding optimisations
--Solved paths are shared between clients to reduce load
--Units are more responsive to new orders in multiplayer
--Spamming orders shouldn't make your units pause movement in multiplayer
-Dynamic step rate in multiplayer to allow smoother games
-UI system has been optimised.
--Lobby screen with 100s of servers should no longer drop framerate.
-Nerf to light/heavy hovertank units, missile airship
-Buff to sea units to better survive fights vs hovertanks
-Mech factory can no longer build light/heavy hovertanks
-Large mechs now use 2 transport slots
-Plasma mech rechanges 15% faster
-Added 'disablePassiveTargeting', 'action_X_addEnergy' for modders to better create custom nuclear silo like buildings/units
-Leg positions on units better saved and synced
-Survive waves stop after being defeated
-Shield information shown under unit HP text
-List of selected units shown on PC
-Old chat log messages shown when menu is shown
-Better icons shown when zoomed out
-Send '.share off' and '.share on' in multiplayer to disable shared control for yourself in case of trolls
-Starting credits now goes up to $200,000
-Buffed: Missile ship, Artillery, Missile mech
-Less HP on basic sub
-Basic mech, missile mech build times longer to match tanks
-Missile airship, heavytank, heavy hovertank build times longer to reduce spamming
-Buffed bomber HP and damage
-Extra splash damage on experimental tank
-Fixed plamsa mech sometimes not firing after recharging
-Fixed UDP networking memory leak with some use cases
-Fixed crash after picking last server in the list sometimes happening after refresh
-Fixed rare desync issue caused by purchases ordered just as a unit dies
-Fixed desyncs warnings when a modded unit was transformed into a new unit without actions that were already queued (they will now be refunded)
Major release - v1.10 (Shared control, mechs, maps, better AI)
Shared ally control can be setup for multiplayer games
Disconnected players automatically get all their units shared to allies till they return
Mech Factory added, with a set of initial mechs
Basic mech - Land only
Anti-air mech - Area effect anti-air only
Plasma Mech - Long range air & ground attack
Flame Mech - Short range flamethrower with high HP
T3 gun turret upgrade
New map: Enclosed Island (10p)
Spider mech now costs $70000 and uses up 5 transport slots. And it's death nuke is disabled when 'no nukes' game setting is on.
New building gird placement system and reworked footprint of many buildings
Modded units are now loaded from 'mods/units/' and can be enabled or disabled in-game
Lots of new modding features
Modded units can now have upgrade actions
Can dynamically switch any property with convert actions
Custom projectile graphics with more options
Modded units can override builtin units
Lots more
Fixed pathing issues causing builders with queued buildings to pause
Fixed pathing issue causing units from factories to sometimes pause before moving to rally
Builders now wait up to ~15 seconds if there is not enough money to place a building before giving up
Fixed pathing issues with units loading into transports in multiplayer
Softer speedups on laggy networks and better handling of high ping
Builder ships can build more building types
All builders can reclaim buildings
Repairbay automatically repairs allies units and helps build buildings
More robust server networking code
Spider mech automatically repairs units
When a unit can both repair damaged transport or load into it will toggle between load up and repair
'lava votex' map balance fix
T1 builder can no longer build nuke launchers
Lots of AI improvements and fixes
AI can better use modded units
AI builds anti-nuke, repairbays, and laser defenses
AI cannot hijack the sandbox editor to build units (haha)