diff --git a/Asset/Art/dds/dds_files_and_dxt_compression.md b/Asset/Art/dds/dds_files_and_dxt_compression.md
index f7654422..59268cef 100644
--- a/Asset/Art/dds/dds_files_and_dxt_compression.md
+++ b/Asset/Art/dds/dds_files_and_dxt_compression.md
@@ -72,7 +72,7 @@ First of all here's my personal ranking in terms of output quality:
- DDS Converter ( but I'd rather you throw it deep into the sea)
To motivate you to switch from a different tool, let me detail the issues encountered with the different encoders
-(comparison images are in the spoiler below).
+(see [Comparison images](#comparison-images) at the end of this page).
No matter which tool you use, make sure it generates mipmaps unless it's a UI texture. Some will do this by default,
some don't (Compressonator). Some tools also offer the ability to specify gamma/sRGB for mipmap generation. This should
@@ -128,3 +128,30 @@ in the first place. The quality is just godawful, in some parts it almost feels
than it really is because entire 4x4 blocks share the same color for no particular reason, and it's not even the
correct color! In addition, some detail introduces harsh artifacts and noise. I weep for all the people googling for
"dds converter" and having to put up with shit quality textures because of this tool.
+
+## Comparison images
+
+The same source texture encoded with each tool described above. Open an image at full size to judge the artifacts —
+the differences are easy to miss when the image is scaled down.
+
+### Gradients
+
+Gradients and dark areas are where the encoders separate most clearly, with banding, block structure and hue shifts
+showing up first.
+
+
+
+
+
+
+
+
+
+### High-frequency detail
+
+Several of the weaker encoders do comparatively well here, which is why gradients rather than detail are the better
+test when choosing a tool.
+
+
+
+
diff --git a/Asset/Art/w3d/3dsmax/3dsmax.md b/Asset/Art/w3d/3dsmax/3dsmax.md
index 1c070b69..082eec98 100644
--- a/Asset/Art/w3d/3dsmax/3dsmax.md
+++ b/Asset/Art/w3d/3dsmax/3dsmax.md
@@ -11,9 +11,9 @@ Click on **Customize > Customize User Interface...**
Then in **Menus** tab, select **W3D Importer** in Category, and move the **Coolfile W3D Importer** into the **File** menu.
-
+
-
+
## Import W3D
@@ -24,13 +24,13 @@ To unload it, select **File > Reset**.
Note: the W3D Importer does not necessarily produce perfect imports. Vertices counts may differ between the original W3D
mesh and the imported W3D mesh. If the mesh looks ok, you can use it however.
-
+
## Export W3D
To Export W3D File, select **File > Export** and choose the W3D file format in the Save Dialog.
-
+
## Rescale W3D Animation
@@ -39,4 +39,4 @@ To rescale a W3D animation, import the W3D file, click on the **Time Configurati
Note: 30 frames correspond the 1 game second.
-
+
diff --git a/Asset/GUI/WND_Controls/wnd_controls_checkbox.md b/Asset/GUI/WND_Controls/wnd_controls_checkbox.md
index aff4cb56..df1a573c 100644
--- a/Asset/GUI/WND_Controls/wnd_controls_checkbox.md
+++ b/Asset/GUI/WND_Controls/wnd_controls_checkbox.md
@@ -6,7 +6,7 @@ interacts with it.
## Available Tags
-The Checkbox control does not have any unique tags beyond the [default control tags](/user.md).
+The Checkbox control does not have any unique tags beyond the [default control tags](wnd_controls_user).
It uses the same general set of tags applicable to all controls.
## Default Values and Usage
@@ -91,7 +91,5 @@ Here's an example from the `OptionsMenu.wnd` file:
## See also
- [Default control](wnd_controls_user)
-- [Texturing](../texturing.md)
-- [Statuses](../statuses.md)
-
-[Category:](../Categories.md) [Controls](../Controls.md)
+- [Texturing](texturing)
+- [Statuses](wnd_reference)
diff --git a/Asset/GUI/WND_Controls/wnd_controls_combobox.md b/Asset/GUI/WND_Controls/wnd_controls_combobox.md
index 0f7400f0..26f048e2 100644
--- a/Asset/GUI/WND_Controls/wnd_controls_combobox.md
+++ b/Asset/GUI/WND_Controls/wnd_controls_combobox.md
@@ -362,6 +362,4 @@ END
## See also
- [Default control](wnd_controls_user)
-- [Texturing](../texturing.md)
-
-[Category:](../Categories.md) [Controls](../Controls.md)
+- [Texturing](texturing)
diff --git a/Asset/GUI/WND_Controls/wnd_controls_entryfiled.md b/Asset/GUI/WND_Controls/wnd_controls_entryfiled.md
index 9b2aafc3..ad5b8eaf 100644
--- a/Asset/GUI/WND_Controls/wnd_controls_entryfiled.md
+++ b/Asset/GUI/WND_Controls/wnd_controls_entryfiled.md
@@ -5,7 +5,7 @@ You can define the position, size, and appearance of the entry field, as well as
## Available Tags
-In addition to the [default control tags](/user.md), the EntryField control has the following unique tag:
+In addition to the [default control tags](wnd_controls_user), the EntryField control has the following unique tag:
| Tag | Description |
|-----------------|------------------------------------------------------------------------------------------------|
@@ -120,6 +120,4 @@ END
## See also
- [Default control](wnd_controls_user)
-- [Texturing](../texturing.md)
-
-[Category:](../Categories.md) [Controls](../Controls.md)
+- [Texturing](texturing)
diff --git a/Asset/GUI/WND_Controls/wnd_controls_progressbar.md b/Asset/GUI/WND_Controls/wnd_controls_progressbar.md
index 6aa3a69a..15c7c2c5 100644
--- a/Asset/GUI/WND_Controls/wnd_controls_progressbar.md
+++ b/Asset/GUI/WND_Controls/wnd_controls_progressbar.md
@@ -5,7 +5,7 @@ and appearance of the progress bar, and it updates automatically as the progress
## Available Tags
-The ProgressBar control does not have any unique tags beyond the [default control tags](/user.md).
+The ProgressBar control does not have any unique tags beyond the [default control tags](wnd_controls_user).
It uses the same general set of tags applicable to all controls.
## Default Values and Usage
@@ -86,6 +86,4 @@ END
## See also
- [Default control](wnd_controls_user)
-- [Texturing](../texturing.md)
-
-[Category:](../Categories.md) [Controls](../Controls.md)
+- [Texturing](texturing)
diff --git a/Asset/GUI/WND_Controls/wnd_controls_pushbutton.md b/Asset/GUI/WND_Controls/wnd_controls_pushbutton.md
index 4db92897..df383cb5 100644
--- a/Asset/GUI/WND_Controls/wnd_controls_pushbutton.md
+++ b/Asset/GUI/WND_Controls/wnd_controls_pushbutton.md
@@ -6,7 +6,7 @@ as well as how it behaves in different states (enabled, disabled, highlighted).
## Available Tags
-The PushButton control does not include any unique tags beyond the [default control tags](/user.md).
+The PushButton control does not include any unique tags beyond the [default control tags](wnd_controls_user).
It uses the same general set of tags applicable to all controls.
## Default values and usage
@@ -100,6 +100,4 @@ END
## See also
- [Default control](wnd_controls_user)
-- [Texturing](../texturing.md)
-
-[Category:](../Categories.md) [Controls](../Controls.md)
+- [Texturing](texturing)
diff --git a/Asset/GUI/WND_Controls/wnd_controls_radiobutton.md b/Asset/GUI/WND_Controls/wnd_controls_radiobutton.md
index 0cd87d6d..829d0f13 100644
--- a/Asset/GUI/WND_Controls/wnd_controls_radiobutton.md
+++ b/Asset/GUI/WND_Controls/wnd_controls_radiobutton.md
@@ -6,7 +6,7 @@ well as how it behaves in different states (enabled, disabled, highlighted).
## Available Tags
-In addition to the [default control tags](/user.md), the RadioButton control has the following unique tag:
+In addition to the [default control tags](wnd_controls_user), the RadioButton control has the following unique tag:
| Tag | Description |
|-------------------|---------------------------------------------------------------------------------|
@@ -112,7 +112,5 @@ END
## See also
- [Default control](wnd_controls_user)
-- [Texturing](../texturing.md)
-- [Statuses](../statuses.md)
-
-[Category:](../Categories.md) [Controls](../Controls.md)
+- [Texturing](texturing)
+- [Statuses](wnd_reference)
diff --git a/Asset/GUI/WND_Controls/wnd_controls_scrollistbox.md b/Asset/GUI/WND_Controls/wnd_controls_scrollistbox.md
index 2a8990d9..1976870e 100644
--- a/Asset/GUI/WND_Controls/wnd_controls_scrollistbox.md
+++ b/Asset/GUI/WND_Controls/wnd_controls_scrollistbox.md
@@ -5,7 +5,7 @@ appearance of the list box, and it updates automatically as the user scrolls.
## Available Tags
-In addition to the [default control tags](/user.md), the ScrollListBox control has the following unique tags:
+In addition to the [default control tags](wnd_controls_user), the ScrollListBox control has the following unique tags:
| Tag | Description |
|-------------------------------------|-------------------------------------------------------------------------------------|
@@ -266,3 +266,6 @@ END
## See also
+
+- [Default control](wnd_controls_user)
+- [Texturing](texturing)
diff --git a/Asset/GUI/WND_Controls/wnd_controls_slider.md b/Asset/GUI/WND_Controls/wnd_controls_slider.md
index d80b2dd9..bc7e4410 100644
--- a/Asset/GUI/WND_Controls/wnd_controls_slider.md
+++ b/Asset/GUI/WND_Controls/wnd_controls_slider.md
@@ -6,7 +6,7 @@ the slider, and it updates automatically as the user interacts with it.
## Available Tags
-In addition to the [default control tags](/user.md), the Slider control has the following unique tags:
+In addition to the [default control tags](wnd_controls_user), the Slider control has the following unique tags:
| Tag | Description |
|-------------------------------|-----------------------------------------------------------------------------------|
@@ -223,7 +223,5 @@ END
## See also
- [Default control](wnd_controls_user)
-- [Texturing](../texturing.md)
-- [Statuses](../statuses.md)
-
-[Category:](../Categories.md) [Controls](../Controls.md)
+- [Texturing](texturing)
+- [Statuses](wnd_reference)
diff --git a/Asset/GUI/WND_Controls/wnd_controls_statictext.md b/Asset/GUI/WND_Controls/wnd_controls_statictext.md
index 92e70710..355cc0a1 100644
--- a/Asset/GUI/WND_Controls/wnd_controls_statictext.md
+++ b/Asset/GUI/WND_Controls/wnd_controls_statictext.md
@@ -5,7 +5,7 @@ position, size, and appearance of the text, but users cannot edit or interact wi
## Available Tags
-In addition to the [default control tags](/user.md), the StaticText control has the following unique tag:
+In addition to the [default control tags](wnd_controls_user), the StaticText control has the following unique tag:
| Tag | Description |
|------------------|-------------------------------------------------------|
@@ -99,6 +99,4 @@ END
## See also
- [Default control](wnd_controls_user)
-- [Texturing](../texturing.md)
-
-[Category:](../Categories.md) [Controls](../Controls.md)
+- [Texturing](texturing)
diff --git a/Asset/GUI/WND_Controls/wnd_controls_user.md b/Asset/GUI/WND_Controls/wnd_controls_user.md
index e83a4c4e..c553bc3f 100644
--- a/Asset/GUI/WND_Controls/wnd_controls_user.md
+++ b/Asset/GUI/WND_Controls/wnd_controls_user.md
@@ -61,19 +61,19 @@ Click on the links to view available values and options for the tag.
| `WINDOWTYPE` | The control type. |
| `SCREENRECT` | Defines the size and position of the control on the screen. |
| `NAME` | The name of the control. |
-| `STATUS` | The status of the control. see [statuses](../status.md) |
-| `STYLE` | The style of the control. see [styles](../style.md). |
-| `SYSTEMCALLBACK` | The system callback function for the control. see [callbacks](../callbacks.md). |
+| `STATUS` | The status of the control. see [statuses](wnd_reference) |
+| `STYLE` | The style of the control. see [styles](wnd_reference). |
+| `SYSTEMCALLBACK` | The system callback function for the control. see [callbacks](wnd_reference). |
| `INPUTCALLBACK` | The input callback function for the control. |
| `TOOLTIPCALLBACK` | Callback function for the control’s tooltip. |
| `DRAWCALLBACK` | Callback function for the control’s texture. |
-| `FONT` | Font settings. see [Text Properties](../text_properties.md). |
-| `HEADERTEMPLATE` (Optional) | Defines the template for the control’s text. see [Text Properties](../text_properties.md). |
-| `TOOLTIPTEXT` (Optional) | Text for the tooltip displayed when hovering over the control. see [Text Properties](../text_properties.md). |
+| `FONT` | Font settings. see [Text Properties](wnd_reference). |
+| `HEADERTEMPLATE` (Optional) | Defines the template for the control’s text. see [Text Properties](wnd_reference). |
+| `TOOLTIPTEXT` (Optional) | Text for the tooltip displayed when hovering over the control. see [Text Properties](wnd_reference). |
| `TOOLTIPDELAY` | Delay `0...n` time for the tooltip to appear, `-1` for disable. |
-| `TEXT` (Optional) | The text displayed in the control. see [Text Properties](../text_properties.md). |
-| `TEXTCOLOR` | Color settings for text in different states. see [Text Properties](../text_properties.md). |
-| `ENABLEDDRAWDATA`,
`DISABLEDDRAWDATA`,
`HILITEDRAWDATA` | Visual texture for the control in different states. see [Texturing](../texturing.md). |
+| `TEXT` (Optional) | The text displayed in the control. see [Text Properties](wnd_reference). |
+| `TEXTCOLOR` | Color settings for text in different states. see [Text Properties](wnd_reference). |
+| `ENABLEDDRAWDATA`,
`DISABLEDDRAWDATA`,
`HILITEDRAWDATA` | Visual texture for the control in different states. see [Texturing](texturing). |
> [!IMPORTANT]
> The order of the tags is crucial for proper rendering of the control and must be followed as specified.
@@ -136,7 +136,5 @@ END
## See Also
-- [Callbacks](../callbacks.md)
-- [Texturing](../texturing.md)
-
-[Category:](../Categories.md) [Controls](../Controls.md)
+- [Callbacks](wnd_reference)
+- [Texturing](texturing)
diff --git a/Asset/GUI/texturing.md b/Asset/GUI/texturing.md
index efcbde87..96c6886e 100644
--- a/Asset/GUI/texturing.md
+++ b/Asset/GUI/texturing.md
@@ -17,7 +17,7 @@ DXT5 formats, and reference them within the game's `.wnd` files.
you can find the texture files in the `Data\Art\Textures` directory.
-
+
The main texture file used for the game's UI is `SCSmShellUserInterface512_001.tga`.
This file contains a large number of textures, packed together into a single image file.
@@ -165,7 +165,5 @@ You can create new textures or modify existing ones by editing the `.tga` files
## See Also
-- [Controls](../Controls.md)
-- [User Control](../controls/user.md)
-
-[Category:](../Categories.md) [General](../General.md)
+- [Controls](wnd_reference)
+- [User Control](wnd_controls_user)
diff --git a/Asset/GameDesign/ini/fxlist.ini b/Asset/GameDesign/ini/fxlist.ini
deleted file mode 100644
index 27cea505..00000000
--- a/Asset/GameDesign/ini/fxlist.ini
+++ /dev/null
@@ -1,76 +0,0 @@
----------------------------------------------
----------------------------------------------
----------------------------------------------
- The following variable types are:
- integer - any natural whole number (-1, 0, 324, etc.)
- 3Dcoord - an x,y,z point in space. each x,y, and z are real numbers
- RandValue - a real, real, and one of "CONSTANT", "UNIFORM",
- "GAUSSIAN", "TRIANGULAR", "LOW_BIAS", "HIGH_BIAS". For
- instance:
- 0 100 UNIFORM
- would give a random number between 0 and 100.
- AngleReal - a real number representing a degree (0 - 360)
- bool - either 'yes' or 'no'
- real - any number with fraction, i.e. 0, 0.0, 12.4, -13.567
- RGBColor - Red, Green, and Blue in the form "R:xx G:xx B:xx". The
- xx needs to be an integer from 0-255
- realPercent - a percentage value, i.e. 20, 25, 50, 100 (%)
- string - a list of characters
----------------------------------------------
----------------------------------------------
-FXList {fx name}
- ParticleSystem
- Name = {particle name in ParticleSystem.ini}
- Count = {integer} OR {RandValue}
- Offset = {3D coord}
- Height = {real} OR {RandValue}
- Radius = {real} OR {RandValue}
- InitialDelay = {RandValue}
- RotateX = {AngleReal}
- RotateY = {AngleReal}
- RotateZ = {AngleReal}
- OrientToObject = {bool}
- UseCallersRadius = {bool}
- Ricochet = {bool}
- AttachToObject = {bool}
- CreateAtGroundHeight = {bool}
- End
- Sound
- Name = {sound name in SoundEffects.ini}
- End
- RayEffect
- Name = {ray name in an Object directory ini}
- PrimaryOffset = {3Dcoord}
- SecondaryOffset = {3Dcoord}
- End
- Tracer
- TracerName = {tracer name in an Object directory ini, Defaults to "GenericTracer"}
- BoneName = {bone name in model}
- Speed = {real}
- DecayAt = {real}
- Length = {real}
- Width = {real}
- Color = {RGBColor}
- Probability = {real}
- End
- LightPulse
- Color = {RGBColor}
- Radius = {real}
- RadiusAsPercentOfObjectSize = {realPercent}
- IncreaseTime = {positive integer}
- DecreaseTime = {positive integer}
- End
- ViewShake
- Type = {one of SUBTLE, NORMAL, STRONG, SEVERE, CINE_EXTREME, CINE_INSANE}
- End
- TerrainScorch
- Type = {one of SCORCH_1, SCORCH_2, SCORCH_3, SCORCH_4, SHADOW_SCORCH, RANDOM}
- Radius = {real}
- End
- FXListAtBonePos
- FX = {a pre-defined (as in MUST be defined above this one) FXList element}
- BoneName = {string}
- OrientToBone = {bool}
- End
-End
----------------------------------------------
\ No newline at end of file
diff --git a/Asset/GameDesign/ini/ini-linter.md b/Asset/GameDesign/ini/ini-linter.md
index 31d68646..f6b65b8e 100644
--- a/Asset/GameDesign/ini/ini-linter.md
+++ b/Asset/GameDesign/ini/ini-linter.md
@@ -41,10 +41,6 @@ Use this link: [ZeroSyntax Pack](vscode:extension/vitexftw.zs-pack) or one of th
3. Press the `Open in Visual Studio Code` button.
4. Select the desired extension and click install.
-### Visual Studio Extension
-
-**Coming Soon...**
-
> [!NOTE]
> You might need to reload the editor after installing the extension for it to take effect.
diff --git a/Asset/GameDesign/ini/log/modulelist_change_log.txt b/Asset/GameDesign/ini/log/modulelist_change_log.txt
deleted file mode 100644
index 76cc88f1..00000000
--- a/Asset/GameDesign/ini/log/modulelist_change_log.txt
+++ /dev/null
@@ -1,138 +0,0 @@
-;--------------------------------------------
-:UPDATE LOG:
-;Moved and seperated the log file for
-;the module list to keep the main file clutter free
-;--------------------------------------------
-Update: November 11, 2020:
--Added more info on the "SwayClientUpdate" module.
-
-Update: July 02, 2020:
--Added more info on the "OverchargedBehavior" module.
-
-Update: 01/4/2020
-- Updated "Used Tactical Analysis Strings" List
-
-Update: 11/17/2019
--Updated info on recoil settings on the draw modules.
-
-Update 08/17/2019
--Further segmented some info into their own text files.
--added more info on "WorkerAIUpdate" module
--added more info on "FlammableUpdate" module
--added more info on both "DelayedUpgrade" and "DelayedWeaponSetUpgradeUpdate" modules.
-
-Update 03/28/2019
--updated descriptions of "PhysicsBehavior" module.
-
-Update 03/10/2019:
--Updated descriptions of 'StructureCollapseUpdate' module.
--Updated descriptions of 'StructureToppleUpdate
-' module.
-
-Update 12/7/2018
-- Removed 'ExemptStatus' and 'RequiredStatus' off "SpawnBehavior" Module as they seem to be not working.
-- Removed 'ForbidInsideKindOf' and 'AllowInsideKindOf' off "TunnelContain" Module as they seem to be not working.
-- Added 'RequiredKindOf' on all CrateCollide modules; needs verification if they actually work.
-- Added parameter descriptions for 'ToppleUpdate' module.
-- Corrected redundancy in "VeterancyCrateCollide".
-
-Update 10/1/2018
-- Corrected GrantUpgradeCreate description again (the entire tag and its parameters does exist in Vanilla Generals, not just ZH)
-
-Update 09/14/2018
-- Corrected GrantUpgradeCreate descriptions (moving the ZEROHOUR ONLY tag to ExemptStatus)
-
-Update 07/01/2018
--Corrected SpectreGunshipUpdate parameter entries.
--Added more info on SpectreGunshipUpdate module.
-
-Update 10/03/2017
-- added information about ProductionUpdate module door times.
-
-Update 09/12/2017
-- "interger" -> "integer"
-- corrected some more formatting issues
-- added more info about Animation and IdleAnimation in W3D draw modules.
-
-Updated 09/05/2017
-- Expanded and added default values to the recoil codes found in the 'W3DModelDraw' and related draws modules.
-- Added additional descriptions to the 'ReceivesDynamicLights' parameter.
-- Added additional descriptions to the 'Animation' parameter of 'W3DModelDraw' module.
-- Added additional descriptions to the 'SubObjectsUpgrade' module.
-- Corrected a few formatting issues.
-
-Update 02/04/2017
-- Added/Fixed description for ParticleSystem attributes
-
-Update 09/02/2016
-- Added more comments to the AIUpdateInterface module
-- Added two new discovered parameters to FireWeaponWhenDamagedBehavior
-
-UPDATE 7/22/16
-- Added comment to NeutronMissileSlowDeathBehavior's 'BlastNMaxDamage' and 'BlastNMinDamage' parameters.
-
-UPDATE: 4/25/16
-- Added Internal Upgrades List
-
-UPDATE: 4/19/16
-- Added Unit Sounds List and Unit Specific Sounds List
-
-UPDATE 2/11/15:
-- Added minimum DelayBetweenShots value
-- Fixed some typos and formatting issues
-- Added Table of Contents
-
-UPDATE 8/1/14:
-- Corrected two parameters in the 'ArmorSetCondition Types' list
-- Added discovered parameters on the following modules:
- - CrushDie
- - CreateObjectDie
- - ConvertToCarBombCrateCollide
- - ConvertToHijackedVehicleCrateCollide
- - SpawnBehavior
- - FireWeaponWhenDeadBehavior
-
-UPDATE 9/4/14:
-- Added minor particle system information
-
-UPDATE 6/4/13:
-- Added particle system information
-- Added FX List information
-
-UPDATE 15/3/13:
-- Added comment to DynamicShroudClearingRangeUpdate color field.
-
-UPDATE 4/2/2012:
-- Added discovered parameters on the crate modules.
-
-UPDATE 3/12/2012:
-- Added discovered parameters for 'KeepObjectDie' module
-- Added small description for 'StructureToppleUpdate' module
-- Corrected 'AnimationSteeringUpdate' description
-
-UPDATE 11/16/11:
-Updated entries and description on crate collide modules
-Updated entries on 'TunnelContain' module
-Minor update on 'SpawnBehavior' module
-
-UPDATE 9/20/11:
-- Fixed error and improved descriptions on some modules
-
-UPDATE 9/2/11:
-- Added frame to milisecond ratio, cameo sizes, used tactical analysis strings and others
-
-UPDATE from 10/14/07 to 10/10/09:
-- Added special power ini's enum type list
-- Added more descriptions to the modules
-- Added a few more missing entries
-- Corrected a few parameter descriptions
-- Added more discovered parameters by beng and me
-- Corrected a few parameters for ZeroHour
-- Fixed a few double entries
-- Corrected a few typographical errors
-- Organized the modules a little bit
-- Corrcted a few module parameters with help from beng
-- Fixed a few typing errors again
-- Added abit more description to the module/parameters
-- Added abit more description to the modules/parameters
-- Added a few discovered parameters
diff --git a/Asset/GameDesign/ini/modulelist.ini b/Asset/GameDesign/ini/modulelist.ini
deleted file mode 100644
index cdb5ddb6..00000000
--- a/Asset/GameDesign/ini/modulelist.ini
+++ /dev/null
@@ -1,3984 +0,0 @@
-;--------------------------------------------
-:Module List For Generals and ZeroHour:
-;--------------------------------------------
-Original author: DeeZire
-Website: http://www.deezire.net/index.php?
-
-Module list is updated annually by the NLS Team, this file is created for use as reference use only.
-
-Note:
-Some of the added discovered parameters are for ZeroHour expansion pack only; do take note that some parameters might still
-work for Classic Generals but there's no guarantees for it.
-
-Also, If you are going to edit this file, please follow the current formatting. Thank you.
-;--------------------------------------------
-:Table of Contents:
-;--------------------------------------------
-- Modules
-- Appendices
- - ChangeType List
- - LOD List
- - Veterancy Level List
- - Weapon Slot List
- - Object Condition Types
- - WeaponSet Condition Types
- - AutoChooseSources Types
- - ArmorSet Condition Types
- - Disabled Types
- - Status Types
- - Locomotor SET Types
- - DamageType List
- - DeathTypes List
- - Shadow Types
- - ConditionState Types
- - Animation Flags List
- - AnimationMode Types
- - KindOf list
- - Unit Sounds List
- - Unit Specific Sounds List
- - Internal Upgrades List
-- MISC SECTION
- - CommandButton Command list
- - CommandButton Options Types
- - CommandButton WeaponSlot Types
- - CommandButton Border Types
- - CommandButton RadiusCursorType List
- - WeaponBonus Types
- - WeaponBonus Fields
- - SpecialPower.ini Enum types
- - Used Tactical Analysis Strings
- - Frame to Milisecond Ratio
- - Minimum DelayBetweenShots Values
-
-;--------------------------------------------
-:Modules:
-;--------------------------------------------
-ActiveBody
-[this is a Body module not a Behavior module, The Subdual part of the module allows the use of JAMMED Model Condition State]
- MaxHealth = [integer]
- InitialHealth = [integer]
-
- [Subdual damage "Subdues" you (reaction defined by BodyModule) when it passes your max health.
- The cap limits how extra-subdued you can be, and the other numbers detemine how fast it drains away on its own.
- A Projectile or Missile doesn't get "subdued", Instead they loose stability and scatters. -ZEROHOUR ONLY!]
- SubdualDamageCap = [integer]
- SubdualDamageHealRate = [integer]
- SubdualDamageHealAmount = [integer]
-End
-
-AnimationSteeringUpdate
-[Controls the minimum time to finish a transition or animation state of an object. proper timing will result in smoother animations.]
- MinTransitionTime = [millisecond]
-End
-
-ActiveShroudUpgrade
-[Once activated, It will create a black shroud around the object that triggered this.
-Pretty much like the Red Alert 2 Gap Generator. You cannot see the shroud for your self but it can be seen by your enemy..]
- TriggeredBy = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
-
- NewShroudRange = [real number]
-End
-
-AIUpdateInterface
-[The default AI update you can use on units
-NOTE: In assigning the 'LocomotorSet' parameter on the object, always keep it BELOW this module.]
-
- AutoAcquireEnemiesWhenIdle = [Yes/No][NOTWHILEATTACKING/ATTACK_BUILDINGS/STEALTHED]
- MoodAttackCheckRate = [milliseconds. default is 2000] [How often do we scan our surroundings for enemies to engage on?]
- ForbidPlayerCommands = [Yes/No] [If yes, do not respond to any given commands by the player and vice versa - ZH Parameter]
- TurretsLinked = [Yes/No] [Does the two turrets (Turret & AltTurret) respond at the same time or are they both independent?]
-
-[this part of the module allows the use of TurretMoveStart and TurretMoveLoop within UnitSpecificSounds section of the object]
- Turret
- ControlledWeaponSlots = [weaponslots]
- TurretTurnRate = [integer]
- TurretPitchRate = [integer]
- NaturalTurretAngle = [integer, default 0 = horizontal]
- NaturalTurretPitch = [integer, default 0 = horizontal]
- FirePitch = [integer, default 0 = horizontal]
- MinPhysicalPitch = [integer, default 0 = horizontal]
- GroundUnitPitch = [integer, default 0 = horizontal]
- TurretFireAngleSweep = [weaponslot] [integer]
- TurretSweepSpeedModifier = [weaponslot] [real number]
- AllowsPitch = [Yes/No]
- MinIdleScanAngle = [real number]
- MaxIdleScanAngle = [real number]
- MinIdleScanInterval = [integer, milliseconds]
- MaxIdleScanInterval = [integer, milliseconds]
- RecenterTime = [integer,milliseconds]
- FiresWhileTurning = [Yes/No]
- InitiallyDisabled = [Yes/No]
- End
- AltTurret
- [as above]
- End
-End
-
-AnimatedParticleSysBoneClientUpdate
-[no parameters - this module is a ClientUpdate not a Behavior and
-allows the object to have particle system effects dynamically attached to animated sub-objects or bones]
-End
-
-ArmorUpgrade
-[triggers use of PLAYER_UPGRADE ArmorSet type to upgrade the object's armour set]
- TriggeredBy = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
-End
-
-AssaultTransportAIUpdate
-[This AI, If armed with a weapon using the DEPLOY Damaged type, will order the passengers
-To hop out of the vehicle and attack the selected target. The passengers will auto return
-If ordered to stop or the target is dead]
-
- AutoAcquireEnemiesWhenIdle = [Yes/No][NOTWHILEATTACKING/ATTACK_BUILDINGS/STEALTHED]
- MoodAttackCheckRate = [integer, milliseconds. default is 2000]
- ForbidPlayerCommands = [Yes/No]
- MembersGetHealedAtLifeRatio = [real number]
- ClearRangeRequiredToContinueAttackMove = [integer] [Default is 50]
-
- TurretsLinked =[Yes/No]
- Turret
- [See AIUpdateInterface module for full list]
- End
- AltTurret
- [as above]
- End
-End
-
-AssistedTargetingUpdate
-[Allows weapons (or defence) to relay with a similar weapon (or defense) within it's range.
-The weapon called by this module requires "RequestAssistRange" parameter in order to make the object relay properly.]
- AssistingClipSize = [integer] [How many shots to make when asked by someone of my kind who has a RequestAssistRange weapon. Default is 1]
- AssistingWeaponSlot = [Weapon slot list] [And the weapon to use. Should have huge range and no natural clip. Defaults to PRIMARY Slot]
- LaserFromAssisted = [object name] [Stream to draw from the requestor to me]
- LaserToTarget = [object name] [Stream to draw from me to the target]
-End
-
-AutoDepositUpdate
-[Allows object to passively earn credits continuously overtime. Can be upgraded to improve its passive earning.]
- ActualMoney = [Yes/No] [If set to No, This will not give you any money bonus. Instead, the "$" that appears above is used for props only]
- DepositTiming = [milliseconds] [Give me money (the player) every XXX milliseconds]
- DepositAmount = [integer] [How much to give the player?]
- InitialCaptureBonus = [integer] [How much to give the player when you first capture the object]
- UpgradedBoost = [UpgradeType:[Entry From Upgrade.ini] Boost:[integer] -ZEROHOUR ONLY!]
-End
-
-AutoFindHealingUpdate
-[This update will have the unit search for a healing station if injured]
-[Extra note: This should be put below the AI Module and this works for AI units only]
- ScanRate = [milliseconds] [ how much we search for a healing station?]
- ScanRange = [integer] [ and how far we have to look for a healing station?]
- NeverHeal = [0.1 to 1.0] [ don't heal if we are > 85% healthy.]
- AlwaysHeal = [0.1 to 1.0] [ if we get below 25%, find healing right away.]
-End
-
-AutoHealBehavior
-[Heals object near the object around containing this module like the ambulance or heal himself or
-can be used to instantly heal objects in one click burst like the emergency repair power]
-
- [This is used when this module is needed to be triggered by an upgrade]
- TriggeredBy = [entry from Upgrade.INI, requires StartsActive = No]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
-
- HealingAmount = [integer] [How many HP do we restore when this module is active?]
- HealingDelay = [integer, milliseconds][....and how frequent do we heal when this module is active?]
- StartHealingDelay = [integer, milliseconds][Does the activation of this module have a delay or is it instant?]
- Radius = [real number] [How far is our healing range?]
- StartsActive = [Yes/No] [Is this module on by default? If no, requires upgrade first]
- SingleBurst = [Yes/No] [Is our healing ability a single use only? If No, healing module is passive]
- AffectsWholePlayer = [Yes/No] [Self explainatory]
- KindOf = [KindOf list] [What KindOf we give priority when healing stuff?]
- ForbiddenKindOf = [KindOf list] [...and what kindof do we reject?]
- SkipSelfForHealing = [Yes/No] [When this module is active, does the caster skip itself so he can heal others? If no, he is also affected]
-
- RadiusParticleSystemName = [entry from ParticleSystem.INI] [Do we have any special particle effects when we're active?]
- UnitHealPulseParticleSystemName = [entry from ParticleSystem.INI] [Do the units / structures affected by this module have any special particle effects?]
-End
-
-BattleBusSlowDeathBehavior
-[Requires the object to have the UndeadBody module in order for this module to work
-and triggers the use of the SECOND_LIFE model condition state and ArmorSet type
--MODULE IS FOR ZEROHOUR ONLY!]
- DeathTypes = [DeathType listing]
- SinkRate = [real number]
- ExemptStatus = [status name]
- RequiredStatus = [status name]
- ProbabilityModifier = [integer]
- ModifierBonusPerOverkillPercent = [percent]
- SinkDelay = [integer, milliseconds]
- SinkDelayVariance = [integer]
- DestructionDelay = [integer, milliseconds]
- DestructionDelayVariance = [integer]
- DestructionAltitude = [integer]
- FlingForce = [integer]
- FlingForceVariance = [integer]
- FlingPitch = [integer]
- FlingPitchVariance = [integer]
- FX = [INITIAL/MIDPOINT/FINAL Entry from FXList.INI, multiple statements can be used for multiple FX's]
- OCL = [INITIAL/MIDPOINT/FINAL Entry from ObjectCreationList.INI, multiple statements can be used for multiple OCL's]
- Weapon = [INITIAL/MIDPOINT/FINAL Entry from Weapon.INI, multiple statements can be used for multiple "death" weapons.]
-
- FXStartUndeath = [Entry from Fxlist.ini]
- OCLStartUndeath = [Entry from ObjectCreationList.ini]
- FXHitGround = [Entry from Fxlist.ini]
- OCLHitGround = [Entry from ObjectCreationList.ini]
- DelayFromGroundToFinalDeath = [integer]
- ThrowForce = [integer]
- PercentDamageToPassengers = [percent]
- EmptyHulkDestructionDelay = [integer]
-End
-
-BunkerBusterBehavior
-[Pretty much self explainatory. Allows the missile to pretty much act like a bunker buster to clear out enemy garrisons -MODULE IS FOR ZEROHOUR ONLY!]
- UpgradeRequired = [Entry from Upgrade.ini] [Do we require an upgrade first?]
- DetonationFX = [Entry from FXList.ini] [The big detonation kaboom at the bottom]
- CrashThroughBunkerFX = [Entry from FXList.ini] [FX Used when going thru the targeted bunker]
- CrashThroughBunkerFXFrequency = [integer, milliseconds] [How often to play the crash bang crunch FX on the way through the bunker ceiling?]
- SeismicEffectRadius = [integer] [How far do we shake the camera?]
- SeismicEffectMagnitude = [integer] [...and How strong do we shake the camera?]
- ShockwaveWeaponTemplate = [Entry from weapon.ini] [What weapon should we use when we detonate on the ground?]
- OccupantDamageWeaponTemplate = [Entry from weapon.ini] [What weapon should we use when we clear a bunker?]
-End
-
-BaikonurLaunchPower
- SpecialPowerTemplate = [entry from SpecialPower.INI]
- DetonationObject = [object name]
- StartsPaused = [Yes/No, yes requires UnpauseSpecialPowerUpgrade module]
-End
-
-BaseRegenerateUpdate
-[no parameters - forces object to auto-repair itself over time, parameters defined in GameData.INI through 'BaseRegenHealthPerSecond' and 'BaseRegenDelay']
-End
-
-BattlePlanUpdate
-[Allows you to assign a select battle plan for your units]
- SpecialPowerTemplate = [entry from SpecialPower.INI]
-
- ;Transition Timings
- BombardmentPlanAnimationTime = [integer, milliseconds]
- HoldTheLinePlanAnimationTime = [integer, milliseconds]
- SearchAndDestroyPlanAnimationTime = [integer, milliseconds]
- TransitionIdleTime = [integer, milliseconds]
-
- ;Audio hooks
- BombardmentAnnouncementName = [entry from SoundEffects.INI]
- BombardmentPlanUnpackSoundName = [entry from SoundEffects.INI]
- BombardmentPlanPackSoundName = [entry from SoundEffects.INI]
-
- SearchAndDestroyPlanUnpackSoundName = [entry from SoundEffects.INI]
- SearchAndDestroyPlanIdleLoopSoundName = [entry from SoundEffects.INI]
- SearchAndDestroyPlanPackSoundName = [entry from SoundEffects.INI]
- SearchAndDestroyAnnouncementName = [entry from SoundEffects.INI]
-
- HoldTheLinePlanUnpackSoundName = [entry from SoundEffects.INI]
- HoldTheLinePlanPackSoundName = [entry from SoundEffects.INI]
- HoldTheLineAnnouncementName = [entry from SoundEffects.INI]
-
-
- [battle plan labels]
- HoldTheLineMessageLabel = [entry from string file]
- BombardmentMessageLabel = [entry from string file]
- SearchAndDestroyMessageLabel = [entry from string file]
-
- [Army bonuses granted by different battle plans]
- ValidMemberKindOf = [KindOf list]
- InvalidMemberKindOf = [KindOf list]
- BattlePlanChangeParalyzeTime = [integer, milliseconds]
- HoldTheLinePlanArmorDamageScalar = [real number]
- SearchAndDestroyPlanSightRangeScalar = [real number]
-
- [***NOTE*** WEAPON bonuses for army are specified in GameData.ini file]
- [Building bonuses granted based on battle plan mode]
- StrategyCenterSearchAndDestroySightRangeScalar = [real number]
- StrategyCenterSearchAndDestroyDetectsStealth = [Yes/No]
- StrategyCenterHoldTheLineMaxHealthScalar = [real number]
- StrategyCenterHoldTheLineMaxHealthChangeType = [Change Type List]
-
- VisionObjectName = [object name]
-End
-
-BeaconClientUpdate
-[this module is a ClientUpdate not a Behavior and is hardcoded to produce the BeaconSmokeFFFFFF particle system definition by default
-but will call the BeaconSmoke###### particle system definition relative to the players color]
- RadarPulseFrequency = [integer, milliseconds]
- RadarPulseDuration = [integer, milliseconds]
-End
-
-BoneFXDamage
-[no parameters - enables use of BoneFXUpdate module on this object where an additional dynamic FX logic can be used]
-End
-
-BoneFXUpdate
-[Enables the use of a more dynamic FX logic for the object. N takes numbers from 1-8]
- PristineParticleSystemN = [bone:{name} OnlyOnce:{Yes/No} {Min} {Max} PSys:{entry from ParticleSystem.INI}]
- PristineOCLN = [bone:{name} OnlyOnce:{Yes/No} {Min} {Max} OCL:{entry from ObjectCreationList.INI}]
- PristineFXListN = [bone:{name} OnlyOnce:{Yes/No} {Min} {Max} FXList:{entry from FXList.INI}]
-
- DamageParticleTypes = [DamageTypes listing]
- DamagedParticleSystemN = [bone:{name} OnlyOnce:{Yes/No} {Min} {Max} PSys:{entry from ParticleSystem.INI}]
- DamageOCLTypes = [DamageTypes listing]
- DamagedOCLN = [bone:{name} OnlyOnce:{Yes/No} {Min} {Max} OCL:{entry from ObjectCreationList.INI}]
- DamageFXTypes = [DamageTypes listing]
- DamagedFXListN = [bone:{name} OnlyOnce:{Yes/No} {Min} {Max} FXList:{entry from FXList.INI}]
-
- ReallyDamagedFXListN = [bone:{name} OnlyOnce:{Yes/No} {Min} {Max} FXList:{entry from FXList.INI}]
- ReallyDamagedOCLN = [bone:{name} OnlyOnce:{Yes/No} {Min} {Max} OCL:{entry from ObjectCreationList.INI}]
- ReallyDamagedParticleSystemN = [bone:{name} OnlyOnce:{Yes/No} {Min} {Max} PSys:{entry from ParticleSystem.INI}]
-
- RubbleParticleSystemN = [bone:{name} OnlyOnce:{Yes/No} {Min} {Max} PSys:{entry from ParticleSystem.INI}]
- RubbleOCLN = [bone:{name} OnlyOnce:{Yes/No} {Min} {Max} OCL:{entry from ObjectCreationList.INI}]
- RubbleFXListN = [bone:{name} OnlyOnce:{Yes/No} {Min} {Max} FXList:{entry from FXList.INI}]
-End
-
-;///////////////////////////////////////////////////////////////////
-;NOTE!NOTE!NOTE!NOTE!NOTE!
-;This three modules is needed if you want your object to be a bridge (optional: define bridge in Road.ini)..
-;///////////////////////////////////////////////////////////////////
-BridgeBehavior
-[special case logic allows for ParentObject to be specified as a bone name to allow other objects to appear on the bridge]
- LateralScaffoldSpeed = [integer]
- VerticalScaffoldSpeed = [integer]
- BridgeDieFX = [FX:{entry from FXList.INI} Delay:{milliseconds} Bone:{bone name}, multiple entries can be used for multiple fx]
- BridgeDieOCL = [OCL:{entry from ObjectCreationList.INI} Delay:{milliseconds} Bone:{bone name}, multiple entries can be used for multiple fx]
-End
-
-BridgeScaffoldBehavior
-[no parameters - this module allows the object to surround the parent object like a scaffold -doesn't work anymore. but still needed]
-End
-
-BridgeTowerBehavior
-[no parameters - this module transfers damage done to itself to its parent bridge too -doesn't work anymore. but still needed]
-End
-;///////////////////////////////////////////////////////////////////
-
-CashBountyPower
-[When enabled, allows all allied objects to earn credits when it kills enemies.
-This module is REQUIRED to use the " SPECIAL_CASH_BOUNTY" special power enum type to work properly]
- SpecialPowerTemplate = [entry from SpecialPower.INI]
- Bounty = [percent]
- StartsPaused = [Yes/No, yes requires UnpauseSpecialPowerUpgrade module]
-End
-
-CashHackSpecialPower
-[Allows you to steal money from an enemy supply center.
-This module is REQUIRED to use the " SPECIAL_CASH_HACK" special power enum type to work properly]
- SpecialPowerTemplate = [entry from SpecialPower.INI]
- MoneyAmount = [integer]
- UpgradeMoneyAmount = [entry from Science.INI integer cash amount to steal, multiple entries can be used for multiple upgrades]
- StartsPaused = [Yes/No, yes requires UnpauseSpecialPowerUpgrade module]
-End
-
-CaveContain
-[objects will be connected to the same cave system (eachother) if they share the CaveIndex]
-
-[ This is an index where all caves with this number are connected. You can change
- it with a script, or you can instance a second object and set it to 1. Please use sequential integers
- to keep it fast.]
- CaveIndex = [integer, can be adjusted in WorldBuilder, required]
-
- AllowInsideKindOf = [KindOfs]
- ForbidInsideKindOf = [KindOfs]
-End
-
-CountermeasuresBehavior
-[Allows object to throw countermeasures to defend itself against missile attacks. -MODULE IS FOR ZEROHOUR ONLY!]
- TriggeredBy = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
-
- FlareTemplateName = [Object Entry] ; IF theres no defined Object, Then no Flares for you!
- FlareBoneBaseName = [bone name] ; Bone names of where to spawn the flares.
- VolleySize = [Integer] ; Number of flares launched per volley (requires bones)
- VolleyArcAngle = [Integer] ; Max angle of flare relative to forward direction (with VolleySize of 1, flare will always goes straight back).
- VolleyVelocityFactor = [Integer] ; Shoots out flares at a stronger velocity with a higher value.
- DelayBetweenVolleys = [Integer, milliseconds] ; Time between flare volleys
- NumberOfVolleys = [Integer] ; Number of times the volleys will fire before reloading
- ReloadTime = [Integer, milliseconds] ; After all volleys launched, then reloading must occur. If 0, then reloading occurs at airstrip only.
- EvasionRate = [Percent] ; With active flares, the specified percentage will be diverted.
- ReactionLaunchLatency = [integer, milliseconds] ; Reaction between getting shot at and the firing of the first volley of countermeasures.
- MissileDecoyDelay = [integer, milliseconds] ; A reported missile that has been determined to hit a decoy will wait this long before acquiring countermeasures.
- MustReloadAtAirfield = [Yes/No] ; Reload Countermeasures at the airfield? If No, It will auto reload while in mid air.
-End
-
-CheckpointUpdate
-[no parameters - allows object to open and close like a gate when a friendly object approaches it - requires DOOR_1_OPENING and DOOR_1_CLOSING ConditionStates]
-End
-
-ChinookAIUpdate
-[logic requires bones for either end of the rope to be defined as RopeEnd and RopeStart]
-
-[If you want your infantry (or tank :P) to Rappel down a rope, Just add the CAN_RAPPEL to the objects KindOf field, after doing that,
-[You can now use the "RAPPELLING" ModelConditonState for rappelling out of the object that has the rappel code
-[Of this module.
-
-[This part of the module will allow your tank or infantry to use the rappel feature if CAN_RAPPEL is defined in the kindof field of the certain unit, and
-allows the use of the CombatDropKillFX within UnitSpecificFX section of the object and module allows the use of VoiceCombatDrop and VoiceSupply and VoiceClearBuilding
-within UnitSpecificSounds section of the object]
-
- RappelSpeed = [integer]
- RopeDropSpeed = [integer]
- RopeName = [object name, defaults to 'GenericRope' object definition in system.ini]
- RopeFinalHeight = [integer]
- RopeWidth = [real number]
- RopeWobbleLen = [integer]
- RopeWobbleAmplitude = [real number]
- RopeWobbleRate = [integer]
- RopeColor = [r: g: b:]
- RotorWashParticleSystem = [Entry From ParticleSystem.ini] -ZERO HOUR ONLY!
- NumRopes = [integer]
- PerRopeDelayMin = [integer]
- PerRopeDelayMax = [integer]
- MinDropHeight = [integer]
- WaitForRopesToDrop = [Yes/No]
-
-[This part requires the object to have KindOf = HARVESTER]
- MaxBoxes = [integer]
- SupplyCenterActionDelay = [integer]
- SupplyWarehouseActionDelay = [integer]
- SupplyWarehouseScanDistance = [integer]
- SuppliesDepletedVoice = [Entry from Voice.INI]
- UpgradedSupplyBoost = [percent] -ZERO HOUR ONLY! Triggered by Upgrade_AmericaSupplyLines only
-
-[Just a normal AIUpdateInterface field]
- AutoAcquireEnemiesWhenIdle = [Yes/No][NOTWHILEATTACKING/ATTACK_BUILDINGS/STEALTHED]
- MoodAttackCheckRate = [integer, milliseconds. default is 2000]
- ForbidPlayerCommands = [Yes/No]
- TurretsLinked =[Yes/No]
-
-[this part of the module allows the use of TurretMoveStart and TurretMoveLoop within UnitSpecificSounds section of the object]
- Turret
- [see AIUpdateInterface for full list]
- End
- AltTurret
- [see AIUpdateInterface for full list]
- End
-End
-
-CleanupAreaPower
-[Allows the object to clean up poison fields via special power command. Requires 'SPECIAL_CLEANUP_AREA' special power enum type to work properly]
- SpecialPowerTemplate = [entry from SpecialPower.INI]
- MaxMoveDistanceFromLocation = [real number]
- StartsPaused = [Yes/No, yes requires UnpauseSpecialPowerUpgrade module]
- InitiateSound = [Entry from Voice.ini]
-End
-
-CleanupHazardUpdate
-[Allows object to scan and hunt down objects with 'CLEANUP_HAZARD' KindOf when idle. Works in tandem with the 'CleanupAreaPower' module.]
- WeaponSlot = [Weapon Slot List]
- ScanRate = [integer, milliseconds]
- ScanRange = [real number]
-End
-
-CommandButtonHuntUpdate
-[no parameters - this module allows this object to hunt using a particular ability or command via scripts -AI Only]
-End
-
-CommandSetUpgrade
-[Gives the object the ability to change commandsets back and forth when this module is used two times]
- TriggeredBy = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
-
- RemovesUpgrades [entry(s) from Upgrade.INI, multiple "upgrade" entrys can be put here]
- CommandSet = [entry from CommandSet.INI]
- CommandSetAlt = [entry from CommandSet.INI]
- TriggerAlt = [entry(s) from Upgrade.INI]
-End
-
-ConvertToCarBombCrateCollide
-[Triggers the use of CARBOMB WeaponSet Condition of the hijacked object and turns it to a suicide unit unless given with a different weapon]
-[Note: Doesn't allow objects with "BOAT" and "AIRCRAFT" to pick it up.]
- RequiredKindOf = [KindOf]
- ForbiddenKindOf = [KindOf]
- FXList = [entry from FXList.INI]
-
- ExecuteFX = [entry from FXList.INI]
- ExecuteAnimation = [entry from Animation2D.INI]
- ExecuteAnimationTime = [real number, seconds]
- ExecuteAnimationZRise = [integer, units per second to rise]
- ExecuteAnimationFades = [Yes/No]
-End
-
-ConvertToHijackedVehicleCrateCollide
-[module is hardcoded to play the HijackDriver sound definition when triggered and converts the unit to your side]
- RequiredKindOf = [KindOf]
- ForbiddenKindOf = [KindOf]
-
- ExecuteFX = [entry from FXList.INI]
- ExecuteAnimation = [entry from Animation2D.INI]
- ExecuteAnimationTime = [real number, seconds]
- ExecuteAnimationZRise = [integer, units per second to rise]
- ExecuteAnimationFades = [Yes/No]
-End
-
-CostModifierUpgrade
-[When triggered, allows object prices to be changed globally]
- TriggeredBy = [entry from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
-
- EffectKindOf = [KindOf]
- Percentage = [percentage]
-End
-
-CreateCrateDie
-[Independent CrateData listings will each produce a maximum of one crate]
- DeathTypes = [DeathTypes listing]
- RequiredStatus = [StatusBits type]
- ExemptStatus = [StatusBits type]
-
- CrateData = [entry from Crate.INI]
-End
-
-CreateObjectDie
-[Creates an object when the owning object dies]
- DeathTypes = [DeathTypes listing]
- ExemptStatus = [status name]
- RequiredStatus = [StatusBits type]
-
- CreationList = [entry from ObjectCreationList.INI]
- TransferPreviousHealth = [Yes/No]
-End
-
-CrushDie
-[this module allows for the use of the FRONTCRUSHED and BACKCRUSHED ConditionStates with this object]
- DeathTypes = [DeathTypes listing]
- ExemptStatus = [status name]
- RequiredStatus = [StatusBits type]
-
- TotalCrushSound = [entry from SoundEffects.INI]
- BackEndCrushSound = [entry from SoundEffects.INI]
- FrontEndCrushSound = [entry from SoundEffects.INI]
- TotalCrushSoundPercent = [percent]
- BackEndCrushSoundPercent = [percent]
- FrontEndCrushSoundPercent = [percent]
-End
-
-DamDie
-[no parameters, allows object to continue existing as an obstacle but allowing water terrain to move through - the module must be applied after any other death modules]
-End
-
-DefectorSpecialPower
-[When used in junction with the "SPECIAL_DEFECTOR" special power, The targeted unit will defect to your side]
-[allows use of 'DefectorTimerTickSound' and 'DefectorTimerDingSound' sound entry field in MiscAudio.ini]
- SpecialPowerTemplate = [entry from SpecialPower.INI]
- FatCursorRadius = [real number]
- StartsPaused = [Yes/No, yes requires UnpauseSpecialPowerUpgrade module]
-End
-
-DefaultProductionExitUpdate
-[logic requires NaturalRallyPoint x: co-ordinate to match the object GeometryMajorRadius]
- UnitCreatePoint = [x: y: z:]
- NaturalRallyPoint = [x: y: z:]
- UseSpawnRallyPoint = [Yes/No]
-End
-
-DelayedUpgrade
-[this module triggers use of the DelayedWeaponSetUpgradeUpdate module on this object.
- Note: This module only exists in vanilla generals and is unavailable for zerohour]
-
- TriggeredBy = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
-
- DelayTime = [integer, milliseconds]
-End
-
-DelayedWeaponSetUpgradeUpdate
-[no parameters, this module delays the effect of a WeaponSet player upgrade - requires DelayedUpgrade module]
- Note: This module only exists in vanilla generals and is unavailable for zerohour]
-End
-
-DeletionUpdate
-[Deletes the object when the lifetime expires]
- MinLifetime = [integer, milliseconds]
- MaxLifetime = [integer, milliseconds]
-End
-
-DeliverPayloadAIUpdate
-[this module allows the use of StartDive within UnitSpecificSounds section of the object]
- DoorDelay = [integer]
- DeliveryDistance = [integer]
- MaxAttempts = [integer]
- DropDelay = [integer]
- DropOffset = [x: y: z:]
- DropVariance = [x: y: z:]
- PutInContainer = [object name]
-End
-
-DemoTrapUpdate
-[Requires object to have "DEMOTRAP" Kind of defined in the KindOf Field]
- DefaultProximityMode = [Yes/No]
- DetonationWeaponSlot = [Weapon Slot List]
- ProximityModeWeaponSlot = [Weapon Slot List]
- ManualModeWeaponSlot = [Weapon Slot List]
- TriggerDetonationRange = [real number]
- IgnoreTargetTypes = [KindOfs]
- AutoDetonationWithFriendsInvolved = [Yes/No]
- DetonateWhenKilled = [Yes/No]
- DetonationWeapon = [Entry from Weapon.ini]
-End
-
-DeployStyleAIUpdate
-[this module allows use of PACKING and UNPACKING ConditionState(s)and allows the use of Deploy and Undeploy within UnitSpecificSounds section of the object]
- PackTime = [integer]
- UnpackTime = [integer]
- TurretsFunctionOnlyWhenDeployed = [Yes/No]
- TurretsMustCenterBeforePacking = [Yes/No]
- ManualDeployAnimations = [Yes/No]
- ResetTurretBeforePacking = [Yes/No]
-
- AutoAcquireEnemiesWhenIdle = [Yes/No][NOTWHILEATTACKING/ATTACK_BUILDINGS/STEALTHED]
- MoodAttackCheckRate = [integer, milliseconds, default 2000]
- ForbidPlayerCommands = [Yes/No]
- TurretsLinked =[Yes/No]
- Turret
- [see AIUpdateInterface for full list]
- End
- AltTurret
- [see AIUpdateInterface for full list]
- End
-End
-
-DestroyDie
- DeathTypes = [DeathTypes listing]
- RequiredStatus = [StatusBits type]
- ExemptStatus = [StatusBits type]
-End
-
-DozerAIUpdate
-[this module allows the use of VoiceRepair and VoiceBuildResponse and VoiceNoBuild and VoiceTaskComplete within UnitSpecificSounds section of the object]
-[Requires Kindof = DOZER]
- RepairHealthPercentPerSecond = [percent]
- BoredTime = [integer, milliseconds]
- BoredRange = [integer]
-
- AutoAcquireEnemiesWhenIdle = [Yes/No]
- MoodAttackCheckRate = [integer, milliseconds]
- ForbidPlayerCommands = [Yes/No]
- TurretsLinked =[Yes/No]
- Turret
- [See AIUpdateInterface for full list]
- End
- AltTurret
- [See AIUpdateInterface for full list]
- End
-End
-
-DumbProjectileBehavior
-[Requires "PROJECTILE" KindOf]
- MaxLifespan = [integer, milliseconds]
- TumbleRandomly = [Yes/No]
- DetonateCallsKill = [Yes/No]
- OrientToFlightPath = [Yes/No]
- FirstHeight = [integer]
- FirstPercentIndent = [percent]
- SecondHeight = [integer]
- SecondPercentIndent = [percent]
- GarrisonHitKillRequiredKindOf = [KindOf]
- GarrisonHitKillForbiddenKindOf = [KindOf]
- GarrisonHitKillCount= [integer]
- GarrisonHitKillFX = [entry from FXList.INI]
- FlightPathAdjustDistPerSecond = [real number]
-End
-
-DynamicGeometryInfoUpdate
- InitialDelay = [integer, milliseconds]
- InitialHeight = [real number]
- InitialMajorRadius = [real number]
- InitialMinorRadius = [real number]
- FinalHeight = [real number]
- FinalMajorRadius = [real number]
- FinalMinorRadius = [real number]
- TransitionTime = [integer, milliseconds]
- ReverseAtTransitionTime = [Yes/No]
-End
-
-DynamicShroudClearingRangeUpdate
- ChangeInterval = [integer, milliseconds]
- GrowInterval = [integer, milliseconds]
- ShrinkDelay = [integer, milliseconds]
- ShrinkTime = [integer, milliseconds]
- GrowDelay = [integer, milliseconds]
- GrowTime = [integer, milliseconds]
- FinalVision = [real number]
- GridDecalTemplate
- Texture = [texture name without file extension]
- Style = [texture application style type]
- OpacityMin = [percent]
- OpacityMax = [percent]
- OpacityThrobTime = [integer, milliseconds]
- OnlyVisibleToOwningPlayer = [Yes/No]
-
- [Hardcoded. Color is always blue. Changing this field won't do anything]
- Color = [r: g: b: a:]
- End
-End
-
-EjectPilotDie
-[this module allows use of SoundEject and VoiceEject within UnitSpecificSounds section of the object]
- DeathTypes = [DeathTypes listing]
- ExemptStatus = [status name]
- GroundCreationList = [entry from ObjectCreationList.INI]
- AirCreationList = [entry from ObjectCreationList.INI]
- VeterancyLevels = [veterancy levels listing]
-End
-
-EMPUpdate
- DisabledDuration = [integer, milliseconds]
- Lifetime = [integer, milliseconds]
- StartColor = [r: g: b:]
- StartFadeTime = [integer, milliseconds]
- StartScale = [real number]
- EndColor = [r: g: b:]
- TargetScaleMin = [real number]
- TargetScaleMax = [real number]
- DisableFXParticleSystem = [entry from ParticleSystem.INI]
- SparksPerCubicFoot = [integer]
-
-[Parameters below only exist for ZERO HOUR!]
- DoesNotAffectMyOwnBuildings = [Yes/No]
- DoesNotAffect = [Either from : ALLIES/ENEMIES/NEUTRALS/SELF]
- EffectRadius = [integer]
- VictimForbiddenKindOf = [kindof listing]
- VictimRequiredKindOf = [kindof listing]
-End
-
-EnemyNearUpdate
-[no parameters - this module allows the the use of 'VoiceMeetEnemy' object sound parameter and
-also allows the object to use the ENEMYNEAR ConditionState
-which will be triggered when an enemy object is within this objects VisionRange]
-End
-
-ExperienceScalarUpgrade
-[Allows object, who has this module, gets a experience earning boost when triggered.]
- TriggeredBy = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
-
-[how this works: 0.5 means 50% increase, 1.0 means 100% increase in bonus. So, if you specify the number '0.25', it would mean a 25% increase in EXP bonus.]
- AdXPScalar = [real number]
-End
-
-FireSpreadUpdate
-[Is the object allowed to spread fire to his buddies?
-This module is triggered when the object gets hit with a weapon that uses 'FLAME' damage type.]
- OCLEmbers = [entry from ObjectCreationList.INI] [ Should we spawn a "fire ember" in order to spread fire?]
- MinSpreadDelay = [integer, milliseconds] [ Minimum Time we try spreading fire]
- MaxSpreadDelay = [integer, milliseconds] [ Maximum Time we try spreading fire]
- SpreadTryRange = [real number] [ A non-zero entry means fires will be set explicitly without relying on embers
- [ The closest flammable thing will be set on fire automatically.
-End
-
-FirestormDynamicGeometryInfoUpdate
-[Pretty much self explanatory]
- InitialDelay = [integer, milliseconds]
- InitialHeight = [real number]
- InitialMajorRadius = [real number]
- InitialMinorRadius = [real number]
- FinalHeight = [real number]
- FinalMajorRadius = [real number]
- FinalMinorRadius = [real number]
- TransitionTime = [integer, milliseconds]
- ReverseAtTransitionTime = [Yes/No]
- ScorchSize = [real number]
- ParticleOffsetZ = [real number]
- ParticleSystemN = [N = 1-16, entry from ParticleSystem.INI]
- FXList = [entry from FXList.INI]
- DelayBetweenDamageFrames = [integer, milliseconds]
- MaxHeightForDamage = [integer]
- DamageAmount = [integer]
-End
-
-FireOCLAfterWeaponCooldownUpdate
- WeaponSlot = [Weapon Slot List]
- TriggeredBy = [entry(s) from Upgrade.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- OCL = [entry from ObjectCreationList.INI]
- MinShotsToCreateOCL = [integer]
- OCLLifetimePerSecond = [integer]
- OCLLifetimeMaxCap = [integer]
-End
-
-FireWeaponCollide
- ; FireOnce = [Yes/No] // adding this parameter does not crash the game, though it does not seem to do much either...
- CollideWeapon = [entry from Weapon.INI]
- ForbiddenStatus = [status name]
- RequiredStatus = [status name]
-End
-
-FireWeaponWhenDamagedBehavior
- StartsActive = [Yes/No]
- TriggeredBy = [entry(s) from Upgrade.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- ReactionWeaponPristine = [entry from Weapon.INI]
- ReactionWeaponDamaged = [entry from Weapon.INI]
- ReactionWeaponReallyDamaged = [entry from Weapon.INI]
- ReactionWeaponRubble = [entry from Weapon.INI]
- ContinuousWeaponPristine = [entry from Weapon.INI]
- ContinuousWeaponDamaged = [entry from Weapon.INI]
- ContinuousWeaponReallyDamaged = [entry from Weapon.INI]
- ContinuousWeaponRubble = [entry from Weapon.INI]
- DamageTypes = [DamageTypes listing]
- DamageAmount = [integer]
-End
-
-FireWeaponWhenDeadBehavior
-[Allows the object, who have this module, fire a weapon when it dies]
- TriggeredBy = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
- ConflictsWith = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
-
- DeathTypes = [DeathTypes listing]
- RequiredStatus = [StatusBit type]
- ExemptStatus = [StatusBit type]
-
- DeathWeapon = [entry from Weapon.INI]
- StartsActive = [Yes/No]
-End
-
-FireWeaponUpdate
-[Allows object to passively fire a weapon around itself]
- Weapon = [entry from Weapon.INI] [What weapon should we use?]
- ExclusiveWeaponDelay = [integer] [If we fire a real weapon, we turn this module off for this long]
- InitialDelay = [integer/milliseconds] [amount of delay before we use the weapon in this module]
-End
-
-FireWeaponPower
- SpecialPowerTemplate = [Entry(s) from SpecialPower.ini]
- MaxShotsToFire = [real number]
-End
-
-FlightDeckBehavior
-[Requires AIRCRAFT_CARRIER and FS_AIRFIELD Kindof in order to work properly. -ZEROHOUR ONLY]
- NumRunways = [real number] [how many runways do we have? maximum is 2]
- NumSpacesPerRunway = [real number] [how much space will parked aircrafts have?]
-
- [N takes numbers from 1-2]
- RunwayNSpaces = [Names of Bones of the Model]
- RunwayNTakeoff = [Names of Bones of the Model]
- RunwayNLanding = [Names of Bones of the Model]
- RunwayNTaxi = [Names of Bones of the Model]
- RunwayNCreation = [Names of Bones of the Model]
- RunwayNCatapultSystem = [Entry From Particlesystem.ini]
-
- HealAmountPerSecond = [integer] [How much health do we give the landed aircraft on our deck?]
- ApproachHeight = [integer] [What should the minimum height of aircrafts be in order to land?]
- LandingDeckHeightOffset = [integer Z-axis] [How high is the landing deck?]
- ParkingCleanupPeriod = [integer] [How often the carrier checks to move planes forward in the queue to fill empty spaces]
- HumanFollowPeriod = [integer] [Human factor for delay like a traffic jam.. takes time to react when the guy in front moves]
-
- [Template of payload, and how quickly destroyed ones get replaced.]
- PayloadTemplate = [Object Name] [If theres no defined unit then...no jets for you!]
- ReplacementDelay = [integer, milliseconds]
- DockAnimationDelay = [integer, milliseconds]
-
- [How quickly a wave of fighters can be launched]
- LaunchWaveDelay = [integer, milliseconds]
- LaunchRampDelay = [integer, milliseconds]
- LowerRampDelay = [integer, milliseconds]
- CatapultFireDelay = [integer, milliseconds]
-End
-
-
-FlammableUpdate
-[This module is triggered when the object that have this module is hit by a weapon that uses 'FLAME' or "PARTICLE_BEAM" damage type.
- Once triggered, it also allows the use of the AFLAME and SMOLDERING and BURNED ConditionState(s).]
- BurnedDelay = [integer, milliseconds] [How long do we burn before we smolder]
- BurningSoundName = [entry from SoundEffects.INI] [What sound to use when we're on fire]
- FlameDamageLimit = [integer] [How much flame damage to recieve before catching fire]
- FlameDamageExpiration = [integer, milliseconds] [in a span of this long, in millisecond]
- AflameDuration = [integer, milliseconds] [If I catch fire, I'll burn for this long in millisecond]
- AflameDamageAmount = [integer] [Taking this much damage]
- AflameDamageDelay = [integer, milliseconds] [This often]
-End
-
-FloatUpdate
-[forces object to remain relative to sea level and allows for use of SEA_LEVEL locomotion rules.
-Enabled = Yes means 'float on water and stay relative to water level' while Enabled = No means 'float on water and bob about']
- Enabled = [Yes/No]
-End
-
-FXListDie
- DeathTypes = [DeathTypes listing]
- DeathFX = [entry from FXList.INI]
- OrientToObject = [Yes/No]
- RequiredStatus = [StatusBits type]
- ExemptStatus = [StatusBits type]
- StartsActive = [Yes/No]
- TriggeredBy = [entry(s) from Upgrade.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
-End
-
-GarrisonContain
-[Module is hard-coded to use the GarrisonGun object definition for the weapons pointing from the object
-when occupants are firing and these are drawn at bones named FIREPOINT. Also, it automatically calls "GARRISONED" Model ConditionState when the object is loaded]
-
-[NOTE: THE FIREBASE LOGIC IS ONLY FOR ZEROHOUR]
-[If The model has STATIONx (X can range from 1 to 12) and the draw module (AKA W3DModelDraw) has a "ExtraPublicBone = STATIONx (x corresponds to bone number)" defined and
-the garrison module has the "IsEnclosingContainer = No"... The garrisoned guys will appear at the location of the "STATION" bones...they will appear like they do on the firebase.
-
-Also requires the HiveStructureBody to work properly]
-
- ContainMax = [integer]
- EnterSound = [entry from SoundEffects.INI]
- ExitSound = [entry from SoundEffects.INI]
- DamagePercentToUnits = [percent]
- MobileGarrison = [Yes/No]
- InitialRoster = [object name integer]
- ImmuneToClearBuildingAttacks = [Yes/No]
- IsEnclosingContainer = [Yes/No]
- HealObjects = [Yes/No]
- TimeForFullHeal = [integer, milliseconds]
- PassengersAllowedToFire = [Yes/No]
- AllowInsideKindOf = [KindOF list]
- ForbidInsideKindOf = [KindOf listing]
- AllowAlliesInside = [Yes/No]
- AllowEnemiesInside = [Yes/No]
- AllowNeutralInside = [Yes/No]
-End
-
-GrantStealthBehavior
-[Gives unit(s), when triggered, permanent stealth within it's defined area of effect. -ZEROHOUR ONLY]
-// sets a CAN_STEALTH status on the unit
- StartRadius = [integer]
- FinalRadius = [integer]
- RadiusGrowRate = [integer]
- RadiusParticleSystemName = [Entry(s) from ParticleSystem.ini]
- KindOf = [KindOF list]
- ForbiddenKindOf = [KindOF list]
-End
-
-GenerateMinefieldBehavior
-[Allows object to spawn mines around itself via upgrade]
- MineName = [object name]
- GenerationFX = [entry from FXList.INI]
- DistanceAroundObject = [integer]
- MinesPerSquareFoot = [integer]
- GenerateOnlyOnDeath = [Yes/No]
- BorderOnly = [Yes/No]
- SmartBorder = [Yes/No]
- SmartBorderSkipInterior = [Yes/No]
- AlwaysCircular = [Yes/No]
- RandomJitter = [integer]
- SkipIfThisMuchUnderStructure = [integer]
- Upgradable = [Yes/No]
- UpgradedMineName = [object name]
- UpgradedTriggeredBy = [entry from Upgrade.INI]
-End
-
-GrantUpgradeCreate
-[Grants object with an upgrade from the start]
- UpgradeToGrant = [entry from Upgrade.INI]
- ExemptStatus = [Status Bits type]
-End
-
-
-GrantScienceUpgrade
-[Grants object with a Science point from the start -ZEROHOUR ONLY]
- GrantScience = [Entry from Science.ini]
- TriggeredBy = [entry from Upgrade.INI]
-End
-
-
-InternetHackContain
-[Contain module that triggers the HackInternetAIUpdate command to passengers -see TransportContain module for required parameters of this module -ZEROHOUR ONLY]
-End
-
-HackInternetAIUpdate
-[this module allows the use of UnitPack and UnitUnpack and UnitCashPing within UnitSpecificSounds section of the object
-and allows use of PACKING and UNPACKING ConditionState(s) -Requires "MONEY_HACKER" kind of in order to work properly.]
- UnpackTime = [integer, milliseconds]
- PackTime = [integer, milliseconds]
- PackUnpackVariationFactor = [real number] [Randomises the Unpack/Pack time delay]
- CashUpdateDelay = [integer, milliseconds] [How long do we wait to get our cash when we hack the interwebs?]
- CashUpdateDelayFast = [integer, milliseconds] [Increase wait time when inside a "container". Triggered by InternetHackContain module]
- RegularCashAmount = [integer] [How much do we earn every time we hack?]
- VeteranCashAmount = [integer] [How much do we earn every time we hack when we're a veteran hacker?]
- EliteCashAmount = [integer] [How much do we earn every time we hack when we're a elite hacker?]
- HeroicCashAmount = [integer] [How much do we earn every time we hack when we're a pr0 1337 h4c|<3r?!?!]
- XpPerCashUpdate = [integer]
-End
-
-HealCrateCollide
-[this module heals all objects belonging to the same owner as the object that collides with this object
-also triggers the 'CrateHeal' sound effects field in MiscAudio.ini]
-
- RequiredKindOf = [KindOf] [What KindOf type is needed to allow us to be picked up]
- ForbiddenKindOf = [KindOf] [What 'KindOf' type we dont allow to pick us?]
- ForbidOwnerPlayer = [Yes/No] [Works with OwnedByMaker (or by explicit ownership script) to prevent a certain player from picking up the crate]
- HumanOnly = [Yes/No] [Let's the crate only be picked up by Humans, mostly for scripted stuff]
- BuildingPickup = [Yes/No] [Allows the crate to be picked up by a building. Example: Plane drops..]
- PickupScience = [Entry from Science.INI] [Forces the player owning the unit trying to get the crate to have a certain science.]
-
-
- ExecuteFX = [entry from FXList.INI]
- ExecuteAnimation = [entry from Animation2D.INI]
- ExecuteAnimationTime = [real number, seconds]
- ExecuteAnimationZRise = [integer, units per second to rise]
- ExecuteAnimationFades = [Yes/No]
-End
-
-HealContain
-[This module will automatically heal and restore the health of units that enters or exits the transport]
- ContainMax = [integer]
- TimeForFullHeal = [integer, milliseconds]
- EnterSound = [entry from SoundEffects.INI]
- ExitSound = [entry from SoundEffects.INI]
- AllowInsideKindOf = [KindOf listing]
- ForbidInsideKindOf = [KindOf listing]
- AllowAlliesInside = [Yes/No]
- AllowEnemiesInside = [Yes/No]
- AllowNeutralInside = [Yes/No]
-End
-
-HeightDieUpdate
- TargetHeight = [real number]
- TargetHeightIncludesStructures = [Yes/No]
- OnlyWhenMovingDown = [Yes/No]
- InitialDelay = [integer, milliseconds]
- SnapToGroundOnDeath = [Yes/No]
- DestroyAttachedParticlesAtHeight = [real number]
-End
-
-HelicopterSlowDeathBehavior
-[this module requires LocomotorWorksWhenDead = Yes on the objects Locomotor to function correctly]
- DestructionDelay = [integer, milliseconds]
- DestructionDelayVariance = [integer]
- DestructionAltitude = [integer]
- SpiralOrbitTurnRate = [real number]
- SpiralOrbitForwardSpeed = [real number]
- SpiralOrbitForwardSpeedDamping = [real number]
- MinSelfSpin = [integer]
- MaxSelfSpin = [integer]
- SelfSpinUpdateDelay = [integer, milliseconds]
- SelfSpinUpdateAmount = [integer, degrees]
- FallHowFast = [percent]
- MinBladeFlyOffDelay = [integer, milliseconds]
- MaxBladeFlyOffDelay = [integer, milliseconds]
- AttachParticle = [entry from ParticleSystem.INI]
- AttachParticleBone = [bone name]
- AttachParticleLoc = [x: y: z:]
- BladeObjectName = [object name]
- BladeBoneName = [bone name]
- OCLEjectPilot = [entry from ObjectCreationList.INI]
- FXBlade = [entry from FXList.INI]
- OCLBlade = [entry from ObjectCreationList.INI]
- FXHitGround = [entry from FXList.INI]
- OCLHitGround = [entry from ObjectCreationList.INI]
- FXFinalBlowUp = [entry from FXList.INI]
- OCLFinalBlowUp = [entry from ObjectCreationList.INI]
- DelayFromGroundToFinalDeath = [integer]
- FinalRubbleObject = [object name]
- MaxBraking = [integer]
- SoundDeathLoop = [entry from SoundEffects.INI]
-End
-
-HighlanderBody
-[this is a Body module not a Behavior module and allows the object to take damage but not die - the object will only die from irresistable damage]
- MaxHealth = [integer]
- InitialHealth = [integer
-End
-
-HijackerUpdate
- ParachuteName = [object name]
- AttachToTargetBone = [sub object/bone name]
- OffsetZ = [integer]
-End
-
-HiveStructureBody
-[this is a Body module not a Behavior module and requires the SpawnBehavior module to work properly]
- MaxHealth = [integer]
- InitialHealth = [integer
- SubdualDamageCap = [integer]
- SubdualDamageHealRate = [integer]
- SubdualDamageHealAmount = [integer]
- PropagateDamageTypesToSlavesWhenExisting = [DamageTypes listing]
- SwallowDamageTypesIfSlavesNotExisting = [DamageTypes listing]
-End
-
-HordeUpdate
-[module is hardcoded to apply the following textures to objects that are affected by this module: EXHorde, EXHorde_UP, EXHordeB, EXHordeB_UP]
- UpdateRate = [integer, milliseconds][ how often to recheck horde status ]
- RubOffRadius = [integer] [ if I am this close to a real hordesman, I will get to be an honorary hordesman ]
- AlliesOnly = [Yes/No] [ do we only count allies towards horde status? ]
- ExactMatch = [Yes/No] [ do we only count units of our exact same type towards horde status? (overrides kindof)]
- Action = [WeaponBonus name] [ when horde-ing, grant us the HORDE bonus ]
- Radius = [integer] [ how close other units must be to us to count towards our horde-ness (~30 feet or so) ]
- KindOf = [KindOfs] [ what KindOf's must match to count towards horde-ness ]
- Count = [integer] [ how many units must be within Radius to grant us horde-ness ]
- AllowedNationalism = [Yes/No]
- FlagSubObjectNames = [sub object name]
-End
-
-HelixContain
-[Like Transport, but when full, passes transport queries along to first passenger (redirects like tunnel). Basically works like the Overlord Contain.]
- Slots = [integer]
- DamagePercentToUnits = [percentage]
- AllowInsideKindOf = [KindOf listing]
- ForbidInsideKindOf = [KindOf listing]
- AllowAlliesInside = [Yes/No]
- AllowNeutralInside = [Yes/No]
- AllowEnemiesInside = [Yes/No]
- ExitDelay = [integer, milliseconds]
- NumberOfExitPaths = [integer, should corrospond to N]
- GoAggressiveOnExit = [Yes/No]
- ScatterNearbyOnExit = [Yes/No]
- OrientLikeContainerOnExit = [Yes/No]
- KeepContainerVelocityOnExit = [Yes/No]
- BurnedDeathToUnits = [Yes/No]
- ExitPitchRate = [integer]
- ExitBone = [bone name]
- DoorOpenTime = [integer, milliseconds]
- HealthRegen%PerSec = [percentage]
- DestroyRidersWhoAreNotFreeToExit = [Yes/No]
- ResetMoodCheckTimeOnExit = [Yes/No]
- ArmedRidersUpgradeMyWeaponSet = [Yes/No] ; if an armed rider enters - activates a PLAYER_UPGRADE weapon flag.
- DelayExitInAir = [Yes/No]
- EnterSound = [entry from SoundEffects.INI] ;SoundEnter Override
- ExitSound = [entry from SoundEffects.INI] ;SoundExit Override
- PassengersAllowedToFire = [Yes/No]
- PassengersInTurret = [Yes/No]
- WeaponBonusPassedToPassengers = [Yes/No]
- PayloadTemplateName = [object name]
- ShouldDrawPips = [Yes/No]
-End
-
-ImmortalBody
-[this is a Body module not a Behavior module and prevents the object from dying or taking damage]
- MaxHealth = [integer]
- InitialHealth = [integer
- SubdualDamageCap = [integer]
- SubdualDamageHealRate = [integer]
- SubdualDamageHealAmount = [integer]
-End
-
-InactiveBody
-[no parameters - this is a Body module not a Behavior module and prevents normal interaction with other objects]
-End
-
-InstantDeathBehavior
- DeathTypes = [DeathTypes listing]
- FX = [entry from FXList.INI]
- OCL = [entry from ObjectCreationList.INI]
- Weapon = [Entry from Weapon.ini]
- RequiredStatus = [status name]
- ExemptStatus = [status name]
-End
-
-JetAIUpdate
-[this module allows the use of VoiceLowFuel and Afterburner within UnitSpecificSounds section of the object -Requires Kindof = AIRCRAFT]
-[And Allows the use of JETEXHAUST JETAFTERBURNER Model conditionstates, this is triggered when its taking off from the runway]
- OutOfAmmoDamagePerSecond = [percent] ; Amount of damage to take per SEC (not per frame) when out of ammo
- NeedsRunway = [Yes/No] ; Does the aircraft need a runway when it takes off?
- KeepsParkingSpaceWhenAirborne = [Yes/No] ; Does the aircraft that took off from that "hanger" keeps it or not?
- TakeoffDistForMaxLift = [percent] ; Larger numbers give more lift sooner when taking off
- TakeoffPause = [millisecond] ; How long does the aircraft pause for a moment before taking off?
- MinHeight = [integer] ; How low can the aircraft go? offsets using the Z axis
- ParkingOffset = [-X.0 offsets the plane to the rear, X.0 offsets it foward, X can be any number] ; scooch it a little forward so the tail doesn't hit the doors
- SneakyOffsetWhenAttacking = [integer] ; This is how far behind us people aim when we are in attack mode
- AttackLocomotorType = [LocomotorSetType] ; what locomotor set are we going to use if we're in attack mode?
- AttackLocomotorPersistTime = [real number] ;how long the "attack" locomotor persist after we finished attacking?
- AttackersMissPersistTime = [real number] ;how long do we remain unattackable when the attackmode is done?
- ReturnToBaseIdleTime = [integer, milliseconds] ; if idle for this long, return to base, even if not out of ammo
- ReturnForAmmoLocomotorType = [LocomotorSetType] ; what locomotor set are we going to use if we're going back to re-arm?
- LockonTime = [integer, milliseconds] ; how long does the lockon tick sound last?
- LockonCursor = [object name] ;what should the "lockon" cursor look like? (use LockonCursor defined in system.ini)
- LockonInitialDist = [integer] ; how far does the enemy anti-air required to trigger this
- LockonFreq = [real number] ; smaller==longer pulse delay, larger==shorter pulse delay
- LockonAngleSpin = [real number] ;how fast to spin the lockon blinker
- LockonBlinky = [Yes/No] ; does it blinker?
- AutoAcquireEnemiesWhenIdle = [Yes/No NOTWHILEATTACKING/ATTACK_BUILDINGS/STEALTHED]
- MoodAttackCheckRate = [integer, milliseconds, default is 2000]
- Turret
- TurretTurnRate = [integer]
- TurretPitchRate = [integer]
- NaturalTurretAngle = [integer]
- NaturalTurretPitch = [integer]
- FirePitch = [integer]
- MinPhysicalPitch = [integer, defalt 0 = horizontal]
- GroundUnitPitch = [integer, default 0 = horizontal]
- TurretFireAngleSweep = [weaponslot][integer]
- TurretSweepSpeedModifier = [weaponslot real number]
- ControlledWeaponSlots = [weaponslots]
- AllowsPitch = [Yes/No]
- MinIdleScanAngle = [real number]
- MaxIdleScanAngle = [real number]
- MinIdleScanInterval = [integer, milliseconds]
- MaxIdleScanInterval = [integer, milliseconds]
- RecenterTime = [integer,milliseconds]
- FiresWhileTurning = [Yes/No]
- InitiallyDisabled = [Yes/No]
- End
- AltTurret
- [as above]
- End
-End
-
-JetSlowDeathBehavior
-[this module requires LocomotorWorksWhenDead = Yes on the objects Locomotor to function correctly]
- FXOnGroundDeath = [entry from FXList.INI]
- OCLOnGroundDeath = [entry from ObjectCreationList.INI]
- FXInitialDeath = [entry from FXList.INI]
- OCLInitialDeath = [entry from ObjectCreationList.INI]
- DelaySecondaryFromInitialDeath = [integer, milliseconds]
- FXSecondary = [entry from FXList.INI]
- OCLSecondary = [entry from ObjectCreationList.INI]
- DelayFinalBlowUpFromHitGround = [integer, milliseconds]
- DeathLoopSound = [entry from SoundEffects.INI]
- DestructionDelay = [integer, milliseconds]
- DestructionDelayVariance = [integer]
- DestructionAltitude = [integer]
- RollRate = [real number]
- RollRateDelta = [percent]
- PitchRate = [real number]
- FallHowFast = [percent]
- FXHitGround = [entry from FXList.INI]
- OCLHitGround = [entry from ObjectCreationList.INI]
- FXFinalBlowUp = [entry from FXList.INI]
- OCLFinalBlowUp = [entry from ObjectCreationList.INI]
- RequiredStatus = [status name]
- ExemptStatus = [status name]
- DeathTypes = [DeathType listing]
-End
-
-KeepObjectDie
-[this module ensures the object remains in the game world when it is destroyed although it will no longer interact]
- DeathTypes = [DeathType listing]
- RequiredStatus = [StatusBits type]
- ExemptStatus = [StatusBits type]
-End
-
-LaserUpdate
-[this module is a ClientUpdate not a Behavior]
- MuzzleParticleSystem = [entry from ParticleSystem.INI]
- TargetParticleSystem = [entry from ParticleSystem.INI]
- PunchThroughScalar = [Real Number] ; If our target dies, we get this much bigger so it looks like we punched through
-End
-
-LifetimeUpdate
- MinLifetime = [integer, milliseconds]
- MaxLifetime = [integer, milliseconds, should be greater than or equal to MinLifetime]
-End
-
-LockWeaponCreate
-[Prevents indeterminate state plus two unpickable weapons equaling no attack.]
- SlotToLock = [Weapon Slot List]
-End
-
-LocomotorSetUpgrade
-[triggers use of SET_NORMAL_UPGRADED locomotor on this object and allows the use of VoiceMoveUpgrade within UnitSpecificSounds section of the object]
- TriggeredBy = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
-End
-
-LeafletDropBehavior
-[This module temporarily Disables Units within it's radius in a period of time. this should be use in conjunction with the "SPECIAL_LEAFLET_DROP" Special Power Enum]
- DisabledDuration = [integer]
- Delay = [integer]
- AffectRadius = [integer]
- LeafletFXParticleSystem = [entry from ParticleSystem.INI]
-End
-
-MaxHealthUpgrade
- TriggeredBy = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
- AddMaxHealth = [real number]
- ChangeType = [Change Type List]
-End
-
-
-MinefieldBehavior
-[NOTE: This is a misleading Module name, since it's really single-Mine Behavior not a Minefield...]
-[Requires MINE KindOf type in order for this module to properly work.]
- DetonationWeapon = [entry from Weapon.INI]
- DetonatedBy = [ENEMIES, ALLIES, NEUTRAL]
- Regenerates = [Yes/No]
- StopsRegenAfterCreatorDies = [Yes/No]
- WorkersDetonate = [Yes/No]
- CreatorDeathCheckRate = [integer, milliseconds]
- ScootFromStartingPointTime = [integer, milliseconds]
- NumVirtualMines = [integer]
- RepeatDetonateMoveThresh = [real number]
- DegenPercentPerSecondAfterCreatorDies = [percent]
- CreationList = [Entry from ObjectCreationList.INI]
-End
-
-MissileAIUpdate
- DetonateOnNoFuel = [Yes/No] [Should i explode when i run out of fuel?]
- DetonateCallsKill = [Yes/No] [When i detonate, does it mean i am already dead or not?]
- UseWeaponSpeed = [Yes/No] [Weapon speed is defined on the weapon itself]
- IgnitionFX = [entry from FXList.INI]
- InitialVelocity = [integer] [How much throw force does the launcher throws us?]
- IgnitionDelay = [integer, milliseconds][How long to delay before we go to fullspeed?]
- FuelLifetime = [integer, milliseconds][How long to fly before we just fall into the ground?]
- TryToFollowTarget = [Yes/No] [When fired out of the weapon, do we follow the target?]
- KillSelfDelay = [integer in msec] [How long (in seconds) to delay before we detonate?]
-
- [How far do we stray off course when we get jammed?
- [this part of the module allows the use of JAMMED Model Condition State]
- DistanceScatterWhenJammed = [integer]
-
- GarrisonHitKillRequiredKindOf = [KindOf] [What "KindOf" are we allowed to kill when they're inside structures?]
- GarrisonHitKillForbiddenKindOf = [KindOf] [What "KindOf" are we not allowed to kill when they're inside structures?]
- GarrisonHitKillCount = [integer]] [How many targets do we wipe out from the garrisoned targets]
- GarrisonHitKillFX = [entry from FXList.INI]
- DistanceToTargetForLock = [integer]
- DistanceToTargetBeforeDiving = [integer]
- DistanceToTravelBeforeTurning = [integer]
-End
-
-MissileLauncherBuildingUpdate
-[Allows the use of the DOOR_1_OPENING, DOOR_1_WAITING_OPEN, DOOR_1_WAITING_TO_CLOSE, and DOOR_1_CLOSING Model condition states]
- SpecialPowerTemplate = [entry from SpecialPower.INI]
- DoorOpenTime = [integer, milliseconds] [this scales the animation speed in DOOR_1_OPENING ConditionState]
- DoorWaitOpenTime = [integer, milliseconds] [this scales the animation speed in DOOR_1_WAITING_TO_CLOSE ConditionState]
- DoorCloseTime = [integer, milliseconds] [this scales the animation speed in DOOR_1_CLOSING ConditionState]
- DoorOpeningFX = [entry from FXList.INI]
- DoorOpenFX = [entry from FXList.INI]
- DoorWaitingToCloseFX = [entry from FXList.INI]
- DoorClosingFX = [entry from FXList.INI]
- DoorClosedFX = [entry from FXList.INI]
- DoorOpenIdleAudio = [entry from SoundEffects.INI]
-End
-
-MobMemberSlavedUpdate
- MustCatchUpRadius = [integer]
- NoNeedToCatchUpRadius = [integer]
- Squirrelliness = [real number]
- CatchUpCrisisBailTime = [integer]
-End
-
-MobNexusContain
- Slots = [integer]
- InitialPayload = [object name, integer] [only one statement can be used; last statement overrides all previous declarations]
- DamagePercentToUnits = [percent]
- HealthRegen%PerSec = [percentage]
-End
-
-MoneyCrateCollide
-[ A crate that gives x dollars to the person who picked up this crate. Also triggers the use of the 'CrateMoney' sound effects field in MiscAudio.ini]
- MoneyProvided = [integer] [How much money do we provide?]
- UpgradedBoost = [UpgradeType:{Entry from Upgrade.ini} Boost:{integer}]
-
- RequiredKindOf = [KindOf] [What KindOf type is needed to allow us to be picked up]
- ForbiddenKindOf = [KindOf] [What 'KindOf' type we dont allow to pick us?]
- ForbidOwnerPlayer = [Yes/No] [Works with OwnedByMaker (or by explicit ownership script) to prevent a certain player from picking up the crate]
- HumanOnly = [Yes/No] [Let's the crate only be picked up by Humans, mostly for scripted stuff]
- BuildingPickup = [Yes/No] [Allows the crate to be picked up by a building. Example: Plane drops..]
- PickupScience = [Entry from Science.INI] [Forces the player owning the unit trying to get the crate to have a certain science.]
-
- ExecuteFX = [entry from FXList.INI]
- ExecuteAnimation = [entry from Animation2D.INI]
- ExecuteAnimationTime = [real number, seconds]
- ExecuteAnimationZRise = [integer, units per second to rise]
- ExecuteAnimationFades = [Yes/No]
-End
-
-ModelConditionUpgrade
-[Allows you to switch to a model conditionstate via upgrades -ZEROHOUR ONLY!]
- TriggeredBy = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
- ConditionFlag = [Condition State list]
-End
-
-NeutronMissileSlowDeathBehavior
- DeathTypes = [DeathType listing]
- DestructionDelay = [integer, milliseconds]
- DestructionDelayVariance = [integer]
- DestructionAltitude = [integer]
-
- FX = [INITIAL/MIDPOINT/FINAL entry from FXList.INI, multiple statements can be used]
- OCL = [INITIAL/MIDPOINT/FINAL entry from ObjectCreationList.INI, multiple statements can be used]
- Weapon = [INITIAL/MIDPOINT/FINAL entry from Weapon.INI, multiple statements can be used]
-
- ScorchMarkSize = [integer]
- FXList = [enty from FXList.INI]
-[N takes numbers from 1-9]
- BlastNEnabled = [Yes/No]
- BlastNDelay = [integer, milliseconds]
- BlastNScorchDelay [integer, milliseconds]
- BlastNInnerRadius = [real number]
- BlastNOuterRadius = [real number]
- BlastNMaxDamage = [real number, damage is hardcoded to use DamageType EXPLOSION]
- BlastNMinDamage = [real number, damage is hardcoded to use DamageType EXPLOSION]
- BlastNToppleSpeed = [real number]
- BlastNPushForce = [real number]
-End
-
-NeutronBlastBehavior
-[Kills the Pilot of the vehicles when shot by a projectile that has this module]
- BlastRadius = [integer]
- AffectAirborne = [Yes/No]
- AffectAllies = [Yes/No]
-End
-
-NeutronMissileUpdate
- LaunchFX = [entry from FXList.INI]
- TargetFromDirectlyAbove = [integer]
- RelativeSpeed = [real number]
- MaxTurnRate = [integer]
- ForwardDamping = [real number]
- SpecialSpeedTime = [integer, milliseconds]
- SpecialSpeedHeight = [integer]
- SpecialAccelFactor = [integer]
- SpecialJitterDistance = [real number]
- IgnitionFX = [entry from FXList.INI]
- DistanceToTargetBeforeDiving = [integer]
- DistanceToTravelBeforeTurning = [integer]
- IgnitionDelay = [integer]
- DeliveryDecalRadius = [integer]
- DeliveryDecal
- Texture = [texture name without file extension]
- Style = [shadow style type]
- OpacityMin = [percent]
- OpacityMax = [percent]
- OpacityThrobTime = [integer, milliseconds]
- Color = [r: g: b: a:]
- OnlyVisibleToOwningPlayer = [Yes/No]
- End
-End
-
-
-ObjectCreationUpgrade
-[Allows an Object create/spawn a new object via upgrades]
- TriggeredBy = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
- UpgradeObject = [entry from ObjectCreationList.INI]
-End
-
-OCLSpecialPower
- SpecialPowerTemplate = [entry from SpecialPower.INI]
- OCL = [entry from ObjectCreationList.INI]
- UpgradeOCL = [entry from Science.INI, entry from ObjectCreationList.INI, multiple entries for multiple upgrades]
- OCLAdjustPositionToPassable = [Yes/No]
- CreateLocation = [creation point(s)]
- StartsPaused = [Yes/No, yes requires UnpauseSpecialPowerUpgrade module]
- ReferenceObject [object name]
- ScriptedSpecialPowerOnly = [Yes/No]
-End
-
-OCLUpdate
-[A Context window is a reaction to this, no CommandSet]
- FactionTriggered = [Yes/No]
- FactionOCL = [Faction: [faction] ] [entry from ObjectCreationList.INI, multiple statements can be made]
- MinDelay = [integer, milliseconds]
- MaxDelay = [integer, milliseconds]
- CreateAtEdge = [Yes/No]
- OCL = [entry from ObjectCreationList.INI]
-End
-
-OpenContain
- ContainMax = [integer]
- EnterSound = [entry from SoundEffects.INI]
- ExitSound = [entry from SoundEffects.INI]
- AllowInsideKindOf = [KindOf listing]
- ForbidInsideKindOf = [KindOf listing]
- PassengersAllowedToFire = [Yes/No]
- PassengersInTurret = [Yes/No]
- NumberOfExitPaths = [integer]
- AllowAlliesInside = [Yes/No]
- AllowEnemiesInside = [Yes/No]
- AllowNeutralInside = [Yes/No]
- DamagePercentToUnits = [percent]
-End
-
-OverchargeBehavior
-[-Module will display GUI:OverchargeExhausted when objects health is below specified percentage.
- -Activates the use of the "EnergyBonus" object parameter.
- -Allows this object to turn on or off the POWER_PLANT_UPGRADING and POWER_PLANT_UPGRADED Model ConditionState(s).
- -Inflicts "PENALTY" damage to the parent object when the ability is active.]
- HealthPercentToDrainPerSecond = [percent] [% of max health to drain per second when in overcharge mode]
- NotAllowedWhenHealthBelowPercent = [percent] [When the object's current health is below this, turn off overcharge bonus automatically]
-End
-
-
-OverlordContain
-[Like Transport, but when full, passes transport queries along to first passenger (redirects like tunnel)]
- Slots = [integer]
- DamagePercentToUnits = [percentage]
- AllowInsideKindOf = [KindOf]
- PassengersAllowedToFire = [Yes/No]
- PassengersInTurret = [Yes/No]
- ExperienceSinkForRider = [Yes/No]
- WeaponBonusPassedToPassengers = [Yes/No]
- PayloadTemplateName = [object name]
- InitialPayload = [object name, integer] [only one statement can be used; last statement overrides all previous declarations]
-End
-
-
-ParkingPlaceBehavior
-[this module is used by FS_AIRFIELD KindOfs and if HasRunways is set then the model requires RunwayStartN, RunwayEndN, RunwayNPrepN, RunwayNParkingN and RunwayNParkNHan bones where N corrosponds to rows and columns. Module will only use the HeliPark01 bone for helicopters]
- HealAmountPerSecond = [integer]
- NumRows = [integer]
- NumCols = [integer]
- HasRunways = [Yes/No]
- ApproachHeight = [integer]
- ParkInHangars = [Yes/No]
-End
-
-PassengersFireUpgrade
-[Contain Modules should have the "PassengersAllowedToFire" parameter to "No" in order for this module to work -ZERO HOUR ONLY]
-// sets an irreversible flag.
- TriggeredBy = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
-End
-
-ParachuteContain
-[module hardcoded to utilize PARA_MAN, PARA_ATTACH and PARA_COG bones on contained object]
- PitchRateMax = [integer]
- RollRateMax = [integer]
- LowAltitudeDamping = [real number]
- ParachuteOpenDist = [real number]
- KillWhenLandingInWaterSlop = [Yes/No]
- FreeFallDamagePercent = [percent]
- AllowInsideKindOf = [KindOf listing]
- ForbidInsideKindOf = [KindOf listing]
- ParachuteOpenSound = [entry from SoundEffects.INI]
-End
-
-ParticleUplinkCannonUpdate
- SpecialPowerTemplate = [entry from SpecialPower.INI]
-
- BeginChargeTime = [integer, milliseconds]
- RaiseAntennaTime = [integer, milliseconds]
-
- ReadyDelayTime = [integer, milliseconds]
- WidthGrowTime = [integer, milliseconds]
- BeamTravelTime = [integer, milliseconds]
- TotalFiringTime = [integer, milliseconds]
-
- RevealRange = [integer]
-
- OuterEffectBoneName = [bone name]
- OuterEffectNumBones = [integer]
- OuterNodesLightFlareParticleSystem = [entry from ParticleSystem.INI]
- OuterNodesMediumFlareParticleSystem = [entry from ParticleSystem.INI]
- OuterNodesIntenseFlareParticleSystem = [entry from ParticleSystem.INI]
-
- ConnectorBoneName = [bone name]
- ConnectorMediumLaserName = [entry from ParticleSystem.INI]
- ConnectorIntenseLaserName = [entry from ParticleSystem.INI]
- ConnectorMediumFlare = [entry from ParticleSystem.INI]
- ConnectorIntenseFlare = [entry from ParticleSystem.INI]
-
- FireBoneName = [bone name]
-
- LaserBaseLightFlareParticleSystemName = [entry from ParticleSystem.INI]
- LaserBaseMediumFlareParticleSystemName = [entry from ParticleSystem.INI]
- LaserBaseIntenseFlareParticleSystemName = [entry from ParticleSystem.INI]
-
- ParticleBeamLaserName = [entry from ParticleSystem.INI]
- SwathOfDeathDistance = [real number]
- SwathOfDeathAmplitude = [real number]
- TotalScorchMarks = [integer]
- ScorchMarkScalar = [real number]
- BeamLaunchFX = [entry from FXList.INI]
- DelayBetweenLaunchFX = [entry from FXList.INI]
- GroundHitFX = [entry from FXList.INI]
- DamagePerSecond = [integer]
- TotalDamagePulses = [integer]
- DamageType = [DamageType]
- DamageRadiusScalar = [real number]
-
- PoweringUpSoundLoop = [entry from SoundEffects.INI]
- UnpackToIdleSoundLoop = [entry from SoundEffects.INI]
- FiringToPackSoundLoop = [entry from SoundEffects.INI]
- GroundAnnihilationSoundLoop = [entry from SoundEffects.INI]
-
- DamagePulseRemnantObjectName = [object name]
- ManualDrivingSpeed = [integer]
- ManualFastDrivingSpeed = [integer]
- DoubleClickToFastDriveDelay = [integer, milliseconds]
-End
-
-PhysicsBehavior
-[Allows the object to interact, tilt or define how heavy it is in the game world]
- VehicleCrashesIntoNonBuildingWeaponTemplate = [Entry from Weapon.ini][If nothing defined, this is hardcoded to call the VehicleCrashesIntoBuildingWeapon weapon entry]
- VehicleCrashesIntoBuildingWeaponTemplate = [Entry from Weapon.ini][If nothing defined, this is hardcoded to call the VehicleCrashesIntoNonBuildingWeapon weapon entry]
- Mass = [integer] [NOTE: negative values (eg: -0.5) will cause the game to crash but you can do something like this: 0.00002, Default is 50]
- ForwardFriction = [integer] [This countrols how many friction to apply when moving forward]
- ZFriction = [integer] [This countrols how many friction to apply when falling]
- LateralFriction = [integer] [This countrols how many friction to apply when moving sidewards]
- AerodynamicFriction = [integer] [Everything is perfectly aerodynamic by default (0), 1 means not, so this will slow down while in the air (>1 means REALLY not)]
- CenterOfMassOffset = [integer] [Default of 0 means nothing tips as it falls. Positive value tips forward, negative value tips backwards]
- AllowBouncing = [Yes/No] [Is the Object allowed to bounce when impacting the ground?]
- AllowCollideForce = [Yes/No] [Allow Collide force when colliding to some object?]
- KillWhenRestingOnGround = [Yes/No] [If Yes, Kill the object while on the ground, If No, Allows object to live when resting on the ground]
- MinFallHeightForDamage = [integer] [Minimum height from falling to inflict damage to ourselves]
- FallHeightDamageFactor = [real number] [how much damage to do when we fall?]
- PitchRollYawFactor = [real number]
-
- [How much do we resist rolling, pitching and yawing when we're hit with a shockwave blast?
- This part allows the use of the STUNNED and STUNNED_FLAILING Model ConditionState(s)]
- ShockMaxRoll = [Enter from 0.1 to 1.0, values are in reverse, 1.0 won't be resistant and 0.001 would be extremely resistant]
- ShockMaxPitch = [same as above]
- ShockMaxYaw = [ditto]
-
- [How resistant are we against a shockwave blast?]
- ShockResistance = [Enter from 0.1 to 1.0, 0.10 would be 10% resistant while 1.0 is 100% resistant]
-End
-
-PilotFindVehicleUpdate
-[This update will have the pilot go find a "Friendly" vehicle To Enter, this feature is exclusive for AI only]
- ScanRate = [integer, millisecond. Limit 2000]
- ScanRange = [integer, milliseconds]
- MinHealth = [Enter from 0.1 to 1.0, 0.10 would be 10% while 1.0 is 100%]
- [If the vehicle is 0.5 or 50% healthy, The AI pilot will not entire the said vehicle he spotted]
-End
-
-PointDefenseLaserUpdate
- WeaponTemplate = [entry from Weapon.INI]
- PrimaryTargetTypes = [KindOf]
- SecondaryTargetTypes = [KindOf]
- ScanRate = [integer, millisecond. Limit 2000]
- ScanRange = [integer]
- PredictTargetVelocityFactor = [real number]
-End
-
-PoisonedBehavior
-[Triggered when a weapon with a "POISON" DamageType shoots the said object with this module]
- PoisonDamageInterval = [integer] [Every this many msec, I will retake the poison damage dealt me]
- PoisonDuration = [milliseconds] [for this long after last hit by poison damage]
-End
-
-PowerPlantUpdate
-[Allows this object to act as an (upgradeable) power supply,
- Allows this object to use the POWER_PLANT_UPGRADING and POWER_PLANT_UPGRADED Model ConditionState(s)]
- RodsExtendTime = [integer, milliseconds]
-End
-
-PowerPlantUpgrade
-[triggers use of "EnergyBonus" ("ExtraPower" in Original Generals) setting on this object to provide extra power]
- TriggeredBy = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
-End
-
-PreorderCreate
-[no parameters - this module allows the use of the PREORDER ConditionState with this object which in turn is only triggered by presence of registry key 'Preorder' set to '1' in HKLM\Software\ElectronicArts\EAGames\Generals]
-End
-
-ProductionUpdate
-[module is required on an object that uses 'PublicTimer' code for any SpecialPower and/or required for units/structures with object upgrades]
- MaxQueueEntries = [integer] [If Set to 1, you can't build multiple upgrades at the same time]
- ConstructionCompleteDuration = [integer, milliseconds] [in mSeconds, wait time so if you have multiple units they don't run over each other]
- QuantityModifier = [object name,integer] [Redguards uses this so they can comeout of the barracks in pairs]
- DisabledTypesToProcess = [disabled types list]
-
-[Allows the use of the DOOR_x_WAITING_OPEN, DOOR_x_CLOSING, DOOR_x_OPENING Model condition state]
-[X is from 1 to 4 since there's a hardcoded limit of four only]
-[NOTE: DoorOpeningTime also controls how long the produced unit HAVE TO WAIT before popped out, adding the build time of ALL units produced from this factory!]
- NumDoorAnimations = [integer, maximum is 4] [How many doors to use when unit training is complete?]
- DoorOpeningTime = [integer, milliseconds] [in mSeconds, how long the door is opening]
- DoorWaitOpenTime = [integer, milliseconds] [in mSeconds, time the door stays open after the unit exiting]
- DoorCloseTime = [integer, milliseconds] [in mSeconds, how long the door is closing]
-End
-
-ProjectileStreamUpdate
-[no parameters - this module allows the object to behave as a stream like water or other liquid ordinance and works with W3DProjectileStreamDraw]
-End
-
-ProneUpdate
-[this module allows the use of the PRONE ConditionState with this object]
-[Also was/is meant to apply a NO_ATTACK status to the object whenever the prone state is active.]
- DamageToFramesRatio = [real number]
-End
-
-PropagandaTowerBehavior
-[Allows this object that have this module to cast a healing aura to heal nearby units]
- Radius = [real number] [How far can we affect units?]
- DelayBetweenUpdates = [integer, milliseconds] [How often to recheck the propaganda status (msec)
- HealPercentEachSecond = [percent] [Give this unit % of max health every second]
- PulseFX = [entry from FXList.INI] [Plays as often as DelayBetweenUpdates]
- AffectsSelf = [yes/no] [Does the bonus affects the owner?]
- UpgradeRequired = [entry from Upgrade.INI] [What kind of upgrade do we need in order to increase our health bonus?]
- UpgradedHealPercentEachSecond = [percent] [Give this unit % of max health every second when upgraded]
- UpgradedPulseFX = [entry from FXList.INI] [Plays as often as DelayBetweenUpdates]
-End
-
-QueueProductionExitUpdate
- UnitCreatePoint = [x: y: z:]
- NaturalRallyPoint = [x: y: z:]
- ExitDelay = [integer, milliseconds]
- InitialBurst = [integer]
- AllowAirborneCreation = [Yes/No] // a hidden parameter that is never called on any default object. effects are unknown.
-End
-
-RadarUpgrade
-[triggers use of RadarUpdate module on this object if present and enables the Radar in the Commandbar]
- TriggeredBy = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
- DisableProof = [Yes/No]
-End
-
-RadarUpdate
-[Allows the use of the RADAR_EXTENDING and RADAR_UPGRADED model conditionstate and enables the Radar in the Commandbar]
- RadarExtendTime = [integer, milliseconds]
-End
-
-RadiusDecalUpdate
-[no parameters - this module allows use of a radius decal cursor from Mouse.INI on the objects weapon when not explicitly fired]
-End
-
-RailedTransportAIUpdate
-[Used on TRANSPORT KindOfs that follow a specific pre-defined waypoint path in a scripted manner]
-[The Evacuate buton should use the "EXECUTE_RAILED_TRANSPORT" Command Enum in order to evacuate properly]
- PathPrefixName = [waypoint prefix name]
-End
-
-RailedTransportContain
-[Used on TRANSPORT KindOfs that follow a specific pre-defined waypoint path in a scripted manner]
-[The Evacuate buton should use the "EXECUTE_RAILED_TRANSPORT" Command Enum in order to evacuate properly]
- Slots = [integer]
- DamagePercentToUnits = [percentage]
- AllowInsideKindOf = [KindOf listing]
- ForbidInsideKindOf = [KindOf listing]
- DoorOpenTime = [integer, milliseconds]
- ScatterNearbyOnExit = [Yes/No]
- DestroyRidersWhoAreNotFreeToExit = [Yes/No]
- ResetMoodCheckTimeOnExit = [Yes/No]
- OrientLikeContainerOnExit = [Yes/No]
- KeepContainerVelocityOnExit = [Yes/No]
-End
-
-RailedTransportDockUpdate
-[defaults to docking with DOCKWAITING07 bone on destination object]
- NumberApproachPositions = [integer]
- PullInsideDuration = [integer, milliseconds]
- PushOutsideDuration = [integer, milliseconds]
- ToleranceDistance = [integer]
-End
-
-RailroadBehavior
-[requires object to follow waypoint path named as Tunnel, Disembark or Station with 'Start' and 'End' convention]
- IsLocomotive = [Yes/No]
- CrashFXTemplateName = [object name]
- PathPrefixName = [waypoint path prefix name if different from default]
- CarriageTemplateName = [object name, one entry required for each carriage, requires IsLocomotive = Yes]
- BigMetalBounceSound = [entry from SoundEffects.INI]
- SmallMetalBounceSound = [entry from SoundEffects.INI]
- MeatyBounceSound = [entry from SoundEffects.INI]
- RunningGarrisonSpeedMax = [integer]
- KillSpeedMin = [integer]
- SpeedMax = [integer, requires IsLocomotive = Yes]
- WaitAtStationTime = [integer, milliseconds, requires IsLocomotive = Yes]
- RunningSound = [entry from SoundEffects.INI, requires IsLocomotive = Yes]
- ClicketyClackSound = [entry from SoundEffects.INI]
- WhistleSound = [entry from SoundEffects.INI]
- Friction = [real number]
-End
-
-ReplaceObjectUpgrade
-[Allows object to switch to a completely new object when upgraded]
- TriggeredBy = [Entry(S) from upgrade.ini]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
- ReplaceObject = [Object name]
-End
-
-RebuildHoleBehavior
-[Requires the "REBUILD_HOLE" Kind of on the object that will use this to work properly]
- WorkerObjectName = [object name]
- WorkerRespawnDelay = [integer, milliseconds]
- HoleHealthRegen%PerSecond = [percentage]
-End
-
-RebuildHoleExposeDie
-[requires the "object" stated on the HoleName Parameter to have the "REBUILD_HOLE" KindOF and RebuildHoleBehavior Module in order to work]
- HoleName = [object name]
- HoleMaxHealth = [real number]
- TransferAttackers = [Yes/No]
- DeathTypes = [DeathTypes listing]
- RequiredStatus = [status name]
- ExemptStatus = [status name]
-End
-
-RepairDockUpdate
-[module is hardcoded to require DockWaitingN, DockEndN, DockActionN and DockStartN bones, where N should correspond to NumberApproachPositions]
-[requires REPAIR_PAD KindOf to work properly.]
- TimeForFullHeal = [integer, milliseconds]
- AllowsPassthrough = [Yes\No]
- NumberApproachPositions = [integer]
-End
-
-RiderChangeContain
- [module requires ExitStartN and ExitEndN bones defined unless over-ridden by ExitBone definition and allows the use of SoundEnter And SoundExit ]
-
- [Description]
- [A list of each valid rider that is allowed to ride this object. Each rider is
- assigned a modelcondition state, a weaponset flag, an object status bit, and
- a commandset override. The actual object is hidden inside the container so the
- visible rider is fluff. Also riders are deleted (not killed) when the bike is
- destroyed, so all deaths must be OCLs on the bike -ZERO HOUR ONLY!]
-
- [N Takes number from 1 to 8]
- RiderN = [Object] [Model CondtionState] [WeaponSetCondition] [StatusBitType] [Entry From CommandSet.ini] [LocomotorSetType]
- ScuttleDelay = [integer, milliseconds]
- ScuttleStatus = [Model ConditionState]
-
-
- Slots = [integer}
- DamagePercentToUnits = [percentage]
- AllowInsideKindOf = [KindOf listing]
- ForbidInsideKindOf = [KindOf listing]
- ExitDelay = [integer, milliseconds]
- NumberOfExitPaths = [integer, should corrospond to N]
- GoAggressiveOnExit = [Yes/No]
- ScatterNearbyOnExit = [Yes/No]
- OrientLikeContainerOnExit = [Yes/No]
- KeepContainerVelocityOnExit = [Yes/No]
- BurnedDeathToUnits = [Yes/No]
- ExitPitchRate = [integer]
- ExitBone = [bone name]
- DoorOpenTime = [integer, milliseconds]
- HealthRegen%PerSec = [percentage]
- DestroyRidersWhoAreNotFreeToExit = [Yes/No]
- ResetMoodCheckTimeOnExit = [Yes/No]
- InitialPayload = [object name, integer] [only one statement can be used; last statement overrides all previous declarations]
- ArmedRidersUpgradeMyWeaponSet = [Yes/No]
- DelayExitInAir = [Yes/No]
- EnterSound = [entry from SoundEffects.INI] ;SoundEnter Override
- ExitSound = [entry from SoundEffects.INI] ;SoundExit Override
-End
-
-SalvageCrateCollide
- [module is hardcoded to apply the EXJunkCrate shadow texture to this object.]
- [triggers use of "VoiceSalvage" UnitSpecificSounds parameter on objects capable of picking this crate up.]
-
- WeaponChance = [percent] [If we are WeaponSalvager, this is the chance we get a WeaponSet upgrade if not fully upgraded]
- LevelChance = [percent] [Either we are just a regular Salvager, or we are fully upgraded. This is the chance we gain a level]
- MoneyChance = [percent] [This is the chance we get money. Level + Money = 100%. Weapon is an independant FirstChance]
- MinMoney = [integer] [If we get money, this is how much we get. Make them different to get a random range]
- MaxMoney = [integer] [Same as above]
-
- RequiredKindOf = [KindOf] [What KindOf type is needed to allow us to be picked up]
- ForbiddenKindOf = [KindOf] [What 'KindOf' type we dont allow to pick us?]
- ForbidOwnerPlayer = [Yes/No] [Works with OwnedByMaker (or by explicit ownership script) to prevent a certain player from picking up the crate]
- HumanOnly = [Yes/No] [Let's the crate only be picked up by Humans, mostly for scripted stuff]
- BuildingPickup = [Yes/No] [Allows the crate to be picked up by a building. Example: Plane drops..]
- PickupScience = [Entry from Science.INI] [Forces the player owning the unit trying to get the crate to have a certain science.]
-
- ExecuteFX = [entry from FXList.INI]
- ExecuteAnimation = [entry from Animation2D.INI]
- ExecuteAnimationTime = [real number, seconds]
- ExecuteAnimationZRise = [integer, units per second to rise]
- ExecuteAnimationFades = [Yes/No]
-End
-
-SabotagePowerPlantCrateCollide
-[When triggered, this module temporarily shuts down the power plant. Targeted objects needs to have 'FS_POWER' Kindof.]
-[module is hardcoded to play the SabotageBuildingPower sound definition when triggered]
-
- SabotagePowerDuration = [real number]
-
- RequiredKindOf = [KindOf] [What KindOf type is needed to allow us to be picked up]
- ForbiddenKindOf = [KindOf] [What 'KindOf' type we dont allow to pick us?]
- ForbidOwnerPlayer = [Yes/No] [Works with OwnedByMaker (or by explicit ownership script) to prevent a certain player from picking up the crate]
- HumanOnly = [Yes/No] [Let's the crate only be picked up by Humans, mostly for scripted stuff]
- BuildingPickup = [Yes/No] [Allows the crate to be picked up by a building. Example: Plane drops..]
- PickupScience = [Entry from Science.INI] [Forces the player owning the unit trying to get the crate to have a certain science.]
-
- ExecuteFX = [entry from FXList.INI]
- ExecuteAnimation = [entry from Animation2D.INI]
- ExecuteAnimationTime = [real number, seconds]
- ExecuteAnimationZRise = [integer, units per second to rise]
- ExecuteAnimationFades = [Yes/No]
-End
-
-SabotageSupplyDropzoneCrateCollide
-[When triggered, this module steals cash from enemy players then gives it to the owning player who used this]
-[Targeted objects needs to have 'FS_SUPPLY_DROPZONE' Kindof.]
-
- StealCashAmount = [real number]
-
- RequiredKindOf = [KindOf] [What KindOf type is needed to allow us to be picked up]
- ForbiddenKindOf = [KindOf] [What 'KindOf' type we dont allow to pick us?]
- ForbidOwnerPlayer = [Yes/No] [Works with OwnedByMaker (or by explicit ownership script) to prevent a certain player from picking up the crate]
- HumanOnly = [Yes/No] [Let's the crate only be picked up by Humans, mostly for scripted stuff]
- BuildingPickup = [Yes/No] [Allows the crate to be picked up by a building. Example: Plane drops..]
- PickupScience = [Entry from Science.INI] [Forces the player owning the unit trying to get the crate to have a certain science.]
-
- ExecuteFX = [entry from FXList.INI]
- ExecuteAnimation = [entry from Animation2D.INI]
- ExecuteAnimationTime = [real number, seconds]
- ExecuteAnimationZRise = [integer, units per second to rise]
- ExecuteAnimationFades = [Yes/No]
-End
-
-SabotageSuperweaponCrateCollide
-[When triggered, this module resets enemy superweapon timers back to it's start point. Targeted objects needs to have 'FS_SUPERWEAPON' Kindof.]
-[module is hardcoded to play the SabotageBuilding sound definition when triggered]
-
- RequiredKindOf = [KindOf] [What KindOf type is needed to allow us to be picked up]
- ForbiddenKindOf = [KindOf] [What 'KindOf' type we dont allow to pick us?]
- ForbidOwnerPlayer = [Yes/No] [Works with OwnedByMaker (or by explicit ownership script) to prevent a certain player from picking up the crate]
- HumanOnly = [Yes/No] [Let's the crate only be picked up by Humans, mostly for scripted stuff]
- BuildingPickup = [Yes/No] [Allows the crate to be picked up by a building. Example: Plane drops..]
- PickupScience = [Entry from Science.INI] [Forces the player owning the unit trying to get the crate to have a certain science.]
-
- ExecuteFX = [entry from FXList.INI]
- ExecuteAnimation = [entry from Animation2D.INI]
- ExecuteAnimationTime = [real number, seconds]
- ExecuteAnimationZRise = [integer, units per second to rise]
- ExecuteAnimationFades = [Yes/No]
-End
-
-SabotageCommandCenterCrateCollide
-[When triggered, this module temporarily disables the command center. Targeted objects needs to have 'COMMANDCENTER' Kindof.]
-[module is hardcoded to play the SabotageBuilding sound definition when triggered]
- RequiredKindOf = [KindOf] [What KindOf type is needed to allow us to be picked up]
- ForbiddenKindOf = [KindOf] [What 'KindOf' type we dont allow to pick us?]
- ForbidOwnerPlayer = [Yes/No] [Works with OwnedByMaker (or by explicit ownership script) to prevent a certain player from picking up the crate]
- HumanOnly = [Yes/No] [Let's the crate only be picked up by Humans, mostly for scripted stuff]
- BuildingPickup = [Yes/No] [Allows the crate to be picked up by a building. Example: Plane drops..]
- PickupScience = [Entry from Science.INI] [Forces the player owning the unit trying to get the crate to have a certain science.]
-
- ExecuteFX = [entry from FXList.INI]
- ExecuteAnimation = [entry from Animation2D.INI]
- ExecuteAnimationTime = [real number, seconds]
- ExecuteAnimationZRise = [integer, units per second to rise]
- ExecuteAnimationFades = [Yes/No]
-End
-
-SabotageSupplyCenterCrateCollide
-[When triggered, this module steals cash from enemy players then gives it to the owning player who used this. Targeted objects needs to have 'FS_SUPPLY_CENTER' Kindof.]
-[module is hardcoded to play the SabotageBuilding sound definition when triggered]
-
- StealCashAmount = [real number]
-
- RequiredKindOf = [KindOf] [What KindOf type is needed to allow us to be picked up]
- ForbiddenKindOf = [KindOf] [What 'KindOf' type we dont allow to pick us?]
- ForbidOwnerPlayer = [Yes/No] [Works with OwnedByMaker (or by explicit ownership script) to prevent a certain player from picking up the crate]
- HumanOnly = [Yes/No] [Let's the crate only be picked up by Humans, mostly for scripted stuff]
- BuildingPickup = [Yes/No] [Allows the crate to be picked up by a building. Example: Plane drops..]
- PickupScience = [Entry from Science.INI] [Forces the player owning the unit trying to get the crate to have a certain science.]
-
- ExecuteFX = [entry from FXList.INI]
- ExecuteAnimation = [entry from Animation2D.INI]
- ExecuteAnimationTime = [real number, seconds]
- ExecuteAnimationZRise = [integer, units per second to rise]
- ExecuteAnimationFades = [Yes/No]
-End
-
-SabotageMilitaryFactoryCrateCollide
-[When triggered, this module temporarily disables the warfactory. Targeted objects needs to have 'FS_FACTORY' Kindof.]
-[module is hardcoded to play the SabotageBuilding sound definition when triggered]
-
- SabotageDuration = [real number]
-
- RequiredKindOf = [KindOf] [What KindOf type is needed to allow us to be picked up]
- ForbiddenKindOf = [KindOf] [What 'KindOf' type we dont allow to pick us?]
- ForbidOwnerPlayer = [Yes/No] [Works with OwnedByMaker (or by explicit ownership script) to prevent a certain player from picking up the crate]
- HumanOnly = [Yes/No] [Let's the crate only be picked up by Humans, mostly for scripted stuff]
- BuildingPickup = [Yes/No] [Allows the crate to be picked up by a building. Example: Plane drops..]
- PickupScience = [Entry from Science.INI] [Forces the player owning the unit trying to get the crate to have a certain science.]
-
- ExecuteFX = [entry from FXList.INI]
- ExecuteAnimation = [entry from Animation2D.INI]
- ExecuteAnimationTime = [real number, seconds]
- ExecuteAnimationZRise = [integer, units per second to rise]
- ExecuteAnimationFades = [Yes/No]
-End
-
-SabotageFakeBuildingCrateCollide
-[When triggered, this module detonates the fake building, if it has any weapons, and gives it away to the player. Targeted objects needs to have 'FS_FAKE' Kindof.]
-[module is hardcoded to play the SabotageBuilding sound definition when triggered]
- RequiredKindOf = [KindOf] [What KindOf type is needed to allow us to be picked up]
- ForbiddenKindOf = [KindOf] [What 'KindOf' type we dont allow to pick us?]
- ForbidOwnerPlayer = [Yes/No] [Works with OwnedByMaker (or by explicit ownership script) to prevent a certain player from picking up the crate]
- HumanOnly = [Yes/No] [Let's the crate only be picked up by Humans, mostly for scripted stuff]
- BuildingPickup = [Yes/No] [Allows the crate to be picked up by a building. Example: Plane drops..]
- PickupScience = [Entry from Science.INI] [Forces the player owning the unit trying to get the crate to have a certain science.]
-
- ExecuteFX = [entry from FXList.INI]
- ExecuteAnimation = [entry from Animation2D.INI]
- ExecuteAnimationTime = [real number, seconds]
- ExecuteAnimationZRise = [integer, units per second to rise]
- ExecuteAnimationFades = [Yes/No]
-End
-
-SabotageInternetCenterCrateCollide
-[When triggered, this module temporarily disables the internet center. Targeted objects needs to have 'FS_INTERNET_CENTER' Kindof.]
-[module is hardcoded to play the SabotageBuilding sound definition when triggered]
-
- SabotageDuration = [real number]
-
- RequiredKindOf = [KindOf] [What KindOf type is needed to allow us to be picked up]
- ForbiddenKindOf = [KindOf] [What 'KindOf' type we dont allow to pick us?]
- ForbidOwnerPlayer = [Yes/No] [Works with OwnedByMaker (or by explicit ownership script) to prevent a certain player from picking up the crate]
- HumanOnly = [Yes/No] [Let's the crate only be picked up by Humans, mostly for scripted stuff]
- BuildingPickup = [Yes/No] [Allows the crate to be picked up by a building. Example: Plane drops..]
- PickupScience = [Entry from Science.INI] [Forces the player owning the unit trying to get the crate to have a certain science.]
-
- ExecuteFX = [entry from FXList.INI]
- ExecuteAnimation = [entry from Animation2D.INI]
- ExecuteAnimationTime = [real number, seconds]
- ExecuteAnimationZRise = [integer, units per second to rise]
- ExecuteAnimationFades = [Yes/No]
-End
-
-ShroudCrateCollide
-[no parameters - this module shrouds the entire map for the owner of the object that collides with this object.
-Also triggers the 'CrateShroud' sound effect field in MiscAudio.ini]
- RequiredKindOf = [KindOf] [What KindOf type is needed to allow us to be picked up]
- ForbiddenKindOf = [KindOf] [What 'KindOf' type we dont allow to pick us?]
- ForbidOwnerPlayer = [Yes/No] [Works with OwnedByMaker (or by explicit ownership script) to prevent a certain player from picking up the crate]
- HumanOnly = [Yes/No] [Let's the crate only be picked up by Humans, mostly for scripted stuff]
- BuildingPickup = [Yes/No] [Allows the crate to be picked up by a building. Example: Plane drops..]
- PickupScience = [Entry from Science.INI] [Forces the player owning the unit trying to get the crate to have a certain science.]
-
- ExecuteFX = [entry from FXList.INI]
- ExecuteAnimation = [entry from Animation2D.INI]
- ExecuteAnimationTime = [real number, seconds]
- ExecuteAnimationZRise = [integer, units per second to rise]
- ExecuteAnimationFades = [Yes/No]
-End
-
-SlavedUpdate
-[Requires to have 'DRONE' Kindof if you're using it for drone units]
- GuardMaxRange = [integer] [How far away from master I'm allowed when master is idle (doesn't wander)]
- GuardWanderRange = [integer] [How far away I'm allowed to wander from master while guarding]
- AttackRange = [integer] [How far away from master I'm allowed when master is attacking a target]
- AttackWanderRange = [integer] [How far I'm allowed to wander from target]
- ScoutRange = [integer] [How far away from master I'm allowed when master is moving]
- ScoutWanderRange = [integer] [How far I'm allowed to wander from scout point]
- StayOnSameLayerAsMaster = [Yes/No] [Do i stick to my master?]
- DistToTargetToGrantRangeBonus = [integer] [How close I have to be to the master's target in order to grant master a range bonus]
-
- [This part is hardcoded to trigger the "RepairSparks" Sound effect when it repairs it's master, the entry is found in SoundEffects.ini]
- [This also automatically triggers the "SET_PANIC" LocomotorSet Type in order to move around faster when repairing]
- RepairRange = [integer] [How far I can zip around while repair (only moves when he stops welding]
- RepairMinAltitude = [real number] [My minimum repair hover altitude]
- RepairMaxAltitude = [real number] [And my Maximum]
- RepairRatePerSecond = [integer] [How many health points can I restore per second]
- RepairWhenBelowHealth% = [percent] [How low should my master's health be (in %) before I should prioritize repairing and ignore enemy targets]
- RepairMinReadyTime = [integer, milliseconds] [What is my minimum delay time?]
- RepairMaxReadyTime = [integer, milliseconds] [And my max?]
- RepairMinWeldTime = [integer, milliseconds] [How much min delay do i need moving around and repairing per millisecond?
- RepairMaxWeldTime = [integer, milliseconds] [and my max delay]
- RepairWeldingSys = [entry from ParticleSystem.INI] [What particle system should i use when i'm repairing?]
- RepairWeldingFXBone = [bone name] [And where to trigger the weld effect sparks?]
-End
-
-SlowDeathBehavior
-[The basic death module]
- DeathTypes = [DeathType listing]
- SinkRate = [real number]
- ExemptStatus = [status name]
- RequiredStatus = [status name]
- ProbabilityModifier = [integer]
- ModifierBonusPerOverkillPercent = [percent]
- SinkDelay = [integer, milliseconds]
- SinkDelayVariance = [integer]
- DestructionDelay = [integer, milliseconds]
- DestructionDelayVariance = [integer]
- DestructionAltitude = [integer]
- FlingForce = [integer]
- FlingForceVariance = [integer]
- FlingPitch = [integer]
- FlingPitchVariance = [integer]
- FX = [INITIAL/MIDPOINT/FINAL entry from FXList.INI, multiple statements can be used]
- OCL = [INITIAL/MIDPOINT/FINAL entry from ObjectCreationList.INI, multiple statements can be used]
- Weapon = [INITIAL/MIDPOINT/FINAL entry from Weapon.INI, multiple statements can be used]
-End
-
-SpawnBehavior
-[Allows object to spawn objects when triggered]
- SpawnTemplateName = [object name, multiple entries can be used for multiple objects]
- SpawnNumber = [integer]
- SpawnReplaceDelay = [integer]
- SpawnedRequireSpawner = [Yes/No]
- OneShot = [Yes/No]
- CanReclaimOrphans = [Yes/No]
- AggregateHealth = [Yes/No]
- ExitByBudding = [Yes/No]
- InitialBurst = [integer]
- SlavesHaveFreeWill = [Yes/No]
-End
-
-SpawnPointProductionExitUpdate
- SpawnPointBoneName = [bone name]
-End
-
-SpecialAbility
- SpecialPowerTemplate = [entry from SpecialPower.INI]
- UpdateModuleStartsAttack = [Yes/No]
- InitiateSound = [entry from SoundEffects.INI]
- StartsPaused = [Yes/No, yes requires UnpauseSpecialPowerUpgrade module]
-End
-
-SpecialAbilityUpdate
-[this module allows the use of PACKING and UNPACKING ConditionState(s)]
- SpecialPowerTemplate = [entry from SpecialPower.INI]
- StartAbilityRange = [real number]
- AbilityAbortRange = [real number]
- PreparationTime = [integer, milliseconds]]
- PreTriggerUnstealthTime = [integer, milliseconds]
- SkipPackingWithNoTarget = [Yes/No]
- SpecialObject = [object name]
- SpecialObjectAttachToBone = [bone name]
- SpecialObjectsPersistent = [Yes/No]
- MaxSpecialObjects = [integer]
- EffectDuration = [integer, milliseconds]
- EffectValue = [integer]
- UniqueSpecialObjectTargets = [Yes/No]
- SpecialObjectsPersistWhenOwnerDies = [Yes/No]
- AlwaysValidateSpecialObjects = [Yes/No]
- FlipOwnerAfterPacking = [Yes/No]
- FlipOwnerAfterUnpacking = [Yes/No]
- FleeRangeAfterCompletion = [real number]
- DisableFXParticleSystem = [entry from ParticleSystem.INI]
- DoCaptureFX = [Yes/No]
- PackSound = [entry from SoundEffects.INI]
- UnpackSound = [entry from SoundEffects.INI]
- PrepSoundLoop = [entry from SoundEffects.INI]
- TriggerSound = [entry from SoundEffects.INI]
- LoseStealthOnTrigger = [Yes/No]
- AwardXPForTriggering = [integer]
- SkillPointsForTriggering = [integer]
- ApproachRequiresLOS = [Yes/No]
- NeedToFaceTarget = [Yes/No]
- UnpackTime = [integer, milliseconds]
- PackTime = [integer, milliseconds]
- PersistentPrepTime = [integer]
- PersistenceRequiresRecharge = [Yes/No]
-End
-
-SpecialPowerCreate
-[no parameters - this module forces the objects SpecialPower to start charging upon creation of the object - required by special powers that have PublicTimer = Yes]
-End
-
-SpecialPowerCompletionDie
- SpecialPowerTemplate = [entry from SpecialPower.INI]
-End
-
-SpectreGunshipUpdate
- SpecialPowerTemplate = [Entry from SpecialPower.INI]
- GunshipOrbitRadius = [real number] [Controls the total size of the AttackAreaDecal and also the area Radius in which the gunship encircles]
- TargetingReticleRadius = [real number] [How big the TargetingReticleDecal is]
- AttackAreaRadius = [real number] [Total area radius in which the gunship can bombard]
- OrbitTime = [milliseconds] [How long does the gunship circle and bombard the targeted area]
- OrbitInsertionSlope = [real number] [How steep the gunship enters the target area]
-
- HowitzerWeaponTemplate = [Entry from Weapon.INI]
- HowitzerFiringRate = [milliseconds, default: 300ms] [Delay between shots of the howitzer cannon]
- HowitzerFollowLag = [milliseconds] [How long after gattling acquires target can howitzer shoot same]
- RandomOffsetForHowitzer = [real number] [Howitzer weapon scatter radius, higher the less accurate the cannon is]
-
- GattlingTemplateName = [Object Entry] [REQUIRED in order for the howitzer cannon to work]
- GattlingStrafeFXParticleSystem = [entry from ParticleSystem.INI] [When the gattling cannon is firing, what particle effect to show as an bullet impact]
- StrafingIncrement = [real number] [how far apart is each shot of the gattling as it strafes]
- AttackAreaDecal
- Texture = [texture name without file extension]
- Style = [shadow style type]
- OpacityMin = [percent]
- OpacityMax = [percent]
- OpacityThrobTime = [integer, milliseconds]
- Color = [r: g: b: a:]
- OnlyVisibleToOwningPlayer = [Yes/No]
- End
- TargetingReticleDecal
- Texture = [texture name without file extension]
- Style = [shadow style type]
- OpacityMin = [percent]
- OpacityMax = [percent]
- OpacityThrobTime = [integer, milliseconds]
- Color = [r: g: b: a:]
- OnlyVisibleToOwningPlayer = [Yes/No]
- End
-End
-
-SpectreGunshipDeploymentUpdate
- SpecialPowerTemplate = [entry(s) from SpecialPower.ini
- RequiredScience = [Entry From Science.ini]
- GunshipTemplateName = [Object Entry]
- AttackAreaRadius = [integer]
- CreateLocation = [OCL CreationPointType List ]
-End
-
-SpyVisionUpdate
- TriggeredBy = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
- NeedsUpgrade = [Yes/No]
-
- SelfPowered = [Yes/No]
- SelfPoweredDuration = [integer, Millisecond]
- SelfPoweredInterval = [integer, Millisecond]
- SpyOnKindof = [KindOf list] [DEFAULTS Too all defined kindof]
-End
-
-SpyVisionSpecialPower
- SpecialPowerTemplate = [entry from SpecialPower.INI]
- BaseDuration = [integer, milliseconds]
- StartsPaused = [Yes/No, yes requires UnpauseSpecialPowerUpgrade module]
-
- ;This part of this module is obsolete. It was originally used for the removed POW logic.
- ;BonusDurationPerCaptured = [integer, milliseconds]
- ;MaxDuration = [integer, milliseconds]
-End
-
-SquishCollide
-[no parameters - this module allows the object to use the SPLATTED death type and SPLATTED ConditionState - infantry only]
-End
-
-StatusBitsUpgrade
- TriggeredBy = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RemovesUpgrades = [entry(s) from Upgrade.INI, multiple "upgrade" entrys can be put here]
- RequiresAllTriggers = [Yes/No]
- StatusToSet = [status name]
- StatusToClear = [status name]
-End
-
-SmartBombTargetHomingUpdate
-[this module dynamically adjust the "bomb" so it will drop to its designated target instead of missing it]
- CourseCorrectionScalar = [real number] [ 1=no homing, 0=snapto; 0.99=smooth, 0.95=too-fast]
-End
-
-
-StealthDetectorUpdate
-[module is hardcoded to display MESSAGE:StealthDiscovered when triggered]
- DetectionRate = [integer, milliseconds] [how often to rescan for stealthed things in my sight (msec)]
- DetectionRange = [integer, if not specified, Defaults to Object's VisionRange] [how far can we scan for stealthed things?]
- CanDetectWhileGarrisoned = [Yes/No] [Can i detect or scan for stealthed things when i'm garrisoned?]
- CanDetectWhileContained = [Yes/No] [Or loaded in a vehicle or structure?]
- ExtraRequiredKindOf = [KindOf] [If the unit have a particular kind of defined here, Detect and reveal it] [For an example on how this works, check the Dozers]
- ExtraForbiddenKindOf = [KindOf] [If the unit have a particular kind of defined here, Don't Detect and reveal it]
- PingSound = [entry from SoundEffects.INI] [If scanning for stealthed items, play this]
- LoudPingSound = [entry from SoundEffects.INI] [If we found stealthed items, play this]
- IRParticleSysName = [entry from ParticleSystem.INI] [Use this particle while we're scanning while doing nothing]
- IRBrightParticleSysName = [entry from ParticleSystem.INI] [Use this particle if we found stealthed things]
- IRGridParticleSysName = [entry from ParticleSystem.INI] [Use this particle to put a grid on the stealthed things we found]
- IRBeaconParticleSysName = [entry from ParticleSystem.INI] [Use this particle if we found stealthed things]
- IRParticleSysBone = [bone name] [Where to spawn the particle fx's]
- InitiallyDisabled = [Yes/No] [Used by strategy centers]
-End
-
-StealthUpdate
-[This module allows the use of SoundStealthOn and SoundStealthOff parameters on the object and is hardcoded to display MESSAGE:StealthNeutralized when the object has been discovered]
- UseRiderStealth = [Yes/No] [When used in a transport, do we use the passenger's stealth update instead of our own?]
- StealthDelay = [integer, milliseconds] [How many millisecond does it need to trigger / retrigger our stealth?]
- MoveThresholdSpeed = [integer]
- StealthForbiddenConditions = [Object Condition types] [What object status that breaks our stealth ability?]
- HintDetectableConditions = [Status Bit types] [What object status that gives hint to the enemy that we're here lurking?]
- FriendlyOpacityMin = [percentage] [What's our minimum opacity when we fade in / out?]
- FriendlyOpacityMax = [percentage] [What's our maximum opacity when we fade in / out?]
- PulseFrequency = [integer, milliseconds] [How fast do we trigger the fade in / out effect?]
- RevealDistanceFromTarget = [real number] [When attacking, how far away do we reveal ourselves to the enemy?]
- OrderIdleEnemiesToAttackMeUponReveal = [Yes/No] [Self explainatory]
- ForbiddenStatus = [Status Bit types]
- RequiredStatus = [Status Bit types]
- InnateStealth = [Yes/No] [If yes, stealth module is on by default. If no, requires upgrade first]
-
- EnemyDetectionEvaEvent = [Entry from Eva.ini]
- OwnDetectionEvaEvent = [Entry from Eva.ini]
- GrantedBySpecialPower = [Yes/No] [Is our stealth ability only enabled when granted by a special power?]
- BlackMarketCheckDelay = [integer, milliseconds] [combines with NO_BLACK_MARKET forbidden condition to require the presence of an object with FS_BLACK_MARKET KINDOF.]
-
- [Note: This part needs the DISGUISER KindOf defined on the object and
- [allows the use of DisguiseStarted and DisguiseRevealedSuccess
- [and DisguiseRevealedFailure within UnitSpecificSounds section of the object]
- DisguisesAsTeam = [Yes/No]
- DisguiseFX = [entry from FXList.INI]
- DisguiseRevealFX = [entry from FXList.INI]
- DisguiseTransitionTime = [integer, milliseconds]
- DisguiseRevealTransitionTime = [integer, milliseconds]
-End
-
-StealthUpgrade
-[enables use of StealthUpdate module on this object, requires InnateStealth = No defined in the StealthUpdate module]
-[Sets a permanent CAN_STEALTH status on the object.]
- TriggeredBy = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
-End
-
-StickyBombUpdate
-[this module keeps this object attached properly to the intended target if the targetted object moves
-and allows the use of UnitBombPing and StickyBombCreated within UnitSpecificSounds section of the object]
- GeometryBasedDamageWeapon = [Entry from Weapon.ini][We add our bounding circle to the radius of this weapon, and damage people ourselves]
- GeometryBasedDamageFX = [Entry from FXList.INI][And we modify our detonation fx here]
-End
-
-StructureBody
-[This is a Body module not a Behavior module. Used by objects with STRUCTURE and IMMOBILE KindOf's defined.]
- MaxHealth = [integer]
- InitialHealth = [integer
- SubdualDamageCap = [integer]
- SubdualDamageHealRate = [integer]
- SubdualDamageHealAmount = [integer]
-End
-
-StructureCollapseUpdate
-[Allows Objects to collapse to the ground during death, uses RUBBLE state during collapse sequence and uses POST_COLLAPSE model state
- after finishing the collapsing sequence; Requires the GeometryHeight to know how deep the object will sink and finally stop the animation]
-
- RequiredStatus = [StatusBits type]
- ExemptStatus = [StatusBits type]
- MinCollapseDelay = [integer, milliseconds] [Min delay when to play the "DELAY" OCL or FX state effects]
- MaxCollapseDelay = [integer, milliseconds] [Max delay of above]
- CollapseDamping = [-1 to 1] [How much drag do we applly when freefalling during collapse? 1 means apply full drag, 0 means no drag, -1 freefall at full speed.]
- MaxShudder = [real number] [How much do we shake when we collapse? 1.0 is parkisons disease levels]
- MinBurstDelay = [integer, milliseconds] [Min delay when to play the "BURST" OCL or FX state effects]
- MaxBurstDelay = [integer, milliseconds] [Max Delay of above]
- BigBurstFrequency = [integer] [How many BURST state do we play?]
- OCL = [INITIAL/FINAL/DELAY/BURST entry from ObjectCreationList.INI, Multiple Statements can me made]
- FXList = [INITIAL/FINAL/DELAY/BURST entry from FXList.INI,Multiple Statements can me made]
-End
-
-StructureToppleUpdate
-[Allows Objects to topple over to the ground during death, uses RUBBLE state during toppling sequence and uses POST_COLLAPSE model state
- after finishing the toppling sequence]
- MinToppleDelay = [integer, milliseconds]
- MaxToppleDelay = [integer, milliseconds]
- MinToppleBurstDelay = [integer, milliseconds]
- MaxToppleBurstDelay = [integer, milliseconds]
- StructuralIntegrity = [real number]
- StructuralDecay = [real number]
- TopplingFX = [entry from FXList.INI]
- ToppleDelayFX = [entry from FXList.INI]
- ToppleStartFX = [entry from FXList.INI]
- ToppleDoneFX = [entry from FXList.INI]
- CrushingFX = [entry from FXList.INI]
- CrushingWeaponName = [entry from Weapon.INI]
- DamageFXTypes = [DamageTypes listing]
- AngleFX = [real number entry from FXList.INI]
-End
-
-SubObjectsUpgrade
-[shows/hides sub-objects on this objects model via upgrading,works
- in tandem with the show/hide object fields on the draw module]
- TriggeredBy = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
- ShowSubObjects = [sub object name(s)]
- HideSubObjects = [sub object name(s)]
-End
-;-----------------------------
-[These set of modules requires the "SUPPLY_SOURCE" and "SUPPLY_SOURCE_ON_PREVIEW" KindOf defined in order to properly work]
-SupplyCenterCreate
-[no parameters - this module ensures the object acts as a destination for collection of supplies]
-End
-
-SupplyCenterDockUpdate
- NumberApproachPositions = [integer]
- AllowsPassthrough = [Yes/No]
- GrantTemporaryStealth = [integer] [Give temporary stealth to the harvester whenever created. Loses it when player order given.]
-End
-;-----------------------------
-SupplyCenterProductionExitUpdate
-[logic requires NaturalRallyPoint x: co-ordinate to match the object GeometryMajorRadius!]
- UnitCreatePoint = [x: y: z:]
- NaturalRallyPoint = [x: y: z:]
- GrantTemporaryStealth = [integer/millisec] [Give temporary stealth to the harvester whenever created. Loses it when player order given.]
-End
-
-SupplyTruckAIUpdate
-[This requires the object to have KindOf = HARVESTER]
- MaxBoxes = [integer]
- SupplyCenterActionDelay = [integer]
- SupplyWarehouseActionDelay = [integer]
- SupplyWarehouseScanDistance = [integer]
- SuppliesDepletedVoice = [sound name from Voice.INI]
- AutoAcquireEnemiesWhenIdle = [Yes/No][NOTWHILEATTACKING/ATTACK_BUILDINGS/STEALTHED]
- MoodAttackCheckRate = [integer, milliseconds, default is 2000]
- ForbidPlayerCommands = [Yes/No]
- TurretsLinked =[Yes/No]
- Turret
- [see AIUpdateInterface for full parameters]
- End
- AltTurret
- [as above]
- End
-End
-
-SupplyWarehouseCreate
-[no parameters - this module ensures the object acts as a source for collection of supplies. this modules requires the "SUPPLY_SOURCE" KindOf defined in order to properly work]
-End
-
-SupplyWarehouseCripplingBehavior
-[This modules requires the "SUPPLY_SOURCE" KindOf defined in order to properly work, Forces object to dynamically restore itself - module is triggered when object is REALLYDAMAGED or at 30% of MaxHealth]
- SelfHealingSupression = [integer, milliseconds] [Time since last damage until I can start to heal]
- SelfHealDelay = [integer, milliseconds] [Once I am okay to heal, how often to do so]
- SelfHealAmount = [integer] [And how much to restore my health points]
-End
-
-SupplyWarehouseDockUpdate
-[This modules requires the "SUPPLY_SOURCE" KindOf defined in order to properly work]
- NumberApproachPositions = [integer] [If set, Use DockWaitingN, DockEndN, DockActionN and DockStartN bones, where N should correspond to NumberApproachPositions]
- [If -1 is set, anyone can approch this without using any docking bones]
- AllowPassthrough = [Yes/No] [Should we allow harvesters to go thru?]
- StartingBoxes = [integer] [Even if you use a script to set the cash value, this will determine graphically what "full" is]
- DeleteWhenEmpty = [Yes/No] [Delete Supply Resource if depleted]
-End
-
-SwayClientUpdate
-[no parameters, this module is a ClientUpdate not a Behavior and allows object to sway if enabled in GameData.INI or allowed by LOD/map specific settings]
-End
-
-TechBuildingBehavior
-[Objects with TECH_BUILDING Kindof requires this module]
-
-[ Allows to use CAPTURED ConditionState.
-A building with this module will turn neutral on death. This includes any objects that are spawned by its death.]
-
- PulseFX = [entry from FXList.INI]
- PulseFXRate = [integer, milliseconds]
-End
-
-TensileFormationUpdate
-[allows object to share dynamic formation - if not enabled then damage to this object will affect all nearby objects that have this module, otherwise damage only affects this object]
- Enabled = [Yes/No]
- CrackSound = [entry from SoundEffects.INI]
-End
-
-ToppleUpdate
-[Will only trigger when the unit colliding with this object has at least {CrusherLevel = 2}]
- ToppleFX = [entry from FXList.INI] [FX played at the start of the toppling sequence]
- BounceFX = [entry from FXList.INI] [FX played when hitting the ground]
- StumpName = [object name] [What object to spawn while we're toppling?]
- KillWhenStartToppling = [Yes/No] [Is the object considered dead right from the beginning of the toppling process?]
- KillWhenFinishedToppling = [yes/no] [Or does the object dies just after it topples over completely?]
- KillStumpWhenToppled = [Yes/No] [Once we've toppled, do we also kill the spawned stump as well?]
- ToppleLeftOrRightOnly = [Yes/No] [Do we topple in the left and right direction only?]
- ReorientToppledRubble = [Yes/No]
- InitialVelocityPercent = [percent, default is 1%] [How fast do we topple over?]
- InitialAccelPercent = [percent,default is 1%] [How fast do we accelerate when toppling over?]
- BounceVelocityPercent = [percent, default is 30%] [How bouncey are we when we impact the ground?]
-End
-
-TransitionDamageFX
-[N takes numbers from 1-12]
- DamagedFXListN = [Loc:{x: y: z:} FXList:{entry from FXList.INI}]
- DamagedParticleSystemN = [bone:{name} RandomBone:{Yes/No} PSys:{entry from ParticleSystem.INI}]
- DamagedOCLN = [Loc:{x: y: z:} OCL:{entry from ObjectCreationList.INI}]
-
- ReallyDamagedFXListN = [Loc:{x: y: z:} FXList:{entry from FXList.INI}]
- ReallyDamagedOCLN = [Loc:{x: y: z:} OCL:{entry from ObjectCreationList.INI}]
- ReallyDamagedParticleSystemN = [bone:{name} RandomBone:{Yes/No} PSys:{entry from ParticleSystem.INI}]
-
- RubbleFXListN = [Loc:{x: y: z:} FXList:{entry from FXList.INI}]
- RubbleOCLN = [Loc:{x: y: z:} OCL:{entry from ObjectCreationList.INI}]
- RubbleParticleSystemN = [bone:{name} RandomBone:{Yes/No} PSys:{entry from ParticleSystem.INI}]
-End
-
-
-TransportAIUpdate
-[used on TRANSPORT KindOfs that contain other objects - see AIUpdateInterface Module for all associated parameters]
-End
-
-
-TransportContain
-[Module requires ExitStartN and ExitEndN bones defined unless over-ridden by ExitBone definition,
- Allows the use of SoundEnter And SoundExit UnitSpecificSounds,
- Needs TransportAIUpdate module and TRANSPORT Kindof in order to work efficiently, but can be still used even without those two parameters. ]
- Slots = [integer]
- DamagePercentToUnits = [percentage]
- AllowInsideKindOf = [KindOf listing]
- ForbidInsideKindOf = [KindOf listing]
- AllowAlliesInside = [Yes/No]
- AllowNeutralInside = [Yes/No]
- AllowEnemiesInside = [Yes/No]
- ExitDelay = [integer, milliseconds]
- NumberOfExitPaths = [integer, should corrospond to N]
- GoAggressiveOnExit = [Yes/No]
- ScatterNearbyOnExit = [Yes/No]
- OrientLikeContainerOnExit = [Yes/No]
- KeepContainerVelocityOnExit = [Yes/No]
- BurnedDeathToUnits = [Yes/No]
- ExitPitchRate = [integer]
- ExitBone = [bone name]
- DoorOpenTime = [integer, milliseconds]
- HealthRegen%PerSec = [percentage]
- DestroyRidersWhoAreNotFreeToExit = [Yes/No]
- ResetMoodCheckTimeOnExit = [Yes/No]
- InitialPayload = [object name, integer] [only one statement can be used; last statement overrides all previous declarations]
- ArmedRidersUpgradeMyWeaponSet = [Yes/No]
- DelayExitInAir = [Yes/No]
- EnterSound = [entry from SoundEffects.INI] ;SoundEnter Override
- ExitSound = [entry from SoundEffects.INI] ;SoundExit Override
- WeaponBonusPassedToPassengers = [Yes/No]
- PassengersAllowedToFire = [Yes/No]
-End
-
-TunnelContain
-[Allows object to enter tunnels and exit to other tunnels of the same type.
-Tunnel capacity is controlled by 'MaxTunnelCapacity' entry located in GameData.ini]
- TimeForFullHeal = [integer, in milliseconds)
- EnterSound = [entry from SoundEffects.INI] ;SoundEnter Override
- ExitSound = [entry from SoundEffects.INI] ;SoundExit Override
- NumberOfExitPaths = [integer, should corrospond to N]
- AllowAlliesInside = [Yes/No]
- AllowNeutralInside = [Yes/No]
- AllowEnemiesInside = [Yes/No]
- ExemptStatus = [StatusBits type]
-End
-
-UndeadBody
-[Body module that treats the first death as a state change.
-Allows the use of SECOND_LIFE Model condition state and SECOND_LIFE ArmorSet type and the BattleBusSlowDeathBehavior module - ZEROHOUR ONLY]
- MaxHealth = [integer]
- InitialHealth = [integer]
- SecondLifeMaxHealth =[integer]
- SubdualDamageCap = [integer]
- SubdualDamageHealRate = [integer]
- SubdualDamageHealAmount = [integer]
-End
-
-UnitCrateCollide
-[A crate module that allows to spawn free vehicles once it gets picked up
-Also triggers the 'CrateFreeUnit' sound effects field in MiscAudio.ini]
- UnitCount = [integer]
- UnitName = [object name]
-
- RequiredKindOf = [KindOf] [What KindOf type is needed to allow us to be picked up]
- ForbiddenKindOf = [KindOf] [What 'KindOf' type we dont allow to pick us?]
- ForbidOwnerPlayer = [Yes/No] [Works with OwnedByMaker (or by explicit ownership script) to prevent a certain player from picking up the crate]
- HumanOnly = [Yes/No] [Let's the crate only be picked up by Humans, mostly for scripted stuff]
- BuildingPickup = [Yes/No] [Allows the crate to be picked up by a building. Example: Plane drops..]
- PickupScience = [Entry from Science.INI] [Forces the player owning the unit trying to get the crate to have a certain science.]
-
- ExecuteFX = [entry from FXList.INI]
- ExecuteAnimation = [entry from Animation2D.INI]
- ExecuteAnimationTime = [real number, seconds]
- ExecuteAnimationZRise = [integer, units per second to rise]
- ExecuteAnimationFades = [Yes/No]
-End
-
-UnpauseSpecialPowerUpgrade
-[Unlocks the special power of the owning object if he gets upgraded]
- TriggeredBy = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
- SpecialPowerTemplate = [entry from SpecialPower.INI]
-End
-
-UpgradeDie
-[This frees the object based upgrade for the producer object]
-[NOTE: the Module tag name and Upgrade Name you will define in the "UpgradeToRemove" tag should be the exact upgrade name or your game will crash]
- DeathTypes = [DeathTypes listing]
- UpgradeToRemove = [entry from Upgrade.INI moduletag name,
- RequiredStatus = [StatusBits type]
- ExemptStatus = [StatusBits type]
-End
-
-VeterancyGainCreate
-[Module that instantly promotes a unit once triggered at start or via a Science special power]
- StartingLevel = [Veterancy Level List]
- ScienceRequired = [entry from Science.INI]
-End
-
-VeterancyCrateCollide
-[ Gives a veterancy, if trainable, when picked up within the 'EffectRange' radius.]
- EffectRange = [real number][ 0 range affects only the object that collides with this]
- AddsOwnerVeterancy = [Yes/No] [do we add our own veterancy to the target (rather than just +1 level)?]
- IsPilot = [Yes/No] [ do extra checks instead of being an ordinary crate]
-
- RequiredKindOf = [KindOf] [What 'KindOf' class we want to affect?]
- ForbiddenKindOf = [KindOf] [What 'KindOf' type we dont allow to pick us?]
- ForbidOwnerPlayer = [Yes/No] [Works with OwnedByMaker (or by explicit ownership script) to prevent a certain player from picking up the crate]
- HumanOnly = [Yes/No] [Let's the crate only be picked up by Humans, mostly for scripted stuff]
- BuildingPickup = [Yes/No] [Allows the crate to be picked up by a building. Example: Plane drops..]
- PickupScience = [Entry from Science.INI] [Forces the player owning the unit trying to get the crate to have a certain science.]
-
- ExecuteFX = [entry from FXList.INI]
- ExecuteAnimation = [entry from Animation2D.INI]
- ExecuteAnimationTime = [real number, seconds]
- ExecuteAnimationZRise = [integer, units per second to rise]
- ExecuteAnimationFades = [Yes/No]
-End
-
-WanderAIUpdate
-[no parameters - this module allows this object to move randomly about its point of origin using a SET_WANDER locomotor]
-End
-
-WaveGuideUpdate
-[module is hardcoded to use the following particle system definitions: WaveSpray03, WaveSpray02, WaveSpray01, WaveSplashRight01, WaveSplashLeft01, WaveHit01, WaveSplash01
-and also uses the WaterWaveBridge object definition as a template when it collides with a bridge.
-Requires a WAVEGUIDE KindOf]
- WaveDelay = [integer, milliseconds] ;Delay before the wave starts moving.
- YSize = [real number] ;Wave size in Y-Axis Orientation.
- LinearWaveSpacing = [real number] ;Linear waves get pushed up at these intervals across.
- WaveBendMagnitude = [real number] ;Shape of wave (larger # = more flat and 0 = straight line).
- WaterVelocity = [real number] ;In dist per sec, velocity to "push up" the water.
- PreferredHeight = [real number] ;Water level we want to be after the wave.
- ShorelineEffectDistance = [real number] ;This far behind the wave we "hit" the shores.
- DamageRadius = [real number] ;Damage things this far from us waves.
- DamageAmount = [integer] ;Do this much damage to the objects in our path.
- ToppleForce = [real number] ;Force strength we topple things within our path.
- RandomSplashSound = [entry from SoundEffects.INI] ;What kind of sound we play when we randomly splashes around
- RandomSplashSoundFrequency = [integer] ;Every so often a # from 1-100 is chosen, if above this number the sound will play
- BridgeParticle = [entry from ParticleSystem.INI] ;Particle system when wave hits a bridge
- BridgeParticleAngleFudge = [floating point number] ;Angle to offset the bridge particle angle
- LoopingSound = [entry from SoundEffects.INI] ;What sound do we play while we're wrecking havoc?
-End
-
-WeaponBonusUpgrade
-[Triggers use of WeaponBonus = parameter on this objects weapons]
-[Can also be set on projectiles of a weapon if for any reason the main weapon already benefits from a bonus.]
- TriggeredBy = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
-End
-
-WeaponBonusUpdate
-[Temporarily triggers use of a certain WeaponBonus. Weapon Bonus list is found in Gamedata.ini. -ZERO HOUR ONLY]
- RequiredAffectKindOf = [Kindof] ; what kindof we allow so it will get affected by the "temp" weapon bonus?
- ForbiddenAffectKindOf = [Kindof] ; what kindof we forbid so it will not get affected by the "temp" weapon bonus?
- BonusDuration = [milliseconds] ; How long effect lasts,ms
- BonusDelay = [integer] ; How often to pulse (short lifetime will trump, of course)
- BonusRange = [integer] ; Keep in line with radius cursor size in special power template
- BonusConditionType = [Weapon Bonus List] ; And which bonus to give
-End
-
-WeaponSetUpgrade
-[Triggers use of the following:
- -'PLAYER_UPGRADE' WeaponSet type
- 'WeaponUpgradeSound' UnitSpecificSounds parameter
- 'WEAPONSET_PLAYER_UPGRADE' ConditionState]
-
- TriggeredBy = [entry(s) from Upgrade.INI]
- FXListUpgrade = [entry from FXList.INI]
- ConflictsWith = [entry(s) from Upgrade.INI]
- RequiresAllTriggers = [Yes/No]
-End
-
-WorkerAIUpdate
-[this modules makes the object behave both like a harvester and a builder unit; requires both "HARVESTER" and "DOZER" kindof type to work properly.
- this module allows the use of following parameters:
- "VoiceRepair", "VoiceBuildResponse", "VoiceSupply", "VoiceNoBuild" and "VoiceTaskComplete" within UnitSpecificSounds section of the object,
- "MINE_CLEARING_DETAIL" WeaponSet ConditionType]
- RepairHealthPercentPerSecond = [percent]
- BoredTime = [integer, milliseconds]
- BoredRange = [integer]
- MaxBoxes = [integer]
- AutoAcquireEnemiesWhenIdle = [Yes/No]
- UpgradedSupplyBoost = [integer]
- SupplyCenterActionDelay = [integer]
- SupplyWarehouseActionDelay = [integer]
- SupplyWarehouseScanDistance = [integer]
- SuppliesDepletedVoice = [sound name from Voice.INI]
-End
-
-;--------------------------------------------
-;--------------------------------------------
-W3D Draw Modules:
-NOTE: Draw modules should ALWAYS Be on the beginning of the object code in order to appear properly in Worldbuilder and/or ingame]
-;--------------------------------------------
-;--------------------------------------------
-W3DDebrisDraw
-[no parameters - special case draw module used by ObjectCreationList.INI when using the CreateDebris code which defaults to calling the GenericDebris object definition as a template for each debris object generated]
-End
-
-W3DDefaultDraw
-[no parameters - all world objects should use a draw module, this module is employed where an object should never actually be drawn due either to the nature or type of the object or because its drawing is handled by other logic, e.g. bridges]
-End
-
-W3DDependencyModelDraw
-[special case draw module which is interdependent with the W3DOverlordTankDraw and the W3DOverlordAirCraftDraw and the W3DOverlordTruckDraw module(s)]
- [see W3DModelDraw module for associated parameters]
- AttachToBoneInContainer = [bone name from object in W3DOverlordTankDraw module]
-End
-
-W3DModelDraw
- DefaultConditionState [OR, ConditionState = NONE]
- Model = [W3D model filename]
-
- [Weapon Bone Settings]
- WeaponRecoilBone = [Weapon Slot list, bone name, multiple statements can be used]
- WeaponFireFXBone = [Weapon Slot list, bone name, multiple statements can be used]
- WeaponMuzzleFlash = [Weapon Slot list, bone name, multiple statements can be used]
- WeaponLaunchBone = [Weapon Slot list, bone name, multiple statements can be used]
- WeaponHideShowBone = [Weapon Slot list, bone name]
-
- [Model Animation Settings]
- ; there is a new, OPTIONAL number following the animation. (remember, only ONE number)
- ; it represents the distance that a single loop the animation would
- ; cover. (ie, maybe it has the solder taking three strides, for a
- ; distance of 30 or so)
- ;
- ; Animation = DUDEANIM_SKN.DUDEANIM_RKROL 32 ;<- the distance modifier
- ;
- ; how to tweak the number:
- ; -- "skidding"? reduce the number
- ; -- "running in place"? increase the number
- ;
- Animation = [model animation name, integer] [multiple statements can be used]
- AnimationSpeedFactorRange = [integer, integer] [default: 1.0 1.0]
- ;
- ; if there are multiple idle animations exist, they will be played IN EXACT ORDER from top to bottom.
- ; adding TWO OPTIONAL numbers after the animation name allows it to be played more than once in the loop.
- ;
- ; IdleAnimation = DUDEANIM_SKN.DUDEANIM_STA 0 30
- ;
- ; this will make this idle animation played up to 30 times before continuing to the next idle animation.
- ; if you put the first value to 3 it will be played at least three times, 0 makes it possible to be skipped.
- ; this is useful if you want certain idle animation to be played more often than the other idle animations.
- ;
- IdleAnimation = [model animation name, integer, integer] [multiple statements can be used]
- AnimationMode = [Animation Mode Types]
- TransitionKey = [TransitionKey name]
- Flags = [AnimationFlag types list]
- WaitForStateToFinishIfPossible = [transition state]
-
- [Turret Settings - this is related to the AIUpdate modules]
- Turret = [sub object name]
- TurretArtAngle = [integer]
- TurretPitch = [sub object name]
- TurretArtPitch = [integer]
- AltTurret = [sub object name]
- AltTurretArtAngle = [integer]
- AltTurretArtPitch = [integer]
- AltTurretPitch = [sub object name]
-
- [Misc Settings]
- ShowSubObject = [sub object name(s)]
- HideSubObject = [sub object name(s)]
- ParticleSysBone = [Bone name Entry from ParticleSystem.INI, multiple statements can be used]
- End
-
- ConditionState = [ConditionState name, multiple statements can be made]
- [as above]
- End
-
- TransitionState = [FromTransitionKey name ToTransitionKeyName, viceversa]
- [as above]
- End
- ; AliasConditionState is a keyword that says,
- ; "give me another ConditionState exactly like the previous
- ; one, except with different conditions". Useful when you
- ; have several states that are the same with only different condition bits.
- AliasConditionState = [ConditionState, multiple statements can be made]
-
- ; this says "we don't use these condition states at all, so completely
- ; ignore them for purposes of matchmaking"... this is useful to help
- ; reduce the number of AliasConditionState clauses you must add in
- ; order to avoid ambiguity in some cases.
- IgnoreConditionStates = [Condition State Names]
-
- [Misc Settings]
- AnimationsRequirePower = [Yes/No] [Does our animation needs power in order to work?]
- MinLODRequired = [LOD listing] [Whats the minimum Level of detail required we need to show up ingame?]
- OkToChangeModelColor = [Yes/no] [Set to yes in order for team colour models to work]
- ReceivesDynamicLights = [Yes/no] [If Yes, light pulse codes in FXList.ini will cast lights on the model]
- ParticlesAttachedToAnimatedBones = [Yes/No] [alternative to "AnimatedParticleSysBoneClientUpdate" module - ZEROHOUR Only!]
- ExtraPublicBone = [bone name] [ multiple entries can be used for additional bones to expose to logic]
- ProjectileBoneFeedbackEnabledSlots = [Weapon Slot list] [ WeaponLaunchBone will be shown/hidden, not just used for firing offset - works without a defined WeaponHideShowBone.]
- TrackMarks = [texture filename with file extension]
- AttachToBoneInAnotherModule = [bone name]
-
- [Controls how fast and deep the barrel recoils - this is related to the AIUpdate modules]
- InitialRecoilSpeed = xx [how fast does the barrel pushes back into the turret? [default: 80]]
- MaxRecoilDistance = xx [how far does the barrel pushes back into the turret? [corresponds to 3d X-angle, default: 3.0]
- RecoilSettleSpeed = xx [after recoiling, how fast does the barrel go back into it's original position? [default: 3.0]]
- RecoilDamping = xx [stiffness of the recoil springs? 1.0 = recoil will have some resistance, less than 1.0 = recoil faster.]
-End
-
-W3DOverlordTankDraw
-[special case draw module which is interdependent with the W3DDependencyModelDraw module - allows other objects to be attached to this object through use of AttachToBoneInContainer logic]
- [see W3DModelDraw module for associated parameters]
-
- [Controls how fast the treads will move or stop]
- TreadDriveSpeedFraction = [real number, default is 0.3]
- TreadPivotSpeedFraction = [real number, default is 0.6]
- TreadAnimationRate = [real number, default is 0]
-
- TreadDebrisLeft = [Entry From ParticleSystem.ini]
- TreadDebrisRight = [Entry From ParticleSystem.ini]
-
- [Controls how fast and deep the barrel recoils - this is related to the AIUpdate modules]
- InitialRecoilSpeed = xx [how fast does the barrel pushes back into the turret? [default: 80]]
- MaxRecoilDistance = xx [how far does the barrel pushes back into the turret? [corresponds to 3d X-angle, default: 3.0]
- RecoilSettleSpeed = xx [after recoiling, how fast does the barrel go back into it's original position? [default: 3.0]]
- RecoilDamping = xx [stiffness of the recoil springs? 1.0 = recoil will have some resistance, less than 1.0 = recoil faster.]
-End
-
-W3DOverlordAircraftDraw
-[special case draw module which is interdependent with the W3DDependencyModelDraw module - allows other objects to be attached to this object through use of AttachToBoneInContainer logic]
- [see W3DModelDraw module for associated parameters]
-End
-
-W3DOverlordTruckDraw
-[special case draw module which is interdependent with the W3DDependencyModelDraw module - allows other objects to be attached to this object through use of AttachToBoneInContainer logic]
- [see W3DModelDraw and W3DTruckDraw module for associated parameters]
-End
-
-W3DLaserDraw
-[this module is interdependent with the LaserUpdate module and requires the object to have KindOf = INERT IMMOBILE]
- Texture = [texture filename with file extension, defaults to EXLaser.tga]
- NumBeams = [integer] [Number of overlapping cylinders that make the beam. 1 beam will just use inner data]
- InnerBeamWidth = [real number][The total width of the inner beam]
- OuterBeamWidth = [real number][The total width of the outer beam]
- InnerColor = [r: g: b: a:][The inside color of the laser (hot)]
- OuterColor = [r: g: b: a:][The outside color of the laser (cool)]
- MaxIntensityLifetime = [milliseconds] [Laser stays at max intensity for specified time in ms]
- FadeLifetime = [milliseconds] [How long will the Laser last before it fades out and delete itself]
- Tile = [Yes/No] [The height of the texture will determine how many times to tile the texture to fit without scaling]
- Segments = [integer] [Number of segments -- more segments give smoother curve (but more joints) Current max: 20]
- SegmentOverlapRatio = [real number][This value overlaps(+) or separates(-) the segments by ratio]
- ArcHeight = [real number][The height of the arc]
- TilingScalar = [real number][Stretches tiling if value > 1.0, otherwise shrinks it (1.0 is natural)]
-End
-
-
-W3DPoliceCarDraw
-[This module allows for the use of the FRONTCRUSHED and BACKCRUSHED ConditionStates with this object]
-[And this modules allows the object to cast a ambient light around itself]
- [see W3DModelDraw module for associated parameters]
-End
-
-W3DTreeDraw
-[The W3DTreeDraw handles normal drawing and sway, and knock over behavior.
- Normally this happens in the W3DTreeBuffer, and there is no corresponding drawable or
- object. Required to have KindOf OPTIMIZED_TREE -ZEROHOUR ONLY]
-[Note:
-Objects with this Module will not properly appear in Worldbuilder if your texture is NOT in Art/Terrain folder and your model in Art/W3D Folder;
-The texture should be in targa (.tga) and not in DirectDraw Surface (.dds) format in order for it to work.]
- ModelName = [Model Name]
- TextureName = [Model's texture name with file extension. example: imacrappytree.tga]
- MinimumToppleSpeed = [percent, default is 1%]
- DoTopple = [yes/no]
- DoShadow = [yes/no]
- ToppleFX = [Entry From FXList.ini]
- BounceFX = [Entry From FXList.ini]
- KillWhenFinishedToppling = [yes/no]
- SinkDistance = [real number]
- SinkTime = [milliseconds]
- DarkeningFactor = [milliseconds]
- MoveInwardTime = [milliseconds]
- MoveOutwardTime = [milliseconds]
- MoveOutwardDistanceFactor = [real number]
-End
-
-W3DPropDraw
-[When used, it will not interact to the game world and will just act as a none interacting prop which ignores geometry and other behavior modules.
-Can be cleared by building on top of the object. -Requires PROP KindOf]
-[Note: Objects with this Module will not properly appear in WorldBuilder since there's a bug EA apparently left -ZEROHOUR ONLY]
- ModelName = [Model Name]
-End
-
-W3DProjectileStreamDraw
-[requires object to have KindOf = INERT and requires "ProjectileStreamUpdate" module to properly work]
- Texture = [texture filename with file extension]
- Width = [real number]
- TileFactor = [integer]
- ScrollRate = [real number]
- MaxSegments = [integer]
-End
-
-W3DRopeDraw
-[no parameters - this module requires the object to be KindOf = DRAWABLE_ONLY]
-End
-
-W3DScienceModelDraw
-[special case draw module that allows object to be seen only by players who have the RequiredScience]
- [see W3DModelDraw module for associated parameters]
- RequiredScience = [entry from Science.INI]
-End
-
-
-W3DSupplyDraw
-[this module is interdependant with the SupplyWarehouseDockUpdate module and together the two modules will automatically show and hide a percentage of the bones on the object that have the SupplyBonePrefix]
- [see W3DModelDraw module for associated parameters]
- SupplyBonePrefix = [bone name]
-End
-
-
-W3DTankDraw
-[Default Draw used by Tanks. The module is hardcoded to call for the TrackDebrisDirtRight and TrackDebrisDirtLeft particle system definitions]
-see W3DModelDraw module for associated parameters]
-
- [Controls how fast the treads will move or stop]
- TreadDriveSpeedFraction = [real number, default is 0.3]
- TreadPivotSpeedFraction = [real number, default is 0.6]
- TreadAnimationRate = [real number, default is 0]
-
- [NOTE: This doesnt properly work with the "W3DTankTruckDraw" Draw module]
- TreadDebrisLeft = [Entry From ParticleSystem.ini]
- TreadDebrisRight = [Entry From ParticleSystem.ini]
-
- [Controls how fast and deep the barrel recoils - this is related to the AIUpdate modules]
- InitialRecoilSpeed = [integer, default: 2.0]
- MaxRecoilDistance = [integer, default: 3.0]
- RecoilDamping = [integer, default: 0.4]
- RecoilSettleSpeed = [integer, default: 0.065]
-End
-
-
-W3DTankTruckDraw
-[special case module that allows parameters from W3DTankDraw and W3DTruckDraw to be used - effectively this is a module that combines the other two]
-[This can be useful for half track type units]
- [see W3DModelDraw module for associated parameters]
-
- [Controls how fast the treads will move or stop]
- TreadDriveSpeedFraction = [real number, default is 0.3]
- TreadPivotSpeedFraction = [real number, default is 0.6]
- TreadAnimationRate = [real number, default is 0]
-
- [Controls how fast and deep the barrel recoils - this is related to the AIUpdate modules]
- InitialRecoilSpeed = [integer, default: 2.0]
- MaxRecoilDistance = [integer, default: 3.0]
- RecoilDamping = [integer, default: 0.4]
- RecoilSettleSpeed = [integer, default: 0.065]
-
- [Controls the attached "cab" model on the vehicle]
- RotationDamping = [real number]
- TrailerRotationMultiplier = [real number]]
- TrailerBone = [bone name]
- CabRotationMultiplier = [real number]
- CabBone = [bone name]
-
- [Wheels setup]
- PowerslideRotationAddition = [real number]
- TireRotationMultiplier = [real number]
- MidRightMidTireBone = [bone name]
- MidLeftMidTireBone = [bone name]
- MidRightRearTireBone = [bone name]
- MidLeftRearTireBone = [bone name]
- MidRightFrontTireBone = [bone name]
- MidLeftFrontTireBone = [bone name]
- RightRearTireBone = [bone name]
- LeftRearTireBone = [bone name]
- RightFrontTireBone = [bone name]
- LeftFrontTireBone = [bone name]
-
- [Dust Spray setup]
- PowerslideSpray = [entry from ParticleSystem.INI]
- DirtSpray = [entry from ParticleSystem.INI]
- Dust = [entry from ParticleSystem.INI]
-End
-
-W3DTracerDraw
-[no parameters - this module requires object to be KindOf = DRAWABLE_ONLY]
-End
-
-W3DTruckDraw
-[module is hardcoded to call for the TreadDebrisRight and TreadDebrisLeft (unless overriden) particle system definitions
-and allows use of TruckPowerslideSound and TruckLandingSound within the UnitSpecificSounds section of the object
-- this module also includes automatic logic for showing and hiding of HEADLIGHT bones in and out of the NIGHT ConditionState]
- [see W3DModelDraw module for associated parameters]
-
- [Controls the attached "cab" model on the vehicle]
- RotationDamping = [real number]
- TrailerRotationMultiplier = [real number]]
- TrailerBone = [bone name]
- CabRotationMultiplier = [real number]
- CabBone = [bone name]
-
- [Wheels setup]
- PowerslideRotationAddition = [real number]
- TireRotationMultiplier = [real number]
- MidRightMidTireBone = [bone name]
- MidLeftMidTireBone = [bone name]
- MidRightRearTireBone = [bone name]
- MidLeftRearTireBone = [bone name]
- MidRightFrontTireBone = [bone name]
- MidLeftFrontTireBone = [bone name]
- RightRearTireBone = [bone name]
- LeftRearTireBone = [bone name]
- RightFrontTireBone = [bone name]
- LeftFrontTireBone = [bone name]
-
- [Dust Spray setup]
- PowerslideSpray = [entry from ParticleSystem.INI]
- DirtSpray = [entry from ParticleSystem.INI]
- Dust = [entry from ParticleSystem.INI]
-End
-
-;------------------------------
-:Appendices:
-;------------------------------
-;------------------------------
-ChangeType List:
-;------------------------------
-PRESERVE_RATIO ; if an object has 80/100 health and an upgrade grants it +50 health, it will have 120/150 health - it preserves the initial 80% health ratio.
-ADD_CURRENT_HEALTH_TOO ; if an object has 80/100 health and an upgrade grants it +50 health, it will have 130/150 health - it will increase the max health and add to its previous health.
-SAME_CURRENTHEALTH ; if an object has 80/100 health and an upgrade grants it +50 health, it will have 80/150 health - it will only increase the max health pool.
-
-;------------------------------
-LOD List:
-;------------------------------
-LOW
-MEDIUM
-HIGH
-;------------------------------
-Veterancy Level List:
-;------------------------------
-REGULAR
-VETERAN
-ELITE
-HEROIC
-;------------------------------
-Object Condition Types:
-;------------------------------
-USING_ABILITY
-RIDERS_ATTACKING
-TAKING_DAMAGE
-NO_BLACK_MARKET ; Requires ownership of an object with FS_BLACK_MARKET kindof and BlackMarketCheckDelay parameter to be defined in the StealthUpdate module.
-FIRING_TERTIARY
-FIRING_SECONDARY
-FIRING_PRIMARY
-MOVING
-ATTACKING
-
-;------------------------------
-Weapon Slot List:
-;------------------------------
-PRIMARY
-SECONDARY
-TERTIARY
-
-;------------------------------
-WeaponSet Condition Types:
-;------------------------------
-PLAYER_UPGRADE ; is also set by the ArmedRidersUpgradeMyWeaponSet parameter.
-MINE_CLEARING_DETAIL ; can only be triggered by DozerAI from a FIRE_WEAPON command with USES_MINE_CLEARING_WEAPONSET option.
-CARBOMB
-VEHICLE_HIJACK ; is defined in the binary but is not used nor can ever be called in the game.
-CRATEUPGRADE_ONE
-CRATEUPGRADE_TWO
-WEAPON_RIDER1
-WEAPON_RIDER2
-WEAPON_RIDER3
-WEAPON_RIDER4
-WEAPON_RIDER5
-WEAPON_RIDER6
-WEAPON_RIDER7
-WEAPON_RIDER8
-
-VETERAN [This can trigger the WEAPONSET_VETERAN model state]
-ELITE [this can trigger the WEAPONSET_ELITE model state]
-HERO [this can trigger the WEAPONSET_HERO model state]
-
-;------------------------------
-AutoChooseSources Types:
-;------------------------------
-FROM_DOZER
-FROM_AI
-FROM_SCRIPT
-FROM_PLAYER
-DEFAULT_SWITCH_WEAPON ; if an object is meant to have two variants of the same weapon [e.g. single fire or burst fire] this parameter will set the defined weapon slot as the default selected weapon.
-
-;------------------------------
-ArmorSet Condition Types:
-;------------------------------
-PLAYER_UPGRADE
-CRATE_UPGRADE_ONE
-CRATE_UPGRADE_TWO
-WEAK_VERSUS_BASEDEFENSES ; is defined in the binary but is not used nor can ever be called in the game.
-SECOND_LIFE ; requires the UndeadBody module.
-VETERAN
-ELITE
-HERO
-
-;------------------------------
-Disabled Types:
-;------------------------------
-DISABLED_SCRIPT_UNDERPOWERED
-DISABLED_SCRIPT_DISABLED
-DISABLED_FREEFALL
-DISABLED_UNDERPOWERED
-DISABLED_UNMANNED
-DISABLED_PARALYZED
-DISABLED_HELD
-DISABLED_EMP
-DISABLED_HACKED
-DISABLED_BRAINWASHED
-DISABLED_SUBDUED
-DISABLED_AWESTRUCK
-DEFAULT
-
-;------------------------------
-Status Types:
-;------------------------------
-KILLING_SELF ; called when the object is ??using a weapon with SUICIDE RadiusDamageAffectsMask or SUICIDED death type?
-DISGUISED ; used when an object triggers disguise through the appropriate StealthUpdate parameters and a SpecialPower with SPECIAL_DISGUISE_AS_VEHICLE ENUM?
-BOOBY_TRAPPED
-FAERIE_FIRE ; used to confer the TARGET_FAERIE_FIRE WeaponBonus to the attacker.
-STATUS_RIDER8
-STATUS_RIDER7
-STATUS_RIDER6
-STATUS_RIDER5
-STATUS_RIDER4
-STATUS_RIDER3
-STATUS_RIDER2
-STATUS_RIDER1
-DECK_HEIGHT_OFFSET
-IGNORING_STEALTH
-USING_ABILITY ; used when an object is using a SpecialAbility module.
-RECONSTRUCTING ; ?used by the Battle Drone while repairing its parent vehicle.
- ; If an object is killed with this status, it will transfer aggression to its producer (e.g. killing a
- ; Crusader with this status will make the enemy attack the War Factory that produced it.)
-UNDERGOING_REPAIR
-SOLD ; triggered when a structure is issued a SELL command.
-TOPPLED
-DETECTED ; hardcoded status for when a unit's stealth is broken.
-STEALTHED ; used when an object is stealthed.
-IS_AIMING_WEAPON
-IS_BRAKING
-IS_CARBOMB ; used by objects that are turned into a car bomb.
- ; Status is hardcoded to call CarBombVoiceSelect, CarBombVoiceMove and CarBombVoiceAttack while under its effect.
-IS_FIRING_WEAPON
-WET
-AFLAME ; called by FlammableUpdate when it's active?
-HIJACKED ; used by objects that are hijacked. Status is hardcoded to call FX_HijackerEmerge once the object dies.
-REPULSOR ; when used in against victims CAN_BE_REPULSED kindof and WanderAI, forces them to scatter and flee.
-PARACHUTING ; called when an object is inside - or is? - ParachuteContain.
-AIRBORNE_TARGET ; this status allows an object to be targeted by weapons with AntiAirborne filters.
-NO_ATTACK_FROM_AI ;the AI will not react to this object's existence nor will it be automatically attacked.
-MASKED ; used by objects that enter containers to make them unattackable.
- ;Makes any affected object directly unattackable - but not invulnerable!
-NO_ATTACK ; makes the object unable to attack with any of its weapons.
- ; If there any any buttons to fire a weapon that are tied to a reload, the duration of the status will reflect as a ; pseudo-reload cooldown.
- ; Was meant to be triggered by ProneUpdate.
-NO_COLLISIONS ; makes the object not trigger any Collide modules.
-UNSELECTABLE ; makes the object unselectable.
-UNDER_CONSTRUCTION ; used by structures that are currently being built.
-CAN_ATTACK ; self-explanatory, was meant to be triggered by ProneUpdate.
-CAN_STEALTH ; system flag for StealthUpgrade and GrantStealthBehavior. When used as a status weapon on objects with former two modules may result in their stealth permanently breaking.
-DESTROYED ; issued by anything that explicitly says "destroy".
-REASSIGN_PARKING
-DEPLOYED ; used by DeployStyleAIUpdate when the unit is deployed.
-
-;------------------------------
-Locomotor SET Types:
-;------------------------------
-SET_NORMAL
-SET_SUPERSONIC
-SET_SLUGGISH
-SET_TAXIING
-SET_PANIC
-SET_WANDER
-SET_FREEFALL
-SET_NORMAL_UPGRADED
-
-;------------------------------
-DamageType List:
-;------------------------------
-DEFAULT ;this sets the level for all nonspecified damage types in armor.
-EXPLOSION ; is the default hardcoded damage type, and the default damage type in NeutronMissileSlowDeathBehavior
-CRUSH
-ARMOR_PIERCING
-SMALL_ARMS
-GATTLING
-RADIATION
-FLAME ; triggers FlammableUpdate.
-LASER
-SNIPER
-POISON ; triggers PoisonedBehavior
-HEALING ; all damage heals units, also affects AutoHealBehavior healing and is used for Dozer/Worker repair rates.
-WATER
-DEPLOY
-SURRENDER ; triggers a voice line when a unit is attacking with a weapon that uses this damage type.
-HACK
-KILL_PILOT ; instantly depilots a vehicle and is never used against objects with AIRCRAFT KINDOF.
-PENALTY ; used by Chinese reactors when overcharging.
-KILL_GARRISONED ; kills a single occupant per shot, also seems to act as a filter to be used only versus objects with STRUCTURE KINDOF.
-FALLING
-MELEE
-DISARM ; seems hardcoded to only react to mines and cannot deal AOE damage.
-HAZARD_CLEANUP
-PARTICLE_BEAM ; triggers FlammableUpdate
-TOPPLING
-INFANTRY_MISSILE
-AURORA_BOMB
-LAND_MINE
-JET_MISSILES
-STEALTHJET_MISSILES
-MOLOTOV_COCKTAIL
-COMANCHE_VULCAN
-MICROWAVE
-STATUS ; used in conjunction with StatusDamageType to apply a status to an object.
-SUBDUAL_BUILDING
-SUBDUAL_VEHICLE
-SUBDUAL_MISSILE
-SUBDUAL_UNRESISTABLE
-UNRESISTABLE ; always deals 100% damage. Used by Neutron Blast to kill aircraft, infantry and CLIFF_JUMPER units.
-;------------------------------
-DeathTypes List:
-;------------------------------
-ALL
-NORMAL
-CRUSHED
-BURNED
-EXPLODED
-TOPPLED
-FLOODED
-SUICIDED
-LASERED
-DETONATED
-SPLATTED
-POISONED
-POISONED_BETA
-POISONED_GAMMA
-EXTRA_2
-EXTRA_3
-EXTRA_4
-EXTRA_5
-EXTRA_6
-EXTRA_7
-EXTRA_8
-
-;------------------------------
-Shadow Types:
-;------------------------------
-SHADOW_DECAL
-SHADOW_VOLUME
-SHADOW_PROJECTION
-SHADOW_DYNAMIC_PROJECTION
-SHADOW_DIRECTIONAL_PROJECTION
-SHADOW_ALPHA_DECAL
-SHADOW_ADDITIVE_DECAL
-
-;------------------------------
-OCLSpecialPower CreateLocation Types:
-;------------------------------
-CREATE_AT_EDGE_FARTHEST_FROM_TARGET
-CREATE_AT_EDGE_FARTHEST_FROM_SOURCE
-CREATE_ABOVE_LOCATION
-USE_OWNER_OBJECT
-CREATE_AT_LOCATION
-CREATE_AT_EDGE_NEAR_TARGET
-CREATE_AT_EDGE_NEAR_SOURCE
-CREATE_OBJECT
-
-;------------------------------
-ConditionState Types:
-;------------------------------
-USER_1
-USER_2
-JAMMED
-ATTACKING
-WEAPONSET_CRATEUPGRADE_ONE
-WEAPONSET_CRATEUPGRADE_TWO
-ARMORSET_CRATEUPGRADE_TWO
-ARMORSET_CRATEUPGRADE_ONE
-PREORDER
-STUNNED
-STUNNED_FLAILING
-EXPLODED_BOUNCING
-EXPLODED_FLAILING
-CAPTURED
-RAISING_FLAG
-CONTINUOUS_FIRE_SLOW
-CONTINUOUS_FIRE_FAST
-CONTINUOUS_FIRE_MEAN
-SPECIAL_CHEERING
-ARMED
-RAPELLING
-PARACHUTING
-CLIMBING
-SPLATTED
-BURNED
-AFLAME
-SMOLDERING
-POWER_PLANT_UPGRADING
-POWER_PLANT_UPGRADED
-OVER_WATER
-MOVING
-DEPLOYED
-UNPACKING
-PACKING
-JETEXHAUST
-JETAFTERBURNER
-LOADED
-CARRYING
-DOCKING_ENDING
-DOCKING_ACTIVE
-DOCKING_BEGINNING
-DOCKING
-PANICKING
-RADAR_UPGRADED
-RADAR_EXTENDED
-CONSTRUCTION_COMPLETE
-ACTIVELY_CONSTRUCTING
-ACTIVELY_BEING_CONSTRUCTED
-PARTIALLY_CONSTRUCTED
-AWAITING_CONSTRUCTION
-DYING
-PRONE
-FREEFALL
-POST_COLLAPSE
-TOPPLED
-TURRET_ROTATE
-
-RELOADING_A
-BETWEEN_FIRING_SHOTS_A
-FIRING_A
-PREATTACK_A
-USING_WEAPON_A
-
-RELOADING_B
-BETWEEN_FIRING_SHOTS_B
-FIRING_B
-PREATTACK_B
-USING_WEAPON_B
-
-RELOADING_C
-BETWEEN_FIRING_SHOTS_C
-FIRING_C
-PREATTACK_C
-USING_WEAPON_C
-
-DOOR_4_WAITING_TO_CLOSE
-DOOR_4_WAITING_OPEN
-DOOR_4_CLOSING
-DOOR_4_OPENING
-
-DOOR_3_WAITING_TO_CLOSE
-DOOR_3_WAITING_OPEN
-DOOR_3_CLOSING
-DOOR_3_OPENING
-
-DOOR_2_WAITING_TO_CLOSE
-DOOR_2_WAITING_OPEN
-DOOR_2_CLOSING
-DOOR_2_OPENING
-
-DOOR_1_WAITING_TO_CLOSE
-DOOR_1_WAITING_OPEN
-DOOR_1_CLOSING
-DOOR_1_OPENING
-
-WEAPONSET_PLAYER_UPGRADE
-WEAPONSET_HERO
-WEAPONSET_ELITE
-WEAPONSET_VETERAN
-ENEMYNEAR
-REALLYDAMAGED
-RUBBLE
-DAMAGED
-SNOW
-SOLD
-DISGUISED
-NIGHT
-SPECIAL_DAMAGED
-BACKCRUSHED
-FRONTCRUSHED
-SECOND_LIFE
-RIDER1
-RIDER2
-RIDER3
-RIDER4
-RIDER5
-RIDER6
-RIDER7
-RIDER8
-PRISTINE
-RIGHT_TO_CENTER
-CENTER_TO_RIGHT
-LEFT_TO_CENTER
-CENTER_TO_LEFT
-
-;------------------------------
-Animation Flags List:
-;------------------------------
-RANDOMSTART
-START_FRAME_FIRST
-START_FRAME_LAST
-ADJUST_HEIGHT_BY_CONSTRUCTION_PERCENT
-PRISTINE_BONE_POS_IN_FINAL_FRAME
-MAINTAIN_FRAME_ACROSS_STATES
-MAINTAIN_FRAME_ACROSS_STATES2
-MAINTAIN_FRAME_ACROSS_STATES3
-MAINTAIN_FRAME_ACROSS_STATES4
-RESTART_ANIM_WHEN_COMPLETE
-
-;------------------------------
-AnimationMode Types:
-;------------------------------
-MANUAL
-ONCE
-ONCE_BACKWARDS
-LOOP_BACKWARDS
-LOOP_PINGPONG
-LOOP
-
-;------------------------------
-KindOf list:
-;------------------------------
-IGNORE_DOCKING_BONES ; if used on a supply gatherer, they will use a supply source from any angle instead of adhering to specified docking bones.
-IGNORES_SELECT_ALL ; E-select will not work on objects with this KINDOF.
-IGNORED_IN_GUI ; objects with this KINDOF will not draw a healthbar nor flash their team color when selected.
-CONSERVATIVE_BUILDING ; seems to only be used in AI for priority or target checking.
-DEMOTRAP
-EMP_HARDENED ; if combined with AIRCRAFT KINDOF, object becomes completely immune to EMPUpdate.
-TECH_BASE_DEFENSE
-CANNOT_RETALIATE ; apparently fixes deploy AI lock bug
-REJECT_UNMANNED ; an object with this KINDOF cannot enter neutralized/unmanned objects.
-AIRCRAFT_CARRIER
-OPTIMIZED_TREE
-PROP
-BLAST_CRATER
-BOOBY_TRAP
-REVEALS_ENEMY_PATHS ; When an object with this KINDOF is selected and the player clicks on the enemy object, it draws an orange waypoint of their next movement order.
-MONEY_HACKER
-CLIFF_JUMPER ; an object with this KINDOF, instead of sticking to the cliff's geometry, will jump to the ground whenever it descends. It also makes objects instantly die from NeutronBlastBehavior.
-DONT_AUTO_CRUSH_INFANTRY ; an object with this KINDOF will ignore AI commands to move towards crushable objects and try to run them over.
-HERO ; an object with this KINDOF is always seen on the minimap with a special decal and is selectable by pressing H.
-INERT ; an object with this KINDOF is always ignored by the AI and does not trigger AI zones, also does not block building construction
-DISGUISER
-REVEAL_TO_ALL
-SUPPLY_SOURCE
-CANNOT_BUILD_NEAR_SUPPLIES ; attempting to place an object with this KINDOF near an object with SUPPLY_SOURCE ; object with this kindof will create an extra large unbuildable area for this specific object.
-SPAWNS_ARE_THE_WEAPONS ; allows to transfer targeting orders and stealth to spawned enslaved objects.
-SHOW_PORTRAIT_WHEN_CONTROLLED ; will show its portrait only when the object belongs to the player's team.
-HULK
-IMMUNE_TO_CAPTURE ; An object with this KINDOF cannot be captured by SpecialPower or Hijackers.
-BOAT ; An object with this KINDOF cannot be hijacked or sabotaged.
-GARRISONABLE_UNTIL_DESTROYED ; if the object has any GarrisonContain or similar modules, its ability to be garrisoned will work up until death instead of becoming ungarrisonable at ReallyDamaged state.
-PARACHUTE
-PARACHUTABLE
-SUPPLY_SOURCE_ON_PREVIEW ; an object with this KINDOF, if placed on a map, will be displayed on the map preview as a supply source [dollar sign by default].
-CLICK_THROUGH
-BALLISTIC_MISSILE
-DRONE
-PRODUCED_AT_HELIPAD
-POWERED ; an object with this kindof ceases to function when the player runs out of power.
-TECH_BUILDING ; An object with this KINDOF allows the use of CAPTURED ConditionState
-AUTO_RALLYPOINT ; allows the object to set a rally point to where produced units will gather.
-FORCEATTACKABLE
-LOW_OVERLAPPABLE
-AIRCRAFT_PATH_AROUND ; makes jets and aircraft avoid this unit instead of phasing through it.
-DEFENSIVE_WALL
-WALK_ON_TOP_OF_WALL
-ATTACK_NEEDS_LINE_OF_SIGHT ; objects that lack this KINDOF see through everything and can attack through any obstacle.
-ALWAYS_SELECTABLE
-PORTABLE_STRUCTURE
-CLEANUP_HAZARD ; used by CleanupHazardUpdate to acquire targets for clearing.
-MINE
-UNATTACKABLE ; objects with this KINDOF cannot be attacked or targeted, but they can be captured.
-ALWAYS_VISIBLE
-SMALL_MISSILE ; objects with this KINDOF are eligible to be deflected by CountermeasuredBehavior.
-CLEARED_BY_BUILD ; objects with this KINDOF are deleted when a scaffold is placed over them.
-CAPTURABLE ; objects with this KINDOF can be captured by units with the necessary SpecialPower.
-CRATE
-MOB_NEXUS
-SCORE_DESTROY ; objects with this KINDOF contribute to their respective score category only when destroyed.
-SCORE_CREATE ; objects with this KINDOF contribute to their respective score category only when built or spawned.
-SCORE ; objects with this KINDOF contribute to their respective score category in all instances.
-REBUILD_HOLE
-MP_COUNT_FOR_VICTORY ; if a object with this KINDOF exists, it must be destroyed in order to eliminate a player.
-DRAWABLE_ONLY
-CASH_GENERATOR
-STEALTH_GARRISON ; if an object is stealthed, the garrison's visual condition state will not change once it enters. Can be evicted from a garrison by an enemy unit by entering the structure if the object has not revealed itself.
-HEAL_PAD
-REPAIR_PAD
-WAVE_EFFECT
-WAVEGUIDE
-NO_GARRISON ; an object with this KINDOF cannot enter tunnels or most Contain modules.
-NO_COLLIDE ; an object with this KINDOF will not trigger Collide modules.
-NO_HEAL_ICON ; will not display a repair or healing icon if being repaired or healed by autoheal or HEALING damage.
-NO_SELECT
-PRELOAD ; an object needs this KINDOF if it is spawned via CreateObjectDie and other death-related OCL spawn behaviors in order to have collision.
-PROJECTILE
-BRIDGE_TOWER
-LANDMARK_BRIDGE
-BRIDGE
-TRANSPORT ; an object with this KINDOF becomes unhijackable if it is occupied.
-WEAPON_SALVAGER ; allows the use of salvage-related WeaponSet and W3D ConditionStates.
-ARMOR_SALVAGER ; allows the use of salvage-related ArmorSet and W3D ConditionStates. If used together with WEAPON_SALVAGER, it will always take priority.
-SALVAGER
-LINEBUILD ; broken. Allows objects to be built in a line by placing down the starting point, drawing a line, then placing the end point. The correct number of scaffolds will be generated, but they will always spawn at -1% build progress and must be manually built one by one.
-COMMANDCENTER ; pressing H in absence of objects with HERO KINDOF will center the view on an object with this KINDOF.
-HARVESTER
-DOZER
-HUGE_VEHICLE
-AIRCRAFT
-VEHICLE
-INFANTRY
-STRUCTURE
-SHRUBBERY
-STICK_TO_TERRAIN_SLOPE
-IMMOBILE
-SELECTABLE
-OBSTACLE
-FS_STRATEGY_CENTER
-FS_SUPPLY_CENTER
-FS_BLACK_MARKET ; used as a forbidden stealth condition "NO_BLACK_MARKET" alongside BlackMarketCheckDelay parameter.
-FS_SUPERWEAPON
-FS_SUPPLY_DROPZONE
-FS_AIRFIELD
-FS_WARFACTORY
-FS_BARRACKS
-FS_ADVANCED_TECH
-FS_TECHNOLOGY
-FS_BASE_DEFENSE
-FS_FACTORY
-FS_POWER
-FS_INTERNET_CENTER ; objects with this KINDOF and InternetHackContain module are able to restart HACK_INTERNET commands after being subdued or damaged in a certain way.
-FS_FAKE ; if an object with this KINDOF has a specific shadow texture, it will always be displayed to one's allies and their own faction.
-CAN_BE_REPULSED ; an object with this KINDOF and WanderAI is susceptible to REPULSOR status and will flee when in range of an object with REPULSOR status.
-CAN_RAPPEL ; allows an object to be used in COMBAT_DROP commands.
-CAN_ATTACK
-CAN_CAST_REFLECTIONS
-CAN_SEE_THROUGH_STRUCTURE ; makes an object transparent to line of sight - functionally identical to the omission of ATTACK_NEEDS_LINE_OF_SIGHT
-
-;------------------------------
-Unit Sounds List:
-;------------------------------
-VoiceSelect
-VoiceSelectElite ; Plays when an object, with elite veterancy, is selected
-VoiceGroupSelect ; Plays when a group of objects of the same type is selected
-VoiceMeetEnemy ; Plays when an object encounters an enemy unit
-VoiceMove
-VoiceAttack
-VoiceAttackAir ; Plays when an object is ordered to attack air units.
-VoiceAttackSpecial ; Plays When an object is ordered to attack using a special power weapon
-VoiceGuard
-VoiceFear ; Plays when an object's health bar reaches the red zone
-VoiceTaskUnable ; Plays when an object is unable to perform its given task
-VoiceTaskComplete ; Plays when an object successfully finishes its given task
-VoiceDefect ; Plays when an object defects to another player
-
-SoundMoveStart ; Plays when an object starts moving
-SoundMoveStartDamaged ; Plays when an object starts moving while damaged
-SoundMoveLoop ; Plays while an object is moving
-SoundMoveLoopDamaged ; Plays while an object is moving while damaged
-SoundCreated ; Plays when an object is created from a factory
-SoundFallingFromPlane ; Plays when an object is dropped from a plane
-SoundPromotedVeteran ; Plays when an object is promoted to veteran
-SoundPromotedElite ; Plays when an object is promoted to elite
-SoundPromotedHero ; Plays when an object is promoted to heroic
-SoundEnter ; Plays when an object exits a transport or structure
-SoundExit ; Plays when an object exits a transport or structure
-SoundOnDamaged ; Plays when an object's health bar reaches the yellow zone
-SoundOnReallyDamaged ; Plays when an object's health bar reaches the red zone
-
-SoundStealthOn ; Plays when an object "stealths"
-SoundStealthOff ; Plays when an object "un-stealths"
-
-SoundAmbient ; Plays as long as the object exists
-SoundAmbientDamaged ; Plays as long as the object exists while damaged
-SoundAmbientReallyDamaged ; Plays as long as the object exists while really damaged
-SoundAmbientRubble ; Plays as long as the object exists while "dead"
-
-Unit Specific Sounds List:
-
-VoiceCreate ; Plays when an object is created from a factory
-VoiceCrush ; Plays When an object is ordered to crush something with the forcemove command
-VoiceUnload ; Plays when an object is ordered to unload its passengers
-VoiceEnter ; Plays when an object is ordered to enter a transport
-VoiceGarrison ; Plays when an abject is ordered to garrison a structure
-
-VoiceBombard ; Plays when an object is ordered to attack the ground
-VoiceGetHealed ; Plays when a unit is hit by HEAL damage (ex. when it's being repaired)
-
-VoiceLowFuel ; Plays when a plane is running out of fuel.
-
-VoicePrimaryWeaponMode ; Plays when an object switches to its PRIMARY weapon
-VoiceSecondaryWeaponMode ; Plays when an object switches to its SECONDARY weapon
-VoiceTertiaryWeaponMode ; Plays when an object switches to its TERTIARY weapon
-
-VoiceCaptureBuildingComplete ; Plays when an object successfully captures a building with an ability
-VoiceClearBuilding ; Plays when an object is ordered to 'clear' a structure
-
-VoiceBuildResponse ; Plays when a builder is ordered to build stuff
-VoiceNoBuild ; Plays when a builder is unable to build a structure in the selected area
-VoiceRepair ; Plays when a builder is ordered to repair stuff
-VoiceDisarm ; Plays when an object is ordered to clear mines
-VoiceSupply ; Plays when a gatherer is ordered to gather supplies
-
-VoiceSubdue ; Plays when an object uses a weapon with "SURRENDER" damage type (ex. Ranger's flashbangs)
-VoiceEject ; Plays when a pilot ejects from the object. Requires the "EjectPilotDie" module
-VoiceMelee ; Plays when an object uses a weapon with "MELEE" damage type (ex. Burton's knife)
-VoiceCombatDrop ; Plays when an object is ordered to do a "combat drop". Requires a button with the "COMBATDROP" command type. Also requires the "ChinookAIUpdate" module with the rope logic defined
-VoiceFireRocketPods ; Plays when the comanche fires its rocket pod ability. Hardcoded to only work with the "ComancheRocketPodWeapon" weapon
-
-VoiceRapidFire ; Plays when an object with a continous fire bonus weapon reaches the "CONTINUOUS_FIRE_FAST" state
-VoiceStealCashComplete ; Plays when an object successfully steals cash with an ability
-VoiceDisableVehicleComplete ; Plays when an object successfully disables a vehicle with an ability
-VoiceHackInternet ; Plays when an object is ordered to "hack the internet"
-VoiceFlameLocation ; Plays When an object uses a weapon with the "FLAME" damage type on a target location. (ex. Dragon Tank Firewall)
-
-VoiceSalvage ; Plays when an object is ordered to collect a salvage crate
-VoiceSnipePilot ; Plays when an object uses a weapon with "KILL_PILOT" damage type (ex. Jarmen's Pilot Snipe)
-VoiceEnterHostile ; Plays when an object is ordered to enter an enemy vehicle or structure (ex. Hijackers and Saboteurs)
-VoiceMoveUpgraded ; Plays when a unit is given a move order with an upgraded locomotor (ex. workers with shoes)
-VoicePoisonLocation ; Plays When an object uses a weapon with the "POISON" damage type on a target location. (ex. Toxin Tractor Sprinkler)
-
-WeaponUpgradeSound ; Plays when an object's weaponset is upgraded
-
-TurretMoveStart ; Plays when an objects turret starts to turn
-TurretMoveLoop ; Plays while an object's turret is turning
-
-Deploy ; Plays when an object deploys
-Undeploy ; Plays when an object un-deploys
-
-TruckLandingSound ; Plays when a truck lands (presumably after jumping from a cliff). Requires "W3DTruckDraw"
-TruckPowerslideSound ; Plays when a truck does a "powerslide". Requires "W3DTruckDraw"
-
-AfterBurner ; Playes when a jet takes off from an airfield
-
-UnderConstruction ; Plays while an object is being built by a builder
-
-StickyBombCreated ; Plays when an object using the "StickyBombUpdate" module is spawned
-
-DisguiseStarted ; Plays when an object uses it's disguise ability
-DisguiseRevealedSuccess ; Plays when a disguised object succesfully sneaks in and reveals himself when his target is close
-DisguiseRevealedFailure ; Plays when a disguised object gets caught and is forced to reveal himself
-
-HowitzerFire ;Plays when the Specter Gunship fires its Howitzer weapon
-
-Internal Upgrades List:
-
-Upgrade_Veterancy_VETERAN ; Upgrade given to an object when it reaches VETERAN veterancy rank
-Upgrade_Veterancy_ELITE ; Upgrade given to an object when it reaches ELITE veterancy rank
-Upgrade_Veterancy_HEROIC ; Upgrade given to an object when it reaches HEROIC veterancy rank
-
-;--------------------------------------------
-:MISC SECTION:
-;--------------------------------------------
-CommandButton Command list:
-Note:
-There are some command types here that doesn't work with vGenerals because it was added exclusively in ZeroHour
-and there are some that doesn't properly work anymore.
-
-SELECT_ALL_UNITS_OF_TYPE ; selects every object as defined in Object parameter
-SPECIAL_POWER_CONSTRUCT_FROM_SHORTCUT
-SPECIAL_POWER_CONSTRUCT
-SPECIAL_POWER_FROM_SHORTCUT
-SPECIAL_POWER_FROM_COMMAND_CENTER ;only existed in vGenerals
-SPECIAL_POWER
-PLACE_BEACON
-SABOTAGE_BUILDING ; a manual way to issue a command. The same thing can be accomplished by ordering the unit into a valid enemy building with just the cursor
-CONVERT_TO_CARBOMB ; a manual way to issue a command. The same thing can be accomplished by ordering the unit into a valid civilian object.
-HIJACK_VEHICLE ; a manual way to issue a command. The same thing can be accomplished by ordering the unit into a valid enemy object.
-SWITCH_WEAPON
-COMBATDROP
-TOGGLE_OVERCHARGE
-HACK_INTERNET
-PURCHASE_SCIENCE
-FIRE_WEAPON
-SELL
-SET_RALLY_POINT
-BEACON_DELETE
-EXECUTE_RAILED_TRANSPORT
-EVACUATE
-EXIT_CONTAINER
-WAYPOINTS
-STOP
-GUARD_FLYING_UNITS_ONLY
-GUARD_WITHOUT_PURSUIT
-GUARD
-ATTACK_MOVE
-CANCEL_UPGRADE ; hardcoded command that is executed whenever one clicks on an upgrade in the build queue
-OBJECT_UPGRADE
-PLAYER_UPGRADE
-CANCEL_UNIT_BUILD ; hardcoded command that is executed whenever one clicks on a unit in the build queue
-UNIT_BUILD
-DOZER_CONSTRUCT_CANCEL
-DOZER_CONSTRUCT
-
-
-CommandButton Options Types:
-unused-reserved
-MUST_BE_STOPPED ; used exclusively on the vZH Combat Cycle, this option makes the button unusable unless the object is not moving. Note that aircraft that idle in circles count as having "stopped", despite clearly not being still.
-CAN_USE_WAYPOINTS
-USES_MINE_CLEARING_WEAPONSET ; if DozerAI/WorkerAI is present on the object, issuing the command will make the object use a MINE_CLEARING_DETAIL WeaponSet.
-IGNORES_UNDERPOWERED ; if the producer building/object is POWERED, and the player has run out of power, the button will still work.
-SCRIPT_ONLY ; the player will not see or be able to use a button with this option.
----DO-NOT-USE---
-SINGLE_USE_COMMAND
-NOT_QUEUEABLE
-OPTION_THREE ; this option is used by the Strategy Center to make battle plans mutually exclusive and globally exclusive for each player.
-OPTION_TWO ; this option is used by the Strategy Center to make battle plans mutually exclusive and globally exclusive for each player.
-OPTION_ONE ; this option is used by the Strategy Center to make battle plans mutually exclusive and globally exclusive for each player.
-ATTACK_OBJECTS_POSITION
-ALLOW_MINE_TARGET
-ALLOW_SHRUBBERY_TARGET
-CHECK_LIKE ; this option works alongside OPTION_ONE/OPTION_TWO/OPTION_THREE to make the button/special power mutually exclusive.
-CONTEXTMODE_COMMAND
-OK_FOR_MULTI_SELECT ; this option allows the button to be used with multiple units being selected.
-NEED_SPECIAL_POWER_SCIENCE
-NEED_UPGRADE
-NEED_TARGET_ALLY_OBJECT
-NEED_TARGET_NEUTRAL_OBJECT
-NEED_TARGET_ENEMY_OBJECT
-NEED_TARGET_POS
-
-
-CommandButton WeaponSlot Types:
-PRIMARY
-SECONDARY
-TERTIARY
-
-CommandButton Border Types:
-SYSTEM
-ACTION
-UPGRADE
-BUILD
-
-CommandButton RadiusCursorType List:
-Note: this are tied to the IngameUI.ini
-AMBULANCE
-CLEARMINES
-FRENZY
-SPYDRONE
-RADAR
-AMBUSH
-ANTHRAXBOMB
-SCUDSTORM
-CLUSTERMINES
-NAPALMSTRIKE
-ARTILLERYBARRAGE
-EMPPULSE
-NUCLEARMISSILE
-HELIX_NAPALM_BOMB
-SPECTREGUNSHIP
-SPYSATELLITE
-PARADROP
-DAISYCUTTER
-CARPETBOMB
-A10STRIKE
-PARTICLECANNON
-SUPERWEAPON_SCATTER_AREA
-OFFENSIVE_SPECIALPOWER
-FRIENDLY_SPECIALPOWER
-EMERGENCY_REPAIR
-GUARD_AREA
-ATTACK_CONTINUE_AREA
-ATTACK_SCATTER_AREA
-ATTACK_DAMAGE_AREA
-
-WeaponBonus Types:
-NOTE: See Gamedata.ini to see what it does.
-When this code is defined in Gamedata.ini, it implements the weapon bonus GLOBALLY to all available weapons.
-It can be overriden if it's assigned to a weapon code in Weapon.ini
-
-GARRISONED
-HORDE
-CONTINUOUS_FIRE_MEAN
-CONTINUOUS_FIRE_FAST
-NATIONALISM
-PLAYER_UPGRADE
-DRONE_SPOTTING ; called by SlavedUpdate objects if the "DistToTargetToGrantRangeBonus" parameter is defined.
-ENTHUSIASTIC
-VETERAN
-ELITE
-HERO
-BATTLEPLAN_BOMBARDMENT
-BATTLEPLAN_HOLDTHELINE
-BATTLEPLAN_SEARCHANDDESTROY
-SUBLIMINAL
-SOLO_HUMAN_EASY
-SOLO_HUMAN_NORMAL
-SOLO_HUMAN_HARD
-SOLO_AI_EASY
-SOLO_AI_NORMAL
-SOLO_AI_HARD
-FRENZY_ONE
-FRENZY_TWO
-FRENZY_THREE
-FANATICISM
-DEMORALIZED_OBSOLETE
-TARGET_FAERIE_FIRE ; called when one attacks an object that has the FAERIE_FIRE status.
-
-WeaponBonus Fields:
-DAMAGE
-RADIUS
-RANGE
-RATE_OF_FIRE
-PRE_ATTACK
-
-
-SpecialPower.ini Enum types:
-AIRF_SPECIAL_SPECTRE_GUNSHIP
-AIRF_SPECIAL_DAISY_CUTTER
-AIRF_SPECIAL_CARPET_BOMB
-AIRF_SPECIAL_A10_THUNDERBOLT_STRIKE
-
-SUPW_SPECIAL_NEUTRON_MISSILE
-SUPW_SPECIAL_PARTICLE_UPLINK_CANNON
-SUPR_SPECIAL_CRUISE_MISSILE
-
-NUKE_SPECIAL_NEUTRON_MISSILE
-NUKE_SPECIAL_CLUSTER_MINES
-
-SLTH_SPECIAL_GPS_SCRAMBLER
-
-INFA_SPECIAL_PARADROP_AMERICA
-
-LAZR_SPECIAL_PARTICLE_UPLINK_CANNON
-
-SPECIAL_PARADROP_AMERICA
-SPECIAL_BATTLESHIP_BOMBARDMENT
-SPECIAL_COMMUNICATIONS_DOWNLOAD
-
-SPECIAL_A10_THUNDERBOLT_STRIKE
-SPECIAL_TANK_PARADROP
-SPECIAL_SNEAK_ATTACK
-SPECIAL_GPS_SCRAMBLER
-SPECIAL_SPECTRE_GUNSHIP
-
-EARLY_SPECIAL_LEAFLET_DROP
-SPECIAL_LEAFLET_DROP
-
-EARLY_SPECIAL_CHINA_CARPET_BOMB
-SPECIAL_CHINA_CARPET_BOMB
-
-SPECIAL_FRENZY
-EARLY_SPECIAL_FRENZY
-
-SPECIAL_REPAIR_VEHICLES
-EARLY_SPECIAL_REPAIR_VEHICLES
-
-SPECIAL_LAUNCH_BAIKONUR_ROCKET
-SPECIAL_CLEANUP_AREA
-SPECIAL_CIA_INTELLIGENCE
-SPECIAL_CHANGE_BATTLE_PLANS
-SPECIAL_CASH_BOUNTY
-SPECIAL_PARTICLE_UPLINK_CANNON
-SPECIAL_BOOBY_TRAP
-SPECIAL_DISGUISE_AS_VEHICLE
-SPECIAL_SPY_DRONE
-SPECIAL_RADAR_VAN_SCAN
-SPECIAL_INFANTRY_CAPTURE_BUILDING
-SPECIAL_BLACKLOTUS_STEAL_CASH_HACK
-SPECIAL_BLACKLOTUS_DISABLE_VEHICLE_HACK
-SPECIAL_BLACKLOTUS_CAPTURE_BUILDING
-SPECIAL_TANKHUNTER_TNT_ATTACK
-SPECIAL_HACKER_DISABLE_BUILDING
-SPECIAL_HELIX_NAPALM_BOMB
-SPECIAL_TIMED_CHARGES
-SPECIAL_REMOTE_CHARGES
-SPECIAL_MISSILE_DEFENDER_LASER_GUIDED_MISSILES
-SPECIAL_ARTILLERY_BARRAGE
-SPECIAL_DETONATE_DIRTY_NUKE
-SPECIAL_CRATE_DROP
-SPECIAL_DEMORALIZE_OBSOLETE
-SPECIAL_SCUD_STORM
-SPECIAL_ANTHRAX_BOMB
-SPECIAL_BLACK_MARKET_NUKE
-SPECIAL_AMBUSH
-SPECIAL_TERROR_CELL
-SPECIAL_DEFECTOR
-SPECIAL_SPY_SATELLITE
-SPECIAL_NEUTRON_MISSILE
-SPECIAL_CASH_HACK
-SPECIAL_NAPALM_STRIKE
-SPECIAL_EMP_PULSE
-SPECIAL_CLUSTER_MINES
-SPECIAL_CARPET_BOMB
-SPECIAL_DAISY_CUTTER
-SPECIAL_INVALID
-
-;--------------------------------------------
-Used Tactical Analysis Strings:
-;--------------------------------------------
-ACADEMY:BuildAHero
-ACADEMY:RanOutOfPower
-ACADEMY:IdleBuildingUnits
-ACADEMY:TryGarrisoningAStructure
-ACADEMY:TryUsingSuperweapons
-ACADEMY:SpendGeneralsPoints
-ACADEMY:TryCapturingStructures
-ACADEMY:BuildMorePeons
-ACADEMY:TryBuildingRadar
-ACADEMY:UseGuardAbility
-ACADEMY:UseControlGroups
-
-Frame to Milisecond Ratio:
-[Description: Particle effect lifetimes use framecounts , but weapons delays and object lifetimes use miliseconds. So this is just here to make calculations easier]
-1 frame = 33.33 ms
-1 ms = 0.03 frames
-
-;--------------------------------------------
-ProjectileCollidesWith parameters [Weapon Collide Masks]:
-;--------------------------------------------
-
-ALLIES
-ENEMIES
-STRUCTURES
-SHRUBBERY
-PROJECTILES
-WALLS
-SMALL_MISSILES
-BALLISTIC_MISSILES
-CONTROLLED_STRUCTURES
-
-;--------------------------------------------
-PlayerTemplate parameters:
-;--------------------------------------------
-
- "Side"
- "BaseSide"
- "PlayableSide"
- "DisplayName"
- "StartMoney"
- "PreferredColor"
- "StartingBuilding"
- "StartingUnit0" = [ObjectName]
- "StartingUnit1" = [ObjectName]
- "StartingUnit2" = [ObjectName]
- "StartingUnit3" = [ObjectName]
- "StartingUnit4" = [ObjectName]
- "StartingUnit5" = [ObjectName]
- "StartingUnit6" = [ObjectName]
- "StartingUnit7" = [ObjectName]
- "StartingUnit8" = [ObjectName]
- "StartingUnit9" = [ObjectName]
- "ProductionCostChange" = [ObjectName percentage]
- "ProductionTimeChange" = [ObjectName percentage]
- "ProductionVeterancyLevel" = [ObjectName REGULAR/VETERAN/ELITE/HEROIC]
- "IntrinsicSciences" = [SCIENCE]
- "PurchaseScienceCommandSetRank1"
- "PurchaseScienceCommandSetRank3"
- "PurchaseScienceCommandSetRank8"
- "SpecialPowerShortcutCommandSet"
- "SpecialPowerShortcutWinName"
- "SpecialPowerShortcutButtonCount"
- "IsObserver" = [Yes/No]
- "OldFaction" = [Yes/No]
- "IntrinsicSciencePurchasePoints" = number
- "ScoreScreenImage"
- "LoadScreenImage"
- "LoadScreenMusic"
- "ScoreScreenMusic"
- "HeadWaterMark"
- "FlagWaterMark"
- "EnabledImage"
- "SideIconImage"
- "GeneralImage"
- "BeaconName"
- "ArmyTooltip"
- "Features"
- "MedallionRegular"
- "MedallionHilite"
- "MedallionSelect"
\ No newline at end of file
diff --git a/Asset/GameDesign/ini/particlesysteminfo.ini b/Asset/GameDesign/ini/particlesysteminfo.ini
deleted file mode 100644
index 2bc04c40..00000000
--- a/Asset/GameDesign/ini/particlesysteminfo.ini
+++ /dev/null
@@ -1,148 +0,0 @@
-;--------------------------------------------
-:Particle System:
-;--------------------------------------------
-
-Term Definitions:
- system - the entire system as a whole
- particle(s) - refer to the particles generated by the system
- frame - (33ms) minimal gametime interval, 30 Frames = 1 Second.
- damping - (Velocity, Angular, SizeRate, etc.) The parent value (e.g. Velocity) is multiplied with the damping value every frame. values range from 0 to 1, 0 = maximum dampening, 1 = no dampening
- z axis - the axis in which the particle spins; aligned to the view (unless IsGroundAligned = Yes)
-
- positive value spins this way <---
- negative value spins that way --->
- +---+---+
- | |
- + Z +
- | |
- +---+---+
-;--------------------------------------------
-;--------------------------------------------
-ParticleSystem [system name]
- Priority = [entry from Particle System Priority listing]
-
- IsOneShot = [Yes/No]
-
- Shader = [ADDITIVE/ALPHA/ALPHA_TEST]
-
- ADDITIVE = RGB intensity used for transparency => glowy (white = solid, black = transparent)
- ALPHA = image alpha used for transparency (required alpha channel in texture)
- ALPHA_TEST = same as alpha, but binary alpha is used (sharp edges)
-
- Type = [PARTICLE/STREAK]
-
- PARTICLE = renders each particle individually
- STREAK = connects particles together (used by trails)
-
- ParticleName = [particle texture in .dds or .tga]
-
- AngleZ = [decimal] [decimal] ; initial particle z axis angle IN RADIANS (0 - 2*PI), value is randomized between the two values inputed
- AngularRateZ = [decimal] [decimal] ; z axis spin rate in radians per frame, value is randomized between the two values inputed
- AngularDamping = [decimal] [decimal] ; AngularRateZ is multiplied with this value every frame. value is randomized between the two values inputed
-
- VelocityDamping = [decimal] [decimal] ; particle velocity is multiplied with this value every frame, value is randomized between the two values inputed
-
- Gravity = [decimal] ; particle World Z movement (Up/Down) in distance per frame. 0 = particles don't move, >0 = particles go up, <0 = particles go down
-
- Lifetime = [integer] [integer] ; how long a particle remains in frames (e.g. Liftime = 30 = 1 second), value is randomized between the two values inputed
- SystemLifetime = [integer] ; how long the particle system remains in frames (0 = unlimited)
-
- PerParticleAttachedSystem = [entry from ParticleSystem.ini] ; attaches another particle system to particles created by this system, yo dawg!
- SlaveSystem = [entry from ParticleSystem.ini] ; attaches another particle system to this system.
- SlavePosOffset = X:[decimal] Y:[decimal] Z:[decimal] ; offsets the position of the slave system in distance
-
- Size = [integer] [integer] ; particle size, value is randomized between the two values inputed
- StartSizeRate = [integer] [integer] ; start size scale rate, if a nonzero value is specified it'll gradually change to the SizeRate value, value is randomized between the two values inputed
- SizeRate = [integer] [integer] ; particle size increases by this value per frame (negative value causes shrinking), value is randomized between the two values inputed
- SizeRateDamping = [integer] [integer] ; particle SizeRate is multiplied with this value every frame , value is randomized between the two values inputed
-
- Alpha[1-9] = [0.0-1.0] [0.0-1.0] [integer] ; parameters 1 and 2 are Alpha values, integer = time in frames. controls particle transparency when ALPHA or ALPHA_TEST particle type is chosen.
- ;Multiple entries with different time values. Alpha Values are interpolated between them.
-
- Color[1-9] = R:[0-255] G:[0-255] B:[0-255] [integer] ; controls particle color, also controls particle transparency if ADDITIVE particle type is chosen
- ;Multiple entries with different time values. RGB Values are interpolated between them.
-
- ColorScale = [integer] [integer] ; changes particle color based on values specified (every frame). >0 = colors get brighter, <0 colors get darker. value is randomized between the two integers.
-
- BurstDelay = [integer] [integer] ; delay between particle generation in frames, value is randomized between the two values inputed
- BurstCount = [integer] [integer] ; number of particles generated per BurstDelay interval, value is randomized between the two values inputed
- InitialDelay = [decimal] [decimal] ; initial delay before particle generation in frames, value is randomized between the two values inputed
- DriftVelocity = X:[decimal] Y:[decimal] Z:[decimal] ; Additional velocity aligned to World coordinates in distance per frame. Not affected by Damping
-
-[VelocityType - controls how the particle moves
-below is a list of all the available velocity types and their settings]
-
- VelocityType = NONE ; no movement
-
- VelocityType = ORTHO ; moves along x, y, z axis (oriented to particle system)
- VelOrthoX = [decimal] [decimal] ; velocity along x axis {forward, backward} in distance per frame, value is randomized between the two values inputed
- VelOrthoY = [decimal] [decimal] ; velocity along y axis (left, right) in distance per frame, value is randomized between the two values inputed
- VelOrthoZ = [decimal] [decimal] ; velocity along z axis {up, down} in distance per frame, value is randomized between the two values inputed
-
- VelocityType = OUTWARD ; moves outward and upwards
- VelOutward = [decimal] [decimal] ; distance per frame outwards with random angle, value is randomized between the two values inputed
- VelOutwardOther = [decimal] [decimal] ; distance per frame upwards, value is randomized between the two values inputed
-
- VelocityType = CYLINDRICAL ; used with CYLINDER volume type, moves in a cylindrical shape
- VelCylindricalRadial = [decimal] [decimal] ; in distance per frame, value is randomized between the two values inputed
- VelCylindricalNormal = [decimal] [decimal] ; in distance per frame, value is randomized between the two values inputed
-
- VelocityType = SPHERICAL ; used with SPHERE volume type, moves in a spherical shape
- VelSpherical = [decimal] [decimal] ; in distance per frame, value is randomized between the two values inputed
-
- VelocityType = HEMISPHERICAL ; moves in a hemispherical shape
- VelHemispherical = [decimal] [decimal] ; in distance per frame, value is randomized between the two values inputed
-
-[VolumeType - the starting shape of the system
-below is a list of all the available volume types and their settings]
-
- VolumeType = POINT ; no shape just a point
-
- VolumeType = LINE ; creates particles along a line between 2 offsets.
- VolLineStart = X:[decimal] Y:[decimal] Z:[decimal] ; start of the line
- VolLineEnd = X:[decimal] Y:[decimal] Z:[decimal] ; end of the line
-
- VolumeType = CYLINDER ; used with CYLINDIRCAL velocity type, creates a cylindircal shaped system
- VolCylinderRadius = [decimal] ; Cylinder radius
- VolCylinderLength = [decimal] ; Cylinder length. Negative values allowed.
-
- VolumeType = SPHERE ; used with SPHERICAL velocity type, creates a spherical shaped system
- VolSphereRadius = [decimal] ; Sphere radius
-
- VolumeType = BOX ; creates a box shaped system
- VolBoxHalfSize = X:[decimal] Y:[decimal] Z:[decimal]
-
- IsHollow = [Yes/No] ; Yes = creates particles on the border of the volume, No = creates particles everywhere within the volume
- IsGroundAligned = [Yes/No] ; Yes = aligns particles (Z-axis) to the ground, No = Aligns particles to the view
- IsEmitAboveGroundOnly = [Yes/No] ; particles only appear on the ground
- IsParticleUpTowardsEmitter = [Yes/No] ; orients particles towards the object that generates it
-
-[WindMotion - simulates the wind]
-
- WindMotion = Unused ; no wind
-
- WindMotion = PingPong
- WindAngleChangeMin = [decimal]
- WindAngleChangeMax = [decimal]
- WindPingPongStartAngleMin = [decimal]
- WindPingPongStartAngleMax = [decimal]
- WindPingPongEndAngleMin = [decimal]
- WindPingPongEndAngleMax = [decimal]
-End
-
-;--------------------------------------------
-Particle System Priority Types:
-;--------------------------------------------
-ALWAYS_RENDER ; always show the particle
-CRITICAL
-AREA_EFFECT
-WEAPON_TRAIL
-CONSTANT
-SEMI_CONSTANT
-DEATH_EXPLOSION
-UNIT_DAMAGE_FX
-DEBRIS_TRAIL
-BUILDUP
-DUST_TRAIL
-SCORCHMARK
-WEAPON_EXPLOSION
\ No newline at end of file
diff --git a/Asset/Home.md b/Asset/Home.md
index 08f8331d..74f7ba1b 100644
--- a/Asset/Home.md
+++ b/Asset/Home.md
@@ -13,15 +13,13 @@ goal of this project is to provide a higher quality and more polished experience
## **Getting Started**
To get started with the project, you can submit issues or pull requests (PRs). Additionally, you can install the current
-asset patch using **GeneralsModBuilder** (see the [installation guide](installation)),
+asset patch using [**GeneralsModBuilder**](https://github.com/TheSuperHackers/GeneralsModBuilder),
which allows you to install the patch directly into your game directory and try it out.
## **Quick Links**
- [How to Get Involved](how_to_get_involved)
-- [Installation Guide](installation)
- [List of Improvements and Fixes](https://github.com/TheSuperHackers/GeneralsGamePatch?tab=readme-ov-file#change-logs)
-- [FAQ](faq)
## **Types of Assets, Usage, and Configuration Instructions**
@@ -38,7 +36,7 @@ For a detailed list of asset types and guidelines on how to contribute or fix th
the [How to Get Involved](how_to_get_involved) page.
For detailed information on how to use and configure the different types of assets in the game, such as the behavior of
-various GUI elements, control mechanics, and more, see the relevant section in the wiki navigation, such as [WND](wnd_reference),
+various GUI elements, control mechanics, and more, see the relevant section in the wiki navigation, such as [WND](wnd_reference).
## **Contact and Community**
diff --git a/Asset/Maps/worldbuilder/AdrianeWorldBuilderGuide.pdf b/Asset/Maps/worldbuilder/AdrianeWorldBuilderGuide.pdf
deleted file mode 100644
index 86b7eb2c..00000000
Binary files a/Asset/Maps/worldbuilder/AdrianeWorldBuilderGuide.pdf and /dev/null differ
diff --git a/Asset/Maps/worldbuilder/CCGWBpcMAN.pdf b/Asset/Maps/worldbuilder/CCGWBpcMAN.pdf
deleted file mode 100644
index 50dd218e..00000000
Binary files a/Asset/Maps/worldbuilder/CCGWBpcMAN.pdf and /dev/null differ
diff --git a/Asset/Patch/credits.md b/Asset/Patch/credits.md
deleted file mode 100644
index e443a413..00000000
--- a/Asset/Patch/credits.md
+++ /dev/null
@@ -1 +0,0 @@
-# This page is a work in progress and is currently incomplete
diff --git a/Asset/Patch/faq.md b/Asset/Patch/faq.md
deleted file mode 100644
index e443a413..00000000
--- a/Asset/Patch/faq.md
+++ /dev/null
@@ -1 +0,0 @@
-# This page is a work in progress and is currently incomplete
diff --git a/Asset/Patch/installation.md b/Asset/Patch/installation.md
deleted file mode 100644
index e443a413..00000000
--- a/Asset/Patch/installation.md
+++ /dev/null
@@ -1 +0,0 @@
-# This page is a work in progress and is currently incomplete
diff --git a/Asset/Patch/known_issues.md b/Asset/Patch/known_issues.md
deleted file mode 100644
index e443a413..00000000
--- a/Asset/Patch/known_issues.md
+++ /dev/null
@@ -1 +0,0 @@
-# This page is a work in progress and is currently incomplete
diff --git a/Asset/Tools/generals_mod_builder.md b/Asset/Tools/generals_mod_builder.md
deleted file mode 100644
index e69de29b..00000000
diff --git a/Asset/_Sidebar.md b/Asset/_Sidebar.md
index f5527deb..73606648 100644
--- a/Asset/_Sidebar.md
+++ b/Asset/_Sidebar.md
@@ -4,14 +4,10 @@
---
## Patch
-- [Installation](installation)
- [How to Get Involved](how_to_get_involved)
- [How to Contribute](contribution)
- [License](https://github.com/TheSuperHackers/GeneralsGamePatch/blob/main/LICENSE.txt)
-- [Credits](credits)
- [Changelog](https://github.com/TheSuperHackers/GeneralsGamePatch?tab=readme-ov-file#change-logs)
-- [FAQ](faq)
-- [Known Issues](known_issues)
- [Contact & Community](contact_community)
---
@@ -22,11 +18,10 @@
- Textures
- [Cameo Sizes](cameo_sizes)
- [DDS files and DXT compression](dds_files_and_dxt_compression)
- - [Texture Guidelines](Art/dds/texture\_guidelines.md)
+ - [Texture Guidelines](texture_guidelines)
- Audio & Video
- [Game WAV Audio files](audio)
- - BIK
- Game Design
- INI
- INI Files
@@ -56,11 +51,10 @@
- [Scroll Listbox](wnd_controls_scrollistbox)
- [Slider](wnd_controls_slider)
- [Statictext](wnd_controls_statictext)
- - GUI Editor
## Tools
-- FinalBIG
+- [BIG File Format](big_format)
- [Generals Mod Builder](https://github.com/TheSuperHackers/GeneralsModBuilder)
diff --git a/SourceCode/Builds/build_configuration.md b/SourceCode/Builds/build_configuration.md
index 7ec5039d..157ce469 100644
--- a/SourceCode/Builds/build_configuration.md
+++ b/SourceCode/Builds/build_configuration.md
@@ -1,113 +1,113 @@
# Build Configurations Overview
-This page describes the various build configurations used in the project, detailing the different types of builds, their
-purpose, and the associated compiler flags for each configuration. These configurations control how the code is compiled
-and optimized for different development and release scenarios.
+This page describes the build configurations GeneralsGameCode supports and the CMake options that control them. For
+presets, targets, and installation, see the [Building with CMake guide](cmake_guide).
-## Build Configurations
+Configurations are selected through CMake cache variables, which the presets in `CMakePresets.json` set for you. You
+rarely need to set them by hand; pass them while configuring only when you want a combination no preset provides.
-There are four main build configurations in the project, each designed for different purposes:
+## Configurations
-### 1. **Release (O2, _RELEASE)**
+| Configuration | VC6 preset | Win32 preset | Cache variables set by the preset |
+| ------------- | ------------- | --------------- | ------------------------------------------------------- |
+| Release | `vc6` | `win32` | none; this is the default |
+| Debug | `vc6-debug` | `win32-debug` | `RTS_BUILD_OPTION_DEBUG=ON` |
+| Profile | `vc6-profile` | `win32-profile` | `RTS_BUILD_OPTION_PROFILE=ON` |
-- **Purpose:** The release configuration is used for building the final version of the game that will be distributed to
- end users.
-- **Features:**
- - Maximum optimization (`/O2`) for better performance.
- - No debugging information is included to ensure smaller binary size and improved performance.
- - Suitable for production builds.
+Two differences between the toolchains are worth noting:
-- **Compiler Flags:**
- - `/O2`: Optimization for speed.
- - `/D "_RELEASE"`: Defines the release configuration.
- - `/D "NDEBUG"`: Disables debugging code.
+- `vc6-debug` also sets `CMAKE_BUILD_TYPE=Debug`, because the VC6 presets use Ninja, a single-configuration generator.
+ The `win32` presets are multi-configuration, so the configuration is chosen when building instead.
+- `win32-profile` additionally sets `RTS_BUILD_OPTION_PROFILE_TRACY=ON`. The VC6 profile build does not use Tracy.
-- **Use Case:** This configuration is used when preparing the game for release to the end user.
+> **Retail compatibility:** Only the `vc6` Release build is compatible with retail multiplayer and replays. See
+> [Build presets](cmake_guide#build-presets).
-### 2. **Debug (Od, _DEBUG)**
+## Configuration definitions
-- **Purpose:** The debug configuration is used for development and debugging. It includes debugging symbols and disables
- optimizations to make it easier to step through code.
-- **Features:**
- - No optimization (`/Od`), making debugging easier but with slower execution.
- - Debugging symbols and additional information are included to help track issues.
- - The build is less efficient but provides full access to debugging features.
+Each configuration compiles the code with a different set of preprocessor definitions:
-- **Compiler Flags:**
- - `/Od`: Disables optimizations to facilitate debugging.
- - `/D "_DEBUG"`: Defines the debug configuration.
- - `/ZI`: Generates debugging information.
- - `/Gm`: Enables minimal rebuilds.
+| Configuration | Definitions |
+| ------------- | ---------------------------------------------- |
+| Release | `RTS_RELEASE`, `NDEBUG` |
+| Debug | `RTS_DEBUG`, `WWDEBUG`, `DEBUG` |
+| Profile | `RTS_RELEASE`, `NDEBUG`, `RTS_PROFILE_LEGACY` |
-- **Use Case:** Used during development for debugging and resolving issues in the code.
+The Profile configuration builds on Release, so it defines `RTS_RELEASE` and `NDEBUG` as well.
-> **⚠️ Debug Build Requirements:** To run a debug build of the game, you need to have
-> the following two files in the game directory alongside the built executable:
->
-> - [`MSVCRTD.DLL`](https://github.com/TheSuperHackers/GeneralsWiki/raw/refs/heads/main/SourceCode/Builds/files/MSVCRTD.DLL)
-> Microsoft Visual C++ Runtime Library (Debug)
-> - [`MSVCIRTD.DLL`](https://github.com/TheSuperHackers/GeneralsWiki/raw/refs/heads/main/SourceCode/Builds/files/MSVCIRTD.DLL)
-> Microsoft Visual C++ Internationalization Runtime Library (Debug)
+Two further definitions are applied by platform rather than by configuration:
-### 3. **Profile (O2, IG_DEBUG_STACKTRACE, _RELEASE, _PROFILE)**
+- On MSVC: `_CRT_NONSTDC_NO_WARNINGS` and `_CRT_SECURE_NO_WARNINGS`, plus `_DEBUG_CRT` in the Debug configuration.
+- On Unix: `_UNIX`.
-- **Purpose:** The profile configuration is used for performance profiling and optimization. It is designed to help
- developers analyze performance bottlenecks and gather performance data.
-- **Features:**
- - Includes optimization (`/O2`) and performance profiling flags.
- - Supports detailed stack tracing (`IG_DEBUG_STACKTRACE`) to gather performance metrics.
- - Designed for analyzing how the game performs under various conditions and measuring optimization effectiveness.
+> [!NOTE]
+> Optimization and debug-information flags such as `/O2`, `/Od`, and `/Zi` are not set by the project. They come
+> from the compiler defaults CMake applies for the selected `CMAKE_BUILD_TYPE`. The presets set warning level `/W3`
+> through the `RTS_FLAGS` cache variable.
-- **Compiler Flags:**
- - `/O2`: Optimization for performance.
- - `/D "_PROFILE"`: Enables profiling configuration.
- - `/D "IG_DEBUG_STACKTRACE"`: Enables stack trace debugging for performance analysis.
- - `/D "NDEBUG"`: Disables debugging code in the final build.
+The Debug configuration has one additional runtime requirement.
-- **Use Case:** Used for profiling and performance analysis to optimize code and identify potential bottlenecks.
+> [!IMPORTANT]
+> Debug builds require the Microsoft debug runtime libraries in the same directory as the built executable.
+> See [VC6 Debug runtime](cmake_guide#vc6-debug-runtime) for the required files.
----
+## Build options
-## Key Compiler Flags
+These options change how the code is built. All default to `OFF`.
-Below is a list of the key compiler flags used across different configurations:
+| Option | Effect |
+| --------------------------------- | ------------------------------------------------------------------- |
+| `RTS_BUILD_OPTION_DEBUG` | Builds the Debug configuration |
+| `RTS_BUILD_OPTION_PROFILE` | Builds the Profile configuration |
+| `RTS_BUILD_OPTION_PROFILE_TRACY` | Enables Tracy profiler integration |
+| `RTS_BUILD_OPTION_ASAN` | Builds with Address Sanitizer (`/fsanitize=address`) |
+| `RTS_BUILD_OPTION_VC6_FULL_DEBUG` | Builds VC6 with full debug information (`/Zi`) |
+| `RTS_BUILD_OPTION_FFMPEG` | Enables FFmpeg support |
-### Optimization Flags
+There is also `RTS_BUILD_OUTPUT_SUFFIX`, a string appended to the output names of installable targets. It is empty by
+default, which is why the executables are named `generalsv.exe` and `generalszh.exe`.
-- **`/O2`**: Optimizes the code for speed. This flag is typically used in release builds and performance profiling
- builds.
-- **`/Od`**: Disables optimizations, which is useful during debugging when you want to ensure that the debugger can
- easily track code execution.
+## Debug feature options
-### Debugging Flags
+These options control individual debug features independently of the configuration, so a Release build can keep
+logging or assert dialogs enabled.
-- **`/D "_DEBUG"`**: Defines the build as a debug version, enabling debugging-specific features in the code.
-- **`/D "_RELEASE"`**: Defines the build as a release version, disabling debugging features and optimizing for
- performance.
-- **`/D "NDEBUG"`**: Disables debugging code, typically used in release builds.
+The following four accept `DEFAULT`, `ON`, or `OFF`. `DEFAULT` leaves the feature to the configuration, where it is
+enabled for Debug and Internal builds:
-### Profiling Flags
+| Option | `ON` defines | `OFF` defines |
+| ---------------------- | ------------------- | --------------------------- |
+| `RTS_DEBUG_LOGGING` | `DEBUG_LOGGING` | `DISABLE_DEBUG_LOGGING` |
+| `RTS_DEBUG_CRASHING` | `DEBUG_CRASHING` | `DISABLE_DEBUG_CRASHING` |
+| `RTS_DEBUG_STACKTRACE` | `DEBUG_STACKTRACE` | `DISABLE_DEBUG_STACKTRACE` |
+| `RTS_DEBUG_PROFILE` | `DEBUG_PROFILE` | `DISABLE_DEBUG_PROFILE` |
-- **`/D "_PROFILE"`**: Enables performance profiling in the build. This flag is used to gather performance data during
- runtime.
-- **`/D "IG_DEBUG_STACKTRACE"`**: Enables stack trace generation, which helps in analyzing performance issues and
- crashes.
+Each of these definitions is set to `1`. Enabling `RTS_DEBUG_STACKTRACE` also enables debug logging.
-### Additional Flags
+The remaining options are simple on/off switches, all `OFF` by default:
-- **`/ZI`**: Generates debugging information and supports editing and continuing in Visual Studio.
-- **`/WX`**: Treats warnings as errors, which is often used to enforce strict coding standards.
-- **`/Gm`**: Enables minimal rebuild, allowing faster incremental builds.
-- **`/MD`**: Links with the dynamic version of the C runtime library, commonly used for Windows builds.
-- **`/Yu"PreRTS.h"`**: Tells the compiler to use precompiled headers, which can speed up compilation time.
+| Option | Defines | Purpose |
+| ---------------------------------------- | -------------------------------- | ---------------------------------------- |
+| `RTS_DEBUG_CHEATS` | `_ALLOW_DEBUG_CHEATS_IN_RELEASE` | Enables debug cheats in release builds |
+| `RTS_DEBUG_INCLUDE_DEBUG_LOG_IN_CRC_LOG` | `INCLUDE_DEBUG_LOG_IN_CRC_LOG` | Includes the debug log in the CRC log |
+| `RTS_DEBUG_MULTI_INSTANCE` | `RTS_MULTI_INSTANCE` | Allows running multiple client instances |
----
+## Additional presets
-## When to Use Each Configuration
+Two VC6 presets combine a Release build with debug features:
-- **Release:** Use this configuration when preparing the final version of the game for distribution. It ensures the game
- is optimized for performance with no debugging overhead.
-- **Debug:** Use this configuration during development when you need to debug issues. It disables optimizations and
- includes debugging information.
-- **Profile:** Use this configuration when analyzing the performance of the game. It helps identify bottlenecks and
- areas that can be optimized further.
+| Preset | Cache variables | Purpose |
+| ----------------- | ------------------------------------------------ | ---------------------------------------- |
+| `vc6-releaselog` | `RTS_DEBUG_LOGGING=ON`, `RTS_DEBUG_CRASHING=ON` | Release build with logging and asserts |
+| `vc6-weekly` | `RTS_BUILD_OPTION_VC6_FULL_DEBUG=ON` | Release build with full debug info |
+
+List every preset in your checkout with `cmake --list-presets=all`.
+
+## Example
+
+Configure a Release build with debug logging enabled and build it:
+
+```shell
+cmake --preset vc6 -DRTS_DEBUG_LOGGING=ON
+cmake --build --preset vc6
+```
diff --git a/SourceCode/Builds/build_guides.md b/SourceCode/Builds/build_guides.md
index 9bc6a6a5..59c234e2 100644
--- a/SourceCode/Builds/build_guides.md
+++ b/SourceCode/Builds/build_guides.md
@@ -1,94 +1,32 @@
# Build Guides
-This page provides an overview of the official and community-supported build guides for **TheSuperHackers** project. It
-includes both the official build guides for the main repository and guides for community forks of the project. The
-guides cover different environments, configurations, and setups for building the project.
+Instructions for building GeneralsGameCode and configuring its build system.
-## Build Configurations Overview
+## Available build guides
-Before diving into the build guides, it's important to understand the different build configurations used in the
-project. These configurations dictate how the project is built, whether for debugging, profiling or release.
+Both `vc6` and `win32` produce 32-bit Windows builds. `vc6` uses the original Visual C++ 6 toolchain for
+retail-compatible Release builds, while `win32` uses a modern Visual Studio toolchain.
-- **Release:** Optimized for end-users, providing a smaller, faster executable with no debugging information.
-- **Debug:** Includes debugging information, making it easier to trace and debug the code, but without optimization to
- ensure ease of debugging.
-- **Profile:** Used for performance profiling, with optimizations enabled and additional debugging options to collect
- profiling data.
+### Windows
-Each configuration is designed for a different purpose, whether you're building for development, debugging, testing, or
-releasing the final product. You can find more details about the build configurations in
-the [Build Configurations](build_configuration) page.
+| Guide | Toolchain |
+| ------------------------------------------------------ | ----------- |
+| [CMake and Visual Studio 6](visual_studio_6) | VC6 |
+| [Build with CLion using VC6 or Win32](clion_vc6_win32) | VC6 / Win32 |
+| [Visual Studio 2022 and 2026](visual_studio) | Win32 |
-> **⚠️ Debug Build Requirements:** To run a debug build of the game, you need to have
-> the following two files in the game directory alongside the built executable:
->
-> - [`MSVCRTD.DLL`](https://github.com/TheSuperHackers/GeneralsWiki/raw/refs/heads/main/SourceCode/Builds/files/MSVCRTD.DLL)
-> Microsoft Visual C++ Runtime Library (Debug)
-> - [`MSVCIRTD.DLL`](https://github.com/TheSuperHackers/GeneralsWiki/raw/refs/heads/main/SourceCode/Builds/files/MSVCIRTD.DLL)
-> Microsoft Visual C++ Internationalization Runtime Library (Debug)
+### Linux
-## Architectures and Toolchains
+| Guide | Toolchain |
+| ------------------------------------------ | --------- |
+| [Build on Linux with Docker](linux_docker) | VC6 |
-The project supports multiple architectures and toolchains, which is why there are various build guides tailored to
-different environments. An **architecture** refers to the target platform, such as **x86** (32-bit) or **x64** (64-bit),
-while a **toolchain** is the set of tools (compilers, linkers, etc.) used to build the project. Different toolchains may
-support different optimizations, libraries, or debugging features that influence how the build process is conducted.
+## CMake guide
-> [!WARNING]
-> The Wiki is under work in progress. The content is subject to change and may not be complete.
-> Not all build guides are available yet, but you can contribute by adding new guides or updating existing ones.
+The [Building with CMake guide](cmake_guide) covers the shared command-line workflow, common presets and
+options, target selection, installation, and build-specific requirements.
-## CMake Overview
+## Build configurations
-This [CMake Guide](cmake_guide) provides an overview of how to configure and build **Generals** and its expansion
-*Zero Hour* using **CMake** via the command line. It covers the various options and flags defined in the CMake files that
-control the build process, allowing you to choose different components of the game and tools to build.
-
-## Official Build Guides
-
-These are the official guides provided by **TheSuperHackers** for building the project using various toolchains and
-environments.
-
-### **Visual Studio 6 Guides**
-
-1. **Using pure Visual Studio 6 (x86) (Windows)**
- - A guide for building the project using only Visual Studio 6 on Windows for the x86 architecture.
- [Build with pure Visual Studio 6 (x86) (Windows)](build_with_ea_msvc6)
-
-2. **Using Cmake & Visual Studio 6 (x86) (Windows)**
- - A guide for building the project using CMake with Visual Studio 6 on Windows for the x86 architecture.
- [Build with CMake & Visual Studio 6 (x86) (Windows)](build_with_msvc6)
-
- #### Sub-guides
-
- - **CLion & VC6 Toolchain**
- - A guide for using CLion with the Visual Studio 6 (VC6) toolchain for building the project.
- [Build with CLion & VC6 Toolchain](build_with_clion_vc6_toolchain)
- - **Docker & VC6**
- - A guide for setting up Docker with the Visual Studio 6 (VC6) toolchain for building the project in a
- containerized environment.
- [Build with Docker & VC6](build_with_msvc6_on_docker)
- - **Build on Linux**
- - A guide for building the project on Linux using Docker with convenience scripts.
- Includes instructions for installing built executables to an existing game.
- [Build on Linux](build_on_linux)
-
-### **Visual Studio 2022 Guides**
-
-1. **Using Cmake (x86) (Windows)**
- - A guide for building the project using CMake with Visual Studio 2022 on Windows for the x86 architecture.
- [Build with CMake (x86) (Windows)](build_with_msvc22)
-
-2. **Using Cmake (Linux)**
- - A guide for building the project using CMake with Visual Studio 2022 on Linux.
- [Build with CMake (Linux)](build_with_msvc22_linux)
-
-## Community Forks Build Guides
-
-These are the guides provided for community-supported forks of **TheSuperHackers** project. These forks are customized
-versions of the original repository and may have unique build setups.
-
-1. **MSVC22 (x64) Generals Only (Windows)**
- - A guide for building a custom fork of the project using MSVC 2022 (x64) for Windows, specifically tailored for
- the "Generals Only" version.
- [Build with MSVC22 (x64) Generals Only (Windows)](build_with_msvc22_x64_jmarshall2323)
+The [Build Configurations Overview](build_configuration) describes the Release, Debug, and Profile configurations, the
+build options, and the debug feature options that control them.
diff --git a/SourceCode/Builds/build_on_linux.md b/SourceCode/Builds/build_on_linux.md
deleted file mode 100644
index a0544a60..00000000
--- a/SourceCode/Builds/build_on_linux.md
+++ /dev/null
@@ -1,212 +0,0 @@
-# Build Command & Conquer Generals on Linux
-
-This guide covers building Generals and Zero Hour on Linux using Docker. The build produces Windows
-executables that can run natively on Windows or under Wine on Linux.
-
-## Quick Start
-
-The repository includes convenience scripts that automate the Docker build process:
-
-```bash
-# Clone the repository
-git clone https://github.com/TheSuperHackers/GeneralsGameCode.git
-cd GeneralsGameCode
-
-# Build using Docker (produces Windows executables)
-./scripts/docker-build.sh
-
-# Install to your game (auto-detects Wine prefix)
-./scripts/docker-install.sh --detect
-```
-
-## Prerequisites
-
-- **Docker**: Install Docker Engine for your distribution
- - [Debian/Ubuntu](https://docs.docker.com/engine/install/debian/)
- - [Fedora](https://docs.docker.com/engine/install/fedora/)
- - [Arch Linux](https://wiki.archlinux.org/title/Docker)
-- **Git**: For cloning the repository
-- **Wine** (optional): For running the built executables on Linux
-
-### Docker Setup
-
-Ensure Docker is running and your user has permission:
-
-```bash
-# Start Docker daemon
-sudo systemctl start docker
-
-# Add your user to the docker group (logout/login required)
-sudo usermod -aG docker $USER
-```
-
-## Build Scripts
-
-### docker-build.sh
-
-The main build script that manages the Docker-based build process.
-
-```bash
-# Full build (both Generals and Zero Hour)
-./scripts/docker-build.sh
-
-# Build Zero Hour only
-./scripts/docker-build.sh --game zh
-
-# Build Generals only
-./scripts/docker-build.sh --game generals
-
-# Build specific target
-./scripts/docker-build.sh --target generalszh
-
-# Clean build directory first
-./scripts/docker-build.sh --clean
-
-# Force CMake reconfiguration
-./scripts/docker-build.sh --cmake
-
-# Enter container shell for debugging
-./scripts/docker-build.sh --interactive
-```
-
-Build outputs are placed in `build/docker/`:
-
-| Directory | Contents |
-| --------------------------- | ---------------------- |
-| `build/docker/GeneralsMD/` | Zero Hour executables |
-| `build/docker/Generals/` | Generals executables |
-| `build/docker/Core/` | Shared DLLs |
-
-### docker-install.sh
-
-Installs built executables to an existing game installation.
-
-```bash
-# Auto-detect game location (checks Wine prefixes and common paths)
-./scripts/docker-install.sh --detect
-
-# Specify game directory manually
-./scripts/docker-install.sh /path/to/game
-
-# Install Generals instead of Zero Hour
-./scripts/docker-install.sh --game generals /path/to/game
-
-# Dry run (show what would be installed)
-./scripts/docker-install.sh --dry-run --detect
-
-# Restore original files from backups
-./scripts/docker-install.sh --restore /path/to/game
-```
-
-The script will:
-
-1. Backup your original executables (`.exe.backup`)
-2. Copy newly built executables
-3. Copy new DLLs (DebugWindow.dll, ParticleEditor.dll)
-4. Preserve original mss32.dll and binkw32.dll (audio/video libraries)
-
-## Running the Game
-
-After building and installing, run the game with Wine:
-
-```bash
-# Zero Hour (path depends on your installation)
-wine /path/to/game/generalszh.exe
-
-# Or from the build directory (requires game data files)
-wine build/docker/GeneralsMD/generalszh.exe
-```
-
-### Wine Configuration
-
-For best results:
-
-```bash
-# Use 32-bit Wine prefix
-WINEARCH=win32 WINEPREFIX=~/.wine-generals winecfg
-
-# Set Windows version to Windows XP or Windows 7
-winecfg
-```
-
-## Troubleshooting
-
-### Docker Permission Denied
-
-```text
-Got permission denied while trying to connect to the Docker daemon
-```
-
-Solution: Add your user to the docker group and re-login:
-
-```bash
-sudo usermod -aG docker $USER
-# Then logout and login again
-```
-
-### Build Directory Not Found
-
-```text
-Build directory not found: /path/to/GeneralsGameCode/build/docker
-```
-
-Solution: Run the build script first:
-
-```bash
-./scripts/docker-build.sh
-```
-
-### Game Not Found
-
-```text
-No game installation found
-```
-
-Solution: Specify the game directory manually:
-
-```bash
-./scripts/docker-install.sh /path/to/your/game/installation
-```
-
-### Wine Errors
-
-If the game crashes or has graphical issues:
-
-1. Try different Wine versions (wine-staging often works better for games)
-2. Install required dependencies: `winetricks directx9 vcrun6`
-3. Use DXVK for better DirectX performance: `winetricks dxvk`
-
-## Manual Docker Build
-
-If you prefer to run the Docker commands manually instead of using the scripts:
-
-```bash
-# Build the Docker image
-docker build \
- --build-arg UID=$(id -u) \
- --build-arg GID=$(id -g) \
- resources/dockerbuild \
- -t zerohour-build
-
-# Run the build
-docker run \
- -u $(id -u):$(id -g) \
- -v $(pwd):/build/cnc \
- --rm \
- zerohour-build
-
-# Enter container for debugging
-docker run \
- -u $(id -u):$(id -g) \
- -v $(pwd):/build/cnc \
- --rm \
- -it \
- --entrypoint bash \
- zerohour-build
-```
-
-## See Also
-
-- [Build with VC6 on Docker](build_with_msvc6_on_docker.md) - Manual Docker setup
-- [Build Configuration](build_configuration.md) - CMake presets and options
-- [Build Guides](build_guides.md) - All build guides
diff --git a/SourceCode/Builds/build_with_clion_vc6_toolchain.md b/SourceCode/Builds/build_with_clion_vc6_toolchain.md
deleted file mode 100644
index 155272e2..00000000
--- a/SourceCode/Builds/build_with_clion_vc6_toolchain.md
+++ /dev/null
@@ -1,120 +0,0 @@
-# Compile Command & Conquer Generals And Zero Hour with VC6 in CLion
-
-This guide shows how to configure CLion to work with the Visual Studio 6.0 toolchain, maintaining
-compatibility with the original compiler from the game's development era. To compile the source code for
-**Command & Conquer: Generals** and **Zero Hour** using the CLion IDE, follow the steps outlined below.
-
-## Prerequisites
-
-- [Visual Studio 6.0 Portable](https://github.com/itsmattkc/MSVC600)
- > See the [Visual Studio 6.0 Portable installation instructions](build_with_msvc6.md#visual-studio-60-portable)
- > for setup details.
-- [CLion](https://www.jetbrains.com/clion/)
-
-> This guide assumes the user uses the default installation
-> folder for Visual Studio 6.0 Portable: `C:\Program Files (x86)\Microsoft Visual Studio\`
-
-## Step 1: Clone and Open the Project
-
-1. Clone the source code from TheSuperHackers:
-
- ```shell
- git clone https://github.com/TheSuperHackers/GeneralsGameCode.git
- ```
-
- > Alternatively, you can clone the repository directly from within CLion.
-
-2. Open the cloned folder in **CLion**.
-
-## Step 2: Setting Up the Toolchain in CLion
-
-1. In CLion, go to **File** → **Settings** → **Build, Execution,
- Deployment** → **Toolchains**.
-2. Add a new **Toolchain** by clicking the **+** button.
-3. Select **System** as the type (not Visual Studio).
-4. Rename the toolchain to **Visual Studio 6**.
-5. Next to the toolchain name, add the **environment** file by clicking the
- **+** button and pointing to the following file:
-
- ```text
- C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT
- ```
-
- > **Warning**: Make sure to change the file extension from `.BAT` to `.bat` (lowercase) in the path to the
- > environment file in the CLion toolchains window, otherwise CLion may have issues detecting the environment
- > for some reason.
-
-6. Set the paths for the tools:
- - **Build Tool**: Choose the `NMAKE.EXE` file from VC6. For example:
-
- ```text
- C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin\NMAKE.EXE
- ```
-
- - **C Compiler**: The `cl.exe` should be detected automatically. If not, set
- it manually to:
-
- ```text
- C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin\cl.exe
- ```
-
- - **C++ Compiler**: The `cl.exe` will also be detected automatically.
-
-
-
-## Step 3: Configuring the CMake Profiles
-
-1. To configure the CMake profiles, proceed with the following steps:
- - Go to **File** → **Settings** → **Build, Execution, Deployment** → **CMake**.
- (should open automatically after opening the folder containing the cloned source code)
- - Disable the default `Debug` profile.
- - Enable `vc6` - Release build
- - Enable `vc6-debug` - Debug build
- - Enable `vc6-profile` - Profile build
-
- For detailed information about each build configuration and their specific purposes, see the [Build Configurations Overview](https://github.com/TheSuperHackers/GeneralsGameCode/wiki/build_configuration).
-
-## Step 4: Configuring the Installation Path
-
-1. In the **Run/Debug Configurations** dropdown, select the target game: `z_generals` (Zero Hour) or `g_generals` (Generals).
-2. Open the same dropdown, then for the target game you just selected, click the 3 dots on the right, then **Edit...**
-
- > **Note:** This step must be repeated for both `z_generals` and `g_generals` targets.
-
- - Set **Program arguments** with your preferred command line arguments, such as `-win`, `-quickstart`, etc.
- - Set **Executable** to the path of your game install plus the built executable name, for example:
-
- ```text
- C:\Program Files (x86)\Command & Conquer Generals Zero Hour\generalszh.exe (for Zero Hour) or
- C:\Program Files (x86)\Command & Conquer Generals Zero Hour\generalsv.exe (for Generals)
- ```
-
- This ensures that the game starts correctly after clicking the run button in CLion.
-
- - Set **Working directory** to the game directory.
- - Check the **Run as administrator** option.
- - To avoid duplicate builds, remove the **Build** step.
- - In the **Before launch** section, add a new **install** step.
- - Save the configuration, and you are ready to build and run the project.
-
-## Step 5: Compiling and Running the Project
-
- Click **Run** on the toolbar, or build the project and run the executable from the
- game directory.
-
-## Running Debug Builds
-
-> **⚠️ Debug Build Requirements:** To run a debug build of the game, you need to have
-> the following two files in the game directory alongside the built executable:
->
-> - [`MSVCRTD.DLL`](https://github.com/TheSuperHackers/GeneralsWiki/raw/refs/heads/main/SourceCode/Builds/files/MSVCRTD.DLL)
-> Microsoft Visual C++ Runtime Library (Debug)
-> - [`MSVCIRTD.DLL`](https://github.com/TheSuperHackers/GeneralsWiki/raw/refs/heads/main/SourceCode/Builds/files/MSVCIRTD.DLL)
-> Microsoft Visual C++ Internationalization Runtime Library (Debug)
-
-## Notes
-
-- Working with VC6 requires some adjustments, so it’s a good idea to verify
- that the toolchain is working properly.
-- Administrator rights may be required to run VC6 tools, so run CLion as an administrator if
- needed.
diff --git a/SourceCode/Builds/build_with_ea_msvc6.md b/SourceCode/Builds/build_with_ea_msvc6.md
deleted file mode 100644
index 67546f64..00000000
--- a/SourceCode/Builds/build_with_ea_msvc6.md
+++ /dev/null
@@ -1,99 +0,0 @@
-# Build Pure Visual Studio 6 Guide
-
-This guide outlines the steps required to build and compile the source code for *Command & Conquer Generals* and its
-expansion pack *Zero Hour*. The repository includes the source code and supports the Steam Workshop for both
-games ([C&C Generals](https://steamcommunity.com/workshop/browse/?appid=2229870)
-and [C&C Generals - Zero Hour](https://steamcommunity.com/workshop/browse/?appid=2732960)).
-
-[!WARNING]: This build guide is based on the original EA build instructions and has not been verified.
-
-## Dependencies
-
-Before starting the build process, you need to obtain or replace several libraries and tools. These are required for
-successfully compiling the source code:
-
-- **DirectX SDK** (Version 9.0 or higher)
- Expected path: `\Code\Libraries\DirectX\`
-
-- **STLport** (Version 4.5.3)
- Expected path: `\Code\Libraries\STLport-4.5.3`
-
-- **3DSMax 4 SDK**
- Expected path: `\Code\Libraries\Max4SDK\`
-
-- **NVASM**
- Expected path: `\Code\Tools\NVASM\`
-
-- **BYTEmark**
- Expected path: `\Code\Libraries\Source\Benchmark`
-
-- **RAD Miles Sound System SDK**
- Expected path: `\Code\Libraries\Source\WWVegas\Miles6\`
-
-- **RAD Bink SDK**
- Expected path: `\Code\GameEngineDevice\Include\VideoDevice\Bink`
-
-- **SafeDisk API**
- Expected paths:
- `\Code\GameEngine\Include\Common\SafeDisk`
- `\Code\Tools\Launcher\SafeDisk\`
-
-- **Miles Sound System "Asimp3"**
- Expected path: `\Code\Libraries\WPAudio\Asimp3`
-
-- **GameSpy SDK**
- Expected path: `\Code\Libraries\Source\GameSpy\`
-
-- **ZLib** (Version 1.1.4)
- Expected path: `\Code\Libraries\Source\Compression\ZLib\`
-
-- **LZH-Light** (Version 1.0)
- Expected paths:
- `\Code\Libraries\Source\Compression\LZHCompress\CompLibSource`
- `\Code\Libraries\Source\Compression\LZHCompress\CompLibHeader`
-
-Ensure all dependencies are correctly set up before continuing.
-
-## Compiling (Win32 Only)
-
-**Important:** You must own the game to use the compiled binaries. The *Command & Conquer Ultimate Collection* is
-available for purchase on
-the [EA App](https://www.ea.com/en-gb/games/command-and-conquer/command-and-conquer-the-ultimate-collection/buy/pc)
-or [Steam](https://store.steampowered.com/bundle/39394/Command__Conquer_The_Ultimate_Collection/).
-
-### Quick Build (Using Microsoft Visual Studio 6.0)
-
-1. Open the project by loading `rts.dsw` in **Microsoft Visual Studio C++ 6.0** (SP6 recommended for binary matching
- with Generals Patch 1.08 and Zero Hour Patch 1.04).
-2. Go to **Build -> Batch Build** in the menu.
-3. Click the **Rebuild All** button to build all configurations.
-
-This is the simplest way to compile the game.
-
-### Modern Visual Studio (2015 and Newer)
-
-If you want to compile using a more recent version of Visual Studio, follow these steps:
-
-1. Open `rts.dsw` in **Microsoft Visual Studio .NET 2003**.
-2. A new project and solution file will be created.
-3. Open the newly created project in **Visual Studio 2015 or newer**.
-
-**Note:** Modern versions of Visual Studio require significant changes to the codebase, especially for Win64
-compilation, due to stricter C++ standards. You will need to make extensive modifications to ensure compatibility.
-
-### After Building
-
-Once the build is complete, the compiled binaries will be located in the `/Run/` folder inside each game’s root
-directory.
-
-## Known Issues
-
-- **UAC Elevation Requirement:** Windows enforces UAC Elevation for executables with "version", "update", or "install"
- in their filenames. This affects the “versionUpdate” and “buildVersionUpdate” projects.
-
- To resolve this, **rename the output binary** to avoid including these words.
-
-## STLport Compilation Issues
-
-To compile with STLport, you will need to apply a patch. The patch file `stlport.diff` is provided in the repository.
-Make sure you are using **STLport 4.5.3** before applying the patch.
diff --git a/SourceCode/Builds/build_with_msvc22.md b/SourceCode/Builds/build_with_msvc22.md
deleted file mode 100644
index c52f16b8..00000000
--- a/SourceCode/Builds/build_with_msvc22.md
+++ /dev/null
@@ -1,167 +0,0 @@
-# Building and Compiling C&C Generals & Zero Hour on Visual Studio 2022
-
-This guide will walk you through the process of basic setup and compilation of the C&C Generals and Zero Hour source
-code using Visual Studio 2022.
-For build using solutions and more advanced build configurations, see below.
-
-- [Prerequisites](#prerequisites)
-- [Build through Visual Studio 2022](#build-through-visual-studio-2022)
-- [Build through CMake target view](#build-through-cmake-target-view)
-- [Build using command line](#build-using-command-line)
-- [Build using solutions](#build-with-solutions)
-- [Build with VCPKG](#build-with-vcpkg)
-- [Troubleshooting](#troubleshooting)
-
-## Prerequisites
-
-1. **Visual Studio 2022**
-
-- Ensure that the necessary C++ development components, **including MFC**, are installed.
-- For _vcpkg_ builds, you also must have **vcpkg** installed, which you can find under individual components.
-
->[!NOTE]
-> You must have the MFC components installed to compile the source code. You can find it in Visual Studio Installer.
->
-> 
-
-
-2. **Obtain the Source Code**
- - Clone or download the source code
- repository: [TheSuperHackers - GeneralsGameCode](https://github.com/TheSuperHackers/GeneralsGameCode.git).
-
----
-
-## Build through Visual Studio 2022
-
-### 1. Prepare the project
-
-- Open the cloned folder in Visual Studio 2022.
-- Wait for Visual Studio to generate the necessary CMake files.
-
-### 2. Build the Project
-
-- Select the appropriate build configuration:
- - `Build Windows 32bit Release` for a release build.
- - `Build Windows 32bit Debug` for a debug build.
- - `Build Windows 32bit Profile` for a profile build.
- - `Build Windows 32bit VCPKG Release` for a release build with the VCPKG package manager.
- - `Build Windows 32bit VCPKG Debug` for a debug build with the VCPKG package manager.
- - `Build Windows 32bit VCPKG Profile` for a profile build with the VCPKG package manager.
-
-
-
->[!TIP]
-> For more information on the different build configurations, see the [Build Configurations](build_configurations.md)
-page.
-
-- Select the target you want to build:
- - `generalsv.exe` to build the base Generals.
- - `generalszh.exe` to build Zero Hour.
-
-
-
-- Build the project by clicking on the `Build` menu and selecting `Build`.
-- The compiled executable will be placed in the build folder. Example: `build/win32-debug/GeneralsMD/Debug`
-- Install the game executable in the game directory by clicking on the `Install` in `Build` menu. This will copy the
- executable to the retail game directory.
-
----
-
-## Build through CMake target view
-
-- In the Solution Explorer, click on 'switch view' and select 'CMake Targets View'.
-- Expand the 'Genzh' project and right-click on the target you want to build.
-- Select 'Build' to compile the target.
-
-
-
----
-
-## Build using command line
-
-You need to install [CMake](https://cmake.org/download/) and [Ninja](https://github.com/ninja-build/ninja/releases)
-to build the project from the command line.
-
-- In the developer command prompt, open the settings to add the x86 environment terminal.
-- In the pop-up window, click on the 'Add' and set the following: (assuming default installation path)
- - Name: `x86 Native Tools Command Prompt`
- - Shell Location: `C:\Windows\System32\cmd.exe`
- - Arguments: `/k "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars32.bat"`
-- Now you can open the new terminal from the terminal dropdown list.
-
->[!Tip]
-> Alternatively, you can skip the terminal setup and simply open the "x86 Native Tools Command Prompt for
-> VS 2022" from the Start menu. Once opened, navigate to the project directory in the terminal and proceed
-> to run the commands below.
-
-- #### 1. **Release Build**
-
- - **Choose the build configuration:**
- - `cmake --workflow --preset win32` for Release build.
-
- - **Install the game executable in the game directory (assuming the build was successful):**
- - `cmake --install build/win32 --config Release`
-
-- #### 2. **Development and Debug Builds**
-
- - **Choose the build configuration:**
- - `cmake --workflow --preset win32-debug` for Debug build.
- - `cmake --workflow --preset win32-profile` for Profile build.
-
- - **Install the game executable in the game directory (assuming the build was successful):**
- - `cmake --install build/`
-
-- **To build a specific target:**
- - Run `cmake --build build/ --target `
- - Example: `cmake --build build/win32-debug --target z_generals`
- - Or: `cmake --build build/win32-profile --target g_generals`
-
-For more CMake options, see the [CMake Guide](cmake_guide).
-
----
-
-## Build with Solutions
-
-- Generate the Visual Studio solution with the appropriate preset (see above):
-- Run `cmake --preset win32 -G "Visual Studio 17 2022" -A Win32`
-- Navigate to the `build/win32` folder and open the generated solution file.
-- Build the project using the Visual Studio interface.
-
----
-
-## Build with VCPKG
-
-To build configurations that make use of VCPKG you must set the environment variable `VCPKG_ROOT` to the location
-where the VCPKG is found. If you have installed Visual Studio 2022 with the VCPKG component, you will most likely
-find it in one of these paths:
-
-- `C:\Program Files\Microsoft Visual Studio\2022\Community\VC\vcpkg`
-- `C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\vcpkg`
-- `C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\vcpkg`
-
-If you use the stand-alone version of VCPKG, you need to use the folder you installed it in.
-
-### Set environment variable in command prompt
-
-You can set the environment variable in the command prompt. You will have to set it again if you (re)open the prompt:
-
-- `set VCPKG_ROOT=`
-
-### Set environment variable in Windows
-
-You can also permanently set the environment variable in Windows
-
-- Search for `edit the system environment variables` in Windows Search or Control Panel
-- Choose `Environment Variables`
-- Add a new user variable
-- Set the variable name to `VCPKG_ROOT`
-- Set the variable value to the VCPKG path.
-
----
-
-## Troubleshooting
-
-- **Missing DLLs?** Ensure that all required dependencies are installed.
-- **Game not launching?** Verify that all necessary `.BIG` files are correctly placed.
-- **Build errors?** Check Visual Studio settings and dependencies for any issues or delete the `build` folder and try
- building again.
diff --git a/SourceCode/Builds/build_with_msvc22_linux.md b/SourceCode/Builds/build_with_msvc22_linux.md
deleted file mode 100644
index e443a413..00000000
--- a/SourceCode/Builds/build_with_msvc22_linux.md
+++ /dev/null
@@ -1 +0,0 @@
-# This page is a work in progress and is currently incomplete
diff --git a/SourceCode/Builds/build_with_msvc22_x64_jmarshall2323.md b/SourceCode/Builds/build_with_msvc22_x64_jmarshall2323.md
deleted file mode 100644
index 4f8143e8..00000000
--- a/SourceCode/Builds/build_with_msvc22_x64_jmarshall2323.md
+++ /dev/null
@@ -1,88 +0,0 @@
-# Building and Compiling C&C Generals on Visual Studio 2022
-
-> [!WARNING]
-> This build guide refers to a fork that is not from TheSuperHackers. It may include additional modifications, software,
- and changes compared to the official TheSuperHackers version, and is included here for documentation purposes only.
-
-## Prerequisites
-
-- **Install Visual Studio 2022**
- Ensure that the necessary C++ development components, including MFC, are
- installed.
-
-- **Obtain the C&C Generals Source Code**
- Clone or download the source code repository:
- [jmarshall2323 VS2022 Fork](https://github.com/jmarshall2323/CnC_Generals_Zero_Hour.git).
-
-- **Install C&C Generals**
- The game installation is required to access the necessary asset files.
-
-- **Download the necessary SDKs as needed**
- 3ds max sdk: [3ds-max sdk](https://archive.org/details/maxsdk-4.2.0.85).
- Download and extract the contents of the zip file to the folder
- `/Code/Libraries/max4sdk`
-
-## Build Steps
-
-### 1. Copy Required Game Assets
-
-- Navigate to your C&C Generals installation directory, for example if using Steam:
-
- ``` text
- C:\Program Files (x86)\Steam\steamapps\common\Command and Conquer Generals
- ```
-
-- Copy all necessary `.BIG` files into the `Run` folder of your compiled project:
-
- ``` text
- EnglishZH.big
- Generals.big
- INIZH.big
- SpeechZH.big
- W3DZH.big
- (Other required files)
- ```
-
-- Copy the entire `Data` folder to the `Run` folder as well.
-
-### 2. Open the Project in Visual Studio 2022
-
-- Launch Visual Studio 2022 and open the solution file `Code/RTS.sln`.
-
-### 3. Set up Paths correctly
-
-- Add to your PATH environment variable the following folder: `\Code\Tools\NVASM`
-- Load the RTS.sln Solution file in Visual Studio.
-- Navigate to the max2w3d project folder in \toolchain\max2w3d
-- Right-click on the project and select Properties.
-- In the VC++ Directories tab, update the Additional Include Directories to the SDK Includes
- Folder (ie \Code\Libraries\max4sdk\Include)
-- And the same tab, update the Additional Library Directories to the
- SDK Libraries Folder (ie \Code\Libraries\max4sdk\Lib)
-- Navigate to **Properties** → **Debugging**.
-- Set `Working Directory` to your `Run` folder.
-
->[!NOTE]
->Ensure that the `Run` folder within your build directory contains all required game assets.
-
-### 4. Select and Compile the Required Projects
-
-- In the **Solution Explorer**, locate the following projects:
- - `RTS`
- - `WorldBuilder`
-- Right-click each project and select **Build**.
-- Ensure the build process completes without errors.
-
-### 5. Run the Game or World Builder
-
-- After compiling, navigate to the `Run` folder.
-- Launch `RTSD.exe` or `worldbuilder.exe`.
-
-## Troubleshooting
-
-- **Missing DLLs?** Ensure that all required dependencies are installed.
-- **Game not launching?** Verify that all necessary `.BIG` files are correctly
- placed.
-- **Build errors?** Check Visual Studio settings and dependencies for any issues.
-
-### Enjoy Modding and Playing C&C Generals! 🎮
diff --git a/SourceCode/Builds/build_with_msvc6.md b/SourceCode/Builds/build_with_msvc6.md
deleted file mode 100644
index a74c1252..00000000
--- a/SourceCode/Builds/build_with_msvc6.md
+++ /dev/null
@@ -1,202 +0,0 @@
-# Compile Command & Conquer Generals And Zero Hour with VC6
-
-This guide shows how to compile the source code for **Command & Conquer: Generals** and **Zero Hour**. To compile
-the source code, follow the steps outlined below. This process is still in the early stages of development, and
-ongoing efforts may lead to additional tools being compiled from the source code. The focus here is solely on
-compiling the main executable, which can then be placed into the game directory and used to start the game with
-the newly compiled binary. This process utilizes the original compiler from the game's development era to ensure
-compatibility.
-
-## Intended Audience
-
-This guide is intended for software developers, starting from a beginner level. You should be able to
-write programs and execute them. Familiarity with command-line interfaces and configuring environment
-variables when necessary is required.
-
-Even if you do not know C++, you should still be able to compile the source code. However, a basic
-understanding of how C++ is compiled is necessary. This includes knowing what the **compiler** and
-**linker** do, as well as being able to interpret error messages and troubleshoot them effectively.
-
-## Prerequisites and setting up the build environment
-
-Download and install the following tools and software needed for compilation.
-
-> **ℹ️ Setup Note:** For simplicity, this guide will use the installers for Git and CMake and assumes the
-user will use the default install folder for Visual Studio 6.0 Portable.
-
-### Visual Studio 6.0 Portable
-
-**Download:** [Visual Studio 6.0 Portable](https://github.com/itsmattkc/MSVC600)
-
-The original compiler used for game development.
-
-**Installation:**
-
-- Download the portable Visual Studio 6 as a ZIP file from GitHub
-- Extract the `common` and `VC98` folders from the downloaded archive to the default install folder
-- Default installation folder: `C:\Program Files (x86)\Microsoft Visual Studio\`
-
-> Alternatively, you can use the VC6 setup from Archive.org.
-
-### Git
-
-**Download:** [Git](https://git-scm.com/downloads)
-
-Required for cloning the source code repository.
-
-**Installation:**
-
-- Run the Git installer
-
-### CMake *(added to system path)*
-
-**Download:** [CMake 3.31.6](https://github.com/Kitware/CMake/releases/download/v3.31.6/cmake-3.31.6-windows-x86_64.msi)
-or [newer](https://cmake.org/download/#latest)
-
-> **Note:** Not required if using IDEs like CLion or Visual Studio 2022, as these include built-in CMake support.
-
-**Installation:**
-
-- Run the installer for CMake
-- Enable the option to add CMake to the system path during the setup wizard
-
-### Ninja *(added to system path)*
-
-**Download:** [Ninja](https://ninja-build.org/)
-
-> **Note:** Not required if using IDEs like CLion or Visual Studio 2022, as these include a bundled ninja binary.
-
-**Installation:**
-
-- Download the Ninja binary from the [Ninja releases page](https://ninja-build.org/)
-- Extract the `ninja.exe` file to a folder of your choice
-- Add the folder containing `ninja.exe` to your system's PATH environment variable
-
-## Clone
-
-Clone the code from TheSuperHackers:
-
-``` shell
-git clone https://github.com/TheSuperHackers/GeneralsGameCode.git
-```
-
-``` shell
-cd GeneralsGameCode
-```
-
-## Compilation
-
-> Use the Windows Command Prompt aka CMD (not PowerShell, Git Bash, etc.) to run the commands.
-Otherwise, you will receive an error when building the source code.
-
-### Option 1: Activate your VS6 Compiler Environment
-
-> This needs to be done for each new instance of the CMD from which you wish to run build commands.
-
-Execute the setup build environment script. In your CMD, type this (assuming the default installation path):
-
-``` shell
-"C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin\VCVARS32.bat"
-```
-
-### Option 2: Manually set your VS6 Compiler Environment
-
-> These steps need to be repeated every time after a reboot of your computer.
-
-``: Where you have installed VS6.
-
-``: Where you have the source code project.
-
-#### Path
-
-``` shell
-C:\\VB98;
-C:\\VC98\Bin;
-C:\\VC98\Lib;
-C:\\VC98\Include;
-C:\\Common\tools;
-C:\\Common\MSDev98\Bin
-```
-
-#### Environment Variables
-
-``` shell
-set LIB=C:\\VC98\Lib;^
-C:\\VC98\MFC\Lib;^
-C:\\build\vc6
-
-set INCLUDE=C:\\VC98\ATL\Include;^
-C:\\VC98\Include;^
-C:\\VC98\MFC\Include;^
-C:\\VC98\Include
-
-set CC=C:\\VC98\Bin\CL.exe
-set CXX=C:\\VC98\Bin\CL.exe
-
-set MSVCDir=C:\\VC98
-```
-
-### Build the project
-
-Run the following command based on the type of build you want to create:
-
-- For a release build:
-
-``` shell
-cmake --workflow --preset vc6
-```
-
-- For a debug build:
-
-``` shell
-cmake --workflow --preset vc6-debug
-```
-
-- For a profile build:
-
-``` shell
-cmake --workflow --preset vc6-profile
-```
-
-You will find a bunch of files in `build\vc6\` and a file called `generalszh.exe` or `generalsv.exe`.
-
-For detailed information about each build configuration and their specific purposes, see the
-[Build Configurations Overview](https://github.com/TheSuperHackers/GeneralsGameCode/wiki/build_configuration).
-
-### Install the game executable
-
-Run the following command to copy the executable to the retail game directory:
-
-``` shell
-cmake --install build\
-```
-
-Alternatively, you can copy it manually.
-
-### Running Debug Builds
-
-> **⚠️ Debug Build Requirements:** To run a debug build of the game, you need to copy
-> the following two files into the game directory alongside the built executable:
->
-> - [`MSVCRTD.DLL`](https://github.com/TheSuperHackers/GeneralsWiki/raw/refs/heads/main/SourceCode/Builds/files/MSVCRTD.DLL)
-> Microsoft Visual C++ Runtime Library (Debug)
-> - [`MSVCIRTD.DLL`](https://github.com/TheSuperHackers/GeneralsWiki/raw/refs/heads/main/SourceCode/Builds/files/MSVCIRTD.DLL)
-> Microsoft Visual C++ Internationalization Runtime Library (Debug)
-
-## Troubleshooting
-
-### Error: "too long"
-
-- The compiler failed because the total path length for **lib** and **include** exceeded the limit for **VS6**.
-- Your only option is to move your project and dependencies **closer to the root of your drive** or
- rename folders in your project to shorter names.
-
-### Error: "could not find X.h file"
-
-- Ensure that you have correctly set up your `LIB` and `INCLUDE` environment variables.
-- These variables are **essential** for linking and compiling header (`.h`) and library (`.lib`) files.
-
-### Error: "cmake --preset fails"
-
-- Delete the `build` folder and try again.
-- Sometimes, CMake's **cache** gets corrupted, and you need to **start fresh**.
diff --git a/SourceCode/Builds/build_with_msvc6_on_docker.md b/SourceCode/Builds/build_with_msvc6_on_docker.md
deleted file mode 100644
index 1d486a7e..00000000
--- a/SourceCode/Builds/build_with_msvc6_on_docker.md
+++ /dev/null
@@ -1,121 +0,0 @@
-# Build Command & Conquer Zero Hour on Docker with VC6
-
-Docker is a popular platform to standertize environments.
-In this case docker is used to gather all the dependency's
-and compile a **zerohour.exe** windows executable that you
-can now run directly on windows or on wine.
-
-## Prerequisites
-
-You need to know how to execute docker commands and a basic understanding
-how docker works and how to customize the dockerfile if you want to
-compile your own code with it.
-
-## Dockerfile
-
-On your project folder create a file named `Dockerfile` and copy the
-following content inside of it and save the file.
-
-```docker
-FROM ubuntu:24.04
-
-WORKDIR /build
-
-# Install utils
-RUN apt update
-RUN apt install wget gpg unzip git -y
-
-# Install wine32
-RUN dpkg --add-architecture i386
-RUN mkdir -pm755 /etc/apt/keyrings
-RUN wget -O - https://dl.winehq.org/wine-builds/winehq.key | gpg --dearmor -o /etc/apt/keyrings/winehq-archive.key -
-RUN wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/oracular/winehq-oracular.sources
-RUN apt update
-RUN apt install --install-recommends winehq-stable -y
-
-WORKDIR /build/tools/
-
-# Install cmake windows
-RUN wget https://github.com/Kitware/CMake/releases/download/v3.31.6/cmake-3.31.6-windows-x86_64.zip
-RUN unzip cmake-3.31.6-windows-x86_64.zip -d /build/tools/
-RUN mv /build/tools/cmake-3.31.6-windows-x86_64 /build/tools/cmake
-
-# Install git windows
-RUN wget https://github.com/git-for-windows/git/releases/download/v2.49.0-rc1.windows.1/MinGit-2.49.0-rc1-64-bit.zip
-RUN unzip MinGit-2.49.0-rc1-64-bit.zip -d /build/tools/
-RUN mv /build/tools/cmd /build/tools/git
-
-# Install Visual Studio 6 Portable
-RUN wget https://github.com/itsmattkc/MSVC600/archive/refs/heads/master.zip
-RUN unzip master.zip -d /build/tools
-RUN mv /build/tools/MSVC600-master/ /build/tools/vs6
-
-WORKDIR /build
-
-# Setup wine prefix
-ENV WINEDEBUG=-all
-ENV WINEARCH=win64
-ENV WINEPREFIX=/build/prefix64
-RUN wineboot
-
-# Create empty TEMP folder for linking
-RUN mkdir /build/tmp
-ENV TMP="Z:\\build\\tmp"
-ENV TEMP="Z:\\build\\tmp"
-ENV TEMPDIR="Z:\\build\\tmp"
-
-# Setup Visual Studio 6 Environment variables
-ENV VS="Z:\\build\\tools\\vs6"
-ENV MSVCDir="$VS\\vc98"
-ENV WINEPATH="C:\\windows\\system32;\
-$VS\\vc98\\bin;\
-$VS\\vc98\\lib;\
-$VS\\vc98\\include;\
-$VS\\common\\Tools;\
-$VS\\common\\MSDev98\\bin"
-ENV LIB="$VS\\vc98\\Lib;$VS\\vc98\\MFC\\Lib;Z:\\build\\cnc\\build\\vc6"
-ENV INCLUDE="$VS\\vc98\\ATL\\INCLUDE;\
-$VS\\vc98\\INCLUDE;\
-$VS\\vc98\\MFC\\INCLUDE;\
-$VS\\vc98\\Include"
-ENV CC="$VS\\vc98\\bin\\CL.exe"
-ENV CXX="$VS\\vc98\\bin\\CL.exe"
-
-# Clone the source code
-ENV GIT_VERSION_STRING="2.49.0"
-RUN git clone https://github.com/TheSuperHackers/GeneralsGameCode.git
-RUN mv /build/GeneralsGameCode /build/cnc
-
-WORKDIR /build/cnc
-
-# Run cmake
-RUN wine /build/tools/cmake/bin/cmake.exe \
- --preset vc6 \
- -DCMAKE_SYSTEM="Windows" \
- -DCMAKE_SYSTEM_NAME="Windows" \
- -DCMAKE_SIZEOF_VOID_P=4 \
- -DCMAKE_MAKE_PROGRAM="Z:/build/tools/vs6/vc98/bin/nmake.exe" \
- -DCMAKE_C_COMPILER="Z:/build/tools/vs6/vc98/bin/cl.exe" \
- -DCMAKE_CXX_COMPILER="Z:/build/tools/vs6/vc98/bin/cl.exe" \
- -DGIT_EXECUTABLE="Z:/build/tools/git/git.exe" \
- -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \
- -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
- -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \
- -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY \
- -DCMAKE_C_COMPILER_WORKS=1 \
- -DCMAKE_CXX_COMPILER_WORKS=1
-
-WORKDIR /build/cnc/build/vc6
-
-# Compile
-RUN wine cmd /c "set TMP=Z:\build\tmp& set TEMP=Z:\build\tmp& Z:\build\tools\vs6\VC98\Bin\NMAKE.exe"
-
-# Keep the container alive
-CMD tail -f /dev/null
-```
-
-Build the game by executing `docker build -t zerohour .`
-
-After the build you can run the container and use `docker cp`
-or you could mount a volume to `/build` so you can directly
-compile your own code and copy the binary off.
diff --git a/SourceCode/Builds/clion_vc6_win32.md b/SourceCode/Builds/clion_vc6_win32.md
new file mode 100644
index 00000000..a95bb5ae
--- /dev/null
+++ b/SourceCode/Builds/clion_vc6_win32.md
@@ -0,0 +1,117 @@
+# Build with CLion using VC6 or Win32
+
+This guide configures CLion for the `vc6` and `win32` CMake presets. Shared presets, options, targets, output paths, and
+installation steps are documented in the [Building with CMake guide](cmake_guide).
+
+## Requirements
+
+- Windows
+- [CLion](https://www.jetbrains.com/clion/)
+- [Git](https://git-scm.com/downloads)
+- One or both supported Visual C++ toolchains:
+ - [Visual C++ 6](visual_studio_6#install-visual-c-6) for `vc6`
+ - [Visual Studio Build Tools for C++](https://visualstudio.microsoft.com/visual-cpp-build-tools/) with the
+ [required components](visual_studio#requirements) for `win32`
+
+CLion's bundled CMake can be used. The Win32 toolchain can also use the bundled Ninja.
+
+## Configure the toolchains
+
+Open **File > Settings > Build, Execution, Deployment > Toolchains**.
+
+### Visual C++ 6
+
+1. Add a **System** toolchain and name it exactly `Visual Studio 6`.
+2. Add this environment file:
+
+ ```text
+ C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin\VCVARS32.bat
+ ```
+
+ > [!WARNING]
+ > In CLion, ensure the environment file extension is lowercase `.bat`, not `.BAT`. The uppercase
+ > extension can prevent CLion from detecting the environment.
+
+3. Set **Build Tool** to VC6's `NMAKE.EXE`:
+
+ ```text
+ C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin\NMAKE.EXE
+ ```
+
+4. CLion should detect `cl.exe` for both compilers; if it does not, select `VC98\Bin\cl.exe` manually.
+
+### Win32
+
+Add a **Visual Studio** toolchain, select the Visual Studio Build Tools installation, and name it exactly
+`Visual Studio`. Keep the bundled Ninja build tool.
+
+The exact names matter because `CMakePresets.json` uses them to select the correct toolchain automatically.
+
+## Clone and open the source
+
+Clone the repository:
+
+```batch
+git clone https://github.com/TheSuperHackers/GeneralsGameCode.git
+```
+
+Open the cloned `GeneralsGameCode` directory in CLion.
+
+## Configure the CMake profiles
+
+After opening the project, CLion imports the profiles from `CMakePresets.json`:
+
+1. Open **File > Settings > Build, Execution, Deployment > CMake**.
+2. Disable the default `Debug` profile.
+3. Enable the profiles for either toolchain or both:
+
+ | Build | Visual C++ 6 | Win32 |
+ | ------- | ------------- | --------------- |
+ | Release | `vc6` | `win32` |
+ | Debug | `vc6-debug` | `win32-debug` |
+ | Profile | `vc6-profile` | `win32-profile` |
+
+4. Wait for CMake to finish loading the selected profiles.
+
+> **Retail compatibility:** Only VC6 Release builds are compatible with retail multiplayer and replays.
+
+## Configure running
+
+Configure both `g_generals` and `z_generals` separately:
+
+1. Select the game target from the **Run/Debug Configurations** dropdown, open the dropdown again, and choose **Edit
+ Configurations**.
+2. Set optional **Program arguments**, such as `-win` or `-quickstart`.
+3. Set **Executable** to the installed game executable:
+
+ ```text
+ C:\Path\To\Generals\generalsv.exe
+ C:\Path\To\Zero Hour\generalszh.exe
+ ```
+
+4. Set **Working directory** to the corresponding game directory.
+5. Under **Before launch**, remove the **Build** step and add the top-level `install` target instead.
+6. Enable **Run as administrator** if the install target is in a protected directory such as `Program Files`.
+
+## Build and run
+
+Select a CMake profile and the `g_generals` or `z_generals` configuration, then click **Run**. The `install` step copies
+the built executable into the game directory before CLion launches it.
+
+See [Install](cmake_guide#install) to set the game directories manually.
+
+## Troubleshooting
+
+### A preset is missing
+
+Confirm that CLion opened the repository root containing `CMakePresets.json`. Use **Help > Find Action > Load CMake
+Presets**, or reset the CMake cache and reload the project.
+
+### A toolchain is not selected
+
+Confirm that the toolchains are named exactly `Visual Studio 6` and `Visual Studio`, then reload the CMake project.
+
+### The VC6 compiler is not found
+
+Confirm that the VC6 toolchain uses `VCVARS32.bat` as its environment file. If necessary, select `VC98\Bin\cl.exe` as
+both compilers and reset the affected CMake profile.
diff --git a/SourceCode/Builds/cmake_guide.md b/SourceCode/Builds/cmake_guide.md
index f884467b..85b0ca73 100644
--- a/SourceCode/Builds/cmake_guide.md
+++ b/SourceCode/Builds/cmake_guide.md
@@ -1,241 +1,167 @@
-# **CMake Command Line Usage Guide**
+# Building with CMake
-This guide provides an overview of how to configure and build **Generals** and its expansion **Zero Hour** using **CMake**
-via the command line. It covers the various options and flags defined in the CMake files that control the build process,
-allowing you to choose different components of the game and tools to build.
+CMake provides a common workflow for building GeneralsGameCode with Visual C++ 6 or a modern compiler. Run the commands
+on this page from the repository root.
-For more details on using **Visual Studio 2022**, **Visual Studio 6**, or **CLion**, please refer to the respective
-guides.
+## Requirements
-> [!NOTE]
-> CMake retains previous configurations. If you encounter any issues or strange behavior, it is recommended to delete
-> the `build` directory and start fresh to ensure the build process uses the latest settings.
-
-- [Build Configuration (Preset)](#1-build-configuration-preset)
-- [Selecting Game and Tools](#2-selecting-game-and-tools)
-- [Building the Project](#3-building-the-project)
-- [Install the Project](#4-install-the-project)
-- [Define a Custom Installation Path](#5-define-a-custom-installation-path)
-- [Building Specific Targets](#6-building-specific-targets)
-- [Examples](#7-examples)
-
----
-
-## 1. **Build Configuration (Preset)**
-
-The **preset** defines the predefined build configuration. The available presets for this project are:
+- [Git](https://git-scm.com/downloads)
+- [CMake](https://cmake.org/download/) 3.25 or newer, added to `PATH`
+- [Ninja](https://ninja-build.org/), added to `PATH`
+- The toolchain required by your chosen preset
-### For Visual Studio 2022 or Ninja
-
-- `win32`: Release build.
-- `win32-debug`: Debug build.
-- `win32-profile`: Profile build.
-
-### For Visual Studio 6
+> [!NOTE]
+> The `PATH` requirements apply whenever you type these commands in a terminal, including an IDE's built-in
+> terminal, because it runs a normal shell. They do not apply when using the IDE's CMake integration through its
+> configure and build actions; in that case, the IDE can use its bundled CMake and Ninja tools directly.
-- `vc6`: Release build.
-- `vc6-debug`: Debug build.
-- `vc6-profile`: Profile build.
+For Visual C++ 6 setup, see [CMake and Visual Studio 6](visual_studio_6).
-### Usage
+## Build presets
-```bash
-cmake --preset
-```
+These are the presets most contributors will use:
-### Using the Default Workflow
+| Preset | Toolchain | Purpose |
+| --------------- | ----------------- | ------------------------------------------------------------------------- |
+| `vc6` | Visual C++ 6 | Release build and the retail-compatible path |
+| `vc6-debug` | Visual C++ 6 | Unoptimized development build; [runtime requirements](#vc6-debug-runtime) |
+| `vc6-profile` | Visual C++ 6 | Optimized profiling build |
+| `win32` | Modern Visual C++ | Release build |
+| `win32-debug` | Modern Visual C++ | Unoptimized development build |
+| `win32-profile` | Modern Visual C++ | Optimized profiling build |
-You can simplify the build process by using the **workflow** option, which automatically selects the appropriate
-configurations based on the preset and the project’s default settings. This eliminates the need to manually specify
-build options. For example, to perform a release build with the default configuration, you can run:
+For example, configure and build a VC6 Release build with:
-```bash
-cmake --workflow --preset win32
+```shell
+cmake --workflow --preset vc6
```
-After the build process is complete, you can proceed with the installation using the default settings, as outlined in
-the installation section (not the custom path). To install the project, simply use:
+Use this command to see every preset in the current checkout, including specialized presets not covered here:
-```bash
-cmake --install build/win32 --config Release
+```shell
+cmake --list-presets=all
```
-This will install the project to the default installation location based on the preset configuration.
-
----
-
-## 2. **Selecting Game and Tools**
+> **Retail compatibility:** Use the `vc6` Release preset for builds compatible with retail multiplayer and replays. VC6
+> Debug builds and builds produced with modern Visual Studio toolchains are not retail-compatible.
-You can specify various options to select which parts of the project to build.
+### VC6 Debug runtime
-### The available options are
+VC6 Debug builds require these Microsoft debug runtime libraries in the same directory as the built executable:
-- `DGENZH_BUILD_GENERALS`: Build the base Generals code, default is `ON`.
-- `DGENZH_BUILD_GENERALS_TOOLS`: Build tools for Generals, default is `ON`.
-- `DGENZH_BUILD_GENERALS_EXTRAS`: Build additional tools/tests for Generals, default is `OFF`.
-- `DGENZH_BUILD_ZEROHOUR`: Build the Zero Hour code, default is `ON`.
-- `DGENZH_BUILD_ZEROHOUR_TOOLS`: Build tools for Zero Hour, default is `ON`.
-- `DGENZH_BUILD_ZEROHOUR_EXTRAS`: Build additional tools/tests for Zero Hour, default is `OFF`.
+- `MSVCP60D.DLL`
+- `MSVCRTD.DLL`
-You can find the list of tools included in the targets list below.
+The project and this wiki cannot distribute these files. Users must obtain them independently through legitimate means.
-### Example Usage
+## Configure and build
-To build Zero Hour and its tools while excluding Generals:
+The workflow command above configures and builds the project in one step. Replace `vc6` with another preset when needed.
+To run the two steps separately:
-```bash
-cmake -DGENZH_BUILD_ZEROHOUR=ON -DGENZH_BUILD_GENERALS=OFF -DGENZH_BUILD_ZEROHOUR_TOOLS=ON
+```shell
+cmake --preset vc6
+cmake --build --preset vc6
```
----
-
-## 3. **Building the Project**
-
-After configuring the project with CMake, you can proceed with the build step. To build the project in the appropriate
-mode, use:
-
-```bash
-cmake --build build/win32
-```
-
-> [!NOTE]
-> Replace the folder preset name as needed.
+CMake stores each configuration under `build/`.
-The build process will place the compiled executable files in the appropriate directories based on the configuration,
-for example, `build/win32/GeneralsMD/Release` for the release build of Zero Hour.
+## Select games and tools
----
+Both games and their tools are enabled by default. The common build options are:
-## 4. **Install the Project**
+| Option | Default | Controls |
+| --------------------------- | ------- | ------------------------------- |
+| `RTS_BUILD_GENERALS` | `ON` | Generals |
+| `RTS_BUILD_ZEROHOUR` | `ON` | Zero Hour |
+| `RTS_BUILD_CORE_TOOLS` | `ON` | Tools shared by both games |
+| `RTS_BUILD_GENERALS_TOOLS` | `ON` | Generals tools |
+| `RTS_BUILD_ZEROHOUR_TOOLS` | `ON` | Zero Hour tools |
+| `RTS_BUILD_CORE_EXTRAS` | `OFF` | Shared extra tools and tests |
+| `RTS_BUILD_GENERALS_EXTRAS` | `OFF` | Generals extra tools and tests |
+| `RTS_BUILD_ZEROHOUR_EXTRAS` | `OFF` | Zero Hour extra tools and tests |
-To install the built project, use:
+Pass options while configuring. This example builds Zero Hour and its tools without Generals:
-```bash
-cmake --install build/win32
+```shell
+cmake --preset vc6 -DRTS_BUILD_GENERALS=OFF -DRTS_BUILD_ZEROHOUR=ON -DRTS_BUILD_ZEROHOUR_TOOLS=ON
+cmake --build --preset vc6
```
-> [!NOTE]
-> Replace the folder preset name as needed. This installs the executable project in the specified paths (see next
-> section).
-
-> [!IMPORTANT]
-> In the `win32` preset, use also `--config Release` to install the release executable, because the default installation
-> path looks in the debug folder.
-
----
+CMake retains these choices in the preset's build directory until it is reconfigured or removed.
-## 5. **Define a Custom Installation Path**
+## Build a target
-> [!NOTE]
-> To define a custom installation path, it must be set during the preset configuration. The installation path cannot be
-> changed after the build is complete.
+Common targets include:
-By default, CMake installs the build executable in the retail game directory. If you want to specify a custom
-installation path, use the following option:
+| Target | Output |
+| ----------------------------------------- | ------------------------------ |
+| `g_generals` / `z_generals` | Game executable |
+| `g_worldbuilder` / `z_worldbuilder` | World Builder |
+| `g_guiedit` / `z_guiedit` | GUI Editor |
+| `g_imagepacker` / `z_imagepacker` | Image Packer |
+| `g_mapcachebuilder` / `z_mapcachebuilder` | Map Cache Builder |
+| `core_debugwindow` | Shared Debug Window library |
+| `core_particleeditor` | Shared Particle Editor library |
-For Generals:
+Build one target by adding `--target`:
-```bash
-cmake -DGENZH_GENERALS_INSTALL_PREFIX="/path/to/install" .
+```shell
+cmake --build --preset vc6 --target z_generals
```
-For the Zero Hour expansion:
+List the targets available in a configured preset with:
-```bash
-cmake -DGENZH_ZEROHOUR_INSTALL_PREFIX="/path/to/install" .
+```shell
+cmake --build --preset vc6 --target help
```
----
+Only enabled games and tools produce targets. Installing after a partial build may fail if another enabled installable
+target has not been built.
-## 6. **Building Specific Targets**
+## Build output
-> [!IMPORTANT]
-> Please note that specific **targets** (such as `z_generals` or `z_worldbuilder`) will only work if the corresponding
-> game source tree is enabled through the appropriate **preset** (e.g., `DGENZH_BUILD_ZEROHOUR` or
-> `DGENZH_BUILD_ZEROHOUR_TOOLS`). Make sure the relevant game sources are included in the configuration before
-> attempting to build the **targets**.
+VC6 places the main executables at:
-You can build specific targets by specifying them in the build command. The common targets are:
+- `build//Generals/generalsv.exe`
+- `build//GeneralsMD/generalszh.exe`
-> [!TIP]
-> The list below are suitable zero hour targets, to build base Generals targets, replace `z` with `g`.
+The modern `win32` presets are multi-configuration builds, so their output paths also contain `Release` or `Debug`.
-- `z_generals`: Build the Zero Hour code.
+## Install
-### Tools
+On Windows, CMake tries to find EA App, CD, The First Decade, and Steam installations from the registry. Run each
+installed game at least once first to ensure its registry entries exist.
-- `z_debugwindow`: Build the Debug Window tool.
-- `z_guiedit`: Build the GUI Editor tool.
-- `z_imagepacker`: Build the Image Packer tool.
-- `z_mapcachebuilder`: Build the Map Cache Builder tool.
-- `z_particleeditor`: Build the Particle Editor tool.
-- `z_worldbuilder`: Build the World Builder tool.
-
-### Usage
+Install a VC6 Release build with:
-```bash
-cmake --build build/win32 --target z_generals
+```shell
+cmake --install build/vc6
```
-Replace the folder preset name as needed.
-
-> [!NOTE]
-> If from the beginning you build only with specific targets, the installation step will fail because the other targets
-> are not built yet. To fix this, you need to build all targets or build the missing targets before installing. Or you
-> can install the targets manually by copying the files to the correct directories from the build folder.
-
----
-
-## 7. **Examples**
-
-### **Build Zero Hour with Debug Configuration and Tools:**
-
-To build the Zero Hour code along with its tools in debug mode, use the following command:
+Modern `win32` builds require the configuration name:
-```bash
-# Step 1: Configure the build with a preset and additional options
-cmake --preset win32-debug -DGENZH_BUILD_ZEROHOUR=ON -DGENZH_BUILD_ZEROHOUR_TOOLS=ON
-
-# Step 2: Build the project
-cmake --build build/win32-debug
-
-# Step 3: Install the project to the default installation path
-cmake --install build/win32-debug
+```shell
+cmake --install build/win32 --config Release
```
-
-### **Build Only World Builder Tool:**
-
-To build only the World Builder tool for Zero Hour, use the following command:
-```bash
-# Step 1: Configure the build with specific target
-cmake --preset win32 --target z_worldbuilder
+To use explicit game directories, set the install paths while configuring:
-# Step 2: Build the project
-cmake --build build/win32
-
-# Step 3: Install the project to the default installation path
-cmake --install build/win32 --config Release
+```shell
+cmake --preset vc6 -DRTS_INSTALL_PREFIX_GENERALS="C:\Games\Generals Test" -DRTS_INSTALL_PREFIX_ZEROHOUR="C:\Games\Zero Hour Test"
+cmake --build --preset vc6
+cmake --install build/vc6
```
-
-### **Build Generals with Extras and Custom Installation Path:**
-To build the Generals code with additional extras, configure the build for release, and then install the executable to a
-custom directory, you can run the following commands in sequence:
+Use `RTS_INSTALL_PREFIX_GENERALS` and `RTS_INSTALL_PREFIX_ZEROHOUR` independently when building only one game.
-```bash
-# Step 1: Configure the build with a preset and additional options
-cmake --preset win32 -DGENZH_BUILD_GENERALS=ON -DGENZH_BUILD_GENERALS_EXTRAS=ON -DGENZH_GENERALS_INSTALL_PREFIX="/custom/install/path"
+## Reset a configuration
-# Step 2: Build the project
-cmake --build build/win32
+CMake caches compiler, option, and installation settings. If a configuration starts behaving unexpectedly, discard that
+preset's cache and configure it again:
-# Step 3: Install the project to the specified custom directory with release configuration
-cmake --install build/win32 --config Release
+```shell
+cmake --fresh --preset vc6
```
----
-
-**Reminder:**
-If you encounter issues from previous configurations, make sure to clear the `build` directory and restart the
-configuration process.
+Replace `vc6` with the affected preset. Other build configurations are left unchanged.
diff --git a/SourceCode/Builds/files/MSVCIRTD.DLL b/SourceCode/Builds/files/MSVCIRTD.DLL
deleted file mode 100644
index 1b8312e2..00000000
Binary files a/SourceCode/Builds/files/MSVCIRTD.DLL and /dev/null differ
diff --git a/SourceCode/Builds/files/MSVCRTD.DLL b/SourceCode/Builds/files/MSVCRTD.DLL
deleted file mode 100644
index 1eb91b8c..00000000
Binary files a/SourceCode/Builds/files/MSVCRTD.DLL and /dev/null differ
diff --git a/SourceCode/Builds/files/buildoptions.jpg b/SourceCode/Builds/files/buildoptions.jpg
deleted file mode 100644
index 032633e1..00000000
Binary files a/SourceCode/Builds/files/buildoptions.jpg and /dev/null differ
diff --git a/SourceCode/Builds/files/clionvc6toolchain.png b/SourceCode/Builds/files/clionvc6toolchain.png
deleted file mode 100644
index 6a6e1c5c..00000000
Binary files a/SourceCode/Builds/files/clionvc6toolchain.png and /dev/null differ
diff --git a/SourceCode/Builds/linux_docker.md b/SourceCode/Builds/linux_docker.md
new file mode 100644
index 00000000..9661d147
--- /dev/null
+++ b/SourceCode/Builds/linux_docker.md
@@ -0,0 +1,143 @@
+# Build on Linux with Docker
+
+GeneralsGameCode provides scripts that build the project in a Docker container on Linux. The container runs the Visual
+C++ 6 toolchain through Wine and produces 32-bit Windows executables.
+
+> [!CAUTION]
+> This guide has not been officially verified against the current repository scripts. Linux distributions,
+> Docker installations, Wine prefixes, and game installations vary, so some setup or troubleshooting may be required.
+
+## Requirements
+
+- A Linux distribution
+- [Docker](https://docs.docker.com/engine/install/)
+- [Git](https://git-scm.com/downloads/linux)
+- Wine or Proton if you intend to run the resulting executables on Linux
+- An existing Generals and/or Zero Hour installation with the original game data
+
+Clone the repository and enter its directory:
+
+```bash
+git clone https://github.com/TheSuperHackers/GeneralsGameCode.git
+cd GeneralsGameCode
+```
+
+Confirm that Docker is running and accessible to your user:
+
+```bash
+docker info
+```
+
+If Docker reports a permission error, follow Docker's
+[Linux post-installation instructions](https://docs.docker.com/engine/install/linux-postinstall/).
+
+## Build
+
+Build both Generals and Zero Hour:
+
+```bash
+./scripts/docker-build.sh
+```
+
+The first build creates the `zerohour-build` Docker image and downloads the toolchain, so it takes longer than later
+builds.
+
+Common build commands include:
+
+| Command | Purpose |
+| ----------------------------------------------- | ------------------------------------- |
+| `./scripts/docker-build.sh --game zh` | Build Zero Hour and its tools |
+| `./scripts/docker-build.sh --game generals` | Build Generals and its tools |
+| `./scripts/docker-build.sh --target z_generals` | Build one CMake target |
+| `./scripts/docker-build.sh --clean` | Remove `build/docker` before building |
+| `./scripts/docker-build.sh --cmake` | Force CMake to configure again |
+| `./scripts/docker-build.sh --interactive` | Open a shell in the build container |
+
+Run `./scripts/docker-build.sh --help` for the options supported by your current checkout. CMake target names are
+documented in [Building with CMake](cmake_guide#build-a-target).
+
+Build output is stored under `build/docker`:
+
+| Directory | Contents |
+| -------------------------- | --------------------- |
+| `build/docker/GeneralsMD/` | Zero Hour executables |
+| `build/docker/Generals/` | Generals executables |
+| `build/docker/Core/` | Shared tools and DLLs |
+
+## Install into an existing game
+
+The installation script expects the game directory that contains the `Data` directory. It backs up original executables
+before replacing them and preserves the game's original audio and video libraries.
+
+Ask the script to find a Wine, Proton, or supported Windows installation:
+
+```bash
+./scripts/docker-install.sh --detect
+```
+
+Alternatively, pass the game directory explicitly:
+
+```bash
+./scripts/docker-install.sh "/path/to/Command and Conquer Generals Zero Hour"
+```
+
+Other useful commands include:
+
+```bash
+# Install a Generals build instead of Zero Hour
+./scripts/docker-install.sh --game generals "/path/to/Command and Conquer Generals"
+
+# Show the files that would be installed without changing them
+./scripts/docker-install.sh --dry-run --detect
+
+# Restore files from the backups created by the installation script
+./scripts/docker-install.sh --restore "/path/to/Command and Conquer Generals Zero Hour"
+```
+
+## Run with Wine
+
+After installing the build, run it from the game's `Data` directory:
+
+```bash
+cd "/path/to/Command and Conquer Generals Zero Hour/Data"
+wine generalszh.exe
+```
+
+The correct Wine or Proton configuration depends on the game installation and Linux distribution. If the game fails to
+start, first confirm that the unmodified retail executable works in the same prefix.
+
+## Troubleshooting
+
+### Docker is unavailable or permission is denied
+
+Run `docker info`. If the daemon is stopped, start it using the service manager for your distribution. If the daemon is
+running but access is denied, follow Docker's post-installation guidance linked above.
+
+### The build directory or executables are missing
+
+Run the build script before the installation script:
+
+```bash
+./scripts/docker-build.sh
+```
+
+If configuration files have changed or the cached build is invalid, retry with `--cmake`. Use `--clean` only when a
+fresh `build/docker` directory is required.
+
+### The game installation is not detected
+
+Pass its root directory explicitly. The supplied directory must contain a `Data` subdirectory:
+
+```bash
+./scripts/docker-install.sh "/path/to/game"
+```
+
+### The documented commands no longer match the scripts
+
+The scripts and container files in GeneralsGameCode are the source of truth:
+
+- [`docker-build.sh`](https://github.com/TheSuperHackers/GeneralsGameCode/blob/main/scripts/docker-build.sh)
+- [`docker-install.sh`](https://github.com/TheSuperHackers/GeneralsGameCode/blob/main/scripts/docker-install.sh)
+- [Docker build files](https://github.com/TheSuperHackers/GeneralsGameCode/tree/main/resources/dockerbuild)
+
+Use each script's `--help` output before relying on an option that may have changed.
diff --git a/SourceCode/Builds/visual_studio.md b/SourceCode/Builds/visual_studio.md
new file mode 100644
index 00000000..77ce112f
--- /dev/null
+++ b/SourceCode/Builds/visual_studio.md
@@ -0,0 +1,109 @@
+# Visual Studio 2022 and 2026
+
+This guide uses Visual Studio's built-in CMake support to build GeneralsGameCode with a modern compiler. The shared
+presets, options, targets, output paths, and installation steps are documented in the
+[Building with CMake guide](cmake_guide).
+
+Visual Studio 2022 and 2026 use the same steps.
+
+## Requirements
+
+- Windows
+- [Visual Studio 2022 or 2026](https://visualstudio.microsoft.com/downloads/)
+- [Git](https://git-scm.com/downloads)
+
+In Visual Studio Installer, select **Desktop development with C++** and enable:
+
+- **Windows 11 SDK (10.0.26100.x)**
+- **C++ CMake tools for Windows**
+
+For Visual Studio 2022, also enable:
+
+- **MSVC v143 - VS 2022 C++ x64/x86 build tools (Latest)**
+- **C++ MFC for latest v143 build tools (x86 & x64)**
+
+For Visual Studio 2026, enable these v143 compatibility components:
+
+- **MSVC v143 - VS 2022 C++ x64/x86 build tools (v14.44)**
+- **C++ v14.44 (17.14) MFC for v143 build tools (x86 & x64)**
+
+Standalone CMake and Ninja installations are not required when building through the IDE.
+
+## Clone and open the source
+
+Clone the repository:
+
+```batch
+git clone https://github.com/TheSuperHackers/GeneralsGameCode.git
+```
+
+In Visual Studio, select **File > Open > Folder** and open the cloned `GeneralsGameCode` directory. Visual Studio reads
+`CMakePresets.json` and starts configuring the project. The first configure downloads several dependencies, so it
+requires an internet connection.
+
+## Select a preset
+
+On the Visual Studio toolbar, select **Local Machine**, then choose matching configure and build presets:
+
+| Build | Configure preset | Build preset |
+| ------- | --------------------- | --------------------------- |
+| Release | Windows 32bit Release | Build Windows 32bit Release |
+| Debug | Windows 32bit Debug | Build Windows 32bit Debug |
+| Profile | Windows 32bit Profile | Build Windows 32bit Profile |
+
+Wait for the CMake output to report that generation finished before building.
+
+> **Retail compatibility:** Win32 builds are not compatible with retail multiplayer or replays.
+
+## Build
+
+Select **Build > Build All** to build every enabled target.
+
+To build one target, switch Solution Explorer to **CMake Targets View**, right-click a target such as `g_generals` or
+`z_generals`, and select **Build**.
+
+Release game executables are written to:
+
+- `build/win32/Generals/Release/generalsv.exe`
+- `build/win32/GeneralsMD/Release/generalszh.exe`
+
+## Install
+
+Run each installed game at least once so CMake can find its directory from the Windows registry. In **CMake Targets
+View**, right-click the top-level `install` target and select **Build**. This builds the active configuration if needed,
+then copies the enabled executables and debug symbols into the detected game directories.
+
+See [Install](cmake_guide#install) to set the game directories manually. Administrator permission may be
+required when a game is installed under `Program Files`.
+
+## Run
+
+On the Visual Studio toolbar, open **Select Startup Item** and choose `g_generals` or `z_generals`. Select the green
+**Start** button or press **F5** to build and run it with the debugger. To run without the debugger, select **Debug >
+Start Without Debugging** or press **Ctrl+F5**.
+
+See the [Building with CMake guide](cmake_guide) for Debug and Profile output, game and tool selection, and
+individual targets.
+
+## Troubleshooting
+
+### A preset is missing
+
+Confirm that Visual Studio opened the repository root containing `CMakePresets.json`. If needed, enable CMake Presets
+under **Tools > Options > CMake > General**, close the folder, and open it again.
+
+### MFC headers or libraries are missing
+
+Open Visual Studio Installer, modify the installation, and add the MFC component matching your Visual Studio version
+from the [requirements](#requirements). In Visual Studio 2026, confirm that the v143 compatibility MFC component is
+enabled.
+
+### Configuration or dependency download fails
+
+Check the CMake output for the first error. Confirm that Git can access GitHub, then select **Project > Delete Cache and
+Reconfigure**.
+
+### A path is too long
+
+Move the repository closer to the drive root, such as `C:\GeneralsGameCode`, then delete the CMake cache and
+reconfigure.
diff --git a/SourceCode/Builds/visual_studio_6.md b/SourceCode/Builds/visual_studio_6.md
new file mode 100644
index 00000000..f8b36e83
--- /dev/null
+++ b/SourceCode/Builds/visual_studio_6.md
@@ -0,0 +1,94 @@
+# CMake and Visual Studio 6
+
+This guide sets up the original Visual C++ 6 compiler for the GeneralsGameCode CMake build. The shared presets, options,
+targets, output paths, installation steps, and configuration-specific requirements are documented in the
+[Building with CMake guide](cmake_guide).
+
+## Requirements
+
+- Windows
+- [Visual Studio 6.0 Portable](https://github.com/itsmattkc/MSVC600)
+- [Git](https://git-scm.com/downloads)
+- [CMake](https://cmake.org/download/) 3.25 or newer, added to `PATH`
+- [Ninja](https://ninja-build.org/), added to `PATH`
+
+## Install Visual C++ 6
+
+Download the Visual Studio 6.0 Portable archive and extract its `Common` and `VC98` directories into:
+
+```text
+C:\Program Files (x86)\Microsoft Visual Studio
+```
+
+The compiler environment script should then be located at:
+
+```text
+C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin\VCVARS32.bat
+```
+
+If you install it elsewhere, replace this path in the commands below.
+
+## Clone the source
+
+> [!IMPORTANT]
+> Use Command Prompt (`cmd.exe`) for the terminal commands below, not PowerShell, Git Bash, or another
+> shell. The VC6 environment must be activated again in every new Command Prompt instance.
+
+Clone the repository:
+
+```batch
+git clone https://github.com/TheSuperHackers/GeneralsGameCode.git
+cd GeneralsGameCode
+```
+
+## Activate the compiler
+
+Activate the VC6 environment:
+
+```batch
+call "C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin\VCVARS32.bat"
+```
+
+Verify that the compiler, CMake, and Ninja are available:
+
+```batch
+where cl
+cl
+cmake --version
+ninja --version
+```
+
+`cl` should report Microsoft 32-bit C/C++ compiler version 12.
+
+## Build
+
+From the repository root, configure and build the VC6 Release preset:
+
+```batch
+cmake --workflow --preset vc6
+```
+
+See the [Building with CMake guide](cmake_guide) for Debug and Profile builds, game and tool selection,
+individual targets, installation, and retail compatibility.
+
+## Troubleshooting
+
+### The compiler is not found
+
+Run `VCVARS32.bat` again in the current Command Prompt. Confirm that `where cl` resolves to the VC6 `CL.EXE`, not a
+newer Visual Studio compiler.
+
+### A path is too long
+
+VC6 has much smaller path-length limits than modern compilers. Move the repository closer to the drive root, such as
+`C:\GeneralsGameCode`, and configure it again.
+
+### A header or library is missing
+
+Run `VCVARS32.bat` and check that `INCLUDE` and `LIB` contain the VC6 directories. If the wrong compiler was cached,
+reset the affected preset as described in the
+[Building with CMake guide](cmake_guide#reset-a-configuration).
+
+### A VC6 Debug build does not start
+
+See the centralized [VC6 Debug runtime requirements](cmake_guide#vc6-debug-runtime).
diff --git a/SourceCode/Builds/RunReleaseBuildsonMacOS.md b/SourceCode/Guides/RunReleaseBuildsonMacOS.md
similarity index 100%
rename from SourceCode/Builds/RunReleaseBuildsonMacOS.md
rename to SourceCode/Guides/RunReleaseBuildsonMacOS.md
diff --git a/SourceCode/Home.md b/SourceCode/Home.md
index 405de720..5fda0b21 100644
--- a/SourceCode/Home.md
+++ b/SourceCode/Home.md
@@ -18,7 +18,6 @@ new to the project, here’s how you can contribute:
- Check out the [**Build Guides**](build_guides) for instructions on how to compile the game code on
different platforms.
-- Learn about the project's **dependencies** and **libraries** in the [Dependencies](dependencies) section.
- Look through the **community forks** and other variations of the project in the [Forks](forks) section.
- If you're an experienced developer, you can start contributing by reviewing and submitting **pull requests** or
opening **issues**.
@@ -26,41 +25,11 @@ new to the project, here’s how you can contribute:
## **Quick Links**
- [Build Guides for Different Platforms](build_guides)
-- [Dependencies and Libraries](dependencies)
+- [Build Configurations Overview](build_configuration)
- [Replays for testing](replay_testing)
+- [In-Game Debug Commands](ingame_debug_commands)
+- [Added and Changed](engine_changes)
- [Community Forks](forks)
-- [Tools for Developers](tools)
-- [FAQ](faq)
-
-## **Building the Game Code**
-
-Here you'll find detailed guides on how to compile and build *Generals: Zero Hour* from source code for various
-platforms:
-
-- **Windows**: Instructions for building on Windows using Visual Studio.
-- **Linux**: Instructions for building on Linux with the necessary tools and libraries.
-- **macOS**: Instructions for building on macOS, with support for cross-compiling where necessary.
-
-These guides will help you get set up and running, so you can start working on the game code in no time.
-
-## **Dependencies & Libraries**
-
-This section outlines all the essential dependencies and libraries you need in order to successfully build and run the
-source code. It includes:
-
-- **External Libraries**: Instructions on downloading and configuring the third-party libraries required by the project.
-- **Codebase Structure**: Understanding the layout and architecture of the game code.
-
-## **Tools for Developers**
-
-As a developer, you will need a set of tools to interact with the codebase efficiently. Here are some tools that can
-assist you:
-
-- **Code Editors/IDEs**: Recommended editors/IDEs for working with the game’s code (e.g., Visual Studio, Eclipse, etc.).
-- **Debugging Tools**: Recommended tools for debugging and troubleshooting.
-- **Version Control**: Using Git for managing changes, commits, and collaboration.
-
-Check out the [**Tools for Developers**](tools) page for more information.
## **Community and Forks**
@@ -72,6 +41,10 @@ For a list of active forks, visit the [**Community Forks**](forks) page.
## **Contact and Community**
-For any questions, discussions, or to get involved in the community, check out the **[Contact and Community Page](contact_community)**.
-Join our forums, Discord channels, or GitHub discussions to communicate with other
-contributors and developers.
+For questions, discussions, or to get involved, join the community on Discord:
+
+- [Community Outpost](https://discord.com/invite/WzxQDZersE)
+- [The Assembly Armada](https://discord.gg/UnWK2Tw)
+
+You can also open an [issue](https://github.com/TheSuperHackers/GeneralsGameCode/issues) or start a
+[discussion](https://github.com/TheSuperHackers/GeneralsGameCode/discussions) on GitHub.
diff --git a/SourceCode/Tools/crcdiff.md b/SourceCode/Tools/crcdiff.md
deleted file mode 100644
index e443a413..00000000
--- a/SourceCode/Tools/crcdiff.md
+++ /dev/null
@@ -1 +0,0 @@
-# This page is a work in progress and is currently incomplete
diff --git a/SourceCode/Tools/safedisklauncher.md b/SourceCode/Tools/safedisklauncher.md
deleted file mode 100644
index e443a413..00000000
--- a/SourceCode/Tools/safedisklauncher.md
+++ /dev/null
@@ -1 +0,0 @@
-# This page is a work in progress and is currently incomplete
diff --git a/SourceCode/Tools/tools.md b/SourceCode/Tools/tools.md
deleted file mode 100644
index e443a413..00000000
--- a/SourceCode/Tools/tools.md
+++ /dev/null
@@ -1 +0,0 @@
-# This page is a work in progress and is currently incomplete
diff --git a/SourceCode/_Sidebar.md b/SourceCode/_Sidebar.md
index e2ddb4aa..ca5d8ece 100644
--- a/SourceCode/_Sidebar.md
+++ b/SourceCode/_Sidebar.md
@@ -4,15 +4,11 @@
- [How to Get Involved](how_to_involved)
- [How to Contribution](https://github.com/TheSuperHackers/GeneralsGameCode/blob/main/CONTRIBUTING.md)
+- [Running Generals Zero Hour on macOS](RunReleaseBuildsonMacOS)
- [Replays for testing](replay_testing)
- [In-Game Debug Commands](ingame_debug_commands)
- [Community forks](forks)
- [License](https://github.com/TheSuperHackers/GeneralsGameCode/blob/main/LICENSE.md)
-- [Credits](credits)
-- [Changelog](changelog)
-- [FAQ](faq)
-- [Known Issues](known_issues)
-- [Contact & Community](contact_community)
## [Added and Changed](engine_changes)
@@ -27,46 +23,19 @@
## [Builds](build_guides)
- [Build Configuration Overview](build_configuration)
-- [CMake Overview](cmake_guide)
+- [Building with CMake](cmake_guide)
### **TheSuperHackers Official Guides**:
-- **Visual Studio 6 Guides**:
- - [Using pure Visual Studio 6 (x86) (Windows)](build_with_ea_msvc6)
- - [Using Cmake & Visual Studio 6 (x86) (Windows)](build_with_msvc6)
- - [CLion & VC6 Toolchain](build_with_clion_vc6_toolchain)
- - [Docker & VC6](build_with_msvc6_on_docker)
+- **Windows**:
+ - [CMake and Visual Studio 6](visual_studio_6)
+ - [Build with CLion using VC6 or Win32](clion_vc6_win32)
+ - [Visual Studio 2022 and 2026](visual_studio)
-- **Visual Studio 2022 Guides**:
- - [Using Cmake (x86) (Windows)](build_with_msvc22)
- - [Using Cmake (Linux)](build_with_msvc22_linux)
-
-### **Community Guides**:
-- **macOS Guides**:
- - [Using Heroic & Wine-CrossOver (Apple Silicon)](macos_heroic_wine_crossover.md)
-
-
-### **Other Forks**:
- - [MSVC22 (x64) Generals Only (Windows)](build_with_msvc22_x64_jmarshall2323)
-
-## Libraries
-
-- DirectX
-- STLport
-- Max4SDK
-- NVASM
-- Benchmark
-- MilesSoundSystem
-- Bink
-- SafeDisk
-- Asimp3
-- GameSpy
-- ZLib
-- LZHCompress
+- **Linux**:
+ - [Build on Linux with Docker](linux_docker)
## Tools
- [Command Line Arguments](switchers_arguments)
-- [SafeDiskLauncher](safedisklauncher)
-- [CRCDiff](crcdiff)
- [Crash dumps](crashdumps)
diff --git a/SourceCode/changelog.md b/SourceCode/changelog.md
deleted file mode 100644
index e443a413..00000000
--- a/SourceCode/changelog.md
+++ /dev/null
@@ -1 +0,0 @@
-# This page is a work in progress and is currently incomplete
diff --git a/SourceCode/contact_community.md b/SourceCode/contact_community.md
deleted file mode 100644
index e443a413..00000000
--- a/SourceCode/contact_community.md
+++ /dev/null
@@ -1 +0,0 @@
-# This page is a work in progress and is currently incomplete
diff --git a/SourceCode/credits.md b/SourceCode/credits.md
deleted file mode 100644
index e443a413..00000000
--- a/SourceCode/credits.md
+++ /dev/null
@@ -1 +0,0 @@
-# This page is a work in progress and is currently incomplete
diff --git a/SourceCode/dependencies.md b/SourceCode/dependencies.md
deleted file mode 100644
index e443a413..00000000
--- a/SourceCode/dependencies.md
+++ /dev/null
@@ -1 +0,0 @@
-# This page is a work in progress and is currently incomplete
diff --git a/SourceCode/faq.md b/SourceCode/faq.md
deleted file mode 100644
index e443a413..00000000
--- a/SourceCode/faq.md
+++ /dev/null
@@ -1 +0,0 @@
-# This page is a work in progress and is currently incomplete
diff --git a/SourceCode/forks.md b/SourceCode/forks.md
index 094e0870..9478e53c 100644
--- a/SourceCode/forks.md
+++ b/SourceCode/forks.md
@@ -8,7 +8,6 @@ ongoing efforts to bring new features, bug fixes, and cross-platform support to
## 1. Windows
- [pure VS6 (x86)](https://github.com/droidix/CnC_Generals_Zero_Hour) @droidix
-- [VS22 with CMake (x86) Generals Only](https://github.com/jmarshall2323/CnC_Generals_Zero_Hour) @icecoldduke
- [VS6 with CMake (x86)](https://github.com/OmniBlade/CnC_Generals_Zero_Hour/tree/main) @OmniBlade
- [VS22 with CMake (x64)](https://github.com/Igoorx/GeneralsGameCode/tree/x64) @disarray
- [GeneralsOnline](https://github.com/x64-dev/GeneralsGameCode_GeneralsOnline) @x64-dev
diff --git a/SourceCode/known_issues.md b/SourceCode/known_issues.md
deleted file mode 100644
index e443a413..00000000
--- a/SourceCode/known_issues.md
+++ /dev/null
@@ -1 +0,0 @@
-# This page is a work in progress and is currently incomplete