GameData.ini¶
Diagonal Movement Speed Fix¶
All units now move with the same speed in all directions. In vanilla ZH, diagonal movement was faster.
Vanilla behavior can be restored with this parameter:
UseVanillaDiagonalMoveSpeed = YesDefault = No
Color Tint (TintStatus) definitions¶
Colors for tint effects (E.g. frenzy) can be defined here. You can define multiple entries for different types.
TintStatus = <TintStatusType> <Tint Color> <Tint Color (Infantry)> <Fade in Frames> <Fade out Frames>
Example:
TintStatus = SHIELDED R:-0.1 G:-0.2 B:-0.2 R:-0.1 G:-0.2 B:-0.2 30 30
Notes
- Colors are defined separately for Infantry. Due to different shading it might be needed to finetune values for infantry.
- Color are defined as decimal number (ranging from -1.0 to 1.0). Values > 1 will brighten the color, values < 1 will darken it.
- Fade in/out frames define how long transition takes when applying or removing a color tint.
You can find a list of TintStatus types here.
Viewport fixes¶
ViewportHeightScale = 1.0 ; no reduced viewport with non collapsed UI (0.8 in vanilla)
This removes the black bar behind the bottom command bar.
ChronoGun parameters¶
These parameters configure behavior of CHRONO_GUN damage type, designed to replicate RA2 Chrono Legionnaire logic.
Tint Colors:
TintStatus = DISABLED_CHRONO R:-0.5 G:-0.5 B:2.0 R:-0.5 G:-0.5 B:2.0 10 10; Used when a target is currently being disabled/removed-
TintStatus = GAINING_CHRONO_DAMAGE R:0.5 G:0.5 B:1.5 R:0.5 G:0.5 B:1.5 30 60; Used when a target is starting to get disabled/removed -
ChronoDamageDisableThreshold = 10%; CHRONO_GUN damage must reach this threshold of the unit's maxHP to disable it ChronoDamageHealRate = 500; Interval (in ms) in which units recover from CHRONO_DAMAGE after not getting damagedChronoDamageHealAmountPercent = 10%; "Chrono Health" in percent recovered per intervalChronoDamageOpacityStart = 75%; Visual opacity of the unit when it starts to be disabled by CHRONO_GUN damageChronoDamageOpacityEnd = 25%; Visual opacity when the unit reaches critical CHRONO_GUN damageChronoDamageParticleSystemLarge = ChronoSparksLarge; ParticleSystem applied to STRUCTURES. (BOX volume scales to unit geometry)ChronoDamageParticleSystemMedium = ChronoSparksMedium; ParticleSystem applied to everyting else. (BOX volume scales to unit geometry)ChronoDamageParticleSystemSmall = ChronoSparksSmall; ParticleSystem applied to INFANTRY. (BOX volume scales to unit geometry)
ChronoDamageHealRate and ChronoDamageHealAmountPercent are the default of last resort. A
SubdualDamageDefaults block or an object's own ActiveBody can override both (see below).
Subdual Damage Defaults¶
Global defaults for the subdual, jamming, frozen and chrono values that otherwise repeat on every ActiveBody. Any number of blocks may appear; each one can be restricted to a KindOf and can exclude a KindOf.
SubdualDamageDefaults
SubdualDamageCap = MaxHealth * 2
SubdualDamageHealRate = 500
SubdualDamageHealAmount = MaxHealth / 16.25
JammingDamageCap = MaxHealth * 2
JammingDamageHealRate = 500
JammingDamageHealAmount = MaxHealth / 16.25
FrozenDamageCap = MaxHealth * 2
FrozenDamageHealRate = 500
FrozenDamageHealAmount = MaxHealth / 16.25
ChronoDamageHealRate = 500
ChronoDamageHealAmount = MaxHealth * 0.1
End
SubdualDamageDefaults
KindOf = PROJECTILE
SubdualDamageCap = MaxHealth
SubdualDamageHealRate = 1000
End
SubdualDamageDefaults
KindOf = VEHICLE
ForbiddenKindOf = AIRCRAFT DRONE
FrozenDamageCap = MaxHealth * 3
End
Every key is optional. KindOf takes a list of KindOf bits and matches an object that has any of
them; a block without KindOf matches every object. ForbiddenKindOf takes the same list and
skips the block for any object that has any of those bits, whatever KindOf says. Both may be
omitted. Blocks are searched from last to first, so
put general blocks first and specific ones after them. A map's own GameData block appends its
SubdualDamageDefaults after the global ones and therefore wins.
Cap and HealAmount values take one of these forms:
1000A fixed value.MaxHealthThe unit's max health.MaxHealth * 2A multiple of max health.MaxHealth / 16.25A fraction of max health.
MaxHealth is the unit's max health at the moment it is used, so a cap written as MaxHealth * 2
grows with veterancy health bonuses just as the subdue threshold does. HealRate values are
durations in milliseconds as before.
Precedence for each value on each unit:
- The value written on the unit's ActiveBody, if present. An explicit
SubdualDamageCap = 0still means immune. - The last matching
SubdualDamageDefaultsblock that sets that value. - Zero for subdual, jamming and frozen. For chrono,
ChronoDamageHealRateandChronoDamageHealAmountPercentfrom GameData.
The same value forms are accepted on ActiveBody itself, and ActiveBody also accepts
ChronoDamageHealRate and ChronoDamageHealAmount; see ActiveBody subdual fields.
Subdual Overlay Textures¶
A texture can be drawn over units taking jamming or frozen damage. Each overlay has its own key set; the effect is off until a texture is named.
JammingOverlayTexture = JammingFX.tga
JammingOverlayScrollU = 0.5
JammingOverlayScrollV = 0.0
JammingOverlayScale = 1.0
JammingOverlayColor = R:255 G:255 B:255
JammingOverlayAdditive = Yes
FrozenOverlayTexture = FrostFX.tga
FrozenOverlayScrollU = 0.0
FrozenOverlayScrollV = 0.0
FrozenOverlayScale = 1.0
FrozenOverlayColor = R:255 G:255 B:255
FrozenOverlayAdditive = No
The values shown are the defaults apart from the texture names. See Subdual Jamming and Subdual Frozen for what each key does and how the two overlays stack.
Water Depth Terrain Lighting¶
Note
these keys now live in the map's MapData entry rather than in GameData, which is what
previously caused issues when set from map.ini. Set them per map:
MapData
TerrainHeightAmbientLightStart = -1
TerrainHeightAmbientLightColor1 = R:0 G:0 B:0
End
Added support to tint terrain ambient lighting based on terrain height. The main purpose is to darken terrain the deeper it is below the water surface, to create an underwater depth effect.
TerrainHeightAmbientLightStart = -1Terrain height at which the effect begins. Above this height no tint is applied. Default = -1 = disabledTerrainHeightAmbientLightHeight1 = -1Height at whichTerrainHeightAmbientLightColor1is fully reachedTerrainHeightAmbientLightHeight2 = -1Height at whichTerrainHeightAmbientLightColor2is fully reachedTerrainHeightAmbientLightColor1 = R:0 G:0 B:0Tint color reached at Height1TerrainHeightAmbientLightColor2 = R:0 G:0 B:0Tint color reached at Height2TerrainHeightAmbientLightAdditive = NoIf Yes, the colors are added to the ambient light instead of blended/multiplied
Notes
- The tint blends from no effect at
...Start, towards Color1 at...Height1, and towards Color2 at...Height2, allowing a two-step gradient (e.g. shallow water vs. deep water). - The whole feature is disabled by default (start height = -1).
Default Excluded Death types¶
Example:
DefaultExcludedDeathTypes = CHRONO
This means the listed death types will be excluded from any Death module that uses "ALL -XXX" notation. It can be explicitly added by using "+" notation, e.g. "ALL +CHRONO". This can be used to define global exceptions without having to edit every existing death module.
Scorchmarks on Water¶
HideScorchmarksAboveGround = NoIf Yes, scorch mark decals are not drawn when their position is above the terrain, e.g. on top of the water surface. Useful to avoid floating scorch marks for naval combat. Default = No
Reverse Movement¶
ReverseMoveIgnoreAngleThreshold = NoGlobal override. If Yes, the per-locomotorBackwardsMoveAngleThresholdis ignored and units decide to reverse based only on distance. See Locomotor reverse movement. Default = No
Smart Garrison¶
SmartGarrison is a command that distributes a selected group of units across a target transport/structure and nearby transports (round-robin), instead of cramming everyone into the clicked one. Triggered by holding ALT while issuing the garrison command (or via a CommandButton with the SmartGarrison command).
SmartGarrisonRange = 100.0Radius searched around the clicked target for additional transports/structures to distribute units into. Default = 100.0
Queue Reorder¶
Lets the player move a build queue entry (unit or upgrade) one position earlier by Ctrl+clicking its cameo, swapping it with the entry before it. The displaced entry loses its build progress. A plain click still cancels; a finished unit waiting to exit the factory cannot be displaced. See Queue reorder for the full behavior.
QueueReorder = NoEnables the Ctrl+click build queue reorder. With No, clicking the queue behaves exactly like retail, Ctrl held or not. Default = No
Extra Veterancy Levels¶
Added two extra veterancy levels above HEROIC (see New Enum Definitions). Health bonuses for the new levels are defined here:
HealthBonus_Four = 0%Health bonus (percent) at veterancy levelLEVEL_FOUR.HealthBonus_Five = 0%Health bonus (percent) at veterancy levelLEVEL_FIVE.
Notes
- These extend the existing
HealthBonus_Veteran/HealthBonus_Elite/HealthBonus_Heroicparameters. - See ThingTemplate veterancy parameters for per-object level configuration.
Transport Load Slowdown¶
A container can be slowed by what it carries: the fuller it is, the worse it moves, and it recovers as passengers leave. These four set the default penalty, as the fraction of each value lost at a full load. Each is 0% by default, so transports behave exactly as before until a value is set.
TransportLoadSpeedPenalty = 0%Fraction ofSpeedlost at a full load. Default = 0%TransportLoadTurnRatePenalty = 0%Fraction ofTurnRatelost at a full load. Default = 0%TransportLoadAccelerationPenalty = 0%Fraction ofAccelerationlost at a full load. Default = 0%TransportLoadLiftPenalty = 0%Fraction ofLiftlost at a full load. Default = 0%
Each penalty covers the damaged variant of its value too, so SpeedDamaged scales by the same percentage as Speed. Any container can override these or opt out entirely - see Contain module load slowdown.
Weapon Scatter on Water¶
WeaponScatterOnWaterSurfaceDefault = NoDefault value for the per-weaponScatterOnWaterSurfaceflag when it is not set explicitly on a WeaponTemplate. Controls whether scattered shots that land on water detonate at the water surface. Individual weapons can still override this viaScatterOnWaterSurfacein Weapon.ini. Default = No
Singleplayer Chat Window¶
EnableSingleplayerChatwindow = NoIf Yes, the in-game chat window (Enter key) can be opened in singleplayer and skirmish games. This is required to use Chat Commands. Default = No
InGameUI.ini¶
Generic RadiusCursor definitions¶
Radius cursors used to need one hardcoded keyword each (AttackDamageAreaRadiusCursor,
AttackScatterAreaRadiusCursor, AttackContinueAreaRadiusCursor and so on), so a new cursor could
not be added from INI alone. A generic form is now accepted, where the cursor type is named on the
header line:
RadiusCursor GUARD_AREA
Texture = SCCommandCenterRadiusCursor
Style = SHADOW_ALPHA_DECAL
OpacityMin = 20%
OpacityMax = 40%
End
The old per-cursor keywords still work. The cursor type must be a name from the radius cursor list; see New Enum Definitions.
Radius decals above water¶
Radius cursors and FX decals previously always projected onto the terrain, so they disappeared under
water. They can now be drawn on the water surface instead — see RenderAboveWater on
W3DDecalDraw.
MiscAudio.ini¶
The following new entries in MiscAudio.ini are available
*ChronoDisabledSoundAmbient = <AudioEvent> - (looping) audio to play when an object is being removed/disabled by a CHRONO_GUN
*UnitJammed = <AudioEvent> / UnitUnjammed = <AudioEvent> - fallback jam and unjam cues when the unit defines no SoundJammed / SoundUnjammed
*UnitFrozen = <AudioEvent> / UnitUnfrozen = <AudioEvent> - fallback freeze and thaw cues when the unit defines no SoundFrozen / SoundUnfrozen