Weapons
Weapons are essential to CnC, even more than harvesting. A Weapon is a combination of Weapon-specific data, warhead, and projectile.
If a weapon gets fired, the game first checks for the animation & sound set in the weapon to display them;
The warhead is then delivered to it's target by the projectile;
On impact, the game reads the rules for the impact from the warhead, and then calculates the damage inflicted, basing on the Damage= value supplied in the weapon.
Note: Even though there is no explicit [WeaponTypes] list in the rules, the game builds one internally from all the weapons that are loaded via objects. This list is used by certain ingame functions.
Making new weapons (by DCoder)
New weapons are easy to create, as long as you know these facts:
- weapon needs to have a projectile
- weapon needs to have a warhead
- weapon needs to have a range
When a unit is ordered to fire, it moves towards the target until it is in Range=, then fires the weapon. It travels through the air (directed by the Projectile=), impacts and deals a certain % of weapon's Damage= (directed by the Warhead=).
Enough theory, let's make a new weapon, projectile and warhead to replace the Destroyer's cannon with a RA1 style missile launcher. So set [DEST] Primary=OldMissile, then create this section:
[OldMissile]
Damage=60 ;how much damage points to deliver
ROF=60 ;how often (in frames) to fire
Range=8 ;how far (in cells) can the weapon fly?
Projectile=HeatSeekingMissile ;our new projectile
Warhead=HeatMissileWH ;our new warhead
Speed=25 ; how fast does the weapon fly?
Report=AegisAttack ;the sound of aegis missile launcher
But the [HeatSeekingMissile] does not exist yet. So create it:
[HeatSeekingMissile]
High=yes ;fly in an arc (IFV missile like) instead of straight (cannon like)
Shadow=no ;don't draw shadow on the ground (the missile is too small)
AA=yes ;can it hit air targets?
AG=yes ;can it hit ground targets?
Image=MEDUSA ;this is the image that Aegis missile uses
ROT=20 ;(not zero means it can 'home in' on the target)
SubjectToCliffs=no ;can cliffs mess up the targeting (we're in the water, no cliffs here)
SubjectToElevation=no ;does the weapon get a range bonus if fired from a high place downwards?
SubjectToWalls=no ;can the walls stop it?
The [HeatMissileWH] also doesn't exist. So we need to create it as well:
[HeatMissileWH]
CellSpread=.3 ;in map cells, how far can you still feel the impact
PercentAtMax=1 ;at the edge of the area effected (determined by cellspread) this is the percent of damage done.
Verses=100%,100%,100%,100%,100%,100%,0%,0%,0%,100%,100% ;(see armor types tutorial)
InfDeath=3 ;which infantry death to use when infantry is killed by this weapon?
AnimList=EXPLOSML ;what animations to play at impact point?
ProneDamage=100% ;% damage to deal to infantry that is prone (deployed counts as prone)
Now, add the HeatMissileWH to the [Warheads] list. I haven't seen anything wrong when I don't put it there, but since the list exists, it can be necessary for something.
Applicable INI Flags
These tables show all INI flags applicable1 to Weapons. The flags are grouped by the internal classes the flags are inherited from, and then listed in the order they are read in by the game. You can re-sort the rows by column values by clicking the arrow icons in the column headings. Each flag can be clicked to visit its page for detailed information.
Please note that this section is accurate only for Yuri's Revenge. All other C&C games use different sets of flags.
1 ↑ "Applicable" in this context means "read from the INI files". Certain flags listed here don't have any effect ingame , but they are read and in certain cases cause a crash if not present. Again, refer to each flag's individual page for detailed information.
INI File | Section | Key | Value Type | Default Value | Adds to list |
---|---|---|---|---|---|
Rules(md).ini | Object's ID | Name | string(48 symbols) | ID | |
Rules(md).ini | Object's ID | UIName | string(31 symbol) | "" |
INI File | Section | Key | Value Type | Default Value | Adds to list |
---|---|---|---|---|---|
Rules(md).ini | Object's ID | AmbientDamage | int | 0 | |
Rules(md).ini | Object's ID | IsSonic | boolean | 0 | |
Rules(md).ini | Object's ID | Spawner | boolean | 0 | |
Rules(md).ini | Object's ID | LimboLaunch | boolean | 0 | |
Rules(md).ini | Object's ID | DecloakToFire | boolean | 1 | |
Rules(md).ini | Object's ID | CellRangefinding | boolean | 0 | |
Rules(md).ini | Object's ID | FireOnce | boolean | 0 | |
Rules(md).ini | Object's ID | NeverUse | boolean | 0 | |
Rules(md).ini | Object's ID | RevealOnFire | boolean | 1 | |
Rules(md).ini | Object's ID | TerrainFire | boolean | 0 | |
Rules(md).ini | Object's ID | SabotageCursor | boolean | 0 | |
Rules(md).ini | Object's ID | MigAttackCursor | boolean | 0 | |
Rules(md).ini | Object's ID | DisguiseFireOnly | boolean | 0 | |
Rules(md).ini | Object's ID | InfiniteMindControl | boolean | 0 | |
Rules(md).ini | Object's ID | FireWhileMoving | boolean | 1 | |
Rules(md).ini | Object's ID | DrainWeapon | boolean | 0 | |
Rules(md).ini | Object's ID | FireInTransport | boolean | 1 | |
Rules(md).ini | Object's ID | DisguiseFakeBlinkTime | boolean | 0 | |
Rules(md).ini | Object's ID | Suicide | boolean | 0 | |
Rules(md).ini | Object's ID | Supress | boolean | 0 | |
Rules(md).ini | Object's ID | Burst | int | 1 | |
Rules(md).ini | Object's ID | Damage | int | 0 | |
Rules(md).ini | Object's ID | Speed | int | 0 | |
Rules(md).ini | Object's ID | ROF | int | 0 | |
Rules(md).ini | Object's ID | Range | int | 0 | |
Rules(md).ini | Object's ID | MinimumRange | int | 0 | |
Rules(md).ini | Object's ID | Report | vector<Sound> | {} | |
Rules(md).ini | Object's ID | DownReport | vector<Sound> | {} | |
Rules(md).ini | Object's ID | Anim | vector<Animation> | {} | + |
Rules(md).ini | Object's ID | AssaultAnim | Animation | 0 | + |
Rules(md).ini | Object's ID | OccupantAnim | Animation | 0 | + |
Rules(md).ini | Object's ID | OpenToppedAnim | Animation | 0 | + |
Rules(md).ini | Object's ID | Camera | boolean | 0 | |
Rules(md).ini | Object's ID | IsLaser | boolean | 0 | |
Rules(md).ini | Object's ID | DiskLaser | boolean | 0 | |
Rules(md).ini | Object's ID | IsLine | boolean | 0 | |
Rules(md).ini | Object's ID | IsHouseColor | boolean | 0 | |
Rules(md).ini | Object's ID | Charges | boolean | 0 | |
Rules(md).ini | Object's ID | TurboBoost | boolean | 0 | |
Rules(md).ini | Object's ID | UseFireParticles | boolean | 0 | |
Rules(md).ini | Object's ID | UseSparkParticles | boolean | 0 | |
Rules(md).ini | Object's ID | OmniFire | boolean | 0 | |
Rules(md).ini | Object's ID | DistributedWeaponFire | boolean | 0 | |
Rules(md).ini | Object's ID | IsRailgun | boolean | 0 | |
Rules(md).ini | Object's ID | Lobber | boolean | 0 | |
Rules(md).ini | Object's ID | LaserInnerColor | Color | {0;0;0} | |
Rules(md).ini | Object's ID | LaserOuterColor | Color | {0;0;0} | |
Rules(md).ini | Object's ID | LaserOuterSpread | XYZ | {0;0;0} | |
Rules(md).ini | Object's ID | LaserDuration | int | 10 | |
Rules(md).ini | Object's ID | IsBigLaser | boolean | 0 | |
Rules(md).ini | Object's ID | Bright | boolean | 0 | |
Rules(md).ini | Object's ID | IonSensitive | boolean | 0 | |
Rules(md).ini | Object's ID | AreaFire | boolean | 0 | |
Rules(md).ini | Object's ID | IsElectricBolt | boolean | 0 | |
Rules(md).ini | Object's ID | DrawBoltAsLaser | boolean | 0 | |
Rules(md).ini | Object's ID | IsAlternateColor | boolean | 0 | |
Rules(md).ini | Object's ID | IsRadBeam | boolean | 0 | |
Rules(md).ini | Object's ID | IsRadEruption | boolean | 0 | |
Rules(md).ini | Object's ID | RadLevel | int | 0 | |
Rules(md).ini | Object's ID | IsMagBeam | boolean | 0 | |
Rules(md).ini | Object's ID | AttachedParticleSystem | ParticleSystem | 0 | |
Rules(md).ini | Object's ID | Warhead | WarheadType | 0 | + |
Rules(md).ini | Object's ID | Projectile | ProjectileType | 0 | + |