From 00356b8bbd2120261ad76fb8c5ae65834d932816 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 | 69 +++++++++++++++++++ mods/ts/rules/defaults.yaml | 31 ++++++++- mods/ts/sequences/misc.yaml | 14 ++++ mods/ts/weapons/ballisticweapons.yaml | 3 + mods/ts/weapons/energyweapons.yaml | 7 ++ mods/ts/weapons/otherweapons.yaml | 6 +- mods/ts/weapons/superweapons.yaml | 12 ++-- 7 files changed, 134 insertions(+), 8 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 0000000000..59d008716f --- /dev/null +++ b/OpenRA.Mods.Common/Traits/Conditions/SpreadsCondition.cs @@ -0,0 +1,69 @@ +#region Copyright & License Information +/* + * Copyright 2007-2022 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) + return; + + var actorsInRange = self.World.FindActorsInCircle(self.CenterPosition, info.Range) + .Where(a => a.TraitOrDefault() != null); + + var target = actorsInRange.RandomOrDefault(self.World.SharedRandom); + target?.GrantCondition(info.SpreadCondition); + } + } +} diff --git a/mods/ts/rules/defaults.yaml b/mods/ts/rules/defaults.yaml index f6b837f5ed..c281331afc 100644 --- a/mods/ts/rules/defaults.yaml +++ b/mods/ts/rules/defaults.yaml @@ -1035,8 +1035,9 @@ ^Tree: Inherits@1: ^SpriteActor + Inherits@2: ^ExistsInWorld Interactable: - HiddenUnderShroud: + FrozenUnderFog: RenderSprites: Palette: terraindecoration WithSpriteBody: @@ -1049,6 +1050,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 b778500b8e..beb76f6d1e 100644 --- a/mods/ts/sequences/misc.yaml +++ b/mods/ts/sequences/misc.yaml @@ -708,3 +708,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 53bf91306a..f52c69740a 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 f4b9c8b901..dd2f22df0c 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: @@ -133,6 +138,8 @@ CyCannon: Heavy: 150 Concrete: 80 DamageTypes: Prone350Percent, TriggerProne, EnergyDeath + Warhead@2Eff: CreateEffect + ValidTargets: Ground, Trees Proton: Inherits: ^EnergyBlast diff --git a/mods/ts/weapons/otherweapons.yaml b/mods/ts/weapons/otherweapons.yaml index 00be75e7d9..badfbb258b 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 daddea08d3..4081b60545 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 @@ -29,12 +29,12 @@ MultiCluster: Warhead@ResourceDestruction: DestroyResource ClusterMissile: - ValidTargets: Ground, Water, Air + ValidTargets: Ground, Water, Air, Trees Warhead@1Dam: SpreadDamage 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