From f8c5263d80ef2142362cdf4282cc962b6595e26b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 19 Sep 2021 13:17:23 +0200 Subject: [PATCH] Setup Tiberian Sun forest fires. --- .../Traits/Conditions/SpreadsCondition.cs | 72 +++++++++++++++++++ mods/ts/rules/defaults.yaml | 31 +++++++- mods/ts/sequences/misc.yaml | 14 ++++ mods/ts/weapons/ballisticweapons.yaml | 3 + mods/ts/weapons/energyweapons.yaml | 5 ++ mods/ts/weapons/otherweapons.yaml | 6 +- mods/ts/weapons/superweapons.yaml | 10 +-- 7 files changed, 134 insertions(+), 7 deletions(-) create mode 100644 OpenRA.Mods.Common/Traits/Conditions/SpreadsCondition.cs diff --git a/OpenRA.Mods.Common/Traits/Conditions/SpreadsCondition.cs b/OpenRA.Mods.Common/Traits/Conditions/SpreadsCondition.cs new file mode 100644 index 000000000000..507964fe4bc3 --- /dev/null +++ b/OpenRA.Mods.Common/Traits/Conditions/SpreadsCondition.cs @@ -0,0 +1,72 @@ +#region Copyright & License Information +/* + * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits +{ + [Desc("Any actor with this trait enabled has a chance to affect others with this trait.")] + public class SpreadsConditionInfo : ConditionalTraitInfo + { + [Desc("The chance this actor is going to affect an adjacent actor.")] + public readonly int Probability = 5; + + [Desc("How far the condition can spread from one actor to another.")] + public readonly WDist Range = WDist.FromCells(3); + + [GrantedConditionReference] + [Desc("Condition to grant onto another actor in range with the same trait.")] + public readonly string SpreadCondition = "spreading"; + + [Desc("Time in ticks to wait between spreading further.")] + public int Delay = 5; + + public override object Create(ActorInitializer init) { return new SpreadsCondition(this); } + } + + public class SpreadsCondition : ConditionalTrait, ITick + { + readonly SpreadsConditionInfo info; + + int delay; + + public SpreadsCondition(SpreadsConditionInfo info) + : base(info) + { + this.info = info; + delay = info.Delay; + } + + void ITick.Tick(Actor self) + { + if (IsTraitDisabled) + return; + + if (delay-- > 0) + return; + + delay = info.Delay; + + if (self.World.SharedRandom.Next(100) <= info.Probability) + { + var actorsInRange = self.World.FindActorsInCircle(self.CenterPosition, info.Range) + .Where(a => a.TraitOrDefault() != null); + + if (!actorsInRange.Any()) + return; + + var target = actorsInRange.Random(self.World.SharedRandom); + target.GrantCondition(info.SpreadCondition); + } + } + } +} diff --git a/mods/ts/rules/defaults.yaml b/mods/ts/rules/defaults.yaml index b140079ce2d6..1d4813312b9f 100644 --- a/mods/ts/rules/defaults.yaml +++ b/mods/ts/rules/defaults.yaml @@ -1034,8 +1034,9 @@ ^Tree: Inherits@1: ^SpriteActor + Inherits@2: ^ExistsInWorld Interactable: - HiddenUnderShroud: + FrozenUnderFog: RenderSprites: Palette: terraindecoration WithSpriteBody: @@ -1048,6 +1049,34 @@ Categories: Tree RequiresSpecificOwners: ValidOwnerNames: Neutral + HitShape: + Health: + HP: 200000 + Armor: + Type: Wood + Targetable: + TargetTypes: Trees, NoAutoTarget + GrantConditionOnDamageState@Small: + Condition: small-fire + ValidDamageStates: Medium + GrantConditionOnDamageState@Large: + Condition: large-fire + ValidDamageStates: Heavy, Critical + WithIdleOverlay@SmallFire: + Image: fire2 + Palette: effect + RequiresCondition: small-fire + WithIdleOverlay@LargeFire: + Image: fire1 + Palette: effect + RequiresCondition: large-fire + SpreadsCondition@Fire: + RequiresCondition: small-fire || large-fire + SpreadCondition: burning + ChangesHealth: + StartIfBelow: 101 + Step: -500 + RequiresCondition: small-fire || large-fire || burning ^Rock: Inherits@1: ^SpriteActor diff --git a/mods/ts/sequences/misc.yaml b/mods/ts/sequences/misc.yaml index d1cea476e659..b220e151ac89 100644 --- a/mods/ts/sequences/misc.yaml +++ b/mods/ts/sequences/misc.yaml @@ -709,3 +709,17 @@ podring: Frames: 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 Length: * AlphaFade: True + +fire1: + idle-overlay: + Length: 17 + BlendMode: Translucent + Offset: 0, -24, 24 + ZOffset: 1023 + +fire2: + idle-overlay: + Length: 17 + BlendMode: Translucent + Offset: 0, -18, 18 + ZOffset: 1023 diff --git a/mods/ts/weapons/ballisticweapons.yaml b/mods/ts/weapons/ballisticweapons.yaml index 53bf91306ac9..f52c69740a5a 100644 --- a/mods/ts/weapons/ballisticweapons.yaml +++ b/mods/ts/weapons/ballisticweapons.yaml @@ -134,6 +134,7 @@ Grenade: ReloadDelay: 60 Range: 4c512 -Report: + ValidTargets: Ground, Trees Projectile: Bullet Speed: 226 Blockable: true @@ -150,6 +151,8 @@ Grenade: Light: 70 Concrete: 28 DamageTypes: Prone70Percent, TriggerProne, ExplosionDeath + ValidTargets: Ground, Trees Warhead@2Eff: CreateEffect Explosions: small_grey_explosion ImpactSounds: expnew13.aud + ValidTargets: Ground, Trees diff --git a/mods/ts/weapons/energyweapons.yaml b/mods/ts/weapons/energyweapons.yaml index f4b9c8b901ca..92c505a594b6 100644 --- a/mods/ts/weapons/energyweapons.yaml +++ b/mods/ts/weapons/energyweapons.yaml @@ -57,6 +57,7 @@ SonicZap: ReloadDelay: 180 Range: 6c0 Report: sonic4.aud + ValidTargets: Ground, Trees Projectile: AreaBeam Speed: 0c128 Duration: 90 @@ -74,6 +75,7 @@ SonicZap: Damage: 800 AffectsParent: false ValidRelationships: Neutral, Enemy + ValidTargets: Ground, Trees Versus: Heavy: 80 Concrete: 60 @@ -85,6 +87,7 @@ SonicZap: InvalidTargets: Disruptor # Does not affect friendly disruptors at all AffectsParent: false ValidRelationships: Ally + ValidTargets: Ground, Trees Versus: Heavy: 80 Concrete: 60 @@ -113,6 +116,7 @@ SonicZap: CyCannon: Inherits: ^EnergyBlast + ValidTargets: Ground, Trees Projectile: Missile MaximumLaunchSpeed: 192 Blockable: false @@ -124,6 +128,7 @@ CyCannon: RangeLimit: 8c0 TerrainHeightAware: true Warhead@1Dam: SpreadDamage + ValidTargets: Ground, Trees Spread: 43 Damage: 12000 Versus: diff --git a/mods/ts/weapons/otherweapons.yaml b/mods/ts/weapons/otherweapons.yaml index 00be75e7d9b3..badfbb258b27 100644 --- a/mods/ts/weapons/otherweapons.yaml +++ b/mods/ts/weapons/otherweapons.yaml @@ -1,4 +1,5 @@ FireballLauncher: + ValidTargets: Ground, Trees ReloadDelay: 50 Range: 4c256 Report: flamtnk1.aud @@ -11,6 +12,7 @@ FireballLauncher: Warhead@1Dam: SpreadDamage Spread: 288 Falloff: 100, 50, 25, 12, 6, 3, 0 + ValidTargets: Ground, Trees Damage: 2500 Versus: None: 600 @@ -29,6 +31,7 @@ Bomb: BurstDelays: 6 Range: 2c512 TargetActorCenter: true + ValidTargets: Ground, Trees Projectile: GravityBomb Velocity: 72, 0, -90 Acceleration: 0, 0, -8 @@ -46,10 +49,11 @@ Bomb: Heavy: 32 Concrete: 100 DamageTypes: Prone100Percent, TriggerProne, ExplosionDeath + ValidTargets: Ground, Trees Warhead@2Eff: CreateEffect Explosions: large_explosion ImpactSounds: expnew09.aud - ValidTargets: Ground, Air + ValidTargets: Ground, Trees, Air Warhead@3EffWater: CreateEffect Explosions: small_watersplash ExplosionPalette: player diff --git a/mods/ts/weapons/superweapons.yaml b/mods/ts/weapons/superweapons.yaml index daddea08d336..8173d056cfbf 100644 --- a/mods/ts/weapons/superweapons.yaml +++ b/mods/ts/weapons/superweapons.yaml @@ -1,6 +1,6 @@ MultiCluster: Inherits: ^DefaultMissile - ValidTargets: Ground, Water, Air + ValidTargets: Ground, Water, Air, Trees Projectile: Missile MaximumLaunchSpeed: 120 Inaccuracy: 1c0 @@ -14,7 +14,7 @@ MultiCluster: Warhead@1Dam: SpreadDamage Spread: 216 Damage: 13000 - ValidTargets: Ground, Water, Air + ValidTargets: Ground, Water, Air, Trees Versus: None: 100 Wood: 85 @@ -34,7 +34,7 @@ ClusterMissile: Spread: 512 Falloff: 100, 100, 0 Damage: 26000 - ValidTargets: Ground, Water, Air + ValidTargets: Ground, Water, Air, Trees Versus: None: 100 Wood: 85 @@ -69,7 +69,7 @@ SuicideBomb: ValidTargets: Vehicle, Building, Defense, Infantry IonCannon: - ValidTargets: Ground, Water, Air + ValidTargets: Ground, Water, Air, Trees Warhead@1Dam_impact: SpreadDamage Spread: 1c0 Damage: 10000 @@ -81,7 +81,7 @@ IonCannon: Damage: 25000 Falloff: 100, 50, 25, 0 Delay: 3 - ValidTargets: Ground, Water, Air + ValidTargets: Ground, Water, Air, Trees DamageTypes: Prone50Percent, TriggerProne, EnergyDeath Warhead@3Smu_area: LeaveSmudge SmudgeType: SmallScorch