▶
Rusted Warfare Major Update 1.15
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.
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: [previewyoutube=nyY4MT4FQWk;full][/previewyoutube]
-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
-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} (wasnt 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
-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 dont 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, Ill 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)
[ 2022-11-12 04:54:31 CET ] [ Original post ]
Rusted Warfare Major Update v1.15
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: [previewyoutube=nyY4MT4FQWk;full][/previewyoutube]
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} (wasnt 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 dont 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, Ill 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)
[ 2022-11-12 04:54:31 CET ] [ Original post ]
Rusted Warfare - RTS
Corroding Games
Developer
Corroding Games
Publisher
2017-07-14
Release
Game News Posts:
19
🎹🖱️Keyboard + Mouse
Overwhelmingly Positive
(4871 reviews)
The Game includes VR Support
Public Linux Depots:
- Rusted Warfare - Linux [202.4 M]
Rusted Warfare is an RTS inspired by classic real-time strategy games with modern tech.
-
Built for Large Battles
- Over 40 unique units with many upgrades
- Optimised multi-core engine easily handles battles of 1000's of units.
- Experimental units for the big late-game battles
- Zoom out to view and issue commands across the whole battlefield
- Over 40 unique units with many upgrades
-
Modern Multiplayer
- Host your own game or play on the dedicated servers
- Reconnect to disconnected multiplayer games
- Steam friend matchmaking
- Save and load multiplayer games for the quick lunch time battle
- Full cross-platform multiplayer between the Windows, Linux and Android versions
- Host your own game or play on the dedicated servers
MINIMAL SETUP
- OS: Linux (64 bit)
- Processor: 1.8GHz single coreMemory: 2 GB RAMStorage: 300 MB available space
- Memory: 2 GB RAMStorage: 300 MB available space
- Storage: 300 MB available space
GAMEBILLET
[ 6132 ]
GAMERSGATE
[ 2625 ]
FANATICAL BUNDLES
HUMBLE BUNDLES
by buying games/dlcs from affiliate links you are supporting tuxDB