Skip to content

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 damaged
  • ChronoDamageHealAmountPercent = 10% ; "Chrono Health" in percent recovered per interval
  • ChronoDamageOpacityStart = 75% ; Visual opacity of the unit when it starts to be disabled by CHRONO_GUN damage
  • ChronoDamageOpacityEnd = 25% ; Visual opacity when the unit reaches critical CHRONO_GUN damage
  • ChronoDamageParticleSystemLarge = 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:

  1. The value written on the unit's ActiveBody, if present. An explicit SubdualDamageCap = 0 still means immune.
  2. The last matching SubdualDamageDefaults block that sets that value.
  3. Zero for subdual, jamming and frozen. For chrono, ChronoDamageHealRate and ChronoDamageHealAmountPercent from 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 = disabled
  • TerrainHeightAmbientLightHeight1 = -1Height at which TerrainHeightAmbientLightColor1 is fully reached
  • TerrainHeightAmbientLightHeight2 = -1Height at which TerrainHeightAmbientLightColor2 is fully reached
  • TerrainHeightAmbientLightColor1 = R:0 G:0 B:0Tint color reached at Height1
  • TerrainHeightAmbientLightColor2 = R:0 G:0 B:0Tint color reached at Height2
  • TerrainHeightAmbientLightAdditive = 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-locomotor BackwardsMoveAngleThreshold is 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 level LEVEL_FOUR.
  • HealthBonus_Five = 0%Health bonus (percent) at veterancy level LEVEL_FIVE.

Notes

  • These extend the existing HealthBonus_Veteran / HealthBonus_Elite / HealthBonus_Heroic parameters.
  • 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 of Speed lost at a full load. Default = 0%
  • TransportLoadTurnRatePenalty = 0%Fraction of TurnRate lost at a full load. Default = 0%
  • TransportLoadAccelerationPenalty = 0%Fraction of Acceleration lost at a full load. Default = 0%
  • TransportLoadLiftPenalty = 0%Fraction of Lift lost 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-weapon ScatterOnWaterSurface flag 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 via ScatterOnWaterSurface in 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