Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add TS mobile EMP #20808

Merged
merged 2 commits into from
Sep 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
89 changes: 89 additions & 0 deletions OpenRA.Mods.Common/Traits/FireWarheads.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
#region Copyright & License Information
/*
* Copyright (c) The OpenRA Developers and Contributors
* 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;
using System.Linq;
using OpenRA.GameRules;
using OpenRA.Traits;

namespace OpenRA.Mods.Common.Traits
{
[Desc("Detonate defined warheads at the current location at a set interval.")]
public class FireWarheadsInfo : PausableConditionalTraitInfo, Requires<IMoveInfo>, IRulesetLoaded
{
[WeaponReference]
[FieldLoader.Require]
[Desc("Weapons to fire.")]
public readonly string[] Weapons = Array.Empty<string>();

[Desc("How long (in ticks) to wait before the first detonation.")]
public readonly int StartCooldown = 0;

[Desc("How long (in ticks) to wait after a detonation.")]
public readonly int Interval = 1;

public override object Create(ActorInitializer init) { return new FireWarheads(this); }

public WeaponInfo[] WeaponInfos { get; private set; }

public override void RulesetLoaded(Ruleset rules, ActorInfo ai)
{
base.RulesetLoaded(rules, ai);

WeaponInfos = Weapons.Select(w =>
{
var weaponToLower = w.ToLowerInvariant();
if (!rules.Weapons.TryGetValue(weaponToLower, out var weapon))
throw new YamlException($"Weapons Ruleset does not contain an entry '{weaponToLower}'");
return weapon;
}).ToArray();
}
}

public class FireWarheads : PausableConditionalTrait<FireWarheadsInfo>, ITick
{
[Sync]
int cooldown = 0;

public FireWarheads(FireWarheadsInfo info)
: base(info)
{
cooldown = info.StartCooldown;
}

void ITick.Tick(Actor self)
{
if (IsTraitDisabled || IsTraitPaused)
return;

if (cooldown > 0)
cooldown--;
else
{
cooldown = Info.Interval;
foreach (var wep in Info.WeaponInfos)
{
wep.Impact(Target.FromPos(self.CenterPosition), self);
self.World.AddFrameEndTask(world =>
{
if (wep.Report != null && wep.Report.Length > 0)
Game.Sound.Play(SoundType.World, wep.Report, world, self.CenterPosition);
});
}
}
}

protected override void TraitDisabled(Actor self)
{
cooldown = Info.StartCooldown;
}
}
}
5 changes: 3 additions & 2 deletions OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ namespace OpenRA.Mods.Common.Traits.Render
public class WithVoxelBodyInfo : ConditionalTraitInfo, IRenderActorPreviewVoxelsInfo, Requires<RenderVoxelsInfo>
{
public readonly string Sequence = "idle";
public readonly WVec Offset;

[Desc("Defines if the Voxel should have a shadow.")]
public readonly bool ShowShadow = true;
Expand All @@ -33,7 +34,7 @@ public class WithVoxelBodyInfo : ConditionalTraitInfo, IRenderActorPreviewVoxels
{
var body = init.Actor.TraitInfo<BodyOrientationInfo>();
var model = init.World.ModelCache.GetModelSequence(image, Sequence);
yield return new ModelAnimation(model, () => WVec.Zero,
yield return new ModelAnimation(model, () => Offset,
() => body.QuantizeOrientation(orientation(), facings),
() => false, () => 0, ShowShadow);
}
Expand All @@ -51,7 +52,7 @@ public WithVoxelBody(Actor self, WithVoxelBodyInfo info)
rv = self.Trait<RenderVoxels>();

var model = self.World.ModelCache.GetModelSequence(rv.Image, info.Sequence);
modelAnimation = new ModelAnimation(model, () => WVec.Zero,
modelAnimation = new ModelAnimation(model, () => info.Offset,
() => body.QuantizeOrientation(self.Orientation),
() => IsTraitDisabled, () => 0, info.ShowShadow);

Expand Down
34 changes: 34 additions & 0 deletions mods/ts/rules/gdi-vehicles.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -425,3 +425,37 @@ JUGG:
ArmamentNames: deployed
Selectable:
DecorationBounds: 1448, 2413, 0, -482

MOBILEMP:
Inherits: ^Tank
Inherits@VOXELS: ^VoxelActor
Inherits@selection: ^SelectableSupportUnit
Buildable:
Queue: Vehicle
BuildPaletteOrder: 130
Prerequisites: ~gaweap, napuls, ~techlevel.superweapons
Description: Fires a pulse blast which disables\nall mechanical units in the area.
Valued:
Cost: 1000
Tooltip:
Name: Mobile EMP Cannon
Health:
HP: 80000
Armor:
Type: Heavy
Mobile:
Speed: 85
WithVoxelBody:
Offset: 0,0,-256
RevealsShroud:
RequiresCondition: !inside-tunnel
Range: 6c0
MaxHeightDelta: 3
GrantConditionOnDeployWithCharge:
Voice: Move
ChargeDuration: 750
DeployedCondition: deployed
PauseOnCondition: empdisable
FireWarheads:
Weapons: MEMPulse
RequiresCondition: deployed && !empdisable
3 changes: 3 additions & 0 deletions mods/ts/rules/shared-support.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ NAPULS:
nod: napuls.nod
ProvidesPrerequisite@gdi:
ResetOnOwnerChange: true
ProvidesPrerequisite@gdi:
Factions: gdi
Prerequisite: napuls
AttackOrderPower:
PauseOnCondition: empdisable || disabled
Cursor: emp
Expand Down
5 changes: 5 additions & 0 deletions mods/ts/sequences/misc.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,11 @@ explosion:
BlendMode: Additive
ZRamp: 1
Tick: 80
pulse_explosion_small:
Filename: mempfx.shp
BlendMode: Additive
ZRamp: 1
Tick: 11
small_watersplash:
Filename: h2o_exp2.shp
IgnoreWorldTint: False
Expand Down
5 changes: 5 additions & 0 deletions mods/ts/sequences/vehicles.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,11 @@ smech:
icon:
Filename: smchicon.shp

mobilemp:
Inherits: ^VehicleOverlays
icon:
Filename: mempicon.shp

trucka:
Inherits: ^VehicleOverlays

Expand Down
3 changes: 3 additions & 0 deletions mods/ts/sequences/voxels.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,9 @@ sonic:
idle:
turret: sonictur

mobilemp:
idle: m_emp

#truk: # TODO: unused
# idle:

Expand Down
11 changes: 11 additions & 0 deletions mods/ts/weapons/superweapons.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -127,3 +127,14 @@ EMPulseCannon:
Duration: 250
Condition: empdisable
ValidTargets: Ground, Water, Air, Underground

MEMPulse:
Report: mobemp1.aud
Warhead@1Eff: CreateEffect
Explosions: pulse_explosion_small
ImpactActors: false
Warhead@emp: GrantExternalCondition
Range: 6c0
Duration: 250
Condition: empdisable
ValidTargets: Ground, Water, Air, Underground