diff --git a/CREDITS.md b/CREDITS.md new file mode 100644 index 0000000000..fab4c20259 --- /dev/null +++ b/CREDITS.md @@ -0,0 +1,161 @@ +# Credits + +This page lists all the individual contributions to the project by their author. + +- **Belonit (Gluk-v48)**: + - Disable empty spawn positions + - `gamemd.exe` icon customization + - Full-color non-paletted PCX support + - Initial SpySat, BigGap, TransactMoney warheads + - PCX Loading Screen support + - Custom DiskLaser radius + - Extended tooltips + - Building upgrades enhancement + - Option to hide health bar + - Sidebar.GDIPosition + - Help with CellSpread + - Blowfish.dll-related errors fix + - Zero size map previews fix + - Semantic locomotor aliases + - Shield logic + - Non-ASCII input fix +- **Kerbiter (Metadorius)**: + - SHP debris respect `Shadow` fix + - Building upgrades enhancement + - Extended tooltips + - Selection priority filtering + - `TurretOffset` enhancement + - Customizable ore spawners + - Select next idle harvester hotkey + - Interceptor enhancement + - Zero size map previews fix + - LaserTrails port and rework + - Laser graphics fixes + - GitHub Actions setup + - Overhauled Unicode font + - Official docs + - VSCode configs + - Code style +- **Uranusian (Thrifinesma)**: + - Mind Control enhancement + - Custom warhead splash list + - Harvester counter + - Spawns promotion + - Shield logic + - Multiple death fix + - Customizable missing cameo + - Cameo sorting priority + - Tab hotkey placement fix + - Producing progress indicators + - Custom ore gathering anim + - `NoManualMove` + - Weapon target house filtering + - `DeathWeapon` fix + - Re-enable obsolete `JumpjetControls` + - `AITrigger` Building Upgrades support + - Wall-Gate links + - Ability for deployed infantry to use both weapons + - Font icon additions + - Official CN docs +- **secsome (SEC-SOME)**: + - Debug info dump hotkey + - Refactoring & porting of Ares helper code + - Disguise removal warhead + - Mind Control removal warhead + - Mind Control enhancement + - Shields logic help + - `AnimList.PickRandom` + - `MoveToCell` fix + - Unlimited waypoints + - `Build At` trigger action buildup anim fix + - Undeploy building into a unit plays `EVA_NewRallyPointEstablished` fix + - Custom ore gathering anim + - `TemporalClass` related crash + - Retry dialog on mission failure + - Default disguise for individual InfantryTypes + - PowerPlant Enhancer + - SaveGame Trigger Action + - QuickSave command + - Numeric variables + - Custom gravity for projectiles + - Retint map actions bugfix + - Sharpnel enhancement + - Vanilla map preview reading bugfix +- **Otamaa (Fahroni, BoredEXE)**: + - Help with CellSpread + - Ported and fixed custom RadType code + - Togglable ElectricBolt bolts + - Customizable Chrono Locomotor properties per TechnoClass + - `DebrisMaximums` fixes, Anim-to-Unit + - `NotHuman` anim sequences improvements + - Customizable `OpenTopped` Properties + - Hooks for ScriptType Actions 92 & 93 + - Ore stage threshold for `HideIfNoOre` + - Occupied building `MuzzleFlashX` bugfix + - `EnemyUIName=` for other TechnoTypes + - TerrainType `DestroyAnim` & `DestroySound` + - Laser trails for VoxelAnims +- **FS-21**: + - Dump Object Info enhancements + - `Powered.KillSpawns` + - `Spawner.LimitRange` + - ScriptType Actions 71 to 113 + - MC deployer fixes + - Help with docs + - Automatic Passenger Deletion logic + - `Fire SW At Location` Trigger Action + - `Fire SW At Waypoint` Trigger Action + - Kill Object Automatically logic + - Customizable resource storage + - Override Uncloaked Underwater attack behavior + - AI Aircraft docks fix + - Shared Ammo logic +- **Starkku**: + - Warhead shield penetration & breaking + - Strafing aircraft weapon customization + - Vehicle `DeployFire` fixes/improvements + - Stationary VehicleTypes + - Burst logic improvements + - TechnoType auto-firing weapons + - Secondary weapon fallback customization + - Weapon target type filtering + - `AreaFire` targeting customization + - `CreateUnit` improvements + - Attached animation & jumpjet unit layer customization + - `IsSimpleDeployer` improvements + - Shield modification warheads + - Warhead decloaking toggle + - Warp(In/Out)Weapon + - Grinder improvements / additions + - Attached animation position customization + - Critical hit logic additions +- **Morton (MortonPL)**: + - `XDrawOffset` + - Shield passthrough & absorption + - Building `LimboDelivery` logic + - Fix for `Image` in art rules + - Power delta counter + - Help with docs +- **ChrisLv_CN** (work relicensed under [following permission](images/ChrisLv-relicense.png)): + - General assistance + - Interceptor logic prototype + - LaserTrails prototype + - Laser fixes prototype +- **SukaHati (Erzoid)** - Minimum interceptor guard range +- **E1 Elite** - TileSet 255 and above bridge repair fix +- **AutoGavy** - interceptor logic, Warhead critical hit logic, Customize resource storage +- **Chasheen (Chasheenburg)** - CN docs translation +- **Ares developers** - YRpp and Syringe which are used, save/load, project foundation and generally useful code from Ares, unfinished RadTypes code, prototype deployer fixes +- **tomsons26** - all-around help, assistance and guidance in reverse-engineering, YR binary mappings +- **CCHyper** - all-around help, current project logo, assistance and guidance in reverse-engineering, YR binary mappings +- **ZΞPHYɌUS** - win/lose themes code +- **ayylmao** - help with docs, extensive and thorough testing +- **SMxReaver** - help with docs, extensive and thorough testing +- **4SG** - help with docs +- **wiktorderelf** - overhauled Unicode font +- **thomassneddon** - general assistance +- **Xkein** - general assistance, YRpp edits +- **mevitar** - honorary shield tester *triple* award +- **Damfoos** - extensive and thorough testing +- **Dmitry Volkov** - extensive and thorough testing +- **Rise of the East community** - extensive playtesting of in-dev features \ No newline at end of file diff --git a/README.md b/README.md index 33a1ad7c21..7dde1e49a0 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Downloads You can choose one of the following: - [Latest stable branch build](https://github.com/Phobos-developers/Phobos/releases/latest) (most bug-free release but very slow on new features) - [Latest development branch builds](https://github.com/Phobos-developers/Phobos/releases) (a bit less less bug-free releases, devbuilds get new features when they are finished) -- [Latest development branch nightly](https://nightly.link/Phobos-developers/Phobos/blob/develop/.github/workflows/nightly.yml) (added unreleased stuff that will be in next devbuild) +- [Latest development branch nightly](https://nightly.link/Phobos-developers/Phobos/blob/develop/.github/workflows/nightly.yml) (added unreleased features that will be in next devbuild) - Individual new feature builds (for testing) can be found in [pull requests](https://github.com/Phobos-developers/Phobos/pulls) ### Note on nightly builds @@ -44,7 +44,7 @@ Documentation You can switch between versions (displays latest develop nightly version by default) in the bottom left corner, as well as download a PDF version. -The documentation is split by a few major categories, each represented with a page on the sidebar. Each page has it's contents grouped into multiple subcategories, be it buildings, technotypes, infantries, superweapons or something else. +The documentation is split by a few major categories, each represented with a page on the sidebar. Each page has its contents grouped into multiple subcategories, be it buildings, technotypes, infantries, superweapons or something else. ### How to read code snippets @@ -62,7 +62,7 @@ UIDescription= ; CSF entry key Building manually ----------------- -0. Install **Visual Studio** (2019 is recommended, 2017 is minimum) with the dependencies listed in `.vsconfig` (it will prompt you to install missing dependences when you open the project, or you can run VS installer and import the config). If you prefer to use **Visual Studio Code** you may install **VS Build Tools** with the stuff from `.vsconfig` instead. You can also don't use any code editor or IDE and build via **command line scripts** included with the project. +0. Install **Visual Studio** (2019 is recommended, 2017 is minimum) with the dependencies listed in `.vsconfig` (it will prompt you to install missing dependences when you open the project, or you can run VS installer and import the config). If you prefer to use **Visual Studio Code** you may install **VS Build Tools** with the dependencies from `.vsconfig` instead. You can also don't use any code editor or IDE and build via **command line scripts** included with the project. 1. Clone this repo recursively via your favorite git client (that will also clone YRpp). 2. To build the extension: - in Visual Studio: open the solution file in VS and build it (`Debug` build config is recommended); @@ -83,34 +83,7 @@ Credits - **Starkku** - developer - **Morton (MortonPL)** - developer -### Contributions -- **Belonit (Gluk-v48)** - project creation, disable empty spawn positions, custom gamemd icon with Command Line, full-color non-paletted PCX, SpySat, BigGap, TransactMoney, PCX Loading Screen, custom DiskLaser radius, extended tooltips, building upgrades enhancement, hide health bar, Sidebar.GDIPosition, help with CellSpread, Blowfish.dll-related errors fix, zero size map previews, semantic locomotor aliases, shields, input fix -- **Kerbiter (Metadorius)** - SHP debris respect Shadow, building upgrades enhancement, extended tooltips, selection priority filtering, TurretOffset enhancement, customizable ore spawners, select next idle harvester hotkey, interceptor enhancement, zero size map previews, LaserTrails, laser fixes, CI/CD, overhauled Unicode font, docs maintenance, VSCode configs, code style -- **tomsons26** - all-around help, assistance and guidance in reverse-engineering, YR binary mappings -- **CCHyper** - all-around help, current project logo, assistance and guidance in reverse-engineering, YR binary mappings -- **Ares developers** - YRpp and Syringe which are used, save/load, project foundation and generally useful code from Ares, unfinished RadTypes code, prototype deployer fixes -- **ZΞPHYɌUS** - win/lose themes code -- **ayylmao** - help with docs -- **SMxReaver** - help with docs, extensive and thorough testing -- **4SG** - help with docs -- **wiktorderelf** - overhauled Unicode font -- **Uranusian (Thrifinesma)** - Mind Control enhancement, custom warhead splash list, harvesters counter, promoted spawns, shields, death after dead fix, customizeable missing cameo, cameo sorting priority, placement mode responding of tab hotkeys fix, producing progress, custom ore gathering anim, NoManualMove, weapon target house filtering, DeathWeapon fix, re-enable obsolete `JumpjetControls`, AITrigger Building Upgrades recognition, Wall-Gate links, deployed infantry using both weapons, overhauled Unicode font, docs maintenance, CN docs translation -- **secsome (SEC-SOME)** - debug info dump hotkey, refactoring & porting of Ares helper code, introducing more Ares-derived stuff, disguise removal warhead, Mind Control removal warhead, Mind Control enhancement, shields, AnimList.PickRandom, MoveToCell fix, unlimited waypoints, Build At trigger action buildup anim fix, Undeploy building into a unit plays `EVA_NewRallyPointEstablished` fix, custom ore gathering anim, TemporaryClass related crash, Retry dialog on mission failure, Default disguise for individual InfantryTypes, PowerPlant Enhancer, SaveGame Trigger Action, QuickSave command, Numeric variables, Custom gravity for projectiles, Retint map actions bugfix, Sharpnel enhancement, Vanilla map preview reading bugfix -- **Otamaa (Fahroni, BoredEXE)** - help with CellSpread, ported and fixed custom RadType code, togglable ElectricBolt bolts, customizable Chrono Locomotor properties per TechnoClass, DebrisMaximums fixes, Anim-to-Unit, NotHuman anim sequences improvements, Customizable OpenTopped Properties, hooks for ScriptType Actions 92 & 93, ore stage threshold for `HideIfNoOre`, occupied building `MuzzleFlashX` bugfix,`EnemyUIName=` for other TechnoTypes, TerrainType `DestroyAnim` & `DestroySound`, Laser trails for VoxelAnims -- **E1 Elite** - TileSet 255 and above bridge repair fix -- **FS-21** - Dump Object Info enhancements, Powered.KillSpawns, Spawner.LimitRange, ScriptType Actions 71 to 113, MC deployer fixes, help with docs, Automatic Passenger Deletion, Fire SW At Location Trigger Action, Fire SW At Waypoint Trigger Action, Kill Object Automatically, Customize resource storage, Override Uncloaked Underwater attack behavior, AI Aircraft docks fix, Shared Ammo -- **AutoGavy** - interceptor logic, Warhead critical hit logic, Customize resource storage -- **ChrisLv_CN** - interceptor logic, LaserTrails, laser fixes, general assistance (work relicensed under [following permission](images/ChrisLv-relicense.png)) -- **Xkein** - general assistance, YRpp edits -- **thomassneddon** - general assistance -- **Starkku** - Warhead shield penetration & breaking, strafing aircraft weapon customization, vehicle DeployFire fixes/improvements, stationary VehicleTypes, Burst logic improvements, TechnoType auto-firing weapons, Secondary weapon fallback customization, weapon target type filtering, AreaFire targeting customization, CreateUnit improvements, Attached animation & jumpjet unit layer customization, IsSimpleDeployer improvements, Shield modification warheads, Warhead decloaking toggle, Warp(In/Out)Weapon, Grinder improvements / additions, Attached animation position customization, Critical hit logic additions, Aircraft & jumpjet speed modifiers fix, Local warhead screen shaking, Vehicle custom palette fix, Weapon owner detachment, Feedback weapon, TerrainType & ore minimap color customization -- **SukaHati (Erzoid)** - Minimum interceptor guard range -- **Morton (MortonPL)** - XDrawOffset, Shield passthrough & absorption, building LimboDelivery, fix for Image in art rules, power delta counter -- **mevitar** - honorary shield tester *triple* award -- **Damfoos** - extensive and thorough testing -- **Dmitry Volkov** - extensive and thorough testing -- **Rise of the East community** - extensive playtesting of in-dev features -- **Chasheen (Chasheenburg)** - CN docs translation +For all contributions see [full credits list](CREDITS.md). Thanks to everyone who uses Phobos, tests changes and reports bugs! You can show your appreciation and help project by displaying the logo (monochrome version can be found [here](logo-mono.png)) in your client/launcher (make it open Phobos GitHub page for extra fanciness), linking to Phobos repository, contributing or donating to us via the links above. @@ -122,4 +95,3 @@ Legal and License The Phobos project is an unofficial open-source community collaboration project to extend the Red Alert 2 Yuri's Revenge engine for modding and compatibility purposes. This project has no direct affiliation with Electronic Arts Inc. Command & Conquer, Command & Conquer Red Alert 2, Command & Conquer Yuri's Revenge are registered trademarks of Electronic Arts Inc. All Rights Reserved. - diff --git a/docs/CREDITS.md b/docs/CREDITS.md new file mode 100644 index 0000000000..5d43296d08 --- /dev/null +++ b/docs/CREDITS.md @@ -0,0 +1,4 @@ +```{include} ../CREDITS.md +:relative-docs: docs/ +:relative-images: +``` \ No newline at end of file diff --git a/docs/Contributing.md b/docs/Contributing.md index 0342066168..abdbe5e81c 100644 --- a/docs/Contributing.md +++ b/docs/Contributing.md @@ -239,4 +239,4 @@ Please, provide screenshots, GIFs and videos in their natural size and without e ### Promoting the work -You can always help us by spreading the word about the project among people, whether you're an influential youtuber +You can always help us by spreading the word about the project among people, whether you're an influential youtuber, a C&C related community leader or just an average player. diff --git a/docs/Fixed-or-Improved-Logics.md b/docs/Fixed-or-Improved-Logics.md index 73b70be74d..418664b87c 100644 --- a/docs/Fixed-or-Improved-Logics.md +++ b/docs/Fixed-or-Improved-Logics.md @@ -4,12 +4,26 @@ This page describes all ingame logics that are fixed or improved in Phobos witho ## Bugfixes and miscellaneous -- Fixed the bug when reading a map which puts `Preview(Pack)` after `Map` lead to the game fail to draw the preview (by secsome) +- Fixed the bug when reading a map which puts `Preview(Pack)` after `Map` lead to the game fail to draw the preview - Fixed the bug when retinting map lighting with a map action corrupted light sources. - Fixed the bug when deploying mindcontrolled vehicle into a building permanently transferred the control to the house which mindcontrolled it. - Fixed the bug when units are already dead but still in map (for sinking, crashing, dying animation, etc.), they could die again. - Fixed the bug when cloaked Desolator was unable to fire his deploy weapon. - Fixed the bug that temporaryed unit cannot be erased correctly and no longer raise an error. +- Fixed `DebrisMaximums` (spawned debris type amounts cannot go beyond specified maximums anymore). Only applied when `DebrisMaximums` values amount is more than 1 for compatibility reasons. +- Fixed building and defense tab hotkeys not enabling the placement mode after `Cannot build here.` triggered and the placement mode cancelled. +- Fixed buildings with `UndeployInto` playing `EVA_NewRallypointEstablished` on undeploying. +- Fixed buildings with `Naval=yes` ignoring `WaterBound=no` to be forced to place onto water. +- Fixed AI Aircraft docks bug when Ares tag `[GlobalControls]` > `AllowParallelAIQueues=no` is set. +- Fixed laser drawing code to allow for thicker lasers in house color draw mode. +- Fixed `DeathWeapon` not detonating properly. + - Some settings are still ignored like `PreImpactAnim` *(Ares feature)*, this might change in future. +- Fixed the bug when occupied building's `MuzzleFlashX` is drawn on the center of the building when `X` goes past 10. +- Fixed jumpjet units that are `Crashable` not crashing to ground properly if destroyed while being pulled by a `Locomotor` warhead. +- Fixed interaction of `UnitAbsorb` & `InfantryAbsorb` with `Grinding` buildings. The keys will now make the building only accept appropriate types of objects. +- Fixed missing 'no enter' cursor for VehicleTypes being unable to enter a `Grinding` building. +- Fixed Engineers being able to enter `Grinding` buildings even when they shouldn't (such as ally building at full HP). + - SHP debris shadows now respect the `Shadow` tag. - Allowed usage of TileSet of 255 and above without making NE-SW broken bridges unrepairable. - Adds a "Load Game" button to the retry dialog on mission failure. @@ -21,24 +35,16 @@ This page describes all ingame logics that are fixed or improved in Phobos witho - `InfiniteMindControl` with `Damage=1` can now control more than 1 unit. - Aircraft with `Fighter` set to false or those using strafing pattern (weapon projectile `ROT` is below 2) now take weapon's `Burst` into accord for all shots instead of just the first one. - `EMEffect` used for random AnimList pick is now replaced by a new tag `AnimList.PickRandom` with no side effect. (EMEffect=yes on AA inviso projectile deals no damage to units in movement) -- Script action `Move to cell` now obeys YR cell calculation now. Using `1000 * Y + X` as its cell value. (was `128 * Y + X` as it's RA leftover) +- Script action `Move to cell` now obeys YR cell calculation now. Using `1000 * Y + X` as its cell value. (was `128 * Y + X` as it's a RA1 leftover) - The game now can reads waypoints ranges in [0, 2147483647]. (was [0,701]) - Map trigger action `125 Build At...` can now play buildup anim optionally (needs [following changes to `fadata.ini`](Whats-New.md#for-map-editor-final-alert-2). - Vehicles using `DeployFire` will now explicitly use weapon specified by `DeployFireWeapon` for firing the deploy weapon and respect `FireOnce` setting on weapon and any stop commands issued during firing. -- Fixed `DebrisMaximums` (spawned debris type amounts cannot go beyond specified maximums anymore). Only applied when `DebrisMaximums` values amount is more than 1 for compatibility reasons. -- Fixed building and defense tab hotkeys not enabling the placement mode after `Cannot build here.` triggered and the placement mode cancelled. -- Fixed buildings with `UndeployInto` playing `EVA_NewRallypointEstablished` on undeploying. -- Fixed buildings with `Naval=yes` ignoring `WaterBound=no` to be forced to place onto water. -- Fixed AI Aircraft docks bug when Ares tag `[GlobalControls]` > `AllowParallelAIQueues=no` is set. - Infantry with `DeployFireWeapon=-1` can now fire both weapons (decided by its target), regardless of deployed or not. ![image](_static/images/remember-target-after-deploying-01.gif) *Nod arty keeping target on attack order in [C&C: Reloaded](https://www.moddb.com/mods/cncreloaded/)* - Vehicle to building deployers now keep their target when deploying with `DeployToFire`. -- Fixed laser drawing code to allow for thicker lasers in house color draw mode. -- `DeathWeapon` now will properly detonate. - - But still some settings are ignored like `PreImpactAnim` *(Ares feature)*, this might change in future. - Effects like lasers are no longer drawn from wrong firing offset on weapons that use Burst. - Both Global Variables (`VariableNames` in `rulesmd.ini`) and Local Variables (`VariableNames` in map) are now unlimited. - Animations can now be offset on the X axis with `XDrawOffset`. @@ -57,14 +63,14 @@ This page describes all ingame logics that are fixed or improved in Phobos witho ## Animations -### Ore stage threshold for `HideIfNoOre` +### Attached animation position customization -- You can now customize which growth stage should an ore/tiberium cell have to have animation with `HideIfNoOre` displayed. Cells with growth stage less than specified value won't allow the anim to display. +- You can now customize whether or not animations attached to objects are centered at the object's actual center rather than the bottom of their top-leftmost cell (cell #0). In `artmd.ini`: ```ini -[SOMEANIM] ; AnimationType -HideIfNoOre.Threshold=0 ; integer, minimal ore growth stage +[SOMEANIM] ; AnimationType +UseCenterCoordsIfAttached=false ; boolean ``` ### Layer on animations attached to objects @@ -77,14 +83,14 @@ In `artmd.ini`: Layer.UseObjectLayer= ; boolean ``` -### Attached animation position customization +### Ore stage threshold for `HideIfNoOre` -- You can now customize whether or not animations attached to objects are centered at the object's actual center rather than the bottom of their top-leftmost cell (cell #0). +- You can now customize which growth stage should an ore/tiberium cell have to have animation with `HideIfNoOre` displayed. Cells with growth stage less than specified value won't allow the anim to display. In `artmd.ini`: ```ini -[SOMEANIM] ; AnimationType -UseCenterCoordsIfAttached=false ; boolean +[SOMEANIM] ; AnimationType +HideIfNoOre.Threshold=0 ; integer, minimal ore growth stage ``` ## Buildings @@ -110,29 +116,37 @@ Grinding.Sound= ; Sound Grinding.Weapon= ; WeaponType ``` -## Vehicles +## Projectiles -### IsSimpleDeployer vehicle deploy animation / direction customization +### Customizable projectile gravity -- `DeployingAnim.AllowAnyDirection` if set, disables any direction constraints for deployers with `DeployingAnim` set. Only works for ground units. -- `DeployingAnim.KeepUnitVisible` determines if the unit is hidden while the animation is playing. -- `DeployingAnim.ReverseForUndeploy` controls whether or not the animation is played in reverse for undeploying. -- `DeployingAnim.UseUnitDrawer` controls whether or not the animation is displayed in the unit's palette and team colours or regular animation palette, including a potential custom palette. +- You can now specify individual projectile gravity. + - Set `Gravity=0` with an arcing projectile can create a straight trail. + - Set `Gravity.HeightFix=true` allows the projectile to hit target which is not at the same height while `Gravity=0`. In `rulesmd.ini`: ```ini -[SOMEVEHICLE] ; VehicleType -DeployingAnim.AllowAnyDirection=false ; boolean -DeployingAnim.KeepUnitVisible=false ; boolean -DeployingAnim.ReverseForUndeploy=true ; boolean -DeployingAnim.UseUnitDrawer=true ; boolean +[SOMEPROJECTILE] ; Projectile +Gravity=6.0 ; double +Gravity.HeightFix=false ; boolean ``` -### Stationary vehicles +## Technos -- Setting VehicleType `Speed` to 0 now makes game treat them as stationary, behaving in very similar manner to deployed vehicles with `IsSimpleDeployer` set to true. Should not be used on buildable vehicles, as they won't be able to exit factories. +### Customizable harvester ore gathering animation -## Technos +![image](_static/images/oregath.gif) +*Custom ore gathering anims in [Project Phantom](https://www.moddb.com/mods/project-phantom)* + +- You can now specify which anim should be drawn when a harvester of specified type is gathering specified type of ore. + +In `rulesmd.ini`: +```ini +[SOMETECHNO] ; TechnoType +OreGathering.Anims= ; list of animations +OreGathering.FramesPerDir=15 ; list of integers +OreGathering.Tiberiums=0 ; list of Tiberium IDs +``` ### Customizable Teleport/Chrono Locomotor settings per TechnoType @@ -155,20 +169,34 @@ ChronoRangeMinimum= ; integer, can be used to set a small range within which ChronoDelay= ; integer, delay after teleport for chronosphere ``` -### Re-enable obsolete [JumpjetControls] +### Customizable unit image in art -- Re-enable obsolete [JumpjetControls], the keys in it will be as the default value of jumpjet units. - - Moreover, added two tags for missing ones. +- `Image` tag in art INI is no longer limited to AnimationTypes and BuildingTypes, and can be applied to all TechnoTypes (InfantryTypes, VehicleTypes, AircraftTypes, BuildingTypes). +- The tag specifies **only** the file name (without extension) of the asset that replaces TechnoType's graphics. If the name in `Image` is also an entry in the art INI, **no tags will be read from it**. +- **By default this feature is disabled** to remain compatible with YR. To use this feature, enable it in rules with `ArtImageSwap=true`. +- This feature supports SHP images for InfantryTypes, SHP and VXL images for VehicleTypes and VXL images for AircraftTypes. In `rulesmd.ini`: ```ini -[JumpjetControls] -Crash=5.0 ; float -NoWobbles=no ; boolean +[General] +ArtImageSwap=false ; disabled by default ``` -```{note} -`CruiseHeight` is for `JumpjetHeight`, `WobblesPerSecond` is for `JumpjetWobbles`, `WobbleDeviation` is for `JumpjetDeviation`, and `Acceleration` is for `JumpjetAccel`. All other corresponding keys just simply have no Jumpjet prefix. +In `artmd.ini`: +```ini +[SOMETECHNO] +Image= ; name of the file that will be used as image, without extension +``` + +### Customize resource storage + +- Now Ares `Storage` feature can set which Tiberium type from `[Tiberiums]` list should be used for storing resources in structures with `Refinery.UseStorage=yes` and `Storage` > 0. +- This tag can not be used without Ares. + +In `rulesmd.ini`: +```ini +[General] +Storage.TiberiumIndex=-1 ; integer, [Tiberiums] list index ``` ### Jumpjet unit layer deviation customization @@ -184,21 +212,6 @@ AllowLayerDeviation=yes ; boolean JumpjetAllowLayerDeviation=yes ; boolean ``` -### Customizable harvester ore gathering animation - -![image](_static/images/oregath.gif) -*Custom ore gathering anims in [Project Phantom](https://www.moddb.com/mods/project-phantom)* - -- You can now specify which anim should be drawn when a harvester of specified type is gathering specified type of ore. - -In `rulesmd.ini`: -```ini -[SOMETECHNO] ; TechnoType -OreGathering.Anims= ; list of animations -OreGathering.FramesPerDir=15 ; list of integers -OreGathering.Tiberiums=0 ; list of Tiberium IDs -``` - ### Kill spawns on low power - `Powered=yes` structures that spawns aircraft like Aircrafts Carriers will stop targeting the enemy if low power. @@ -210,34 +223,20 @@ In `rulesmd.ini`: Powered.KillSpawns=no ; boolean ``` -### Customize resource storage - -- Now Ares `Storage` feature can set which Tiberium type from `[Tiberiums]` list should be used for storing resources in structures with `Refinery.UseStorage=yes` and `Storage` > 0. -- This tag can not be used without Ares. - -In `rulesmd.ini`: -```ini -[General] -Storage.TiberiumIndex=-1 ; integer, [Tiberiums] list index -``` - -### Customizable unit image in art +### Re-enable obsolete [JumpjetControls] -- `Image` tag in art INI is no longer limited to AnimationTypes and BuildingTypes, and can be applied to all TechnoTypes (InfantryTypes, VehicleTypes, AircraftTypes, BuildingTypes). -- The tag specifies **only** the file name (without extension) of the asset that replaces TechnoType's graphics. If the name in `Image` is also an entry in the art INI, **no tags will be read from it**. -- **By default this feature is disabled** to remain compatible with YR. To use this feature, enable it in rules with `ArtImageSwap=true`. -- This feature supports SHP images for InfantryTypes, SHP and VXL images for VehicleTypes and VXL images for AircraftTypes. +- Re-enable obsolete [JumpjetControls], the keys in it will be as the default value of jumpjet units. + - Moreover, added two tags for missing ones. In `rulesmd.ini`: ```ini -[General] -ArtImageSwap=false ; disabled by default +[JumpjetControls] +Crash=5.0 ; float +NoWobbles=no ; boolean ``` -In `artmd.ini`: -```ini -[SOMETECHNO] -Image= ; name of the file that will be used as image, without extension +```{note} +`CruiseHeight` is for `JumpjetHeight`, `WobblesPerSecond` is for `JumpjetWobbles`, `WobbleDeviation` is for `JumpjetDeviation`, and `Acceleration` is for `JumpjetAccel`. All other corresponding keys just simply have no Jumpjet prefix. ``` ## Terrains @@ -282,78 +281,85 @@ In `rulesmd.ini`: MinimapColor= ; integer - Red,Green,Blue ``` -## Weapons +## Vehicles -### Customizable disk laser radius +### IsSimpleDeployer vehicle deploy animation / direction customization -![image](_static/images/disklaser-radius-values-01.gif) -- You can now set disk laser animation radius using a new tag. +- `DeployingAnim.AllowAnyDirection` if set, disables any direction constraints for deployers with `DeployingAnim` set. Only works for ground units. +- `DeployingAnim.KeepUnitVisible` determines if the unit is hidden while the animation is playing. +- `DeployingAnim.ReverseForUndeploy` controls whether or not the animation is played in reverse for undeploying. +- `DeployingAnim.UseUnitDrawer` controls whether or not the animation is displayed in the unit's palette and team colours or regular animation palette, including a potential custom palette. In `rulesmd.ini`: ```ini -[SOMEWEAPON] ; WeaponType -DiskLaser.Radius=38.2 ; floating point value - ; 38.2 is roughly the default saucer disk radius +[SOMEVEHICLE] ; VehicleType +DeployingAnim.AllowAnyDirection=false ; boolean +DeployingAnim.KeepUnitVisible=false ; boolean +DeployingAnim.ReverseForUndeploy=true ; boolean +DeployingAnim.UseUnitDrawer=true ; boolean ``` -### Toggle-able ElectricBolt visuals +### Stationary vehicles -- You can now specify individual ElectricBolt bolts you want to disable. Note that this is only a visual change. +- Setting VehicleType `Speed` to 0 now makes game treat them as stationary, behaving in very similar manner to deployed vehicles with `IsSimpleDeployer` set to true. Should not be used on buildable vehicles, as they won't be able to exit factories. + +## Warheads + +### Customizing decloak on damaging targets + +- You can now specify whether or not the warhead decloaks objects that are damaged by the warhead. In `rulesmd.ini`: ```ini -[SOMEWEAPONTYPE] ; WeaponType -IsElectricBolt=true ; an ElectricBolt Weapon, vanilla tag -Bolt.Disable1=false ; boolean -Bolt.Disable2=false ; boolean -Bolt.Disable3=false ; boolean +[SOMEWARHEAD] ; WarheadType +DecloakDamagedTargets=true ; boolean ``` -### Detaching weapon from owner TechnoType +### Restricting screen shaking to current view -- You can now control if weapon is detached from the TechnoType that fired it. This results in the weapon / warhead being able to damage the TechnoType itself even if it does not have `DamageSelf=true` set, but also treats it as if owned by no house or object, meaning any ownership-based checks like `AffectsAllies` do not function as expected and no experience is awarded. - - The effect of this is inherited through `AirburstWeapon` and `ShrapnelWeapon`. - - This does not affect projectile image or functionality or `FirersPalette` on initially fired weapon, but `FirersPalette` will not function for any weapons inheriting the effect. +- You can now specify whether or not the warhead can only shake screen (`ShakeX/Ylo/hi`) if it is detonated while visible on current screen view. In `rulesmd.ini`: ```ini -[SOMEWEAPONTYPE] ; WeaponType -DetachedFromOwner=false ; boolean +[SOMEWARHEAD] ; WarheadType +ShakeIsLocal=false ; boolean ``` -## Projectiles +## Weapons -### Customizable projectile gravity +### Customizable disk laser radius -- You can now specify individual projectile gravity. - - Set `Gravity=0` with an arcing projectile can create a straight trail. - - Set `Gravity.HeightFix=true` allows the projectile to hit target which is not at the same height while `Gravity=0`. +![image](_static/images/disklaser-radius-values-01.gif) +- You can now set disk laser animation radius using a new tag. In `rulesmd.ini`: ```ini -[SOMEPROJECTILE] ; Projectile -Gravity=6.0 ; double -Gravity.HeightFix=false ; boolean +[SOMEWEAPON] ; WeaponType +DiskLaser.Radius=38.2 ; floating point value + ; 38.2 is roughly the default saucer disk radius ``` -## Warheads - -### Customizing decloak on damaging targets +### Detaching weapon from owner TechnoType -- You can now specify whether or not the warhead decloaks objects that are damaged by the warhead. +- You can now control if weapon is detached from the TechnoType that fired it. This results in the weapon / warhead being able to damage the TechnoType itself even if it does not have `DamageSelf=true` set, but also treats it as if owned by no house or object, meaning any ownership-based checks like `AffectsAllies` do not function as expected and no experience is awarded. + - The effect of this is inherited through `AirburstWeapon` and `ShrapnelWeapon`. + - This does not affect projectile image or functionality or `FirersPalette` on initially fired weapon, but `FirersPalette` will not function for any weapons inheriting the effect. In `rulesmd.ini`: ```ini -[SOMEWARHEAD] ; WarheadType -DecloakDamagedTargets=true ; boolean +[SOMEWEAPONTYPE] ; WeaponType +DetachedFromOwner=false ; boolean ``` -### Restricting screen shaking to current view +### Toggle-able ElectricBolt visuals -- You can now specify whether or not the warhead can only shake screen (`ShakeX/Ylo/hi`) if it is detonated while visible on current screen view. +- You can now specify individual ElectricBolt bolts you want to disable. Note that this is only a visual change. In `rulesmd.ini`: ```ini -[SOMEWARHEAD] ; WarheadType -ShakeIsLocal=false ; boolean -``` \ No newline at end of file +[SOMEWEAPONTYPE] ; WeaponType +IsElectricBolt=true ; an ElectricBolt Weapon, vanilla tag +Bolt.Disable1=false ; boolean +Bolt.Disable2=false ; boolean +Bolt.Disable3=false ; boolean +``` diff --git a/docs/New-or-Enhanced-Logics.md b/docs/New-or-Enhanced-Logics.md index 186526f3fb..5ed846cd19 100644 --- a/docs/New-or-Enhanced-Logics.md +++ b/docs/New-or-Enhanced-Logics.md @@ -4,6 +4,81 @@ This page describes all the engine features that are either new and introduced b ## New types / ingame entities +### Custom Radiation Types + +![image](_static/images/radtype-01.png) +*Mixing different radiation types* + +- Allows to have custom radiation type for any weapon now. More details on radiation [here](https://www.modenc.renegadeprojects.com/Radiation). + +In `rulesmd.ini`: +```ini +[RadiationTypes] +0=SOMERADTYPE + +[SOMEWEAPON] ; WeaponType +RadType=Radiation ; RadType to use instead + ; of default [Radiation] + +[SOMERADTYPE] ; custom RadType name +RadDurationMultiple=1 ; int +RadApplicationDelay=16 ; int +RadApplicationDelay.Building=0 ; int +RadLevelMax=500 ; int +RadLevelDelay=90 ; int +RadLightDelay=90 ; int +RadLevelFactor=0.2 ; double +RadLightFactor=0.1 ; double +RadTintFactor=1.0 ; double +RadColor=0,255,0 ; RGB +RadSiteWarhead=RadSite ; WarheadType +``` + +### Laser Trails + +![Laser Trails](_static/images/lasertrails.gif) +*Laser trails used in [Rise of the East](https://www.moddb.com/mods/riseoftheeast)* + +- Technos, Projectiles, and VoxelAnims can now have colorful trails of different transparency, thickness and color, which are drawn via laser drawing code. +- Technos, Projectiles, and VoxelAnims can have multiple laser trails. For technos each trail can have custom laser trail type and FLH offset relative to turret and body. + +```{warning} +Laser trails are very resource intensive! Due to the game not utilizing GPU having a lot of trails can quickly drop the FPS on even good machines. To reduce that effect: + - don't put too many laser trails on units and projectiles; + - make sure you set as high `SegmentLength` value as possible without trails being too jagged; + - try to keep the length of the trail minimal (can be achieved with smaller `FadeDuration` durations). +``` + +In `artmd.ini`: +```ini +[LaserTrailTypes] +0=SOMETRAIL + +[SOMETRAIL] ; LaserTrailType name +IsHouseColor=no ; boolean +Color=255,0,0 ; integer - Red,Green,Blue +FadeDuration=64 ; integer +Thickness=4 ; integer +SegmentLength=128 ; integer, minimal length of each trail segment +IgnoreVertical=no ; boolean, whether the trail won't be drawn on vertical movement +IsIntense=no ; boolean, whether the laser is "supported" (AKA prism forwarding) + +[SOMEPROJECTILE] ; BulletType Image +LaserTrail.Types=SOMETRAIL ; list of LaserTrailTypes + +[SOMETECHNO] ; TechnoType Image +LaserTrailN.Type=SOMETRAIL ; LaserTrailType +LaserTrailN.FLH=0,0,0 ; integer - Forward,Lateral,Height +LaserTrailN.IsOnTurret=no ; boolean, whether the trail origin is turret +; where N = 0, 1, 2, ... +``` + +in `rulesmd.ini`: +```ini +[SOMEVOXELANIM] ; VoxelAnim +LaserTrail.Types=SOMETRAIL ; list of LaserTrailTypes +``` + ### Shields ![image](_static/images/technoshield-01.gif) @@ -41,7 +116,7 @@ AllowTransfer= ; boolean [SOMETECHNO] ; TechnoType ShieldType=SOMESHIELDTYPE ; ShieldType; none by default - + [SOMEWARHEAD] ; WarheadType Shield.Penetrate=false ; boolean Shield.Break=false ; boolean @@ -107,81 +182,6 @@ Shield.InheritStateOnReplace=false ; boolean - If `Shield.ReplaceNonRespawning` is set, shield from `Shield.AttachTypes` replaces existing shields that have been broken and cannot respawn on their own. - If `Shield.InheritStateOnReplace` is set, shields replaced via `Shield.ReplaceOnly` inherit the current strength (relative to ShieldType `Strength`) of the previous shield and whether or not the shield was currently broken. Self-healing and respawn timers are always reset. -### Laser Trails - -![Laser Trails](_static/images/lasertrails.gif) -*Laser trails used in [Rise of the East](https://www.moddb.com/mods/riseoftheeast)* - -- Technos, Projectiles, and VoxelAnims can now have colorful trails of different transparency, thickness and color, which are drawn via laser drawing code. -- Technos, Projectiles, and VoxelAnims can have multiple laser trails. For technos each trail can have custom laser trail type and FLH offset relative to turret and body. - -```{warning} -Laser trails are very resource intensive! Due to the game not utilizing GPU having a lot of trails can quickly drop the FPS on even good machines. To reduce that effect: - - don't put too many laser trails on units and projectiles; - - make sure you set as high `SegmentLength` value as possible without trails being too jagged; - - try to keep the length of the trail minimal (can be achieved with smaller `FadeDuration` durations). -``` - -In `artmd.ini`: -```ini -[LaserTrailTypes] -0=SOMETRAIL - -[SOMETRAIL] ; LaserTrailType name -IsHouseColor=no ; boolean -Color=255,0,0 ; integer - Red,Green,Blue -FadeDuration=64 ; integer -Thickness=4 ; integer -SegmentLength=128 ; integer, minimal length of each trail segment -IgnoreVertical=no ; boolean, whether the trail won't be drawn on vertical movement -IsIntense=no ; boolean, whether the laser is "supported" (AKA prism forwarding) - -[SOMEPROJECTILE] ; BulletType Image -LaserTrail.Types=SOMETRAIL ; list of LaserTrailTypes - -[SOMETECHNO] ; TechnoType Image -LaserTrailN.Type=SOMETRAIL ; LaserTrailType -LaserTrailN.FLH=0,0,0 ; integer - Forward,Lateral,Height -LaserTrailN.IsOnTurret=no ; boolean, whether the trail origin is turret -; where N = 0, 1, 2, ... -``` - -in `rulesmd.ini`: -```ini -[SOMEVOXELANIM] ; VoxelAnim -LaserTrail.Types=SOMETRAIL ; list of LaserTrailTypes -``` - -### Custom Radiation Types - -![image](_static/images/radtype-01.png) -*Mixing different radiation types* - -- Allows to have custom radiation type for any weapon now. More details on radiation [here](https://www.modenc.renegadeprojects.com/Radiation). - -In `rulesmd.ini`: -```ini -[RadiationTypes] -0=SOMERADTYPE - -[SOMEWEAPON] ; WeaponType -RadType=Radiation ; RadType to use instead - ; of default [Radiation] - -[SOMERADTYPE] ; custom RadType name -RadDurationMultiple=1 ; int -RadApplicationDelay=16 ; int -RadApplicationDelay.Building=0 ; int -RadLevelMax=500 ; int -RadLevelDelay=90 ; int -RadLightDelay=90 ; int -RadLevelFactor=0.2 ; double -RadLightFactor=0.1 ; double -RadTintFactor=1.0 ; double -RadColor=0,255,0 ; RGB -RadSiteWarhead=RadSite ; WarheadType -``` - ## Animations ### Anim-to-Unit @@ -213,7 +213,7 @@ CreateUnit.ConsiderPathfinding=no ; boolean, whether to consider if the create ## Buildings -### Extended building upgrades logic +### Extended building upgrades ![image](_static/images/powersup.owner-01.png) *Upgrading own and allied Power Plants in [CnC: Final War](https://www.moddb.com/mods/cncfinalwar)* @@ -229,10 +229,10 @@ PowersUp.Owner=Self ; list of Affected House Enumeration (none|owner/self|allies PowersUp.Buildings= ; list of BuildingTypes ``` -### Power plant enhancer logic +### Power plant enhancer -- When it exists, it can increase the power amount generated by the plants. - - When buffer structures are sold or destroyed, the power amount returns to normal. +- When it exists, it can increase the power amount generated by the power plants. + - When enchancing structures are sold or destroyed, the power amount returns to normal. In `rulesmd.ini`: ```ini @@ -244,17 +244,6 @@ PowerPlantEnhancer.Factor=1.0 ; float ## Infantry -### Random death animaton for NotHuman Infantry - -- Infantry with `NotHuman=yes` can now play random death anim sequence between `Die1` to `Die5` instead of the hardcoded `Die1`. - - Do not forget to tweak infantry anim sequences before enabling this feature, otherwise it will play invisible anim sequence. - -In `rulesmd.ini`: -```ini -[SOMEINFANTRY] ; InfantryType -NotHuman.RandomDeathSequence=yes ; boolean -``` - ### Default disguise for individual InfantryTypes - Infantry can now have its `DefaultDisguise` overridden per-type. @@ -266,31 +255,15 @@ In `rulesmd.ini`: DefaultDisguise=E2 ; InfantryType ``` -### Automatic Passenger Deletion +### Random death animaton for NotHuman Infantry -- Transports with these tags will erase the passengers overtime. Bigger units takes more time. Optionally this logic can work like a grinder. - - Good combination with Ares Abductor logic. +- Infantry with `NotHuman=yes` can now play random death anim sequence between `Die1` to `Die5` instead of the hardcoded `Die1`. + - Do not forget to tweak infantry anim sequences before enabling this feature, otherwise it will play invisible anim sequence. In `rulesmd.ini`: ```ini -[SOMETECHNO] ; TechnoType -PassengerDeletion.Rate=0 ; integer, game frames -PassengerDeletion.Rate.SizeMultiply=yes ; boolean, whether to multiply frames amount by size -PassengerDeletion.Soylent=no ; boolean -PassengerDeletion.SoylentFriendlies=no ; boolean -PassengerDeletion.ReportSound= ; sound -PassengerDeletion.Anim= ; animation -``` - -### Customizable OpenTopped Properties - -- You can now override settings of `OpenTopped` transport properties per TechnoType. - -```ini -[SOMETECHNO] ; TechnoType -OpenTopped.RangeBonus=1 ; integer -OpenTopped.DamageMultiplier=1.3 ; float -OpenTopped.WarpDistance=8 ; integer +[SOMEINFANTRY] ; InfantryType +NotHuman.RandomDeathSequence=yes ; boolean ``` ### Shared Ammo @@ -311,487 +284,581 @@ Ammo.Shared=no ; boolean Ammo.Shared.Group=-1 ; integer ``` -## Technos +## Projectiles -### Mind Control enhancement +### Projectile interception logic -![image](_static/images/mindcontrol-max-range-01.gif) -*Mind Control Range Limit used in [Fantasy ADVENTURE](https://www.moddb.com/mods/fantasy-adventure)* -![image](_static/images/mindcontrol-multiple-01.gif) -*Multiple Mind Control unit auto-releases the first victim in [Fantasy ADVENTURE](https://www.moddb.com/mods/fantasy-adventure)* +![image](_static/images/projectile-interception-01.gif) +*Interception logic used in [Tiberium Crisis](https://www.moddb.com/mods/tiberium-crisis) mod* -- Mind controllers now can have the upper limit of the control distance. Tag values greater than 0 will activate this feature. -- Mind controllers with multiple controlling slots can now release the first controlled unit when they have reached the control limit and are ordered to control a new target. -- Allows Warheads to play custom `MindControl.Anim` which defaults to `ControlledAnimationType`. +- Projectiles can now be made targetable by certain TechnoTypes. Interceptor TechnoType's projectile must be `Inviso=yes` and `AA=yes` in order for it to work properly and the projectile must be used in a primary Weapon. + - `Interceptor.GuardRange` is maximum range of the unit to intercept projectile. The unit weapon range will limit the unit interception range though. + - `Interceptor.EliteGuardRange` value is used if the unit veterancy is Elite. + - `Interceptor.MinimumGuardRange` is the minimum range of the unit to intercept projectile. Any projectile under this range will not be intercepted. + - `Interceptor.EliteMinimumGuardRange` value is used if the unit veterancy is Elite. In `rulesmd.ini`: ```ini -[SOMETECHNO] ; TechnoType -MindControlRangeLimit=-1.0 ; double -MultiMindControl.ReleaseVictim=no ; boolean +[SOMETECHNO] ; TechnoType +Interceptor=no ; boolean +Interceptor.GuardRange=0.0 ; double +Interceptor.EliteGuardRange=0.0 ; double +Interceptor.MinimumGuardRange=0.0 ; double +Interceptor.EliteMinimumGuardRange=0.0 ; double -[SOMEWARHEAD] ; Warhead -MindControl.Anim=ControlledAnimationType ; AnimType +[SOMEPROJECTILE] ; Projectile +Interceptable=no ; boolean ``` -### Spawn range limit - -![image](_static/images/spawnrange-01.gif) -*Limited pursue range for spawns in [Fantasy ADVENTURE](https://www.moddb.com/mods/fantasy-adventure)* - -- The spawned units will abort the infinite pursuit if the enemy is out of range. -`Spawner.ExtraLimitRange` adds extra pursuit range to the spawned units. +### Shrapnel enhancement +- Shrapnel behavior can be triggered on the ground and buildings. In `rulesmd.ini`: ```ini -[SOMETECHNO] ; TechnoType -Spawner.LimitRange=no ; boolean -Spawner.ExtraLimitRange=0 ; integer +[SOMEPROJECTILE] ; Projectile +Shrapnel.AffectsGround=no ; boolean +Shrapnel.AffectsBuildings=no ; boolean ``` -### Promoted Spawns +## Script actions -![image](_static/images/promotedspawns-01.gif) -*Promoted Spawns in [Fantasy ADVENTURE](https://www.moddb.com/mods/fantasy-adventure)* +### `71` Timed Area Guard -- The spawned units will promote as their owner's veterancy. +- Puts the TaskForce into Area Guard Mode for the given units of time. Unlike the original timed Guard script (`5,n`) that just stays in place doing a basic guard operation the "Area Guard" action has a more active role attacking nearby invaders or defending units that needs protection. -In `rulesmd.ini`: +In `aimd.ini`: ```ini -[SOMETECHNO] ; TechnoType -Promote.IncludeSpawns=no ; boolean +[SOMESCRIPTTYPE] ; ScriptType +x=71,n ; integer, time in ingame seconds ``` -### Initial Strength +### `72` Load Onto Transports -- You can now specify how many hitpoints a TechnoType starts with. +- If the TaskForce contains unit(s) that can be carried by the transports of the same TaskForce then this action will make the units enter the transports. In Single player missions the next action must be "Wait until fully loaded" (`43,0`) or the script will not continue. -In `rulesmd.ini`: +In `aimd.ini`: ```ini -[SOMETECHNO] ; TechnoType -InitialStrength= ; int -``` +[SOMESCRIPTTYPE] ; ScriptType +x=72,0 +``` -### No Manual Move +### `73` Wait until ammo is full -- You can now specify whether a TechnoType is unable to receive move command. +- If the TaskForce contains unit(s) that use ammo then the the script will not continue until all these units have fully refilled the ammo. +In `aimd.ini`: ```ini -[SOMETECHNO] ; TechnoType -NoManualMove=no ; boolean +[SOMESCRIPTTYPE] ; ScriptType +x=73,0 ``` -### Firing offsets for specific Burst shots +### `74-81` Generic Target Type Attack Action -- You can now specify separate firing offsets for each of the shots fired by weapon with `Burst` via using `(Elite)PrimaryFire|SecondaryFire|WeaponX|FLH.BurstN` keys, depending on which weapons your TechnoType makes use of. *N* in `BurstN` is zero-based burst shot index, and the values are parsed sequentially until no value for either regular or elite weapon is present, with elite weapon defaulting to regular weapon FLH if only it is missing. If no burst-index specific value is available, value from the base key (f.ex `PrimaryFireFLH`) is used. -- Burst-index specific firing offsets are absolute firing offsets and the lateral shifting based on burst index that occurs with the base firing offsets is not applied. +- These Actions instruct the TeamType to use the TaskForce to approach and attack the target specified by the second parameter which is an index of a generic pre-defined group. Look at the tables below for the possible Actions (first parameter value) and Arguments (the second parameter value). + - For threat-based attack actions `TargetSpecialThreatCoefficientDefault` and `EnemyHouseThreatBonus` tags from `rulesmd.ini` are accounted. + - All Aircrafts that attack other air units will end the script. This behavior is intentional because without it aircrafts had some bugs that weren't fixable at the time of developing the feature. -In `artmd.ini`: +In `aimd.ini`: ```ini -[SOMETECHNO] ; TechnoType Image -PrimaryFireFLH.BurstN= ; int - forward, lateral, height -ElitePrimaryFireFLH.BurstN= ; int - forward, lateral, height -SecondaryFireFLH.BurstN= ; int - forward, lateral, height -EliteSecondaryFireFLH.BurstN= ; int - forward, lateral, height -WeaponXFLH.BurstN= ; int - forward, lateral, height -EliteWeaponXFLH.BurstN= ; int - forward, lateral, height +[SOMESCRIPTTYPE] ; ScriptType +x=i,n ; where 74 <= i <= 81 ``` -### Automatically firing weapons +| *Action* | *Argument* | *Repeats* | *Target Priority* | *Description* | +| :------: | :----------: | :-------: | :---------------: | :-------------------------------------------: | +74 | Target Type# | Yes | Closer, higher threat | | +75 | Target Type# | Yes | Farther, higher threat | | +76 | Target Type# | Yes | Closer | | +77 | Target Type# | Yes | Farther | | +78 | Target Type# | No | Closer, higher threat | Ends when a team member kill the designated target | +79 | Target Type# | No | Farther, higher threat | Ends when a team member kill the designated target | +80 | Target Type# | No | Closer | Ends when a team member kill the designated target | +81 | Target Type# | No | Farther | Ends when a team member kill the designated target | -- You can now make TechnoType automatically fire its weapon(s) without having to scan for suitable targets by setting `AutoFire`, on either its base cell (in which case the weapon that is used for force-firing is used) or itself (in which case normal targeting and weapon selection rules and are respected) depending on if `AutoFire.TargetSelf` is set or not. +- The following values are the *Target Type#* which can be used as second parameter of the new attack script actions: -In `rulesmd.ini`: +| *Value* | *Target Type* | *Description* | +| :-----: | :---------------: | :-------------------------------------------: | +1 | Anything | Any enemy `VehicleTypes`, `AircraftTypes`, `InfantryTypes` and `BuildingTypes` | +2 | Structures | Any enemy `BuildingTypes` without `Artillary=yes`, `TickTank=yes`, `ICBMLauncher=yes` or `SensorArray=yes` | +3 | Ore Miners | Any enemy `VehicleTypes` with `Harvester=yes` or `ResourceGatherer=yes`, `BuildingTypes` with `ResourceGatherer=yes` | +4 | Infantry | Any enemy `InfantryTypes` | +5 | Vehicles | Any enemy `VehicleTypes`, `AircraftTypes`, `BuildingTypes` with `Artillary=yes`, `TickTank=yes`, `ICBMLauncher=yes` & `SensorArray=yes` | +6 | Factories | Any enemy `BuildingTypes` with a Factory= setting | +7 | Base Defenses | Any enemy `BuildingTypes` with `IsBaseDefense=yes` | +8 | House Threats | Any object that targets anything of the Team's House or any enemy that is near to the Team Leader | +9 | Power Plants | Any enemy `BuildingTypes` with positive `Power=` values | +10 | Occupied | Any `BuildingTypes` with garrisoned infantry | +11 | Tech Buildings | Any `BuildingTypes` with `Unsellable=yes`, `Capturable=yes`, negative `TechLevel=` values or appears in `[AI]>NeutralTechBuildings=` list | +12 | Refinery | Any enemy `BuildingTypes` with `Refinery=yes` or `ResourceGatherer=yes`, `VehicleTypes` with `ResourceGatherer=yes` & `Harvester=no` (i.e. Slave Miner) | +13 | Mind Controller | Anything `VehicleTypes`, `AircraftTypes`, `InfantryTypes` and `BuildingTypes` with `MindControl=yes` in the weapons Warheads | +14 | Air Units | Any enemy `AircraftTypes`, flying `VehicleTypes` or `InfantryTypes` | +15 | Naval | Any enemy `BuildingTypes` and `VehicleTypes` with a `Naval=yes`, any enemy `VehicleTypes`, `AircraftTypes`, `InfantryTypes` in a water cell | +16 | Disruptors | Any enemy objects with positive `InhibitorRange=` values, positive `RadarJamRadius=` values, `CloakGenerator=yes` or `GapGenerator=yes` | +17 | Ground Vehicles | Any enemy `VehicleTypes` without `Naval=yes`, landed `AircraftTypes`, Deployed vehicles into `BuildingTypes` | +18 | Economy | Any enemy `VehicleTypes` with `Harvester=yes` or `ResourceGatherer=yes`, `BuildingTypes` with `Refinery=yes`, `ResourceGatherer=yes` or `OrePurifier=yes` | +19 | Infantry Factory | Any enemy `BuildingTypes` with `Factory=InfantryType` | +20 | Vehicle Factory | Any enemy `BuildingTypes` with `Factory=UnitType` | +21 | Aircraft Factory | Any enemy `BuildingTypes` with `Factory=AircraftType` | +22 | Radar | Any enemy `BuildingTypes` with `Radar=yes` or `SpySat=yes` | +23 | Tech Lab | Any enemy `BuildingTypes` in `[AI]>BuildTech=` list | +24 | Naval Factory | Any enemy `BuildingTypes` with `Naval=yes` and `Factory=UnitType` | +25 | Super Weapon | Any enemy `BuildingTypes` with `SuperWeapon=`, `SuperWeapon2=` or `SuperWeapons=` | +26 | Construction Yard | Any enemy `BuildingTypes` with `ConstructionYard=yes` and `Factory=BuildingType` | +27 | Neutrals | Any neutral object (Civilian) | +28 | Generators | Any enemy `BuildingTypes` with `CloakGenerator=yes` or `GapGenerator=yes` | +29 | Radar Jammer | Any enemy objects with positive `RadarJamRadius=` values | +30 | Inhibitors | Any enemy objects with positive `InhibitorRange=` values | +31 | Naval Units | Any enemy `VehicleTypes` with a `Naval=yes` or any enemy `VehicleTypes`, `AircraftTypes`, `InfantryTypes` in a water cell | +32 | Mobile Units | Anything `VehicleTypes`, `AircraftTypes` and `InfantryTypes` | +33 | Capturable | Any `BuildingTypes` with `Capturable=yes` or any `BuildingTypes` with `BridgeRepairHut=yes` and `Repairable=yes` | +34 | Area Threats | Any enemy object that is inside of the Team Leader's Guard Area | + +### `82` Decrease AI Trigger Current Weight + +- When executed this decreases the current Weight of the AI Trigger.The current Weight will never surprass the Minimum Weight and Maximum Weight limits of the AI Trigger. Take note that all TeamTypes of the same AI Trigger will update sooner or later the AI Trigger Current Weight. The second parameter is a positive value. Take note that the original game only uses the first of the two Teams for calculating the AI Trigger Current Weight at the end of the Trigger life, this action ignores if the Team is the first or the second of the AI Trigger and the Current Weight is calculated when is executed the action. + +In `aimd.ini`: ```ini -[SOMETECHNO] ; TechnoType -AutoFire=no ; boolean -AutoFire.TargetSelf=no ; boolean +[SOMESCRIPTTYPE] ; ScriptType +x=82,n ``` -### Disabling fallback to (Elite)Secondary weapon +### `83` Increase AI Trigger Current Weight -- It is now possible to disable the fallback to `(Elite)Secondary` weapon from `(Elite)Primary` weapon if it cannot fire at the chosen target by setting `NoSecondaryWeaponFallback` to true (defaults to false). This does not apply to special cases where `(Elite)Secondary` weapon is always chosen, including but not necessarily limited to the following: - - `OpenTransportWeapon=1` on an unit firing from inside `OpenTopped=true` transport. - - `NoAmmoWeapon=1` on an unit with `Ammo` value higher than 0 and current ammo count lower or equal to `NoAmmoAmount`. - - Deployed `IsSimpleDeployer=true` units with`DeployFireWeapon=1` set or omitted. - - `DrainWeapon=true` weapons against enemy `Drainable=yes` buildings. - - Units with `IsLocomotor=true` set on `Warhead` of `(Elite)Primary` weapon against buildings. - - Weapons with `ElectricAssault=true` set on `Warhead` against `Overpowerable=true` buildings belonging to owner or allies. - - `Overpowerable=true` buildings that are currently overpowered. - - Any system using `(Elite)WeaponX`, f.ex `Gunner=true` or `IsGattling=true` is also wholly exempt. - -In `rulesmd.ini`: +- When executed this increases the current Weight of the AI Trigger.The current Weight will never surprass the Minimum Weight and Maximum Weight limits of the AI Trigger. Take note that all TeamTypes of the same AI Trigger will update sooner or later the AI Trigger Current Weight. The second parameter is a positive value. Take note that the original game only uses the first of the two Teams for calculating the AI Trigger Current Weight at the end of the Trigger life, this action ignores if the Team is the first or the second of the AI Trigger and the Current Weight is calculated when is executed the action. + +In `aimd.ini`: ```ini -[SOMETECHNO] ; TechnoType -NoSecondaryWeaponFallback=false ; boolean +[SOMESCRIPTTYPE] ; ScriptType +x=83,n ``` -### Kill Unit Automatically +### `84-91`, `104-105` `AITargetTypes` Attack Action -- Objects can be destroyed automatically under certaing cases: - - No Ammo: The object will die if the remaining ammo reaches 0. - - Countdown: The object will die if the countdown reaches 0. +- These Actions instruct the TeamType to use the TaskForce to approach and attack the target specified by the second parameter which is an index of a modder-defined group from `AITargetTypess`. Look at the tables below for the possible Actions (first parameter value) and Arguments (the second parameter value). + - For threat-based attack actions `TargetSpecialThreatCoefficientDefault` and `EnemyHouseThreatBonus` tags from `rulesmd.ini` are accounted. + - All Aircrafts that attack other air units will end the script. This behavior is intentional because without it aircrafts had some bugs that weren't fixable at the time of developing the feature. -In `rulesmd.ini`: +In `aimd.ini`: ```ini -[SOMETECHNO] ; TechnoType -Death.NoAmmo=no ; boolean -Death.Countdown=0 ; integer +[SOMESCRIPTTYPE] ; ScriptType +x=i,n ; where 84 <= i <= 91 or 104 <= i <= 105 ``` -### Override Uncloaked Underwater attack behavior - -![image](_static/images/underwater-new-attack-tag.gif) -*Naval underwater behavior in [C&C: Reloaded](https://www.moddb.com/mods/cncreloaded)* +| *Action* | *Argument* | *Repeats* | *Target Priority* | *Description* | +| :------: | :----------: | :-------: | :---------------: | :-------------------------------------------: | +84 | `AITargetTypes` index# | Yes | Closer, higher threat | | +85 | `AITargetTypes` index# | Yes | Farther, higher threat | | +86 | `AITargetTypes` index# | Yes | Closer | | +87 | `AITargetTypes` index# | Yes | Farther | | +88 | `AITargetTypes` index# | No | Closer, higher threat | Ends when a team member kill the designated target | +89 | `AITargetTypes` index# | No | Farther, higher threat | Ends when a team member kill the designated target | +90 | `AITargetTypes` index# | No | Closer | Ends when a team member kill the designated target | +91 | `AITargetTypes` index# | No | Farther | Ends when a team member kill the designated target | +104 | `AITargetTypes` index# | Yes | Closer | Picks 1 random target from the list | +105 | `AITargetTypes` index# | Yes | Farther | Picks 1 random target from the list | -- Overrides a part of the vanilla YR logic for allowing naval units to use a different weapon if the naval unit is uncloaked. -- Useful if your naval unit have 1 weapon only for underwater and another weapon for surface objects. +- The second parameter with a 0-based index for the `AITargetTypes` section specifies the list of possible `VehicleTypes`, `AircraftTypes`, `InfantryTypes` and `BuildingTypes` that can be evaluated. The new `AITargetTypes` section must be declared in `rulesmd.ini` for making this script work: In `rulesmd.ini`: ```ini -[SOMETECHNO] ; TechnoType -ForceWeapon.Naval.Decloaked=-1 ; Integer. 0 for primary weapon, 1 for secondary weapon +[AITargetTypes] ; List of TechnoType lists +0=SOMETECHNOTYPE,SOMEOTHERTECHNOTYPE,SAMPLETECHNOTYPE +1=ANOTHERTECHNOTYPE,YETANOTHERTECHNOTYPE +; ... ``` -### Weapons fired on warping in / out +### `92` Wait If No Target Found -- It is now possible to add weapons that are fired on a teleporting TechnoType when it warps in or out. They are at the same time as the appropriate animations (`WarpIn` / `WarpOut`) are displayed. - - `WarpInMinRangeWeapon` is used instead of `WarpInWeapon` if the distance traveled (in leptons) was less than `ChronoRangeMinimum`. This works regardless of if `ChronoTrigger` is set or not. If `WarpInMinRangeWeapon` is not set, it defaults to `WarpInWeapon`. - - If `WarpInWeapon.UseDistanceAsDamage` is set, `Damage` of `WarpIn(MinRange)Weapon` is overriden by the number of whole cells teleported across. +- When executed before a new Attack ScriptType Actions like `74-81` and `84-91` the TeamType will remember that must wait 1 second if no target was selected. The second parameter is a positive value that specifies how much retries the Attack will do when no target was found before new Attack ScriptType Action is discarded & the script execution jumps to the next line. The value `0` means infinite retries. -In `rulesmd.ini`: +In `aimd.ini`: ```ini -[SOMETECHNO] ; TechnoType -WarpInWeapon= ; WeaponType -WarpInMinRangeWeapon= ; WeaponType -WarpInWeapon.UseDistanceAsDamage=false ; boolean -WarpOutWeapon= ; WeaponType +[SOMESCRIPTTYPE] ; ScriptType +x=92,n ; integer n=0 ``` -## Terrains - -### Destroy animation & sound +### `93` Team's Trigger Weight Reward -- You can now specify a destroy animation and sound for a TerrainType that are played when it is destroyed. +- When executed before a new Attack ScriptType Actions like `74-81` and `84-91` the TeamType will remember that must be rewarded increasing the current Weight of the AI Trigger when the TeamType Target was killed by any of the Team members. The current Weight will never surprass the Minimum Weight and Maximum Weight limits of the AI Trigger. The second parameter is a positive value. -In `rulesmd.ini`: +In `aimd.ini`: ```ini -[SOMETERRAINTYPE] ; TerrainType -DestroyAnim= ; Animation -DestroySound= ; Sound +[SOMESCRIPTTYPE] ; ScriptType +x=93,n ; integer n=0 ``` -## Weapons +### `94` Pick A Random Script -### Burst.Delays +- When executed this action picks a random Script Type and replaces the current script by the new picked. The second parameter is a 0-based index from the new section `AIScriptsList` explained below. -- Allows specifying weapon-specific burst shot delays. Takes precedence over the old `BurstDelayX` logic available on VehicleTypes, functions with Infantry & BuildingType weapons (AircraftTypes are not supported due to their weapon firing system being completely different) and allows every shot of `Burst` to have a separate delay instead of only first four shots. -- If no delay is defined for a shot, it falls back to last delay value defined (f.ex `Burst=3` and `Burst.Delays=10` would use 10 as delay for all shots). -- Using `-1` as delay reverts back to old logic (`BurstDelay0-3` for VehicleTypes if available or random value between 3-5 otherwise) for that shot. +In `aimd.ini`: +```ini +[SOMESCRIPTTYPE] ; ScriptType +x=94,n +``` + +The second parameter is a 0-based index for the `AIScriptsList` section that specifies the list of possible `ScriptTypes` that can be evaluated. The new `AIScriptsList` section must be declared in `rulesmd.ini` for making this script work: In `rulesmd.ini`: ```ini -[SOMEWEAPON] ; WeaponType -Burst.Delays=-1 ; int - burst delays (comma-separated) for shots in order from first to last. +[AIScriptsList] ; List of ScriptType lists +0=SOMESCRIPTTYPE,SOMEOTHERSCRIPTTYPE,SAMPLESCRIPTTYPE +1=ANOTHERSCRIPTTYPE,YETANOTHERSCRIPTTYPE +; ... ``` -### Strafing aircraft weapon customization +### `95-98`, `106-109` Moving Team to techno location -![image](_static/images/strafing-01.gif) -*Strafing aircraft weapon customization in [Project Phantom](https://www.moddb.com/mods/project-phantom)* +- These Actions instructs the TeamType to use the TaskForce to approach the target specified by the second parameter. Look at the tables below for the possible Actions (first parameter value). -- Some of the behavior of strafing aircraft weapons (weapon projectile has `ROT` below 2) can now be customized. - - `Strafing.Shots` controls the number of times the weapon is fired during a single strafe run. `Ammo` is only deducted at the end of the strafe run, regardless of the number of shots fired. Valid values range from 1 to 5, any values smaller or larger are effectively treated same as either 1 or 5, respectively. Defaults to 5. - - `Strafing.SimulateBurst` controls whether or not the shots fired during strafing simulate behavior of `Burst`, allowing for alternating firing offset. Only takes effect if weapon has `Burst` set to 1 or undefined. Defaults to false. +In `aimd.ini`: +```ini +[SOMESCRIPTTYPE] ; ScriptType +x=i,n ; where 95 <= i <= 98 or 106 <= i <= 109 +``` -In `rulesmd.ini`: +| *Action* | *Argument* | Target Owner | *Target Priority* | *Description* | +| :------: | :-----------: | :----------: | :---------------: | :-------------------------------------------: | +95 | Target Type# | Enemy | Closer, higher threat | | +96 | Target Type# | Enemy | Farther, higher threat | | +97 | Target Type# | Friendly | Closer | | +98 | Target Type# | Friendly | Farther | | +99 | [AITargetType] index# | Enemy | Closer, higher threat | | +100 | [AITargetType] index# | Enemy | Farther, higher threat | | +101 | [AITargetType] index# | Friendly | Closer | | +102 | [AITargetType] index# | Friendly | Farther | | +106 | [AITargetType] index# | Enemy | Closer | Picks 1 random target from the selected list | +107 | [AITargetType] index# | Enemy | Farther | Picks 1 random target from the selected list | +108 | [AITargetType] index# | Friendly | Closer | Picks 1 random target from the selected list | +109 | [AITargetType] index# | Friendly | Farther | Picks 1 random target from the selected list | + +### `103` Modify Target Distance + +- By default Movement actions `95-102` & `106-109` ends when the Team Leader reaches a distance declared in rulesmd.ini called CloseEnough. When this action is executed before the Movement actions `95-102` overwrites CloseEnough value. This action works only the first time and CloseEnough will be used again the next Movement action. + +In `aimd.ini`: ```ini -[SOMEWEAPON] ; WeaponType -Strafing.Shots=5 ; integer -Strafing.SimulateBurst=false ; bool +[SOMESCRIPTTYPE] ; ScriptType +x=103,n ``` -### Radiation enhancements +### `110` Set Move Action End Mode -- Radiation now has owner by default, so any rad-kills will be scored. This behavior can be reverted by a corresponding tag. - - `AffectsAllies`, `AffectsOwner` and `AffectsEnemies` on `RadSiteWarhead` are respected. - - Currently the rad maker doesn't gain experience from kills, this may change in future. -- Radiation is now able to deal damage to Buildings. To enable set `RadApplicationDelay.Building` value more than 0. +- Sets how the Movement actions ends and jumps to the next line. This action works only the first time and CloseEnough will be used again the next Movement action. -In `rulesmd.ini`: +In `aimd.ini`: ```ini -[SOMEWEAPON] ; WeaponType -Rad.NoOwner=no ; boolean +[SOMESCRIPTTYPE] ; ScriptType +x=110,n ``` -### Weapon targeting filter +- The possible argument values are: -- You can now specify which targets or houses a weapon can fire at. This also affects weapon selection, other than certain special cases where the selection is fixed. - - Note that `CanTarget` explicitly requires either `all` or `empty` to be listed for the weapon to be able to fire at cells containing no TechnoTypes. +| *Argument* | *Action ends when...* | +| :------: | :-------------------------------------------: | +0 | Team Leader reaches the minimum distance | +1 | One unit reaches the minimum distance | +2 | All team members reached the minimum distance | -In `rulesmd.ini`: +### `111` Un-register Team success + +- Is just the opposite effect of the script action `49,0`. Like if the Team failed. + +In `aimd.ini`: ```ini -[SOMEWEAPON] ; WeaponType -CanTarget=all ; list of Affected Target Enumeration (none|land|water|empty|infantry|units|buildings|all) -CanTargetHouses=all ; list of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all) +[SOMESCRIPTTYPE] ; ScriptType +x=111,0 ``` -### AreaFire target customization +### `112` Regroup temporarily around the Team Leader -- You can now specify how AreaFire weapon picks its target. By default it targets the base cell the firer is currently on, but this can now be changed to fire on the firer itself or at a random cell within the radius of the weapon's `Range` by setting `AreaFire.Target` to `self` or `random` respectively. -- `AreaFire.Target=self` respects normal targeting rules (Warhead Verses etc.) against the firer itself. -- `AreaFire.Target=random` ignores cells that are ineligible or contain ineligible objects based on listed values in weapon's `CanTarget` & `CanTargetHouses`. +- Puts the TaskForce into Area Guard Mode for the given amount of time around the Team Leader (this unit remains almost immobile until the action ends). The default radius around the Leader is `[General] > CloseEnough` and the units will not leave that area. -In `rulesmd.ini`: +In `aimd.ini`: ```ini -[SOMEWEAPON] ; WeaponType -AreaFire.Target=base ; AreaFire Target Enumeration (base|self|random) +[SOMESCRIPTTYPE] ; ScriptType +x=112,n ``` -### Feedback weapon +### `113` Randomly Skip Next Action -- You can now specify an auxiliary weapon to be fired on the firer itself when a weapon is fired. - - `FireInTransport` setting of the feedback weapon is respected to determine if it can be fired when the original weapon is fired from inside `OpenTopped=true` transport. If feedback weapon is fired, it is fired on the transport. `OpenToppedDamageMultiplier` is not applied on feedback weapons. +- When executed this action picks a random value between 1 and 100. If the value is equal or below the second parameter then the next action will be skipped. If the second parameter is 0 means that the next action will never be skipped and 100 means thay always will be skipped. -In `rulesmd.ini`: +In `aimd.ini`: +```ini +[SOMESCRIPTTYPE] ; ScriptType +x=113,n ; where 0 > n <= 100 +``` + +### `500 - 523` Edit Variable +- Operate a variable's value + - The variable's value type is int16 instead of int32 in trigger actions for some reason, which means it ranges from -2^15 to 2^15-1. + - Any numbers exceeding this limit will lead to unexpected results! + +In `aimd.ini`: +```ini +[SOMESCRIPTTYPE] ; ScriptType +x=i,n ; where 500 <= i <= 523, n is made up of two parts, the low 16 bits is being used to store the variable index, the high 16 bits is being used for storing the param value. +``` + +### `524 - 547` Edit Variable by Local Variable +- Operate a variable's value by a local variable's value + - Similar to 500-523, but the number to operate the value is being read from a local variable + +In `aimd.ini`: ```ini -[SOMEWEAPON] ; WeaponType -FeedbackWeapon= ; WeaponType +[SOMESCRIPTTYPE] ; ScriptType +x=i,n ; where 524 <= i <= 547, n is made up of two parts, the low 16 bits is being used to store the variable index, the high 16 bits is being used for storing the local variable index. ``` -## Warheads +### `548 - 571` Edit Variable by Global Variable +- Operate a variable's value by a global variable's value + - Similar to 500-523, but the number to operate the value is being read from a global variable -```{hint} -All new warheads can be used with CellSpread and Ares' GenericWarhead superweapon where applicable. +In `aimd.ini`: +```ini +[SOMESCRIPTTYPE] ; ScriptType +x=i,n ; where 548 <= i <= 571, n is made up of two parts, the low 16 bits is being used to store the variable index, the high 16 bits is being used for storing the global variable index. ``` -### Generate credits on impact +## Super Weapons -![image](_static/images/hackerfinallyworks-01.gif) -*`TransactMoney` used in [Rise of the East](https://www.moddb.com/mods/riseoftheeast) mod* +### LimboDelivery -- Warheads can now give credits to its owner at impact. +- Super Weapons can now deliver off-map buildings that act as if they were on the field. + - `LimboDelivery.Types` is the list of BuildingTypes that will be created when the Super Weapons fire. Super Weapon Type and coordinates do not matter. + - `LimboDelivery.IDs` is the list of numeric IDs that will be assigned to buildings. Necessary for LimboKill to work. -In `rulesmd.ini`: -```ini -[SOMEWARHEAD] ; Warhead -TransactMoney=0 ; integer - credits added or subtracted -``` +- Created buildings are not affected by any on-map threats. The only way to remove them from the game is by using a Super Weapon with LimboKill set. + - `LimboKill.Affects` sets which houses are affected by this feature. + - `LimboKill.IDs` lists IDs that will be targeted. Buildings with these IDs will be removed from the game instantly. -### Reveal map for owner on impact +- Delivery can be made random with these optional tags. The game will randomly choose only a single building from the list for each roll chance provided. + - `LimboDelivery.RollChance` lits chances of each "dice roll" happening. Valid values range from 0% (never happens) to 100% (always happens). Defaults to a single sure roll. + - `LimboDelivery.RandomWeightsN` lists the weights for each "dice roll" that increase the probability of picking a specific building. Valid values are 0 (don't pick) and above (the higher value, the bigger the likelyhood). `RandomWeights` are a valid alias for `RandomWeights0`. If a roll attempt doesn't have weights specified, the last weights will be used. -![image](_static/images/revealwarhead-01.gif) -*`SpySat=yes` on `[NUKE]` warhead reveals the map when nuclear missile detonates* +Note: This feature might not support every building flag. Flags that are confirmed to work correctly are listed below: + - FactoryPlant + - OrePurifier + - SpySat + - KeepAlive (Ares 3.0) + - Prerequisite, PrerequisiteOverride, Prerequisite.List# (Ares 0.1), Prerequisite.Negative (Ares 0.1), GenericPrerequisites (Ares 0.1) + - SuperWeapon, SuperWeapon2, SuperWeapons (Ares 0.9), SW.AuxBuildings (Ares 0.9), SW.NegBuildings (Ares 0.9) -- Warheads can now reveal the entire map on impact. -- Reveal only applies to the owner of the warhead. +Note: In order for this feature to work with AITriggerTypes conditions ("Owning house owns ???" and "Enemy house owns ???"), `LegalTarget` must be set to true. +```{warning} +Remember that Limbo Delivered buildings don't exist physically! This means they should never have enabled machanics that require interaction with the game world (i.e. factories, cloning vats, service depots, helipads). They also **should have either `KeepAlive=no` set or be killable with LimboKill** - otherwise the game might never end. +``` In `rulesmd.ini`: ```ini -[SOMEWARHEAD] ; Warhead -SpySat=no ; boolean +[SOMESW] ; Super Weapon +LimboDelivery.Types= ; List of BuildingTypes +LimboDelivery.IDs= ; List of numeric IDs. -1 cannot be used. +LimboDelivery.RollChances= ; List of percentages. +LimboDelivery.RandomWeightsN= ; List of integers. +LimboKill.Affects=self ; Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all) +LimboKill.IDs= ; List of numeric IDs. ``` -### Shroud map for enemies on impact +## Technos -- Warheads can now shroud the entire map on impact. -- Shroud only applies to enemies of the warhead owner. +### Automatic Passenger Deletion + +- Transports with these tags will erase the passengers overtime. Bigger units takes more time. Optionally this logic can work like a grinder. + - Good combination with Ares Abductor logic. In `rulesmd.ini`: ```ini -[SOMEWARHEAD] ; Warhead -BigGap=no ; boolean +[SOMETECHNO] ; TechnoType +PassengerDeletion.Rate=0 ; integer, game frames +PassengerDeletion.Rate.SizeMultiply=yes ; boolean, whether to multiply frames amount by size +PassengerDeletion.Soylent=no ; boolean +PassengerDeletion.SoylentFriendlies=no ; boolean +PassengerDeletion.ReportSound= ; sound +PassengerDeletion.Anim= ; animation ``` -### Remove disguise on impact +### Automatically firing weapons -- Warheads can now remove disguise from disguised infantry such as spies. This will work even if the disguised was acquired by default through `PermaDisguise`. +- You can now make TechnoType automatically fire its weapon(s) without having to scan for suitable targets by setting `AutoFire`, on either its base cell (in which case the weapon that is used for force-firing is used) or itself (in which case normal targeting and weapon selection rules and are respected) depending on if `AutoFire.TargetSelf` is set or not. In `rulesmd.ini`: ```ini -[SOMEWARHEAD] ; Warhead -RemoveDisguise=no ; boolean +[SOMETECHNO] ; TechnoType +AutoFire=no ; boolean +AutoFire.TargetSelf=no ; boolean ``` -### Break Mind Control on impact +### Customizable OpenTopped Properties -- Warheads can now break mind control (doesn't apply to perma-MC-ed objects). +- You can now override settings of `OpenTopped` transport properties per TechnoType. -In `rulesmd.ini`: ```ini -[SOMEWARHEAD] ; Warhead -RemoveMindControl=no ; boolean +[SOMETECHNO] ; TechnoType +OpenTopped.RangeBonus=1 ; integer +OpenTopped.DamageMultiplier=1.3 ; float +OpenTopped.WarpDistance=8 ; integer ``` -### Chance-based extra damage or Warhead detonation / 'critical hits' +### Disabling fallback to (Elite)Secondary weapon -- Warheads can now apply additional chance-based damage or Warhead detonation ('critical hits') with the ability to customize chance, damage, affected targets, affected target HP threshold and animations of critical hit. - - `Crit.Chance` determines chance for a critical hit to occur. By default this is checked once when the Warhead is detonated and every target that is susceptible to critical hits will be affected. If `Crit.ApplyChancePerTarget` is set, then whether or not the chance roll is successful is determined individually for each target. - - `Crit.ExtraDamage` determines the damage dealt by the critical hit. If `Crit.Warhead` is set, the damage is used to detonate the specified Warhead on each affected target, otherwise the damage is directly dealt based on current Warhead's `Verses` settings. - - `Crit.Affects` can be used to customize types of targets that this Warhead can deal critical hits against. - - `Crit.AffectsBelowPercent` can be used to set minimum percentage of their maximum `Strength` that targets must have left to be affected by a critical hit. - - `Crit.AnimList` can be used to set a list of animations used instead of Warhead's `AnimList` if Warhead deals a critical hit to even one target. If `Crit.AnimList.PickRandom` is set (defaults to `AnimList.PickRandom`) then the animation is chosen randomly from the list. - - `Crit.AnimOnAffectedTargets`, if set, makes the animation(s) from `Crit.AnimList` play on each affected target *in addition* to animation from Warhead's `AnimList` playing as normal instead of replacing `AnimList` animation. - - `ImmuneToCrit` can be set on TechnoTypes to make them immune to critical hits. +- It is now possible to disable the fallback to `(Elite)Secondary` weapon from `(Elite)Primary` weapon if it cannot fire at the chosen target by setting `NoSecondaryWeaponFallback` to true (defaults to false). This does not apply to special cases where `(Elite)Secondary` weapon is always chosen, including but not necessarily limited to the following: + - `OpenTransportWeapon=1` on an unit firing from inside `OpenTopped=true` transport. + - `NoAmmoWeapon=1` on an unit with `Ammo` value higher than 0 and current ammo count lower or equal to `NoAmmoAmount`. + - Deployed `IsSimpleDeployer=true` units with`DeployFireWeapon=1` set or omitted. + - `DrainWeapon=true` weapons against enemy `Drainable=yes` buildings. + - Units with `IsLocomotor=true` set on `Warhead` of `(Elite)Primary` weapon against buildings. + - Weapons with `ElectricAssault=true` set on `Warhead` against `Overpowerable=true` buildings belonging to owner or allies. + - `Overpowerable=true` buildings that are currently overpowered. + - Any system using `(Elite)WeaponX`, f.ex `Gunner=true` or `IsGattling=true` is also wholly exempt. In `rulesmd.ini`: ```ini -[SOMEWARHEAD] ; Warhead -Crit.Chance=0.0 ; float, percents or absolute (0.0-1.0) -Crit.ApplyChancePerTarget=false ; boolean -Crit.ExtraDamage=0 ; integer -Crit.Warhead= ; Warhead -Crit.Affects=all ; list of Affected Target Enumeration (none|land|water|empty|infantry|units|buildings|all) -Crit.AffectBelowPercent=1.0 ; float, percents or absolute (0.0-1.0) -Crit.AnimList= ; list of animations -Crit.AnimList.PickRandom= ; boolean -Crit.AnimOnAffectedTargets=false ; boolean - [SOMETECHNO] ; TechnoType -ImmuneToCrit=no ; boolean +NoSecondaryWeaponFallback=false ; boolean ``` -```{warning} -If you set `Crit.Warhead` to the same Warhead it is defined on, or create a chain of Warheads with it that loops back to the first one there is a possibility for the game to get stuck in a loop and freeze or crash afterwards. +### Firing offsets for specific Burst shots + +- You can now specify separate firing offsets for each of the shots fired by weapon with `Burst` via using `(Elite)PrimaryFire|SecondaryFire|WeaponX|FLH.BurstN` keys, depending on which weapons your TechnoType makes use of. *N* in `BurstN` is zero-based burst shot index, and the values are parsed sequentially until no value for either regular or elite weapon is present, with elite weapon defaulting to regular weapon FLH if only it is missing. If no burst-index specific value is available, value from the base key (f.ex `PrimaryFireFLH`) is used. +- Burst-index specific firing offsets are absolute firing offsets and the lateral shifting based on burst index that occurs with the base firing offsets is not applied. + +In `artmd.ini`: +```ini +[SOMETECHNO] ; TechnoType Image +PrimaryFireFLH.BurstN= ; int - forward, lateral, height +ElitePrimaryFireFLH.BurstN= ; int - forward, lateral, height +SecondaryFireFLH.BurstN= ; int - forward, lateral, height +EliteSecondaryFireFLH.BurstN= ; int - forward, lateral, height +WeaponXFLH.BurstN= ; int - forward, lateral, height +EliteWeaponXFLH.BurstN= ; int - forward, lateral, height ``` -### Custom 'SplashList' on Warheads +### Initial Strength -![image](_static/images/splashlist-01.gif) -- Allows Warheads to play custom water splash animations. See vanilla's [Conventional](https://www.modenc.renegadeprojects.com/Conventional) system here. +- You can now specify how many hitpoints a TechnoType starts with. In `rulesmd.ini`: ```ini -[SOMEWARHEAD] ; Warhead -SplashList= ; list of animations to play -SplashList.PickRandom=no ; play a random animation from the list? boolean, defaults to no +[SOMETECHNO] ; TechnoType +InitialStrength= ; int ``` -### Trigger specific NotHuman infantry Death anim sequence -- Warheads are now able to trigger specific `NotHuman=yes` infantry `Death` anim sequence using the corresponding tag. It's value represents sequences from `Die1` to `Die5`. +### Kill Unit Automatically + +- Objects can be destroyed automatically under certaing cases: + - No Ammo: The object will die if the remaining ammo reaches 0. + - Countdown: The object will die if the countdown reaches 0. In `rulesmd.ini`: ```ini -[SOMEWARHEAD] ; Warhead -NotHuman.DeathSequence= ; integer (1 to 5) +[SOMETECHNO] ; TechnoType +Death.NoAmmo=no ; boolean +Death.Countdown=0 ; integer ``` -## Projectiles - -### Projectile interception logic +### Mind Control enhancement -![image](_static/images/projectile-interception-01.gif) -*Interception logic used in [Tiberium Crisis](https://www.moddb.com/mods/tiberium-crisis) mod* +![image](_static/images/mindcontrol-max-range-01.gif) +*Mind Control Range Limit used in [Fantasy ADVENTURE](https://www.moddb.com/mods/fantasy-adventure)* +![image](_static/images/mindcontrol-multiple-01.gif) +*Multiple Mind Control unit auto-releases the first victim in [Fantasy ADVENTURE](https://www.moddb.com/mods/fantasy-adventure)* -- Projectiles can now be made targetable by certain TechnoTypes. Interceptor TechnoType's projectile must be `Inviso=yes` and `AA=yes` in order for it to work properly and the projectile must be used in a primary Weapon. - - `Interceptor.GuardRange` is maximum range of the unit to intercept projectile. The unit weapon range will limit the unit interception range though. - - `Interceptor.EliteGuardRange` value is used if the unit veterancy is Elite. - - `Interceptor.MinimumGuardRange` is the minimum range of the unit to intercept projectile. Any projectile under this range will not be intercepted. - - `Interceptor.EliteMinimumGuardRange` value is used if the unit veterancy is Elite. +- Mind controllers now can have the upper limit of the control distance. Tag values greater than 0 will activate this feature. +- Mind controllers with multiple controlling slots can now release the first controlled unit when they have reached the control limit and are ordered to control a new target. +- Allows Warheads to play custom `MindControl.Anim` which defaults to `ControlledAnimationType`. In `rulesmd.ini`: ```ini -[SOMETECHNO] ; TechnoType -Interceptor=no ; boolean -Interceptor.GuardRange=0.0 ; double -Interceptor.EliteGuardRange=0.0 ; double -Interceptor.MinimumGuardRange=0.0 ; double -Interceptor.EliteMinimumGuardRange=0.0 ; double +[SOMETECHNO] ; TechnoType +MindControlRangeLimit=-1.0 ; double +MultiMindControl.ReleaseVictim=no ; boolean -[SOMEPROJECTILE] ; Projectile -Interceptable=no ; boolean +[SOMEWARHEAD] ; Warhead +MindControl.Anim=ControlledAnimationType ; AnimType ``` -### Shrapnel enhancement -- Shrapnel behavior can be triggered on the ground and buildings. +### No Manual Move + +- You can now specify whether a TechnoType is unable to receive move command. -In `rulesmd.ini` ```ini -[SOMEPROJECTILE] ; Projectile -Shrapnel.AffectsGround=no ; boolean -Shrapnel.AffectsBuildings=no ; boolean +[SOMETECHNO] ; TechnoType +NoManualMove=no ; boolean ``` -## Trigger events +### Override Uncloaked Underwater attack behavior -### `500-511` Variable comparation -- Compares the variable's value with given number +![image](_static/images/underwater-new-attack-tag.gif) +*Naval underwater behavior in [C&C: Reloaded](https://www.moddb.com/mods/cncreloaded)* -In `mycampaign.map`: +- Overrides a part of the vanilla YR logic for allowing naval units to use a different weapon if the naval unit is uncloaked. +- Useful if your naval unit have 1 weapon only for underwater and another weapon for surface objects. + +In `rulesmd.ini`: ```ini -[Events] -... -ID=EventCount,[Event1],[EVENTID],2,[VariableIndex],[Param],[EventX] -... +[SOMETECHNO] ; TechnoType +ForceWeapon.Naval.Decloaked=-1 ; Integer. 0 for primary weapon, 1 for secondary weapon ``` -| *Event ID* | *Description* | *Global* | -| :------: | :-------------------------------------------: | :-------: | -500 | CurrentValue > Number | No | -501 | CurrentValue < Number | No | -502 | CurrentValue = Number | No | -503 | CurrentValue >= Number | No | -504 | CurrentValue <= Number | No | -505 | CurrentValue & Number | No | -506 | CurrentValue > Number | Yes | -507 | CurrentValue < Number | Yes | -508 | CurrentValue = Number | Yes | -509 | CurrentValue >= Number | Yes | -510 | CurrentValue <= Number | Yes | -511 | CurrentValue & Number | Yes | +### Promoted Spawns -### `512-523` Variable comparation with local variable -- Compares the variable's value with given local variable value +![image](_static/images/promotedspawns-01.gif) +*Promoted Spawns in [Fantasy ADVENTURE](https://www.moddb.com/mods/fantasy-adventure)* + +- The spawned units will promote as their owner's veterancy. + +In `rulesmd.ini`: +```ini +[SOMETECHNO] ; TechnoType +Promote.IncludeSpawns=no ; boolean +``` + +### Spawn range limit + +![image](_static/images/spawnrange-01.gif) +*Limited pursue range for spawns in [Fantasy ADVENTURE](https://www.moddb.com/mods/fantasy-adventure)* -In `mycampaign.map`: +- The spawned units will abort the infinite pursuit if the enemy is out of range. +`Spawner.ExtraLimitRange` adds extra pursuit range to the spawned units. + +In `rulesmd.ini`: ```ini -[Events] -... -ID=EventCount,[Event1],[EVENTID],2,[VariableIndex],[LocalVariableIndex],[EventX] -... +[SOMETECHNO] ; TechnoType +Spawner.LimitRange=no ; boolean +Spawner.ExtraLimitRange=0 ; integer ``` -| *Event ID* | *Description* | *Global* | -| :------: | :-------------------------------------------: | :-------: | -512 | CurrentValue > LocalVariableValue | No | -513 | CurrentValue < LocalVariableValue | No | -514 | CurrentValue = LocalVariableValue | No | -515 | CurrentValue >= LocalVariableValue | No | -516 | CurrentValue <= LocalVariableValue | No | -517 | CurrentValue & LocalVariableValue | No | -518 | CurrentValue > LocalVariableValue | Yes | -519 | CurrentValue < LocalVariableValue | Yes | -520 | CurrentValue = LocalVariableValue | Yes | -521 | CurrentValue >= LocalVariableValue | Yes | -522 | CurrentValue <= LocalVariableValue | Yes | -523 | CurrentValue & LocalVariableValue | Yes | +### Weapons fired on warping in / out -### `524-535` Variable comparation with global variable -- Compares the variable's value with given global variable value +- It is now possible to add weapons that are fired on a teleporting TechnoType when it warps in or out. They are at the same time as the appropriate animations (`WarpIn` / `WarpOut`) are displayed. + - `WarpInMinRangeWeapon` is used instead of `WarpInWeapon` if the distance traveled (in leptons) was less than `ChronoRangeMinimum`. This works regardless of if `ChronoTrigger` is set or not. If `WarpInMinRangeWeapon` is not set, it defaults to `WarpInWeapon`. + - If `WarpInWeapon.UseDistanceAsDamage` is set, `Damage` of `WarpIn(MinRange)Weapon` is overriden by the number of whole cells teleported across. -In `mycampaign.map`: +In `rulesmd.ini`: ```ini -[Events] -... -ID=EventCount,[Event1],[EVENTID],2,[VariableIndex],[GlobalVariableIndex],[EventX] -... +[SOMETECHNO] ; TechnoType +WarpInWeapon= ; WeaponType +WarpInMinRangeWeapon= ; WeaponType +WarpInWeapon.UseDistanceAsDamage=false ; boolean +WarpOutWeapon= ; WeaponType ``` -| *Event ID* | *Description* | *Global* | -| :------: | :-------------------------------------------: | :-------: | -524 | CurrentValue > GlobalVariableValue | No | -525 | CurrentValue < GlobalVariableValue | No | -526 | CurrentValue = GlobalVariableValue | No | -527 | CurrentValue >= GlobalVariableValue | No | -528 | CurrentValue <= GlobalVariableValue | No | -529 | CurrentValue & GlobalVariableValue | No | -530 | CurrentValue > GlobalVariableValue | Yes | -531 | CurrentValue < GlobalVariableValue | Yes | -532 | CurrentValue = GlobalVariableValue | Yes | -533 | CurrentValue >= GlobalVariableValue | Yes | -534 | CurrentValue <= GlobalVariableValue | Yes | -535 | CurrentValue & GlobalVariableValue | Yes | +## Terrains + +### Destroy animation & sound +- You can now specify a destroy animation and sound for a TerrainType that are played when it is destroyed. + +In `rulesmd.ini`: +```ini +[SOMETERRAINTYPE] ; TerrainType +DestroyAnim= ; Animation +DestroySound= ; Sound +``` ## Trigger actions @@ -908,345 +975,277 @@ ID=ActionCount,[Action1],506,0,0,[SuperWeaponTypesIndex],[HouseIndex],[WaypointI ... ``` -## Script actions - -### `71` Timed Area Guard - -- Puts the TaskForce into Area Guard Mode for the given units of time. Unlike the original timed Guard script (`5,n`) that just stays in place doing a basic guard operation the "Area Guard" action has a more active role attacking nearby invaders or defending units that needs protection. - -In `aimd.ini`: -```ini -[SOMESCRIPTTYPE] ; ScriptType -x=71,n ; integer, time in ingame seconds -``` - -### `72` Load Onto Transports - -- If the TaskForce contains unit(s) that can be carried by the transports of the same TaskForce then this action will make the units enter the transports. In Single player missions the next action must be "Wait until fully loaded" (`43,0`) or the script will not continue. - -In `aimd.ini`: -```ini -[SOMESCRIPTTYPE] ; ScriptType -x=72,0 -``` - -### `73` Wait until ammo is full - -- If the TaskForce contains unit(s) that use ammo then the the script will not continue until all these units have fully refilled the ammo. - -In `aimd.ini`: -```ini -[SOMESCRIPTTYPE] ; ScriptType -x=73,0 -``` - -### `74-81` Generic Target Type Attack Action - -- These Actions instruct the TeamType to use the TaskForce to approach and attack the target specified by the second parameter which is an index of a generic pre-defined group. Look at the tables below for the possible Actions (first parameter value) and Arguments (the second parameter value). - - For threat-based attack actions `TargetSpecialThreatCoefficientDefault` and `EnemyHouseThreatBonus` tags from `rulesmd.ini` are accounted. - - All Aircrafts that attack other air units will end the script. This behavior is intentional because without it aircrafts had some bugs that weren't fixable at the time of developing the feature. - -In `aimd.ini`: -```ini -[SOMESCRIPTTYPE] ; ScriptType -x=i,n ; where 74 <= i <= 81 -``` - -| *Action* | *Argument* | *Repeats* | *Target Priority* | *Description* | -| :------: | :----------: | :-------: | :---------------: | :-------------------------------------------: | -74 | Target Type# | Yes | Closer, higher threat | | -75 | Target Type# | Yes | Farther, higher threat | | -76 | Target Type# | Yes | Closer | | -77 | Target Type# | Yes | Farther | | -78 | Target Type# | No | Closer, higher threat | Ends when a team member kill the designated target | -79 | Target Type# | No | Farther, higher threat | Ends when a team member kill the designated target | -80 | Target Type# | No | Closer | Ends when a team member kill the designated target | -81 | Target Type# | No | Farther | Ends when a team member kill the designated target | - -- The following values are the *Target Type#* which can be used as second parameter of the new attack script actions: - -| *Value* | *Target Type* | *Description* | -| :-----: | :---------------: | :-------------------------------------------: | -1 | Anything | Any enemy `VehicleTypes`, `AircraftTypes`, `InfantryTypes` and `BuildingTypes` | -2 | Structures | Any enemy `BuildingTypes` without `Artillary=yes`, `TickTank=yes`, `ICBMLauncher=yes` or `SensorArray=yes` | -3 | Ore Miners | Any enemy `VehicleTypes` with `Harvester=yes` or `ResourceGatherer=yes`, `BuildingTypes` with `ResourceGatherer=yes` | -4 | Infantry | Any enemy `InfantryTypes` | -5 | Vehicles | Any enemy `VehicleTypes`, `AircraftTypes`, `BuildingTypes` with `Artillary=yes`, `TickTank=yes`, `ICBMLauncher=yes` & `SensorArray=yes` | -6 | Factories | Any enemy `BuildingTypes` with a Factory= setting | -7 | Base Defenses | Any enemy `BuildingTypes` with `IsBaseDefense=yes` | -8 | House Threats | Any object that targets anything of the Team's House or any enemy that is near to the Team Leader | -9 | Power Plants | Any enemy `BuildingTypes` with positive `Power=` values | -10 | Occupied | Any `BuildingTypes` with garrisoned infantry | -11 | Tech Buildings | Any `BuildingTypes` with `Unsellable=yes`, `Capturable=yes`, negative `TechLevel=` values or appears in `[AI]>NeutralTechBuildings=` list | -12 | Refinery | Any enemy `BuildingTypes` with `Refinery=yes` or `ResourceGatherer=yes`, `VehicleTypes` with `ResourceGatherer=yes` & `Harvester=no` (i.e. Slave Miner) | -13 | Mind Controller | Anything `VehicleTypes`, `AircraftTypes`, `InfantryTypes` and `BuildingTypes` with `MindControl=yes` in the weapons Warheads | -14 | Air Units | Any enemy `AircraftTypes`, flying `VehicleTypes` or `InfantryTypes` | -15 | Naval | Any enemy `BuildingTypes` and `VehicleTypes` with a `Naval=yes`, any enemy `VehicleTypes`, `AircraftTypes`, `InfantryTypes` in a water cell | -16 | Disruptors | Any enemy objects with positive `InhibitorRange=` values, positive `RadarJamRadius=` values, `CloakGenerator=yes` or `GapGenerator=yes` | -17 | Ground Vehicles | Any enemy `VehicleTypes` without `Naval=yes`, landed `AircraftTypes`, Deployed vehicles into `BuildingTypes` | -18 | Economy | Any enemy `VehicleTypes` with `Harvester=yes` or `ResourceGatherer=yes`, `BuildingTypes` with `Refinery=yes`, `ResourceGatherer=yes` or `OrePurifier=yes` | -19 | Infantry Factory | Any enemy `BuildingTypes` with `Factory=InfantryType` | -20 | Vehicle Factory | Any enemy `BuildingTypes` with `Factory=UnitType` | -21 | Aircraft Factory | Any enemy `BuildingTypes` with `Factory=AircraftType` | -22 | Radar | Any enemy `BuildingTypes` with `Radar=yes` or `SpySat=yes` | -23 | Tech Lab | Any enemy `BuildingTypes` in `[AI]>BuildTech=` list | -24 | Naval Factory | Any enemy `BuildingTypes` with `Naval=yes` and `Factory=UnitType` | -25 | Super Weapon | Any enemy `BuildingTypes` with `SuperWeapon=`, `SuperWeapon2=` or `SuperWeapons=` | -26 | Construction Yard | Any enemy `BuildingTypes` with `ConstructionYard=yes` and `Factory=BuildingType` | -27 | Neutrals | Any neutral object (Civilian) | -28 | Generators | Any enemy `BuildingTypes` with `CloakGenerator=yes` or `GapGenerator=yes` | -29 | Radar Jammer | Any enemy objects with positive `RadarJamRadius=` values | -30 | Inhibitors | Any enemy objects with positive `InhibitorRange=` values | -31 | Naval Units | Any enemy `VehicleTypes` with a `Naval=yes` or any enemy `VehicleTypes`, `AircraftTypes`, `InfantryTypes` in a water cell | -32 | Mobile Units | Anything `VehicleTypes`, `AircraftTypes` and `InfantryTypes` | -33 | Capturable | Any `BuildingTypes` with `Capturable=yes` or any `BuildingTypes` with `BridgeRepairHut=yes` and `Repairable=yes` | -34 | Area Threats | Any enemy object that is inside of the Team Leader's Guard Area | - -### `82` Decrease AI Trigger Current Weight +## Trigger events -- When executed this decreases the current Weight of the AI Trigger.The current Weight will never surprass the Minimum Weight and Maximum Weight limits of the AI Trigger. Take note that all TeamTypes of the same AI Trigger will update sooner or later the AI Trigger Current Weight. The second parameter is a positive value. Take note that the original game only uses the first of the two Teams for calculating the AI Trigger Current Weight at the end of the Trigger life, this action ignores if the Team is the first or the second of the AI Trigger and the Current Weight is calculated when is executed the action. +### `500-511` Variable comparation +- Compares the variable's value with given number -In `aimd.ini`: +In `mycampaign.map`: ```ini -[SOMESCRIPTTYPE] ; ScriptType -x=82,n +[Events] +... +ID=EventCount,[Event1],[EVENTID],2,[VariableIndex],[Param],[EventX] +... ``` -### `83` Increase AI Trigger Current Weight +| *Event ID* | *Description* | *Global* | +| :------: | :-------------------------------------------: | :-------: | +500 | CurrentValue > Number | No | +501 | CurrentValue < Number | No | +502 | CurrentValue = Number | No | +503 | CurrentValue >= Number | No | +504 | CurrentValue <= Number | No | +505 | CurrentValue & Number | No | +506 | CurrentValue > Number | Yes | +507 | CurrentValue < Number | Yes | +508 | CurrentValue = Number | Yes | +509 | CurrentValue >= Number | Yes | +510 | CurrentValue <= Number | Yes | +511 | CurrentValue & Number | Yes | -- When executed this increases the current Weight of the AI Trigger.The current Weight will never surprass the Minimum Weight and Maximum Weight limits of the AI Trigger. Take note that all TeamTypes of the same AI Trigger will update sooner or later the AI Trigger Current Weight. The second parameter is a positive value. Take note that the original game only uses the first of the two Teams for calculating the AI Trigger Current Weight at the end of the Trigger life, this action ignores if the Team is the first or the second of the AI Trigger and the Current Weight is calculated when is executed the action. +### `512-523` Variable comparation with local variable +- Compares the variable's value with given local variable value -In `aimd.ini`: +In `mycampaign.map`: ```ini -[SOMESCRIPTTYPE] ; ScriptType -x=83,n +[Events] +... +ID=EventCount,[Event1],[EVENTID],2,[VariableIndex],[LocalVariableIndex],[EventX] +... ``` -### `84-91`, `104-105` `AITargetTypes` Attack Action +| *Event ID* | *Description* | *Global* | +| :------: | :-------------------------------------------: | :-------: | +512 | CurrentValue > LocalVariableValue | No | +513 | CurrentValue < LocalVariableValue | No | +514 | CurrentValue = LocalVariableValue | No | +515 | CurrentValue >= LocalVariableValue | No | +516 | CurrentValue <= LocalVariableValue | No | +517 | CurrentValue & LocalVariableValue | No | +518 | CurrentValue > LocalVariableValue | Yes | +519 | CurrentValue < LocalVariableValue | Yes | +520 | CurrentValue = LocalVariableValue | Yes | +521 | CurrentValue >= LocalVariableValue | Yes | +522 | CurrentValue <= LocalVariableValue | Yes | +523 | CurrentValue & LocalVariableValue | Yes | -- These Actions instruct the TeamType to use the TaskForce to approach and attack the target specified by the second parameter which is an index of a modder-defined group from `AITargetTypess`. Look at the tables below for the possible Actions (first parameter value) and Arguments (the second parameter value). - - For threat-based attack actions `TargetSpecialThreatCoefficientDefault` and `EnemyHouseThreatBonus` tags from `rulesmd.ini` are accounted. - - All Aircrafts that attack other air units will end the script. This behavior is intentional because without it aircrafts had some bugs that weren't fixable at the time of developing the feature. +### `524-535` Variable comparation with global variable +- Compares the variable's value with given global variable value -In `aimd.ini`: +In `mycampaign.map`: ```ini -[SOMESCRIPTTYPE] ; ScriptType -x=i,n ; where 84 <= i <= 91 or 104 <= i <= 105 +[Events] +... +ID=EventCount,[Event1],[EVENTID],2,[VariableIndex],[GlobalVariableIndex],[EventX] +... ``` -| *Action* | *Argument* | *Repeats* | *Target Priority* | *Description* | -| :------: | :----------: | :-------: | :---------------: | :-------------------------------------------: | -84 | `AITargetTypes` index# | Yes | Closer, higher threat | | -85 | `AITargetTypes` index# | Yes | Farther, higher threat | | -86 | `AITargetTypes` index# | Yes | Closer | | -87 | `AITargetTypes` index# | Yes | Farther | | -88 | `AITargetTypes` index# | No | Closer, higher threat | Ends when a team member kill the designated target | -89 | `AITargetTypes` index# | No | Farther, higher threat | Ends when a team member kill the designated target | -90 | `AITargetTypes` index# | No | Closer | Ends when a team member kill the designated target | -91 | `AITargetTypes` index# | No | Farther | Ends when a team member kill the designated target | -104 | `AITargetTypes` index# | Yes | Closer | Picks 1 random target from the list | -105 | `AITargetTypes` index# | Yes | Farther | Picks 1 random target from the list | +| *Event ID* | *Description* | *Global* | +| :------: | :-------------------------------------------: | :-------: | +524 | CurrentValue > GlobalVariableValue | No | +525 | CurrentValue < GlobalVariableValue | No | +526 | CurrentValue = GlobalVariableValue | No | +527 | CurrentValue >= GlobalVariableValue | No | +528 | CurrentValue <= GlobalVariableValue | No | +529 | CurrentValue & GlobalVariableValue | No | +530 | CurrentValue > GlobalVariableValue | Yes | +531 | CurrentValue < GlobalVariableValue | Yes | +532 | CurrentValue = GlobalVariableValue | Yes | +533 | CurrentValue >= GlobalVariableValue | Yes | +534 | CurrentValue <= GlobalVariableValue | Yes | +535 | CurrentValue & GlobalVariableValue | Yes | -- The second parameter with a 0-based index for the `AITargetTypes` section specifies the list of possible `VehicleTypes`, `AircraftTypes`, `InfantryTypes` and `BuildingTypes` that can be evaluated. The new `AITargetTypes` section must be declared in `rulesmd.ini` for making this script work: +## Warheads -In `rulesmd.ini`: -```ini -[AITargetTypes] ; List of TechnoType lists -0=SOMETECHNOTYPE,SOMEOTHERTECHNOTYPE,SAMPLETECHNOTYPE -1=ANOTHERTECHNOTYPE,YETANOTHERTECHNOTYPE -; ... +```{hint} +All new warheads can be used with CellSpread and Ares' GenericWarhead superweapon where applicable. ``` -### `92` Wait If No Target Found +### Break Mind Control on impact -- When executed before a new Attack ScriptType Actions like `74-81` and `84-91` the TeamType will remember that must wait 1 second if no target was selected. The second parameter is a positive value that specifies how much retries the Attack will do when no target was found before new Attack ScriptType Action is discarded & the script execution jumps to the next line. The value `0` means infinite retries. +- Warheads can now break mind control (doesn't apply to perma-MC-ed objects). -In `aimd.ini`: +In `rulesmd.ini`: ```ini -[SOMESCRIPTTYPE] ; ScriptType -x=92,n ; integer n=0 +[SOMEWARHEAD] ; Warhead +RemoveMindControl=no ; boolean ``` -### `93` Team's Trigger Weight Reward - -- When executed before a new Attack ScriptType Actions like `74-81` and `84-91` the TeamType will remember that must be rewarded increasing the current Weight of the AI Trigger when the TeamType Target was killed by any of the Team members. The current Weight will never surprass the Minimum Weight and Maximum Weight limits of the AI Trigger. The second parameter is a positive value. +### Chance-based extra damage or Warhead detonation / 'critical hits' -In `aimd.ini`: +- Warheads can now apply additional chance-based damage or Warhead detonation ('critical hits') with the ability to customize chance, damage, affected targets, affected target HP threshold and animations of critical hit. + - `Crit.Chance` determines chance for a critical hit to occur. By default this is checked once when the Warhead is detonated and every target that is susceptible to critical hits will be affected. If `Crit.ApplyChancePerTarget` is set, then whether or not the chance roll is successful is determined individually for each target. + - `Crit.ExtraDamage` determines the damage dealt by the critical hit. If `Crit.Warhead` is set, the damage is used to detonate the specified Warhead on each affected target, otherwise the damage is directly dealt based on current Warhead's `Verses` settings. + - `Crit.Affects` can be used to customize types of targets that this Warhead can deal critical hits against. + - `Crit.AffectsBelowPercent` can be used to set minimum percentage of their maximum `Strength` that targets must have left to be affected by a critical hit. + - `Crit.AnimList` can be used to set a list of animations used instead of Warhead's `AnimList` if Warhead deals a critical hit to even one target. If `Crit.AnimList.PickRandom` is set (defaults to `AnimList.PickRandom`) then the animation is chosen randomly from the list. + - `Crit.AnimOnAffectedTargets`, if set, makes the animation(s) from `Crit.AnimList` play on each affected target *in addition* to animation from Warhead's `AnimList` playing as normal instead of replacing `AnimList` animation. + - `ImmuneToCrit` can be set on TechnoTypes to make them immune to critical hits. + +In `rulesmd.ini`: ```ini -[SOMESCRIPTTYPE] ; ScriptType -x=93,n ; integer n=0 +[SOMEWARHEAD] ; Warhead +Crit.Chance=0.0 ; float, percents or absolute (0.0-1.0) +Crit.ApplyChancePerTarget=false ; boolean +Crit.ExtraDamage=0 ; integer +Crit.Warhead= ; Warhead +Crit.Affects=all ; list of Affected Target Enumeration (none|land|water|empty|infantry|units|buildings|all) +Crit.AffectBelowPercent=1.0 ; float, percents or absolute (0.0-1.0) +Crit.AnimList= ; list of animations +Crit.AnimList.PickRandom= ; boolean +Crit.AnimOnAffectedTargets=false ; boolean + +[SOMETECHNO] ; TechnoType +ImmuneToCrit=no ; boolean ``` -### `94` Pick A Random Script +```{warning} +If you set `Crit.Warhead` to the same Warhead it is defined on, or create a chain of Warheads with it that loops back to the first one there is a possibility for the game to get stuck in a loop and freeze or crash afterwards. +``` -- When executed this action picks a random Script Type and replaces the current script by the new picked. The second parameter is a 0-based index from the new section `AIScriptsList` explained below. +### Custom 'SplashList' on Warheads -In `aimd.ini`: +![image](_static/images/splashlist-01.gif) +- Allows Warheads to play custom water splash animations. See vanilla's [Conventional](https://www.modenc.renegadeprojects.com/Conventional) system here. + +In `rulesmd.ini`: ```ini -[SOMESCRIPTTYPE] ; ScriptType -x=94,n +[SOMEWARHEAD] ; Warhead +SplashList= ; list of animations to play +SplashList.PickRandom=no ; play a random animation from the list? boolean, defaults to no ``` -The second parameter is a 0-based index for the `AIScriptsList` section that specifies the list of possible `ScriptTypes` that can be evaluated. The new `AIScriptsList` section must be declared in `rulesmd.ini` for making this script work: +### Generate credits on impact + +![image](_static/images/hackerfinallyworks-01.gif) +*`TransactMoney` used in [Rise of the East](https://www.moddb.com/mods/riseoftheeast) mod* + +- Warheads can now give credits to its owner at impact. In `rulesmd.ini`: ```ini -[AIScriptsList] ; List of ScriptType lists -0=SOMESCRIPTTYPE,SOMEOTHERSCRIPTTYPE,SAMPLESCRIPTTYPE -1=ANOTHERSCRIPTTYPE,YETANOTHERSCRIPTTYPE -; ... +[SOMEWARHEAD] ; Warhead +TransactMoney=0 ; integer - credits added or subtracted ``` -### `95-98`, `106-109` Moving Team to techno location +### Remove disguise on impact -- These Actions instructs the TeamType to use the TaskForce to approach the target specified by the second parameter. Look at the tables below for the possible Actions (first parameter value). +- Warheads can now remove disguise from disguised infantry such as spies. This will work even if the disguised was acquired by default through `PermaDisguise`. -In `aimd.ini`: +In `rulesmd.ini`: ```ini -[SOMESCRIPTTYPE] ; ScriptType -x=i,n ; where 95 <= i <= 98 or 106 <= i <= 109 +[SOMEWARHEAD] ; Warhead +RemoveDisguise=no ; boolean ``` -| *Action* | *Argument* | Target Owner | *Target Priority* | *Description* | -| :------: | :-----------: | :----------: | :---------------: | :-------------------------------------------: | -95 | Target Type# | Enemy | Closer, higher threat | | -96 | Target Type# | Enemy | Farther, higher threat | | -97 | Target Type# | Friendly | Closer | | -98 | Target Type# | Friendly | Farther | | -99 | [AITargetType] index# | Enemy | Closer, higher threat | | -100 | [AITargetType] index# | Enemy | Farther, higher threat | | -101 | [AITargetType] index# | Friendly | Closer | | -102 | [AITargetType] index# | Friendly | Farther | | -106 | [AITargetType] index# | Enemy | Closer | Picks 1 random target from the selected list | -107 | [AITargetType] index# | Enemy | Farther | Picks 1 random target from the selected list | -108 | [AITargetType] index# | Friendly | Closer | Picks 1 random target from the selected list | -109 | [AITargetType] index# | Friendly | Farther | Picks 1 random target from the selected list | +### Reveal map for owner on impact -### `103` Modify Target Distance +![image](_static/images/revealwarhead-01.gif) +*`SpySat=yes` on `[NUKE]` warhead reveals the map when nuclear missile detonates* -- By default Movement actions `95-102` & `106-109` ends when the Team Leader reaches a distance declared in rulesmd.ini called CloseEnough. When this action is executed before the Movement actions `95-102` overwrites CloseEnough value. This action works only the first time and CloseEnough will be used again the next Movement action. +- Warheads can now reveal the entire map on impact. +- Reveal only applies to the owner of the warhead. -In `aimd.ini`: +In `rulesmd.ini`: ```ini -[SOMESCRIPTTYPE] ; ScriptType -x=103,n +[SOMEWARHEAD] ; Warhead +SpySat=no ; boolean ``` -### `110` Set Move Action End Mode +### Shroud map for enemies on impact -- Sets how the Movement actions ends and jumps to the next line. This action works only the first time and CloseEnough will be used again the next Movement action. +- Warheads can now shroud the entire map on impact. +- Shroud only applies to enemies of the warhead owner. -In `aimd.ini`: +In `rulesmd.ini`: ```ini -[SOMESCRIPTTYPE] ; ScriptType -x=110,n +[SOMEWARHEAD] ; Warhead +BigGap=no ; boolean ``` -- The possible argument values are: - -| *Argument* | *Action ends when...* | -| :------: | :-------------------------------------------: | -0 | Team Leader reaches the minimum distance | -1 | One unit reaches the minimum distance | -2 | All team members reached the minimum distance | - -### `111` Un-register Team success - -- Is just the opposite effect of the script action `49,0`. Like if the Team failed. +### Trigger specific NotHuman infantry Death anim sequence +- Warheads are now able to trigger specific `NotHuman=yes` infantry `Death` anim sequence using the corresponding tag. It's value represents sequences from `Die1` to `Die5`. -In `aimd.ini`: +In `rulesmd.ini`: ```ini -[SOMESCRIPTTYPE] ; ScriptType -x=111,0 +[SOMEWARHEAD] ; Warhead +NotHuman.DeathSequence= ; integer (1 to 5) ``` -### `112` Regroup temporarily around the Team Leader +## Weapons -- Puts the TaskForce into Area Guard Mode for the given amount of time around the Team Leader (this unit remains almost immobile until the action ends). The default radius around the Leader is `[General] > CloseEnough` and the units will not leave that area. +### AreaFire target customization -In `aimd.ini`: +- You can now specify how AreaFire weapon picks its target. By default it targets the base cell the firer is currently on, but this can now be changed to fire on the firer itself or at a random cell within the radius of the weapon's `Range` by setting `AreaFire.Target` to `self` or `random` respectively. +- `AreaFire.Target=self` respects normal targeting rules (Warhead Verses etc.) against the firer itself. +- `AreaFire.Target=random` ignores cells that are ineligible or contain ineligible objects based on listed values in weapon's `CanTarget` & `CanTargetHouses`. + +In `rulesmd.ini`: ```ini -[SOMESCRIPTTYPE] ; ScriptType -x=112,n +[SOMEWEAPON] ; WeaponType +AreaFire.Target=base ; AreaFire Target Enumeration (base|self|random) ``` -### `113` Randomly Skip Next Action +### Burst.Delays -- When executed this action picks a random value between 1 and 100. If the value is equal or below the second parameter then the next action will be skipped. If the second parameter is 0 means that the next action will never be skipped and 100 means thay always will be skipped. +- Allows specifying weapon-specific burst shot delays. Takes precedence over the old `BurstDelayX` logic available on VehicleTypes, functions with Infantry & BuildingType weapons (AircraftTypes are not supported due to their weapon firing system being completely different) and allows every shot of `Burst` to have a separate delay instead of only first four shots. +- If no delay is defined for a shot, it falls back to last delay value defined (f.ex `Burst=3` and `Burst.Delays=10` would use 10 as delay for all shots). +- Using `-1` as delay reverts back to old logic (`BurstDelay0-3` for VehicleTypes if available or random value between 3-5 otherwise) for that shot. -In `aimd.ini`: +In `rulesmd.ini`: ```ini -[SOMESCRIPTTYPE] ; ScriptType -x=113,n ; where 0 > n <= 100 +[SOMEWEAPON] ; WeaponType +Burst.Delays=-1 ; int - burst delays (comma-separated) for shots in order from first to last. ``` -### `500 - 523` Edit Variable -- Operate a variable's value - - The variable's value type is int16 instead of int32 in trigger actions for some reason, which means it ranges from -2^15 to 2^15-1. - - Any numbers exceeding this limit will lead to unexpected results! - -In `aimd.ini`: -```ini -[SOMESCRIPTTYPE] ; ScriptType -x=i,n ; where 500 <= i <= 523, n is made up of two parts, the low 16 bits is being used to store the variable index, the high 16 bits is being used for storing the param value. -``` +### Feedback weapon -### `524 - 547` Edit Variable by Local Variable -- Operate a variable's value by a local variable's value - - Similar to 500-523, but the number to operate the value is being read from a local variable +- You can now specify an auxiliary weapon to be fired on the firer itself when a weapon is fired. + - `FireInTransport` setting of the feedback weapon is respected to determine if it can be fired when the original weapon is fired from inside `OpenTopped=true` transport. If feedback weapon is fired, it is fired on the transport. `OpenToppedDamageMultiplier` is not applied on feedback weapons. -In `aimd.ini`: +In `rulesmd.ini`: ```ini -[SOMESCRIPTTYPE] ; ScriptType -x=i,n ; where 524 <= i <= 547, n is made up of two parts, the low 16 bits is being used to store the variable index, the high 16 bits is being used for storing the local variable index. +[SOMEWEAPON] ; WeaponType +FeedbackWeapon= ; WeaponType ``` -### `548 - 571` Edit Variable by Global Variable -- Operate a variable's value by a global variable's value - - Similar to 500-523, but the number to operate the value is being read from a global variable +### Radiation enhancements -In `aimd.ini`: +- Radiation now has owner by default, so any rad-kills will be scored. This behavior can be reverted by a corresponding tag. + - `AffectsAllies`, `AffectsOwner` and `AffectsEnemies` on `RadSiteWarhead` are respected. + - Currently the rad maker doesn't gain experience from kills, this may change in future. +- Radiation is now able to deal damage to Buildings. To enable set `RadApplicationDelay.Building` value more than 0. + +In `rulesmd.ini`: ```ini -[SOMESCRIPTTYPE] ; ScriptType -x=i,n ; where 548 <= i <= 571, n is made up of two parts, the low 16 bits is being used to store the variable index, the high 16 bits is being used for storing the global variable index. +[SOMEWEAPON] ; WeaponType +Rad.NoOwner=no ; boolean ``` -## Super Weapons - -### LimboDelivery +### Strafing aircraft weapon customization -- Super Weapons can now deliver off-map buildings that act as if they were on the field. - - `LimboDelivery.Types` is the list of BuildingTypes that will be created when the Super Weapons fire. Super Weapon Type and coordinates do not matter. - - `LimboDelivery.IDs` is the list of numeric IDs that will be assigned to buildings. Necessary for LimboKill to work. +![image](_static/images/strafing-01.gif) +*Strafing aircraft weapon customization in [Project Phantom](https://www.moddb.com/mods/project-phantom)* -- Created buildings are not affected by any on-map threats. The only way to remove them from the game is by using a Super Weapon with LimboKill set. - - `LimboKill.Affects` sets which houses are affected by this feature. - - `LimboKill.IDs` lists IDs that will be targeted. Buildings with these IDs will be removed from the game instantly. +- Some of the behavior of strafing aircraft weapons (weapon projectile has `ROT` below 2) can now be customized. + - `Strafing.Shots` controls the number of times the weapon is fired during a single strafe run. `Ammo` is only deducted at the end of the strafe run, regardless of the number of shots fired. Valid values range from 1 to 5, any values smaller or larger are effectively treated same as either 1 or 5, respectively. Defaults to 5. + - `Strafing.SimulateBurst` controls whether or not the shots fired during strafing simulate behavior of `Burst`, allowing for alternating firing offset. Only takes effect if weapon has `Burst` set to 1 or undefined. Defaults to false. -- Delivery can be made random with these optional tags. The game will randomly choose only a single building from the list for each roll chance provided. - - `LimboDelivery.RollChance` lits chances of each "dice roll" happening. Valid values range from 0% (never happens) to 100% (always happens). Defaults to a single sure roll. - - `LimboDelivery.RandomWeightsN` lists the weights for each "dice roll" that increase the probability of picking a specific building. Valid values are 0 (don't pick) and above (the higher value, the bigger the likelyhood). `RandomWeights` are a valid alias for `RandomWeights0`. If a roll attempt doesn't have weights specified, the last weights will be used. +In `rulesmd.ini`: +```ini +[SOMEWEAPON] ; WeaponType +Strafing.Shots=5 ; integer +Strafing.SimulateBurst=false ; bool +``` -Note: This feature might not support every building flag. Flags that are confirmed to work correctly are listed below: - - FactoryPlant - - OrePurifier - - SpySat - - KeepAlive (Ares 3.0) - - Prerequisite, PrerequisiteOverride, Prerequisite.List# (Ares 0.1), Prerequisite.Negative (Ares 0.1), GenericPrerequisites (Ares 0.1) - - SuperWeapon, SuperWeapon2, SuperWeapons (Ares 0.9), SW.AuxBuildings (Ares 0.9), SW.NegBuildings (Ares 0.9) +### Weapon targeting filter -Note: In order for this feature to work with AITriggerTypes conditions ("Owning house owns ???" and "Enemy house owns ???"), `LegalTarget` must be set to true. +- You can now specify which targets or houses a weapon can fire at. This also affects weapon selection, other than certain special cases where the selection is fixed. + - Note that `CanTarget` explicitly requires either `all` or `empty` to be listed for the weapon to be able to fire at cells containing no TechnoTypes. -```{warning} -Remember that Limbo Delivered buildings don't exist physically! This means they should never have enabled machanics that require interaction with the game world (i.e. factories, cloning vats, service depots, helipads). They also **should have either `KeepAlive=no` set or be killable with LimboKill** - otherwise the game might never end. -``` In `rulesmd.ini`: ```ini -[SOMESW] ; Super Weapon -LimboDelivery.Types= ; List of BuildingTypes -LimboDelivery.IDs= ; List of numeric IDs. -1 cannot be used. -LimboDelivery.RollChances= ; List of percentages. -LimboDelivery.RandomWeightsN= ; List of integers. -LimboKill.Affects=self ; Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all) -LimboKill.IDs= ; List of numeric IDs. +[SOMEWEAPON] ; WeaponType +CanTarget=all ; list of Affected Target Enumeration (none|land|water|empty|infantry|units|buildings|all) +CanTargetHouses=all ; list of Affected House Enumeration (none|owner/self|allies/ally|team|enemies/enemy|all) ``` diff --git a/docs/User-Interface.md b/docs/User-Interface.md index daf6633340..5022bdbd10 100644 --- a/docs/User-Interface.md +++ b/docs/User-Interface.md @@ -23,26 +23,20 @@ IngameScore.WinTheme= ; soundtrack theme ID IngameScore.LoseTheme= ; soundtrack theme ID ``` -## Hotkey Commands - -### `[ ]` Quicksave - -- Save the current singleplayer game. -- If need localization, just add `TXT_QUICKGAME`, `TXT_QUICKGAME_DESC`, `TXT_QUICKSAVE_SUFFIX` and `MSG:NotAvailableInMultiplayer` into your `.csf` file. - - These vanilla CSF entries will be used: `TXT_SAVING_GAME`, `TXT_GAME_WAS_SAVED` and `TXT_ERROR_SAVING_GAME`. - - The save should be looks like `Allied Mission 25: Esther's Money - QuickSaved` - -### `[ ]` Next Idle Harvester +## Battle screen UI/UX -- Selects and centers the camera on the next TechnoType that is counted via the [harvester counter](#harvester-counter) and is currently idle. -- If need localization, just add `TXT_NEXT_IDLE_HARVESTER` and `TXT_NEXT_IDLE_HARVESTER_DESC` into your `.csf` file. +### Hide health bars -### `[ ]` Dump Object Info +![image](_static/images/healthbar.hide-01.png) +*Health bars hidden in [CnC: Final War](https://www.moddb.com/mods/cncfinalwar)* -- Writes currently hovered or last selected object info in log and shows a message. See [this](Miscellanous.md#dump-object-info) for details. -- If need localization, just add `TXT_DUMP_OBJECT_INFO` and `TXT_DUMP_OBJECT_INFO_DESC` into your `.csf` file. +- Health bar display can now be turned off as needed, hiding both the health bar box and health pips. -## Battle screen UI/UX +In `rulesmd.ini`: +```ini +[SOMENAME] ; TechnoType +HealthBar.Hide=no ; boolean +``` ### Low priority for box selection @@ -65,18 +59,25 @@ In `RA2MD.ini`: PrioritySelectionFiltering=yes ; bool ``` -### Hide health bars +## Hotkey Commands -![image](_static/images/healthbar.hide-01.png) -*Health bars hidden in [CnC: Final War](https://www.moddb.com/mods/cncfinalwar)* +### `[ ]` Dump Object Info -- Health bar display can now be turned off as needed, hiding both the health bar box and health pips. +- Writes currently hovered or last selected object info in log and shows a message. See [this](Miscellanous.md#dump-object-info) for details. +- If need localization, just add `TXT_DUMP_OBJECT_INFO` and `TXT_DUMP_OBJECT_INFO_DESC` into your `.csf` file. + +### `[ ]` Next Idle Harvester + +- Selects and centers the camera on the next TechnoType that is counted via the [harvester counter](#harvester-counter) and is currently idle. +- If need localization, just add `TXT_NEXT_IDLE_HARVESTER` and `TXT_NEXT_IDLE_HARVESTER_DESC` into your `.csf` file. + +### `[ ]` Quicksave + +- Save the current singleplayer game. +- If need localization, just add `TXT_QUICKGAME`, `TXT_QUICKGAME_DESC`, `TXT_QUICKSAVE_SUFFIX` and `MSG:NotAvailableInMultiplayer` into your `.csf` file. + - These vanilla CSF entries will be used: `TXT_SAVING_GAME`, `TXT_GAME_WAS_SAVED` and `TXT_ERROR_SAVING_GAME`. + - The save should be looks like `Allied Mission 25: Esther's Money - QuickSaved` -In `rulesmd.ini`: -```ini -[SOMENAME] ; TechnoType -HealthBar.Hide=no ; boolean -``` ## Loading screen @@ -94,19 +95,6 @@ DisableEmptySpawnPositions=no ; boolean ## Sidebar / Battle UI -### Specify Sidebar style - -- It's now possible to switch hardcoded sidebar button coords to use GDI sidebar coords. - -In `rulesmd.ini`: -```ini -[SOMESIDE] ; Side -Sidebar.GDIPositions= ; boolean - ; default values are: - ; yes for the first side - ; no for others -``` - ### Cameo Sorting - You can now specify Cameo Priority for any TechnoType/SuperWeaponType. Vanilla sorting rules are [here](https://modenc.renegadeprojects.com/Cameo_Sorting). @@ -165,26 +153,6 @@ Sidebar.HarvesterCounter.ColorRed=255,0,0 ; R,G,B If you use the vanilla font in your mod, you can use {download}`the improved font <_static/files/ImprovedFont-v4.zip>` (v4 and higher) which among everything already includes the mentioned icons. Otherwise you'd need to draw them yourself using [WWFontEditor](http://nyerguds.arsaneus-design.com/project_stuff/2016/WWFontEditor/release/?C=M;O=D), for example. ``` -### Producing Progress - -![image](_static/images/producing-progress-01.gif) -*Producing Progress bars in [Fantasy ADVENTURE](https://www.moddb.com/mods/fantasy-adventure)* - -- You can now know your factories' status via sidebar! -- You need to draw your own assets (`tab0xpp.shp`, x is replaced by 0-3) and put them into `sidec0x.mix`. - -In `uimd.ini`: -```ini -[Sidebar] -ProducingProgress.Show=no ; boolean -``` - -In `rulesmd.ini`: -```ini -[SOMESIDE] ; Side -Sidebar.ProducingProgress.Offset=0,0 ; X,Y, pixels relative to default -``` - ### Power delta counter ![image](_static/images/powerdelta-01.gif) @@ -219,6 +187,39 @@ Sidebar.PowerDelta.Align=left ; left|center|centre|right If you use the vanilla font in your mod, you can use {download}`the improved font <_static/files/ImprovedFont-v4.zip>` (v4 and higher) which among everything already includes the mentioned icons. Otherwise you'd need to draw them yourself using [WWFontEditor](http://nyerguds.arsaneus-design.com/project_stuff/2016/WWFontEditor/release/?C=M;O=D), for example. ``` +### Producing Progress + +![image](_static/images/producing-progress-01.gif) +*Producing Progress bars in [Fantasy ADVENTURE](https://www.moddb.com/mods/fantasy-adventure)* + +- You can now know your factories' status via sidebar! +- You need to draw your own assets (`tab0xpp.shp`, x is replaced by 0-3) and put them into `sidec0x.mix`. + +In `uimd.ini`: +```ini +[Sidebar] +ProducingProgress.Show=no ; boolean +``` + +In `rulesmd.ini`: +```ini +[SOMESIDE] ; Side +Sidebar.ProducingProgress.Offset=0,0 ; X,Y, pixels relative to default +``` + +### Specify Sidebar style + +- It's now possible to switch hardcoded sidebar button coords to use GDI sidebar coords. + +In `rulesmd.ini`: +```ini +[SOMESIDE] ; Side +Sidebar.GDIPositions= ; boolean + ; default values are: + ; yes for the first side + ; no for others +``` + ## Tooltips ![image](_static/images/tooltips-01.png) diff --git a/docs/Whats-New.md b/docs/Whats-New.md index 9fe125d68c..d349b86edf 100644 --- a/docs/Whats-New.md +++ b/docs/Whats-New.md @@ -12,207 +12,216 @@ This page lists the history of changes across stable Phobos releases and also al ### From older Phobos versions #### From 0.2.2.2 + - Keys `rulesmd.ini->[SOMEWARHEAD]->PenetratesShield` and `rulesmd.ini->[SOMEWARHEAD]->BreaksShield` have been changed to `Shield.Penetrate` and `Shield.Break`, respectively. #### From 0.1.1 + - Key `rulesmd.ini->[SOMETECHNOTYPE]->Deployed.RememberTarget` is deprecated and can be removed now, the bugfix for `DeployToFire` deployers is now always on. ### For Map Editor (Final Alert 2) -In `FAData.ini`: -```ini -[ParamTypes] -47=Structures,28 -53=Play BuildUp,10 -54=Use GlobalVar,10 -55=Operation,0 -56=Variable index,0 -57=Lower bound,0 -58=Upper bound,0 -59=Operate var is global,10 -60=Operate var index,0 - -[EventsRA2] -500=Local variable is greater than,48,6,0,0,[LONG DESC],0,1,500,1 -501=Local variable is less than,48,6,0,0,[LONG DESC],0,1,501,1 -502=Local variable equals to,48,6,0,0,[LONG DESC],0,1,502,1 -503=Local variable is greater than or equals to,48,6,0,0,[LONG DESC],0,1,503,1 -504=Local variable is less than or equals,48,6,0,0,[LONG DESC],0,1,504,1 -505=Local variable and X is true,48,6,0,0,[LONG DESC],0,1,505,1 -506=Global variable is greater than,48,6,0,0,[LONG DESC],0,1,506,1 -507=Global variable is less than,48,6,0,0,[LONG DESC],0,1,507,1 -508=Global variable equals to,48,6,0,0,[LONG DESC],0,1,508,1 -509=Global variable is greater than or queals to,48,6,0,0,[LONG DESC],0,1,509,1 -510=Global variable is less than or equals to,48,6,0,0,[LONG DESC],0,1,510,1 -511=Global variable and X is true,48,6,0,0,[LONG DESC],0,1,511,1 -512=Local variable is greater than local variable,48,3,0,0,[LONG DESC],0,1,500,1 -513=Local variable is less than local variable,48,3,0,0,[LONG DESC],0,1,501,1 -514=Local variable equals to local variable,48,3,0,0,[LONG DESC],0,1,502,1 -515=Local variable is greater than or equals to local variable,48,3,0,0,[LONG DESC],0,1,503,1 -516=Local variable is less than or equals local variable,48,3,0,0,[LONG DESC],0,1,504,1 -517=Local variable and local variable is true,48,3,0,0,[LONG DESC],0,1,505,1 -518=Global variable is greater than local variable,48,3,0,0,[LONG DESC],0,1,506,1 -519=Global variable is less than local variable,48,3,0,0,[LONG DESC],0,1,507,1 -520=Global variable equals to local variable,48,3,0,0,[LONG DESC],0,1,508,1 -521=Global variable is greater than or queals to local variable,48,3,0,0,[LONG DESC],0,1,509,1 -522=Global variable is less than or equals to local variable,48,3,0,0,[LONG DESC],0,1,510,1 -523=Global variable and local variable is true,48,3,0,0,[LONG DESC],0,1,511,1 -524=Local variable is greater than global variable,48,35,0,0,[LONG DESC],0,1,500,1 -525=Local variable is less than global variable,48,35,0,0,[LONG DESC],0,1,501,1 -526=Local variable equals to global variable,48,35,0,0,[LONG DESC],0,1,502,1 -527=Local variable is greater than or equals to global variable,48,35,0,0,[LONG DESC],0,1,503,1 -528=Local variable is less than or equals global variable,48,35,0,0,[LONG DESC],0,1,504,1 -529=Local variable and global variable is true,48,35,0,0,[LONG DESC],0,1,505,1 -530=Global variable is greater than global variable,48,35,0,0,[LONG DESC],0,1,506,1 -531=Global variable is less than global variable,48,35,0,0,[LONG DESC],0,1,507,1 -532=Global variable equals to global variable,48,35,0,0,[LONG DESC],0,1,508,1 -533=Global variable is greater than or queals to global variable,48,35,0,0,[LONG DESC],0,1,509,1 -534=Global variable is less than or equals to global variable,48,35,0,0,[LONG DESC],0,1,510,1 -535=Global variable and global variable is true,48,35,0,0,[LONG DESC],0,1,511,1 - -[ActionsRA2] -125=Build at...,-10,47,53,0,0,0,1,0,0,[LONG DESC],0,1,125 -500=Save game,-4,13,0,0,0,0,0,0,0,[LONG DESC],0,1,500,1 -501=Edit variable,0,56,55,6,54,0,0,0,0,[LONG DESC],0,1,501,1 -502=Generate random number,0,56,57,58,54,0,0,0,0,[LONG DESC],0,1,502,1 -503=Print variable value,0,56,54,0,0,0,0,0,0,[LONG DESC],0,1,503,0 -504=Binary operation,0,56,55,60,54,59,0,0,0,[LONG DESC],0,1,504,1 -505=Fire Super Weapon at specified location (Phobos),0,0,20,2,21,22,0,0,0,Launch a Super Weapon from [SuperWeaponTypes] list at a specified location. House=-1 means random target that isn't neutral. House=-2 means the first neutral house. House=-3 means random human target. Coordinate X=-1 means random. Coordinate Y=-1 means random,0,1,505 -506=Fire Super Weapon at specified waypoint (Phobos),0,0,20,2,30,0,0,0,0,Launch a Super Weapon from [SuperWeaponTypes] list at a specified waypoint. House=-1 means random target that isn't neutral. House=-2 means the first neutral house. House=-3 means random human target. Coordinate X=-1 means random. Coordinate Y=-1 means random,0,1,506 - -; FOLLOWING STUFFS NEEDS FA2SP.DLL (by secsome) -[ScriptTypeLists] -1=ScriptLocalVariable -2=ScriptGlobalVariable -3=ScriptLocalVariable_Local -4=ScriptLocalVariable_Global -5=ScriptGlobalVariable_Local -6=ScriptGlobalVariable_Global - -[ScriptLocalVariable] -HasExtraParam=Yes -BuiltInType=14 - -[ScriptGlobalVariable] -HasExtraParam=Yes -BuiltInType=5 - -[ScriptLocalVariable_Local] -HasExtraParam=Yes -ExtraParamType=ScriptExtType_LocalVariables -BuiltInType=14 - -[ScriptLocalVariable_Global] -HasExtraParam=Yes -ExtraParamType=ScriptExtType_GlobalVariables -BuiltInType=14 - -[ScriptGlobalVariable_Local] -HasExtraParam=Yes -ExtraParamType=ScriptExtType_LocalVariables -BuiltInType=5 - -[ScriptGlobalVariable_Global] -HasExtraParam=Yes -ExtraParamType=ScriptExtType_GlobalVariables -BuiltInType=5 - -[ScriptExtType_LocalVariables] -BuiltInType=14 - -[ScriptExtType_GlobalVariables] -BuiltInType=5 - -[ScriptsRA2] -71=Timed Area Guard,20,0,1,[LONG DESC] -72=Load Onto Transports,0,0,1,[LONG DESC] -73=Wait until ammo is full,0,0,1,[LONG DESC] -500=Local variable set,22,0,1,[LONG DESC] -501=Local variable add,22,0,1,[LONG DESC] -502=Local variable minus,22,0,1,[LONG DESC] -503=Local variable multiply,22,0,1,[LONG DESC] -504=Local variable divide,22,0,1,[LONG DESC] -505=Local variable mod,22,0,1,[LONG DESC] -506=Local variable leftshift,22,0,1,[LONG DESC] -507=Local variable rightshift,22,0,1,[LONG DESC] -508=Local variable reverse,22,0,1,[LONG DESC] -509=Local variable xor,22,0,1,[LONG DESC] -510=Local variable or,22,0,1,[LONG DESC] -511=Local variable and,22,0,1,[LONG DESC] -512=Global variable set,23,0,1,[LONG DESC] -513=Global variable add,23,0,1,[LONG DESC] -514=Global variable minus,23,0,1,[LONG DESC] -515=Global variable multiply,23,0,1,[LONG DESC] -516=Global variable divide,23,0,1,[LONG DESC] -517=Global variable mod,23,0,1,[LONG DESC] -518=Global variable leftshift,23,0,1,[LONG DESC] -519=Global variable rightshift,23,0,1,[LONG DESC] -520=Global variable reverse,23,0,1,[LONG DESC] -521=Global variable xor,23,0,1,[LONG DESC] -522=Global variable or,23,0,1,[LONG DESC] -523=Global variable and,23,0,1,[LONG DESC] -524=Local variable set by local variable,24,0,1,[LONG DESC] -525=Local variable add by local variable,24,0,1,[LONG DESC] -526=Local variable minus by local variable,24,0,1,[LONG DESC] -527=Local variable multiply by local variable,24,0,1,[LONG DESC] -528=Local variable divide by local variable,24,0,1,[LONG DESC] -529=Local variable mod by local variable,24,0,1,[LONG DESC] -530=Local variable leftshift by local variable,24,0,1,[LONG DESC] -531=Local variable rightshift by local variable,24,0,1,[LONG DESC] -532=Local variable reverse by local variable,24,0,1,[LONG DESC] -533=Local variable xor by local variable,24,0,1,[LONG DESC] -534=Local variable or by local variable,24,0,1,[LONG DESC] -535=Local variable and by local variable,24,0,1,[LONG DESC] -536=Global variable set by local variable,25,0,1,[LONG DESC] -537=Global variable add by local variable,25,0,1,[LONG DESC] -538=Global variable minus by local variable,25,0,1,[LONG DESC] -539=Global variable multiply by local variable,25,0,1,[LONG DESC] -540=Global variable divide by local variable,25,0,1,[LONG DESC] -541=Global variable mod by local variable,25,0,1,[LONG DESC] -542=Global variable leftshift by local variable,25,0,1,[LONG DESC] -543=Global variable rightshift by local variable,25,0,1,[LONG DESC] -544=Global variable reverse by local variable,25,0,1,[LONG DESC] -545=Global variable xor by local variable,25,0,1,[LONG DESC] -546=Global variable or by local variable,25,0,1,[LONG DESC] -547=Global variable and by local variable,25,0,1,[LONG DESC] -548=Local variable set by global variable,26,0,1,[LONG DESC] -549=Local variable add by global variable,26,0,1,[LONG DESC] -550=Local variable minus by global variable,26,0,1,[LONG DESC] -551=Local variable multiply by global variable,26,0,1,[LONG DESC] -552=Local variable divide by global variable,26,0,1,[LONG DESC] -553=Local variable mod by global variable,26,0,1,[LONG DESC] -554=Local variable leftshift by global variable,26,0,1,[LONG DESC] -555=Local variable rightshift by global variable,26,0,1,[LONG DESC] -556=Local variable reverse by global variable,26,0,1,[LONG DESC] -557=Local variable xor by global variable,26,0,1,[LONG DESC] -558=Local variable or by global variable,26,0,1,[LONG DESC] -559=Local variable and by global variable,26,0,1,[LONG DESC] -560=Global variable set by global variable,27,0,1,[LONG DESC] -561=Global variable add by global variable,27,0,1,[LONG DESC] -562=Global variable minus by global variable,27,0,1,[LONG DESC] -563=Global variable multiply by global variable,27,0,1,[LONG DESC] -564=Global variable divide by global variable,27,0,1,[LONG DESC] -565=Global variable mod by global variable,27,0,1,[LONG DESC] -566=Global variable leftshift by global variable,27,0,1,[LONG DESC] -567=Global variable rightshift by global variable,27,0,1,[LONG DESC] -568=Global variable reverse by global variable,27,0,1,[LONG DESC] -569=Global variable xor by global variable,27,0,1,[LONG DESC] -570=Global variable or by global variable,27,0,1,[LONG DESC] -571=Global variable and by global variable,27,0,1,[LONG DESC] - -[ScriptParams] -22=Local variables,-1 -23=Global variables,-2 -24=Local variables,-3 -25=Local variables,-4 -26=Global variables,-5 -27=Global variables,-6 -``` +
+ Click to show + + In `FAData.ini`: + ```ini + [ParamTypes] + 47=Structures,28 + 53=Play BuildUp,10 + 54=Use GlobalVar,10 + 55=Operation,0 + 56=Variable index,0 + 57=Lower bound,0 + 58=Upper bound,0 + 59=Operate var is global,10 + 60=Operate var index,0 + + [EventsRA2] + 500=Local variable is greater than,48,6,0,0,[LONG DESC],0,1,500,1 + 501=Local variable is less than,48,6,0,0,[LONG DESC],0,1,501,1 + 502=Local variable equals to,48,6,0,0,[LONG DESC],0,1,502,1 + 503=Local variable is greater than or equals to,48,6,0,0,[LONG DESC],0,1,503,1 + 504=Local variable is less than or equals,48,6,0,0,[LONG DESC],0,1,504,1 + 505=Local variable and X is true,48,6,0,0,[LONG DESC],0,1,505,1 + 506=Global variable is greater than,48,6,0,0,[LONG DESC],0,1,506,1 + 507=Global variable is less than,48,6,0,0,[LONG DESC],0,1,507,1 + 508=Global variable equals to,48,6,0,0,[LONG DESC],0,1,508,1 + 509=Global variable is greater than or queals to,48,6,0,0,[LONG DESC],0,1,509,1 + 510=Global variable is less than or equals to,48,6,0,0,[LONG DESC],0,1,510,1 + 511=Global variable and X is true,48,6,0,0,[LONG DESC],0,1,511,1 + 512=Local variable is greater than local variable,48,3,0,0,[LONG DESC],0,1,500,1 + 513=Local variable is less than local variable,48,3,0,0,[LONG DESC],0,1,501,1 + 514=Local variable equals to local variable,48,3,0,0,[LONG DESC],0,1,502,1 + 515=Local variable is greater than or equals to local variable,48,3,0,0,[LONG DESC],0,1,503,1 + 516=Local variable is less than or equals local variable,48,3,0,0,[LONG DESC],0,1,504,1 + 517=Local variable and local variable is true,48,3,0,0,[LONG DESC],0,1,505,1 + 518=Global variable is greater than local variable,48,3,0,0,[LONG DESC],0,1,506,1 + 519=Global variable is less than local variable,48,3,0,0,[LONG DESC],0,1,507,1 + 520=Global variable equals to local variable,48,3,0,0,[LONG DESC],0,1,508,1 + 521=Global variable is greater than or queals to local variable,48,3,0,0,[LONG DESC],0,1,509,1 + 522=Global variable is less than or equals to local variable,48,3,0,0,[LONG DESC],0,1,510,1 + 523=Global variable and local variable is true,48,3,0,0,[LONG DESC],0,1,511,1 + 524=Local variable is greater than global variable,48,35,0,0,[LONG DESC],0,1,500,1 + 525=Local variable is less than global variable,48,35,0,0,[LONG DESC],0,1,501,1 + 526=Local variable equals to global variable,48,35,0,0,[LONG DESC],0,1,502,1 + 527=Local variable is greater than or equals to global variable,48,35,0,0,[LONG DESC],0,1,503,1 + 528=Local variable is less than or equals global variable,48,35,0,0,[LONG DESC],0,1,504,1 + 529=Local variable and global variable is true,48,35,0,0,[LONG DESC],0,1,505,1 + 530=Global variable is greater than global variable,48,35,0,0,[LONG DESC],0,1,506,1 + 531=Global variable is less than global variable,48,35,0,0,[LONG DESC],0,1,507,1 + 532=Global variable equals to global variable,48,35,0,0,[LONG DESC],0,1,508,1 + 533=Global variable is greater than or queals to global variable,48,35,0,0,[LONG DESC],0,1,509,1 + 534=Global variable is less than or equals to global variable,48,35,0,0,[LONG DESC],0,1,510,1 + 535=Global variable and global variable is true,48,35,0,0,[LONG DESC],0,1,511,1 + + [ActionsRA2] + 125=Build at...,-10,47,53,0,0,0,1,0,0,[LONG DESC],0,1,125 + 500=Save game,-4,13,0,0,0,0,0,0,0,[LONG DESC],0,1,500,1 + 501=Edit variable,0,56,55,6,54,0,0,0,0,[LONG DESC],0,1,501,1 + 502=Generate random number,0,56,57,58,54,0,0,0,0,[LONG DESC],0,1,502,1 + 503=Print variable value,0,56,54,0,0,0,0,0,0,[LONG DESC],0,1,503,0 + 504=Binary operation,0,56,55,60,54,59,0,0,0,[LONG DESC],0,1,504,1 + 505=Fire Super Weapon at specified location (Phobos),0,0,20,2,21,22,0,0,0,Launch a Super Weapon from [SuperWeaponTypes] list at a specified location. House=-1 means random target that isn't neutral. House=-2 means the first neutral house. House=-3 means random human target. Coordinate X=-1 means random. Coordinate Y=-1 means random,0,1,505 + 506=Fire Super Weapon at specified waypoint (Phobos),0,0,20,2,30,0,0,0,0,Launch a Super Weapon from [SuperWeaponTypes] list at a specified waypoint. House=-1 means random target that isn't neutral. House=-2 means the first neutral house. House=-3 means random human target. Coordinate X=-1 means random. Coordinate Y=-1 means random,0,1,506 + + ; FOLLOWING ENTRIES REQUIRE FA2SP.DLL (by secsome) + [ScriptTypeLists] + 1=ScriptLocalVariable + 2=ScriptGlobalVariable + 3=ScriptLocalVariable_Local + 4=ScriptLocalVariable_Global + 5=ScriptGlobalVariable_Local + 6=ScriptGlobalVariable_Global + + [ScriptLocalVariable] + HasExtraParam=Yes + BuiltInType=14 + + [ScriptGlobalVariable] + HasExtraParam=Yes + BuiltInType=5 + + [ScriptLocalVariable_Local] + HasExtraParam=Yes + ExtraParamType=ScriptExtType_LocalVariables + BuiltInType=14 + + [ScriptLocalVariable_Global] + HasExtraParam=Yes + ExtraParamType=ScriptExtType_GlobalVariables + BuiltInType=14 + + [ScriptGlobalVariable_Local] + HasExtraParam=Yes + ExtraParamType=ScriptExtType_LocalVariables + BuiltInType=5 + + [ScriptGlobalVariable_Global] + HasExtraParam=Yes + ExtraParamType=ScriptExtType_GlobalVariables + BuiltInType=5 + + [ScriptExtType_LocalVariables] + BuiltInType=14 + + [ScriptExtType_GlobalVariables] + BuiltInType=5 + + [ScriptsRA2] + 71=Timed Area Guard,20,0,1,[LONG DESC] + 72=Load Onto Transports,0,0,1,[LONG DESC] + 73=Wait until ammo is full,0,0,1,[LONG DESC] + 500=Local variable set,22,0,1,[LONG DESC] + 501=Local variable add,22,0,1,[LONG DESC] + 502=Local variable minus,22,0,1,[LONG DESC] + 503=Local variable multiply,22,0,1,[LONG DESC] + 504=Local variable divide,22,0,1,[LONG DESC] + 505=Local variable mod,22,0,1,[LONG DESC] + 506=Local variable leftshift,22,0,1,[LONG DESC] + 507=Local variable rightshift,22,0,1,[LONG DESC] + 508=Local variable reverse,22,0,1,[LONG DESC] + 509=Local variable xor,22,0,1,[LONG DESC] + 510=Local variable or,22,0,1,[LONG DESC] + 511=Local variable and,22,0,1,[LONG DESC] + 512=Global variable set,23,0,1,[LONG DESC] + 513=Global variable add,23,0,1,[LONG DESC] + 514=Global variable minus,23,0,1,[LONG DESC] + 515=Global variable multiply,23,0,1,[LONG DESC] + 516=Global variable divide,23,0,1,[LONG DESC] + 517=Global variable mod,23,0,1,[LONG DESC] + 518=Global variable leftshift,23,0,1,[LONG DESC] + 519=Global variable rightshift,23,0,1,[LONG DESC] + 520=Global variable reverse,23,0,1,[LONG DESC] + 521=Global variable xor,23,0,1,[LONG DESC] + 522=Global variable or,23,0,1,[LONG DESC] + 523=Global variable and,23,0,1,[LONG DESC] + 524=Local variable set by local variable,24,0,1,[LONG DESC] + 525=Local variable add by local variable,24,0,1,[LONG DESC] + 526=Local variable minus by local variable,24,0,1,[LONG DESC] + 527=Local variable multiply by local variable,24,0,1,[LONG DESC] + 528=Local variable divide by local variable,24,0,1,[LONG DESC] + 529=Local variable mod by local variable,24,0,1,[LONG DESC] + 530=Local variable leftshift by local variable,24,0,1,[LONG DESC] + 531=Local variable rightshift by local variable,24,0,1,[LONG DESC] + 532=Local variable reverse by local variable,24,0,1,[LONG DESC] + 533=Local variable xor by local variable,24,0,1,[LONG DESC] + 534=Local variable or by local variable,24,0,1,[LONG DESC] + 535=Local variable and by local variable,24,0,1,[LONG DESC] + 536=Global variable set by local variable,25,0,1,[LONG DESC] + 537=Global variable add by local variable,25,0,1,[LONG DESC] + 538=Global variable minus by local variable,25,0,1,[LONG DESC] + 539=Global variable multiply by local variable,25,0,1,[LONG DESC] + 540=Global variable divide by local variable,25,0,1,[LONG DESC] + 541=Global variable mod by local variable,25,0,1,[LONG DESC] + 542=Global variable leftshift by local variable,25,0,1,[LONG DESC] + 543=Global variable rightshift by local variable,25,0,1,[LONG DESC] + 544=Global variable reverse by local variable,25,0,1,[LONG DESC] + 545=Global variable xor by local variable,25,0,1,[LONG DESC] + 546=Global variable or by local variable,25,0,1,[LONG DESC] + 547=Global variable and by local variable,25,0,1,[LONG DESC] + 548=Local variable set by global variable,26,0,1,[LONG DESC] + 549=Local variable add by global variable,26,0,1,[LONG DESC] + 550=Local variable minus by global variable,26,0,1,[LONG DESC] + 551=Local variable multiply by global variable,26,0,1,[LONG DESC] + 552=Local variable divide by global variable,26,0,1,[LONG DESC] + 553=Local variable mod by global variable,26,0,1,[LONG DESC] + 554=Local variable leftshift by global variable,26,0,1,[LONG DESC] + 555=Local variable rightshift by global variable,26,0,1,[LONG DESC] + 556=Local variable reverse by global variable,26,0,1,[LONG DESC] + 557=Local variable xor by global variable,26,0,1,[LONG DESC] + 558=Local variable or by global variable,26,0,1,[LONG DESC] + 559=Local variable and by global variable,26,0,1,[LONG DESC] + 560=Global variable set by global variable,27,0,1,[LONG DESC] + 561=Global variable add by global variable,27,0,1,[LONG DESC] + 562=Global variable minus by global variable,27,0,1,[LONG DESC] + 563=Global variable multiply by global variable,27,0,1,[LONG DESC] + 564=Global variable divide by global variable,27,0,1,[LONG DESC] + 565=Global variable mod by global variable,27,0,1,[LONG DESC] + 566=Global variable leftshift by global variable,27,0,1,[LONG DESC] + 567=Global variable rightshift by global variable,27,0,1,[LONG DESC] + 568=Global variable reverse by global variable,27,0,1,[LONG DESC] + 569=Global variable xor by global variable,27,0,1,[LONG DESC] + 570=Global variable or by global variable,27,0,1,[LONG DESC] + 571=Global variable and by global variable,27,0,1,[LONG DESC] + + [ScriptParams] + 22=Local variables,-1 + 23=Global variables,-2 + 24=Local variables,-3 + 25=Local variables,-4 + 26=Global variables,-5 + 27=Global variables,-6 + ``` +
## Changelog ### 0.3 +
+ Click to show + New: - LaserTrails initial implementation (by Kerbiter, ChrisLv_CN) - Anim-to-Unit logic and ability to randomize DestroyAnim (by Otamaa) @@ -305,17 +314,27 @@ Phobos fixes: - Fixed shielded objects not decloaking if shield takes damage (by Starkku) - Fixed critical hit animation playing even if no critical hits were dealt due to `Crit.Affects` or `ImmuneToCrit` settings (by Starkku) - Fixed `RemoveDisguise` not working on `PermaDisguise` infantry (by Starkku) +
+ ### 0.2.2.2 +
+ Click to show + Phobos fixes: - Fixed shield type info not saving properly (by Uranusian) - Fixed extended building upgrades logic not properly interacting with Ares' BuildLimit check (by Uranusian) - Fix more random crashes for Cameo Priority (by Uranusian) - Fix aircraft weapons causing game freeze when burst index was not correctly reset after firing (by Starkku) +
+ ### 0.2.2.1 +
+ Click to show + Phobos fixes: - Fixed random crashes about CameoPriority (by Uranusian) - Fixed trigger action 125 not functioning properly (by Uranusian) @@ -323,9 +342,14 @@ Phobos fixes: - RadSite hook adjustment for `FootClass` to support Ares `RadImmune`; also various fixes to radiation / desolators (by Otamaa) - Fixed `Crit.Affects` not functioning properly (by Uranusian) - Fixed improper upgrade owner transfer which resulted in built ally / enemy building upgrades keeping the player who built them alive (by Kerbiter) +
+ ### 0.2.2 +
+ Click to show + New: - Customizable producing progress "bars" like CnC:Remastered did (by Uranusian) - Customizable cameo sorting priority (by Uranusian) @@ -338,14 +362,24 @@ Vanilla fixes: Phobos fixes: - Fixed the critical damage logic not functioning properly (by Uranusian) - Fixed the bug when executing the stop command game crashes (by Uranusian) +
+ ### 0.2.1.1 +
+ Click to show + Phobos fixes: - Fixed occasional crashes introduced by `Speed=0` stationary vehicles code (by Starkku) +
+ ### 0.2.1 +
+ Click to show + New: - Setting VehicleType `Speed` to 0 now makes game treat them as stationary (by Starkku) @@ -355,9 +389,14 @@ Vanilla fixes: Phobos fixes: - Fixed the bug when trigger action `125 Build At...` wasn't actually producing a building when the target cells were occupied (by secsome) +
+ ### 0.2 +
+ Click to show + New: - Shield logic for TechnoTypes (by Uranusian, secsome, Belonit) with warhead additions (by Starkku) - Custom Radiation Types (by AlexB, Otamaa, Belonit, Uranusian) @@ -400,13 +439,24 @@ Phobos fixes: - Properly rewritten a fix for mind-controlled vehicles deploying into buildings (by FS-21) - Properly rewritten `DeployToFire` fix, tag `Deployed.RememberTarget` is deprecated, now always on (by Kerbiter) - New warheads now work with Ares' `GenericWarhead` superweapon (by Belonit) +
+ ### 0.1.1 +
+ Click to show + +Phobos fixes: - Fixed an occasional crash when selecting units with a selection box +
+ ### 0.1 +
+Click to show + New: - Full-color PCX graphics support (by Belonit) - Support for PCX loading screens of any size (by Belonit) @@ -426,3 +476,5 @@ Vanilla fixes: - Fixed QWER hotkey tab switching not hiding the displayed tooltip as it should (by Belonit) - Sidebar tooltips now can go over sidebar bounds (by Belonit) - Lifted stupidly small limit for tooltip character amount (by Belonit) +
+ diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html index 06391555b5..a981a6b814 100644 --- a/docs/_templates/layout.html +++ b/docs/_templates/layout.html @@ -8,16 +8,52 @@ margin: auto; } - .wy-nav-content {max-width: none;} + .wy-nav-content { max-width: none; } - .wy-nav-side {left: auto;} + .wy-nav-side { left: auto; } - .rst-versions {left: auto;} + .rst-versions { left: auto; } - @media screen and (max-width: 768px){ - .wy-nav-side {left: -300px;} + @media screen and (max-width: 768px) { + .wy-nav-side { left: -300px; } + } + + .wy-grid-for-nav { position: unset; } + + details { + border: 1px solid rgba(0,0,0,.1); + border-radius: 4px; + background-color: #f3f6f6; + color: #404040; + box-shadow: inset 0 1px 2px -1px hsl(0deg 0% 100% / 50%), inset 0 -2px 0 0 rgb(0 0 0 / 10%); + -webkit-user-drag: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + padding: 12px 12px 0; + margin-bottom: 24px; + } + + summary { + font-style: italic; + cursor: pointer; + margin: -12px -12px 0; + padding: 12px; + } + + details[open] { + padding: 12px; + } + + details[open] summary { + border-bottom: 1px solid rgba(0,0,0,.1); + margin-bottom: 12px; + } + + details > *:last-child { + margin-bottom: 0!important; } - .wy-grid-for-nav {position: unset;} diff --git a/docs/index.md b/docs/index.md index 478416278f..611b07de33 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,6 +4,7 @@ General Info What's New Contributing +Credits License ```